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 -> 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 }