| 1 package org.objectweb.celtix.wsdl; 2 3 import java.io.PrintWriter ; 4 import java.lang.reflect.Method ; 5 import java.util.Iterator ; 6 import java.util.Map ; 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 ; 21 import javax.xml.stream.XMLStreamWriter; 22 23 import org.w3c.dom.Element ; 24 25 30 public class JAXBExtensionHelper implements ExtensionSerializer, ExtensionDeserializer { 31 final JAXBContext context; 32 final Class <? extends TExtensibilityElementImpl> typeClass; 33 34 public JAXBExtensionHelper(JAXBContext c, Class <? extends TExtensibilityElementImpl> cls) { 35 context = c; 36 typeClass = cls; 37 } 38 39 public static void addExtensions(ExtensionRegistry registry, 40 Class <?> parentType, 41 Class <? 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 <?> objectFactory = Class.forName(cls.getPackage().getName() + ".ObjectFactory"); 48 Method methods[] = objectFactory.getDeclaredMethods(); 49 for (Method 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 elementType = new QName (elementDecl.namespace(), elementDecl.name()); 56 registry.registerDeserializer(parentType, elementType, helper); 57 registry.registerSerializer(parentType, elementType, helper); 58 } 59 } 60 } 61 } catch (ClassNotFoundException ex) { 62 ex.printStackTrace(); 64 } 65 } 66 67 72 public void marshall(Class parent, QName qname, ExtensibilityElement obj, PrintWriter pw, 73 final Definition wsdl, ExtensionRegistry registry) throws WSDLException { 74 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 mObj = obj; 82 83 Class <?> objectFactory = Class.forName(typeClass.getPackage().getName() + ".ObjectFactory"); 84 Method methods[] = objectFactory.getDeclaredMethods(); 85 for (Method method : methods) { 86 if (method.getParameterTypes().length == 1 87 && method.getParameterTypes()[0].equals(typeClass)) { 88 89 mObj = method.invoke(objectFactory.newInstance(), new Object [] {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 () { 96 97 public String getNamespaceURI(String arg) { 98 return wsdl.getNamespace(arg); 99 } 100 101 public String getPrefix(String arg) { 102 for (Object ent : wsdl.getNamespaces().entrySet()) { 103 Map.Entry entry = (Map.Entry )ent; 104 if (arg.equals(entry.getValue())) { 105 return (String )entry.getKey(); 106 } 107 } 108 return null; 109 } 110 111 public Iterator getPrefixes(String arg) { 112 return wsdl.getNamespaces().keySet().iterator(); 113 } 114 }); 115 116 u.marshal(mObj, writer); 117 writer.flush(); 118 } catch (Exception ex) { 119 throw new WSDLException(WSDLException.PARSER_ERROR, 120 "", 121 ex); 122 } 123 124 } 125 126 132 public ExtensibilityElement unmarshall(Class parent, QName qname, Element element, Definition wsdl, 133 ExtensionRegistry registry) throws WSDLException { 134 try { 135 Unmarshaller u = context.createUnmarshaller(); 136 137 Object 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 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 |