Páginas

quinta-feira, 8 de julho de 2010

JavaMapping com NodeList

Existe algumas maneiras de fazer um mapa entre mensagens, uma delas é você utilizar um javaMapping.

1 - Criar dois DT, um para entrada e outra para saída.




2 - Criar dois Message Type.

3 - Criar duas Message Interface.


4 - Criar um Imported Archive e importar o .class compactado no formato ZIP.

Código do JavaMapping.

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.sap.aii.mapping.api.StreamTransformation;
import com.sap.aii.mapping.api.StreamTransformationException;


public class JavaMappingBlog1 implements StreamTransformation{

private static final String EXCEPTION = "An exception occured: ";
private static final String CAB       = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
private static final String OrigBeg   = "<MT_Origem";
private static final String OrigEnd   = "</MT_Origem>";
private static final String MenBeg    = "<ns0:MT_Destino xmlns:ns0=\"http://javamapping.com\">";
private static final String MenEnd    = "</ns0:MT_Destino>";
private static final String RowBeg    = "<row>";
private static final String RowEnd    = "</row>";

// Método para buscar um valor em uma TAG dentro de um NodeList
public static String recuperaNode(Node node, String campo) {
String result="";
Element elmnt = (Element) node;
NodeList elmntLst = elmnt.getElementsByTagName(campo);
Element elmnt2 = (Element) elmntLst.item(0);
NodeList key = elmnt2.getChildNodes();
if (key.getLength()==0) result="";
else result = ((Node) key.item(0)).getNodeValue();
return result;
}
public void setParameter(Map arg0) {}
public void execute(InputStream in, OutputStream out) throws StreamTransformationException {
final String UTF8 = "UTF-8";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String inStr=""r1="";
String nome="", sobrenome="", idade="";
int c = -1, s = 0, e = 0;
try {
while ((c = in.read()) != -1)
baos.write(c);
inStr = baos.toString(UTF8);

// Remover alguns caracteres e substituir alguns.
// Coloquei uma imagem porque o HTML estava convertendo tudo

// procurando na string o inicio o e fim da mensagem
s = inStr.indexOf(OrigBeg);
e = inStr.indexOf(OrigEnd);

// pegando o inicio e o fim e convertendo para um InputStream
r1 = inStr.substring(s, e+OrigEnd.length());
InputStream row1 = new ByteArrayInputStream(r1.getBytes("UTF-8"));

// Gerar o NodeList
DocumentBuilderFactory dbf1 = DocumentBuilderFactory.newInstance();
DocumentBuilder db1 = dbf1.newDocumentBuilder();
Document doc1 = db1.parse(row1);
  doc1.getDocumentElement().normalize();
// Especificar o elemento para realizar o loop
  NodeList nodeLst1 = doc1.getElementsByTagName("row");
inStr = "";
if (nodeLst1!=null){
for (int cont = 0; cont < nodeLst1.getLength(); cont++) {
Node fstNode = nodeLst1.item(cont);

      if (fstNode.getNodeType() == Node.ELEMENT_NODE) {

// busca o valor da TAG
nome = recuperaNode(fstNode, "nome");
sobrenome = recuperaNode(fstNode, "sobrenome");
idade = recuperaNode(fstNode, "idade");

// Monta o a TAG row de saída
inStr = inStr + RowBeg"<nomeComleto>" + nome + " " + sobrenome +   "</nomeComleto>" + "<idade>" + idade  + "</idade>"RowEnd;

      }
  }
}

// Monta a mensagem de saída
inStr = CAB + MenBeg + inStr + MenEnd;
 
out.write(inStr.getBytes(UTF8));

}
catch (Exception exception){
throw new StreamTransformationException(EXCEPTION + exception.getMessage());
}
}
public static void main(String[] args) {
final String INPUT  = "/Users/kaleokuntgen/Compartilhada/blog1.xml";
final String OUTPUT = "/Users/kaleokuntgen/Compartilhada/blog1_resp.xml";
try {
JavaMappingBlog1 JavaMappingBlog1 = new JavaMappingBlog1();

InputStream input = new FileInputStream(INPUT);
OutputStream output = new FileOutputStream(OUTPUT);
JavaMappingBlog1.execute(input, output);
input.close();
output.flush();
output.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}

5 - Criar a Interface Mapping com as mensagens e o imported archive.

6 - Entre na aba "Test" para verificar o mapeamento.

Nenhum comentário:

Postar um comentário