/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.axis2.jaxws.sample.headershandler; import java.util.List; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPFactory; import javax.xml.ws.WebServiceException; import javax.xml.ws.handler.MessageContext; import org.apache.axis2.jaxws.Constants; import org.apache.axis2.jaxws.api.MessageAccessor; public class TestHeaders { /* * These are just some standard small SOAP headers to be used by the the HeadersHandler sample app and handlers * * If more strenuous tests are required, such as a very large header, or some non-XML-safe strings, they can be * added here. The purpose of having these constants is so multiple handlers can use the constant to add/remove/manipulate * headers without hard-coding the data. * */ private static String LARGE_STRING = ""; static { // 100k string for (int i = 0; i < 10000; i++) { LARGE_STRING += "LongString"; // 10 chars * Integer.MAX_VALUE is pretty big. } } // app client outbound header 1 (ACOH1) private static final String identifierACOH1 = "acoh1"; private static final String identifierACOH1namespaceURI = "http://"+identifierACOH1+"ns"; private static final String identifierACOH1prefix = identifierACOH1+"pre"; public static final QName ACOH1_HEADER_QNAME = new QName(identifierACOH1namespaceURI, identifierACOH1, identifierACOH1prefix); // app client outbound header 2 (ACOH2) private static final String identifierACOH2 = "acoh2"; private static final String identifierACOH2namespaceURI = "http://"+identifierACOH2+"ns"; private static final String identifierACOH2prefix = identifierACOH2+"pre"; public static final QName ACOH2_HEADER_QNAME = new QName(identifierACOH2namespaceURI, identifierACOH2, identifierACOH2prefix); // app client outbound header 3 (ACOH3) private static final String identifierACOH3 = "acoh3"; private static final String identifierACOH3namespaceURI = "http://"+identifierACOH3+"ns"; private static final String identifierACOH3prefix = identifierACOH3+"pre"; public static final QName ACOH3_HEADER_QNAME = new QName(identifierACOH3namespaceURI, identifierACOH3, identifierACOH3prefix); // app client outbound header 4 (ACOH4) private static final String identifierACOH4 = "acoh4"; private static final String identifierACOH4namespaceURI = "http://"+identifierACOH4+"ns"; private static final String identifierACOH4prefix = identifierACOH4+"pre"; public static final QName ACOH4_HEADER_QNAME = new QName(identifierACOH4namespaceURI, identifierACOH4, identifierACOH4prefix); // client outbound soap handler 1 (COSH1) private static final String identifierCOSH1 = "cosh1"; private static final String identifierCOSH1namespaceURI = "http://"+identifierCOSH1+"ns"; private static final String identifierCOSH1prefix = identifierCOSH1+"pre"; public static final QName COSH1_HEADER_QNAME = new QName(identifierCOSH1namespaceURI, identifierCOSH1, identifierCOSH1prefix); // some content public static final String CONTENT_SMALL1 = "small content 1"; public static final String CONTENT_SMALL2 = "small content 2"; public static final String CONTENT_SMALL3 = "small content 3"; public static final String CONTENT_SMALL4 = "small content 4"; public static final String CONTENT_SMALL5 = "small content 5"; public static final String CONTENT_SMALL6 = "small content 6"; public static final String CONTENT_LARGE = LARGE_STRING; public static final String CONTENT_OTHER = "other content"; private String className = ""; /** * * @param clazz the currently executing handler class */ public TestHeaders(Class<?> clazz) { className = clazz.getSimpleName(); } /** * Utility method so handlers can easily confirm the map of headers under the message context is as expected. * * @param className - for logging purposes, pass the name of the handler class currently executing * @param key - for logging purposes, pass the key of the list - Constants.JAXWS_INBOUND_SOAP_HEADERS or Constants.JAXWS_OUTBOUND_SOAP_HEADERS * @param list - the list itself * @param expectedSize - the expected size of the map being passed * @throws Exception */ public void confirmHeadersAdapterList(String key, Map<QName, List<String>> map, int expectedSize) throws WebServiceException { if (map == null) { throw new WebServiceException(className + ": Expected to find JAXWS SOAP Headers by way of SOAPMessageContext.get(" + key+"), but none was found. This probably means something is" + " wrong with the way SOAPHeadersAdapter is \"installed\" or used."); } else if (map.size() != expectedSize) { throw new WebServiceException(className + ": List of requestHeaders does not match expected size of "+expectedSize+". " + "Actual size was " + map.size() + ". This probably means something is wrong with the way SOAPHeadersAdapter " + "is \"installed\" or used."); } } /** * Utility method so handlers can easily confirm the list of headers under a given QName is as expected. * * @param className - for logging purposes, pass the name of the handler class currently executing * @param qnameKeyForList - for logging purposes, pass the QName key of the list * @param list - the list itself * @param expectedSize - the expected size of the list being passed * @throws Exception */ public void confirmList(QName qnameKeyForList, List<String> list, int expectedSize) throws WebServiceException { if (list == null) { throw new WebServiceException(className + ": List of headers under QName " + qnameKeyForList + " is missing."); } else if (list.size() != expectedSize) { throw new WebServiceException(className + ": List of headers under QName " + qnameKeyForList + " expected size " + "was " + expectedSize + ", but actual size was " + list.size() + "."); } } public void compareHeaderStrings(String xmlHeader1, String xmlHeader2) throws WebServiceException { if ((xmlHeader1 == null) || (xmlHeader2 == null) || (!xmlHeader1.equals(xmlHeader2))) { throw new WebServiceException(className + ": Expected outbound header element was not found."); } } // callers should use the QName objects and CONTENT_* Strings defined in this class as params public static String createHeaderXMLString(QName qname, String textContent) throws WebServiceException { try { SOAPFactory sf = SOAPFactory.newInstance(); SOAPElement e = sf.createElement(qname); e.addTextNode(textContent); return e.toString(); } catch (SOAPException e) { throw new WebServiceException(e); } } // callers should use the QName objects and CONTENT_* Strings defined in this class as params public static SOAPElement createHeaderSOAPElement(QName qname, String textContent) throws WebServiceException { try { SOAPFactory sf = SOAPFactory.newInstance(); SOAPElement e = sf.createElement(qname); e.addTextNode(textContent); return e; } catch (SOAPException e) { throw new WebServiceException(e); } } /** * Throw an exception if the jaxws.message.as.string property fails. * @param mc */ public void confirmMessageAsString(MessageContext mc) { String text = null; if (mc != null) { MessageAccessor accessor = (MessageAccessor) mc.get(Constants.JAXWS_MESSAGE_ACCESSOR); if (accessor != null) { Boolean preMessageAccessed = (Boolean) mc.get("jaxws.isMessageAccessed"); text = accessor.getMessageAsString(); Boolean postMessageAccessed = (Boolean) mc.get("jaxws.isMessageAccessed"); if (preMessageAccessed != postMessageAccessed) { throw new WebServiceException("The message was accessed when toString was called."); } if (!text.contains("Envelope") || !text.contains("Body")) { throw new WebServiceException("The message appears to be invalid: " + text); } return; } } throw new WebServiceException("Could not access the MessageAccessor: " + mc); } }