Friday, November 9, 2012

Part 1 - Resource catalog, customization and personalization in Oracle WebCenter application

Implementing customization in WebCenter Portal - Framework Application

Table of Contents

Part 1

1.      Why this article will help software developers?
2.      What is customization?
3.      What is personalization?
4.      What is Oracle Composer?
5.      Version of software used (Basic concepts remain same)
6.      Create new WebCenter Portal - Framework Application
7.      Configure jazn-data.xml
8.      Give permissions to Administrator to Resource Catalog
9.      Create Custom SiteCC Tip Layer
10.    Create Custom UserCC Tip Layer
11.    Implement ComposerSessionOptionsFactory Class
12.    Register implementation of AppsSessionOptionsFactoryImpl with Oracle Composer
13.    Configure WebCenterComposerFilter
14.    Redirect Servlet to Enable Switch Between MDS Customization Layers
15.    Add new class called AppCloseHandler to portal package
16.    How to Register AppCloseHandler
17.    Create AppModeBean
18.    Create RSS News Feed JSPX page
19.    Configure pages.xml
20.    What if you are providing link to customizable page within another page?
21.    Use of showDetailFrame for page customization to drag drop out-of-the-box taskflows directly   to JSPX page
22.    Personalization of ADF Faces controls using adf-config.xml/ persisting ADF Faces controls to MDS

Part 2


23.    Default Resource Catalog
24.    Adding entries to Default Resource Catalog
25.    Adding your own Resource Catalog (example with out-of-the-box task flow)
26.    Adding your own Resource Catalog (example with ADF component viz. af:goLink i.e. Hyperlink)
27.    Personalization
28.    References
29.    Downloads (Link to JDeveloper application)

Part 1 - Resource catalog, customization and personalization in Oracle WebCenter application

Part 1 - Resource catalog, customization and personalization in Oracle WebCenter application describes steps for implementing customization and personalization, giving permissions to roles to allow logged in users to perform customization or personalization depending on their role, adding 
pages to navigational model, personalization of ADF Faces controls using adf-config.xml

Click here to visit Part 2 - Resource catalog, customization and personalization in Oracle WebCenter application describes steps for configuring default resource catalog, creating and adding your own resource catalogs, how to use of PortalBundle.properties to define strings used in resource catalog

1.     Why this article will help software developers?

This is detailed, step-by-step, developer friendly guide with detailed screenshots, to enable software developers to implement customization. Information has been compiled from several sources in single document. Downloadable application called MyPersonalizationCustomization.zip has been provided towards end of Part 2

2.     What is customization?

Customization means user with administrative privileges can apply changes that are available to all users

3.     What is personalization?

Personalization means user can perform changes preferred by him, and available only to him. Unless user applies personalization, he will see whatever administrator has customized. Personalizations change your view—and only your view—of portal or page. Other users are not affected by changes you make to page

4.     What is Oracle Composer?

Without requiring to write single line of code, software developers will be interested to learn that Oracle Composer can be easily added to their applications and portals during development at any time to enable customization and personalization style of operation. As many applications require "portal-like" features, such as customization and personalization, Oracle Composer can simply be dragged and dropped onto JSFF/ JSPX page to enable this powerful capability

5.     Version of software used

Implementation and concepts remain more or less similar for resource catalog, customization, personalization, regardless of version used to develop this functionality
  
jdk-6u29-windows-x64.exe

jdevstudio11116install.jar

JDeveloper 11.1.1.6.0 details
ADF Business Components
11.1.1.61.91
Java(TM) Platform
1.6.0_29
Oracle IDE
11.1.1.6.38.61.91


Versioning Support
11.1.1.6.38.61.91

oracle.webcenter.framework_bundle.zip

oracle.webcenter.customization_bundle.zip 

6.     Create new WebCenter Portal - Framework Application

 Figure 1

Figure 2

7.     Configure jazn-data.xml

Configure jazn-data.xml as shown to add groups and users. Create user administrator1, add it to default Administrator group. Create group Guest, add users guest1, guest2
Figure 3

Figure 4

Click + New User to add 3 users viz. administrator1 (user will be allowed to customize) and guest1, guest2 (users will be allowed to personalize). Ensure Users tab is selected. Click + next to Users
Figure 5

Figure 6

Select Application Roles tab, click + to add new role called Guest (members of this group will be allowed to personalize)
Figure 7

Figure 8

Select Administrator. Click + beside Managed Users and Roles to add administrator1 to default Administrator group (for Customization)
Figure 9

Figure 10

Similarly add guest1, guest2 to Guest group (for Personalization)
Figure 11

8.     Give permissions to Administrator to Resource Catalog

Give permission to Administrator group for Resource Catalog. Select Resource Grants tab. Click + next to Granted To, click Add Application Role, Check Administrator, click OK. Check all actions under Actions
Figure 12

Save jazn-data.xml

Save All 

9.     Create Custom SiteCC Tip Layer

All site-level customizations performed in Edit mode are stored
Expand Portal > Application Sources. Right click package portal, add new class called SiteCC.java, as shown in figure below
Figure 13

package portal;

import oracle.mds.core.MetadataObject;
import oracle.mds.core.RestrictedSession;
import oracle.mds.cust.CacheHint;
import oracle.mds.cust.CustomizationClass;

public class SiteCC extends CustomizationClass {
    private static final String DEFAULT_LAYER_NAME = "site";
    private String mLayerName = DEFAULT_LAYER_NAME;
    private String mLayerValue = "webcenter";

    public SiteCC() {
        super();
    }

    public CacheHint getCacheHint() {
        return CacheHint.ALL_USERS;
    }

    public String getName() {
        return mLayerName;
    }

    public String[] getValue(RestrictedSession restrictedSession,
                             MetadataObject metadataObject) {
        return new String[] { mLayerValue };
    }
}

10. Create Custom UserCC Tip Layer

This layer is applied on top of site layer. Personalizations that user performs in View mode are saved in this user tip layer in folder created specifically for logged-in user

For detailed information, visit http://docs.oracle.com/cd/E15523_01/webcenter.1111/e10148/jpsdg_page_editor_mds.htm#CHDEEGEE

Expand Portal > Application Sources. Right click package portal, add new class called UserCC.java, as shown in figure below
Figure 14

package portal;

import oracle.adf.share.ADFContext;

import oracle.mds.core.MetadataObject;
import oracle.mds.core.RestrictedSession;
import oracle.mds.cust.CacheHint;
import oracle.mds.cust.CustomizationClass;

public class UserCC extends CustomizationClass {
    private static final String DEFAULT_LAYER_NAME = "user";
    private String mLayerName = DEFAULT_LAYER_NAME;
    private String mLayerValue = null;

    public UserCC() {
        super();
    }
    public CacheHint getCacheHint() {
        return CacheHint.USER;
    }

    public String getName() {
        return mLayerName;
    }

    public String[] getValue(RestrictedSession restrictedSession,
                             MetadataObject metadataObject) {
        return new String[] { getMLayerValue() };
    }

    public String getMLayerValue() {
        mLayerValue =
                ADFContext.getCurrent().getSecurityContext().getUserPrincipal().getName();

        return mLayerValue;
    }
}

11. Implement ComposerSessionOptionsFactory Class

In this section, ComposerSessionOptionsFactory.java class provided by ADF is implemented to supply MDS SessionOptions for each HTTP request

ComposerSessionOptionsFactory.java class as per documentation, defines two layers - Edit and View. You can see that Edit layer is applied on global level (that is when Oracle WebCenter Composer is invoked to perform customization). View layer is applied on global and user levels (this means each user will see global customizations and their own personalizations.
If Oracle WebCenter Composer is on, Edit layer is enabled, otherwise View layer. For more information, visit


Expand Portal > Application Sources. Right click package portal, add new class called ComposerSessionOptionsFactory.java, as shown in figure below
Figure 15

package portal;

import java.util.logging.Level;

import portal.SiteCC;
import portal.UserCC;

import oracle.adf.share.ADFContext;
import oracle.adf.share.security.SecurityContext;
import oracle.adf.view.page.editor.mds.ComposerSessionOptionsFactory;
import oracle.adf.view.page.editor.mode.ModeContext;

import oracle.mds.config.CustClassListMapping;
import oracle.mds.config.CustConfig;
import oracle.mds.core.SessionOptions;
import oracle.mds.cust.CustClassList;
import oracle.mds.cust.CustomizationClass;
import oracle.mds.cust.CustomizationPolicy;
public class AppsSessionOptionsFactoryImpl implements ComposerSessionOptionsFactory {
    //Edit mode SiteCC
    private static final CustomizationClass[] EDIT_LAYER =
        new CustomizationClass[] { new SiteCC() };
    //View mode SiteCC + USerCC
    private static final CustomizationClass[] VIEW_LAYER =
        new CustomizationClass[] { new SiteCC(), new UserCC() };
    private static final CustomizationClass[] EDIT_PERSONAL_LAYER =
        new CustomizationClass[] { new UserCC() };
    private String ADMINISTRATOR_ROLE_NAME = "Administrator";

    public AppsSessionOptionsFactoryImpl() {
    }

    public SessionOptions createSessionOptions(SessionOptions sessionOptions,
                                               String mode) {
        CustomizationClass[] custLayer;
        CustConfig custConfig = null;
        CustomizationPolicy cPol = null;
        SecurityContext stx = ADFContext.getCurrent().getSecurityContext();
        if (ModeContext.EDIT_MODE.equals(mode) &&
            stx.isUserInRole(ADMINISTRATOR_ROLE_NAME)) {
            //Mode is Edit, change to SiteCC
            custLayer = EDIT_LAYER;
        } else if (ModeContext.EDIT_MODE.equals(mode)) {
            custLayer = EDIT_PERSONAL_LAYER;
        } else {
            //Mode is View, change to UserCC + SiteCC
            custLayer = VIEW_LAYER;
        }
        try {
            CustClassList custClassList = new CustClassList(custLayer);
            CustClassListMapping custClassListMapping =
                new CustClassListMapping("/", null, null, custClassList);
            custConfig =
                    new CustConfig(new CustClassListMapping[] { custClassListMapping });
            cPol = new CustomizationPolicy(stx.getUserRoles());
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (sessionOptions.getServletContextAsObject() != null) {
            return new SessionOptions(sessionOptions.getIsolationLevel(),
                                      sessionOptions.getLocale(), custConfig,
                                      sessionOptions.getVersionContext(),
                                      sessionOptions.getVersionCreatorName(),
                                      cPol == null ?
                                      sessionOptions.getCustomizationPolicy() :
                                      cPol,
                                      sessionOptions.getServletContextAsObject());
        } else {
            return new SessionOptions(sessionOptions.getIsolationLevel(),
                                      sessionOptions.getLocale(), custConfig,
                                      sessionOptions.getVersionContext(),
                                      sessionOptions.getVersionCreatorName(),
                                      cPol == null ?
                                      sessionOptions.getCustomizationPolicy() :
                                      cPol);
        }
    }
}

             12. Register implementation of AppsSessionOptionsFactoryImpl with Oracle Composer

1.       Open adf-config.xml, make changes in Overview tab, as shown in figure below
Figure 16

2.       Switch to Source view in adf-config.xml find <pe:page-editor-config>.
Modify it to <pe:page-editor-config xmlns="http://xmlns.oracle.com/adf/pageeditor/config">
Below this line and above <pe:security-config> paste below line
<session-options-factory>portal.AppsSessionOptionsFactoryImpl</session-options-factory>
<pe:security-config>

Read more on adf-config.xml under secion 22. Personalization of ADF Faces controls using adf-config.xml/ / persisting ADF Faces controls to MDS

13. Configure WebCenterComposerFilter

You must configure WebCenterComposerFilter filter in web.xml
composerFilter and its filter mapping must be configured before ADFBindingFilter
Locate
<filter>
    <filter-name>adfBindings</filter-name>
    <filter-class>oracle.adf.model.servlet.ADFBindingFilter</filter-class>
  </filter>

Paste below code above it
  <!-- WebCenterComposerFilter goes here -->
  <filter>
    <filter-name>composerFilter</filter-name>
    <filter-class>oracle.adf.view.page.editor.webapp.WebCenterComposerFilter</filter-class>
  </filter>
  <filter>
    <filter-name>WebCenterComposerFilter</filter-name>
    <filter-class>oracle.adf.view.page.editor.webapp.WebCenterComposerFilter</filter-class>
  </filter>

Locate
  <filter-mapping>
    <filter-name>adfBindings</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

Add below code above it
  <!-- WebCenterComposerFilter mapping goes here -->
  <filter-mapping>
    <filter-name>composerFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

  <filter-mapping>
    <filter-name>WebCenterComposerFilter</filter-name>
    <url-pattern>/faces/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

14. Redirect Servlet to Enable Switch Between MDS Customization Layers

Add new class called AppNavigationUtils.java to portal

package portal;

import javax.faces.context.FacesContext;

import javax.servlet.http.HttpServletRequest;

public class AppNavigationUtils {
    public static void redirectToSamePage() {
        HttpServletRequest request =
            (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
        String url = request.getRequestURL().toString();
        String _adfCtrlState = request.getParameter("_adf.ctrl-state");
        url = url + "?_adf.ctrl-state=" + _adfCtrlState;
        System.out.println(url);
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect(url);
            FacesContext.getCurrentInstance().responseComplete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

15. Add new class called AppCloseHandler to portal package

Figure 17

package portal;

import javax.faces.event.AbortProcessingException;

import oracle.adf.view.page.editor.event.CloseEvent;
import oracle.adf.view.page.editor.event.CloseListener;

public class AppCloseHandler implements CloseListener {
    public void processClose(CloseEvent closeEvent) throws AbortProcessingException {
        AppNavigationUtils.redirectToSamePage();
    }
}

16. How to Register AppCloseHandler

After creating AppCloseHandler, you must register it in Oracle Composer extension file, pe_ext.xml. Oracle Composer extension file, pe_ext.xml, enables you to extend editing capabilities provided by Oracle Composer. pe_ext.xml file is not available in your application by default. You must create it youeself to perform such tasks as including add-ons, property panels, or event handlers. Create new xml file called pe_ext.xml at application_home\src\META-INF directory. For e.g. this application has pe_ext.xml created at C:\JDeveloper\mywork\MyPersonalizationCustomization\src\META-INF.

<?xml version="1.0" encoding="US-ASCII" ?>
<pe-extension xmlns="http://xmlns.oracle.com/adf/pageeditor/extension">
  <addon-config>
    <event-handlers>
      <event-handler event="close">portal.AppCloseHandler</event-handler>
    </event-handlers>
  </addon-config>
</pe-extension>

  17. Create AppModeBean

package portal;

import javax.faces.event.ActionEvent;

import oracle.adf.view.page.editor.mode.ModeContext;

public class AppModeBean {
    public void edit(ActionEvent actionEvent) {
        ModeContext.getCurrent().setEditMode();
        AppNavigationUtils.redirectToSamePage();
    }
}

18. Create RSS News Feed JSPX page

Add new JSF Page RSSNewsFeeds.jspx file

Important
Code is only for your reference. Avoid copying and pasting any code containing Oracle Composer components viz. Change Mode Button, Change Mode Link, Page Customizable, Layout Customizable, Panel Customizable, Show Detail Frame. Drag drop Oracle Composer components for them to function correctly

Code looks like
<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
          xmlns:pe="http://xmlns.oracle.com/adf/pageeditor"
          xmlns:cust="http://xmlns.oracle.com/adf/faces/customizable">
  <jsp:directive.page contentType="text/html;charset=UTF-8"/>
  <f:view>
    <af:document id="d1" title="RSS News Feeds">
      <af:form id="f1">
        <af:pageTemplate viewId="/oracle/webcenter/portalapp/pagetemplates/pageTemplate_globe.jspx"
                         value="#{bindings.pageTemplateBinding}" id="pt1">
          <f:facet name="content">
            <af:panelGroupLayout id="pgl1" layout="vertical">
              <af:panelGroupLayout id="pgl2" layout="horizontal">
                <af:outputText value="#{securityContext.userName}" id="ot1"/>
                <af:spacer width="10" height="10" id="s1"/>
                <pe:changeModeLink id="cml1"/>
              </af:panelGroupLayout>
              <pe:pageCustomizable id="pageCustomizable1"
                                   catalog="/oracle/webcenter/portalapp/catalogs/rssViewer-catalog.xml">
                <f:facet name="editor">
                  <pe:pageEditorPanel id="pep1"/>
                </f:facet>
                <pe:layoutCustomizable id="layoutCustomizable1"
                                       shortDesc="Change Layout"
                                       type="oneColumn">
                  <cust:panelCustomizable id="panelCustomizable2"/>
                  <f:facet name="contentA">
                    <cust:panelCustomizable id="panelCustomizable3"/>
                  </f:facet>
                  <f:facet name="contentB">
                    <cust:panelCustomizable id="panelCustomizable4"/>
                  </f:facet>
                </pe:layoutCustomizable>
              </pe:pageCustomizable>
            </af:panelGroupLayout>
          </f:facet>
        </af:pageTemplate>
      </af:form>
    </af:document>
  </f:view>
</jsp:root>

Save All 

  19.  Configure pages.xml

1.       Open pages.xml
 Figure 18

2.       Select Root in Hierarchy pane. In Security section, select Delegate Security. Ensure Manage, Grant, Create, Delete, Update, Personalize, View are checked for Administrator
Figure 19


3.       In Security section, click + to Add Role Grants. Select Guest
Figure 20


 4.       Check View to give permission to Guest
Figure 21

5.       Select Home. Select Inherit Parent Security radio button
Figure 22

6.       Drag drop RSSNewsFeeds.jspx under Root.

7.       Select RSSNewsFeeds in hierarchy pane. Modify Title if required. Select Delegate Security radio button. Delete anonymous role. Grant Personalize, View to authenticated-role, Guest role
Figure 23

20. What if you are providing link to customizable page within another page?

In case you are providing access to customizable JSPX page via another page, method of granting permission is different. Locate that page in jazn-data.xml. In Granted To section click + to Add Grantee, Add Application Role, check Administrator, authenticated-role, OK. Grant permission to authenticated-role by checking personalize, view under Actions
Figure 24

 Grant permission to Administrator by checking customize, view under Actions. If you grant customize, view actions to any role, that automatically enables users of that role to perform customization
Figure 25

To add link to JSPX page, go to Portal > Web Content > oracle > webcenter > portalapp > navigations. Right click navigations, New… > Under Categories go to Web Tier > Portal. Under Items select Navigation (Refer Figure 33). Click OK. Provide a file name, say navigationModel.xml. Click OK. Click to select TakePolls.jspx under Portal > Web Content > oracle > webcenter > portalapp > pages. Drag drop it under navigationModel

Figure 26



Click + alongside URL Attributes, click ExternalId. Type TakePolls  (without space. This could be any string value) Under Display Value, as shown in above figure

To add link to TakePolls.jspx, say on Home.jspx, add af:goLink to Home.jspx, as shown in below code

Important
Code is only for your reference. Avoid copying and pasting any code containing Oracle Composer components viz. Change Mode Button, Change Mode Link, Page Customizable, Layout Customizable, Panel Customizable, Show Detail Frame. Drag drop Oracle Composer components for them to function correctly

<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
          xmlns:pe="http://xmlns.oracle.com/adf/pageeditor"
          xmlns:cust="http://xmlns.oracle.com/adf/faces/customizable">
  <f:loadBundle basename="oracle.webcenter.portalframework.sitestructure.resource.PortalAppPageResource"
                var="portalResource"/>
  <jsp:directive.page contentType="text/html;charset=UTF-8"/>
  <f:view>
    <af:document id="d1" title="#{portalResource['home_title']}">
      <af:form id="f1">
        <af:pageTemplate value="#{bindings.pageTemplateBinding.templateModel}"
                         id="pt1">
          <f:facet name="content">
            <af:group id="g1">
              <af:goLink text="Take Polls" id="gl1"
                         destination="/faces/wcnav_externalId/TakePolls?wcnav.model=/oracle/webcenter/portalapp/navigations/navigationModel"/>
              <pe:pageCustomizable id="hm_pgc1">
                <cust:panelCustomizable id="hm_pnc1" layout="scroll"/>
                <f:facet name="editor">
                  <pe:pageEditorPanel id="pep1"/>
                </f:facet>
              </pe:pageCustomizable>
            </af:group>
          </f:facet>
        </af:pageTemplate>
      </af:form>
    </af:document>
  </f:view>
</jsp:root>

21.     Use of cust:showDetailFrame for page customization to drag drop out-of-the-box taskflows directly to JSPX page

Below is code for TakePolls.jspx. Note how cust:showDetailFrame has been nested under cust:panelCustomizable and Polls – Take Polls taskflow has been dragged and dropped within it, from Resource Palette > WebCenter Portal - Service Catalog > Task Flows > Polls – Take Polls

Important
Code is only for your reference. Avoid copying and pasting any code containing Oracle Composer components viz. Change Mode Button, Change Mode Link, Page Customizable, Layout Customizable, Panel Customizable, Show Detail Frame. Drag drop Oracle Composer components for them to function correctly

<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
          xmlns:pe="http://xmlns.oracle.com/adf/pageeditor"
          xmlns:cust="http://xmlns.oracle.com/adf/faces/customizable">
  <jsp:directive.page contentType="text/html;charset=UTF-8"/>
  <f:view>
    <af:document id="d1">
      <af:form id="f1">
        <af:pageTemplate viewId="/oracle/webcenter/portalapp/pagetemplates/pageTemplate_globe.jspx"
                         value="#{bindings.pageTemplateBinding}" id="pt1">
          <f:facet name="content">
            <af:panelGroupLayout id="pgl1" layout="vertical">
              <af:panelGroupLayout id="pgl2" layout="horizontal">
                <af:outputText value="#{securityContext.userName}" id="ot1"/>
                <af:spacer width="10" height="10" id="s1"/>
                <pe:changeModeLink id="cml1"/>
              </af:panelGroupLayout>
              <pe:pageCustomizable id="pageCustomizable1">
                <cust:panelCustomizable id="panelCustomizable1" layout="scroll">
                  <cust:showDetailFrame text="Take Polls" id="sdf1">
                    <af:region value="#{bindings.takepolls1.regionModel}"
                               id="r1"/>
                  </cust:showDetailFrame>
                </cust:panelCustomizable>
                <f:facet name="editor">
                  <pe:pageEditorPanel id="pep1"/>
                </f:facet>
                <pe:layoutCustomizable id="layoutCustomizable1"
                                       shortDesc="Change Layout"
                                       type="oneColumn">
                  <cust:panelCustomizable id="panelCustomizable2"/>
                  <f:facet name="contentA">
                    <cust:panelCustomizable id="panelCustomizable3"/>
                  </f:facet>
                  <f:facet name="contentB">
                    <cust:panelCustomizable id="panelCustomizable4"/>
                  </f:facet>
                </pe:layoutCustomizable>
              </pe:pageCustomizable>
            </af:panelGroupLayout>
          </f:facet>
        </af:pageTemplate>
      </af:form>
    </af:document>
  </f:view>
</jsp:root>

Run application. On Home page, click Take Polls link. On Take Polls page, click Edit. Click spanner icon to edit task flow parameters at runtime. Polls – Take Polls has not been covered in this article, that being out of scope

22. Personalization of ADF Faces controls using adf-config.xml / persisting ADF Faces controls to MDS

In adf-config.xml, View tab, expand dropdown Tag Library URI: to view type of controls that could be allowed to be personalized
  Figure 27

Below are screenshots of list of controls available for each of 3 options, viz. http://xmlns.oracle.com/adf/faces/rich, http://xmlns.oracle.com/adf/faces/customizable, http://xmlns.oracle.com/adf/pageeditor, in Figures 28, 29, 30 respectively. To view type of controls that could be allowed to be personalized for http://xmlns.oracle.com/adf/faces/rich, expand green + dropdown under Tags. Following are the controls ADF Faces controls activeCommandToolbarButton, calendar, column, commandButton, commandImageLink, commandLink, commandMenuItem, commandNavigationItem, commandToolbarButton, dialog, panelBox, panelSplitter, panelWindow, richTextEditor, showDetail, showDetailHeader, showDetailItem, table
Figure 28

Say you choose to add calendar for personalization, under Tag Attributes: calendar, you can select what you can select what you wish to persist. Every ADF Faces control has different properties that could be persisted
 Figure 29

 Figure 30

Figure 31

Details of other tabs of adf-config.xml, viz, Business Components, MDS Configuration, Controller, are available in below figures
 Figure 32

 Figure 33

Figure 34