View Javadoc

1   /*
2    * Copyright 2001-2004 (C) MetaStuff, Ltd. All Rights Reserved.
3    * 
4    * This software is open source. 
5    * See the bottom of this file for the licence.
6    * 
7    * $Id: JAXBSupport.java,v 1.1 2004/08/02 18:44:08 maartenc Exp $
8    */
9   
10  package org.dom4j.jaxb;
11  
12  import java.io.StringReader;
13  
14  import javax.xml.bind.JAXBContext;
15  import javax.xml.bind.JAXBException;
16  import javax.xml.bind.Marshaller;
17  import javax.xml.bind.Unmarshaller;
18  import javax.xml.transform.Source;
19  import javax.xml.transform.stream.StreamSource;
20  
21  import org.dom4j.dom.DOMDocument;
22  
23  /***
24   * @author Wonne Keysers (Realsoftware.be)
25   */
26  abstract class JAXBSupport {
27  
28     private String contextPath;
29     private ClassLoader classloader;
30  
31     private JAXBContext jaxbContext;
32     private Marshaller marshaller;
33     private Unmarshaller unmarshaller;
34  
35     public JAXBSupport(String contextPath) {
36        this.contextPath = contextPath;
37     }
38  
39     public JAXBSupport(String contextPath, ClassLoader classloader) {
40        this.contextPath = contextPath;
41        this.classloader = classloader;
42     }
43  
44     /***
45      * Marshals the given {@link javax.xml.bind.Element} in to its DOM4J counterpart.
46      * 
47      * @param element JAXB Element to be marshalled
48      * @return the marshalled DOM4J {@link org.dom4j.Element}
49      * @throws JAXBException when an error occurs
50      */
51     protected org.dom4j.Element marshal(javax.xml.bind.Element element) throws JAXBException {
52        Marshaller marshaller = getMarshaller();
53  
54        DOMDocument doc = new DOMDocument();
55        marshaller.marshal(element, doc);
56  
57        return doc.getRootElement();
58     }
59  
60     /***
61      * Unmarshalls the specified DOM4J {@link org.dom4j.Element} into a {@link javax.xml.bind.Element}
62      * @param element the DOM4J element to unmarshall
63      * @return the unmarshalled JAXB object
64      * @throws JAXBException when an error occurs
65      */protected javax.xml.bind.Element unmarshal(org.dom4j.Element element) throws JAXBException {
66        Unmarshaller unmarshaller = getUnmarshaller();
67  
68        Source source = new StreamSource(new StringReader(element.asXML()));
69  
70        return (javax.xml.bind.Element) unmarshaller.unmarshal(source);
71     }
72  
73     private Marshaller getMarshaller() throws JAXBException {
74        if (marshaller == null) {
75           marshaller = getContext().createMarshaller();
76        }
77        return marshaller;
78     }
79  
80     private Unmarshaller getUnmarshaller() throws JAXBException {
81        if (unmarshaller == null) {
82           unmarshaller = getContext().createUnmarshaller();
83        }
84        return unmarshaller;
85     }
86  
87     private JAXBContext getContext() throws JAXBException {
88        if (jaxbContext == null) {
89           if (classloader == null) {
90              jaxbContext = JAXBContext.newInstance(contextPath);
91           }
92           else {
93              jaxbContext = JAXBContext.newInstance(contextPath, classloader);
94           }
95        }
96        return jaxbContext;
97     }
98  
99  }
100 
101 
102 
103 
104 /*
105  * Redistribution and use of this software and associated documentation
106  * ("Software"), with or without modification, are permitted provided
107  * that the following conditions are met:
108  *
109  * 1. Redistributions of source code must retain copyright
110  *    statements and notices.  Redistributions must also contain a
111  *    copy of this document.
112  *
113  * 2. Redistributions in binary form must reproduce the
114  *    above copyright notice, this list of conditions and the
115  *    following disclaimer in the documentation and/or other
116  *    materials provided with the distribution.
117  *
118  * 3. The name "DOM4J" must not be used to endorse or promote
119  *    products derived from this Software without prior written
120  *    permission of MetaStuff, Ltd.  For written permission,
121  *    please contact dom4j-info@metastuff.com.
122  *
123  * 4. Products derived from this Software may not be called "DOM4J"
124  *    nor may "DOM4J" appear in their names without prior written
125  *    permission of MetaStuff, Ltd. DOM4J is a registered
126  *    trademark of MetaStuff, Ltd.
127  *
128  * 5. Due credit should be given to the DOM4J Project - 
129  *    http://www.dom4j.org
130  *
131  * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS
132  * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
133  * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
134  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
135  * METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
136  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
137  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
138  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
139  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
140  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
141  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
142  * OF THE POSSIBILITY OF SUCH DAMAGE.
143  *
144  * Copyright 2001-2004 (C) MetaStuff, Ltd. All Rights Reserved.
145  *
146  * $Id: JAXBSupport.java,v 1.1 2004/08/02 18:44:08 maartenc Exp $
147  */