| /* |
| * 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); |
| } |
| } |
| } |
| } |