/* * 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.description; import org.apache.axis2.AxisFault; import org.apache.axis2.description.java2wsdl.Java2WSDLConstants; import org.apache.axis2.engine.AxisConfiguration; import org.apache.axis2.engine.Handler; import org.apache.axis2.phaseresolver.PhaseResolver; import org.apache.axis2.util.PolicyUtil; import org.apache.axis2.wsdl.SOAPHeaderMessage; import org.apache.neethi.Policy; import org.apache.neethi.PolicyComponent; import org.apache.ws.commons.schema.XmlSchema; import org.apache.ws.commons.schema.XmlSchemaElement; import org.apache.ws.commons.schema.XmlSchemaImport; import org.apache.ws.commons.schema.XmlSchemaInclude; import org.apache.ws.commons.schema.XmlSchemaObject; import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; /** * This class represents the messages in WSDL. There can be message element in services.xml * which are represented by this class. */ public class AxisMessage extends AxisDescription { private ArrayList<Handler> handlerChain; private String name; private ArrayList soapHeaders; //to keep data in WSDL message reference and to keep the Java2WSDL data // such as SchemaElementName , direction etc. private QName elementQname; private String direction; private String messagePartName; // To store deploy-time module refs private ArrayList<String> modulerefs; private String partName = Java2WSDLConstants.PARAMETERS; // private PolicyInclude policyInclude; //To chcek whether the message is wrapped or unwrapped private boolean wrapped = true; private volatile Policy effectivePolicy = null; private volatile Date lastPolicyCalculatedTime = null; public String getMessagePartName() { return messagePartName; } public void setMessagePartName(String messagePartName) { this.messagePartName = messagePartName; } public AxisMessage() { soapHeaders = new ArrayList(); handlerChain = new ArrayList<Handler>(); modulerefs = new ArrayList<String>(); } public ArrayList<Handler> getMessageFlow() { return handlerChain; } public boolean isParameterLocked(String parameterName) { // checking the locked value of parent boolean locked = false; if (getParent() != null) { locked = getParent().isParameterLocked(parameterName); } if (locked) { return true; } else { Parameter parameter = getParameter(parameterName); return (parameter != null) && parameter.isLocked(); } } public void setMessageFlow(ArrayList<Handler> operationFlow) { this.handlerChain = operationFlow; } public String getDirection() { return direction; } public void setDirection(String direction) { this.direction = direction; } public QName getElementQName() { return this.elementQname; } public void setElementQName(QName element) { this.elementQname = element; } public Object getKey() { return this.elementQname; } public XmlSchemaElement getSchemaElement() { XmlSchemaElement xmlSchemaElement = null; AxisService service = getAxisOperation().getAxisService(); ArrayList schemas = service.getSchema(); for (Object schema : schemas) { xmlSchemaElement = getSchemaElement((XmlSchema)schema); if (xmlSchemaElement != null) { break; } } return xmlSchemaElement; } private XmlSchemaElement getSchemaElement(XmlSchema schema) { XmlSchemaElement xmlSchemaElement = null; if (schema != null) { xmlSchemaElement = schema.getElementByName(this.elementQname); if (xmlSchemaElement == null) { // try to find in an import or an include for (XmlSchemaObject external : schema.getExternals()) { if (external instanceof XmlSchemaImport) { XmlSchema schema1 = ((XmlSchemaImport) external).getSchema(); xmlSchemaElement = getSchemaElement(schema1); } if (external instanceof XmlSchemaInclude) { XmlSchema schema1 = ((XmlSchemaInclude) external).getSchema(); xmlSchemaElement = getSchemaElement(schema1); } if (xmlSchemaElement != null) { break; } } } } return xmlSchemaElement; } public String getName() { return name; } public void setName(String name) { this.name = name; } /** * This will return a list of WSDLExtensibilityAttribute * @return */ public List getExtensibilityAttributes() { // TODO : Deepal implement this properly. // the list should contain list of WSDLExtensibilityAttribute return new ArrayList(0); } public void addSoapHeader(SOAPHeaderMessage soapHeaderMessage) { soapHeaders.add(soapHeaderMessage); } public ArrayList getSoapHeaders () { return soapHeaders; } /** * We do not support adding module operations when engaging a module to an AxisMessage * * @param axisModule AxisModule to engage * @param engager * @throws AxisFault something went wrong */ public void onEngage(AxisModule axisModule, AxisDescription engager) throws AxisFault { PhaseResolver phaseResolver = new PhaseResolver(getAxisConfiguration()); phaseResolver.engageModuleToMessage(this, axisModule); } public ArrayList<String> getModulerefs() { return modulerefs; } public void addModuleRefs(String moduleName) { modulerefs.add(moduleName); } public AxisOperation getAxisOperation(){ return (AxisOperation)parent; } public String getPartName() { return partName; } public void setPartName(String partName) { this.partName = partName; } public boolean isWrapped() { return wrapped; } public void setWrapped(boolean wrapped) { this.wrapped = wrapped; } public Policy getEffectivePolicy() { if (lastPolicyCalculatedTime == null || isPolicyUpdated()) { synchronized (this) { if (lastPolicyCalculatedTime == null || isPolicyUpdated()) { effectivePolicy = calculateEffectivePolicy(); lastPolicyCalculatedTime = new Date(); } } } return effectivePolicy; } public Policy calculateEffectivePolicy() { PolicySubject policySubject; Collection<PolicyComponent> policyList = new ArrayList<PolicyComponent>(); // AxisMessage policySubject = getPolicySubject(); policyList.addAll(policySubject.getAttachedPolicyComponents()); // AxisOperation AxisOperation axisOperation = getAxisOperation(); if (axisOperation != null) { policyList.addAll(axisOperation.getPolicySubject() .getAttachedPolicyComponents()); } // AxisService AxisService axisService = (axisOperation == null) ? null : axisOperation.getAxisService(); if (axisService != null) { policyList.addAll(axisService.getPolicySubject() .getAttachedPolicyComponents()); } // AxisConfiguration AxisConfiguration axisConfiguration = (axisService == null) ? null : axisService.getAxisConfiguration(); if (axisConfiguration != null) { policyList.addAll(axisConfiguration.getPolicySubject() .getAttachedPolicyComponents()); } Policy result = PolicyUtil.getMergedPolicy(policyList, axisService); return result; } public boolean isPolicyUpdated() { // AxisMessage if (getPolicySubject().getLastUpdatedTime().after( lastPolicyCalculatedTime)) { return true; } // AxisOperation AxisOperation axisOperation = (AxisOperation) parent; if (axisOperation != null && axisOperation.getPolicySubject().getLastUpdatedTime().after( lastPolicyCalculatedTime)) { return true; } // AxisService AxisService axisService = (axisOperation == null) ? null : axisOperation.getAxisService(); if (axisService != null && axisService.getPolicySubject().getLastUpdatedTime().after( lastPolicyCalculatedTime)) { return true; } // AxisConfiguration AxisConfiguration axisConfiguration = (axisService == null) ? null : axisService.getAxisConfiguration(); return axisConfiguration != null && axisConfiguration.getPolicySubject().getLastUpdatedTime() .after(lastPolicyCalculatedTime); } }