View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.module.xml.transformer;
8   
9   import org.mule.api.MuleMessage;
10  import org.mule.api.transformer.TransformerException;
11  import org.mule.transformer.types.DataTypeFactory;
12  import org.mule.util.store.DeserializationPostInitialisable;
13  
14  import java.io.ByteArrayInputStream;
15  import java.io.IOException;
16  import java.io.InputStream;
17  import java.io.InputStreamReader;
18  import java.io.Reader;
19  import java.io.UnsupportedEncodingException;
20  
21  /**
22   * <code>XmlToObject</code> converts xml created by the ObjectToXml transformer in to a
23   * java object graph. This transformer uses XStream. Xstream uses some clever tricks so
24   * objects that get marshalled to XML do not need to implement any interfaces including
25   * Serializable and you don't even need to specify a default constructor.
26   *
27   * @see ObjectToXml
28   */
29  
30  public class XmlToObject extends AbstractXStreamTransformer
31  {
32  
33      private final DomDocumentToXml domTransformer = new DomDocumentToXml();
34  
35      public XmlToObject()
36      {
37          registerSourceType(DataTypeFactory.STRING);
38          registerSourceType(DataTypeFactory.BYTE_ARRAY);
39          registerSourceType(DataTypeFactory.INPUT_STREAM);
40          registerSourceType(DataTypeFactory.create(org.w3c.dom.Document.class));
41          registerSourceType(DataTypeFactory.create(org.dom4j.Document.class));
42          setReturnDataType(DataTypeFactory.OBJECT);
43      }
44  
45      @Override
46      public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException
47      {
48          Object src = message.getPayload();
49          Object result;
50          if (src instanceof byte[])
51          {
52              try
53              {
54                  Reader xml = new InputStreamReader(new ByteArrayInputStream((byte[]) src), outputEncoding);
55                  result = getXStream().fromXML(xml);
56              }
57              catch (UnsupportedEncodingException e)
58              {
59                  throw new TransformerException(this, e);
60              }
61          }
62          else if (src instanceof InputStream)
63          {
64              InputStream input = (InputStream) src;
65              try
66              {
67                  Reader xml = new InputStreamReader(input, outputEncoding);
68                  result = getXStream().fromXML(xml);
69              }
70              catch (Exception e)
71              {
72                  throw new TransformerException(this, e);
73              }
74              finally
75              {
76                  try
77                  {
78                      input.close();
79                  }
80                  catch (IOException e)
81                  {
82                      logger.warn("Exception closing stream: ", e);
83                  }
84              }
85          }
86          else if (src instanceof String)
87          {
88              result = getXStream().fromXML(src.toString());
89          }
90          else
91          {
92              result = getXStream().fromXML((String) domTransformer.transform(src));
93          }
94  
95          try
96          {
97              postDeserialisationInit(result);
98              return result;
99          }
100         catch (Exception e)
101         {
102             throw new TransformerException(this, e);
103         }
104     }
105 
106     protected void postDeserialisationInit(final Object object) throws Exception
107     {
108         if (object instanceof DeserializationPostInitialisable)
109         {
110             DeserializationPostInitialisable.Implementation.init(object, muleContext);
111         }
112     }
113 
114 }