blob: f7a1d072a145528d9159f3c561e137e4bbe03c0e [file] [log] [blame]
/*
* 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);
}
}