Home > Documents > CIM Developer's Guide - Oracle

CIM Developer's Guide - Oracle

Date post: 21-Dec-2021
Category:
Author: others
View: 0 times
Download: 0 times
Share this document with a friend
Embed Size (px)
of 82 /82
Version 10.1.2 CIM Developer's Guide Oracle ATG One Main Street Cambridge, MA 02142 USA
Transcript
ATG CIM Developer's Guide - product version: 10.1.2Copyright © 1997, 2012 Oracle and/or its affiliates. All rights reserved.
Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.
Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks are used under license and are
trademarks or registered trademarks of SPARC International, Inc. AMD, Opteron, the AMD logo, and the AMD Opteron logo are trademarks or
registered trademarks of Advanced Micro Devices. UNIX is a registered trademark of The Open Group.
This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are
protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy,
reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any
means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.
The information contained herein is subject to change without notice and is not warranted to be error-free. If you find any errors, please
report them to us in writing.
If this software or related documentation is delivered to the U.S. Government or anyone licensing it on behalf of the U.S. Government, the
following notice is applicable:
U.S. GOVERNMENT END USERS:
delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and
agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any
operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and
license restrictions applicable to the programs. No other rights are granted to the U.S. Government.
This software or hardware is developed for general use in a variety of information management applications. It is not developed or intended
for use in any inherently dangerous applications, including applications that may create a risk of personal injury. If you use this software or
hardware in dangerous applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other measures
to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages caused by use of this software or hardware in
dangerous applications.
This software or hardware and documentation may provide access to or information on content, products, and services from third parties.
Oracle Corporation and its affiliates are not responsible for and expressly disclaim all warranties of any kind with respect to third-party
content, products, and services. Oracle Corporation and its affiliates will not be responsible for any loss, costs, or damages incurred due to
your access to or use of third-party content, products, or services.
The software is based in part on the work of the Independent JPEG Group.
ATG CIM Developer's Guide iii
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
3. Creating CIM Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Creating CIM Wizards and Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Adding Steps to a Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Changing Step Order in Combined Wizards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Adding Tasks to Steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Adding a Task with No Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Adding a Task with Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Collecting User Input for Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Omitting Tasks from Batch Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Using Commands in Steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Task Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Navigation Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Compound Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Adding Validators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Example CIM Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Creating Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Adding Tasks to the CIM Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Creating Validators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Creating Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Creating Select Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Making Select Providers Available to CIM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Creating Navoption Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Using Navoption Providers in Steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5. Using Product Definition Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Product Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Persistence and Property File Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Using Dynamic Values in Properties Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Product Add-Ons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Named Datasources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
DB Init Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
CIM Session Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7. CIM JavaBean Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Task Beans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
1 Introduction
This book is intended to introduce developers and partners to the Configuration & Installation Manager (CIM). It
describes how to create and extend CIM plugins, which can greatly simplify configuration of your applications.
This chapter includes the following sections:
Audience (page 1)
Audience
To get the most out of this guide, you should be familiar with:
• Nucleus components and their configuration
• Configuration requirements for your product, including database table creation, assembly, and deployment
See the ATG Platform Programming Guide for information on these topics.
Documentation Conventions
Convention Explanation
Italics Introduces new terms and indicates emphasis.
Bold Emphasizes important information, or indicates field names, menu items, or button
names.
monospace Indicates syntax examples, values that you specify, or results that you receive.
Brackets [ ] Indicates optional items. For example, in the following statement: SELECT
[DISTINCT], DISTINCT is an optional keyword.
2 1 Introduction
The directory where you installed the Oracle ATG Web Commerce platform is identified as <ATG10dir>. CIM
plugins can be created for any version of ATG software.
2 CIM Overview 3
2 CIM Overview
A common complaint about enterprise software is the complexity of the installation and configuration
process. CIM is designed to cut down this complexity. A series of text-based wizards guide the user through
configuration procedures, providing these benefits:
• The user knows that steps were performed in the correct order.
• Steps are automated and intelligent defaults provided where possible, avoiding opportunities for input errors.
• All necessary steps are complete.
The result is a working, basic installation that can be used as a starting point for further work. Note that CIM
is not intended to handle the entire configuration process, since much of the work of setting up an Oracle
ATG Web Commerce installation is handled through the administrative user interfaces and through custom
components.
CIM scripts are written in XML and use a library of templates, tasks, and validators, making them easy to create
and extend. This chapter introduces CIM script components and describes how to run the demonstration script
so you can see CIM in action.
This chapter contains the following sections:
CIM Installed Files (page 3)
CIM Script Elements (page 4)
Executing CIM Plugins (page 5)
Using the Provided CIM Plugins (page 6)
CIM Installed Files
CIM consists of two main pieces:
• Plugins, which define wizards that carry out configuration steps for each CIM-enabled application.
• The framework, which executes the plugins.
This guide is focused on creating and extending plugins. Changes to the CIM framework are not supported.
CIM is installed automatically as a module in the Oracle ATG Web Commerce platform, located at <ATG10dir>/
CIM. The CIM module includes the following directories:
• config—Component configuration properties files.
4 2 CIM Overview
• data—Database used internally by CIM scripts to store user selections. To start from scratch if you have
previously used CIM, you can delete the contents of this directory.
• lib—CIM .jar files.
• log—Contains the cim.log file. If debugging is turned on, this directory also includes XML files that
represent templates that have been run.
• plugins—Plugin XML files and supporting information for CIM-configurable products.
• tmp—A working directory created by some CIM processes.
The CIM executable is located at <ATG10dir>/home/cim.bat|sh.
In addition to the CIM module itself, all CIM-enabled applications should include a /cim directory, which
contains the product.xml and dbinit.xml CIM files for that application. For information on these files, see the
Using Product Definition Files (page 35) section.
CIM Script Elements
CIM scripts are a form of domain-specific language. They are written in XML using a tightly constrained set of
elements to achieve a specific purpose. These XML files populate JavaBeans, which perform configuration tasks
on your Oracle ATG Web Commerce Search system.
Scripts have the following elements:
• Step—Logical groupings of information presented to the user as a unit. For example, a step may prompt the
user for input values, provide the user with feedback about collected input, or provide information about the
state of the system. See Adding Steps to a Process (page 9).
At the completion of a step, CIM has prepared one or more tasks with the values necessary for execution.
These tasks are not yet executed. However, each time CIM collects a value from the user it has an opportunity
to execute logic. For example, before moving on to the next step, you may want to ensure that the user has
not included disallowed characters in their input.
After a step has collected all of the information required to execute its related tasks, CIM prepares these tasks
and places them in a buffer for later execution.
• Process—A logical grouping of steps. There are no enforced restrictions, but you should contain all task
dependencies within the process. Each step in a process should be able to execute on its own, without
previous processes running. For example, if a step in a process requires a JDBC connection, that connection
should be configured within the process, and should not rely on a step in another process. See Creating CIM
Wizards and Processes (page 7).
• Wizard—A set of one or more processes executed in order to configure a product. See Creating CIM Wizards
and Processes (page 7).
• Task—Carries out the work specified in the step. A step can include more than one task. See Adding Tasks to
Steps (page 10).
• Validator—Can check system state to ensure that information is processed correctly, or can validate user input
for a variety of possible error conditions, allowing you to alter the script’s flow. See Adding Validators (page
15).
2 CIM Overview 5
The Creating CIM Plugins (page 7) chapter describes how to use each of these elements to guide users
through Oracle ATG Web Commerce Search product configuration.
Executing CIM Plugins
CIM can run in two basic forms. The standard way to run a CIM plugin is using a command line interface to make
selections at each step. To run a CIM plugin with the standard interface, go to:
<ATG10dir>\home\bin
The CIM main menu appears.
You can also run CIM in batch mode. This option is provided for users who must frequently perform identical
installation processes, such as when setting up environments for testing. To use CIM in batch mode, do the
following:
1. Start CIM using the –record flag.
Note that by default CIM records batch files in an encrypted form to protect your passwords. If you need
unencrypted access to your batch files, you can record with the –noencryption flag.
2. Proceed with configuration.
3. Select Batch File Save from the Main Menu when finished.
4. Specify a password to use when running the batch file.
5. Specify a save location.
CIM records your selections in a batch file. To repeat the procedure with those selections, use the following
command to start CIM:
Enter the password when prompted.
Note: When you run a CIM batch file, if any of the data import steps fail, the script exits without continuing on
to configuration steps. If this happens, the log file includes an Error Executing Batch File error message
with information about the failure.
If you are familiar with CIM, you can edit and run batch files without stepping through the UI. The following
example shows a partial batch:
atg.cim.jboss.CreateJbossAppServerInstanceTask.antFile=C:\dev\work\CIM\cim\ant\
6 2 CIM Overview
cim-ant.xml atg.cim.jboss.CreateJbossAppServerInstanceTask.jbossPath=C:/jboss/ atg.cim.jboss.CreateJbossAppServerInstanceTask.serverInstanceName=pub_commerce atg.cim.jboss.CreateJbossAppServerInstanceTask.execute() atg.cim.dynamo.CreateDynamoServerInstanceTask.antFile=C:\dev\work\CIM\cim\ant\ cim-ant.xml atg.cim.dynamo.CreateDynamoServerInstanceTask.atgPath=C:/ATG/ATG10/ atg.cim.dynamo.CreateDynamoServerInstanceTask.serverInstanceName=pub_commerce atg.cim.dynamo.CreateDynamoServerInstanceTask.execute()
When the script is finished, it notifies you that the script completed successfully.
Note: No validation is performed when using batch mode. CIM tasks are executed in order.
Using the Provided CIM Plugins
By default CIM includes a number of plugins already created for configuring Oracle ATG Web Commerce
products. You can build on these plugins as described in this guide, or use them as models for creating your
own. The following are included in CIM:
• Product Selection—Users select the combination of products they want to configure.
• Server Instance Creation—Create Oracle ATG Web Commerce servers with the required /config layer
information.
• Application Server Selection—Users must select the application server to which their application will be
deployed, and can perform some optimization tasks.
• Database Configuration—Users provide database configuration information, configure datasources, etc. for
the products they have selected.
• Application Assembly—Users can assemble and deploy their application to the application server.
• Custom Wizard Launcher—New CIM wizards you create are added under this menu.
Documentation for these plugins is provided as part of the command-line interface; type H at any prompt to
access the help. You may want to familiarize yourself with these plugins before creating your own.
3 Creating CIM Plugins 7
3 Creating CIM Plugins
To create a CIM plugin, you create several XML files that define your plugin and its features. The wizards.xml
file and its associated tasks.xml files define the following:
• What steps the plugin contains
• What order in which to perform the steps
• What user input to accept
• What validation to perform
• What programmatic tasks should be performed
Plugin creation is straightforward, and you can take advantage of many existing components when you create a
new plugin. Your plugins can also use XML-combine to extend existing plugins.
This chapter explains how to write XML code that assembles CIM components into a functioning plugin; for
detailed information on those components, and how to create your own components, see the Creating CIM
Worker Objects (page 21) chapter.
This chapter contains the following sections:
Creating CIM Wizards and Processes (page 7)
Adding Steps to a Process (page 9)
Adding Tasks to Steps (page 10)
Using Commands in Steps (page 12)
Using Dynamic Values in Steps (page 15)
Adding Validators (page 15)
Example CIM Plugin (page 17)
Creating CIM Wizards and Processes
The first step in creating your wizard is to create the base script to which you will add configuration functionality,
validators, and other components.
8 3 Creating CIM Plugins
To create a new CIM script, create a wizards.xml file as shown:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE wizards SYSTEM "http://www.atg.com/dtds/wizard_1_0.dtd">
<wizards> <wizard id="ID"> <title resource-key="" resource-params="">Title</title> <detail resource-key="" resource-params="">Detail</detail> <process id="MyProcess">
<!-- steps here -->
Place the wizards.xml file in the <ATG10dir>/cim/plugins/plugin_name/ directory, along with any
supporting files for that plugin. Give the plugin_name directory any name, but note that the name cannot
include spaces. The wizard and process id must both be unique and should be descriptive enough to identify
the wizard’s function.
Note: The wizard-type attribute for the <wizard> element is used only by product configuration wizards,
and should not be used in custom scripts. If this attribute is used, the script will not appear in the custom wizard
launcher.
If you want your wizard to extend another wizard, use the following:
<wizard id="MyWizard" extends="OtherWizard">
When you extend a wizard, the following items are merged using XML-combine:
• MyWizard XML with OtherWizard XML
• Supporting files, including tasks.xml, validators.xml, providers.xml, and selectproviders.xml,
are combined if the two wizards are located in different plugins; if they are in the same plugin, they both use
the same supporting files
MyWizard inherits everything included in the OtherWizard plugin. Note that it does not inherit items from
other wizards that are defined in the same plugin as OtherWizard, but only inherits from OtherWizard itself.
In addition, MyWizard can access Java classes used in the plugin that contains OtherWizard. See the XML File
Combination section of the ATG Platform Programming Guide for general information on XML-combine.
When you run the MyWizard plugin, a combined-MyWizard.xml file containing the combined wizards is
saved to the directory where MyWizard’s wizards.xml file is located. This file is deleted if the wizard exits
successfully, unless you have turned on debugging. To turn on debugging, edit the <ATG10dir>/CIM/config/
GLOBAL.properties file.
The title and detail are shown in CIM menus. For example:
Choose Wizard: *[0] OtherWizard – OtherWizard detail [1] MyWizard - MyWizard detail
3 Creating CIM Plugins 9
The wizard element contains one or more process elements, which contain a logical grouping of steps and
have no attributes of their own (see the Adding Steps to a Process (page 9) section for step information).
For an example, see the Example CIM Plugin (page 17) section of this chapter, or review the wizards.xml file
located at <ATG10dir>/CIM/plugins/base in your Oracle ATG Web Commerce installation.
Adding Steps to a Process
Steps are where the work of a CIM plugin is outlined. Each step should consist of a logical group that can be
presented to the user as a single entity. When the step is complete, the following events have taken place:
• Relevant information is displayed to the user about what CIM will do
• Input has been collected from the user
• Validators may have checked the input or system state
• Tasks are prepared for execution
• A navigation option is chosen by the user
To insert a step, place the following XML snippet inside a process tag:
<step id="step_ID" insert-after="other_step_ID" type="standard_or_base" class="class_name"> <title/> <detail/> <property name="some_name"> <value>value</value> </property> <navoption> <option default="true"> <label>Next Step</label> <command type="EXECUTE_STEP_TASKS" /> <command type="NEXT_STEP" /> </option> <option > <label>Redo Step</label> <command type="DROP_STEP_TASKS" /> <command type="REDO_STEP" /> </option> </navoption> </step>
Steps have the following attributes:
• id—Uniquely identifies the step to the framework.
• insert-after—When combining wizards, identifies the step ID in the base file after which this step should
be inserted.
• type—Can be standard or template. This attribute is optional, and the default is standard. A standard
step acts as part of a simple, linear process with a tightly restricted set of user options, and relies on default
10 3 Creating CIM Plugins
worker objects for its behavior. A template step permits dynamic generation of options and greater
flexibility, but requires you to write your own components; this is provided for use with future versions of CIM.
• class—If a template step, provide the class used to implement the step. This attribute is optional.
Steps contain the following elements:
• title—Identifies the step in the user interface.
• detail—Additional text that provides any information the user needs to know in order to complete the step.
• property— Argument to pass to a template step; not used in standard steps. This allows a single template
to be reused, displaying different information depending on the property. For an example, see the Database
Configuration menu in CIM, in which a single template displays different options depending on the database
selected.
• navoption—Provides a framework of options from which the user can select. As part of navigation,
commands are fired, some of which are purely navigational, and others of which have to do with tasks that
are prepared during the step. Navigation options include Next Step, Redo Step, Jump to Third Step, etc. The
default selection is indicated by the attribute default="true", and is executed if no value is entered and the
user presses the Enter key.
• navoptionprovider—For dynamic navigation, provide the Java class that supplies this feature for your
script.
For an example, see the Example CIM Plugin (page 17) section of this chapter, or review the wizards.xml file
located at <ATG10dir>/CIM/plugins/base in your Oracle ATG Web Commerce installation.
Changing Step Order in Combined Wizards
If your wizard extends an existing wizard, you’ll need to think about the order in which the steps of the
combined wizard should be performed. Default behavior is to append your wizard to the wizard you are
extending. You can change this by using the insert-after attribute in your step as shown:
<step id="AddedStep" insert-after="OriginalWizardStep" > </step>
When the script is run, your wizard’s AddedStep is performed immediately after the OriginalWizardStep from the
extended wizard.
You can also use the combination to entirely suppress steps in the base wizard. See the XML File Combination
section of the ATG Platform Programming Guide for general information on XML-combine.
Adding Tasks to Steps
As part of the step, you can specify one or more tasks to be configured and executed. Tasks reside in their own
XML file, named tasks.xml, and are referred to from wizards.xml. The id specified in the wizards.xml file’s
task element must match the id of a task defined in tasks.xml. For an example of a tasks.xml file, see the
<ATG10dir>/CIM/plugins/base directory in your Oracle ATG Web Commerce installation.
3 Creating CIM Plugins 11
In the task, you specify the name and Java class. This identifies to CIM the component that is going to do the
work of the task, so that CIM can set properties on that component. Input passes through the following series of
layers:
CIM user interface > wizards.xml > tasks.xml > JavaBean
The task element’s property element refers to a component property to which the input should be assigned.
Within the input element, you can include a label, which is displayed in the user interface, and one or more
validators to check the entered text (see the Adding Validators (page 15) section of this chapter).
Task examples are shown in the sections that follow.
Adding a Task with No Properties
To add a simple task to a step in a wizard, add the snippet below as a child of a <step> element. Multiple tasks
can be included in a single step, in which case they are processed in order.
<step> … <task id="CreateDemoFileTask"/> <task id="DoSomethingTask"/> … </step>
Adding a Task with Properties
In the tasks.xml file, the tasks themselves are specified in detail, including which JavaBean does the task’s
work, what information is collected, and any validation that should be performed. The property elements point
to properties of the bean.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE tasks SYSTEM "http://www.atg.com/dtds/task_1_0.dtd">
<tasks>
Collecting User Input for Tasks
In addition to retrieving values, your script’s end user may need to set values in order for a task to be completed.
CIM has a text-based interface, and users can input information as shown by the bold line in the following
example, which allows the user to enter a value for the serverInstanceName property:
<task id="CreateJBossAppServerInstanceTask"
class="atg.cim.jboss.CreateJbossAppServerInstanceTask"> <property name="serverInstanceName"> <value>pub_commerce</value>
<input type="text"> <label>Enter a unique server instance name:</label> </input>
etc.
Note that if you use a SelectProvider to set a property, such as the serverInstanceName in the sample
above, that SelectProvider must have that property, and it must be of the same type.
CIM supports the following types of input:
• text—User enters plain text.
• select—User selects from a provided list of options using numeric hotkeys. This option requires that you
write a customer Java class that implements iSelectProvider. Identify this class in the selectprovider
attribute for the input tag as shown:
<input type="select" selectprovider="provider_class">
See the Creating Select Providers (page 28) section for information.
• password—Text the user enters is masked by asterisks (*) in the user interface.
• path—User enters a path to an item; this option includes tab completion for quicker input.
Omitting Tasks from Batch Files
As described in Executing CIM Plugins (page 5), a batch file is a script that can be run as a single unit, without
stepping through the user interface. Some tasks, such as those that store user-entered values, do not add any
value to a batch file and can be omitted.
To omit a task from any batch files saved for it, use the following syntax:
<task id="MyTask" batch="false" class="atg.cim.dynamo.TaskClass"> … </task>
The default batch value is true.
Using Commands in Steps
Commands are used within steps to instruct the CIM framework to either do something with the configured
tasks in that step, or perform navigational functions. Commands are specified using the type attributes of the
command element. For example:
Task Commands
The following commands can be used in steps to affect tasks:
• LAUNCH_WIZARD—Used by the Base plugin to launch wizards. Do not use.
• LAUNCH_TEMPLATE—If you are extending CIM, use this command to signal the start of your own template.
Requires value="class name of template".
• TEMPLATE_COMPLETE—Signals the end of a template, returning program control to the wizard. If you provide
a value attribute, it is used as the value of a GO_TO step by the parent plugin.
• WIZARD_COMPLETE—Signals the end of a wizard. Do not use.
• EXECUTE_QUEUED_TASKS—Executes all tasks on the queue at one time.
• DROP_STEP_TASKS—Any configured tasks that have not yet been performed are not executed.
• EXECUTE_STEP_TASKS—Executes tasks configured during step, does not execute any queued tasks.
• DELETE_QUEUED_TASKS—Clears the queue of all tasks.
• DISPLAY_TEXT—Displays text to the UI. Requires value="text to display".
• ADD_STEP_TASKS_TO_QUEUE—Moves step tasks to the queue, enabling them to be processed as a batch at a
later time.
The following example involves executing currently configured tasks when the user moves to the next step in
the wizard:
<navoption> <option default="true"> <label>Next Step</label> <command type="EXECUTE_STEP_TASKS" /> <command type="NEXT_STEP" /> </option>
For additional examples, see the Example CIM Plugin (page 17) section of this chapter, or review the
wizards.xml file located at <ATG10dir>/CIM/plugins/base in your Oracle ATG Web Commerce installation.
Navigation Commands
Navigation can be added to steps using commands. The following commands are used for navigation in a step:
• NEXT_STEP—Process the next step in the step list.
• REDO_STEP—Process the current step again, using default values.
• PREVIOUS_STEP—Process the previous step in the step list.
• GOTO_STEP—Process the step given in the required targetId attribute. Requires value="step ID to go
to".
14 3 Creating CIM Plugins
• REDO_INPUT—Causes CIM to re-render the last label and input request. Can only be used in the POSTINPUT
phase of an input validator.
• PROCESS_COMPLETE—Notifies CIM that a process has been completed.
• QUIT—Shut down CIM with no saving of data.
The following example shows how you can use navigation commands along with task commands in your steps:
<step id="FirstStep"> <title>First Step</title> <detail>Details of the first step: Demonstrates simple navigation </detail> <navoption> <option default="true"> <label>Next Step</label> <command type="EXECUTE_STEP_TASKS" /> <command type="NEXT_STEP" /> </option> <option > <label>Redo Step</label> <command type="DROP_STEP_TASKS" /> <command type="REDO_STEP" /> </option> <option > <label>Jump to [T]hird Step</label> <command type="DROP_STEP_TASKS" /> <command type="GOTO_STEP" value="ThirdStep" /> </option> <option > <label>Jump to [F]ourth Step</label> <command type="DROP_STEP_TASKS" /> <command type="GOTO_STEP" value="FourthStep" /> </option> </navoption> </step>
Note that when adding navigation options, you should surround the hot-key letter with brackets:
Load [W]izard.
If no brackets are present, CIM automatically designates the first letter as the hot key. CIM will throw a runtime
error if a single step includes multiple equivalent hotkeys.
Compound Commands
In addition to the task commands and navigation options outlined in the previous sections, CIM also includes
the following commands, which combine a task and navigation option:
• DROP_REDO—Combines the DROP_STEP_TASKS task command with the REDO_STEP navigation command.
• EXECUTE_NEXT—Combines the EXECUTE_STEP_TASKS task command with the NEXT_STEP navigation
command.
command.
3 Creating CIM Plugins 15
Using Dynamic Values in Steps
There are several ways you can use dynamic values in steps. This allows you to refer to component values easily
and to localize your scripts.
To refer to a value in the session context, use the following syntax:
${variableName}
To refer to a bean value, use the following syntax:
${componentID.propertyName}
Where componentID is the id for the task (defined in tasks.xml), validator (defined in validators.xml),
or provider (defined in providers.xml) you want to access. If the JavaBean is a provider (see the Creating
Providers (page 27) section of the Creating CIM Worker Objects (page 21) chapter), the CIM framework will
call the provider’s provide() method and refresh the component every time it accesses the component. This is
useful if you’re accessing information that changes during the course of running the script.
Adding Validators
CIM uses validator objects to check user input for formatting or other errors. Validators return either true or
false, and allow you to conditionally display messages or perform navigation commands.
Validators can be used at two levels in a script:
• In a step, a validator can perform a check on some system state.
Note that using validators may mean that not all phases of the step execute. For example, if the outcome of a
PRESTEP validator commands CIM to navigate to another step, later phases will never execute.
• When a task collects input, a validator can check the input immediately.
For each validator, you’ll need to specify:
• The step phase in which validation takes place.
• Commands to execute if the validator returns true (optional).
• Commands to execute if the validator returns false (optional).
Step validators can be described in terms of the point at which they perform their check; this information is
required in the phase attribute of the validator tag. The phases are:
16 3 Creating CIM Plugins
• PRESTEP—Executed before processing a step starts.
• PREINPUT—Executed after title and description UI rendered to user, but before any input collection elements
are rendered.
• PRENAVIGATION—Executed after UI input collection is complete and tasks are configured, but before
navigation options are displayed to the user. at this point no tasks have been executed.
• POSTSTEP—Executed after navigation chosen by user, does not execute if the user selects a navigation step
that executes a command to move to another step.
To use a validator in a step, add the snippet below as a child of a <step> element. Multiple validators can be
added to a single step. They are processed in order depending on their phase attribute.
<step>
... other xml...
</step>
To use a validator in a task, use the following XML:
<task id="CreateJBossAppServerInstanceTask" class="atg.cim.tasks.CreateJBossAppServerInstanceTask" <property name="serverInstanceName"> <value>pub_commerce</value>
etc.
3 Creating CIM Plugins 17
For an example, see the Example CIM Plugin (page 17) section of this chapter, or review the files located at
<ATG10dir>/CIM/plugins/base in your Oracle ATG Web Commerce installation.
Handling Errors in Steps
In addition to whatever error handling you may build into your Java classes, CIM includes an XML-level form of
basic error handling. If one of your steps encounters an error during execution, you can use the <error> element
to specify an alternative step.
In this example. the error element checks to see if there have been changes to CIM’s persisted data made
outside of CIM; if so, the UI prompts the user to re-select a product for configuration.
<error> <step id="ProductionSelectionPersistenceCheckErrorStep"> <title>Product Selection Model Update</title> <detail> <![CDATA[ The CIM Product object model has been updated.
REQUIRED ACTION: Re-Execute the Product Selection wizard. Select [p] from the Main Menu. ]]> </detail> <navoption id="continue"> <label>Continue</label> <command type="NEXT_STEP" /> </navoption> </step> </error>
Example CIM Plugin
The following code shows an example of a wizards.xml file that defines a custom CIM plugin. The plugin helps
a user install an Oracle ATG Web Commerce hotfix, and shows the elements previously described in this chapter
working together.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE wizards SYSTEM "http://www.atg.com/dtds/wizard_1_0.dtd"> <wizards> <wizard id="MyPlugin"> <title>Configure ATG10 Hotfix 2</title> <detail>Installs a test hotfix</detail>
<process id="TestProcess"> <step id="FirstStep"> <title>First Step</title> <detail>Choose the task you want to perform:</detail>
18 3 Creating CIM Plugins
<navoption id="install"> <label>[I]nstall hotfix</label> <command type="GOTO_STEP" value="InstallHotfix"/> </navoption> <navoption id="uninstall"> <label>[U]ninstall hotfix</label> <command type="GOTO_STEP" value="UninstallHotfix"/> </navoption>
</step>
<step id="UninstallHotfix"> <title>Test Hotfix Uninstallation</title> <detail></detail> <navoption id="install"> <label>[U]ninstall hotfix</label> <command type="GOTO_STEP" value="RemoveHotfix"/> </navoption> </step>
<step id="RemoveHotfix"> <title>Uninstall Hotfix</title> <detail>Uninstalls the test hotfix</detail>
<task id="RemoveHotfix"/> <task id="RemoveProperties"/>
<validator id="AlwaysTrueValidator" phase="PRENAVIGATION"> <if-true> <command type="EXECUTE_STEP_TASKS" /> <command type="DISPLAY_TEXT" value="Hotfix has been uninstalled" /> <command type="GOTO_STEP" value="FirstStep"/> </if-true> </validator> </step>
</process>
</wizard> </wizards>
4 Creating CIM Worker Objects 21
4 Creating CIM Worker Objects
This chapter describes how to create new worker objects for CIM. Worker object is a general term for a Java
class that performs any sort of functionality relating to the installation and configuration of Oracle ATG Web
Commerce products. Validators, Tasks, and Providers are three types of worker object.
• Task. Use when you want to do something such as copy a file or save data.
• Validator. Use to check user input or system state. For example, ensure that an input string contains only
alphanumeric characters. Validators return true or false values.
• Provider. Use a provider when a wizard needs a value from the system, such as a list of names of the current
JBoss server instances.
• Select Provider. Use when you want to give the user a list of items from which to select. Select providers can
set properties, but do not perform actions.
• Navoption Provider. Use to provide a dynamic list of navigation options that perform tasks when selected.
This chapter includes the following sections:
Creating Tasks (page 21)
Creating Validators (page 25)
Creating Providers (page 27)
Creating Tasks
A Task is a worker object that allows the CIM framework to make a change in the system. Task objects implement
the execute() method in the atg.cim.worker.ITask interface.
ITask defines the methods shown:
package atg.cim.worker; import java.io.Serializable;
22 4 Creating CIM Worker Objects
public interface ITask extends Serializable {
/** * Called by the CIM Framework before calling execute(). Logic checking if the *task can be executed should be placed in this method. * * @return true if the object has all the values needed to execute */ public boolean canExecute(); /** * Logic to perform a task should be placed in this method. Code should update *the message property so the framework may retrieve the last state of the *component. * * The IProgressMonitor may be null, so logic should test before using this *argument. * * @throws TaskException */ public void execute(IProgressMonitor progressMonitor) throws TaskException;
/** * Called by the CIM Framework before calling undo(). Logic to check should be *placed in this method. * * @return true if the object can undo */ public boolean canUndo();
/** * Logic to return a system to its before-execute state. * * The IProgressMonitor may be null, so logic should test before using this *argument * * @throws TaskException */ public void undo(IProgressMonitor progressMonitor) throws TaskException;
}
It is a good practice to end your class names with Task (for example: ATGPathTask).
You can extend the atg.cim.worker.Task class to create custom tasks, as shown in the Example: Writing a
HelloWorld Task (page 23) section.
The progressMonitor method can be used to display a status bar for any task that is defined in its XML
as “long-running.” In the provided configuration scripts, tasks such as schema creation and data import are
considered long-running. It can show progress when the amount of work is unknown (similar to the Windows
spinning hourglass cursor), or to show increments of a known amount of work as they are completed. The
Progress Monitor interface is shown here:
4 Creating CIM Worker Objects 23
public interface IProgressMonitor {
/** Class version string */ public static final String CLASS_VERSION = "$Change: 509503 $$DateTime: 2008/09/16 13:48:09 $$Author: acollege $";
/** * Constant indicating an unknown amount of work. */ public static final int UNKNOWN = -1;
/** * Called by worker object at the start of a long running task. Should only be *called once on a given * IProgressMonitor instance. * * @param pTaskMsg - msg to display to the UI * @param totalWork - the total number of units to be processed. Value may be *IProgressMonitor.UNKNOWN for * when the total number of work units is not known in advance */ public void beginTask(String pTaskMsg, int pTotalWork);
/** * Called numerous times by a worker object as a long running task is being *processed * * @param work the number of units of work completed for this call. This is an *incremental value, * not the cumulative amount of work performed so far. * */ public void worked(int pWork);
}
Write the following Task object class.
Note: Although undo() methods are included in the worker object API, they are reserved for future use.
package atg.cim.task;
24 4 Creating CIM Worker Objects
/* This is simply a dummy demo task and prints * Hello World! at the console. */
public class HelloWorldTask implements ITask {
String mMessage;
/** * Simply returns true */ public boolean canExecute() { return true; }
/** * Returns false, as sending output to console * can not be undone * @return false */ public boolean canUndo() { return false; }
/** * * Prints "Hello World!" at console. * * @param pProgressMonitor * @exception TaskException */ public void execute(IProgressMonitor pProgressMonitor) throws TaskException { try { System.out.println("Hello World!"); mMessage = " Executed HelloWorldTask";
} catch(Exception exp) { mMessage = "Error executing HelloWorldTask"; throw new TaskException("Error ", exp); }
}
Adding Tasks to the CIM Library
Tasks are made available to the CIM framework by adding an XML snippet to any /plugin_name/tasks.xml
file as shown in the example:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE tasks SYSTEM "http://www.atg.com/dtds/task_1_0.dtd">
<task id="DeleteFileTask" class="atg.cim.task.DemoTask">
4 Creating CIM Worker Objects 25
<property name="fileName"> <input type="text"> <label>Enter a file name : </label> </input> </property> </task>
You can now refer to the DeleteFileTask in your wizards.xml file.
Creating Validators
A validator is a class that implements the validate() method of the atg.cim.worker.IValidator. To write
your own validator object, you will need to provide the concrete implementation of the methods defined in the
IValidator class.
public interface IValidator {
/** * Called by the CIM Framework before calling validate(). * * @return true if the object can validate values */ public boolean canValidate();
/** * Logic to test a condition should be placed in this method. Code should * update the message property so the framework may retrieve the last state of * the component. * * @throws ValidatorException */ public boolean validate() throws ValidatorException;
}
It is a good practice to end your class name with Validator (such as ATGLicenseValidator) and include it
under the package atg.cim.validator.
The following is an example of a simple validator class:
package atg.cim.validator;
import atg.cim.util.Util;
import atg.cim.worker.IValidator; import atg.cim.worker.ValidatorException;
/** * This validator class validates if the property "title" * equals "Hello World!" */
public class HelloWorldValidator implements IValidator {
String mMessage;
private String mTitle;
/** * Returns the title string * @return mTitle */ public String getTitle() { return mTitle; }
/** * Sets the title * @param pTitle */ public void setTitle(String pTitle) { mTitle = pTitle; }
/** * assert that the title is not null/blank * * @return true if input parameter is not null/blank<br> * false if input parameter is null/blank */ public boolean canValidate() { if( Util.isNullOrBlank(mTitle) ) { //unable to validate because title is null or blank mMessage = "HelloWorldValidator cannot validate as string is null or blank"; return false; } else { return true; } }
/** * validates that the value of title is "Hello World!" * @return true if value of title is "Hello World!"; false otherwise * @throws ValidatorException */ public boolean validate() throws ValidatorException { if ( mTitle.equals("Hello World!") ) { //title is equal to "Hello World!" mMessage = "HelloWorldValidator has successfully validated the title" + mTitle; return true; } else {
4 Creating CIM Worker Objects 27
//title does not equals "Hello World!" mMessage = "HelloWorldValidator has successfully validated and your title is not Hello World!. It is " + mTitle; return false; } }
public String getMessage() {return mMessage;} }
Making Validators Available to CIM
To make your validator available to the CIM framework, add an XML snippet to any /plugin_name/
validators.xml file. For example:
<validator id="MyNewValidator" class="atg.cim.validator.HelloWorldValidator"> <title>HelloWorld!</title> </validator>
Now you can refer to the validator MyNewValidator in your wizards.xml file.
Creating Providers
Provider objects are JavaBeans that provide values to the CIM framework by exposing properties. They
implement atg.cim.worker.IProvider, which defines the two methods below. The only difference between
an IProvider object and any other JavaBean is that CIM will always call the provide() method immediately
before accessing any property values.
The IProvider interface is extremely simple:
package atg.cim.worker;
/** * IProvider objects are javabeans that provide values to the CIM Framework by exposing properties. The only real difference between any other nucleus component is that the CIM framework will call the .provide() method before each time a getter is called on a property. **/ public interface IProvider {
/** * Called by the CIM Framework before calling provide(). * * @return true if the object can provide values */ public boolean canProvide();
28 4 Creating CIM Worker Objects
/** * logic to initialize and set object properties should be placed in this method. CIM Framework calls this method each time a value is accessed from this component * @throws ProviderException */ public void provide() throws ProviderException;
Providers can be used to replace values through a CIM plugin, by including the following syntax:
${ProviderID.property}
CIM calls the provide() method before it replaces the value.
Making Providers Available to CIM
To make your provider available to the CIM framework, add an XML snippet to any /plugin_name/
providers.xml file. For example:
<provider id="MyNewProvider" class="atg.cim.provider.HelloWorldProvider"> </provider>
Now you can refer to the provider MyNewProvider in your wizards.xml file.
Creating Select Providers
The SelectProvider is not a sub-type of Provider, but a distinct type of worker object. Select providers allow
users to select items from a list of options.
They are referenced in the tasks.xml input element; for example:
<input type="select" selectprovider="wizardSelectProvider">
You can constrain users to a single selection or allow multi-select. This example shows a single-select option in
the user interface:
Select one > N
For a multiselect list, a Done option is included automatically:
[1] Reporting *[2] Search [3] Staging Server [D] Done
Select zero or more >
Two properties enable this functionality:
• minOccurs defines the minimum number that must be selected; default is 1
• maxOccurs defines the maximum number that can be selected; default is 1
Infinity is represented by -1.
Single selection is the default, but it can be explicitly instantiated with minOccurs=1 and maxOccurs=1.
The multi-select option allows users to choose multiple selections, separate by spaces. Default selections are
marked with an asterisk. Multiselects can use a range of either zero-to-many, one-to-many, or many-to-many.
Ranges are numerically based (0-1, 1-1, 5-10 are all valid examples). Users mark their selections by entering a
space-separated list. Entering an item that is already selected deselects it. Validation ensures that the selection is
within the minOccurs and maxOccurs range.
The ISelectProvider interface is shown here:
package atg.cim.worker;
import java.util.List;
import atg.cim.model.SelectProviderOption;
/** * ISelectProvider objects are javabeans that provide values to the CIM Framework by exposing properties based on a use input. They also provide a list of choices to the UI */
public interface ISelectProvider { /** * Called by the CIM Framework before calling provideChoices(). * * @return true if the object can provide values */ public boolean canProvide();
/** * create a list of choices to display to the UI. The List will be modified * by the users selection and it will be passed to setUserSelection after user *input. * * * @throws ProviderException */ public List<SelectProviderOption> provideChoices() throws ProviderException;
30 4 Creating CIM Worker Objects
/** * * This method is called by the framework immediately after a user * makes a selection. * set the bean values to expose depending on the choice from the UI. * The selected options are flaged as Selected in the SelectProviderOption List * that was created from the Provide Method * @param pChoices The list of {@link SelectProviderOption}. Call isSelected on *each * {@link SelectProviderOption} to find what the user has selected. * * @throws ProviderException */ public void setUserSelection(List<SelectProviderOption> pChoices) throws ProviderException;
/** * called by framework to override the minOccurs property * * @param pMinOccurs */ public void setMinOccurs(int pMinOccurs);
/** * called by framework to override the maxOccurs property * * @param pMaxOccurs */ public void setMaxOccurs(int pMaxOccurs);
/** * called by framework to get the minOccurs property * */ public int getMinOccurs();
/** * called by framework to get the maxOccurs property * */ public int getMaxOccurs(); }
The property name of the SelectProvider has to match the property name of a task that you’re using the
SelectProvider for.
Example: Writing a SelectProvider
This example demonstrates how to write a SelectProvider with Yes and No options.
package atg.cim.worker.common;
import atg.cim.model.SelectProviderOption; import atg.cim.worker.ISelectProvider; import atg.cim.worker.SelectProvider;
public class YesNoSelectProvider extends SelectProvider {
private boolean mChoice; /**Get the user selection * @return True if the user selected Yes, False if they selected No */ public boolean isChoice() { return mChoice; } /**Set the users selection * @param pChoice the choice to set */ public void setChoice(boolean pChoice) { mChoice = pChoice; }
/**Always Return true * @return True * @see atg.cim.worker.ISelectProvider#canProvide() */ public boolean canProvide() { return true; }
/**Provides a list with options Yes and No * @return A SelectProviderOtpion list of Yes and No * @see atg.cim.worker.ISelectProvider#provideChoices() */ public List<SelectProviderOption> provideChoices(){ List<SelectProviderOption> choices = new ArrayList<SelectProviderOption>(2); choices.add(0, new SelectProviderOption("yes","Yes")); choices.add(1,new SelectProviderOption("no","No")); return choices; }
/**Set the value from the user's selection * @param pChoices * @see atg.cim.worker.ISelectProvider#setUserSelection(java.util.List) */ public void setUserSelection(List<SelectProviderOption> pChoices){ if(pChoices.get(0).isSelected()) mChoice = true; else mChoice = false; }
}
Making Select Providers Available to CIM
Select providers are declared in selectproviders.xml, using the syntax shown in this example:
32 4 Creating CIM Worker Objects
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE selectproviders SYSTEM "http://www.atg.com/dtds/selectprovider_1_0.dtd">
<selectproviders>
</selectproviders>
Creating Navoption Providers
A NavOptionProvider generates a list of steps at runtime, from which the user can then select. A step can refer
to a NavigationOptionProvider instead of listing each navigation option.
The interface for this class is extremely simple:
public interface INavigationOptionProvider { /** * A Navigation provider should create a List of NavigationOptions. * */ public List<NavigationOption> provide() ;
Example: Navoption Provider with Two Options
This example shows a Navigation list with options Yes and No:
public ListNavigationOption provide() { ListNavigationOption navOptList = new ArrayList<NavigationOption>();
NavigationOption yesNavOpt = new NavigationOption(); yesNavOpt.setId("yesOpt"); yesNavOpt.setHotkey('Y'); yesNavOpt.setDefaultOption(true); yesNavOpt.setDisplayLabel(new Label("Yes")); yesNavOpt.addCommand(new Command(CommandType.GOTO_STEP,"YesStepId")); navOptList.add(yesNavOpt);
NavigationOption noNavOpt = new NavigationOption(); noNavOpt.setId("noOpt"); noNavOpt.setHotkey('N'); noNavOpt.setDefaultOption(true); noNavOpt.setDisplayLabel(new Label("No")); noNavOpt.addCommand(new Command(CommandType.GOTO_STEP,"NoStepId"));
navOptList.add(noNavOpt);
Using Navoption Providers in Steps
Unlike other worker objects, these providers do not have to be registered anywhere in order for CIM to use
them.
To use the navoption provider in a step, use XML as shown:
<navoptionprovider class="atg.cim.worker.base.MainMenuNavigation"> <property name="someProp"> <value>someValue</value> </property> </navoptionprovider>
The provide() method of the MainMenuNavigation object is called when the step is displayed. It returns a list
of Navigation Options based on the progress of the user. This is implemented as a provider and not as a static list
because the options change based on the plugin state and the user’s selections.
34 4 Creating CIM Worker Objects
5 Using Product Definition Files 35
5 Using Product Definition Files
CIM scripts use product definition files to describe the product combinations they configure and their
dependencies, including possible add-ons and standard configuration options. This product awareness allows
the CIM templates to generate appropriate steps and request information from the user according to the
combination of products they are configuring.
A product.xml file defines the information required to configure a particular Oracle ATG Web Commerce
product. It defines the products themselves, any optional features, and module lists for each product, and may
address multiple versions of a product in the form of server-instance types.
CIM uses the product.xml file to generate a list of top-level modules, which are then used for database
configuration and application assembly.
CIM expects the product.xml file to be under a CIM directory within the application module, as shown:
/some_module /cim product.xml
The product.xml cannot be located any deeper than the second level of the module’s directory structure. The
product definition file defines the options described in the sections that follow:
Product Definitions (page 35)
Server Instances (page 37)
Product Add-Ons (page 42)
Example Product Definition File (page 49)
Product Definitions
The first few elements in the product definition file are used for identification of the product or products
described in the file. The id attribute must uniquely identify the product. The title and detail can be shown
in the user interface. The file must include the DTD declaration shown:
36 5 Using Product Definition Files
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE product SYSTEM "http://www.atg.com/dtds/product_1_0.dtd">
<product id="commerce" > <title>Core Commerce</title> <detail>Configure Core Commerce</detail>
In addition to title and detail, product definition files can include the following elements:
• <requires-addon-id id="ADDON_ID"/>
Identifies an add-on as required; the add-on is automatically selected if the product is selected. See the
Product Add-Ons (page 42) section of this chapter for information.
• <product-id-required id="PRODUCT_ID"/>
Identifies another product as required; the product is automatically selected if the main product is selected.
• <incompatible-product-id id="PRODUCT_ID"/>
Identifies a product as incompatible with this product. If the user selects both, the CIM UI displays an error
message.
Identifies a particular add-on as incompatible with this product. CIM automatically removes this add-on from
the list, so that it cannot be selected.
You can extend an existing product by using the extends attribute. For example:
<product id="commerce" extends="platform">
When you extend one product with another, their product.xml files are merged using XML-combine. If
multiple extensions are involved, the files are combined in extension order.
Note that product.xml files are also merged when end-users select multiple products to configure from the
CIM menu, even if no extension is stated in the XML. The order in which the files are combined varies depending
on the selections. If multiple products are selected that extend other products, the extensions are combined
first, followed by the product selection combinations.
That means that any xml-combine arguments like xml-combine="remove" will only affect the combine with
the “extends” and not with multiple products.
The final XML for combined products is placed in the same directory as the product.xml file that includes
the extension and is called combine-product.xml. For example, if Product A has no extensions, and Product
B extends Product A, after combination, the product.xml directory for Product B also contains a combine-
product.xml.
See the Product DTD (page 65) section of Appendix A, CIM DTDs (page 65) for details on the
product.xml elements and attributes.
Server Instance Types
A server instance type represents a particular type of configuration for the product. It is basically a wrapper
for a list of modules, a group of data sources, and individual server instances (you can have multiple instances
of a server that is of a particular type). This feature does not apply to all Oracle ATG Web Commerce products,
but one common application for it is with ATG Content Administration, which requires configuration of both a
source (often called the publishing server) and a target server.
Each instance-type can have its own list of modules and configuration file information. For example:
<server-instance-type id="management"> <title resource-key="CAServer.name">CA Server</title> <detail resource-key="CAServer.detail"/>
<append-module>BIZUI</add-module> <append-module>PubPortlet</add-module> <append-module>DafEar.Admin</add-module> <add-named-datasource>management</add-named-datasource> <add-server-instance id="ID"> <config-directory> <property-file> … </property-file> </config-directory> <optional-config-directory id="some-option"> <title>Configure these optional properties</title> <detail></detail> <property-file> … </property-file> </optional-config-directory>
</server-instance-type>
You can append modules, add named datasources, and add server instances to an instance type, as shown in the
example above, and configure property files (see the Property Files (page 38) section for more information
on these elements).
Server Instances
A server instance represents a particular implementation of a server instance type. The one thing you can
change at the server instance level but not the server instance type level is runAssembler arguments.
For example, this code fragment provides different assembly options for the basic_management and
management_lock server instances:
38 5 Using Product Definition Files
</modify-server-instance> <modify-server-instance id="management_lock"> <add-appassembler-option name="layer" value="preview"/> </modify-server-instance> </product-addon>
Property Files
As part of the server-instance-type and server-instance elements, you can specify properties files to
create and configure. If you configure properties files in the server-instance-type element, every server
instance of that type uses the same properties file. If the property file is in the server-instance element, each
instance can have unique configuration.
Property files are specified in the config-directory element of a particular server instance or instance type,
as shown in this example:
<product id="blueprint" extends="commerce"> ... <server-instance id="basic_management" type="management"> ... <config-directory> <!--Property file declarations here -->
The server-instance-type element supports an additional optional-config-directory element. This
element cannot be used in a server-instance element. It appears as a separate option in the server instance
configuration user interface. For example:
<server-instance-type id="id"> <title>Title</title> <config-directory> <property-file> … </property-file> </config-directory> <optional-config-directory id="some-option"> <title>Configure these optional properties</title> <detail></detail> <property-file> … </property-file> </optional-config-directory> </server-instance-type>
A property file is defined by a file name and a list of properties. The file name is relative to the path
<ATG10dir>/home/servers/server_name/localconfig, and should start with a slash, as shown in the
value element of this example::
<property-file file="atg/dynamo/service/jdbc/JTDataSource.properties"> <property-group id="base">
<property name="dataSource"> <value>/atg/dynamo/service/jdbc/DirectJTDataSource</value> </property> </property-group> </property-file>
You can specify multiple property files. You can also group properties as shown, so that the current product
selection acts to filter subsets of the total property list:
<property-file file="atg/SomeFile.properties"> <property-group id="search-reporting"> <!--This group only applies when search and reporting are selected--> <requires-addon-id id="search"/> <requires-addon-id id="reporting"/> <property name="someProperty"> <value>propertyValue</value> </property > </property-group> </property-file>
In order for a property group to be included in a server instance, all of the requires-addon-id identifiers listed
in the property group must be included in the current product selection. If no add-ons are listed, the property
group applies to all product selections. A property-file element can include multiple property-group
elements, but each property-group must have a unique ID.
In addition to requiring addons, you can use the pass-validation tag to specify a validator to test for other
conditions. As with the requires-addon-id tag, all specified validators must pass in order for to execute the
property group. The following example uses pass-validation to add properties if the database is DB2:
<property-file file="GLOBAL.properties"> <property-group id="db2"> <pass-validation id="HasDB2DatasourceValidator" class="atg.cim.worker.databaseconfig.HasDB2DatasourceValidator"/> <property name="handleRangesInMemory"> <value>true</value> </property> <property name="localTransactionModeInitialization"> <value>false</value> </property> </property-group> </property-file>
You can pass properties to the validator as shown in the following example:
<pass-validation id=" DirectoryExistsValidator " class="atg.cim.worker.common.DirectoryExistsValidator"> <property name="absPath"> <value>C:\ATG\</value> </property> </pass-validation>
Values can be replaced dynamically just as they are with properties files (see Using Dynamic Values in Properties
Files (page 41)).
Collecting Property File Values
You can use the property-file element to collect property values from a CIM user at runtime, using the
following additional elements:
• input—Label displayed as a prompt for the user.
• validator—Validate the user’s input. The validator ID references a validator defined in a validators.xml
file in the Base plugin or the product’s \cim directory.
• error-message—If the validator returns false, the error message is displayed and the input is asked for
again.
The following example shows how to collect property values at runtime:
<property-file file="atg/PropertyFile.properties"> <property-group id="base"> <property name="someProp"> <value>${AppServerPortsProvider.httpPort}</value> <input type="text"> <label>Prompt</label> <validator id="PortNumberValidator"> <error-message>Error</error-message> </validator> </input> </value> </property > </property-group> </property-file>
The dynamic value (${…}) replacement is similar to that used elsewhere in CIM (see Using Dynamic Values
in Properties Files (page 41)). The format is ${WORKER_ID.PROPERTY} where WORKER_ID is the ID of a
validator, task, or provider. In the example above, AppServerPortsProvider is a provider ID.
You can use a worker object provided by CIM, or a custom worker object.
Persistence and Property File Values
To persist property values for later use, provide a persist-key attribute for the property, as shown in this
example:
5 Using Product Definition Files 41
</property-file>
At runtime, if the key references a valid persisted value, that value is used as the default presented to the user.
If the reference does not exist, the value tag is used as the default instead. In both cases, the user input is
persisted to the persist-key specified.
You can also use previously persisted values in a property. In the following example, the second property file
has a lockServerPort property that uses the persisted value from the first property file. Note that the order
is significant; you cannot use a persisted value before it is persisted, so the first time the persisted value is
referenced, the input element must be declared.
<property-file file="/atg/dynamo/service/ServerLockManager.properties"> <property-group id="lock"> <property name="port" persist-key="managementServerLockManagerPort"> <value>9010</value> <input type="text"> <label>Enter Lock Server Port</label> <validator id="PortNumberInputValidator"> <error-message>Invalid Port Number</error-message> </validator> </input> </property> </property-group> </property-file> <property-file file="/atg/dynamo/service/ClientLockManager.properties"> <property-group id="base"> <property name="lockServerAddress"> <value>localhost</value> </property> <property name="lockServerPort" persist- key="managementServerLockManagerPort"/> <property name="useLockServer"> <value>true</value> </property> </property-group> </property-file>
Using Dynamic Values in Properties Files
You can specify dynamic values in a product.xml file, allowing product-specific selections when the product is
being configured. This is similar to the dynamic values used in steps (see Using Dynamic Values in Steps (page
15) in the Creating CIM Plugins (page 7) chapter).
The following options are available for dynamic values in product.xml files:
• Property name—Access a property of a particular server instance or server instance type. The syntax for a
server instance is:
${ServerInstance[SERVER_INSTANCE_ID].PROPERTY_NAME}
SERVER_INSTANCE_ID is the ID of the server instance.
PROPERTY_NAME is a property of that server instance (see the Property Files (page 38) section).
42 5 Using Product Definition Files
The syntax for a server instance type is similar, but uses the instance type ID instead of the individual instance
ID:
${ServerInstanceType[ServerInstanceTypeID].Property_Name}
• Server instance name—Access the name of the server instance, which is the name of the
individual server directory in the <ATG10dir>/home/servers directory. You might think to use
${ServerInstance[ID].name} to retrieve this, but there can be multiple server instances associated with
an ID. The syntax is:
${ServerInstanceName}
ServerInstanceName is replaced with the name of the server instance that is currently being processed.
This is the only property that changes between instances; use ${ServerInstance[ID].Prop} for all other
properties.
• Application server—Access a property of the selected application server. The syntax is:
${AppServerSelection.PROPERTY_NAME}
PROPERTY_NAME is a property of the AppServerSelection object. For example,
${AppServerSelection.type} returns the currently selected application server type. The available
properties are:
• appServerType—The application server, such as JBoss or WebSphere.
• drpPort—Recommended default port for the selected app server, not the currently configured port.
• httpPort—Recommended default port for the selected app server, not the currently configured port.
• httpsPort—Recommended default port for the selected app server, not the currently configured port.
• rmiPort—Recommended default port for the selected app server, not the currently configured port.
• Datasource name and property—Access a datasource property. The syntax is:
${NamedDatasource[DATASOURCE_ID].PROPERTY_NAME}
PROPERTY_NAME is a property of that datasource.
A PROPERTY_NAME can also specify sub properties. For example,
${NamedDatasource[nonswitchingCore].datasourceValue.jndiName} returns the JNDI Name from the
datasourceValue property of the non-switching datasource.
Product Add-Ons
Add-ons represent additional Oracle ATG Web Commerce products or features that are available separately from
products, but which can be used to add functionality. For example:
<product-addon id="reporting" >
<title resource-key="">Reporting</title> <modify-server-instance id="basic_management"> <add-appassembler-option name="layer" value="Staging"/> <remove-appassembler-option name="layer"/> </modify-server-instance> <prepend-module-list>SearchAdmin.DataWarehouse</prepend-module-list> </product-addon>
Product add-ons can be defined as groups for selection purposes. For instance, the Switching Datasource and
NonSwitching Datasource add-ons are mutually exclusive. They are defined as belonging to a product-addon-
group that allows only one to be selected, using the max-occurs attribute.
<product-addon-group id="datasource_group" min-occurs="1" max-occurs="1"> <title>Choose switching or non-switching datasource :</title> <product-id-required id="product_id"/> <requires-product-addon id="product_addon_id"/>
<product-addon id="switchingdatasource" > <title resource-key="">Switching Datasource</title> <modify-server-instance-type id="management"> <add-named-datasource>switchingA</add-named-datasource> <add-named-datasource>switchingB</add-named-datasource> </modify-server-instance-type> <modify-server-instance-type id="production"> <add-named-datasource>switchingA</add-named-datasource> <add-named-datasource>switchingB</add-named-datasource> </modify-server-instance-type> </product-addon <product-addon id="nonswitchingdatasource" > <title resource-key="">Non-Switching Datasource</title> <modify-server-instance-type id="management"> <add-named-datasource>nonswitching</add-named-datasource> </modify-server-instance-type> <modify-server-instance-type id="production"> <add-named-datasource>nonswitching</add-named-datasource> </modify-server-instance-type> </product-addon> </product-addon-group
You can use the product-id-required and requires-product-addon elements in the product-addon-
group to specify other products or add-ons that must be present if the add-on group is selected. If you specify
one or more product-id-required products, the add-on-group is only displayed if the user selects all of
those products. If you specify one or more add-ons in the requires-product-addon element, the add-on
group is only displayed if the required add-on group has been selected. In such a case, the order of the groups is
important.
Add-On Combinations
In addition to individual products, you can define combinations as add-ons in the product.xml, then define
changes based on the selection of one or more add-ons. This example shows the combination of Search with
reporting, and adds modules to the data warehouse and loader.
<product-addon-combo id="search-reporting"> <combo-product-addon id="search"/> <combo-product-addon id="reporting"/>
44 5 Using Product Definition Files
<modify-server-instance-type id="datawarehouse_loader"> <append-module name="ARF.DW.Search"/> <append-module name="SearchAdmin.datawarehouse"/> </modify-server-instance-type> <modify-server-instance-type id="datawarehouse"> <append-module name="ARF.DW.Search"/> </modify-server-instance-type> </product-addon-combo>
Modifying Server Instance Types
An add-on might mean that additional modules are required in the EAR, that an additional data source is
needed, or that an entirely different server type can be used; for example, if you add reporting to any Oracle ATG
Web Commerce production combination, a data source is required for the data warehouse, and all potential
server types require additional modules. Use the <modify-server-instance-type> element to specify these
changes:
<modify-server-instance-type id="management"> <prepend-module>ARF.Base</prepend-module <add-named-datasource>datawarehouse</add-named-datasource> </modify-server-instance-type>
<modify-server-instance-type id="production"> <prepend-module>ARF.Base</prepend-module <add-named-datasource>datawarehouse</add-named-datasource> </modify-server-instance-type>
</product-addon
<prepend-module> <append-module> <remove-module> <add-named-datasource> <remove-named-datasource> <add-server-instance>
<prepend-module name="DAS"/>
The append-module element can optionally include a before attribute. For example, the following XML adds
the DSS module before the DAS module, if DAS is found:
<append-module name="DSS" before="DAS"/>
The datasource elements have the following format:
5 Using Product Definition Files 45
<add-named-datasource id="production"/>
<add-server-instance id="reporting"/>
The server instance added must be defined just like any other instance.
To remove a server instance, use the syntax:
<remove-server-instance id="reporting"/>
Named Datasources
Named datasources represent database connections used by Oracle ATG Web Commerce applications.
The modulelist-server-instance attribute identifies a server-instance-type, which in turn supplies a
list of modules. The dbinit.xml files for each of those modules are then used to generate the SQL and import
scripts that run for the database.
You can declare named datasources in the product.xml file for configuration by end-users.
<named-datasource id="management" modulelist-server-instance- type="management"> <title resource-key="">Publishing</title> <jndi>atgpub_ds</jndi> </named-datasource>
In order for a named datasource to be used, it must be included in a server-instance-type that has at least one
server instance. Each server-instance of that type will have the named datasource’s JNDI registered with the
application server.
Default EAR Name
You can use the product configuration file to provide a default name for the EAR file used for deploying a given
product configuration. The element is a child of server-instance-type. For example:
<server-instance> <ear-file-name>MyATGApp.ear</ear-file-name> </server-instance>
46 5 Using Product Definition Files
DB Init Scripts
The DB init scripts initialize the database for products being configured, creating schemas and
importing initial data required for some Oracle ATG Web Commerce products. Scripts are declared in the
<ATG10dir>/modul

Recommended