package tiw5.smix.camel; import java.io.StringReader; import java.io.StringWriter; import java.util.logging.Logger; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import org.apache.camel.Exchange; public class TestingDynamicRouter { private static final Logger LOG = Logger .getLogger(TestingDynamicRouter.class.getCanonicalName()); private static Transformer copy; static { try { copy = TransformerFactory.newInstance().newTransformer(); } catch (Exception e) { e.printStackTrace(); copy = null; } } public void changeHeaderRoute(Exchange exchange) throws TransformerException, XMLStreamException { // Copie du body dans une string Source inBody = exchange.getIn().getBody(Source.class); StringWriter sw = new StringWriter(); copy.transform(inBody, new StreamResult(sw)); // Utilisation d'un XMLStreamReader (API StAX) pour lire le XML depuis // la string // Rmq: le parsing de document pour faire du DOM semble buggé (document // avec un corps vide) // Rmq: La fabrication directe du XMLStreamReader depuis la Source // (sans passer par la String intermédiaire) échoue XMLStreamReader reader = XMLInputFactory.newInstance() .createXMLStreamReader(new StringReader(sw.toString())); String txt = null; // Boucle qui cherche un tag appelé "in" while (reader.hasNext()) { int type = reader.next(); if (type == XMLStreamReader.START_ELEMENT && "in".equals(reader.getLocalName())) break; } // Utilisation du texte dans le tag "in" pour le message if (reader.hasNext() && XMLStreamReader.CHARACTERS == reader.next()) { txt = reader.getText(); } reader.close(); // On fait un setBody avec une String pour envoyer à Jabber exchange.getOut().setBody("Message: " + txt); // Headers pour le routage dynamique exchange.getOut().setHeaders(exchange.getIn().getHeaders()); String destinataire = "titi@localhost"; // normalement calculé dynamiquement String dest = "log:toxmpp,xmpp://rapidodvd@localhost/" + destinataire + "?password=rapidomdp"; exchange.getOut().setHeader("myHeader", dest); LOG.info("Ajout du header 'myHeader' au message " + exchange.getOut().getMessageId() + ": " + dest); } }