001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.model;
018    
019    import java.io.InputStream;
020    import java.io.StringReader;
021    import java.io.StringWriter;
022    import javax.xml.bind.JAXBContext;
023    import javax.xml.bind.JAXBException;
024    import javax.xml.bind.Marshaller;
025    import javax.xml.bind.Unmarshaller;
026    
027    import org.apache.camel.CamelContext;
028    import org.apache.camel.NamedNode;
029    
030    /**
031     * Helper for the Camel {@link org.apache.camel.model model} classes.
032     */
033    public final class ModelHelper {
034    
035        private ModelHelper() {
036            // utility class
037        }
038    
039        /**
040         * Dumps the definition as XML
041         *
042         * @param definition  the definition, such as a {@link org.apache.camel.NamedNode}
043         * @return            the output in XML (is formatted)
044         * @throws JAXBException is throw if error marshalling to XML
045         */
046        public static String dumpModelAsXml(NamedNode definition) throws JAXBException {
047            JAXBContext jaxbContext = createJaxbContext();
048    
049            Marshaller marshaller = jaxbContext.createMarshaller();
050            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
051            StringWriter buffer = new StringWriter();
052            marshaller.marshal(definition, buffer);
053    
054            return buffer.toString();
055        }
056    
057        /**
058         * Marshal the xml to the model definition
059         *
060         * @param xml the xml
061         * @param type the definition type to return, will throw a {@link ClassCastException} if not the expected type
062         * @return the model definition
063         * @throws javax.xml.bind.JAXBException is thrown if error unmarshalling from xml to model
064         */
065        public static <T extends NamedNode> T createModelFromXml(String xml, Class<T> type) throws JAXBException {
066            JAXBContext jaxbContext = createJaxbContext();
067            StringReader reader = new StringReader(xml);
068            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
069            Object result = unmarshaller.unmarshal(reader);
070            reader.close();
071    
072            if (result == null) {
073                throw new JAXBException("Cannot unmarshal to " + type + " using JAXB from XML: " + xml);
074            }
075            return type.cast(result);
076        }
077    
078        /**
079         * Marshal the xml to the model definition
080         *
081         * @param stream the xml stream
082         * @param type the definition type to return, will throw a {@link ClassCastException} if not the expected type
083         * @return the model definition
084         * @throws javax.xml.bind.JAXBException is thrown if error unmarshalling from xml to model
085         */
086        public static <T extends NamedNode> T createModelFromXml(InputStream stream, Class<T> type) throws JAXBException {
087            JAXBContext jaxbContext = createJaxbContext();
088            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
089            Object result = unmarshaller.unmarshal(stream);
090            return type.cast(result);
091        }
092    
093        public static JAXBContext createJaxbContext() throws JAXBException {
094            // must use classloader from CamelContext to have JAXB working
095            return JAXBContext.newInstance(Constants.JAXB_CONTEXT_PACKAGES, CamelContext.class.getClassLoader());
096        }
097    }