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