26 Using Declarative Components and Task Flows

This chapter describes how to use different Oracle Business Rules declarative components and task flows to develop high-performance, interactive, and multitiered applications that are also easy to maintain.

This chapter includes the following sections:

26.1 Introduction to Declarative Components and Task Flows

Declarative components are reusable, composite User Interface (UI) components that comprise other existing Application Development Framework (ADF) Faces components. Consider an application that contains multiple JSF pages. On a particular page, a set of specific components is used in multiple parts of that page. In this scenario, if you make any changes to any of the components in the set, you typically must replicate the changes in multiple parts of the page. This approach makes it difficult to maintain the consistency of the structure and layout of the page. However, by defining a declarative component that comprises the given set of components, you can reuse that composite declarative component in multiple places or pages. Declarative components, thereby, save time and ensure integrity across pages, because when you make any changes to the components, the JSF pages using them automatically get updated.

ADF task flows are reusable components that provide a modular and transactional method in specifying the control flow in an application. You can use a set of reusable task flows as an alternative to representing an application as a single large JSF page flow, thereby providing modularity. Each task flow contains a part of the entire navigational plan of the application. The nodes in a task flow are called activities. Apart from navigation, task flow activities can also call methods on managed beans or call another task flow without invoking any particular page. This facilitates reuse because business logic can be invoked independently of the page being displayed.

26.2 Using the Oracle Business Rules Editor Declarative Component

This section discusses the Oracle Business Rules Editor declarative component. It also provides information on how to create and run an application using the Rules Editor component, and then deploy the application. In addition, this section lists the supported tags and the localization process for the application.

26.2.1 Introduction to the Oracle Business Rules Editor Component

Oracle Business Rules Editor is a declarative component that can be embedded in any ADF-based Web application. The component renders the user interface for rules editing and handles all events associated with rules editing. Rules Editor uses the Rules SDK2 API to create and edit rules.

Note:

You should not confuse Rules Editor with Rules Dictionary Editor. Rules Editor is used to edit rules inside a specified ruleset. In fact, Rules Editor is embedded within Rules Dictionary Editor. For more information about Rules Dictionary Editor, see Section 26.3, "Using the Oracle Business Rules Dictionary Editor Declarative Component."

Using Rules Editor, you can edit rules and decision tables that are part of a single ruleset. You require to specify a RuleSetModel object, which is a wrapper around the Rules SDK ruleset object, as a parameter to the Rules Editor component. If multiple rulesets are required to be modified, multiple Rules Editor components must be instantiated, one for each ruleset.

The Rules Editor component performs the following functions:

Note:

Once all the edits are done, the component user is responsible for saving the ruleset.

26.2.2 How to Create and Run a Sample Application by Using the Rules Editor Component

This section lists the steps for creating and running a sample application by using the Rules Editor component.

The prerequisite for using the Rules Editor component to create ADF-based Web applications is having a running installation of SOA Suite and Oracle JDeveloper on your computer.

To create a sample application by using the Rules Editor:

The first task is to create a sample application.

The steps are:

  1. Open Oracle JDeveloper.

  2. From the File menu, select New and then Generic Application to create an application.

  3. Enter a name for the application in the Application Name field, for example, useRulesDCApp, and click Next as shown in Figure 26-13.

    Figure 26-13 Creating a Generic Application

    Generic Application
    Description of "Figure 26-13 Creating a Generic Application"

  4. Enter useRulesDC in the Project Name field and ensure that ADF Faces is selected in the Project Technologies tab as shown in Figure 26-14.

    Click Finish to create the project.

    Figure 26-14 Creating a Project

    Creating a Project
    Description of "Figure 26-14 Creating a Project"

  5. Right-click the useRulesDC project in the Application Navigator of Oracle JDeveloper, and select Project Properties to display the Project Properties dialog box.

    In the Project Properties dialog box:

    1. Select JSP Tag Libraries from the left panel.

    2. Click Add and select ADF Faces Components from the extension list in the Choose Tag Libraries dialog box, and click OK as shown in Figure 26-15.

      Figure 26-15 Choosing Tab Libraries

      Choosing Tag Libraries
      Description of "Figure 26-15 Choosing Tab Libraries"

    3. Click Add, select User, and then click New in the Choose Tag Libraries dialog box.

    4. Browse to JDEV_INSTALL/jdeveloper/soa/modules/oracle.soa.rules_editor_dc.webapp_11.1.1, select one jar file at a time and click Open as shown in Figure 26-16. This adds the selected tag library to the User list.

      Figure 26-16 Adding Tag Libraries to the User List

      Adding Tag Libraries to the User List
      Description of "Figure 26-16 Adding Tag Libraries to the User List"

      You find that there are five jar files in this directory: adflibRulesDC.jar, adflibExpBuilderDC.jar, adflibBucketsetEditorDC.jar, adflibRuleValidationTableDC.jar, and adflibValidationTableDC.jar.

      Repeat this process till all the jars (tag libraries) are added to the User list.

    5. Select all the jars in the User list and click OK in the Choose Tag Libraries dialog box as shown in Figure 26-17.

      Figure 26-17 Selecting the Added Tag Libraries in the User List

      Select the Added Tag Libraries in User List
      Description of "Figure 26-17 Selecting the Added Tag Libraries in the User List"

      Five tag libraries are added to the project, which are bucketsetEditor, expBuilder, rulesEditor, ruleValidationTable, and validationTable, as shown in Figure 26-18.

      Figure 26-18 Tag Libraries Added to the Project

      Tag Libraries Added to the project
      Description of "Figure 26-18 Tag Libraries Added to the Project"

    6. Select Libraries and Classpath from the left panel and click Add Library to display the Add Library dialog box.

      Select Oracle Rules in the Libraries list and click OK as shown in Figure 26-19. This adds the Rules SDK to the project.

      Figure 26-19 Adding the Rules SDK to the Project

      Adding the Rules SDK to the Project
      Description of "Figure 26-19 Adding the Rules SDK to the Project"

    7. Click OK to close the Project Properties dialog box.

  6. Select Save All from the Oracle JDeveloper File menu to save the project.

To create the RuleSetModel object:

The Rules Editor component requires a oracle.bpel.rulesdc.model.impl.RuleSetModel object. The component uses this object to read the rules and the decision tables that exist in the ruleset. So, the next task is to create a managed bean called SomeBean.java that creates a RuleSetModel object.

The steps are:

  1. Open Oracle JDeveloper.

  2. From the File menu, select New to display the New Gallery dialog box.

  3. In the New Gallery dialog box, select Java under General from the Categories panel. Ensure that Java Class under Items is selected and click OK to display the Create Java Class dialog box.

  4. Enter the name of the Java class, for example SomeBean.java, and click OK to create the Java class in your project as shown in Figure 26-20.

    Figure 26-20 Creating a Java Class

    Creating a Java Class
    Description of "Figure 26-20 Creating a Java Class"

    The following is a sample of the SomeBean.java file:

    package userulesdc;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Reader;
    
    import java.io.Writer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import oracle.bpel.rulesdc.model.impl.RuleSetModel;
    
    import oracle.rules.sdk2.dictionary.RuleDictionary;
    import oracle.rules.sdk2.exception.SDKException;
    import oracle.rules.sdk2.exception.SDKWarning;
    import oracle.rules.sdk2.ruleset.RuleSet;
    import oracle.rules.sdk2.ruleset.RuleSetTable;
    
    public class SomeBean {
        private static final String RULES_FILE =
            "C:/scratch/asuraj/system/rules/OrderBooking.rules";
        private RuleSetModel ruleSetModel = null;
    
        public RuleSetModel getRuleSetModel() {
            if (ruleSetModel != null)
                return ruleSetModel; //cache ruleSetModel instead of re-creating it
                // each time
    
            Reader reader = null;
            try {
                reader = new FileReader(new File(RULES_FILE));
            } catch (FileNotFoundException e) {
                //LOG.severe(e);
                System.err.println(e);
            }
            RuleDictionary dict = null;
            try {
                dict = RuleDictionary.readDictionary(reader, null);
            } catch (SDKException e) {
                System.err.println(e);
            } catch (FileNotFoundException e) {
                System.err.println(e);
            } catch (IOException e) {
                System.err.println(e);
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException ioe) {
                }
            }
            //get the ruleSetTable from the RuleDictionary object
            RuleSetTable ruleSetTable = dict.getRuleSetTable();
            //get the first ruleSet from the ruleSetTable
            RuleSet ruleSet = ruleSetTable.get(0);
            //create a RuleSetModel object and pass this to the rulesDC
    
            ruleSetModel = new RuleSetModel(ruleSet);
            return ruleSetModel;
        }
        //please refer to Rules SDK documentation for saving a dictionary also
        //because this code does not take care of saving linked dictionaries
    
        public static boolean saveDictionary(RuleDictionary dict,
                                             String ruleFileName) {
            Writer writer = null;
            try {            writer = new FileWriter(new File(ruleFileName));
                dict.writeDictionary(writer);
    
            } catch (SDKException e) {
                System.err.println(e);
                return false;
            } catch (FileNotFoundException e) {
                System.err.println(e);
                return false;
            } catch (IOException e) {
                System.err.println(e);
                return false;
            } finally {
                if (writer != null) {
                    try {
                        writer.close();
                    } catch (IOException ioe) {
                        return false;
                    }
                }
            }
            return true;
        }
    
        public static void updateDictionary(RuleDictionary dict) {
            if (dict == null)
                return;
    
            List<SDKWarning> warnings = new ArrayList<SDKWarning>();
            try {
                dict.update(warnings);
                for (SDKWarning warning : warnings)
                    System.out.println("warnings: " +
                                       warning.getLocalizedMessage());
            } catch (SDKException sdkEx) {
                sdkEx.printStackTrace();
            }
        }
        //You can call this method from your "Save" button
    
        public void saveDictionary() {
    
            RuleDictionary dict =
                this.getRuleSetModel().getRuleSet().getDictionary();
            if (dict != null) {
                //update the dictionary before saving it
                updateDictionary(dict);
                saveDictionary(dict, RULES_FILE);
            }
        }
    
        //call the validation method on the ruleSetModel to update the Validation 
        //Panel
    
        public void validate() {
            if (this.ruleSetModel == null)
                return;
    
            this.ruleSetModel.validate();
        }
    }
    
  5. Open the faces-config.xml file in Overview mode and click the + button under Managed Beans to display the Create Managed Bean dialog box. Point to SomeBean.java by providing the Bean Name as someBean and the Scope as session as shown in Figure 26-21.

    Figure 26-21 Specifying the Bean Name and Scope

    Specifying the Bean Name and Scope
    Description of "Figure 26-21 Specifying the Bean Name and Scope"

    The ADF/JSF framework makes multiple calls to SomeBean.java to render the user interface. For example, someBean.ruleSetModel is called multiple times. So, it is better to create the RuleSetModel object once, cache it, and return it each time instead of re-creating it.

To create the .jspx file for the Rules Editor component:

The next task is to create the .jspx file to include the Rules Editor component tag.

The steps are:

  1. Open Oracle JDeveloper.

  2. From the File menu, select New to display the New Gallery dialog box.

  3. In the New Gallery dialog box, select JSF under Web Tier from the Categories panel.

  4. Select JSF Page under Items and click OK to display the Create JSF Page dialog box.

  5. In the Create JSF Page dialog box, enter useRulesDC.jspx as the file name as shown in Figure 26-22.

    Figure 26-22 Creating the JSF Page File

    Creating the JSF Page File
    Description of "Figure 26-22 Creating the JSF Page File"

    RulesCompLib in the component palette of Oracle JDeveloper is displayed as shown in Figure 26-23.

    Figure 26-23 Rules Editor Component Library in the Component Palette

    Rules Editor Component Library in the Component Palette
    Description of "Figure 26-23 Rules Editor Component Library in the Component Palette"

    This is because you have added the rulesDC tag library when creating the sample application.

  6. Select RulesCompLib to see the Rulesdc tag.You can drag and drop the Rulesdc tag into the .jspx file. You can also add the Rulesdc tag in the .jspx file manually as shown:

    <?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:rdc="http://xmlns.oracle.com/bpel/rules/editor"
      <jsp:directive.page contentType="text/html;charset=UTF-8"/>
      <f:view>
        <af:document title="Sample Rules Editor App" id="d1">
          <af:form id="f1">
            <af:panelStretchLayout id="psl1" inlineStyle="margin:15px;"
                                   partialTriggers="cb1 cb3">
              <f:facet name="center">
                <rdc:rulesdc rulesetModel="#{someBean.ruleSetModel}"
                             viewOnly="false" discloseRules="true"
                             genericAction="true" genericPattern="true"
                             dtColumnPageSize="6" id="r1" dateStyle="yyyy-MM-dd"
                             timeStyle="HH-mm-ss"></rdc:rulesdc>
              </f:facet>
              <f:facet name="top">
                <af:panelGroupLayout id="pgl2" layout="horizontal">
                  <af:commandButton text="Save Dictionary"
                                    action="#{someBean.saveDictionary}" id="cb1"/>
                  <af:spacer width="10" height="10" id="s5"/>
                  <af:commandButton text="Validate" id="cb3"
                                    action="#{someBean.validate}"
                                    partialSubmit="true"/>
                </af:panelGroupLayout>
              </f:facet>
            </af:panelStretchLayout>
          </af:form>
        </af:document>
      </f:view>
    </jsp:root>
    

To refer to the oracle.rules shared library:

After creating the .jspx file, you must refer to the oracle.rules shared library from the weblogic-application.xml file.

The steps are:

  1. In Oracle JDeveloper, open the weblogic-application.xml file by browsing to Application Resources, then Descriptors, and then META-INF.

  2. Add the following lines to refer to the oracle.rules shared library as shown in Figure 26-24.

    <library-ref>
    <library-name>oracle.rules</library-name>
    </library-ref>
    

    Figure 26-24 Referring to the oracle.rules Shared Library

    Referring to the oracle.rules Shared Library
    Description of "Figure 26-24 Referring to the oracle.rules Shared Library"

  3. Deploy the oracle.rules shared library to the embedded Weblogic server, else, you might get ClassNotFoundException when you run the sample application. To deploy the oracle.rules shared library to the Weblogic server:

    1. Launch WLS console (http://host:port/console/login/LoginForm.jsp). Ensure that the embedded Weblogic server on Oracle JDeveloper is running.

    2. Select Deployments, click Install, select <JDEV_INSTALL>/jdeveloper/soa/modules/oracle.rules_11.1.1/rules.jar and click Finish as shown in Figure 26-25.

      Figure 26-25 Deploying the Shared Library to the Weblogic Server

      Deploying the Shared Library to the Weblogic Server
      Description of "Figure 26-25 Deploying the Shared Library to the Weblogic Server"

To run the sample Rules Editor application:

The last task is running the sample application.

To run the sample application, from Oracle JDeveloper, right-click the useRulesDC.jspx file, and select Run. This starts the sample application on a Web browser as shown in Figure 26-26.

Figure 26-26 Running the Sample Application

Running the Sample Application
Description of "Figure 26-26 Running the Sample Application"

26.2.3 How to Deploy a Rules Editor Application to a Standalone Weblogic Server

When you are ready to deploy your application EAR file to the standalone Weblogic server, perform the following:

  1. Launch the Weblogic server console (http://host:port/console/login/LoginForm.jsp) and ensure that oracle.rules is displayed in the deployments list.

  2. Ensure that oracle.soa.rules_editor_dc.webapp is displayed in the deployments list. If this is not displayed, click Install and select the <JDEV_INSTALL>/jdeveloper/soa/modules/oracle.soa.rules_editor_dc.webapp_11.1.1/oracle.soa.rules_editor_dc.webapp.war file.

  3. Open Oracle JDeveloper.

  4. Right-click the project name in the Application Navigator and select Project Properties.

  5. Select Libraries and Classpath from the left panel and click Add Library.

  6. In the Add Library dialog box, select Oracle Rules Editor Component and click OK as shown in Figure 26-27.

    Figure 26-27 Adding the Oracle Rules Editor Component

    Adding the Oracle Rules Editor Component
    Description of "Figure 26-27 Adding the Oracle Rules Editor Component"

    This step enables you to refer to these libraries, but does not deploy these libraries by default. Therefore, the jars are not included in your project war file.

  7. In the project that has to be deployed (where you create the EAR file):

    1. Add the following lines to the weblogic-application.xml:

      <library-ref>
         <library-name>oracle.rules</library-name>
      </library-ref>
      
    2. Add the following lines to weblogic.xml in the project WAR file:

      <library-ref>
         <library-name>oracle.soa.rules_editor_dc.webapp</library-name>
      </library-ref>
      
    3. Deploy the EAR file in the Weblogic server.

For more information about creating an EAR file, see "How to Create an EAR File for Deployment" in Oracle Fusion Middleware Java EE Developer's Guide for Oracle Application Development Framework.

26.2.4 What You May Need to Know About the Supported Tags of the Rules Editor Component

This section lists the tags and attributes that are supported by the Rules Editor component.

Table 26-1 lists the supported facets.

Table 26-1 Supported Facets of the Rules Editor Component

Name Description

patternDisplay

Used to render specific user interfaces. This facet is used to display the rule condition and pattern (in advanced mode), which is the "IF" portion of the rule.

actionDisplay

Used to render specific user interfaces. This facet is used to display the rule action, which is the "THEN" portion of the rule.


Table 26-2 lists the supported attributes.

Table 26-2 Supported Attributes of the Rules Editor Component

Name Type Required? Default Value Supports EL? Description

rulesetModel

oracle.bpel.rulesdc.model.RuleSetInterface

yes

-

Only EL

Wrapper around the Rules SDK ruleset object.You can use the RuleSetModel object supplied as part of the Rules Editor Component jar file (adflibRulesDC.jar).

ruleModel

java.lang.String

no

oracle.bpel.rulesdc.model.RuleModel

yes

Used to customize the default RuleModel. You can extend the RuleModel class to override certain methods.

viewOnly

java.lang.Boolean

no

true

yes

If "true", in the "viewOnly" mode, you can view the existing rules in the ruleset. If "false", which is the "edit" mode, you can add new rules and edit existing rules.

genericPattern

java.lang.Boolean

no

true

yes

If "true", the Rules Editor component renders the user interface for displaying the IF part, which is Conditions and Patterns (in Advanced Mode). If "false", then the "patternDisplay" facet must be passed to the Rules Editor component. The facet must contain the user-defined user interface. The facet has access to the RuleModel and SimpleTestModel.

genericAction

java.lang.Boolean

no

true

yes

If "true", the Rules Editor component renders the user interface for displaying the THEN part, which is Actions. If "false", then the "actionDisplay" facet must be passed to the Rules Editor component. The facet must contain the user-defined user interface. The facet has access to the ActionModel.

locale

java.util.Locale

no

Locale.getDefault()

yes

Used for Localization

timezone

java.util.TimeZone

no

TimeZone.getDefault()

yes

Used for Localization

displayRuleSetEffDate

java.lang.Boolean

no

true

yes

If "true", the Rules Editor component renders the user interface for displaying the effective dates for the RuleSet.

discloseRules

java.lang.Boolean

no

false

yes

If "true", all the rules in the ruleset are expanded. If "false", all the rules are collapsed.

dateStyle

java.lang.String

no

gets it from the locale

yes

If specified, the date style is used in all inputDate components, for example yyyy.MM.dd

timeStyle

java.lang.String

no

gets it from the locale

yes

If specified, the time style is used in all inputDate components, for example HH:mm:ss

dtColumnPageSize

java.lang.Integer

no

5

yes

Number of columns to be displayed at a time in the decision table. This works only when rules are columnar.

dtHeight

java.lang.Integer

no

16

yes

Number of rows to be displayed at a time in the decision table. A scroll bar is displayed if the number of rows increases over the specified height.

displayRuleSetName

java.lang.Boolean

no

true

yes

Displays the editable ruleset name by default. You can choose to hide this by setting it to "false".

disableRuleSetName

java.lang.Boolean

no

false

yes

If "true", the ruleset name is disabled and not editable. By default, this is "false".

showValidationPanel

java.lang.Boolean

no

true

yes

Displays the validation panel by default. You can choose to hide this by setting it to "false".


26.3 Using the Oracle Business Rules Dictionary Editor Declarative Component

This section discusses the Oracle Business Rules Dictionary Editor declarative component. It also provides information on how to create and run an application using the Rules Dictionary Editor component, and then deploy the application. In addition, this section lists the supported tags and the localization process for the application.

26.3.1 Introduction to the Oracle Business Rules Dictionary Component

The Oracle Business Rules Dictionary Editor is a composite declarative component that can be embedded in any ADF-based Web application. It enables you to edit business rules metadata artifacts, such as Globals, Bucketsets, and Rulesets, by using the Rules SDK2 API.

Note:

You should not confuse Rules Dictionary Editor with Rules Editor. Rules Editor is used to edit rules inside a specified ruleset. In fact, Rules Editor is embedded within Rules Dictionary Editor. For more information about Rules Editor, see Section 26.2, "Using the Oracle Business Rules Editor Declarative Component."

The Rules Dictionary Editor Task Flow uses the Rules Dictionary Editor Component to create applications. Typically, you should either use the Rules Dictionary Editor component or the Rules Dictionary Editor task flow, but not both. For more information on Rules Dictionary Editor Task Flow, see Section 26.4, "Using the Oracle Business Rules Dictionary Task Flow."

The Rules Dictionary Editor component performs the following:

  • Edits Globals or Variables that have the final attribute set to true by using the Globals Editor, as shown in Figure 26-28.

    Figure 26-28 Globals Editor

    Description of Figure 26-28 follows
    Description of "Figure 26-28 Globals Editor"

    Globals Editor enables you to edit only the Name, Description, and Value of Globals. It does not allow creation or deletion of Globals. However, it supports validation of Globals.

  • Edits Bucketsets by using the Bucketset Editor as shown in Figure 26-29.

    Figure 26-29 Bucketset Editor

    Description of Figure 26-29 follows
    Description of "Figure 26-29 Bucketset Editor"

    Bucketset Editor enables you to perform CRUD (create, read, update, and delete) operations on Bucketsets and buckets inside a Bucketset. It also supports validation of Bucketsets.

  • Edits Rulesets, as shown in Figure 26-30.

    Figure 26-30 Edits Rulesets

    Description of Figure 26-30 follows
    Description of "Figure 26-30 Edits Rulesets"

    Rules Dictionary Editor enables you to edit only rules inside a selected ruleset. It does not allow creation or deletion of rulesets.

26.3.2 How to Create and Run a Sample Application by Using the Rules Dictionary Editor Component

This section lists the steps for creating and running a sample application by using the Rules Dictionary Editor component.

The prerequisite for using the Rules Dictionary Editor component to create ADF-based Web applications is having a running installation of SOA Suite and Oracle JDeveloper on your computer.

To create a sample application by using the Rules Dictionary Editor:

The first task is to create a sample application.

The steps are:

  1. Open Oracle JDeveloper.

  2. From the File menu, select New and then Generic Application to create an application.

  3. Enter a name for the application in the Application Name field, for example, useRuleDictDCApp, and click Next as shown in Figure 26-31.

    Figure 26-31 Creating a Generic Application

    Creating a Generic Application
    Description of "Figure 26-31 Creating a Generic Application"

  4. Enter useRuleDictDC in the Project Name field and ensure that ADF Faces is selected in the Project Technologies tab as shown in Figure 26-32.

    Click Finish to create the project.

    Figure 26-32 Creating a Project

    Creating a Project
    Description of "Figure 26-32 Creating a Project"

  5. Right-click the useRuleDictDC project in the Application Navigator of Oracle JDeveloper, and select Project Properties to display the Project Properties dialog box.

    In the Project Properties dialog box:

    1. Select JSP Tag Libraries from the left panel.

    2. Click Add and select ADF Faces Components from the extension list in the Choose Tag Libraries dialog box, and click OK as shown in Figure 26-33.

      Figure 26-33 Choosing Tab Libraries

      Choosing Tab Libraries
      Description of "Figure 26-33 Choosing Tab Libraries"

    3. Click Add, select User, and then click New in the Choose Tag Libraries dialog box.

    4. Browse to JDEV_INSTALL/jdeveloper/soa/modules/oracle.soa.rules_dict_dc.webapp_11.1.1, select one jar file at a time and click Open as shown in Figure 26-34. This adds the selected tag library to the User list.

      Figure 26-34 Adding Rules Dictionary Tag Libraries to the User List

      Adding Rules Dictionary Tag Libraries to the User List
      Description of "Figure 26-34 Adding Rules Dictionary Tag Libraries to the User List"

      You find that there are seven jar files in this directory: adflibBucketsetEditorDC.jar, adflibExpBuilderDC.jar, adflibGlobalsEditorDC.jar, adflibRuleDictionaryDC.jar, adflibRulesDC.jar and adflibRuleValidationTableDC.jar and adflibValidationTableDC.jar.

      Repeat this process till all the jars (tag libraries) are added to the User list. Screen Shot

    5. Select all the jars in the User list and click OK in the Choose Tag Libraries dialog box as shown in Figure 26-35.

      Figure 26-35 Selecting the Added Rules Dictionary Tag Libraries in the User List

      Select Added Rules Dictionary Tag Libraries in User List
      Description of "Figure 26-35 Selecting the Added Rules Dictionary Tag Libraries in the User List"

      Seven tag libraries are added to the project, which are bucketsetEditor, expBuilder, globalsEditor, ruleDictionaryDC, rulesCompLib, ruleValidationTable and validationTable, as shown in Figure 26-36.

      Figure 26-36 Rules Dictionary Tag Libraries Added to the Project

      Rules Dictionary Tag Libraries Added to the Project
      Description of "Figure 26-36 Rules Dictionary Tag Libraries Added to the Project"

    6. Select Libraries and Classpath from the left panel and click Add Library to display the Add Library dialog box.

      Select Oracle Rules in the Libraries list and click OK as shown in Figure 26-19. This adds the Rules SDK to the project.

      Figure 26-37 Adding the Rules SDK to the Project

      Adding the Rules SDK to the Project
      Description of "Figure 26-37 Adding the Rules SDK to the Project"

    7. Click OK to close the Project Properties dialog box.

  6. Select Save All from the Oracle JDeveloper File menu to save the project.

To create the RuleDictionaryModel object:

The Rules Dictionary Editor component requires a oracle.bpel.ruledictionarydc.model.impl.RuleDictionaryModel object. The component uses this object to read Globals, Bucketsets, and Rulesets information from the dictionary. So, the next task is to create a managed bean called SomeBean.java that creates a RuleDictionaryModel object.

The steps are:

  1. Open Oracle JDeveloper.

  2. From the File menu, select New to display the New Gallery dialog box.

  3. In the New Gallery dialog box, select Java under General from the Categories panel. Ensure that Java Class under Items is selected and click OK to display the Create Java Class dialog box.

  4. Enter the name of the Java class, for example SomeBean.java, and click OK to create the Java class in your project as shown in Figure 26-38.

    Figure 26-38 Creating a Java Class

    Creating a Java Class
    Description of "Figure 26-38 Creating a Java Class"

    The following is a sample of the SomeBean.java file:

    package useruledictdc;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Reader;
    
    import java.io.Writer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import oracle.bpel.ruledictionarydc.model.impl.RuleDictionaryModel;
    
    import oracle.rules.sdk2.dictionary.DictionaryFinder;
    import oracle.rules.sdk2.dictionary.RuleDictionary;
    import oracle.rules.sdk2.exception.SDKException;
    import oracle.rules.sdk2.exception.SDKWarning;
    
    public class SomeBean {
        private RuleDictionaryModel ruleDictModel;
        private static final String RULES_FILE1 =
            "C:\\scratch\\asuraj\\system\\rules\\OrderBookinRules.rules";
    
        public SomeBean() {
            super();
        }
    
        public RuleDictionaryModel getRuleDictModel() {
            if (ruleDictModel != null)
                return ruleDictModel; //cache ruleDictModel instead of re-creating it each time
    
            ruleDictModel = new RuleDictionaryModel(getRuleDictionary());
            return ruleDictModel;
        }
    
        public RuleDictionary getRuleDictionary() {
    
            Reader reader = null;
            try {
                reader = new FileReader(new File(RULES_FILE1));
            } catch (FileNotFoundException e) {
                //LOG.severe(e);
                System.err.println(e);
            }
            RuleDictionary dict = openRulesDict(reader, null);
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException ioe) {
                }
            }
    
            return dict;
        }
    
        private static RuleDictionary openRulesDict(Reader reader,
                                                    DictionaryFinder finder) {
            RuleDictionary dict = null;
    
            try {
                dict = RuleDictionary.readDictionary(reader, finder);
            } catch (SDKException e) {
                System.err.println(e);
            } catch (FileNotFoundException e) {
                System.err.println(e);
            } catch (IOException e) {
                System.err.println(e);
            }         catch (IllegalArgumentException e) {            System.err.println(e);
            } finally {
            }
    
            return dict;
        }
        //please refer to Rules SDK documentation for saving a dictionary also
        //because this code does not take care of saving linked dictionaries
    
        public static boolean saveDictionary(RuleDictionary dict,
                                             String ruleFileName) {
            if (dict == null || ruleFileName == null)
                return false;
    
            if (dict.isTransactionInProgress())
                System.out.println("Transaction in progress, cannot save dictionary");
            Writer writer = null;
            try {
                writer = new FileWriter(new File(ruleFileName));
                dict.writeDictionary(writer);
    
            } catch (SDKException e) {
                System.err.println(e);
                return false;
            } catch (FileNotFoundException e) {
                System.err.println(e);
                return false;
            } catch (IOException e) {
                System.err.println(e);
                return false;
            } finally {
                if (writer != null) {
                    try {
                        writer.close();
                    } catch (IOException ioe) {
                        return false;
                    }
                }
            }
            return true;
        }
    
        public static void updateDictionary(RuleDictionary dict) {
            if (dict == null)
                return;
    
            List<SDKWarning> warnings = new ArrayList<SDKWarning>();
            try {
                dict.update(warnings);
                for (SDKWarning warning : warnings)
                    System.out.println("warnings: " +
                                       warning.getLocalizedMessage());
            } catch (SDKException sdkEx) {
                sdkEx.printStackTrace();
            }
        }
        //You can call this method from your "Save" button
    
        public void saveDictionary() {
    
            RuleDictionary dict = this.getRuleDictModel().getRuleDictionary();
            if (dict != null) {
                if (dict.isModified())
                    updateDictionary(dict);
                if (!dict.isTransactionInProgress())
                    saveDictionary(dict, RULES_FILE1);
            }
        }
        
        //call the validation method on the ruleDictModel to update the Validation Panel
    
        public void validate() {
            if (this.ruleDictModel == null)
                return;
            this.ruleDictModel.validate();
        }
    }
    
  5. Open the faces-config.xml file in the Overview mode and click the + button under Managed Beans to display the Create Managed Bean dialog box. Point to SomeBean.java by providing the Bean Name as someBean and the Scope as session as shown in Figure 26-39.

    Figure 26-39 Specifying the Bean Name and Scope

    Specifying the Bean Name and Scope
    Description of "Figure 26-39 Specifying the Bean Name and Scope"

    The ADF/JSF framework makes multiple calls to SomeBean.java to render the user interface. For example, someBean.ruleDictModel is called multiple times. So, it is better to create the RuleDictModel object once, cache it, and return it each time instead of re-creating it.

To create the .jspx file for the Rules Dictionary Editor component:

The next task is to create the .jspx file to include the Rules Dictionary Editor component tag.

The steps are:

  1. Open Oracle JDeveloper.

  2. From the File menu, select New to display the New Gallery dialog box.

  3. In the New Gallery dialog box, select JSF under Web Tier from the Categories panel.

  4. Select JSF Page under Items and click OK to display the Create JSF Page dialog box as shown in Figure 26-40.

    Figure 26-40 Creating the JSF Page File to Include the Rules Dictionary Editor Tag

    Creating the JSF Page File
    Description of "Figure 26-40 Creating the JSF Page File to Include the Rules Dictionary Editor Tag"

  5. In the Create JSF Page dialog box, enter useRuleDictDC.jspx as the file name as shown in Figure 26-41.

    Figure 26-41 Specifying the Name of the JSF Page

    Specifying the Name of the JSF Page
    Description of "Figure 26-41 Specifying the Name of the JSF Page"

    RuleDictionaryEditor in the component palette of Oracle JDeveloper is displayed as shown in Figure 26-42.

    Figure 26-42 Rule Dictionary Editor Library in the Component Palette

    Rule Dictionary Editor Library in the Component Palette
    Description of "Figure 26-42 Rule Dictionary Editor Library in the Component Palette"

    This is because you have added the ruleDictionaryDC tag library when creating the sample application.

  6. Select RuleDictionaryDC to view the ruleDictionaryDC tag.You can drag and drop the ruleDictionaryDC tag into the .jspx file. You can also add the ruleDictionaryDC tag in the .jspx file manually as shown:

    <?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:rddc="http://xmlns.oracle.com/bpel/rules/dictionaryEditor">
      <jsp:directive.page contentType="text/html;charset=UTF-8"/>
      <f:view>
        <af:document id="d1" title="Sample Rule Dictionary App">
          <af:form id="f1">
            <af:panelStretchLayout id="psl1" inlineStyle="margin:15px;"
                                   partialTriggers="cb2 cb3">
              <f:facet name="center">
                <rddc:ruleDictionaryDC ruleDictModel="#{someBean.ruleDictModel}"
                                       dtColumnPageSize="6" id="rddc1"
                                       viewOnly="false" dateStyle="yyyy-MM-dd"
                                       timeStyle="HH-mm-ss"
                                       discloseRules="true"
                                       showValidationPanel="true"/>
              </f:facet>
              <f:facet name="top">
                <af:panelGroupLayout id="pgl1" layout="horizontal">
                  <af:commandButton text="Save Dict" id="cb2"
                                    action="#{someBean.saveDictionary}"/>
                  <af:spacer width="10" height="10" id="s1"/>
                  <af:commandButton text="Validate" id="cb3"
                                    action="#{someBean.validate}"/>
                </af:panelGroupLayout>
              </f:facet>
            </af:panelStretchLayout>
          </af:form>
        </af:document>
      </f:view>
    </jsp:root>
    

To refer to the oracle.rules shared library:

After creating the .jspx file, you must refer to the oracle.rules shared library from the weblogic-application.xml file.

The steps are:

  1. In Oracle JDeveloper, open the weblogic-application.xml file by browsing to Application Resources, then Descriptors, and then META-INF.

  2. Add the following lines to refer to the oracle.rules shared library as shown in Figure 26-43.

    <library-ref>
    <library-name>oracle.rules</library-name>
    </library-ref>
    

    Figure 26-43 Referring to the oracle.rules Shared Library

    Referring to the oracle.rules Shared Library
    Description of "Figure 26-43 Referring to the oracle.rules Shared Library"

  3. Deploy the oracle.rules shared library to the embedded Weblogic server, else, you might get ClassNotFoundException when you run the sample application. To deploy the oracle.rules shared library to the Weblogic server:

    1. Launch WLS console (http://host:port/console/login/LoginForm.jsp). Ensure that the embedded Weblogic server on Oracle JDeveloper is running.

    2. Select Deployments, click Install, select <JDEV_INSTALL>/jdeveloper/soa/modules/oracle.rules_11.1.1/rules.jar and click Finish as shown in Figure 26-44.

      Figure 26-44 Deploying the Shared Library to the Weblogic Server

      Deploying the Shared Library to the Weblogic Server
      Description of "Figure 26-44 Deploying the Shared Library to the Weblogic Server"

To run the sample Rules Dictionary Editor application:

The last task is running the sample application.

To run the sample application, from Oracle JDeveloper, right-click the useRuleDictDC.jspx file, and select Run. This starts the sample application on a Web browser as shown in Figure 26-45.

Figure 26-45 Running the Sample Rules Dictionary Editor Application

Running the Sample Rules Dictionary Editor Application
Description of "Figure 26-45 Running the Sample Rules Dictionary Editor Application"

26.3.3 How to Deploy a Rules Dictionary Editor Application to a Standalone Weblogic Server

When you are ready to deploy your application EAR file to the standalone Weblogic server, perform the following:

  1. Launch the Weblogic server console (http://host:port/console/login/LoginForm.jsp) and ensure that oracle.rules is displayed in the deployments list.

  2. Ensure that oracle.soa.rules_dict_dc.webapp is displayed in the deployments list. If this is not displayed, click Install and select the <JDEV_INSTALL>/jdeveloper/soa/modules/oracle.soa.rules_dict_dc.webapp_11.1.1/oracle.soa.rules_dict_dc.webapp.war file.

  3. Open Oracle JDeveloper.

  4. Right-click the project name in the Application Navigator and select Project Properties.

  5. Select Libraries and Classpath from the left panel and click Add Library.

  6. In the Add Library dialog box, select Oracle Rules Dictionary Component and click OK as shown in Figure 26-46.

    Figure 26-46 Adding the Oracle Rules Dictionary Component

    Adding the Oracle Rules Dictionary Component
    Description of "Figure 26-46 Adding the Oracle Rules Dictionary Component"

    This step enables you to refer to these libraries, but does not deploy these libraries by default. Therefore, the jar files are not included in your project war file.

  7. In the project that has to be deployed (where you create the EAR file):

    1. Add the following lines to the weblogic-application.xml:

      <library-ref>
         <library-name>oracle.rules</library-name>
      </library-ref>
      
    2. Add the following lines to weblogic.xml in the project WAR file:

      <library-ref>
         <library-name>oracle.soa.rules_dict_dc.webapp</library-name>
      </library-ref>
      
    3. Deploy the EAR file in the Weblogic server.

26.3.4 What You May Need to Know About the Supported Attributes of the Rules Dictionary Editor Component

This section lists the attributes that are supported by the Rules Dictionary Editor component.

Table 26-3 lists the supported attributes.

Table 26-3 Supported Rules Dictionary Editor Attributes

Name Type Required? Default Value Supports EL? Description

ruleDictModel

oracle.bpel.ruledictionarydc.model.interfaces.RuleDictionaryInterface

yes

-

Only EL

Wrapper around the Rules SDK Dictionary object.You can use the RuleDictionaryModel object supplied as part of the Rules Dictionary Editor Component jar file (adflibRuleDictionaryDC.jar).

viewOnly

java.lang.Boolean

no

true

yes

If "true", in the "viewOnly" mode, you can view the existing dictionary data, but you cannot edit the data. If "false", which is the "edit" mode, you can edit existing the dictionary data.

locale

java.util.Locale

no

Locale.getDefault()

yes

Used for Localization

timezone

java.util.TimeZone

no

TimeZone.getDefault()

yes

Used for Localization

dateStyle

java.lang.String

no

gets it from the locale

yes

If specified, the date style is used in all inputDate components, for example yyyy.MM.dd

timeStyle

java.lang.String

no

gets it from the locale

yes

If specified, the time style is used in all inputDate components, for example HH:mm:ss

dtColumnPageSize

java.lang.Integer

no

5

yes

Number of columns to be displayed at a time in the decision table. This works only when rules are columnar.

dtHeight

java.lang.Integer

no

16

yes

Number of rows to be displayed at a time in the decision table. A scroll bar is displayed if the number of rows increases over the specified height.

selectedTab

java.lang.String

no

-

yes

Switches to the specified tab name (either GLOBALS, BUCKETSETS, or the RULESET name.)

showValidationPanel

java.lang.Boolean

no

true

yes

Displays the validation panel by default. You can choose to hide this by setting it to "false".

discloseRules

java.lang.Boolean

no

false

yes

If "true", all the rules in the ruleset are expanded. If "false", all the rules are collapsed.

displayRuleSetName

java.lang.Boolean

no

true

yes

By default, displays the editable ruleset name. You can choose to hide this by setting it to "false".

disableRuleSetName

java.lang.Boolean

no

false

yes

If "true", the ruleset name is disabled and is not editable. By default, this is "false".


26.4 Using the Oracle Business Rules Dictionary Task Flow

This section discusses the Oracle Business Rules Dictionary Editor task flow. It also provides information on how to create and run an application using the Rules Dictionary Editor task flow, and then deploy the application.

26.4.1 Introduction to the Oracle Business Rules Dictionary Task Flow

The Rules Dictionary Editor Task Flow is basically a wrapper around the Rules Dictionary Editor declarative component. The task flow is used in ADF-based Web applications that require a task flow instead of a declarative component. For more information on Rules Dictionary Editor Component, see Section 26.3, "Using the Oracle Business Rules Dictionary Editor Declarative Component."

26.4.2 How to Create and Run a Sample Application By Using the Rules Dictionary Editor Task Flow

This section lists the steps for creating and running a sample application by using the Rules Dictionary Editor task flow.

The prerequisites for using the Rules Dictionary Editor task flow to create ADF-based Web applications are:

  • Having a running installation of SOA Suite and Oracle JDeveloper on your computer

  • Obtaining the adflibRuleDictionaryTaskFlow.jar file. The steps are:

    1. Open <JDEV_INSTALL>/jdeveloper/soa/modules/oracle.soa.rules_dict_dc.webapp_11.1.1/oracle.soa.rules_dict_dc.webapp.war.

    2. Unzip WEB-INF/lib/adflibRuleDictionaryTaskFlow.jar to some local directory.

To create a sample application by using the Rules Dictionary Editor task flow:

The first task is to create a sample application.

The steps are:

  1. Open Oracle JDeveloper.

  2. From the File menu, select New and then Generic Application to create an application.

  3. Enter a name for the application in the Application Name field, for example, useRuleDictTaskFlowApp, and click Next as shown in Figure 26-47.

    Figure 26-47 Creating a Generic Task Flow Application

    Creating a Generic Task Flow Application
    Description of "Figure 26-47 Creating a Generic Task Flow Application"

  4. Enter useRuleDictTaskFlow in the Project Name field and ensure that ADF Faces is selected in the Project Technologies tab, as shown in Figure 26-48.

    Click Finish to create the project.

    Figure 26-48 Creating a Task Flow Project

    Creating a Task Flow Project
    Description of "Figure 26-48 Creating a Task Flow Project"

  5. Right-click the useRuleDictTaskFlow project in the Application Navigator of Oracle JDeveloper, and select Project Properties to display the Project Properties dialog box.

    In the Project Properties dialog box:

    1. Select JSP Tag Libraries from the left panel.

    2. Click Add and select ADF Faces Components from the extension list in the Choose Tag Libraries dialog box, and click OK as shown in Figure 26-49.

      Figure 26-49 Choosing Tab Libraries for the Task Flow Application

      Choosing Tab Libraries for the Task Flow Application
      Description of "Figure 26-49 Choosing Tab Libraries for the Task Flow Application"

    3. Select Libraries and Classpath from the left panel and click Add Library to display the Add Library dialog box.

    4. Click OK to close the Project Properties dialog box.

  6. Select Save All from the Oracle JDeveloper File menu to save the project.

  7. Create a Java class that implements the oracle.integration.console.metadata.model.share.MetadataDetails interface, which is defined in soaComposerTemplates.jar. For more information on the MetadataDetails interface, see Section I.1, "The MetadataDetails Interface."

    The steps are:

    1. Open Oracle JDeveloper.

    2. From the File menu, select New to display the New Gallery dialog box.

    3. In the New Gallery dialog box, select Java under General from the Categories panel. Ensure that Java Class under Items is selected and click OK to display the Create Java Class dialog box.

    4. Enter the name of the Java class, for example MyMetaDataDetails, add the MetadataDetails interface in the Implements box under Optional Attributes, and click OK to create the Java class in your project as shown in Figure 26-53.

      Figure 26-53 Creating a Java Class That Implements the MetadataDetails Interface

      Implementing the MetadataDetails
      Description of "Figure 26-53 Creating a Java Class That Implements the MetadataDetails Interface"

      The following is a sample of the MyMetaDataDetails.java file:

      package useruledicttaskflow;
      
      import java.io.BufferedReader;
      import java.io.FileNotFoundException;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.io.OutputStreamWriter;
      import java.io.UnsupportedEncodingException;
      import java.io.Writer;
      
      import java.net.MalformedURLException;
      import java.net.URL;
      
      import oracle.integration.console.metadata.model.share.MetadataDetails;
      import oracle.integration.console.metadata.model.share.RelatedMetadataPath;
      
      public class MyMetaDataDetails implements MetadataDetails {
          public MyMetaDataDetails() {
              super();
          }
      
          private static final String RULES_FILE1 =
              "file:///C:/scratch/asuraj/system/rules/OrderBooking.rules";
      
          public String getDocument() {
              URL url = null;
              try {
                  url = new URL(RULES_FILE1);
                  return readFile(url);
              } catch (IOException e) {
                  System.err.println(e);
              }
              return "";
          }
      
          public void setDocument(String string) {
              URL url = null;
      
              try {
                  url = new URL(RULES_FILE1);
              } catch (MalformedURLException e) {
                  System.err.println(e);
                  return;
              }
              Writer writer = null;
              try {
                  //os = new FileWriter(url.getPath());
                  writer =
                          new OutputStreamWriter(new 
       FileOutputStream(url.getPath()),
                                                 "UTF-8");
              } catch (FileNotFoundException e) {
                  System.err.println(e);
                  return;
              } catch (IOException e) {
                  System.err.println(e);
                  return;
              }
              try {
                  writer.write(string);
              } catch (IOException e) {
                  System.err.println(e);
              } finally {
                  if (writer != null) {
                      try {
                          writer.close();
                      } catch (IOException ioe) {
                          System.err.println(ioe);
                      }
                  }
              }
          }
      
          private String readFile(URL dictURL) {
              InputStream is;
              try {
                  is = dictURL.openStream();
              } catch (IOException e) {
                  System.err.println(e);
                  return "";
              }
              BufferedReader reader;
              try {
                  reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
              } catch (UnsupportedEncodingException e) {
                  System.err.println(e);
                  return "";
              }
              String line = null;
              StringBuilder stringBuilder = new StringBuilder();
              String ls = System.getProperty("line.separator");
              try {
                  while ((line = reader.readLine()) != null) {
                      stringBuilder.append(line);
                      stringBuilder.append(ls);
                  }
              } catch (IOException e) {
                  System.err.println(e);
                  return "";
              } finally {
                  try {
                      reader.close();
                  } catch (IOException e) {
                      System.err.println(e);
                  }
              }
              return stringBuilder.toString();
          }
      
          public String getRelatedDocument(RelatedMetadataPath relatedMetadataPath) {
              String currPath =
                  RULES_FILE1.substring(0, RULES_FILE1.indexOf("oracle/rules"));
              String relatedDoc =
                  currPath + "oracle/rules/" + relatedMetadataPath.getValue();
      
              URL url = null;
              try {
                  url = new URL(relatedDoc);
                  return readFile(url);
              } catch (IOException e) {
                  System.err.println(e);
              }
              return "";
          }
      }
      
  8. Create a Java class that implements the oracle.integration.console.metadata.model.share.NLSPreferences interface, which is defined in soaComposerTemplates.jar, as shown in Figure 26-54.

    Figure 26-54 Creating a Java Class That Implements the NLSPreferences Interface

    Implementing NLSPreferences
    Description of "Figure 26-54 Creating a Java Class That Implements the NLSPreferences Interface"

    For more information about the NLS Preferences interface, see Section I.2, "The NLSPreferences Interface."

    The following is a sample of the MyNLSPreferences.java file:

    package useruledicttaskflow;
    
    import java.util.Locale;
    import java.util.TimeZone;
    
    import oracle.integration.console.metadata.model.share.NLSPreferences;
    
    public class MyNLSPreferences implements NLSPreferences {
        private static final String DATE_STYLE = "yyyy-MM-dd";
        private static final String TIME_STYLE = "HH-mm-ss";
        
        public MyNLSPreferences() {
            super();
        }
    
        public Locale getLocale() {
            return Locale.getDefault();
        }
    
        public TimeZone getTimeZone() {
            return TimeZone.getTimeZone("America/Los_Angeles");
        }
    
        public String getDateFormat() {
            return DATE_STYLE;
        }
    
        public String getTimeFormat() {
            return TIME_STYLE;
        }
    }
    
  9. Create a Managed Bean called MyBean.java to return the implementation of MetadataDetails and NLSPreferences. It also returns the oracle.integration.console.metadata.model.share.MetadataDetailsMode object and provides event handlers such as toggleMode(), saveDictionary(), saveNoValidateDictionary(), and validate().

    The following is a sample of the MyBean.java file:

    package useruledicttaskflow;
    
    import javax.el.ELContext;
    import javax.el.ExpressionFactory;
    import javax.el.MethodExpression;
    
    import javax.faces.context.FacesContext;
    import javax.faces.event.PhaseId;
    
    import oracle.adf.view.rich.component.rich.fragment.RichRegion;
    
    import oracle.integration.console.metadata.model.share.MetadataDetails;
    import oracle.integration.console.metadata.model.share.MetadataDetailsMode;
    import oracle.integration.console.metadata.model.share.NLSPreferences;
    
    public class MyBean {
        private MyMetaDataDetails details = null;
        private MetadataDetailsMode mode = MetadataDetailsMode.VIEW;
        private RichRegion regionComp;
        private NLSPreferences nlsPrefs;
    
        public MyBean() {
            super();
        }
    
        public MetadataDetails getMetaDataDetails() {
            if (details != null)
                return details;
    
            details = new MyMetaDataDetails();
            return details;
        }
    
        public MetadataDetailsMode getDetailsMode() {
            return mode;
        }
    
        public void toggleMode() {
            if (mode.equals(MetadataDetailsMode.EDIT))
                mode = MetadataDetailsMode.VIEW;
            else
                mode = MetadataDetailsMode.EDIT;
        }
    
        public void saveDictionary() {
            if (regionComp == null)
                return;
            FacesContext fc = FacesContext.getCurrentInstance();
            ExpressionFactory ef = fc.getApplication().getExpressionFactory();
            ELContext elc = fc.getELContext();
            MethodExpression me =
                ef.createMethodExpression(elc, "doMetadataUpdate", String.class,
                                          new Class[] { });
            regionComp.queueActionEventInRegion(me, null, null, false, -1, -1,
                                                PhaseId.ANY_PHASE);
        }
    
        public void saveNoValidateDictionary() {
            if (regionComp == null)
                return;
            FacesContext fc = FacesContext.getCurrentInstance();
            ExpressionFactory ef = fc.getApplication().getExpressionFactory();
            ELContext elc = fc.getELContext();
            MethodExpression me =
                ef.createMethodExpression(elc, "doNoValidateMetadataUpdate",
                                          String.class, new Class[] { });
            regionComp.queueActionEventInRegion(me, null, null, false, -1, -1,
                                                PhaseId.ANY_PHASE);
        }
    
        public void validate() {
            if (regionComp == null)
                return;
            FacesContext fc = FacesContext.getCurrentInstance();
            ExpressionFactory ef = fc.getApplication().getExpressionFactory();
            ELContext elc = fc.getELContext();
            MethodExpression me =
                ef.createMethodExpression(elc, "doValidate", String.class,
                                          new Class[] { });
            regionComp.queueActionEventInRegion(me, null, null, false, -1, -1,
                                                PhaseId.ANY_PHASE);
        }
    
        public void setRegionComp(RichRegion regionComp) {
            this.regionComp = regionComp;
        }
        public RichRegion getRegionComp() {
            return regionComp;
        }
    
        public NLSPreferences getNlsPrefs() {
            if (nlsPrefs != null)
                return nlsPrefs;
    
            nlsPrefs = new MyNLSPreferences();
            return nlsPrefs;
        }
    }
    
  10. Open the faces-config.xml file in the Overview mode and click the + button under Managed Beans to display the Create Managed Bean dialog box. Point to MyBean.java by providing the Bean Name as MyBean and the Scope as session as shown in Figure 26-55.

    Figure 26-55 Specifying the Bean Name and Scope in the Task Flow Application

    Specifying the Bean Name and Scope
    Description of "Figure 26-55 Specifying the Bean Name and Scope in the Task Flow Application"

To add a Rules Dictionary Editor task flow in a .jspx file:

The next task is to create the .jspx file to include the Rules Dictionary Editor component tag.

The steps are:

  1. Open Oracle JDeveloper.

  2. From the File menu, select New to display the New Gallery dialog box.

  3. In the New Gallery dialog box, select JSF under Web Tier from the Categories panel.

  4. Select JSF Page under Items and click OK to display the Create JSF Page dialog box as shown in Figure 26-56.

    Figure 26-56 Creating the JSF Page File to Include the Rules Dictionary Editor Task Flow

    Creating the JSF Page File
    Description of "Figure 26-56 Creating the JSF Page File to Include the Rules Dictionary Editor Task Flow"

  5. In the Create JSF Page dialog box, enter useRuleDictTaskFlow.jspx as the file name as shown in Figure 26-57.

    Figure 26-57 Specifying the Name of the JSF Page for the Task Flow

    Specifying the Name of the JSF Page for the Task Flow
    Description of "Figure 26-57 Specifying the Name of the JSF Page for the Task Flow"

    adflibRuleDictionaryTaskFlow.jar in the component palette of Oracle JDeveloper is displayed as shown in Figure 26-58.

    Figure 26-58 Rules Dictionary Task Flow JAR in the Component Palette

    Rules Dictionary Task Flow JAR in the Component Palette
    Description of "Figure 26-58 Rules Dictionary Task Flow JAR in the Component Palette"

    This is because you have added adfLibRuleDictionaryTaskFlow.jar to Libraries and Classpath when creating the sample application.

  6. Select adflibRuleDictionaryTaskFlow.jar to make rule-dict-flow-definition to be available under Regions in the component palette. You can drag and drop the rule-dict-flow-definition region into the .jspx file as shown in Figure 26-59, and specify all the required parameters.

    Figure 26-59 Dragging and Dropping the Region

    Dragging and Dropping the Region
    Description of "Figure 26-59 Dragging and Dropping the Region"

    The following is a sample of the useRuleDictTaskFlow.jspx file with the task flow added:

    <f:view>
        <af:document id="d1">
          <af:form id="f1">
            <af:panelStretchLayout id="psl1" inlineStyle="margin:8px;">
              <f:facet name="top">
                <af:menuBar id="mb1">
                  <af:commandMenuItem text="Toggle Mode" id="cmi1"
                                      action="#{MyBean.toggleMode}"
                                      partialSubmit="true"/>
                  <af:commandMenuItem text="Save Dict" id="cmi2"
                                      action="#{MyBean.saveDictionary}"
                                      partialSubmit="true"/>
                  <af:commandMenuItem text="Save Dict No Validate" id="cmi3"
                                      action="#{MyBean.saveNoValidateDictionary}"
                                      partialSubmit="true"/>
                  <af:commandMenuItem text="Validate" id="cmi4"
                                      action="#{MyBean.validate}"
                                      partialSubmit="true"/>
                </af:menuBar>
              </f:facet>
              <f:facet name="center">
                  <af:region value="#{bindings.rulesdictflowdefinition1.regionModel}"
                             id="r2" binding="#{MyBean.regionComp}"
                             partialTriggers="::cmi1 ::cmi2 ::cmi3 ::cmi4"/>
              </f:facet>
            </af:panelStretchLayout>
          </af:form>
        </af:document>
      </f:view>
    

    In the preceding sample, you can find code snippets for rendering the following buttons to the page:

    • Toggle Mode: Enables switching between Read-Only and Editable modes of SOA Composer

    • Save Dict: Enables saving the dictionary (with or without validation)

To edit the pagedef.xml file:

After you add the task flow to the .jspx file, you must edit the useRuleDictTaskFlowPageDef.xml file. The pagedef.xml file is created when you drop the Rules Dictionary task flow into the .jspx page.

The following is a sample of the pagedef.xml file along with all the parameters that must be passed to the Rules Dictionary task flow:

<?xml version="1.0" encoding="UTF-8" ?>
<pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
                version="11.1.1.55.99" id="useRuleDictTaskFlowPageDef"
                Package="useruledicttaskflow.pageDefs">
  <parameters/>
  <executables>
    <variableIterator id="variables"/>
    <taskFlow id="rulesdictflowdefinition1"

    taskFlowId="/WEB-INF/rule-dict-flow-definition.xml#rules-dict-flow-definition"
              activation="deferred"
              xmlns="http://xmlns.oracle.com/adf/controller/binding">
      <parameters>
        <parameter id="details" value="#{MyBean.metaDataDetails}"
                   xmlns="http://xmlns.oracle.com/adfm/uimodel"/>
        <parameter id="mode" value="#{MyBean.detailsMode}"
                   xmlns="http://xmlns.oracle.com/adfm/uimodel"/>
        <parameter id="dtHeight" value="10"
                   xmlns="http://xmlns.oracle.com/adfm/uimodel"/>
        <parameter id="selectedTab" value="Ruleset_1"
                   xmlns="http://xmlns.oracle.com/adfm/uimodel"/>
        <parameter id="dtColumnPageSize" value="6"
                   xmlns="http://xmlns.oracle.com/adfm/uimodel"/>
        <parameter id="nlsPrefs" value="#{MyBean.nlsPrefs}"
                   xmlns="http://xmlns.oracle.com/adfm/uimodel"/>
        <parameter id="discloseRules" value="true"
                   xmlns="http://xmlns.oracle.com/adfm/uimodel"/>
      </parameters>
    </taskFlow>
  </executables>
  <bindings/>
</pageDefinition>

In the preceding code sample, you can see that some of the parameters come from MyBean.java (Managed Bean) and the others are hard-coded.

To refer to the oracle.rules shared library:

The next task is to refer to the oracle.rules shared library from the weblogic-application.xml file.

The steps are:

  1. In Oracle JDeveloper, open the weblogic-application.xml file by browsing to Application Resources, then Descriptors, and then META-INF.

  2. Add the following lines to refer to the oracle.rules shared library as shown in Figure 26-60.

    <library-ref>
    <library-name>oracle.rules</library-name>
    </library-ref>
    

    Figure 26-60 Referring to the oracle.rules Shared Library

    Referring to the oracle.rules Shared Library
    Description of "Figure 26-60 Referring to the oracle.rules Shared Library"

To run the sample task flow application:

The last task is running the sample application.

To run the sample application, from Oracle JDeveloper, right-click the useRulesDictTaskFlow.jspx file, and select Run. This starts the sample application on a Web browser as shown in Figure 26-45.

Figure 26-61 Running the Sample Rules Dictionary Editor Task Flow Application

Running the Sample Rules Dictionary Editor Task Flow
Description of "Figure 26-61 Running the Sample Rules Dictionary Editor Task Flow Application"

26.4.3 How to Deploy a Rules Dictionary Editor Task Flow Application to a Standalone Weblogic Server

When you are ready to deploy your application EAR file to the standalone Weblogic server, perform the following:

  1. Launch the Weblogic server console (http://host:port/console/login/LoginForm.jsp) and ensure that oracle.rules is displayed in the deployments list.

  2. Ensure that oracle.soa.rules_dict_dc.webapp is displayed in the deployments list. If this is not displayed, click Install and select the <JDEV_INSTALL>/jdeveloper/soa/modules/oracle.soa.rules_dict_dc.webapp_11.1.1/oracle.soa.rules_dict_dc.webapp.war file.

  3. In the project that has to be deployed (where you create the EAR file):

    1. Add the following lines to the weblogic-application.xml:

      <library-ref>
         <library-name>oracle.rules</library-name>
      </library-ref>
      
    2. Add the following lines to weblogic.xml in the project WAR file:

      <library-ref>
         <library-name>oracle.soa.rules_dict_dc.webapp</library-name>
      </library-ref>
      
    3. Deploy the EAR file in the Weblogic server.

26.5 Localizing the ADF-Based Web Application

You can localize an application that is created using the Rules Editor component, Rules Dictionary Editor component, or the Rules Dictionary Editor task flow.

The steps are:

  1. Modify faces-config.xml in the project that uses the Rules Editor component. The faces-config.xml file must have the following code within the <application> tag to support the available resource bundles:

    <locale-config>      <default-locale>en</default-locale>
          <supported-locale>en</supported-locale>
          <supported-locale>ar</supported-locale>
          <supported-locale>cs</supported-locale>
          <supported-locale>da</supported-locale>
          <supported-locale>de</supported-locale>
          <supported-locale>el</supported-locale>
          <supported-locale>es</supported-locale>
          <supported-locale>fi</supported-locale>
          <supported-locale>fr</supported-locale>
          <supported-locale>hu</supported-locale>
          <supported-locale>it</supported-locale>
          <supported-locale>iw</supported-locale>
          <supported-locale>ja</supported-locale>
          <supported-locale>ko</supported-locale>
          <supported-locale>nl</supported-locale>
          <supported-locale>no</supported-locale>
          <supported-locale>pl</supported-locale>
          <supported-locale>pt-BR</supported-locale>
          <supported-locale>pt</supported-locale>
          <supported-locale>ro</supported-locale>
          <supported-locale>ru</supported-locale>
          <supported-locale>sk</supported-locale>
          <supported-locale>sv</supported-locale>
          <supported-locale>th</supported-locale>
          <supported-locale>tr</supported-locale>
          <supported-locale>zh-CN</supported-locale>
          <supported-locale>zh-TW</supported-locale>
    </locale-config>
    
  2. Change the browser language to the locale of your choice.

  3. You can override the locale provided by the browser and display the user interface in a specific locale. This is done by passing that locale as an attribute to the component and modifying the f:view tag in the application using the component as shown:

    <f:view locale="#{someBean.locale}">
    

    The locale specified here should be the same as the one passed to the component using the locale attribute.