Antes de começar
Em muitos casos, o nó definido pelo usuário necessita acessar o conteúdo da mensagem recebida em seu terminal de entrada. A mensagem é representada como uma árvore de elementos de sintaxe. Grupos de funções utilitárias são fornecidos para gerenciamento de mensagens, acesso a buffer de mensagem, navegação de elementos de sintaxe e acesso a elementos de sintaxe.
A classe MbElement fornece a interface para os elementos de sintaxe. Para detalhes adicionais sobre a API Java, consulte o Javadoc.
Por exemplo:
A mensagem de entrada recebida é somente leitura, portanto antes que uma mensagem possa ser transformada é preciso gravá-la para uma nova mensagem de saída. É possível copiar elementos da mensagem de entrada ou criar novos elementos e anexá-los á mensagem. Os novos elementos em geral estão no domínio de um analisador.
A classe MbMessage fornece os construtores de cópia e métodos para obter o elemento raiz da mensagem. A classe MbElement fornece a interface para os elementos de sintaxe.
MbMessage newMsg = new MbMessage(assembly.getMessage()); MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
MbElement rootElement = newAssembly.getMessage().getRootElement(); MbElement switchElement = rootElement.getFirstElementByPath("/XML/data/action");
String elementValue = (String)switchElement.getValue(); if(elementValue.equals("add")) switchElement.setValue("change"); else if(elementValue.equals("change")) switchElement.setValue("delete"); else if(elementValue.equals("delete")) switchElement.setValue("hold"); else switchElement.setValue("failure");
MbElement tag = switchElement.createElementAsLastChild(MbElement.TYPE_NAME, "PreviousValue", elementValue);
tag.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "NewValue", switchElement.getValue()); MbOutputTerminal out = getOutputTerminal("out");
createElementAfter createElementAsFirstChild createElementAsLastChild createElementBefore createElementAsLastChildFromBitstreamEstes métodos devem ser utilizados, porque são específicos para designação de um analisador a uma pasta da árvore de mensagens.
createElementAfter createElementAfter createElementAsFirstChild createElementAsFirstChild createElementAsLastChild createElementAsLastChild createElementBefore createElementBefore
Os nós podem chamar expressões ESQL utilizando sintaxe ESQL de nó Compute. É possível criar e modificar os componentes da mensagem utilizando expressões ESQL, e referir-se a elementos da mensagem de entrada e dos dados a partir de um banco de dados externo.
String dataSourceName = "myDataSource";
String statement = "SET OutputRoot.XML.data = (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
String statement = "PASSTHRU( 'INSERT INTO Database.Table1 VALUES( InputRoot.XML.DataField1, InputRoot.XML.DataField2)');";
int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
MbSQLStatement sql = createSQLStatement(dataSourceName, statement, transactionType);Você pode utilizar o método createSQLStatement(dataSource, statement) para definir o tipo de transação como o padrão de MbSQLStatement.SQL_TRANSACTION_AUTO).
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, assembly.getMessage());
sql.select(assembly, newAssembly);
sql.execute(assembly);
Para obter informações adicionais sobre ESQL, consulte Visão Geral do ESQL.
Utilize a classe mbException para capturar e acessar exceções. A classe mbException retorna uma matriz de objetos de exceção que representam os filhos de uma exceção na lista de exceções do intermediário. Cada elemento retornado especifica o tipo de exceção. Uma matriz vazia será retornada se uma exceção não tiver filhos. A seguinte amostra de código mostra um exemplo do uso da classe MbException.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { try { // funcionalidade plug-in } catch(MbException ex) { traverse(ex, 0); throw ex; // se for uma reemissão, deverá ser a exceção original capturada } } void traverse(MbException ex, int level) { if(ex != null) { // Fazer qualquer ação aqui System.out.println("Level: " + level); System.out.println(ex.toString()); System.out.println("traceText: " + ex.getTraceText()); // transpor a hierarquia MbException e[] = ex.getNestedExceptions(); int size = e.length; for(int i = 0; i < size; i++) { traverse(e[i], level + 1); } } }
Consulte o javadoc para obter detalhes adicionais sobre o uso da classe mbException.
Você pode desenvolver um processamento de mensagens definidas pelo usuário ou nó de saída, de forma que ele possa acessar todas as exceções atuais. Por exemplo, para capturar as exceções do banco de dados você pode utilizar a classe MbSQLStatement. Essa classe define o valor do atributo 'throwExceptionOnDatabaseError', que determina o comportamento do intermediário quando ele encontra um erro no banco de dados. Quando ele for configurado como true, se uma exceção for emitida, ela poderá ser capturada e manuseada pela extensão definida pelo usuário.
A seguinte amostra de código mostra um exemplo de como utilizar a classe MbSQLStatement.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { MbMessage newMsg = new MbMessage(assembly.getMessage()); MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg); String table = assembly.getMessage().getRootElement().getLastChild().getFirstChild().getName(); MbSQLStatement state = createSQLStatement( "dbName", "SET OutputRoot.XML.integer[] = PASSTHRU('SELECT * FROM " + table + "');" ); state.setThrowExceptionOnDatabaseError(false); state.setTreatWarningsAsErrors(true); state.select( assembly, newAssembly ); int sqlCode = state.getSQLCode(); if(sqlCode != 0) { // Fazer tratamento de erros aqui System.out.println("sqlCode = " + sqlCode); System.out.println("sqlNativeError = " + state.getSQLNativeError()); System.out.println("sqlState = " + state.getSQLState()); System.out.println("sqlErrorText = " + state.getSQLErrorText()); } getOutputTerminal("out").propagate(assembly); }
Antes de propagar uma mensagem, você precisa decidir que dados do fluxo de mensagens deseja propagar, e qual dos terminais do nó deve receber os dados. Você deve finalizar a mensagem antes de propagá-la. Depois de propagar uma mensagem, é preciso excluir a mensagem de saída.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
newMsg.clearMessage();
Para gravar para um dispositivo de saída, a mensagem lógica (hierárquica) precisa ser convertida de volta para um fluxo de bits. Você faz isso utilizando o método getBuffer em MbMessage, da seguinte forma:
public void evaluate( MbMessageAssembly assembly, MbInputTerminal in) throws MbException { MbMessage msg = assembly.getMessage(); byte[] bitstream = msg.getBuffer(); // gravar o fluxo de bits para algum lugar writeBitstream( bitstream ); // user method }
Em geral, para um nó de saída a mensagem não é propagada para nenhum terminal de saída, portanto você pode somente retornar neste ponto.