<!---
	SOAP header functions for ColdFusion MX CFCs.

	To be used from CFCs:
	 getRequestHeader - retrieves the value of a header from a request
	 addResponseHeader - sets a header in the response
	 IsViaSOAP - returns TRUE if the CFC has been invoked as a web service

	To be used from web service client code:
	 addRequestHeader - sets a header in a request, used before cfinvoke
	 getResponseHeader - retrieves a header after invoking a web service
--->

<!------------------------------------------------------------------------------->
<!---  getRequestHeader
	   - retrieve a header value from a request, used from within a CFC
	   - returns the string "NOT FOUND" if header doesn't exist.
	   
	   Sample usage:
	    <cfset value = getRequestHeader("myheader", "http://my.namespace.org/headers")>
--->
<cffunction name="getRequestHeader" Output="no">
	<cfargument name="headerName" type="string" required="true">
    <cfargument name="headerNamespace" type="string" default="" required="false">

	<cfscript>
	  // Get current message context
	  ctx = CreateObject("java", "org.apache.axis.MessageContext").getCurrentContext();
  
	  // Get SOAP envelope of request
	  env = ctx.getRequestMessage().getSOAPEnvelope();

	  // Get Header
	  soapHeaderElement = env.getHeaderByName(headerNamespace, headerName);
	  
	  // Get value of header, could be a complex type!
	  try {
	    value = soapHeaderElement.getObjectValue();		// Object of whatever type the header is
	  } catch (Any ex) {
	    return "NOT FOUND";		// ERROR - header not found
	  }

	  // Get other stuff from header element
	  mustunderstand = soapHeaderElement.mustUnderstand;	// boolean
	  HeaderAsDocument = soapHeaderElement.getAsDocument(); // XML Document type
	  HeaderAsElement = soapHeaderElement.getAsDOM();		// XML Element type
	  HeaderXMLString = soapHeaderElement.toString();		// all header XML as string
	  HeaderAsCFXML = XmlParse(HeaderXMLString);			// CFML XML object
	</cfscript>

	<!--- Return the value --->
	<cfreturn value>
</cffunction>

<!------------------------------------------------------------------------------->
<!---  addResponseHeader
       - Add a SOAP Header to a request, used from within a CFC
		 
		 Sample usage:
		  addResponseHeader("myheader", "header-value", "http://my.namespace.org/headers", false)
--->
<cffunction name="addResponseHeader" Output="no">
    <cfargument name="headerName" type="string" required="true">
    <cfargument name="headerValue" type="string" required="true">
    <cfargument name="headerNamespace" type="string" default="" required="false">
    <cfargument name="mustUnderstand" type="boolean" default="false" required="false">
    <cfscript>
		// Get current message context
		ctx = createObject("java", "org.apache.axis.MessageContext").getCurrentContext();
		
		// Get SOAP envelope or response
		env = ctx.getResponseMessage().getSOAPEnvelope();
		
		// Create SOAP header object
        headerElement = createObject("java", "org.apache.axis.message.SOAPHeaderElement");
        headerElement.init(headerNamespace, headerName, headerValue);
        headerElement.setMustUnderstand(mustUnderstand);
		
		// Add the header to the envelope of response message
        env.addHeader(headerElement);
    </cfscript>
</cffunction>

<!------------------------------------------------------------------------------->
<!--- IsViaSOAP
	  - Determine if a CFC was invoked as a web service
	  
  Sample Usage:
	<cfif IsViaSOAP()>
		<cfset value = getSOAPHeader("myHeader")>
		<cfset tmp = addSOAPHeader("MyReturnHeader", "value")>
		<cfset return = "The header value was: " & value>
	<cfelse>
		<cfset return = "Not invoked as a web service">
	</cfif>
--->
<cffunction name="IsViaSOAP" returnType="boolean" Output="no">
	<cfscript>
		// assume true
		result = true;
		// Get current message context
		ctx = CreateObject("java", "org.apache.axis.MessageContext").getCurrentContext();
		// invoke (cheap) method to see if it is null
		try { client=ctx.isClient(); } catch(Any ex) { result = false; }
		// return result
		return result;
	</cfscript>
</cffunction>
 
<!------------------------------------------------------------------------------->
<!---  addRequestHeader
       - Add a SOAP Header to a request, used by consumers of a web service
	     before a CFINVOKE
		 
		 Sample usage:
		    ws = CreateObject("webservice", "http://myhost/service.cfc?WSDL");
 			addHeader(ws, "HeaderName", "HeaderValue");
--->
<cffunction name="addRequestHeader" Output="no">
    <cfargument name="webService" required="true">
    <cfargument name="headerName" type="string" required="true">
    <cfargument name="headerValue" type="string" required="true">
    <cfargument name="headerNamespace" type="string" default="" required="false">
    <cfargument name="mustUnderstand" type="boolean" default="false" required="false">
	<cfscript>
		if (mustUnderstand IS FALSE) {
			// Simple
			webservice.setHeader(headerNamespace, headerName, headerValue);
		} else {
			// Create SOAP header object so we can set mustUnderstand
	    	headerElement = createObject("java", "org.apache.axis.message.SOAPHeaderElement");
		    headerElement.init(headerNamespace, headerName, headerValue);
		    headerElement.setMustUnderstand(mustUnderstand);
			
			// This is what we want to do, but CFMX6.1 has a bug so this wont work
			// without a patch to CFMX 6.1
			webservice.setHeader(headerElement);
		}
	</cfscript>
</cffunction>

<!------------------------------------------------------------------------------->
<!---  getResponseHeader
	   - Retrieve a header value from a response, after invoking the service
	   - returns the string "NOT FOUND" if header doesn't exist.
	   
	   NOTE: Requires axis.jar (in webservices.jar) to be updated with a version 
	   of Apache Axis built after August 15, 2003.  This is post version 1.1.
	   
	   Sample usage:
	    <cfset value = getResponseHeader("myheader", "http://my.namespace.org/headers")>
--->
<cffunction name="getResponseHeader" Output="no">
    <cfargument name="webService" required="true">
	<cfargument name="headerName" type="string" required="true">
    <cfargument name="headerNamespace" type="string" default="" required="false">

 <cfscript>
	  // Get Header
	  soapHeaderElement = webservice.getResponseHeader(headerNamespace, headerName);
	  
	  // Get value of header, could be a complex type!
	  try {
	    value = soapHeaderElement.getObjectValue();		// Object of whatever type the header is
	  } catch (Any ex) {
	    return "NOT FOUND";		// ERROR - header not found
	  }

	  // Get other stuff from header element
	  mustunderstand = soapHeaderElement.mustUnderstand;	// boolean
	  HeaderAsDocument = soapHeaderElement.getAsDocument(); // XML Document type
	  HeaderAsElement = soapHeaderElement.getAsDOM();		// XML Element type
	  HeaderXMLString = soapHeaderElement.toString();		// all header XML as string
	  HeaderAsCFXML = XmlParse(HeaderXMLString);			// CFML XML object
	  
	  return value;
 </cfscript>
</cffunction>
