/* * 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 org.apache.axis.message; import org.apache.axis.AxisFault; import org.apache.axis.Constants; import org.apache.axis.encoding.DeserializationContext; import org.apache.axis.encoding.SerializationContext; import org.apache.axis.soap.SOAPConstants; import org.apache.axis.utils.Messages; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.xml.sax.Attributes; import javax.xml.namespace.QName; import javax.xml.soap.Name; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPException; /** * A simple header element abstraction. Extends MessageElement with * header-specific stuff like mustUnderstand, actor, and a 'processed' flag. * * @author Glen Daniels (gdaniels@apache.org) * @author Glyn Normington (glyn@apache.org) */ public class SOAPHeaderElement extends MessageElement implements javax.xml.soap.SOAPHeaderElement { protected boolean processed = false; protected String actor = "http://schemas.xmlsoap.org/soap/actor/next"; protected boolean mustUnderstand = false; protected boolean relay = false; public SOAPHeaderElement(String namespace, String localPart) { super(namespace, localPart); } public SOAPHeaderElement(Name name) { super(name); } public SOAPHeaderElement(QName qname) { super(qname); } public SOAPHeaderElement(String namespace, String localPart, Object value) { super(namespace, localPart, value); } public SOAPHeaderElement(QName qname, Object value) { super(qname, value); } public SOAPHeaderElement(Element elem) { super(elem); // FIXME : This needs to come from someplace reasonable, perhaps // TLS (SOAPConstants.getCurrentVersion() ?) SOAPConstants soapConstants = getSOAPConstants(); String val = elem.getAttributeNS(soapConstants.getEnvelopeURI(), Constants.ATTR_MUST_UNDERSTAND); try { setMustUnderstandFromString(val, (soapConstants == SOAPConstants.SOAP12_CONSTANTS)); } catch (AxisFault axisFault) { // Log the bad MU value, since this constructor can't throw log.error(axisFault); } QName roleQName = soapConstants.getRoleAttributeQName(); actor = elem.getAttributeNS(roleQName.getNamespaceURI(), roleQName.getLocalPart()); // if (actor == null) { // actor = ""; // } if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { String relayVal = elem.getAttributeNS(soapConstants.getEnvelopeURI(), Constants.ATTR_RELAY); relay = ((relayVal != null) && (relayVal.equals("true") || relayVal.equals("1"))) ? true : false; } } public void setParentElement(SOAPElement parent) throws SOAPException { if(parent == null) { throw new IllegalArgumentException(Messages.getMessage("nullParent00")); } // migration aid if (parent instanceof SOAPEnvelope) { log.warn(Messages.getMessage("bodyHeaderParent")); parent = ((SOAPEnvelope)parent).getHeader(); } if (!(parent instanceof SOAPHeader)) { throw new IllegalArgumentException(Messages.getMessage("illegalArgumentException00")); } super.setParentElement(parent); } public SOAPHeaderElement(String namespace, String localPart, String prefix, Attributes attributes, DeserializationContext context) throws AxisFault { super(namespace, localPart, prefix, attributes, context); SOAPConstants soapConstants = getSOAPConstants(); // Check for mustUnderstand String val = attributes.getValue(soapConstants.getEnvelopeURI(), Constants.ATTR_MUST_UNDERSTAND); setMustUnderstandFromString(val, (soapConstants == SOAPConstants.SOAP12_CONSTANTS)); QName roleQName = soapConstants.getRoleAttributeQName(); actor = attributes.getValue(roleQName.getNamespaceURI(), roleQName.getLocalPart()); // if (actor == null) { // actor = ""; // } if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { String relayVal = attributes.getValue(soapConstants.getEnvelopeURI(), Constants.ATTR_RELAY); relay = ((relayVal != null) && (relayVal.equals("true") || relayVal.equals("1"))) ? true : false; } processed = false; alreadySerialized = true; } private void setMustUnderstandFromString(String val, boolean isSOAP12) throws AxisFault { if (val != null && val.length() > 0) { if ("0".equals(val)) { mustUnderstand = false; } else if ("1".equals(val)) { mustUnderstand = true; } else if (isSOAP12) { if ("true".equalsIgnoreCase(val)) { mustUnderstand = true; } else if ("false".equalsIgnoreCase(val)) { mustUnderstand = false; } else { throw new AxisFault( Messages.getMessage("badMUVal", val, new QName(namespaceURI, name).toString())); } } else { throw new AxisFault( Messages.getMessage("badMUVal", val, new QName(namespaceURI, name).toString())); } } } public boolean getMustUnderstand() { return( mustUnderstand ); } public void setMustUnderstand(boolean b) { mustUnderstand = b ; } public String getActor() { return( actor ); } public void setActor(String a) { actor = a ; } public String getRole() { return( actor ); } public void setRole(String a) { actor = a ; } public boolean getRelay() { return relay; } public void setRelay(boolean relay) { this.relay = relay; } public void setProcessed(boolean value) { processed = value ; } public boolean isProcessed() { return( processed ); } boolean alreadySerialized = false; /** Subclasses can override */ protected void outputImpl(SerializationContext context) throws Exception { if (!alreadySerialized) { SOAPConstants soapVer = getSOAPConstants(); QName roleQName = soapVer.getRoleAttributeQName(); if (actor != null) { setAttribute(roleQName.getNamespaceURI(), roleQName.getLocalPart(), actor); } String val; if (context.getMessageContext() != null && context.getMessageContext().getSOAPConstants() == SOAPConstants.SOAP12_CONSTANTS) val = mustUnderstand ? "true" : "false"; else val = mustUnderstand ? "1" : "0"; setAttribute(soapVer.getEnvelopeURI(), Constants.ATTR_MUST_UNDERSTAND, val); if (soapVer == SOAPConstants.SOAP12_CONSTANTS && relay) { setAttribute(soapVer.getEnvelopeURI(), Constants.ATTR_RELAY, "true"); } } super.outputImpl(context); } public NamedNodeMap getAttributes() { makeAttributesEditable(); SOAPConstants soapConstants = getSOAPConstants(); String mustUnderstand = attributes.getValue(soapConstants.getEnvelopeURI(), Constants.ATTR_MUST_UNDERSTAND); QName roleQName = soapConstants.getRoleAttributeQName(); String actor = attributes.getValue(roleQName.getNamespaceURI(),roleQName.getLocalPart()); if(mustUnderstand == null){ if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { setAttributeNS(soapConstants.getEnvelopeURI(), Constants.ATTR_MUST_UNDERSTAND,"false"); } else { setAttributeNS(soapConstants.getEnvelopeURI(), Constants.ATTR_MUST_UNDERSTAND,"0"); } } if(actor == null){ setAttributeNS(roleQName.getNamespaceURI(), roleQName.getLocalPart(), this.actor); } return super.getAttributes(); } private SOAPConstants getSOAPConstants() { SOAPConstants soapConstants = null; if (context != null) { return context.getSOAPConstants(); } if (getNamespaceURI() != null && getNamespaceURI().equals(SOAPConstants.SOAP12_CONSTANTS.getEnvelopeURI())) { soapConstants = SOAPConstants.SOAP12_CONSTANTS; } if (soapConstants == null && getEnvelope() != null) { soapConstants = getEnvelope().getSOAPConstants(); } if (soapConstants == null) { soapConstants = SOAPConstants.SOAP11_CONSTANTS; } return soapConstants; } }