1
2
3
4
5
6
7
8
9
10
11 package org.mule.providers.oracle.jms.transformers;
12
13 import org.mule.config.i18n.MessageFactory;
14 import org.mule.providers.jms.JmsConnector;
15 import org.mule.providers.oracle.jms.OracleJmsConnector;
16 import org.mule.transformers.AbstractEventAwareTransformer;
17 import org.mule.umo.UMOEventContext;
18 import org.mule.umo.transformer.TransformerException;
19 import org.mule.util.StringMessageUtils;
20
21 import java.io.IOException;
22 import java.io.Writer;
23 import java.sql.SQLException;
24
25 import javax.jms.JMSException;
26 import javax.jms.Session;
27
28 import oracle.jms.AQjmsSession;
29 import oracle.jms.AdtMessage;
30 import oracle.sql.CLOB;
31 import oracle.xdb.XMLType;
32
33
34
35
36
37
38
39
40
41 public class StringToXMLMessage extends AbstractEventAwareTransformer
42 {
43 public StringToXMLMessage()
44 {
45 super();
46 registerSourceType(String.class);
47 registerSourceType(byte[].class);
48 setReturnClass(AdtMessage.class);
49 }
50
51
52
53
54
55 public Object transform(Object src, String encoding, UMOEventContext context) throws TransformerException
56 {
57 Session session;
58 AdtMessage message;
59 XMLType xmltype;
60
61 try
62 {
63
64 if (endpoint.getTransactionConfig().isTransacted() == false)
65 {
66
67
68
69 throw new TransformerException(MessageFactory.createStaticMessage("This transformer may only be used with a transacted endpoint. Refer to http://mule.codehaus.org/display/MULE/Transaction+Management for more information."), this);
70 }
71 session = ((JmsConnector) endpoint.getConnector()).getSessionFromTransaction();
72 if (session == null) {
73 throw new TransformerException(MessageFactory.createStaticMessage("No JMS session associated with this endpoint."), this);
74 }
75 if ((session instanceof AQjmsSession) == false) {
76 throw new TransformerException(MessageFactory.createStaticMessage("Endpoint must be an OracleAQ session."), this);
77 }
78
79
80 String xml;
81 if (src instanceof byte[]) {
82 xml = new String((byte[]) src, encoding);
83 }
84 else if (src instanceof String) {
85 xml = (String) src;
86 }
87 else throw new TransformerException(MessageFactory.createStaticMessage("Object to transform is not one of the supported types for this transformer."), this);
88
89 logger.debug("Creating an Oracle XMLType based on the following XML:\n" + StringMessageUtils.truncate(xml, 200, false));
90
91
92
93
94
95 CLOB clob = CLOB.createTemporary(((AQjmsSession) session).getDBConnection(), true, CLOB.DURATION_SESSION);
96 try {
97 Writer clobStream = clob.getCharacterOutputStream();
98 try {
99 clobStream.write(xml);
100 } finally {
101 clobStream.close();
102 }
103 xmltype = XMLType.createXML(((AQjmsSession) session).getDBConnection(), clob);
104
105
106 message = ((AQjmsSession) session).createAdtMessage();
107 message.setAdtPayload(xmltype);
108 return message;
109 } finally {
110
111
112 }
113 }
114 catch (JMSException e) { throw new TransformerException(this, e); }
115 catch (SQLException e) { throw new TransformerException(this, e); }
116 catch (IOException e) { throw new TransformerException(this, e); }
117 }
118 }