/* * 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.Constants; 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 "echoMeString" 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 echoHeaderStringHandler extends BasicHandler { static Log log = LogFactory.getLog(echoHeaderStringHandler.class.getName()); public static final String ECHOHEADER_STRING_ID = "echoHeaderStringHandler.id"; public static final String HEADER_NS = "http://soapinterop.org/echoheader/"; public static final String HEADER_REQNAME = "echoMeStringRequest"; public static final String HEADER_RESNAME = "echoMeStringResponse"; public static final String ACTOR_NEXT = "http://schemas.xmlsoap.org/soap/actor/next"; 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 String strVal = (String)context.getProperty(ECHOHEADER_STRING_ID); if (strVal == null) return; Message msg = context.getResponseMessage(); if (msg == null) return; SOAPEnvelope env = msg.getSOAPEnvelope(); SOAPHeaderElement header = new SOAPHeaderElement(HEADER_NS, HEADER_RESNAME, strVal); 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 String strVal ; // header.getValue() doesn't seem to be connected to anything // we always get null. try { strVal = (String)header.getValueAsType(Constants.XSD_STRING); } catch (Exception e) { throw AxisFault.makeFault(e); } context.setProperty(ECHOHEADER_STRING_ID, strVal) ; header.setProcessed(true); } } } }