Contributing your own mediation primitive plug-in

You can develop your own mediation primitives, and contribute them to the Mediation Flow editor palette. Integration developers can then use these mediation primitives in the same way that you use the supplied mediation primitives, for example Message Filter.

The following topics briefly describe the actions that you have to perform in order to develop your own mediation primitive, contribute the primitive to the Mediation Flow Editor's palette, and deploy the primitives. We then use an example to show the steps required, and provide links to reference documentation.

Note: These steps may change in future releases, and effort may be required to re-enable your contributions for future releases.

Create a plug-in

Create a plug-in for your primitives in the eclipse plug-in development environment (PDE), with these definitions:
  1. Create a plug-in project
  2. Create these extensions in the plugin.xml:
    • com.ibm.wbit.sib.mediation.primitives.registry.mediationPrimitiveHandlers - defines the terminals of your primitive, and identifies the properties file where the primitive's properties are defined, and the .mednode file that you will generate in topic "Generate the mediation metadata".
    • com.ibm.wbit.sib.mediation.primitives.registry.mediationPrimitiveUIContribution - builds on medationPrimitiveHandler and adds information to contribute the medationPrimitiveHandler to the Mediation Flow editor's palette.
    Notes®:
    • The typeName and typeNamespace of the medationPrimitiveHandler and the mediationPrimitiveUIContribution must be the same in order to allow the the mediationPrimitiveUIContribution to be associated with the medationPrimitiveHandler .
    • The typeNamespace must begin with mednode://mednodes, and end with FileName.mednode. A file of this name will be created when we generate the mediation metadata.
  3. Create a property group XML file, and define the mediation primitive's properties in the XML file. For your reference, the schema for this file is attached in the References section at the bottom of this document.

Generate the mediation metadata

Generate the mediation metadata (.mednode file) for the mediation primitive using the Mediation Metadata Generation view. The .mednode file contains the runtime representation of the mediationPrimitiveHandlers and must be placed at the root of the Java™ project that you create in Step 3.

Author Java code

Create a Java project, and write the code to implement your mediation primitive.

  1. Create a Java project
  2. Add library WebSphere® ESB Server v6.0 to the project's build path.
  3. Copy the .mednode file from the plug-in project to the root of the Java project.
  4. Create a Java class that extends com.ibm.wsspi.sibx.mediation.esb.ESBMediationPrimitive, and define a getter and a setter method for each property defined in the property group file.

    Note: the getter and setter method names must correspond to the property names. For example, if a property name is value, the getter and setter methods must be named getValue() and setValue().

  5. Write your Java implementation code for the mediation primitive in the inherited mediate() method. The mediate method takes an InputTerminal and a DataObject. Use the InputTerminal only if you have multiple input terminals. The DataObject is your message. You can use the getters and setters in the DataObject interface to read and write the values in your messages, identified via an XPath expression. DataObject is part of the Service Data Object (SDO) emerging standard. This message parameter can also be cast to a ServiceMessageObject in the com.ibm.websphere.sibx.smobo package, part of the Service Message Object APIs. This interface is useful for accessing individual sections of the service message object, such as the body, context and headers. The example here will show you how to fire a message to an output terminal.DataObject See the Reference section at the bottom of this document for links to the Service Data Object and Service Message Object APIs.

Deploy the plug-in

Deploy your plug-in so that your mediation primitives appear in the Mediation Flow Editor palette:

  1. Set build properties for your plug-in project. Make sure the Binary Build properties include the mednodes, propertygroups and icons folders.
  2. Import your primitive's icons into the plug-in project.
  3. Export the plug-in project as Deployable plug-ins and fragments option to the directory WIDInstallDir\wstools\eclipse
  4. Shut down WebSphere Integration Developer.
  5. Restart WebSphere Integration Developer using the –clean option.
  6. Open a mediation flow component in the Mediation Flow Editor. Your primitive's icon should appear in the palette.
  7. Drag your primitive's icon on to the editor's canvas, and view the properties in the Properties view.

Deploy the primitives to the runtime

To deploy your mediation primitives to the WebSphere Enterprise Service Bus or WebSphere Process Server runtime:

  1. Export the Java project as a jar, for example myPrimitives.jar. In the root folder, select .mednode only, but keep the Java class selected.

    Note: the .mednode files must be within the root of the deployed jar, not in a subdirectory.

  2. Select directory WAS_HOME/lib/ext where the WebSphere runtime can access the classes at the right class loader scope.

Example

Create a plug-in project

  1. Open the PDE perspective from Window > Open Perspective > Other... and choose Plug-in Development from the offered list. If you do not see the PDE, check the Show all option.
  2. Create a plug-in project from File > New > Plug-in Project.
  3. Enter com.ibm.websphere.esb.mediation.example.contribution as the project name. Keep the default options, and Click Next
  4. Uncheck the option to generate a Java class and click Finish.

Edit plugin.xml

Open plugin.xml in the Plug-in Manifest editor, and switch to the Extensions page.

  1. Click Add. In the New Extension wizard, uncheck Show only extension points from required plug-ins to view the list of plug-ins.
  2. Select com.ibm.wbit.sib.mediation.primitives.registry.mediationPrimitiveHandlers . Click Finish. An entry appears in the All Extensions list.
  3. Right-click com.ibm.wbit.sib.mediation.primitives.registry.mediationPrimitiveHandlers and select New > medationPrimitiveHandler
  4. A medationPrimitiveHandler is added for the extension.
  5. Select the handler and set its properties as shown below:



    Note: the namespace must begin with mednode://mednodes.
  6. Add short and long description and terminal categories for the handler by selecting it, right-click > New....
  7. Select the short description and click on Body Text at the bottom of the Extensions page. Enter a short description for the primitive - "Converts a value to the selected currency". Click Add. Similarly, add text for the long description - "This primitive converts a value from the input message into the currency that is selected from a pre-defined list of currencies."
  8. Select each terminal and in the Details section on the right, set its type ( input, output and fail in this example). Enter a name for each terminal (in, out and fail in this example). Note that the fail terminal must be named fail.



  9. Add another extension com.ibm.wbit.sib.mediation.primitives.registry.mediationPrimitiveUIContribution
  10. Right-click com.ibm.wbit.sib.mediation.primitives.registry.mediationPrimitiveUIContribution and select New > medationPrimitiveUIContribution
  11. Set the properties of medationPrimitiveUIContribution as shown below, and save:

Create required folders in plug-in the project

  1. Create a folder named icons in the plug-in project, and place your icons in it. The small icon (16x16) will appear on the palette. The large icon (32 x 32) will appear on the canvas.
  2. Create a folder named propertygroups in the plug-in contribution project, and create a property group XML file in this folder from File > New > Other > XML. > XML. Click Next. Choose to create an XML file from scratch. Click Next. Name the file CurrencyConverterPropertyGroup.xml and click Finish.

Add properties to the XML file

In CurrencyConverterPropertyGroup.xml , we will describe the properties of this new primitive, so as to derive the UI for the properties view Details page in the Mediation Flow editor. The Java class must have getter and setter methods that correspond to each of these properties. For more information, see Elements of the properties xml file and Property group schema definition file.

Add the required properties to CurrencyConverterPropertyGroup.xml by entering the following XML code:
<pg:BasePropertyGroups name="CacheReaderPropertyGroups" resourceBundle="ESBMediationExamples" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pg="http://www.ibm.com/propertygroup/6.0.1">

	<propertyGroup name="CurrencyConverterPropertyGroup" xsi:type="pg:BasePropertyGroup" >
	
	<!-- currency path using XPathProperty -->
		<property name="currencyPath" displayName="Currency Path" defaultValue="/body" required="true" propertyType="String" id="com.ibm.propertygroup.ext.ui.XPathProperty" xsi:type="pg:ConstraintSingleValuedProperty">
			<description>
				An XPath expression to the input currency value.
			</description>
		</property>
	
	<property name="currencyRatesTable" displayName="Currency Rates" xsi:type="pg:TableProperty">
			<description>
				Currency rates 
			</description>
			<qualifier preferredHeight="100" xsi:type="pg:TableLayoutQualifier">
				<column name="currency" preferredWidth="300" xsi:type="pg:TableColumnQualifier"/>
				<column name="currencyRate" preferredWidth="200" xsi:type="pg:TableColumnQualifier"/>
			</qualifier>
			<column name="currency" validValuesEditable="false" required="true" displayName="Currency"  xsi:type="pg:ConstraintSingleValuedProperty">
									
				<description>
					List of currencies
				</description>
				<validValue value="USD" displayValue="United States Dollars(USD)"/>
			<validValue value="CAD" displayValue="Canadian Dollars(CAD)"/>
			<validValue value="EUR" displayValue="Euro(EUR)"/>
			<validValue value="JPY" displayValue="Japanese Yen(JPY)"/>
			<validValue value="CNY" displayValue="Chinese Yuan(CNY)"/>		
				
			</column>
			<column name="currencyRate" required="true" validValuesEditable="false" displayName="Rate"  propertyType="float"  xsi:type="pg:ConstraintSingleValuedProperty">
			<qualifier name="promotable" xsi:type="pg:PropertyClassificationQualifier" />
				<description>
				Exchange rate
				</description>
			</column>
			
		</property>
	</propertyGroup>
	
</pg:BasePropertyGroups>

Generate metadata

Launch the runtime workbench from the PDE:
  1. From the menu, select Run > Run As > Run-time Workbench. If necessary, create a new configuration by selecting Run-time Workbench and clicking New. Accept the defaults. Click Run.
  2. In the new IDE that is launched, click Window > Show view > Other > Mediation Development > Mediation Metadata Generation.
  3. The mediation primitives that you created are displayed here. Use this view to generate a .mednode file for your primitive. Select the primitives that you want and click Generate. A status of OK indicates that the .mednode file was successfully generated.
  4. A file named CurrencyConverter.mednode is created in the plug-in project's mednodes folder. You may need to refresh your view to see this file.

Author the Java Code

  1. Create a Java project from File > New > Project > Java Project. Click Next. Enter the project name, com.ibm.websphere.esb.mediation.example.logic, and click Next.
  2. Switch to the Libraries page, and click Add library. Select WebSphere ESB Server v6.0 and click Next. Check the option to configure WebSphere ESB Server's classpath. Click Finish.
  3. Copy CurrencyConverter.mednode from the plug-in project to the root of the Java project.
  4. Switch to the Java perspective. Select the Java project and click File > New > Class. Enter com.ibm.websphere.esb.mediation.example.logic as package name and CurrencyConverterMediation as class name. Click Finish. Copy this code into CurrencyConverterMediation:
    package com.ibm.websphere.esb.mediation.example.logic;
    
    import com.ibm.wsspi.sibx.mediation.InputTerminal;
    import com.ibm.wsspi.sibx.mediation.MediationBusinessException;
    import com.ibm.wsspi.sibx.mediation.MediationConfigurationException;
    import com.ibm.wsspi.sibx.mediation.OutputTerminal;
    import com.ibm.wsspi.sibx.mediation.esb.ESBMediationPrimitive;
    import commonj.sdo.DataObject;
    
    /**
     * This mediation converts from one currency value to another currency value.
     */
    public class CurrencyConverterMediation extends ESBMediationPrimitive {
    
     private static final String OUTPUT_TERMINAL_NAME = "out";
    
     private String currencyPath;
    
     private CurrencyRate[] currencyRatesTable;
     
     /**
      * Default constructor.
      */
     public CurrencyConverterMediation() {
      super();
     }
    
     /**
      * @return Returns the currencyPath.
      */
     public String getCurrencyPath() {
      return currencyPath;
     }
    
     /**
      * @param currencyPath
      *            The currencyPath to set.
      */
     public void setCurrencyPath(String currencyPath) {
      this.currencyPath = currencyPath;  
     }
     
     /**
      * @return Returns the currencyRates.
      */
     public CurrencyRate[] getCurrencyRatesTable() {
      return this.currencyRatesTable;
     }
     
     /**
      * @param currencyRates The currencyRates to set.
      */
     public void setCurrencyRatesTable(CurrencyRate[] currencyRates) {
      this.currencyRatesTable = currencyRates;
     }
    
     /*
      * (non-Javadoc)
      * 
      * @see com.ibm.wsspi.sibx.mediation.Mediation#mediate(com.ibm.wsspi.sibx.mediation.InputTerminal,
      *      commonj.sdo.DataObject)
      */
     public void mediate(InputTerminal inputTerminal, DataObject message)
       throws MediationConfigurationException, MediationBusinessException {
    
      // retrieves the input currency value
      float inputCurrencyValue = message.getFloat(getCurrencyPath());
    
      if (getCurrencyRatesTable() != null && getCurrencyRatesTable().length > 0) {
       
       // we only use the first available currency rate
       float currencyRate = getCurrencyRatesTable()[0].getCurrencyRate();
       
       // converts to the new currency value
       float newCurrencyValue = inputCurrencyValue * currencyRate;
       
       // update the new currency value to the message
       message.setFloat(getCurrencyPath(), newCurrencyValue);
      }
    
      // gets the out terminal from the mediation services
      OutputTerminal outTerminal = getMediationServices().getOutputTerminal(
        OUTPUT_TERMINAL_NAME);
    
      if (outTerminal != null) {
       // fires the message to the out terminal
       outTerminal.fire(message);
      }
     }
    
    }
  5. Create another class in the Java project. Enter com.ibm.websphere.esb.mediation.example.logic as package name and CurrencyRate as class name. Click Finish. Copy this code into CurrencyRate:
    package com.ibm.websphere.esb.mediation.example.logic;
    
    /**
     * Data object for currency rates table property.
     */
    public class CurrencyRate {
    
     private String currency;
    
     private float currencyRate;
     
     /**
      * 
      */
     public CurrencyRate() {
      super();
     }
    
     /**
      * @return Returns the currency.
      */
     public String getCurrency() {
      return currency;
     }
    
     /**
      * @param currencyPath
      *            The currency to set.
      */
     public void setCurrency(String currency) {
      this.currency = currency;  
     }
     /**
      * @return Returns the currencyRate.
      */
     public float getCurrencyRate() {
      return currencyRate;
     }
    
     /**
      * @param currencyRate
      *            The currencyRate to set.
      */
     public void setCurrencyRate(float currencyRate) {
      this.currencyRate = currencyRate;
     }
    }
Deploy the plug-in
  1. Open the plug-in project's build.properties file in the Build Properties Editor, and make sure that the mednodes and propertygroups folders are selected under Binary Build.
  2. Export the project as Deployable plug-ins and fragments. Select to export as a directory structure and specify the destination directory WIDInstall\wstools\eclipse.
  3. Deploy the Java project to the UTE by exporting it as a jar to WIDInstall\runtimes\bi-v6\lib\ext, if you intend to test your primitive in a mediation flow.
  4. Shutdown WebSphere Integration Developer and start it using the -clean option.
  5. Open a mediation flow component in the Mediation Flow editor. The CurrencyConverter mediation primitive's icon should appear in the palette CurrencyConverter icon
  6. Drag your primitive's icon on to the editor's canvas, and view the properties in the Properties view. Properties view of CurrencyConverter

Deploy to the runtime

Export the Java project as a jar, for example myPrimitives.jar. In the root folder, select .mednode only, but keep the Java class selected. Export the jar to WAS_HOME/lib/ext.

References

For information on the following APIs, see the Reference section in the WebSphere Integration Developer 6.0.1 information:
  • Service Message Object (SMO) APIs
  • Mediation Engine SPIs
  • Mediation Flow Action SPIs
  • Mediation Context Store SPIs

For information on Service Data Object APIs, see http://download.eclipse.org/tools/emf/sdo/javadoc/

Elements of the properties xml file

You must create a properties definition XML file to define the properties of your mediation primitive. This XML file must conform to the schema defined in propertygroup.xsd in the directory <Widinstall>\wstools\eclipse\plugins\com.ibm.propertygroup.ext.model/src/model. The following are the typical steps to author the properties definition XML file.
  1. Defining propertyGroups:
    Each properties definition XML file must contain one and only one propertyGroups element that contains a sequence of zero or more propertyGroup elements.
    <pg:BasePropertyGroups name="myGroups" resourceBundle="mypacakage.myProperties"> 
    Table 1. Attributes of propertyGroups
    Attribute Description
    name Name of the property group. This name will not be displayed in the Mediation Flow Editor.
    resourceBundle The resource bundle that will be loaded to interpret a string value. This is used for globalization.
  2. Defining propertyGroups elements
    Each propertyGroup element is represented as a horizontal tab page within the Details page of the Properties view. Each propertyGroup may contain multiple properties. A property can be a standard property or a custom property.
    <propertyGroup name="myGroup" xsi:type="pg:BasePropertyGroup">
    Table 2. Attributes of propertyGroup
    Attribute Description
    name Name of the property group. If there is more than one propertyGroup, each propertyGroup element is rendered as tab page in the Details page. The name attribute becomes the name of the tab page.
  3. Defining simple standard properties
    The following standard properties have been pre-defined in the propertygroups schema definition. Both properties have the same attributes.
    Table 3. Standard properties and their attributes
    Property Attribute Description
    1. ConstraintSingleValuedProperty - A single-valued property with various user input validation rules
    2. ConstraintMultiValuedProperty - Multi-valued property. All values share the same type
    name / displayName Name is the identifier of a property. DisplayName is used as a label preceding the property input control.
    description Displayed as tooltip text
    propertyType Defines the value type (String / Boolean / Float / Integer)
    defaultValue The default value of the property
    hidden Defines whether the property is hidden or shown
    readOnly Defines whether the property is read only
    required Indicates that the property requires a value
    sensitive If value type is String, this attribute determines whether it is case sensitive
    validValuesEditable Defines whether a user is allowed to enter a value which is different from values defined by validValues
    validValues A list of valid values
    pattern (optional) If the value type is String, the editor will do a pattern match to validate user input
    maxLength (optional) If the value type is String, the editor will limit the size that user can input
    minValue / maxValue (optional) If the value type is Integer or Float, the editor will perform a range check on user input.
    validValueGeneratorClass Points to a class which is responsible for dynamically generating valid values.. The class must implement the interface com.ibm.propertygroup.ext.api .IValidValuesGenerator
  4. Defining a table property
    Each table property can consist of multiple columns, each of which is a single-valued property, such as ConstraintSingleValuedProperty.
    <property name="filters" displayName="%displayname" xsi:type="pg:TableProperty"> 
    		<column name="pattern" required="true" .../> 	
    		<column name="terminalName" required="true" .../>
     </property>
  5. Defining a custom property
    The implementation class must implement com.ibm.propertygroup.ext.ICustomProperty
    <property name="myCustomProperty" class="MyCustomImpl" xsi:type="pg:CustomProperty">
  6. Adding qualifiers to properties
    The property model described above is neutral to any UI rendering mechanism or processing infrastructure. However, in certain scenarios, some UI or runtime dependent information must be presented. For example, you may want to define the table layout for a table property. Or you may want to instruct the runtime to perform special handling when processing certain properties. A qualifier is introduced to serve this purpose. You may attach as many qualifiers to a property as you want, provided they are valid for the UI and the runtime. For example, you may attach a TableLayoutQualifier to a TableProperty.
    <property name="filters" xsi:type="pg:TableProperty"> 	
    		<qualifier preferredHeight="100" xsi:type="pg:TableLayoutQualifier"> 		
    				<column name="pattern" preferredWidth="100" xsi:type="pg:TableColumnQualifier"/> 		
    				<column name="terminalName" preferredWidth="200" xsi:type="pg:TableColumnQualifier"/> 	
    </qualifier> 
    ... 
    </property> 
  7. Adding the properties promotion qualifier
    If you want to designate the property to be promotable, which means the property's value can be changed at runtime, add this qualifier:
    <qualifier name="promotable" xsi:type="pg:PropertyClassificationQualifier" />

Property group schema definition file

The property group schema definition file named propertygroup.xsd shown below is in the directory Widinstall\eclipse\plugins\com.ibm.propertygroup.ext.model/src/model.
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:propertygroup="http://www.ibm.com/propertygroup/6.0.1" targetNamespace="http://www.ibm.com/propertygroup/6.0.1">
	
	<element name="propertyGroups" type="propertygroup:BasePropertyGroups"/>
	<element name="description" type="string"/>
	
	<complexType name="PersistentFormatter">
	</complexType>
	
	<complexType name="StringFormatter">
		<complexContent>
			<extension base="propertygroup:PersistentFormatter">
				<attribute name="escapeCharacter" type="token" use="optional"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="StringListFormatter">
		<complexContent>
			<extension base="propertygroup:StringFormatter">
				<attribute name="separator" type="token" use="optional"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="StringTableFormatter">
		<complexContent>
			<extension base="propertygroup:StringFormatter">
				<attribute name="rowSeparator" type="token" use="optional"/>
				<attribute name="columnSeparator" type="token" use="optional"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="Qualifier">
	</complexType>
	
	<complexType name="TableColumnQualifier">
		<complexContent>
			<extension base="propertygroup:Qualifier">
				<attribute name="name" type="token" use="required"/>
				<attribute name="preferredWidth" type="token" use="required"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="TableLayoutQualifier">
		<complexContent>
			<extension base="propertygroup:Qualifier">
				<choice>
					<element maxOccurs="unbounded" minOccurs="0" name="column" type="propertygroup:TableColumnQualifier"/>
				</choice>
				<attribute name="preferredHeight" type="token" use="required"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="PropertyClassificationQualifier">
		<complexContent>
			<extension base="propertygroup:Qualifier">
				<attribute name="name" type="token" use="required"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="PropertyDescriptor">
		<choice>
			<element ref="propertygroup:description" minOccurs="0"/>
			<element name="persistentFormatter" type="propertygroup:PersistentFormatter" minOccurs="0"/>
			<element maxOccurs="unbounded" minOccurs="0" name="qualifier" type="propertygroup:Qualifier"/>
		</choice>
		<attribute name="id" type="token" use="optional"/>
		<attribute name="name" type="token" use="required"/>
		<attribute name="displayName" type="token" use="optional"/>
	</complexType>
	
	<complexType name="BasePropertyDescriptor">
		<complexContent>
			<extension base="propertygroup:PropertyDescriptor">
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="BaseProperty">
		<complexContent>
			<extension base="propertygroup:BasePropertyDescriptor">
				<attribute name="validationMessage" type="token" use="optional"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="BaseNodeProperty">
		<complexContent>
			<extension base="propertygroup:BaseProperty">
				<sequence>
					<element maxOccurs="0" minOccurs="0" name="children" type="propertygroup:BaseNodeProperty"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="ValidValue">
		<sequence>
			<element ref="propertygroup:description" minOccurs="0"/>
		</sequence>
		<attribute name="displayValue" type="token" use="optional"/>
		<attribute name="value" type="token" use="required"/>
	</complexType>
	
	<complexType name="BaseSingleTypedProperty">
		<complexContent>
			<extension base="propertygroup:BaseProperty">
				<sequence>
					<element maxOccurs="unbounded" minOccurs="0" name="validValue" type="propertygroup:ValidValue"/>
				</sequence>
				<attribute name="defaultValue" type="token" use="optional"/>
				<attribute name="propertyType" type="token" use="required"/>
				<attribute name="expert" type="boolean" use="optional"/>
				<attribute name="hidden" type="boolean" use="optional"/>
				<attribute name="readOnly" type="boolean" use="optional"/>
				<attribute name="required" type="boolean" use="optional"/>
				<attribute name="sensitive" type="boolean" use="optional"/>
				<attribute name="validValuesEditable" type="boolean" use="optional"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="BaseMultiValuedProperty">
		<complexContent>
			<extension base="propertygroup:BaseSingleTypedProperty">
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="BaseBoundedMultiValuedProperty">
		<complexContent>
			<extension base="propertygroup:BaseMultiValuedProperty">
				<attribute name="boundedSize" type="token" use="optional"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="File">
		<attribute name="extension" type="token" use="optional"/>
		<attribute name="pattern" type="token" use="optional"/>
	</complexType>
	
	<complexType name="MultiFileProperty">
		<complexContent>
			<extension base="propertygroup:BaseMultiValuedProperty">
				<sequence>
					<element maxOccurs="unbounded" minOccurs="0" name="fileExtension" type="propertygroup:File"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="MultiFolderProperty">
		<complexContent>
			<extension base="propertygroup:BaseMultiValuedProperty">
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="ConstraintMultiValuedProperty">
		<complexContent>
			<extension base="propertygroup:BaseBoundedMultiValuedProperty">
				<attribute name="pattern" type="token" use="optional"/>
				<attribute name="minValue" type="integer" use="optional"/>
				<attribute name="maxValue" type="integer" use="optional"/>
				<attribute name="maxLength" type="integer" use="optional"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="BaseSingleValuedProperty">
		<complexContent>
			<extension base="propertygroup:BaseSingleTypedProperty">
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="FileProperty">
		<complexContent>
			<extension base="propertygroup:BaseSingleValuedProperty">
				<sequence>
					<element maxOccurs="unbounded" minOccurs="0" name="fileExtension" type="propertygroup:File"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="FolderProperty">
		<complexContent>
			<extension base="propertygroup:BaseSingleValuedProperty">
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="ConstraintSingleValuedProperty">
		<complexContent>
			<extension base="propertygroup:BaseSingleValuedProperty">
				<attribute name="pattern" type="token" use="optional"/>
				<attribute name="minValue" type="integer" use="optional"/>
				<attribute name="maxValue" type="integer" use="optional"/>
				<attribute name="maxLength" type="integer" use="optional"/>
				<attribute name="validValuesGeneratorClass" type="token" use="optional"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="PropertyGroup">
		<complexContent>
			<extension base="propertygroup:BaseProperty">
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="BasePropertyGroup">
		<complexContent>
			<extension base="propertygroup:PropertyGroup">
				<sequence>
					<element maxOccurs="unbounded" minOccurs="0" name="property" type="propertygroup:PropertyDescriptor"/>
					<element maxOccurs="unbounded" minOccurs="0" name="customProperty" type="propertygroup:CustomProperty"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="CustomPropertyGroup">
		<complexContent>
			<extension base="propertygroup:PropertyGroup">
				<attribute name="class" type="token" use="optional"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="BasePropertyGroups">
		<complexContent>
			<extension base="propertygroup:BaseProperty">
				<sequence>
					<element maxOccurs="unbounded" minOccurs="0" name="propertyGroup" type="propertygroup:PropertyGroup"/>
				</sequence>
				<attribute name="resourceBundle" type="token" use="optional"/>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="BaseTreeProperty">
		<complexContent>
			<extension base="propertygroup:BaseProperty">
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="TableProperty">
		<complexContent>
			<extension base="propertygroup:PropertyDescriptor">
				<sequence>
					<element maxOccurs="unbounded" minOccurs="0" name="column" type="propertygroup:BaseSingleTypedProperty"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="TreeProperty">
		<complexContent>
			<extension base="propertygroup:PropertyDescriptor">
				<sequence>
					<element maxOccurs="1" minOccurs="0" name="root" type="propertygroup:BaseNodeProperty"/>
				</sequence>
			</extension>
		</complexContent>
	</complexType>
	
	<complexType name="CustomProperty">
		<attribute name="class" type="token" use="required"/>
	</complexType>
	
</schema>
   
Related concepts
Mediation services overview
Mediation Flow editor
Related tasks
Creating a mediation flow
Opening the Mediation Flow editor
Building mediation flows
Emitting common base events
Creating mappings for the XSL Transformation primitive
Selecting endpoints dynamically
Implementing custom mediation logic
Storing and using properties in the message context
Changing the value of mediation flow properties at runtime
Testing and debugging mediation modules
Related reference
Error handling in the mediation flow
Considerations when refactoring mediation flow artifacts

Related information

Tutorial: Create a mediation flow
Samples: Mediation Flow editor

Feedback
(C) Copyright IBM Corporation 2005, 2006. All Rights Reserved.