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