É possível desenvolver suas próprias primitivas de mediação e inseri-las na paleta do editor de Fluxo de Mediação. Em seguida, os desenvolvedores de integração podem usar essas primitivas de mediação da mesma forma que as primitivas de mediação fornecidas, por exemplo, Filtro de Mensagens.
Os tópicos a seguir descrevem brevemente as ações que você precisa executar para desenvolver sua própria primitiva de mediação, incluir a primitiva na paleta do Editor de Fluxo de Mediação e implementar as primitivas. Em seguida, usamos um exemplo para mostrar as etapas necessárias e fornecemos links para documentação de referência.
Nota: Estas etapas podem ser alteradas em releases futuros e poderá ser necessário algum esforço para reativar suas contribuições em releases futuros.
Gere os metadados de mediação (arquivo .mednode) para a primitiva de mediação usando a visualização Geração de Metadados de Mediação. O arquivo .mednode contém a representação do tempo de execução dos mediationPrimitiveHandlers e deve ser colocado na raiz do projeto Java criado na Etapa 3.
Crie um projeto Java e escreva o código para implementar sua primitiva de mediação.
Nota: os nomes dos métodos getter e setter devem corresponder aos nomes das propriedades. Por exemplo, se um nome de propriedade for value, os métodos getter e setter devem ser denominados getValue() e setValue().
Implemente o plug-in para que suas primitivas de mediação apareçam na paleta do Editor de Fluxo de Mediação:
Para implementar suas primitivas de mediação no tempo de execução do WebSphere Enterprise Service Bus ou do WebSphere Process Server:
Nota: os arquivos .mednode devem estar dentro da raiz do jar implementado, não em um subdiretório.
Crie um projeto de plug-in
Edite o plugin.xml
Abra o plugin.xml no editor de Manifesto de Plug-in e alterne para a página Extensões.
Crie as pastas necessárias no projeto do plug-in
Inclua propriedades no arquivo XML
No CurrencyConverterPropertyGroup.xml descreveremos as propriedades dessa nova primitiva, de forma a derivar a UI para a página Detalhes da visualização de propriedades no Editor de Fluxo de Mediação. A classe Java deve ter métodos getter e setter que correspondam a cada uma dessas propriedades. Para obter informações adicionais, consulte Elementos do Arquivo XML de Propriedades e Arquivo de Definição do Esquema do Grupo de Propriedades.
<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" > <!-- caminho de moeda usando XPathProperty --> <property name="currencyPath" displayName="Currency Path" defaultValue="/body" required="true" propertyType="String" id="com.ibm.propertygroup.ext.ui.XPathProperty" xsi:type="pg:ConstraintSingleValuedProperty"> <descrição> Uma expressão XPath para o valor da moeda de entrada. </description> </property> <!-- taxa da moeda usando Combo box --> <property name="currencyRate" displayName="Currency" required="true" defaultValue="1.0" propertyType="float" xsi:type="pg:ConstraintSingleValuedProperty"> <descrição> A taxa usada para converter o valor da moeda de entrada. </description> <validValue value="1.0" displayValue="USD"/> <validValue value="1.15091" displayValue="CAD"/> <validValue value="0.836371" displayValue="EUR"/> <validValue value="119.895" displayValue="JPY"/> <validValue value="8.07560" displayValue="CNY"/> </property> </propertyGroup> </pg:BasePropertyGroups>
Gerar Metadados
Criar o Código Java
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; /** * Esta mediação converte um valor de moeda em outro valor de moeda. */ public class CurrencyConverterMediation extends ESBMediationPrimitive { private static final String OUTPUT_TERMINAL_NAME = "out"; private String currencyPath; private float currencyRate; /** * Construtor padrão. */ public CurrencyConverterMediation() { super(); } /** * @return Retorna o currencyPath. */ public String getCurrencyPath() { return currencyPath; } /** * @param currencyPath * O currencyPath a ser configurado. */ public void setCurrencyPath(String currencyPath) { this.currencyPath = currencyPath; } /** * @return retorna a currencyRate. */ public float getCurrencyRate() { return currencyRate; } /** * @param currencyRate * A currencyRate a ser configurada. */ public void setCurrencyRate(float currencyRate) { this.currencyRate = currencyRate; } /* * (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 { // recupera o valor da moeda de entrada float inputCurrencyValue = message.getFloat(getCurrencyPath()); // converte no valor da nova moeda float newCurrencyValue = inputCurrencyValue * getCurrencyRate(); // atualiza o valor da nova moeda para a mensagem message.setFloat(getCurrencyPath(), newCurrencyValue); // obtém o terminal de saída dos serviços de mediação OutputTerminal outTerminal = getMediationServices().getOutputTerminal( OUTPUT_TERMINAL_NAME); if (outTerminal != null) { // dispara a mensagem para o terminal de saída outTerminal.fire(message); } } }
Implementar no Tempo de Execução
Exporte o projeto Java como um jar, por exemplo, myPrimitives.jar. Na pasta raiz, selecione .mednode apenas, mas mantenha a classe Java selecionada. Exporte o jar para WAS_HOME/lib/ext.
Para obter informações sobre APIs do Service Data Object, consulte http://download.eclipse.org/tools/emf/sdo/javadoc/
<pg:BasePropertyGroups name="myGroups" resourceBundle="mypacakage.myProperties">
Atributo | Descrição |
---|---|
nome | Nome do grupo de propriedades. Esse nome não será exibido no Editor de Fluxo de Mediação. |
resourceBundle | O pacote de recursos que será carregado para interpretar o valor de uma cadeia. Ele é usado para globalização. |
<propertyGroup name="myGroup" xsi:type="pg:BasePropertyGroup">
Atributo | Descrição |
---|---|
nome | Nome do grupo de propriedades. Se houver mais de um propertyGroup, cada elemento propertyGroup será processado como página tabulada na página Detalhes. O atributo name se torna o nome da página tabulada. |
Propriedade | Atributo | Descrição |
---|---|---|
|
name / displayName | O nome é o identificador de uma propriedade. DisplayName é usado como uma etiqueta anterior ao controle de entrada da propriedade. |
descrição | Exibida como texto de dicas de ferramenta | |
propertyType | Define o tipo do valor (String / Boolean / Float / Integer) | |
defaultValue | O valor padrão da propriedade | |
hidden | Define se a propriedade é ocultada ou mostrada | |
readOnly | Define se a propriedade é de leitura | |
requerido | Indica se a propriedade requer um valor | |
sensitive | Se o tipo do valor for String, esse atributo determinará se a distinção entre maiúsculas e minúsculas é feita | |
validValuesEditable | Define se um usuário tem permissão para inserir um valor que é diferente de valores definidos por validValues | |
validValues | Uma lista de valores válidos | |
padrão | Se o tipo do valor for String, o editor fará uma correspondência de padrões para validar a entrada do usuário | |
maxLength | Se o tipo do valor for String, o editor limitará o tamanho que pode ser inserido pelo usuário | |
minValue / maxValue | Se o tipo do valor for Integer ou Float, o editor executará uma verificação de intervalo na entrada do usuário. | |
validValueGeneratorClass | Aponta para uma classe que é responsável por gerar dinamicamente valores válidos. A classe deve implementar a interface com.ibm.propertygroup.ext.api .IValidValuesGenerator |
<property name="filters" displayName="% displayname" xsi:type="pg:TableProperty"> <column name="pattern" required="true" .../> <column name="terminalName" required="true" .../> </property>
<property name="myCustomProperty" class=â€MyCustomImpl†xsi:type="pg:CustomProperty">
<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>
<?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>