001    package railo.runtime.net.rpc;
002    
003    import java.io.StringReader;
004    
005    import org.apache.axis.AxisFault;
006    import org.apache.axis.MessageContext;
007    import org.apache.axis.client.Call;
008    import org.apache.axis.message.SOAPEnvelope;
009    import org.apache.axis.message.SOAPHeaderElement;
010    import org.w3c.dom.Element;
011    import org.w3c.dom.Node;
012    import org.xml.sax.InputSource;
013    
014    import railo.runtime.PageContext;
015    import railo.runtime.net.rpc.client.RPCClient;
016    import railo.runtime.text.xml.XMLCaster;
017    import railo.runtime.text.xml.XMLUtil;
018    
019    public class AxisUtil {
020    
021            public static boolean isSOAPRequest() {
022                    MessageContext context = MessageContext.getCurrentContext();
023            return context != null && !context.isClient();
024            }
025            
026            public static Object getSOAPRequestHeader(PageContext pc, String namespace, String name, boolean asXML) throws Exception {
027                    MessageContext context = MessageContext.getCurrentContext();
028            if(context==null || context.isClient()) throw new AxisFault("not inside a Soap Request");
029            
030            SOAPEnvelope env = context.getRequestMessage().getSOAPEnvelope();
031            SOAPHeaderElement header = env.getHeaderByName(namespace, name);
032            return toValue(header,asXML);
033            }
034    
035            public static Object getSOAPResponseHeader(PageContext pc, RPCClient client, String namespace, String name, boolean asXML) throws Exception {
036                    MessageContext context = getMessageContext(client);
037                
038                    SOAPEnvelope env = context.getResponseMessage().getSOAPEnvelope();
039                SOAPHeaderElement header = env.getHeaderByName(namespace, name);
040                return toValue(header,asXML);
041            }
042            
043            public static Node getSOAPRequest(RPCClient client) throws Exception {
044                    MessageContext context=getMessageContext(client);
045            SOAPEnvelope env = context.getRequestMessage().getSOAPEnvelope();
046            return XMLCaster.toXMLStruct(env.getAsDocument(),true);
047        }
048            
049            public static Node getSOAPResponse(RPCClient client) throws Exception {
050                    Call call = client.getLastCall();
051                    if(call==null) throw new AxisFault("web service was not invoked yet");
052            SOAPEnvelope env = call.getResponseMessage().getSOAPEnvelope();
053                    return XMLCaster.toXMLStruct(env.getAsDocument(),true);
054        }
055            
056            public static void addSOAPResponseHeader(String namespace, String name, Object value, boolean mustUnderstand) throws AxisFault {
057            MessageContext context = MessageContext.getCurrentContext();
058            if(context==null || context.isClient()) throw new AxisFault("not inside a Soap Request");
059            
060            SOAPEnvelope env = context.getResponseMessage().getSOAPEnvelope();
061            SOAPHeaderElement header=toSOAPHeaderElement(namespace,name,value);
062            header.setMustUnderstand(mustUnderstand);
063            env.addHeader(header);
064        }
065    
066            public static void addSOAPRequestHeader(RPCClient client, String namespace, String name, Object value, boolean mustUnderstand) throws AxisFault {
067            SOAPHeaderElement header=toSOAPHeaderElement(namespace,name,value);
068            header.setMustUnderstand(mustUnderstand);
069            client.addHeader(header);
070        }
071            
072            
073            private static SOAPHeaderElement toSOAPHeaderElement(String namespace, String name, Object value) {
074                    Element el=XMLCaster.toRawElement(value,null);
075            if(el!=null) return new SOAPHeaderElement(el);
076            else return new SOAPHeaderElement(namespace, name, value);
077            }
078    
079    
080            
081            private static Object toValue(SOAPHeaderElement header, boolean asXML) throws Exception {
082                    if(header==null) return "";
083            if(asXML) {
084                    String strXML = header.toString();
085                            InputSource is = new InputSource(new StringReader(strXML.trim()));
086                            return XMLCaster.toXMLStruct(XMLUtil.parse(is,null,false),true);
087            } 
088            
089            Object value=header.getObjectValue();
090            if(value == null){
091                    value = header.getObjectValue(String.class);
092            }
093            return value;
094            }
095            
096    
097            
098            private static MessageContext getMessageContext(RPCClient client) throws AxisFault {
099                    if(client!=null) {
100                            Call call = client.getLastCall();
101                    if(call==null) throw new AxisFault("web service was not invoked yet");
102                    return call.getMessageContext();
103            } 
104            MessageContext context = MessageContext.getCurrentContext();
105            if(context == null) throw new AxisFault("not inside a Soap Request");
106            return context;
107            }
108            
109            
110    }