2016-09-28 2 views
0

J'ai travaillé sur un module Java pour transformer les XML au cours des derniers mois. Il est supposé prendre une demande de savon et remplir l'élément soap: header avec des éléments supplémentaires d'un référentiel de métadonnées, par exemple. Le module devrait être universellement implémentable dans n'importe quel middleware (mon système natif est SAP PI).IBM Integration Bus Java Nœud de calcul: sortie d'un w3c.dom.Document ou d'une chaîne

Maintenant, je suis chargé d'implémenter ce module en tant que jar dans un noeud JavaCompute dans IBM Integration Bus. Le problème est que pour exporter le XML résultant j'ai besoin d'obtenir les données dans le outMessage du JavaCompute Node. Cependant, je n'ai pas trouvé un moyen de convertir un org.w3c.com.Document en MbElement ou d'insérer le document ou son contenu dans le MbElement. En fait, je ne voyais aucun moyen de mettre quelque chose dedans (pas même une chaîne XML) sans utiliser l'API IBM comme prévu, donc je devrais écrire du code qui lit mon document déjà fini et construit un MbElement à partir de cela.

Cela ressemble à ce qui suit:

public void evaluate(MbMessageAssembly inAssembly) throws MbException { 

    MbOutputTerminal out = getOutputTerminal("out"); 
    MbOutputTerminal alt = getOutputTerminal("alternate"); 

    MbMessage inMessage = inAssembly.getMessage(); 

    // create new empty message 
    MbMessage outMessage = new MbMessage(); 
    MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, 
      outMessage); 

    try { 
     // optionally copy message headers 
     // copyMessageHeaders(inMessage, outMessage); 
     // ---------------------------------------------------------- 
     // Add user code below 

     //Create an example output Document 
     String outputContent = "<element><subelement>Value</subelement></element>"; 
     DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(outputContent)); 
     Document outDocument = db.parse(is); 

//Get the Document or its content into the outRoot or outMessage somehow. 

MbElement outRoot = outMessage.getRootElement(); 

//Start to iterate over the Document and use Methods like this to build up the MbElement? 
MbElement outBody = outRoot.createElementAsLastChild("request"); 

// End of user code 
} catch (MbException e) { ... 
+0

Quelle est votre question? Vous avez raison, vous pouvez uniquement accéder à l'arborescence des messages sortants avec l'API IBM. –

+0

La question était de savoir si je peux d'une certaine façon ne pas le faire moi-même et de convertir le DOM en quelque chose que l'outMessage peut gérer et comment le mettre dans le message. Siarheib a probablement la bonne réponse, je l'ai testé ATM. –

Répondre

0

Vous pouvez lancer votre org.w3c.com.Document à tableau d'octets (example). Ensuite, vous pouvez utiliser le code suivant:

 MbMessage outMessage = new MbMessage(); 
     //copy message headers if required 
     MbElement oRoot = outMessage.getRootElement(); 
     MbElement oBody = oRoot.createElementAsLastChild(MbBLOB.PARSER_NAME); 
     oBody.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, "BLOB", yourXmlAsByteArray); 
     MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, inAssembly.getLocalEnvironment(), inAssembly.getExceptionList(), outMessage); 
+0

Intéressant, je vais essayer cela et voir comment le prochain nœud traite un objet BLOB. Afaik est un format de contenu commun ici, cependant. –

+0

Bonne réponse. Pour les futurs lecteurs: le BLOB peut ensuite être utilisé dans les nœuds suivants comme un xml "normal", je l'ai mis directement dans un FileOutputNode et il est sorti comme je l'ai généré dans Code. –

+0

Juste un petit ajout. Si vous souhaitez utiliser le message dans les nœuds suivants en tant que XML (en d'autres termes, naviguer dans la structure du message à l'aide des fonctionnalités Integration Bus), vous pouvez utiliser le nœud ResetContentDescriptor pour réorganiser BLOB en tant que XMLNSC. – siarheib