KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > wsdl > JAXBExtensionHelper


1 package org.objectweb.celtix.wsdl;
2
3 import java.io.PrintWriter JavaDoc;
4 import java.lang.reflect.Method JavaDoc;
5 import java.util.Iterator JavaDoc;
6 import java.util.Map JavaDoc;
7
8 import javax.wsdl.Definition;
9 import javax.wsdl.WSDLException;
10 import javax.wsdl.extensions.ExtensibilityElement;
11 import javax.wsdl.extensions.ExtensionDeserializer;
12 import javax.wsdl.extensions.ExtensionRegistry;
13 import javax.wsdl.extensions.ExtensionSerializer;
14 import javax.xml.bind.JAXBContext;
15 import javax.xml.bind.JAXBElement;
16 import javax.xml.bind.JAXBException;
17 import javax.xml.bind.Marshaller;
18 import javax.xml.bind.Unmarshaller;
19 import javax.xml.bind.annotation.XmlElementDecl;
20 import javax.xml.namespace.QName JavaDoc;
21 import javax.xml.stream.XMLStreamWriter;
22
23 import org.w3c.dom.Element JavaDoc;
24
25 /**
26  * JAXBExtensionHelper
27  * @author dkulp
28  *
29  */

30 public class JAXBExtensionHelper implements ExtensionSerializer, ExtensionDeserializer {
31     final JAXBContext context;
32     final Class JavaDoc<? extends TExtensibilityElementImpl> typeClass;
33     
34     public JAXBExtensionHelper(JAXBContext c, Class JavaDoc<? extends TExtensibilityElementImpl> cls) {
35         context = c;
36         typeClass = cls;
37     }
38     
39     public static void addExtensions(ExtensionRegistry registry,
40                                      Class JavaDoc<?> parentType,
41                                      Class JavaDoc<? extends TExtensibilityElementImpl> cls) throws JAXBException {
42         
43         JAXBContext context = JAXBContext.newInstance(cls.getPackage().getName(), cls.getClassLoader());
44         JAXBExtensionHelper helper = new JAXBExtensionHelper(context, cls);
45         
46         try {
47             Class JavaDoc<?> objectFactory = Class.forName(cls.getPackage().getName() + ".ObjectFactory");
48             Method JavaDoc methods[] = objectFactory.getDeclaredMethods();
49             for (Method JavaDoc method : methods) {
50                 if (method.getParameterTypes().length == 1
51                     && method.getParameterTypes()[0].equals(cls)) {
52                     
53                     XmlElementDecl elementDecl = method.getAnnotation(XmlElementDecl.class);
54                     if (null != elementDecl) {
55                         QName JavaDoc elementType = new QName JavaDoc(elementDecl.namespace(), elementDecl.name());
56                         registry.registerDeserializer(parentType, elementType, helper);
57                         registry.registerSerializer(parentType, elementType, helper);
58                     }
59                 }
60             }
61         } catch (ClassNotFoundException JavaDoc ex) {
62             // TODO
63
ex.printStackTrace();
64         }
65     }
66
67     /* (non-Javadoc)
68      * @see javax.wsdl.extensions.ExtensionSerializer#marshall(java.lang.Class,
69      * javax.xml.namespace.QName, javax.wsdl.extensions.ExtensibilityElement,
70      * java.io.PrintWriter, javax.wsdl.Definition, javax.wsdl.extensions.ExtensionRegistry)
71      */

72     public void marshall(Class JavaDoc parent, QName JavaDoc qname, ExtensibilityElement obj, PrintWriter JavaDoc pw,
73                          final Definition wsdl, ExtensionRegistry registry) throws WSDLException {
74         // TODO Auto-generated method stub
75
try {
76             Marshaller u = context.createMarshaller();
77             u.setProperty("jaxb.encoding", "UTF-8");
78             u.setProperty("jaxb.fragment", Boolean.TRUE);
79             u.setProperty("jaxb.formatted.output", Boolean.TRUE);
80             
81             Object JavaDoc mObj = obj;
82             
83             Class JavaDoc<?> objectFactory = Class.forName(typeClass.getPackage().getName() + ".ObjectFactory");
84             Method JavaDoc methods[] = objectFactory.getDeclaredMethods();
85             for (Method JavaDoc method : methods) {
86                 if (method.getParameterTypes().length == 1
87                     && method.getParameterTypes()[0].equals(typeClass)) {
88                     
89                     mObj = method.invoke(objectFactory.newInstance(), new Object JavaDoc[] {obj});
90                 }
91             }
92
93             javax.xml.stream.XMLOutputFactory fact = javax.xml.stream.XMLOutputFactory.newInstance();
94             XMLStreamWriter writer = fact.createXMLStreamWriter(pw);
95             writer.setNamespaceContext(new javax.xml.namespace.NamespaceContext JavaDoc() {
96                 
97                 public String JavaDoc getNamespaceURI(String JavaDoc arg) {
98                     return wsdl.getNamespace(arg);
99                 }
100                                 
101                 public String JavaDoc getPrefix(String JavaDoc arg) {
102                     for (Object JavaDoc ent : wsdl.getNamespaces().entrySet()) {
103                         Map.Entry JavaDoc entry = (Map.Entry JavaDoc)ent;
104                         if (arg.equals(entry.getValue())) {
105                             return (String JavaDoc)entry.getKey();
106                         }
107                     }
108                     return null;
109                 }
110                 
111                 public Iterator JavaDoc getPrefixes(String JavaDoc arg) {
112                     return wsdl.getNamespaces().keySet().iterator();
113                 }
114             });
115             
116             u.marshal(mObj, writer);
117             writer.flush();
118         } catch (Exception JavaDoc ex) {
119             throw new WSDLException(WSDLException.PARSER_ERROR,
120                                     "",
121                                     ex);
122         }
123
124     }
125
126     /* (non-Javadoc)
127      * @see javax.wsdl.extensions.ExtensionDeserializer#unmarshall(java.lang.Class,
128      * javax.xml.namespace.QName, org.w3c.dom.Element,
129      * javax.wsdl.Definition,
130      * javax.wsdl.extensions.ExtensionRegistry)
131      */

132     public ExtensibilityElement unmarshall(Class JavaDoc parent, QName JavaDoc qname, Element element, Definition wsdl,
133                                            ExtensionRegistry registry) throws WSDLException {
134         try {
135             Unmarshaller u = context.createUnmarshaller();
136         
137             Object JavaDoc o = u.unmarshal(element);
138             if (o instanceof JAXBElement<?>) {
139                 JAXBElement<?> el = (JAXBElement<?>)o;
140                 o = el.getValue();
141             }
142             
143             ExtensibilityElement el = o instanceof ExtensibilityElement ? (ExtensibilityElement)o : null;
144             if (null != el) {
145                 el.setElementType(qname);
146             }
147             return el;
148         } catch (Exception JavaDoc ex) {
149             throw new WSDLException(WSDLException.PARSER_ERROR,
150                                     "Error reading element " + qname,
151                                     ex);
152         }
153     }
154     
155     
156
157
158     
159     
160
161 }
162
Popular Tags