001    package biz.hammurapi.jms.adapter.converters;
002    
003    import java.io.StringReader;
004    import java.io.StringWriter;
005    import java.util.Map;
006    
007    import javax.jms.Message;
008    import javax.jms.Session;
009    import javax.jms.TextMessage;
010    import javax.xml.transform.Result;
011    import javax.xml.transform.Source;
012    import javax.xml.transform.Transformer;
013    import javax.xml.transform.dom.DOMSource;
014    import javax.xml.transform.stream.StreamResult;
015    import javax.xml.transform.stream.StreamSource;
016    
017    import org.apache.xmlbeans.XmlObject;
018    
019    import biz.hammurapi.jms.XmlBeansSaxResult;
020    
021    /**
022     * Uses XmlBeans to bind XML to Java
023     * @author Pavel
024     *
025     */
026    public class StylingXmlBeansConverter extends StylingXmlConverter {
027            
028            /**
029             * Request must be XmlObject or Invocation.
030             */
031            protected Source convert(Object request) throws Exception {
032                    StringWriter sw = new StringWriter();
033                    ((XmlObject) request).save(sw);
034                    sw.close();
035                    return new StreamSource(new StringReader(sw.toString()));
036            }
037    
038            /**
039             * Creates stream result backed by string writer.
040             */
041            protected Result createResult() {
042                    return new XmlBeansSaxResult();
043            }
044    
045            /**
046             * Parses result to an instance of XmlObject.
047             */
048            protected Object processResult(Result result) throws Exception {
049                    return ((XmlBeansSaxResult) result).getObject();
050            }
051    
052            /**
053             * This method serializes exception using XML Beans and schema defined in <code>http://www.hammurapi.biz/invocation namespace</code>, file <code>invocation.xsd</code>
054             * This method supports <code>error-style</code> optional property - URL of stylesheet to apply after Exception -&gt; Conversion.
055             * If URL starts with <code>resource:</code> then it is loaded from classloader resource.</LI>
056             * This implementation uses ThrowableSerializer to convert exception to XML.
057             * Correlates by message ID.
058             */
059            public Message convert(Exception ex, Session session, Map properties, Message request) throws Exception {
060                    biz.hammurapi.invocation.ExceptionDocument doc = biz.hammurapi.invocation.ExceptionDocument.Factory.newInstance(); 
061                    biz.hammurapi.invocation.Exception xex = doc.addNewException();
062                    XmlBeansConverter.exceptionToXml(ex, xex);
063                                    
064                    StringWriter sw = new StringWriter();
065                    Transformer transformer = getTransformer((String) properties.get("error-style")); 
066                    if (transformer==null) {
067                            doc.save(sw);
068                    } else {
069                            transformer.transform(new DOMSource(doc.getDomNode()), new StreamResult(sw));
070                    }
071                    sw.close();
072                    
073                    TextMessage ret = session.createTextMessage();
074                    ret.setText(sw.toString());
075                    if (request!=null) {
076                            ret.setJMSCorrelationID(request.getJMSMessageID());
077                    }
078                    return ret;
079            }
080            
081    }