/* * 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 java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.xml.namespace.QName; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axis2.AxisFault; import org.apache.axis2.Constants; import org.apache.axis2.util.PolicyUtil; import org.apache.axis2.util.WSDLSerializationUtil; import org.apache.axis2.wsdl.WSDLConstants; import org.apache.neethi.Policy; import org.apache.neethi.PolicyComponent; /** * An AxisBindingOperation represents a WSDL <bindingOperation> */ public class AxisBindingOperation extends AxisDescription { private AxisOperation axisOperation; private QName name; private Map<String, AxisBindingMessage> faults; private Map<String, Object> options; public AxisBindingOperation() { options = new HashMap<String, Object>(); faults = new HashMap<String, AxisBindingMessage>(); } public ArrayList<AxisBindingMessage> getFaults() { return new ArrayList<AxisBindingMessage>(faults.values()); } public AxisBindingMessage getFault(String name) { return (AxisBindingMessage) faults.get(name); } public void addFault(AxisBindingMessage fault) { this.faults.put(fault.getName(), fault); } public QName getName() { return name; } public void setName(QName name) { this.name = name; } public AxisOperation getAxisOperation() { return axisOperation; } public void setAxisOperation(AxisOperation axisOperation) { this.axisOperation = axisOperation; } public void setProperty(String name, Object value) { options.put(name, value); } public Object getProperty(String name) { Object property = this.options.get(name); AxisBinding parent; if (property == null && (parent = getAxisBinding()) != null) { property = parent.getProperty(name); } if (property == null) { property = WSDL20DefaultValueHolder.getDefaultValue(name); } return property; } public Object getKey() { return name; } public void engageModule(AxisModule axisModule) throws AxisFault { throw new UnsupportedOperationException("Sorry we do not support this"); } public boolean isEngaged(String moduleName) { throw new UnsupportedOperationException( "axisMessage.isEngaged() is not supported"); } /** * Generates the bindingOperation element * * @param wsdl * The WSDL namespace * @param tns * The targetnamespace * @param wsoap * The SOAP namespace (WSDL 2.0) * @param whttp * The HTTP namespace (WSDL 2.0) * @param type * Indicates whether the binding is SOAP or HTTP * @param namespaceMap * the service's namespace map (prefix -> namespace) * @param serviceName * the name of the service * @return The generated binding element */ public OMElement toWSDL20(OMNamespace wsdl, OMNamespace tns, OMNamespace wsoap, OMNamespace whttp, String type, Map<String, String> namespaceMap, String serviceName) { String property; OMFactory omFactory = OMAbstractFactory.getOMFactory(); OMElement bindingOpElement = omFactory.createOMElement( WSDL2Constants.OPERATION_LOCAL_NAME, wsdl); bindingOpElement.addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_REF, null, tns.getPrefix() + ":" + this.name.getLocalPart())); if (WSDL2Constants.URI_WSDL2_SOAP.equals(type) || Constants.URI_SOAP11_HTTP.equals(type) || Constants.URI_SOAP12_HTTP.equals(type)) { // SOAP Binding specific properties property = (String) this.options .get(WSDL2Constants.ATTR_WSOAP_ACTION); if (property != null) { bindingOpElement.addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_ACTION, wsoap, property)); } ArrayList soapModules = (ArrayList) this.options .get(WSDL2Constants.ATTR_WSOAP_MODULE); if (soapModules != null && soapModules.size() > 0) { WSDLSerializationUtil.addSOAPModuleElements(omFactory, soapModules, wsoap, bindingOpElement); } property = (String) this.options.get(WSDL2Constants.ATTR_WSOAP_MEP); if (property != null) { bindingOpElement.addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_MEP, wsoap, property)); } } else if (WSDL2Constants.URI_WSDL2_HTTP.equals(type)) { // HTTP Binding specific properties property = (String) this.options .get(WSDL2Constants.ATTR_WHTTP_INPUT_SERIALIZATION); if (property != null) { bindingOpElement.addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_INPUT_SERIALIZATION, whttp, property)); } property = (String) this.options .get(WSDL2Constants.ATTR_WHTTP_OUTPUT_SERIALIZATION); if (property != null) { bindingOpElement.addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_OUTPUT_SERIALIZATION, whttp, property)); } property = (String) this.options .get(WSDL2Constants.ATTR_WHTTP_FAULT_SERIALIZATION); if (property != null) { bindingOpElement.addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_FAULT_SERIALIZATION, whttp, property)); } Boolean ignoreUncited = (Boolean) this.options .get(WSDL2Constants.ATTR_WHTTP_IGNORE_UNCITED); if (ignoreUncited != null) { bindingOpElement.addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_IGNORE_UNCITED, whttp, ignoreUncited.toString())); } property = (String) this.options .get(WSDL2Constants.ATTR_WHTTP_METHOD); if (property != null) { bindingOpElement.addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_METHOD, whttp, property)); } } // Common properties property = (String) this.options .get(WSDL2Constants.ATTR_WHTTP_LOCATION); if (property != null) { bindingOpElement.addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_LOCATION, whttp, property)); } property = (String) this.options .get(WSDL2Constants.ATTR_WHTTP_CONTENT_ENCODING); if (property != null) { bindingOpElement .addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_CONTENT_ENCODING, whttp, property)); } property = (String) this.options .get(WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR); if (property != null) { bindingOpElement.addAttribute(omFactory.createOMAttribute( WSDL2Constants.ATTRIBUTE_QUERY_PARAMETER_SEPERATOR, whttp, property)); } // Add the input element AxisBindingMessage inMessage = (AxisBindingMessage) this .getChild(WSDLConstants.MESSAGE_LABEL_IN_VALUE); if (inMessage != null) { bindingOpElement.addChild(inMessage.toWSDL20(wsdl, tns, wsoap, whttp, namespaceMap)); } // Add the output element AxisBindingMessage outMessage = (AxisBindingMessage) this .getChild(WSDLConstants.MESSAGE_LABEL_OUT_VALUE); if (outMessage != null) { bindingOpElement.addChild(outMessage.toWSDL20(wsdl, tns, wsoap, whttp, namespaceMap)); } // Add any fault elements if (faults != null && faults.size() > 0) { Collection<AxisBindingMessage> faultValues = faults.values(); Iterator<AxisBindingMessage> iterator = faultValues.iterator(); while (iterator.hasNext()) { AxisBindingMessage faultMessage = (AxisBindingMessage) iterator .next(); bindingOpElement.addChild(faultMessage.toWSDL20(wsdl, tns, wsoap, whttp, namespaceMap)); } } WSDLSerializationUtil.addWSDLDocumentationElement(this, bindingOpElement, omFactory, wsdl); WSDLSerializationUtil.addPoliciesAsExtensibleElement(this, bindingOpElement); return bindingOpElement; } public Policy getEffectivePolicy() { Collection<PolicyComponent> policyList = new ArrayList<PolicyComponent>(); policyList.addAll(getPolicySubject().getAttachedPolicyComponents()); // AxisBinding AxisBinding axisBinding = getAxisBinding(); if (axisBinding != null) { policyList.addAll(axisBinding.getPolicySubject().getAttachedPolicyComponents()); } // AxisEndpoint AxisEndpoint axisEndpoint = null; if (axisBinding != null) { axisEndpoint = axisBinding.getAxisEndpoint(); } if (axisEndpoint != null) { policyList.addAll(axisEndpoint.getPolicySubject().getAttachedPolicyComponents()); } if (axisOperation != null) { policyList.addAll(axisOperation.getPolicySubject().getAttachedPolicyComponents()); } return PolicyUtil.getMergedPolicy(policyList, this); } public AxisBinding getAxisBinding() { return (AxisBinding) parent; } @Override public void applyPolicy() throws AxisFault { getAxisOperation().applyPolicy(); } }