$.JaxbMapper.java Source code

Java tutorial

Introduction

Here is the source code for $.JaxbMapper.java

Source

/**
 * Copyright (c) 2005-2012 springside.org.cn
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 */
package ${package}.common.utils.mapper;

    import java.io.StringReader;
    import java.io.StringWriter;
    import java.util.Collection;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.ConcurrentMap;

    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBElement;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    import javax.xml.bind.annotation.XmlAnyElement;
    import javax.xml.namespace.QName;

    import org.apache.commons.lang3.StringUtils;
    import org.springframework.util.Assert;

import ${package}.common.utils.others.Exceptions;
import ${package}.common.utils.others.Reflections;

    /**
     * Jaxb2.0XML<->Java ObjectMapper.
     * 
     * ???RootClass.
     * ?RootCollection.
     * 
     * @author calvin
     */
    @SuppressWarnings("rawtypes")
    public class JaxbMapper {

        private static ConcurrentMap<Class, JAXBContext> jaxbContexts = new ConcurrentHashMap<Class, JAXBContext>();

        /**
         * Java Object->Xml without encoding.
         */
        public static String toXml(Object root) {
            Class clazz = Reflections.getUserClass(root);
            return toXml(root, clazz, null);
        }

        /**
         * Java Object->Xml with encoding.
         */
        public static String toXml(Object root, String encoding) {
            Class clazz = Reflections.getUserClass(root);
            return toXml(root, clazz, encoding);
        }

        /**
         * Java Object->Xml with encoding.
         */
        public static String toXml(Object root, Class clazz, String encoding) {
            try {
                StringWriter writer = new StringWriter();
                createMarshaller(clazz, encoding).marshal(root, writer);
                return writer.toString();
            } catch (JAXBException e) {
                throw Exceptions.unchecked(e);
            }
        }

        /**
         * Java Collection->Xml without encoding, ?Root ElementCollection.
         */
        public static String toXml(Collection<?> root, String rootName, Class clazz) {
            return toXml(root, rootName, clazz, null);
        }

        /**
         * Java Collection->Xml with encoding, ?Root ElementCollection.
         */
        public static String toXml(Collection<?> root, String rootName, Class clazz, String encoding) {
            try {
                CollectionWrapper wrapper = new CollectionWrapper();
                wrapper.collection = root;

                JAXBElement<CollectionWrapper> wrapperElement = new JAXBElement<CollectionWrapper>(new QName(rootName),
                        CollectionWrapper.class, wrapper);

                StringWriter writer = new StringWriter();
                createMarshaller(clazz, encoding).marshal(wrapperElement, writer);

                return writer.toString();
            } catch (JAXBException e) {
                throw Exceptions.unchecked(e);
            }
        }

        /**
         * Xml->Java Object.
         */
        @SuppressWarnings("unchecked")
        public static <T> T fromXml(String xml, Class<T> clazz) {
            try {
                StringReader reader = new StringReader(xml);
                return (T) createUnmarshaller(clazz).unmarshal(reader);
            } catch (JAXBException e) {
                throw Exceptions.unchecked(e);
            }
        }

        /**
         * Marshallerencoding(?null).
         * ???pooling
         */
        public static Marshaller createMarshaller(Class clazz, String encoding) {
            try {
                JAXBContext jaxbContext = getJaxbContext(clazz);

                Marshaller marshaller = jaxbContext.createMarshaller();

                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

                if (StringUtils.isNotBlank(encoding)) {
                    marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
                }

                return marshaller;
            } catch (JAXBException e) {
                throw Exceptions.unchecked(e);
            }
        }

        /**
         * UnMarshaller.
         * ???pooling
         */
        public static Unmarshaller createUnmarshaller(Class clazz) {
            try {
                JAXBContext jaxbContext = getJaxbContext(clazz);
                return jaxbContext.createUnmarshaller();
            } catch (JAXBException e) {
                throw Exceptions.unchecked(e);
            }
        }

        protected static JAXBContext getJaxbContext(Class clazz) {
            Assert.notNull(clazz, "'clazz' must not be null");
            JAXBContext jaxbContext = jaxbContexts.get(clazz);
            if (jaxbContext == null) {
                try {
                    jaxbContext = JAXBContext.newInstance(clazz, CollectionWrapper.class);
                    jaxbContexts.putIfAbsent(clazz, jaxbContext);
                } catch (JAXBException ex) {
                    throw new RuntimeException(
                            "Could not instantiate JAXBContext for class [" + clazz + "]: " + ex.getMessage(), ex);
                }
            }
            return jaxbContext;
        }

        /**
         * ?Root Element  Collection.
         */
        public static class CollectionWrapper {

            @XmlAnyElement
            protected Collection<?> collection;
        }
    }