/* * Copyright 2001-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package samples.echo; import org.apache.axis.AxisFault; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.components.logger.LogFactory; import org.apache.axis.handlers.BasicHandler; import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.message.SOAPHeaderElement; import org.apache.axis.utils.Messages; import org.apache.commons.logging.Log; import javax.xml.namespace.QName; /** This handler processes the SOAP header "echoMeStruct" defined in the * SOAPBuilder Round2C interop tests. * * <p>Essentially, you install it on both the request and response chains of * your service, on the server side.</p> * * @author Simon Fell (simon@zaks.demon.co.uk) */ public class echoHeaderStructHandler extends BasicHandler { static Log log = LogFactory.getLog(echoHeaderStringHandler.class.getName()); public static final String ECHOHEADER_STRUCT_ID = "echoHeaderStructHandler.id"; public static final String HEADER_NS = "http://soapinterop.org/echoheader/"; public static final String HEADER_REQNAME = "echoMeStructRequest"; public static final String HEADER_RESNAME = "echoMeStructResponse"; public static final String ACTOR_NEXT = "http://schemas.xmlsoap.org/soap/actor/next"; public static final String STRUCT_NS = "http://soapinterop.org/xsd" ; public static final String STRUCT_NAME = "SOAPStruct"; public static final QName SOAPStructType = new QName(STRUCT_NS, STRUCT_NAME); public boolean canHandleBlock(QName qname) { if (HEADER_NS.equals(qname.getNamespaceURI()) && HEADER_REQNAME.equals(qname.getLocalPart())) { return true; } return false; } /** * Process a MessageContext. */ public void invoke(MessageContext context) throws AxisFault { if (context.getPastPivot()) { // This is a response. Add the response header, if we saw // the requestHeader SOAPStruct hdrVal= (SOAPStruct)context.getProperty(ECHOHEADER_STRUCT_ID); if (hdrVal == null) return; Message msg = context.getResponseMessage(); if (msg == null) return; SOAPEnvelope env = msg.getSOAPEnvelope(); SOAPHeaderElement header = new SOAPHeaderElement(HEADER_NS, HEADER_RESNAME, hdrVal); env.addHeader(header); } else { // Request. look for the header Message msg = context.getRequestMessage(); if (msg == null) throw new AxisFault(Messages.getMessage("noRequest00")); SOAPEnvelope env = msg.getSOAPEnvelope(); SOAPHeaderElement header = env.getHeaderByName(HEADER_NS, HEADER_REQNAME); if (header != null) { // seems Axis has already ignored any headers not tageted // at us SOAPStruct hdrVal ; // header.getValue() doesn't seem to be connected to anything // we always get null. try { hdrVal = (SOAPStruct)header.getValueAsType(SOAPStructType); } catch (Exception e) { throw AxisFault.makeFault(e); } context.setProperty(ECHOHEADER_STRUCT_ID, hdrVal) ; header.setProcessed(true); } } } }