View Javadoc

    1   package org.codehaus.xfire.jaxb;
    2
    3   import javanet.staxutils.StAXSource;
    4
    5   import javax.xml.bind.JAXBContext;
    6   import javax.xml.bind.JAXBException;
    7   import javax.xml.bind.Marshaller;
    8   import javax.xml.bind.Unmarshaller;
    9   import javax.xml.namespace.QName;
    10  import javax.xml.stream.XMLStreamReader;
    11
    12  import org.codehaus.xfire.MessageContext;
    13  import org.codehaus.xfire.XFireRuntimeException;
    14  import org.codehaus.xfire.aegis.MessageReader;
    15  import org.codehaus.xfire.aegis.MessageWriter;
    16  import org.codehaus.xfire.aegis.stax.ElementReader;
    17  import org.codehaus.xfire.aegis.stax.ElementWriter;
    18  import org.codehaus.xfire.aegis.type.Type;
    19  import org.codehaus.xfire.fault.XFireFault;
    20
    21  public class JaxbType extends Type
    22  {
    23      private QName mySchemaType;
    24
    25      public JaxbType(Class clazz, JAXBContext jaxbContext)
    26      {
    27          mySchemaType = new JaxbIntrospector(jaxbContext).introspect(clazz);
    28          try
    29          {
    30              unmarshaller = jaxbContext.createUnmarshaller();
    31              unmarshaller.setValidating(false);
    32          } catch (JAXBException e)
    33          {
    34              throw new XFireRuntimeException("error creating unmarshaller", e);
    35          }
    36          try
    37          {
    38              marshaller = jaxbContext.createMarshaller();
    39          } catch (JAXBException e)
    40          {
    41              throw new XFireRuntimeException("error creating marshaller", e);
    42          }
    43      }
    44
    45      Unmarshaller unmarshaller;
    46      Marshaller marshaller;
    47
    48      public boolean isAbstract()
    49      {
    50          // right now we dont support abstract types
    51          return false;
    52      }
    53
    54      public boolean isComplex()
    55      {
    56          return true;
    57      }
    58
    59      public Object readObject(MessageReader reader, MessageContext context) throws XFireFault
    60      {
    61          try
    62          {
    63              XMLStreamReader xmlStreamReader = ((ElementReader) reader).getXMLStreamReader();
    64              System.out.println(xmlStreamReader.hasNext());
    65              StAXSource stAXSource = new StAXSource(xmlStreamReader);
    66              System.out.println(stAXSource.toString());
    67              return unmarshaller.unmarshal(stAXSource);
    68          } catch (Exception e)
    69          {
    70              e.printStackTrace();
    71              throw new XFireFault("Could not unmarshall type.", e, XFireFault.SENDER);
    72          }
    73      }
    74
    75      public void writeObject(Object object, MessageWriter writer, MessageContext context) throws XFireFault
    76      {
    77          try
    78          {
    79
    80              marshaller.marshal(object, new FilteringStaxResult(((ElementWriter) writer).getXMLStreamWriter()));
    81          } catch (JAXBException e)
    82          {
    83              throw new XFireFault("Could not marshall type.", e, XFireFault.RECEIVER);
    84          }
    85
    86      }
    87
    88      public QName getSchemaType()
    89      {
    90          return mySchemaType;
    91      }
    92
    93      public boolean isWriteOuter()
    94      {
    95          return false;
    96      }
    97  }