| /* |
| * Copyright 2004,2005 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.axis2.description; |
| |
| import org.apache.axiom.om.OMElement; |
| import org.apache.axis2.AxisFault; |
| import org.apache.axis2.Constants; |
| import org.apache.axis2.addressing.AddressingConstants; |
| import org.apache.axis2.addressing.EndpointReference; |
| import org.apache.axis2.client.Options; |
| import org.apache.axis2.deployment.util.PhasesInfo; |
| import org.apache.axis2.deployment.util.Utils; |
| import org.apache.axis2.engine.*; |
| import org.apache.axis2.i18n.Messages; |
| import org.apache.axis2.modules.Module; |
| import org.apache.axis2.phaseresolver.PhaseResolver; |
| import org.apache.axis2.transport.TransportListener; |
| import org.apache.axis2.transport.http.server.HttpUtils; |
| import org.apache.axis2.util.Loader; |
| import org.apache.axis2.util.XMLUtils; |
| import org.apache.axis2.wsdl.WSDLConstants; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.ws.commons.schema.XmlSchema; |
| import org.apache.ws.commons.schema.XmlSchemaElement; |
| import org.apache.ws.commons.schema.XmlSchemaExternal; |
| import org.apache.ws.commons.schema.XmlSchemaObjectCollection; |
| import org.apache.ws.commons.schema.utils.NamespaceMap; |
| import org.apache.ws.commons.schema.utils.NamespacePrefixList; |
| import org.apache.ws.java2wsdl.Java2WSDLConstants; |
| import org.apache.ws.java2wsdl.SchemaGenerator; |
| import org.apache.ws.java2wsdl.utils.TypeTable; |
| import org.codehaus.jam.JMethod; |
| import org.w3c.dom.Document; |
| import org.xml.sax.SAXException; |
| |
| import javax.wsdl.Definition; |
| import javax.wsdl.Port; |
| import javax.wsdl.Service; |
| import javax.wsdl.WSDLException; |
| import javax.wsdl.extensions.soap.SOAPAddress; |
| import javax.wsdl.factory.WSDLFactory; |
| import javax.wsdl.xml.WSDLReader; |
| import javax.wsdl.xml.WSDLWriter; |
| import javax.xml.namespace.QName; |
| import javax.xml.parsers.ParserConfigurationException; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.net.SocketException; |
| import java.net.URL; |
| import java.util.*; |
| |
| /** |
| * Class AxisService |
| */ |
| public class AxisService extends AxisDescription { |
| |
| private int nsCount = 0; |
| private static final Log log = LogFactory.getLog(AxisService.class); |
| private URL fileName; |
| |
| private HashMap operationsAliasesMap = null; |
| // private HashMap operations = new HashMap(); |
| |
| // to store module ref at deploy time parsing |
| private ArrayList moduleRefs = null; |
| |
| // to store engaged modules |
| private ArrayList engagedModules = null; |
| private String serviceDescription; |
| |
| // to store the wsdl definition , which is build at the deployment time |
| // to keep the time that last update time of the service |
| private long lastupdate; |
| private HashMap moduleConfigmap; |
| private String name; |
| private ClassLoader serviceClassLoader; |
| |
| //to keep the XMLScheam getting either from WSDL or java2wsdl |
| private ArrayList schemaList; |
| //private XmlSchema schema; |
| |
| //wsdl is there for this service or not (in side META-INF) |
| private boolean wsdlFound = false; |
| |
| //to store the scope of the service |
| private String scope; |
| |
| //to store default message receivers |
| private HashMap messageReceivers; |
| |
| // to set the handler chain available in phase info |
| private boolean useDefaultChains = true; |
| |
| //to keep the status of the service , since service can stop at the run time |
| private boolean active = true; |
| |
| private boolean elementFormDefault = true; |
| |
| //to keep the service target name space |
| private String targetNamespace = |
| Java2WSDLConstants.DEFAULT_TARGET_NAMESPACE; |
| private String targetNamespacePrefix = |
| Java2WSDLConstants.TARGETNAMESPACE_PREFIX; |
| |
| // to store the target namespace for the schema |
| private String schematargetNamespace;// = Java2WSDLConstants.AXIS2_XSD; |
| private String schematargetNamespacePrefix = |
| Java2WSDLConstants.SCHEMA_NAMESPACE_PRFIX; |
| |
| private boolean enableAllTransports = true; |
| private List exposedTransports = new ArrayList(); |
| |
| //To keep reference to ServiceLifeCycle instance , if the user has |
| // specified in services.xml |
| private ServiceLifeCycle serviceLifeCycle; |
| |
| |
| /** |
| * Keeps track whether the schema locations are adjusted |
| */ |
| private boolean schemaLocationsAdjusted = false; |
| |
| /** |
| * A table that keeps a mapping of unique xsd names (Strings) |
| * against the schema objects. This is populated in the first |
| * instance the schemas are asked for and then used to serve |
| * the subsequent requests |
| */ |
| private Map schemaMappingTable = null; |
| |
| /** |
| * counter variable for naming the schemas |
| */ |
| private int count = 0; |
| /** |
| * A custom schema Name prefix. if set this will be used to |
| * modify the schema names |
| */ |
| private String customSchemaNamePrefix = null; |
| |
| /** |
| * A custom schema name suffix. will be attached to the |
| * schema file name when the files are uniquely named. |
| * A good place to add a file extension if needed |
| */ |
| private String customSchemaNameSuffix = null; |
| ///////////////////////////////////////// |
| // WSDL related stuff //////////////////// |
| //////////////////////////////////////// |
| private NamespaceMap nameSpacesMap; |
| |
| private String soapNsUri; |
| private String endpoint; |
| |
| // Flag representing whether WS-Addressing is required to use this service. |
| // Reflects the wsaw:UsingAddressing wsdl extension element |
| private String wsaddressingFlag = AddressingConstants.ADDRESSING_UNSPECIFIED; |
| private boolean clientSide = false; |
| |
| //To keep a ref to ObjectSupplier instance |
| private ObjectSupplier objectSupplier; |
| |
| // package to namespace mapping |
| private Map p2nMap; |
| |
| private TypeTable typeTable; |
| |
| // name of the binding used : use in codegeneration |
| private String bindingName; |
| // name of the port type used : use in codegeneration |
| private String portTypeName; |
| |
| public String getWSAddressingFlag() { |
| return wsaddressingFlag; |
| } |
| |
| public void setWSAddressingFlag(String ar) { |
| wsaddressingFlag = ar; |
| if (wsaddressingFlag == null) { |
| wsaddressingFlag = AddressingConstants.ADDRESSING_UNSPECIFIED; |
| } |
| } |
| |
| public boolean isSchemaLocationsAdjusted() { |
| return schemaLocationsAdjusted; |
| } |
| |
| public void setSchemaLocationsAdjusted(boolean schemaLocationsAdjusted) { |
| this.schemaLocationsAdjusted = schemaLocationsAdjusted; |
| } |
| |
| public Map getSchemaMappingTable() { |
| return schemaMappingTable; |
| } |
| |
| public void setSchemaMappingTable(Map schemaMappingTable) { |
| this.schemaMappingTable = schemaMappingTable; |
| } |
| |
| public String getCustomSchemaNamePrefix() { |
| return customSchemaNamePrefix; |
| } |
| |
| public void setCustomSchemaNamePrefix(String customSchemaNamePrefix) { |
| this.customSchemaNamePrefix = customSchemaNamePrefix; |
| } |
| |
| public String getCustomSchemaNameSuffix() { |
| return customSchemaNameSuffix; |
| } |
| |
| public void setCustomSchemaNameSuffix(String customSchemaNameSuffix) { |
| this.customSchemaNameSuffix = customSchemaNameSuffix; |
| } |
| |
| /** |
| * Constructor AxisService. |
| */ |
| public AxisService() { |
| super(); |
| this.operationsAliasesMap = new HashMap(); |
| moduleConfigmap = new HashMap(); |
| //by default service scope is for the request |
| scope = Constants.SCOPE_REQUEST; |
| messageReceivers = new HashMap(); |
| moduleRefs = new ArrayList(); |
| engagedModules = new ArrayList(); |
| schemaList = new ArrayList(); |
| serviceClassLoader = Thread.currentThread().getContextClassLoader(); |
| objectSupplier = new DefaultObjectSupplier(); |
| } |
| |
| public String getPortTypeName() { |
| return portTypeName; |
| } |
| |
| public void setPortTypeName(String portTypeName) { |
| this.portTypeName = portTypeName; |
| } |
| |
| public String getBindingName() { |
| return bindingName; |
| } |
| |
| public void setBindingName(String bindingName) { |
| this.bindingName = bindingName; |
| } |
| |
| /** |
| * get the SOAPVersion |
| */ |
| public String getSoapNsUri() { |
| return soapNsUri; |
| } |
| |
| public void setSoapNsUri(String soapNsUri) { |
| this.soapNsUri = soapNsUri; |
| } |
| |
| /** |
| * get the endpoint |
| */ |
| public String getEndpoint() { |
| return endpoint; |
| } |
| |
| public void setEndpoint(String endpoint) { |
| this.endpoint = endpoint; |
| } |
| |
| /** |
| * Constructor AxisService. |
| */ |
| public AxisService(String name) { |
| this(); |
| this.name = name; |
| } |
| |
| public void addMessageReceiver(String mepURL, MessageReceiver messageReceiver) { |
| messageReceivers.put(mepURL, messageReceiver); |
| } |
| |
| public MessageReceiver getMessageReceiver(String mepURL) { |
| return (MessageReceiver) messageReceivers.get(mepURL); |
| } |
| |
| /** |
| * Adds module configuration , if there is moduleConfig tag in service. |
| * |
| * @param moduleConfiguration |
| */ |
| public void addModuleConfig(ModuleConfiguration moduleConfiguration) { |
| moduleConfigmap.put(moduleConfiguration.getModuleName(), moduleConfiguration); |
| } |
| |
| /** |
| * Adds an operation to a service if a module is required to do so. |
| * |
| * @param module |
| */ |
| public void addModuleOperations(AxisModule module, AxisConfiguration axisConfig) |
| throws AxisFault { |
| HashMap map = module.getOperations(); |
| Collection col = map.values(); |
| for (Iterator iterator = col.iterator(); iterator.hasNext();) { |
| AxisOperation axisOperation = copyOperation((AxisOperation) iterator.next()); |
| if (this.getOperation(axisOperation.getName()) == null) { |
| ArrayList wsamappings = axisOperation.getWsamappingList(); |
| if (wsamappings != null) { |
| for (int j = 0, size = wsamappings.size(); j < size; j++) { |
| String mapping = (String) wsamappings.get(j); |
| mapActionToOperation(mapping, axisOperation); |
| } |
| } |
| // this operation is a control operation. |
| axisOperation.setControlOperation(true); |
| this.addOperation(axisOperation); |
| } |
| } |
| } |
| |
| public void addModuleref(QName moduleref) { |
| moduleRefs.add(moduleref); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.apache.axis2.description.AxisService#addOperation(org.apache.axis2.description.AxisOperation) |
| */ |
| |
| /** |
| * Method addOperation. |
| * |
| * @param axisOperation |
| */ |
| public void addOperation(AxisOperation axisOperation) { |
| axisOperation.setParent(this); |
| |
| Iterator modules = getEngagedModules().iterator(); |
| |
| while (modules.hasNext()) { |
| AxisModule module = (AxisModule) modules.next(); |
| AxisServiceGroup parent = (AxisServiceGroup) getParent(); |
| AxisConfiguration axisConfig = null; |
| |
| if (parent != null) { |
| axisConfig = (AxisConfiguration) parent.getParent(); |
| } |
| |
| try { |
| Module moduleImpl = module.getModule(); |
| if (moduleImpl != null) { |
| // notifying module for service engagement |
| moduleImpl.engageNotify(axisOperation); |
| } |
| axisOperation.engageModule(module, axisConfig); |
| } catch (AxisFault axisFault) { |
| log.info(Messages.getMessage( |
| "modulealredyengagetoservice", module.getName().getLocalPart())); |
| } |
| } |
| if (axisOperation.getMessageReceiver() == null) { |
| axisOperation.setMessageReceiver( |
| loadDefaultMessageReceiver(axisOperation.getMessageExchangePattern(), this)); |
| } |
| if (axisOperation.getSoapAction() == null) { |
| axisOperation.setSoapAction("urn:" + axisOperation.getName().getLocalPart()); |
| } |
| addChild(axisOperation); |
| |
| String operationName = axisOperation.getName().getLocalPart(); |
| |
| /* |
| Some times name of the operation can be different from the name of the first child of the SOAPBody. |
| This will put the correct mapping associating that name with the operation. This will be useful especially for |
| the SOAPBodyBasedDispatcher |
| */ |
| |
| Iterator axisMessageIter = axisOperation.getChildren(); |
| |
| while (axisMessageIter.hasNext()) { |
| AxisMessage axisMessage = (AxisMessage) axisMessageIter.next(); |
| String messageName = axisMessage.getName(); |
| if (messageName != null && !messageName.equals(operationName)) { |
| mapActionToOperation(messageName, axisOperation); |
| } |
| } |
| |
| mapActionToOperation(operationName, axisOperation); |
| |
| String action = axisOperation.getSoapAction(); |
| if (action.length() > 0) { |
| mapActionToOperation(action, axisOperation); |
| } |
| |
| ArrayList wsamappings = axisOperation.getWsamappingList(); |
| if (wsamappings != null) { |
| for (int j = 0, size = wsamappings.size(); j < size; j++) { |
| String mapping = (String) wsamappings.get(j); |
| mapActionToOperation(mapping, axisOperation); |
| } |
| } |
| |
| if (axisOperation.getMessageReceiver() == null) { |
| axisOperation.setMessageReceiver( |
| loadDefaultMessageReceiver( |
| axisOperation.getMessageExchangePattern(), this)); |
| } |
| } |
| |
| |
| private MessageReceiver loadDefaultMessageReceiver(String mepURL, AxisService service) { |
| MessageReceiver messageReceiver; |
| if (mepURL == null) { |
| mepURL = WSDLConstants.WSDL20_2004Constants.MEP_URI_IN_OUT; |
| } |
| if (service != null) { |
| messageReceiver = service.getMessageReceiver(mepURL); |
| if (messageReceiver != null) { |
| return messageReceiver; |
| } |
| } |
| if (getParent() != null && getParent().getParent() != null) { |
| return ((AxisConfiguration) getParent().getParent()).getMessageReceiver(mepURL); |
| } |
| return null; |
| } |
| |
| |
| /** |
| * Gets a copy from module operation. |
| * |
| * @param axisOperation |
| * @return Returns AxisOperation. |
| * @throws AxisFault |
| */ |
| private AxisOperation copyOperation(AxisOperation axisOperation) throws AxisFault { |
| AxisOperation operation = |
| AxisOperationFactory.getOperationDescription(axisOperation.getMessageExchangePattern()); |
| |
| operation.setMessageReceiver(axisOperation.getMessageReceiver()); |
| operation.setName(axisOperation.getName()); |
| |
| Iterator parameters = axisOperation.getParameters().iterator(); |
| |
| while (parameters.hasNext()) { |
| Parameter parameter = (Parameter) parameters.next(); |
| |
| operation.addParameter(parameter); |
| } |
| |
| operation.setWsamappingList(axisOperation.getWsamappingList()); |
| operation.setRemainingPhasesInFlow(axisOperation.getRemainingPhasesInFlow()); |
| operation.setPhasesInFaultFlow(axisOperation.getPhasesInFaultFlow()); |
| operation.setPhasesOutFaultFlow(axisOperation.getPhasesOutFaultFlow()); |
| operation.setPhasesOutFlow(axisOperation.getPhasesOutFlow()); |
| |
| operation.setOutputAction(axisOperation.getOutputAction()); |
| String[] faultActionNames = axisOperation.getFaultActionNames(); |
| for (int i = 0; i < faultActionNames.length; i++) { |
| operation.addFaultAction(faultActionNames[i], axisOperation.getFaultAction(faultActionNames[i])); |
| } |
| |
| return operation; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.apache.axis2.description.AxisService#addToengagedModules(javax.xml.namespace.QName) |
| */ |
| |
| /** |
| * Engages a module. It is required to use this method. |
| * |
| * @param axisModule |
| */ |
| public void engageModule(AxisModule axisModule, AxisConfiguration axisConfig) |
| throws AxisFault { |
| if (axisModule == null) { |
| throw new AxisFault(Messages.getMessage("modulenf")); |
| } |
| Iterator itr_engageModules = engagedModules.iterator(); |
| boolean isEngagable; |
| QName moduleName = axisModule.getName(); |
| while (itr_engageModules.hasNext()) { |
| AxisModule module = (AxisModule) itr_engageModules.next(); |
| QName modu = module.getName(); |
| isEngagable = org.apache.axis2.util.Utils.checkVersion(moduleName, modu); |
| if (!isEngagable) { |
| return; |
| } |
| } |
| |
| Module moduleImpl = axisModule.getModule(); |
| if (moduleImpl != null) { |
| // notyfying module for service engagement |
| moduleImpl.engageNotify(this); |
| } |
| // adding module operations |
| addModuleOperations(axisModule, axisConfig); |
| |
| Iterator operations = getOperations(); |
| |
| while (operations.hasNext()) { |
| AxisOperation axisOperation = (AxisOperation) operations.next(); |
| if (moduleImpl != null) { |
| // notyfying module for service engagement |
| moduleImpl.engageNotify(axisOperation); |
| } |
| axisOperation.engageModule(axisModule, axisConfig); |
| } |
| engagedModules.add(axisModule); |
| } |
| |
| /** |
| * Maps an action (aka WSA action) to the given operation. This is used by |
| * addressing based dispatching to figure out which operation it is that a |
| * given message is for. |
| * |
| * @param action the action key |
| * @param axisOperation the operation to map to |
| */ |
| public void mapActionToOperation(String action, AxisOperation axisOperation) { |
| operationsAliasesMap.put(action, axisOperation); |
| } |
| |
| |
| public void printSchema(OutputStream out) throws AxisFault { |
| for (int i = 0; i < schemaList.size(); i++) { |
| XmlSchema schema = addNameSpaces(i); |
| schema.write(out); |
| } |
| } |
| |
| public XmlSchema getSchema(int index) { |
| return addNameSpaces(index); |
| } |
| |
| private XmlSchema addNameSpaces(int i) { |
| XmlSchema schema = (XmlSchema) schemaList.get(i); |
| NamespaceMap map = (NamespaceMap) nameSpacesMap.clone(); |
| NamespacePrefixList namespaceContext = schema.getNamespaceContext(); |
| String prefixes[] = namespaceContext.getDeclaredPrefixes(); |
| for (int j = 0; j < prefixes.length; j++) { |
| String prefix = prefixes[j]; |
| map.add(prefix, namespaceContext.getNamespaceURI(prefix)); |
| } |
| schema.setNamespaceContext(map); |
| return schema; |
| } |
| |
| public AxisConfiguration getAxisConfiguration() { |
| if (getParent() != null) { |
| return (AxisConfiguration) getParent().getParent(); |
| } |
| return null; |
| } |
| |
| /** |
| * @param out |
| * @param requestIP |
| * @param servicePath |
| * @throws AxisFault |
| */ |
| public void printWSDL(OutputStream out, String requestIP, String servicePath) throws AxisFault { |
| if (isUseUserWSDL()) { |
| Parameter wsld4jdefinition = getParameter(WSDLConstants.WSDL_4_J_DEFINITION); |
| if (wsld4jdefinition != null) { |
| try { |
| Definition definition = (Definition) wsld4jdefinition.getValue(); |
| setPortAddress(definition); |
| WSDLWriter writer = WSDLFactory.newInstance().newWSDLWriter(); |
| writer.writeWSDL(definition, out); |
| } catch (WSDLException e) { |
| throw new AxisFault(e); |
| } |
| } else { |
| printWSDLError(out); |
| } |
| } else { |
| String[] eprArray = getEPRs(requestIP); |
| getWSDL(out, eprArray, servicePath); |
| } |
| } |
| |
| public String[] getEPRs() throws AxisFault { |
| String requestIP; |
| try { |
| requestIP = HttpUtils.getIpAddress(); |
| } catch (SocketException e) { |
| throw new AxisFault("Cannot get local IP address", e); |
| } |
| return getEPRs(requestIP); |
| } |
| |
| private String[] getEPRs(String requestIP) throws AxisFault { |
| AxisConfiguration axisConfig = getAxisConfiguration(); |
| ArrayList eprList = new ArrayList(); |
| if (enableAllTransports) { |
| Iterator transports = axisConfig.getTransportsIn().values().iterator(); |
| while (transports.hasNext()) { |
| TransportInDescription transportIn = (TransportInDescription) transports.next(); |
| TransportListener listener = transportIn.getReceiver(); |
| if (listener != null) { |
| try { |
| EndpointReference[] eprsForService = listener.getEPRsForService(this.name, requestIP); |
| if (eprsForService != null) { |
| for (int i = 0; i < eprsForService.length; i++) { |
| EndpointReference endpointReference = eprsForService[i]; |
| String address = endpointReference.getAddress(); |
| if (address != null) { |
| eprList.add(address); |
| } |
| } |
| } |
| } catch (AxisFault axisFault) { |
| log.warn(axisFault.getMessage()); |
| } |
| } |
| } |
| } else { |
| List trs = this.exposedTransports; |
| for (int i = 0; i < trs.size(); i++) { |
| String trsName = (String) trs.get(i); |
| TransportInDescription transportIn = axisConfig.getTransportIn( |
| new QName(trsName)); |
| if (transportIn != null) { |
| TransportListener listener = transportIn.getReceiver(); |
| if (listener != null) { |
| try { |
| EndpointReference[] eprsForService = listener.getEPRsForService(this.name, requestIP); |
| if (eprsForService != null) { |
| for (int j = 0; j < eprsForService.length; j++) { |
| EndpointReference endpointReference = eprsForService[j]; |
| String address = endpointReference.getAddress(); |
| if (address != null) { |
| eprList.add(address); |
| } |
| } |
| } |
| } catch (AxisFault axisFault) { |
| log.warn(axisFault.getMessage()); |
| } |
| } |
| } |
| } |
| } |
| return (String[]) eprList.toArray(new String[eprList.size()]); |
| } |
| |
| /** |
| * @param out |
| * @param requestIP |
| * @throws AxisFault |
| * @deprecated try to use the method which takes three arguments |
| */ |
| public void printWSDL(OutputStream out, String requestIP) throws AxisFault { |
| printWSDL(out, requestIP, "services"); |
| } |
| |
| /** |
| * Print the WSDL with a default URL. This will be called only during codegen time. |
| * |
| * @param out |
| * @throws AxisFault |
| */ |
| public void printWSDL(OutputStream out) throws AxisFault { |
| if (isUseUserWSDL()) { |
| Parameter wsld4jdefinition = getParameter(WSDLConstants.WSDL_4_J_DEFINITION); |
| if (wsld4jdefinition != null) { |
| try { |
| Definition definition = (Definition) wsld4jdefinition.getValue(); |
| setPortAddress(definition); |
| WSDLWriter writer = WSDLFactory.newInstance().newWSDLWriter(); |
| writer.writeWSDL(definition, out); |
| } catch (WSDLException e) { |
| throw new AxisFault(e); |
| } |
| } else { |
| printWSDLError(out); |
| } |
| } else { |
| setWsdlFound(true); |
| //pick the endpoint and take it as the epr for the WSDL |
| getWSDL(out, new String[]{this.endpoint}, "services"); |
| } |
| } |
| |
| private void setPortAddress(Definition definition) throws AxisFault { |
| Iterator serviceItr = definition.getServices().values().iterator(); |
| while (serviceItr.hasNext()) { |
| Service serviceElement = (Service) serviceItr.next(); |
| Iterator portItr = serviceElement.getPorts().values().iterator(); |
| while (portItr.hasNext()) { |
| Port port = (Port) portItr.next(); |
| List list = port.getExtensibilityElements(); |
| for (int i = 0; i < list.size(); i++) { |
| Object extensibilityEle = list.get(i); |
| if (extensibilityEle instanceof SOAPAddress) { |
| ((SOAPAddress) extensibilityEle).setLocationURI(getEPRs()[0]); |
| } |
| } |
| } |
| } |
| } |
| |
| private void getWSDL(OutputStream out, String[] serviceURL, String servicePath) throws AxisFault { |
| if (this.wsdlFound) { |
| AxisService2OM axisService2WOM = new AxisService2OM(this, |
| serviceURL, "document", "literal", servicePath); |
| try { |
| OMElement wsdlElement = axisService2WOM.generateOM(); |
| wsdlElement.serialize(out); |
| out.flush(); |
| out.close(); |
| } catch (Exception e) { |
| throw new AxisFault(e); |
| } |
| } else { |
| printWSDLError(out); |
| } |
| |
| } |
| |
| private void printWSDLError(OutputStream out) throws AxisFault { |
| try { |
| String wsdlntfound = "<error>" + |
| "<description>Unable to generate WSDL for this service</description>" + |
| "<reason>If you wish Axis2 to automatically generate the WSDL, then please use one of the RPC message " + |
| "receivers for the service(s)/operation(s) in services.xml. If you have added a custom WSDL in the " + |
| "META-INF directory, then please make sure that the name of the service in services.xml " + |
| "(/serviceGroup/service/@name) is the same as in the " + |
| "custom wsdl's service name (/wsdl:definitions/wsdl:service/@name). </reason>" + |
| "</error>"; |
| out.write(wsdlntfound.getBytes()); |
| out.flush(); |
| out.close(); |
| } catch (IOException e) { |
| throw new AxisFault(e); |
| } |
| } |
| |
| //WSDL 2.0 |
| public void printWSDL2(OutputStream out) throws AxisFault { |
| if (isUseUserWSDL()) { |
| Parameter wsld4jdefinition = getParameter(WSDLConstants.WSDL_4_J_DEFINITION); |
| if (wsld4jdefinition != null) { |
| try { |
| String error = "<error>" + |
| "<description>Unable to showtwo will WSDL for this service</description>" + |
| "<reason>WSDL 2.0 document is to be shown. But we do not support WSDL 2.0" + |
| "serialization yet.</reason>" + |
| "</error>"; |
| out.write(error.getBytes()); |
| out.flush(); |
| out.close(); |
| } catch (IOException e) { |
| throw new AxisFault(e); |
| } |
| } else { |
| printWSDLError(out); |
| } |
| } else { |
| setWsdlFound(true); |
| //pick the endpoint and take it as the epr for the WSDL |
| getWSDL2(out, new String[]{this.endpoint}); |
| } |
| } |
| |
| public void printWSDL2(OutputStream out, |
| String requestIP, |
| String servicePath) throws AxisFault { |
| getWSDL2(out, getEPRs()); |
| } |
| |
| private void getWSDL2(OutputStream out, String[] serviceURL) throws AxisFault { |
| if (this.wsdlFound) { |
| AxisService2WSDL2 axisService2WSDL2 = new AxisService2WSDL2(this, serviceURL); |
| try { |
| OMElement wsdlElement = axisService2WSDL2.generateOM(); |
| wsdlElement.serialize(out); |
| out.flush(); |
| out.close(); |
| } catch (Exception e) { |
| throw new AxisFault(e); |
| } |
| } else { |
| printWSDLError(out); |
| } |
| |
| } |
| |
| /** |
| * Gets the description about the service which is specified in services.xml. |
| * |
| * @return Returns String. |
| */ |
| public String getServiceDescription() { |
| return serviceDescription; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.apache.axis2.description.AxisService#getClassLoader() |
| */ |
| |
| /** |
| * Method getClassLoader. |
| * |
| * @return Returns ClassLoader. |
| */ |
| public ClassLoader getClassLoader() { |
| return this.serviceClassLoader; |
| } |
| |
| /** |
| * Gets the control operation which are added by module like RM. |
| */ |
| public ArrayList getControlOperations() { |
| Iterator op_itr = getOperations(); |
| ArrayList operationList = new ArrayList(); |
| |
| while (op_itr.hasNext()) { |
| AxisOperation operation = (AxisOperation) op_itr.next(); |
| |
| if (operation.isControlOperation()) { |
| operationList.add(operation); |
| } |
| } |
| |
| return operationList; |
| } |
| |
| /** |
| * Method getEngagedModules. |
| * |
| * @return Returns Collection. |
| */ |
| public Collection getEngagedModules() { |
| return engagedModules; |
| } |
| |
| public URL getFileName() { |
| return fileName; |
| } |
| |
| public long getLastupdate() { |
| return lastupdate; |
| } |
| |
| public ModuleConfiguration getModuleConfig(QName moduleName) { |
| return (ModuleConfiguration) moduleConfigmap.get(moduleName); |
| } |
| |
| public ArrayList getModules() { |
| return moduleRefs; |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| /** |
| * Method getOperation. |
| * |
| * @param operationName |
| * @return Returns AxisOperation. |
| */ |
| public AxisOperation getOperation(QName operationName) { |
| // AxisOperation axisOperation = (AxisOperation) operations.get(operationName); |
| AxisOperation axisOperation = (AxisOperation) getChild(operationName); |
| |
| if (axisOperation == null) { |
| axisOperation = (AxisOperation) operationsAliasesMap.get( |
| operationName.getLocalPart()); |
| } |
| |
| return axisOperation; |
| } |
| |
| |
| /** |
| * Returns the AxisOperation which has been mapped to the given action. |
| * |
| * @param action the action key |
| * @return Returns the corresponding AxisOperation or null if it isn't found. |
| */ |
| public AxisOperation getOperationByAction(String action) { |
| return (AxisOperation) operationsAliasesMap.get(action); |
| } |
| |
| /** |
| * Returns the operation given a SOAP Action. This |
| * method should be called if only one Endpoint is defined for |
| * this Service. If more than one Endpoint exists, one of them will be |
| * picked. If more than one Operation is found with the given SOAP Action; |
| * null will be returned. If no particular Operation is found with the given |
| * SOAP Action; null will be returned. |
| * |
| * @param soapAction SOAP Action defined for the particular Operation |
| * @return Returns an AxisOperation if a unique Operation can be found with the given |
| * SOAP Action otherwise will return null. |
| */ |
| public AxisOperation getOperationBySOAPAction(String soapAction) { |
| if ((soapAction == null) || soapAction.length() == 0) { |
| return null; |
| } |
| |
| // AxisOperation operation = (AxisOperation) operations.get(new QName(soapAction)); |
| AxisOperation operation = (AxisOperation) getChild(new QName(soapAction)); |
| |
| if (operation != null) { |
| return operation; |
| } |
| |
| operation = (AxisOperation) operationsAliasesMap.get(soapAction); |
| |
| return operation; |
| } |
| |
| /** |
| * Method getOperations. |
| * |
| * @return Returns HashMap |
| */ |
| public Iterator getOperations() { |
| return getChildren(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.apache.axis2.description.ParameterInclude#getParameter(java.lang.String) |
| */ |
| |
| /** |
| * Gets only the published operations. |
| */ |
| public ArrayList getPublishedOperations() { |
| Iterator op_itr = getOperations(); |
| ArrayList operationList = new ArrayList(); |
| |
| while (op_itr.hasNext()) { |
| AxisOperation operation = (AxisOperation) op_itr.next(); |
| |
| if (!operation.isControlOperation()) { |
| operationList.add(operation); |
| } |
| } |
| |
| return operationList; |
| } |
| |
| /** |
| * Sets the description about the service which is specified in services.xml |
| * |
| * @param serviceDescription |
| */ |
| public void setServiceDescription(String serviceDescription) { |
| this.serviceDescription = serviceDescription; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.apache.axis2.description.AxisService#setClassLoader(java.lang.ClassLoader) |
| */ |
| |
| /** |
| * Method setClassLoader. |
| * |
| * @param classLoader |
| */ |
| public void setClassLoader(ClassLoader classLoader) { |
| this.serviceClassLoader = classLoader; |
| } |
| |
| public void setFileName(URL fileName) { |
| this.fileName = fileName; |
| } |
| |
| /** |
| * Sets the current time as last update time of the service. |
| */ |
| public void setLastupdate() { |
| lastupdate = new Date().getTime(); |
| } |
| |
| public void setName(String name) { |
| this.name = name; |
| } |
| |
| public ArrayList getSchema() { |
| return schemaList; |
| } |
| |
| public void addSchema(XmlSchema schema) { |
| if (schema != null) { |
| schemaList.add(schema); |
| if (schema.getTargetNamespace() != null) { |
| addSchemaNameSpace(schema); |
| } |
| } |
| } |
| |
| public void addSchema(Collection schemas) { |
| Iterator iterator = schemas.iterator(); |
| while (iterator.hasNext()) { |
| XmlSchema schema = (XmlSchema) iterator.next(); |
| schemaList.add(schema); |
| addSchemaNameSpace(schema); |
| } |
| } |
| |
| public boolean isWsdlFound() { |
| return wsdlFound; |
| } |
| |
| public void setWsdlFound(boolean wsdlFound) { |
| this.wsdlFound = wsdlFound; |
| } |
| |
| public String getScope() { |
| return scope; |
| } |
| |
| /** |
| * @param scope - Available scopes : |
| * Constants.SCOPE_APPLICATION |
| * Constants.SCOPE_TRANSPORT_SESSION |
| * Constants.SCOPE_SOAP_SESSION |
| * Constants.SCOPE_REQUEST.equals |
| */ |
| public void setScope(String scope) { |
| if (Constants.SCOPE_APPLICATION.equals(scope) || |
| Constants.SCOPE_TRANSPORT_SESSION.equals(scope) || |
| Constants.SCOPE_SOAP_SESSION.equals(scope) || |
| Constants.SCOPE_REQUEST.equals(scope)) { |
| this.scope = scope; |
| } |
| } |
| |
| public boolean isUseDefaultChains() { |
| return useDefaultChains; |
| } |
| |
| public void setUseDefaultChains(boolean useDefaultChains) { |
| this.useDefaultChains = useDefaultChains; |
| } |
| |
| public Object getKey() { |
| return this.name; |
| } |
| |
| public boolean isActive() { |
| return active; |
| } |
| |
| public void setActive(boolean active) { |
| this.active = active; |
| } |
| |
| public String getSchematargetNamespace() { |
| return schematargetNamespace; |
| } |
| |
| public void setSchematargetNamespace(String schematargetNamespace) { |
| this.schematargetNamespace = schematargetNamespace; |
| } |
| |
| public String getSchematargetNamespacePrefix() { |
| return schematargetNamespacePrefix; |
| } |
| |
| public void setSchematargetNamespacePrefix(String schematargetNamespacePrefix) { |
| this.schematargetNamespacePrefix = schematargetNamespacePrefix; |
| } |
| |
| public String getTargetNamespace() { |
| return targetNamespace; |
| } |
| |
| public void setTargetNamespace(String targetNamespace) { |
| this.targetNamespace = targetNamespace; |
| } |
| |
| public String getTargetNamespacePrefix() { |
| return targetNamespacePrefix; |
| } |
| |
| public void setTargetNamespacePrefix(String targetNamespacePrefix) { |
| this.targetNamespacePrefix = targetNamespacePrefix; |
| } |
| |
| public XmlSchemaElement getSchemaElement(QName elementQName) { |
| XmlSchemaElement element; |
| for (int i = 0; i < schemaList.size(); i++) { |
| XmlSchema schema = (XmlSchema) schemaList.get(i); |
| if (schema != null) { |
| element = schema.getElementByName(elementQName); |
| if (element != null) { |
| return element; |
| } |
| } |
| } |
| return null; |
| } |
| |
| public boolean isEnableAllTransports() { |
| return enableAllTransports; |
| } |
| |
| /** |
| * To eneble service to be expose in all the transport |
| * @param enableAllTransports |
| */ |
| public void setEnableAllTransports(boolean enableAllTransports) { |
| this.enableAllTransports = enableAllTransports; |
| } |
| |
| public List getExposedTransports() { |
| return this.exposedTransports; |
| } |
| |
| public void setExposedTransports(List transports) { |
| enableAllTransports = false; |
| this.exposedTransports = transports; |
| } |
| |
| public void addExposedTransport(String transport) { |
| enableAllTransports = false; |
| if (!this.exposedTransports.contains(transport)) { |
| this.exposedTransports.add(transport); |
| } |
| } |
| |
| public void removeExposedTransport(String transport) { |
| enableAllTransports = false; |
| this.exposedTransports.remove(transport); |
| } |
| |
| public boolean isExposedTransport(String transport) { |
| return exposedTransports.contains(transport); |
| } |
| |
| public void disengageModule(AxisModule module) { |
| AxisConfiguration axisConfig = getAxisConfiguration(); |
| if (axisConfig != null) { |
| PhaseResolver phaseResolver = new PhaseResolver(axisConfig); |
| if (axisConfig.isEngaged(module.getName())) { |
| removeModuleOperations(module); |
| Iterator operations = getChildren(); |
| while (operations.hasNext()) { |
| AxisOperation axisOperation = (AxisOperation) operations.next(); |
| phaseResolver.disengageModuleFromOperationChain(module, axisOperation); |
| axisOperation.removeFromEngagedModuleList(module); |
| } |
| } else { |
| if (isEngaged(module.getName())) { |
| phaseResolver.disengageModuleFromGlobalChains(module); |
| removeModuleOperations(module); |
| Iterator operations = getChildren(); |
| while (operations.hasNext()) { |
| AxisOperation axisOperation = (AxisOperation) operations.next(); |
| phaseResolver.disengageModuleFromOperationChain(module, axisOperation); |
| axisOperation.removeFromEngagedModuleList(module); |
| } |
| } |
| } |
| } |
| engagedModules.remove(module); |
| } |
| |
| /** |
| * To remove module operations added at the time of engagement |
| */ |
| private void removeModuleOperations(AxisModule module) { |
| HashMap moduleOerations = module.getOperations(); |
| if (moduleOerations != null) { |
| Iterator moduleOperations_itr = moduleOerations.values().iterator(); |
| while (moduleOperations_itr.hasNext()) { |
| AxisOperation operation = (AxisOperation) moduleOperations_itr.next(); |
| removeOperation(operation.getName()); |
| } |
| } |
| } |
| |
| public boolean isEngaged(QName moduleName) { |
| AxisModule module = getAxisConfiguration().getModule(moduleName); |
| if (module == null) { |
| return false; |
| } |
| Iterator engagedModuleItr = engagedModules.iterator(); |
| while (engagedModuleItr.hasNext()) { |
| AxisModule axisModule = (AxisModule) engagedModuleItr.next(); |
| if (axisModule.getName().getLocalPart().equals(module.getName().getLocalPart())) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| //####################################################################################### |
| // APIs to create AxisService |
| |
| // |
| |
| /** |
| * To create a AxisService for a given WSDL and the created client is most suitable for client side |
| * invocation not for server side invocation. Since all the soap action and wsa action is added to |
| * operations |
| * |
| * @param wsdlURL location of the WSDL |
| * @param wsdlServiceName name of the service to be invoke , if it is null then the first one will |
| * be selected if there are more than one |
| * @param portName name of the port , if there are more than one , if it is null then the |
| * first one in the iterator will be selected |
| * @param options Service client options, to set the target EPR |
| * @return AxisService , the created service will be return |
| */ |
| public static AxisService createClientSideAxisService(URL wsdlURL, |
| QName wsdlServiceName, |
| String portName, |
| Options options) throws AxisFault { |
| try { |
| InputStream in = wsdlURL.openConnection().getInputStream(); |
| Document doc = XMLUtils.newDocument(in); |
| WSDLReader reader = WSDLFactory.newInstance().newWSDLReader(); |
| reader.setFeature("javax.wsdl.importDocuments", true); |
| Definition wsdlDefinition = reader.readWSDL(null, doc); |
| return createClientSideAxisService(wsdlDefinition, wsdlServiceName, portName, options); |
| } catch (IOException e) { |
| log.error(e); |
| throw new AxisFault("IOException : " + e.getMessage()); |
| } catch (ParserConfigurationException e) { |
| log.error(e); |
| throw new AxisFault("ParserConfigurationException : " + e.getMessage()); |
| } catch (SAXException e) { |
| log.error(e); |
| throw new AxisFault("SAXException : " + e.getMessage()); |
| } catch (WSDLException e) { |
| log.error(e); |
| throw new AxisFault("WSDLException : " + e.getMessage()); |
| } |
| } |
| |
| public static AxisService createClientSideAxisService(Definition wsdlDefinition, |
| QName wsdlServiceName, |
| String portName, |
| Options options) throws AxisFault { |
| WSDL11ToAxisServiceBuilder serviceBuilder = |
| new WSDL11ToAxisServiceBuilder(wsdlDefinition, wsdlServiceName, portName); |
| serviceBuilder.setServerSide(false); |
| AxisService axisService = serviceBuilder.populateService(); |
| options.setTo(new EndpointReference(axisService.getEndpoint())); |
| options.setSoapVersionURI(axisService.getSoapNsUri()); |
| return axisService; |
| } |
| |
| /** |
| * To create an AxisService using given service impl class name |
| * first generate schema corresponding to the given java class , next for each methods AxisOperation |
| * will be created. |
| * <p/> |
| * Note : Inorder to work this properly RPCMessageReceiver should be available in the class path |
| * otherewise operation can not continue |
| * |
| * @param implClass |
| * @param axisConfig |
| * @return return created AxisSrevice |
| */ |
| public static AxisService createService(String implClass, |
| AxisConfiguration axisConfig, |
| Class messageReceiverClass) throws AxisFault { |
| return createService(implClass, axisConfig, messageReceiverClass, null, null); |
| } |
| |
| /** |
| * messageReceiverClassMap will hold the MessageReceivers for given meps. Key will be the |
| * mep and value will be the instance of the MessageReceiver class. |
| * Ex: |
| * Map mrMap = new HashMap(); |
| * mrMap.put("http://www.w3.org/2004/08/wsdl/in-only", |
| * RPCInOnlyMessageReceiver.class.newInstance()); |
| * mrMap.put("http://www.w3.org/2004/08/wsdl/in-out", |
| * RPCMessageReceiver.class.newInstance()); |
| * |
| * @param implClass |
| * @param axisConfiguration |
| * @param messageReceiverClassMap |
| * @param targetNamespace |
| * @param schemaNamespace |
| * @throws AxisFault |
| */ |
| |
| public static AxisService createService(String implClass, |
| AxisConfiguration axisConfiguration, |
| Map messageReceiverClassMap, |
| String targetNamespace, |
| String schemaNamespace) throws AxisFault { |
| Parameter parameter = new Parameter(Constants.SERVICE_CLASS, implClass); |
| OMElement paraElement = Utils.getParameter(Constants.SERVICE_CLASS, implClass, false); |
| parameter.setParameterElement(paraElement); |
| AxisService axisService = new AxisService(); |
| axisService.setUseDefaultChains(false); |
| axisService.addParameter(parameter); |
| |
| if (schemaNamespace == null) { |
| schemaNamespace = axisService.getSchematargetNamespace(); |
| } |
| |
| int index = implClass.lastIndexOf("."); |
| String serviceName; |
| if (index > 0) { |
| serviceName = implClass.substring(index + 1, implClass.length()); |
| } else { |
| serviceName = implClass; |
| } |
| |
| axisService.setName(serviceName); |
| axisService.setClassLoader(axisConfiguration.getServiceClassLoader()); |
| |
| ClassLoader serviceClassLoader = axisService.getClassLoader(); |
| SchemaGenerator schemaGenerator; |
| ArrayList excludeOpeartion = new ArrayList(); |
| |
| |
| NamespaceMap map = new NamespaceMap(); |
| map.put(Java2WSDLConstants.AXIS2_NAMESPACE_PREFIX, |
| Java2WSDLConstants.AXIS2_XSD); |
| map.put(Java2WSDLConstants.DEFAULT_SCHEMA_NAMESPACE_PREFIX, |
| Java2WSDLConstants.URI_2001_SCHEMA_XSD); |
| axisService.setNameSpacesMap(map); |
| |
| |
| try { |
| schemaGenerator = new SchemaGenerator(serviceClassLoader, |
| implClass, schemaNamespace, |
| axisService.getSchematargetNamespacePrefix()); |
| schemaGenerator.setElementFormDefault(Java2WSDLConstants.FORM_DEFAULT_UNQUALIFIED); |
| axisService.setElementFormDefault(false); |
| excludeOpeartion.add("init"); |
| excludeOpeartion.add("setOperationContext"); |
| excludeOpeartion.add("destroy"); |
| excludeOpeartion.add("startUp"); |
| schemaGenerator.setExcludeMethods(excludeOpeartion); |
| axisService.addSchema(schemaGenerator.generateSchema()); |
| axisService.setSchematargetNamespace(schemaGenerator.getSchemaTargetNameSpace()); |
| axisService.setTypeTable(schemaGenerator.getTypeTable()); |
| if (targetNamespace == null) { |
| targetNamespace = schemaGenerator.getSchemaTargetNameSpace(); |
| } |
| if (targetNamespace != null && !"".equals(targetNamespace)) { |
| axisService.setTargetNamespace(targetNamespace); |
| } |
| } catch (Exception e) { |
| throw new AxisFault(e); |
| } |
| |
| JMethod[] method = schemaGenerator.getMethods(); |
| TypeTable table = schemaGenerator.getTypeTable(); |
| |
| PhasesInfo pinfo = axisConfiguration.getPhasesInfo(); |
| |
| for (int i = 0; i < method.length; i++) { |
| JMethod jmethod = method[i]; |
| if (!jmethod.isPublic()) { |
| // no need to expose , private and protected methods |
| continue; |
| } else if (excludeOpeartion.contains(jmethod.getSimpleName())) { |
| continue; |
| } |
| AxisOperation operation = Utils.getAxisOperationforJmethod(jmethod, table); |
| String mep = operation.getMessageExchangePattern(); |
| MessageReceiver mr; |
| if (messageReceiverClassMap != null) { |
| |
| if (messageReceiverClassMap.get(mep) != null) { |
| Object obj = messageReceiverClassMap.get(mep); |
| if (obj instanceof MessageReceiver) { |
| mr = (MessageReceiver) obj; |
| operation.setMessageReceiver(mr); |
| } else { |
| log.error("Object is not an instance of MessageReceiver, thus, default MessageReceiver has been set"); |
| mr = axisConfiguration.getMessageReceiver(operation.getMessageExchangePattern()); |
| operation.setMessageReceiver(mr); |
| } |
| } else { |
| log.error("Required MessageReceiver couldn't be found, thus, default MessageReceiver has been used"); |
| mr = axisConfiguration.getMessageReceiver(operation.getMessageExchangePattern()); |
| operation.setMessageReceiver(mr); |
| } |
| } else { |
| log.error("MessageRecevierClassMap couldn't be found, thus, default MessageReceiver has been used"); |
| mr = axisConfiguration.getMessageReceiver(operation.getMessageExchangePattern()); |
| operation.setMessageReceiver(mr); |
| } |
| pinfo.setOperationPhases(operation); |
| axisService.addOperation(operation); |
| } |
| return axisService; |
| |
| } |
| |
| /** |
| * To create a service for a given Java class with user defined schema and target |
| * namespaces. This method should be used iff, the operations in the service class is homogeneous. |
| * |
| * @param implClass : full name of the class |
| * @param axisConfig : current AxisConfgiuration |
| * @param messageReceiverClass : Message receiver that you want to use |
| * @param targetNameSpace : Service namespace |
| * @param schemaNameSpace : Schema namespace |
| * @throws AxisFault |
| */ |
| |
| public static AxisService createService(String implClass, |
| AxisConfiguration axisConfig, |
| Class messageReceiverClass, |
| String targetNameSpace, |
| String schemaNameSpace) throws AxisFault { |
| Parameter parameter = new Parameter(Constants.SERVICE_CLASS, implClass); |
| OMElement paraElement = Utils.getParameter(Constants.SERVICE_CLASS, implClass, false); |
| parameter.setParameterElement(paraElement); |
| AxisService axisService = new AxisService(); |
| axisService.setUseDefaultChains(false); |
| axisService.addParameter(parameter); |
| |
| if (schemaNameSpace == null) { |
| schemaNameSpace = axisService.getSchematargetNamespace(); |
| } |
| |
| int index = implClass.lastIndexOf("."); |
| String serviceName; |
| if (index > 0) { |
| serviceName = implClass.substring(index + 1, implClass.length()); |
| } else { |
| serviceName = implClass; |
| } |
| |
| axisService.setName(serviceName); |
| axisService.setClassLoader(axisConfig.getServiceClassLoader()); |
| |
| ClassLoader serviceClassLoader = axisService.getClassLoader(); |
| SchemaGenerator schemaGenerator; |
| ArrayList excludeOpeartion = new ArrayList(); |
| |
| |
| NamespaceMap map = new NamespaceMap(); |
| map.put(Java2WSDLConstants.AXIS2_NAMESPACE_PREFIX, |
| Java2WSDLConstants.AXIS2_XSD); |
| map.put(Java2WSDLConstants.DEFAULT_SCHEMA_NAMESPACE_PREFIX, |
| Java2WSDLConstants.URI_2001_SCHEMA_XSD); |
| axisService.setNameSpacesMap(map); |
| |
| |
| try { |
| schemaGenerator = new SchemaGenerator(serviceClassLoader, |
| implClass, schemaNameSpace, |
| axisService.getSchematargetNamespacePrefix()); |
| schemaGenerator.setElementFormDefault(Java2WSDLConstants.FORM_DEFAULT_UNQUALIFIED); |
| axisService.setElementFormDefault(false); |
| excludeOpeartion.add("init"); |
| excludeOpeartion.add("setOperationContext"); |
| excludeOpeartion.add("destroy"); |
| excludeOpeartion.add("startUp"); |
| schemaGenerator.setExcludeMethods(excludeOpeartion); |
| axisService.addSchema(schemaGenerator.generateSchema()); |
| axisService.setSchematargetNamespace(schemaGenerator.getSchemaTargetNameSpace()); |
| axisService.setTypeTable(schemaGenerator.getTypeTable()); |
| if (targetNameSpace == null) { |
| targetNameSpace = schemaGenerator.getSchemaTargetNameSpace(); |
| } |
| if (targetNameSpace != null && !"".equals(targetNameSpace)) { |
| axisService.setTargetNamespace(targetNameSpace); |
| } |
| } catch (Exception e) { |
| throw new AxisFault(e); |
| } |
| |
| JMethod[] method = schemaGenerator.getMethods(); |
| TypeTable table = schemaGenerator.getTypeTable(); |
| |
| PhasesInfo pinfo = axisConfig.getPhasesInfo(); |
| |
| for (int i = 0; i < method.length; i++) { |
| JMethod jmethod = method[i]; |
| if (!jmethod.isPublic()) { |
| // no need to expose , private and protected methods |
| continue; |
| } else if (excludeOpeartion.contains(jmethod.getSimpleName())) { |
| continue; |
| } |
| AxisOperation operation = Utils.getAxisOperationforJmethod(jmethod, table); |
| |
| // loading message receivers |
| try { |
| MessageReceiver messageReceiver = (MessageReceiver) messageReceiverClass.newInstance(); |
| operation.setMessageReceiver(messageReceiver); |
| } catch (IllegalAccessException e) { |
| throw new AxisFault("IllegalAccessException occurred during message receiver loading" |
| + e.getMessage()); |
| } catch (InstantiationException e) { |
| throw new AxisFault("InstantiationException occurred during message receiver loading" |
| + e.getMessage()); |
| } |
| pinfo.setOperationPhases(operation); |
| axisService.addOperation(operation); |
| } |
| return axisService; |
| |
| } |
| |
| public static AxisService createService(String implClass, |
| AxisConfiguration axisConfig) throws AxisFault { |
| Class clazz; |
| try { |
| clazz = Loader.loadClass("org.apache.axis2.rpc.receivers.RPCMessageReceiver"); |
| } catch (ClassNotFoundException e) { |
| throw new AxisFault("ClassNotFoundException occured during message receiver loading" |
| + e.getMessage()); |
| } |
| |
| return createService(implClass, axisConfig, clazz); |
| |
| } |
| |
| public void removeOperation(QName opName) { |
| AxisOperation operation = getOperation(opName); |
| if (operation != null) { |
| removeChild(opName); |
| ArrayList mappingList = operation.getWsamappingList(); |
| if (mappingList != null) { |
| for (int i = 0; i < mappingList.size(); i++) { |
| String actionMapping = (String) mappingList.get(i); |
| operationsAliasesMap.remove(actionMapping); |
| } |
| } |
| operationsAliasesMap.remove(operation.getName().getLocalPart()); |
| } |
| } |
| |
| public Map getNameSpacesMap() { |
| return nameSpacesMap; |
| } |
| |
| public void setNameSpacesMap(NamespaceMap nameSpacesMap) { |
| this.nameSpacesMap = nameSpacesMap; |
| } |
| |
| private void addSchemaNameSpace(XmlSchema schema) { |
| String targetNameSpace = schema.getTargetNamespace(); |
| String prefix = schema.getNamespaceContext().getPrefix(targetNameSpace); |
| |
| boolean found = false; |
| if (nameSpacesMap != null && nameSpacesMap.size() > 0) { |
| Iterator itr = nameSpacesMap.values().iterator(); |
| Set keys = nameSpacesMap.keySet(); |
| while (itr.hasNext()) { |
| String value = (String) itr.next(); |
| if (value.equals(targetNameSpace) && keys.contains(prefix)) { |
| found = true; |
| } |
| } |
| } |
| if (nameSpacesMap == null) { |
| nameSpacesMap = new NamespaceMap(); |
| } |
| if (!found) { |
| nameSpacesMap.put("ns" + nsCount, targetNameSpace); |
| nsCount++; |
| } |
| } |
| |
| /** |
| * runs the schema mappings if it has not been run previously |
| * it is best that this logic be in the axis service since one can |
| * call the axis service to populate the schema mappings |
| */ |
| public void populateSchemaMappings() { |
| |
| //populate the axis service with the necessary schema references |
| ArrayList schema = this.schemaList; |
| if (!this.schemaLocationsAdjusted) { |
| Hashtable nameTable = new Hashtable(); |
| //calculate unique names for the schemas |
| calcualteSchemaNames(schema, nameTable); |
| //adjust the schema locations as per the calculated names |
| adjustSchemaNames(schema, nameTable); |
| //reverse the nametable so that there is a mapping from the |
| //name to the schemaObject |
| setSchemaMappingTable(swapMappingTable(nameTable)); |
| setSchemaLocationsAdjusted(true); |
| } |
| } |
| |
| /** |
| * run 1 -calcualte unique names |
| * |
| * @param schemas |
| */ |
| private void calcualteSchemaNames(List schemas, Hashtable nameTable) { |
| //first traversal - fill the hashtable |
| for (int i = 0; i < schemas.size(); i++) { |
| XmlSchema schema = (XmlSchema) schemas.get(i); |
| XmlSchemaObjectCollection includes = schema.getIncludes(); |
| |
| for (int j = 0; j < includes.getCount(); j++) { |
| Object item = includes.getItem(j); |
| XmlSchema s; |
| if (item instanceof XmlSchemaExternal) { |
| XmlSchemaExternal externalSchema = (XmlSchemaExternal) item; |
| s = externalSchema.getSchema(); |
| if (s != null && nameTable.get(s) == null) { |
| //insert the name into the table |
| insertIntoNameTable(nameTable, s); |
| //recursively call the same procedure |
| calcualteSchemaNames(Arrays.asList( |
| new XmlSchema[]{s}), |
| nameTable); |
| } |
| } |
| } |
| } |
| } |
| |
| /** |
| * A quick private sub routine to insert the names |
| * |
| * @param nameTable |
| * @param s |
| */ |
| private void insertIntoNameTable(Hashtable nameTable, XmlSchema s) { |
| nameTable.put(s, |
| ("xsd" + count++) |
| + (customSchemaNameSuffix != null ? |
| customSchemaNameSuffix : |
| "")); |
| } |
| |
| /** |
| * Run 2 - adjust the names |
| */ |
| private void adjustSchemaNames(List schemas, Hashtable nameTable) { |
| Hashtable importedSchemas = new Hashtable(); |
| //process the schemas in the main schema list |
| for (int i = 0; i < schemas.size(); i++) { |
| adjustSchemaName((XmlSchema) schemas.get(i), nameTable, importedSchemas); |
| } |
| //process all the rest in the name table |
| Enumeration nameTableKeys = nameTable.keys(); |
| while (nameTableKeys.hasMoreElements()) { |
| adjustSchemaName((XmlSchema) nameTableKeys.nextElement(), nameTable, importedSchemas); |
| |
| } |
| } |
| |
| /** |
| * Adjust a single schema |
| * |
| * @param parentSchema |
| * @param nameTable |
| */ |
| private void adjustSchemaName(XmlSchema parentSchema, Hashtable nameTable, Hashtable importedScheams) { |
| XmlSchemaObjectCollection includes = parentSchema.getIncludes(); |
| for (int j = 0; j < includes.getCount(); j++) { |
| Object item = includes.getItem(j); |
| if (item instanceof XmlSchemaExternal) { |
| XmlSchemaExternal xmlSchemaExternal = (XmlSchemaExternal) item; |
| XmlSchema s = xmlSchemaExternal.getSchema(); |
| adjustSchemaLocation(s, xmlSchemaExternal, nameTable, importedScheams); |
| } |
| } |
| |
| } |
| |
| /** |
| * Adjusts a given schema location |
| * |
| * @param s |
| * @param xmlSchemaExternal |
| * @param nameTable |
| */ |
| private void adjustSchemaLocation(XmlSchema s, XmlSchemaExternal xmlSchemaExternal, Hashtable nameTable, Hashtable importedScheams) { |
| if (s != null) { |
| String schemaLocation = xmlSchemaExternal.getSchemaLocation(); |
| if (importedScheams.get(schemaLocation) != null) { |
| xmlSchemaExternal.setSchemaLocation( |
| (String) importedScheams.get(xmlSchemaExternal.getSchemaLocation())); |
| } else { |
| String newscheamlocation = customSchemaNamePrefix == null ? |
| //use the default mode |
| (getName() + |
| "?xsd=" + |
| nameTable.get(s)) : |
| //custom prefix is present - add the custom prefix |
| (customSchemaNamePrefix + |
| nameTable.get(s)); |
| xmlSchemaExternal.setSchemaLocation( |
| newscheamlocation); |
| importedScheams.put(schemaLocation, newscheamlocation); |
| } |
| |
| } |
| } |
| |
| /** |
| * Swap the key,value pairs |
| * |
| * @param originalTable |
| */ |
| private Map swapMappingTable(Map originalTable) { |
| HashMap swappedTable = new HashMap(originalTable.size()); |
| Iterator keys = originalTable.keySet().iterator(); |
| Object key; |
| while (keys.hasNext()) { |
| key = keys.next(); |
| swappedTable.put(originalTable.get(key), key); |
| } |
| |
| return swappedTable; |
| } |
| |
| public boolean isClientSide() { |
| return clientSide; |
| } |
| |
| public void setClientSide(boolean clientSide) { |
| this.clientSide = clientSide; |
| } |
| |
| public boolean isElementFormDefault() { |
| return elementFormDefault; |
| } |
| |
| public void setElementFormDefault(boolean elementFormDefault) { |
| this.elementFormDefault = elementFormDefault; |
| } |
| |
| /** |
| * User can set a parameter in services.xml saying he want to show the original wsdl |
| * that he put into META-INF once someone ask for ?wsdl |
| * so if you want to use your own wsdl then add following parameter into |
| * services.xml |
| * <parameter name="useOriginalwsdl">true</parameter> |
| */ |
| public boolean isUseUserWSDL() { |
| Parameter parameter = getParameter("useOriginalwsdl"); |
| if (parameter != null) { |
| String value = (String) parameter.getValue(); |
| if ("true".equals(value)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public ServiceLifeCycle getServiceLifeCycle() { |
| return serviceLifeCycle; |
| } |
| |
| public void setServiceLifeCycle(ServiceLifeCycle serviceLifeCycle) { |
| this.serviceLifeCycle = serviceLifeCycle; |
| } |
| |
| public Map getP2nMap() { |
| return p2nMap; |
| } |
| |
| public void setP2nMap(Map p2nMap) { |
| this.p2nMap = p2nMap; |
| } |
| |
| public ObjectSupplier getObjectSupplier() { |
| return objectSupplier; |
| } |
| |
| public void setObjectSupplier(ObjectSupplier objectSupplier) { |
| this.objectSupplier = objectSupplier; |
| } |
| |
| public TypeTable getTypeTable() { |
| return typeTable; |
| } |
| |
| public void setTypeTable(TypeTable typeTable) { |
| this.typeTable = typeTable; |
| } |
| } |