1 package org.objectweb.celtix.bus.jaxws.io; 2 3 import java.lang.reflect.Constructor ; 4 5 import javax.xml.namespace.QName ; 6 import javax.xml.ws.WebServiceException; 7 8 import org.w3c.dom.Node ; 9 import org.w3c.dom.NodeList ; 10 11 import org.objectweb.celtix.bindings.DataReader; 12 import org.objectweb.celtix.bus.bindings.xml.XMLFault; 13 import org.objectweb.celtix.bus.jaxws.JAXBDataBindingCallback; 14 import org.objectweb.celtix.bus.jaxws.JAXBEncoderDecoder; 15 import org.objectweb.celtix.context.ObjectMessageContext; 16 17 public class XMLFaultReader<T> implements DataReader<T> { 18 final JAXBDataBindingCallback callback; 19 20 public XMLFaultReader(JAXBDataBindingCallback cb) { 21 callback = cb; 22 } 23 24 public Object read(QName name, int idx, T input) { 25 XMLFault fault = (XMLFault)input; 26 if (fault.getFaultDetail() != null) { 27 NodeList list = fault.getFaultDetail().getChildNodes(); 28 29 QName faultName; 30 for (int i = 0; i < list.getLength(); i++) { 31 Node entry = list.item(i); 32 if (entry.getNodeType() != Node.ELEMENT_NODE) { 33 continue; 34 } 35 36 faultName = new QName (entry.getNamespaceURI(), 37 entry.getLocalName()); 38 39 Class <?> clazz = callback.getWebFault(faultName); 40 try { 41 if (clazz != null) { 42 Class <?> faultInfo = clazz.getMethod("getFaultInfo").getReturnType(); 43 Object obj = JAXBEncoderDecoder.unmarshall(callback.getJAXBContext(), 44 callback.getSchema(), 45 entry, 46 faultName, 47 faultInfo); 48 Constructor <?> ctor = clazz.getConstructor(String .class, 49 obj.getClass()); 50 return ctor.newInstance(fault.getFaultString(), obj); 51 } 52 } catch (Exception ex) { 53 throw new WebServiceException("error in unmarshal of XMLFault", ex); 54 } 55 } 56 } 57 return new WebServiceException("Unknow XMLFault exception"); 58 } 59 60 public Object read(int idx, T input) { 61 return read(null, idx, input); 62 } 63 64 public void readWrapper(ObjectMessageContext objCtx, boolean isOutBound, T input) { 65 throw new UnsupportedOperationException (); 66 } 67 } 68 | Popular Tags |