You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ha...@apache.org on 2008/08/06 20:00:40 UTC

svn commit: r683341 - /activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ModelFileGenerator.java

Author: hadrian
Date: Wed Aug  6 11:00:39 2008
New Revision: 683341

URL: http://svn.apache.org/viewvc?rev=683341&view=rev
Log:
CAMEL-769.  Added file missing previous commit.

Added:
    activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ModelFileGenerator.java

Added: activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ModelFileGenerator.java
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ModelFileGenerator.java?rev=683341&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ModelFileGenerator.java (added)
+++ activemq/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/handler/ModelFileGenerator.java Wed Aug  6 11:00:39 2008
@@ -0,0 +1,129 @@
+package org.apache.camel.spring.handler;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.List;
+import java.util.Properties;
+
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.annotation.XmlNs;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Result;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.camel.builder.xml.Namespaces;
+import org.apache.camel.converter.jaxp.XmlConverter;
+import org.apache.camel.model.RouteType;
+import org.apache.camel.model.RoutesType;
+import org.apache.camel.spring.handler.CamelNamespaceHandler;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.RuntimeTransformException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class ModelFileGenerator extends CamelNamespaceHandler {
+    
+    private static final String DEFAULT_ROOT_ELEMENT_NAME = "routes";
+
+    /**
+     * Write the specified 'routeTypes' to 'fileName' as XML using JAXB.
+     */
+    public void marshalRoutesUsingJaxb(String fileName, List<RouteType> routeTypes) throws IOException {      
+        OutputStream outputStream = outputStream(fileName);
+        
+        try {
+            XmlConverter converter = converter();
+            Document doc = converter.createDocument();
+        
+            Element root = doc.createElement(rootElementName());
+            root.setAttribute("xmlns", Namespaces.DEFAULT_NAMESPACE);     
+            doc.appendChild(root);
+    
+            for (RouteType routeType : routeTypes) {
+                addJaxbElementToNode(root, routeType); 
+            }      
+    
+            Result result = new StreamResult(new OutputStreamWriter(outputStream, XmlConverter.defaultCharset));
+    
+            copyToResult(converter, doc, result);
+        } catch (ParserConfigurationException e) {
+            throw new RuntimeTransformException(e);                
+        } catch (TransformerException e) {
+            throw new RuntimeTransformException(e);
+        } finally {
+            outputStream.close();
+        }
+    }
+
+    /**
+     * Returns a configured XmlConverter
+     */
+    private XmlConverter converter() {
+        XmlConverter converter = new XmlConverter();
+        TransformerFactory transformerFactory = converter.getTransformerFactory();
+        transformerFactory.setAttribute("indent-number", new Integer(2));
+        return converter;
+    }   
+    
+    /**
+     * Copies the given input Document into the required result using the provided converter.
+     */
+    private void copyToResult(XmlConverter converter, Document doc, Result result) throws TransformerException {       
+        Properties outputProperties = converter.defaultOutputProperties();
+        outputProperties.put(OutputKeys.OMIT_XML_DECLARATION, "no");
+        outputProperties.put(OutputKeys.INDENT, "yes");
+        
+        converter.toResult(converter.toSource(doc), result, outputProperties);        
+    }
+
+    /**
+     * Convert the specified object into XML and add it as a child of 'node' using JAXB.
+     */
+    private void addJaxbElementToNode(Node node, Object jaxbElement) {
+        try {    
+            binder = getJaxbContext().createBinder();
+            binder.marshal(jaxbElement, node);          
+        } catch (JAXBException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+
+    /**
+     * Return the root element name for the list of routes.
+     */
+    private String rootElementName() {
+        XmlRootElement annotation = (RoutesType.class).getAnnotation(XmlRootElement.class);
+        if (annotation != null) {
+            String elementName = annotation.name();
+            if (ObjectHelper.isNotNullAndNonEmpty(elementName)) {
+                return elementName;
+            }          
+        }
+        return DEFAULT_ROOT_ELEMENT_NAME;
+    }    
+
+    /**
+     * returns an output stream for the filename specified.
+     */
+    private OutputStream outputStream(String fileName) throws FileNotFoundException {
+        File file = new File(fileName);
+        if (!file.exists()) {
+            File parentFile = file.getParentFile();
+            if (parentFile != null) {
+                parentFile.mkdirs();     
+            }
+        }
+        return new FileOutputStream(file);
+    }
+}