From 4f374ecd7d1df0845ae151c86af1dd14a1b06bdd Mon Sep 17 00:00:00 2001 From: slaws Date: Fri, 29 Jan 2010 17:43:49 +0000 Subject: Experiments looking at what things we might improve. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@904573 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/binding/ws/axis2/Axis2BindingInvoker.java | 10 +- .../binding/ws/axis2/Axis2ConfiguratorHelper.java | 78 --- .../binding/ws/axis2/Axis2EngineIntegration.java | 656 ++++++++++++++++++++ .../ws/axis2/Axis2ServiceBindingProvider.java | 4 +- .../sca/binding/ws/axis2/Axis2ServiceClient.java | 27 +- .../sca/binding/ws/axis2/Axis2ServiceProvider.java | 672 +-------------------- .../sca/binding/ws/axis2/Axis2ServiceServlet.java | 51 +- .../sca/binding/ws/axis2/AxisPolicyHelper.java | 5 +- .../binding/ws/axis2/TuscanyAxisConfigurator.java | 336 ----------- .../binding/ws/axis2/TuscanyListenerManager.java | 115 ---- .../sca/binding/ws/axis2/TuscanyListingAgent.java | 14 +- 11 files changed, 728 insertions(+), 1240 deletions(-) delete mode 100644 sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ConfiguratorHelper.java create mode 100644 sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2EngineIntegration.java delete mode 100644 sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyAxisConfigurator.java delete mode 100644 sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyListenerManager.java (limited to 'sca-java-2.x/trunk') diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2BindingInvoker.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2BindingInvoker.java index fe10e6a4eb..58de97d74b 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2BindingInvoker.java +++ b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2BindingInvoker.java @@ -41,10 +41,6 @@ import org.apache.axis2.context.MessageContext; import org.apache.axis2.transport.http.HTTPConstants; import org.apache.tuscany.sca.assembly.Endpoint; import org.apache.tuscany.sca.binding.ws.WebServiceBinding; -import org.apache.tuscany.sca.binding.ws.axis2.policy.authentication.token.Axis2TokenAuthenticationPolicy; -import org.apache.tuscany.sca.binding.ws.axis2.policy.configurator.Axis2BindingBasicAuthenticationConfigurator; -import org.apache.tuscany.sca.binding.ws.axis2.policy.configurator.Axis2BindingHeaderConfigurator; -import org.apache.tuscany.sca.binding.ws.axis2.policy.header.Axis2HeaderPolicy; import org.apache.tuscany.sca.interfacedef.util.FaultException; import org.apache.tuscany.sca.invocation.DataExchangeSemantics; import org.apache.tuscany.sca.invocation.Invoker; @@ -77,8 +73,8 @@ public class Axis2BindingInvoker implements Invoker, DataExchangeSemantics { private WebServiceBinding wsBinding; private BasicAuthenticationPolicy basicAuthenticationPolicy = null; - private Axis2TokenAuthenticationPolicy axis2TokenAuthenticationPolicy = null; - private List axis2HeaderPolicies = new ArrayList(); +// private Axis2TokenAuthenticationPolicy axis2TokenAuthenticationPolicy = null; +// private List axis2HeaderPolicies = new ArrayList(); public Axis2BindingInvoker(Axis2ServiceClient serviceClient, QName wsdlOperationName, @@ -149,6 +145,7 @@ public class Axis2BindingInvoker implements Invoker, DataExchangeSemantics { */ // set policy specified headers +/* for (Axis2HeaderPolicy policy : axis2HeaderPolicies){ Axis2BindingHeaderConfigurator.setHeader(requestMC, msg, policy.getHeaderName()); } @@ -160,6 +157,7 @@ public class Axis2BindingInvoker implements Invoker, DataExchangeSemantics { if (axis2TokenAuthenticationPolicy != null) { Axis2BindingHeaderConfigurator.setHeader(requestMC, msg, axis2TokenAuthenticationPolicy.getTokenName()); } +*/ // Allow privileged access to read properties. Requires PropertiesPermission read in // security policy. diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ConfiguratorHelper.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ConfiguratorHelper.java deleted file mode 100644 index a7dc09ea6d..0000000000 --- a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ConfiguratorHelper.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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.tuscany.sca.binding.ws.axis2; - -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; - -import org.apache.axis2.AxisFault; -import org.apache.axis2.context.ConfigurationContext; -import org.apache.axis2.deployment.URLBasedAxisConfigurator; -import org.apache.tuscany.sca.extensibility.ClassLoaderContext; -import org.oasisopen.sca.ServiceRuntimeException; - -/** - * The Helper class that loades the Axis2 configuration from the axis2.xml - */ -public class Axis2ConfiguratorHelper { - - /** - * We cannot hold this method directly in the {@link TuscanyAxisConfigurator} class as the super class - * uses the TCCL to load classes - * - * @param isRampartRequired - * @return - */ - public static ConfigurationContext getAxis2ConfigurationContext(final boolean isRampartRequired) { - try { - // TuscanyAxisConfigurator tuscanyAxisConfigurator = new TuscanyAxisConfigurator(); - // Allow privileged access to read properties. Requires PropertyPermission read in - // security policy. - ConfigurationContext configContext = - AccessController.doPrivileged(new PrivilegedExceptionAction() { - public ConfigurationContext run() throws AxisFault { - // The tuscany-binding-ws-axis2 class loader. We contribute the message - // receivers in the axis2.xml - ClassLoader cl0 = getClass().getClassLoader(); - - // The axis2 class loader - ClassLoader cl1 = URLBasedAxisConfigurator.class.getClassLoader(); - - ClassLoader tccl = ClassLoaderContext.setContextClassLoader(cl0, cl1); - - try { - return new TuscanyAxisConfigurator(isRampartRequired).getConfigurationContext(); - } finally { - if (tccl != null) { - Thread.currentThread().setContextClassLoader(tccl); - } - } - } - }); - return configContext; - // deployRampartModule(); - // configureSecurity(); - } catch (PrivilegedActionException e) { - throw new ServiceRuntimeException(e.getException()); - } - } - -} diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2EngineIntegration.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2EngineIntegration.java new file mode 100644 index 0000000000..8cd963f4ca --- /dev/null +++ b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2EngineIntegration.java @@ -0,0 +1,656 @@ +/* + * 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.tuscany.sca.binding.ws.axis2; + +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.security.AccessController; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Vector; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.wsdl.Definition; +import javax.wsdl.Import; +import javax.wsdl.Port; +import javax.wsdl.Types; +import javax.wsdl.extensions.UnknownExtensibilityElement; +import javax.wsdl.extensions.soap.SOAPAddress; +import javax.wsdl.extensions.soap12.SOAP12Address; +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.axis2.AxisFault; +import org.apache.axis2.Constants; +import org.apache.axis2.Constants.Configuration; +import org.apache.axis2.addressing.AddressingConstants; +import org.apache.axis2.context.ConfigurationContext; +import org.apache.axis2.context.ConfigurationContextFactory; +import org.apache.axis2.deployment.util.Utils; +import org.apache.axis2.description.AxisEndpoint; +import org.apache.axis2.description.AxisOperation; +import org.apache.axis2.description.AxisService; +import org.apache.axis2.description.Parameter; +import org.apache.axis2.description.TransportInDescription; +import org.apache.axis2.description.TransportOutDescription; +import org.apache.axis2.description.WSDL11ToAxisServiceBuilder; +import org.apache.axis2.description.WSDL2Constants; +import org.apache.axis2.description.WSDLToAxisServiceBuilder; +import org.apache.axis2.engine.ListenerManager; +import org.apache.axis2.engine.MessageReceiver; +import org.apache.axis2.transport.jms.JMSListener; +import org.apache.axis2.transport.jms.JMSSender; +import org.apache.tuscany.sca.assembly.AbstractContract; +import org.apache.tuscany.sca.assembly.AssemblyFactory; + +import org.apache.tuscany.sca.binding.ws.WebServiceBinding; +import org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceClient.URIResolverImpl; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; +import org.apache.tuscany.sca.core.assembly.RuntimeAssemblyFactory; +import org.apache.tuscany.sca.host.http.ServletHost; +import org.apache.tuscany.sca.interfacedef.Interface; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.java.JavaInterface; +import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; +import org.apache.tuscany.sca.invocation.MessageFactory; +import org.apache.tuscany.sca.policy.PolicySet; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeEndpoint; +import org.apache.tuscany.sca.xsd.XSDefinition; +import org.apache.ws.commons.schema.XmlSchema; +import org.apache.ws.commons.schema.XmlSchemaExternal; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class Axis2EngineIntegration { + private static final Logger logger = Logger.getLogger(Axis2EngineIntegration.class.getName()); + + private ConfigurationContext configContext; + + //============================ + + public static final String IMPORT_TAG = "import"; + public static final String INCLUDE_TAG = "include"; + + private RuntimeEndpoint endpoint; + private RuntimeComponent component; + private AbstractContract contract; + private WebServiceBinding wsBinding; + private ServletHost servletHost; + private MessageFactory messageFactory; + private FactoryExtensionPoint modelFactories; + private RuntimeAssemblyFactory assemblyFactory; + + private JMSSender jmsSender; + private JMSListener jmsListener; + private Map urlMap = new HashMap(); + + + public static final QName QNAME_WSA_ADDRESS = + new QName(AddressingConstants.Final.WSA_NAMESPACE, AddressingConstants.EPR_ADDRESS); + public static final QName QNAME_WSA_FROM = + new QName(AddressingConstants.Final.WSA_NAMESPACE, AddressingConstants.WSA_FROM); + public static final QName QNAME_WSA_REFERENCE_PARAMETERS = + new QName(AddressingConstants.Final.WSA_NAMESPACE, AddressingConstants.EPR_REFERENCE_PARAMETERS); + + private static final QName TRANSPORT_JMS_QUALIFIED_INTENT = + new QName("http://docs.oasis-open.org/ns/opencsa/sca/200912", "transport.jms"); + private static final String DEFAULT_QUEUE_CONNECTION_FACTORY = "TuscanyQueueConnectionFactory"; + + //Schema element names + public static final String ELEM_SCHEMA = "schema"; + + //Schema URI + public static final String NS_URI_XSD_1999 = "http://www.w3.org/1999/XMLSchema"; + public static final String NS_URI_XSD_2000 = "http://www.w3.org/2000/10/XMLSchema"; + public static final String NS_URI_XSD_2001 = "http://www.w3.org/2001/XMLSchema"; + + //Schema QNames + public static final QName Q_ELEM_XSD_1999 = new QName(NS_URI_XSD_1999, ELEM_SCHEMA); + public static final QName Q_ELEM_XSD_2000 = new QName(NS_URI_XSD_2000, ELEM_SCHEMA); + public static final QName Q_ELEM_XSD_2001 = new QName(NS_URI_XSD_2001, ELEM_SCHEMA); + public static final List XSD_QNAME_LIST = + Arrays.asList(new QName[] {Q_ELEM_XSD_1999, Q_ELEM_XSD_2000, Q_ELEM_XSD_2001}); + + /** + * Construct the service provider. This creates the base configuration for + * Axis2 but with no services deployed yet. + * + * @param endpoint + * @param component + * @param contract + * @param wsBinding + * @param servletHost + * @param messageFactory + * @param modelFactories + */ + public Axis2EngineIntegration(RuntimeEndpoint endpoint, + RuntimeComponent component, + AbstractContract contract, + WebServiceBinding wsBinding, + ServletHost servletHost, + MessageFactory messageFactory, + final FactoryExtensionPoint modelFactories) { + this.endpoint = endpoint; + this.component = component; + this.contract = contract; + this.wsBinding = wsBinding; + this.servletHost = servletHost; + this.messageFactory = messageFactory; + this.modelFactories = modelFactories; + this.assemblyFactory = (RuntimeAssemblyFactory)modelFactories.getFactory(AssemblyFactory.class); + + final boolean isRampartRequired = AxisPolicyHelper.isRampartRequired(wsBinding); + + // get the axis configuration context from the Tuscany axis2.xml file + // TODO - java security + ClassLoader wsBindingCL = getClass().getClassLoader(); + + // TODO - taken the Tuscany configurator out for a while + // but may need to re-introduce a simplified version if we feel + // that it's important to not deploy rampart when it's not required + try { + URL axis2xmlURL = wsBindingCL.getResource("org/apache/tuscany/sca/binding/ws/axis2/engine/conf/tuscany-axis2.xml"); + if (axis2xmlURL != null){ + URL repositoryURL = new URL(axis2xmlURL.toExternalForm().replaceFirst("conf/tuscany-axis2.xml", "repository")); + configContext = ConfigurationContextFactory.createConfigurationContextFromURIs(axis2xmlURL, repositoryURL); + } else { + // throw an exception + } + } catch (Exception ex) { + ex.printStackTrace(); + } + + // set the root context for this instance of Axis + configContext.setContextRoot(servletHost.getContextPath()); + + // TODO - Cycle through all policy providers asking if there is configuration + // todo. Should this be in the + // MTOM + // JMS + // Security (turn rampart on) + // Enable MTOM if the policy intent is specified. + if (AxisPolicyHelper.isIntentRequired(wsBinding, AxisPolicyHelper.MTOM_INTENT)) { + configContext.getAxisConfiguration().getParameter(Configuration.ENABLE_MTOM).setLocked(false); + configContext.getAxisConfiguration().getParameter(Configuration.ENABLE_MTOM).setValue("true"); + } + + // Update port addresses with runtime information, and create a + // map from endpoint URIs to WSDL ports that eliminates duplicate + // ports for the same endpoint. + for (Object port : wsBinding.getService().getPorts().values()) { + String portAddress = getPortAddress((Port)port); + String endpointURI = computeEndpointURI(portAddress, servletHost); + setPortAddress((Port)port, endpointURI); + urlMap.put(endpointURI, (Port)port); + } + + } + + + static String getPortAddress(Port port) { + Object ext = port.getExtensibilityElements().get(0); + if (ext instanceof SOAPAddress) { + return ((SOAPAddress)ext).getLocationURI(); + } + if (ext instanceof SOAP12Address) { + return ((SOAP12Address)ext).getLocationURI(); + } + return null; + } + + static void setPortAddress(Port port, String locationURI) { + Object ext = port.getExtensibilityElements().get(0); + if (ext instanceof SOAPAddress) { + ((SOAPAddress)ext).setLocationURI(locationURI); + } + if (ext instanceof SOAP12Address) { + ((SOAP12Address)ext).setLocationURI(locationURI); + } + } + + private String computeEndpointURI(String uri, ServletHost servletHost) { + + if (uri == null) { + return null; + } + + // pull out the binding intents to see what sort of transport is required + PolicySet transportJmsPolicySet = AxisPolicyHelper.getPolicySet(wsBinding, TRANSPORT_JMS_QUALIFIED_INTENT); + if (transportJmsPolicySet != null) { + if (!uri.startsWith("jms:/")) { + uri = "jms:" + uri; + } + + // construct the rest of the URI based on the policy. All the details are put + // into the URI here rather than being place directly into the Axis configuration + // as the Axis JMS sender relies on parsing the target URI +/* + Axis2ConfigParamPolicy axis2ConfigParamPolicy = null; + for (Object policy : transportJmsPolicySet.getPolicies()) { + if (policy instanceof Axis2ConfigParamPolicy) { + axis2ConfigParamPolicy = (Axis2ConfigParamPolicy)policy; + Iterator paramIterator = + axis2ConfigParamPolicy.getParamElements().get(DEFAULT_QUEUE_CONNECTION_FACTORY) + .getChildElements(); + + if (paramIterator.hasNext()) { + StringBuffer uriParams = new StringBuffer("?"); + + while (paramIterator.hasNext()) { + OMElement parameter = (OMElement)paramIterator.next(); + uriParams.append(parameter.getAttributeValue(new QName("", "name"))); + uriParams.append("="); + uriParams.append(parameter.getText()); + + if (paramIterator.hasNext()) { + uriParams.append("&"); + } + } + + uri = uri + uriParams; + } + } + } +*/ + } else { + if (!uri.startsWith("jms:")) { + uri = servletHost.getURLMapping(uri).toString(); + } + } + + return uri; + } + + /** + * Add the Tuscany services that this binding instance represents to the + * Axis runtime. + */ + public void start() { + + try { + //createPolicyHandlers(); + for (Map.Entry entry : urlMap.entrySet()) { + AxisService axisService = createAxisService(entry.getKey(), entry.getValue()); + configContext.getAxisConfiguration().addService(axisService); + } + + Axis2ServiceServlet servlet = null; + for (String endpointURL : urlMap.keySet()) { + if (endpointURL.startsWith("http://") || endpointURL.startsWith("https://") + || endpointURL.startsWith("/")) { + if (servlet == null) { + servlet = new Axis2ServiceServlet(); + servlet.init(configContext); + } + //[nash] configContext.setContextRoot(endpointURL); + servletHost.addServletMapping(endpointURL, servlet); + } else if (endpointURL.startsWith("jms")) { + logger.log(Level.INFO, "Axis2 JMS URL=" + endpointURL); + + jmsListener = new JMSListener(); + jmsSender = new JMSSender(); + ListenerManager listenerManager = configContext.getListenerManager(); + TransportInDescription trsIn = + configContext.getAxisConfiguration().getTransportIn(Constants.TRANSPORT_JMS); + + // get JMS transport parameters from the computed URL +// not in Axis2 1.5.1 +// Map jmsProps = JMSUtils.getProperties(endpointURL); + + // collect the parameters used to configure the JMS transport + OMFactory fac = OMAbstractFactory.getOMFactory(); + OMElement parms = fac.createOMElement(DEFAULT_QUEUE_CONNECTION_FACTORY, null); +/* + for (String key : jmsProps.keySet()) { + OMElement param = fac.createOMElement("parameter", null); + param.addAttribute("name", key, null); + param.addChild(fac.createOMText(param, jmsProps.get(key))); + parms.addChild(param); + } +*/ + Parameter queueConnectionFactory = new Parameter(DEFAULT_QUEUE_CONNECTION_FACTORY, parms); + trsIn.addParameter(queueConnectionFactory); + + trsIn.setReceiver(jmsListener); + + configContext.getAxisConfiguration().addTransportIn(trsIn); + TransportOutDescription trsOut = + configContext.getAxisConfiguration().getTransportOut(Constants.TRANSPORT_JMS); + //configContext.getAxisConfiguration().addTransportOut( trsOut ); + trsOut.setSender(jmsSender); + + if (listenerManager == null) { + listenerManager = new ListenerManager(); + listenerManager.init(configContext); + } + listenerManager.addListener(trsIn, true); + jmsSender.init(configContext, trsOut); + jmsListener.init(configContext, trsIn); + jmsListener.start(); + } + } + } catch (AxisFault e) { + throw new RuntimeException(e); + } +/* + catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } +*/ + } + + + public void stop() { + if (jmsListener != null) { +// jmsListener.stop(); + jmsListener.destroy(); + } else { + for (String endpointURL : urlMap.keySet()) { + servletHost.removeServletMapping(endpointURL); + } + } + + servletHost = null; + + if (jmsSender != null) + jmsSender.stop(); + + try { + for (String endpointURL : urlMap.keySet()) { + // get the path to the service + URI uriPath = new URI(endpointURL); + String stringURIPath = uriPath.getPath(); + + /* [nash] Need a leading slash for WSDL imports to work with ?wsdl + // remove any "/" from the start of the path + if (stringURIPath.startsWith("/")) { + stringURIPath = stringURIPath.substring(1, stringURIPath.length()); + } + */ + + configContext.getAxisConfiguration().removeService(stringURIPath); + } + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } catch (AxisFault e) { + throw new RuntimeException(e); + } + } + + private AxisService createAxisService(String endpointURL, Port port) throws AxisFault { + AxisService axisService; + if (wsBinding.getWSDLDocument() != null) { + axisService = createWSDLAxisService(endpointURL, port); + } else { + axisService = createJavaAxisService(endpointURL); + } + initAxisOperations(axisService); + return axisService; + } + + /** + * Create an AxisService from the interface class from the SCA service interface + */ + protected AxisService createJavaAxisService(String endpointURL) throws AxisFault { + + AxisService axisService = new AxisService(); + String path = URI.create(endpointURL).getPath(); + axisService.setName(path); + axisService.setServiceDescription("Tuscany configured AxisService for service: " + endpointURL); + axisService.setClientSide(false); + Parameter classParam = + new Parameter(Constants.SERVICE_CLASS, ((JavaInterface)contract.getInterfaceContract().getInterface()) + .getJavaClass().getName()); + axisService.addParameter(classParam); + try { + Utils.fillAxisService(axisService, configContext.getAxisConfiguration(), null, null); + } catch (Exception e) { + throw new RuntimeException(e); + } + + return axisService; + } + + /** + * Create an AxisService from the WSDL doc used by ws binding + */ + protected AxisService createWSDLAxisService(String endpointURL, Port port) throws AxisFault { + + Definition definition = wsBinding.getWSDLDocument(); + QName serviceQName = wsBinding.getService().getQName(); + Definition def = getDefinition(definition, serviceQName); + + final WSDLToAxisServiceBuilder builder = new WSDL11ToAxisServiceBuilder(def, serviceQName, port.getName()); + builder.setServerSide(true); + // [rfeng] Add a custom resolver to work around WSCOMMONS-228 + builder.setCustomResolver(new URIResolverImpl(def)); + builder.setBaseUri(def.getDocumentBaseURI()); + // [rfeng] + // AxisService axisService = builder.populateService(); + // Allow privileged access to read properties. Requires PropertiesPermission read in + // security policy. + AxisService axisService; + try { + axisService = AccessController.doPrivileged(new PrivilegedExceptionAction() { + public AxisService run() throws AxisFault { + return builder.populateService(); + } + }); + } catch (PrivilegedActionException e) { + throw (AxisFault)e.getException(); + } + + String name = URI.create(endpointURL).getPath(); + //[nash] HTTP endpoints need a leading slash for WSDL imports to work with ?wsdl + if (endpointURL.startsWith("jms")) { + name = name.startsWith("/") ? name.substring(1) : name; + } + axisService.setName(name); + axisService.setEndpointURL(endpointURL); + axisService.setDocumentation("Tuscany configured AxisService for service: " + endpointURL); + for (Iterator i = axisService.getEndpoints().values().iterator(); i.hasNext();) { + AxisEndpoint ae = (AxisEndpoint)i.next(); + if (endpointURL.startsWith("jms")) { +// not in Axis2 1.5.1 +// Parameter qcf = new Parameter(JMSConstants.CONFAC_PARAM, null); +// qcf.setValue(DEFAULT_QUEUE_CONNECTION_FACTORY); +// axisService.addParameter(qcf); + break; + } + } + + // Add schema information to the AxisService (needed for "?xsd=" support) + addSchemas(wsBinding.getWSDLDefinition(), axisService); + + // Use the existing WSDL + Parameter wsdlParam = new Parameter("wsdl4jDefinition", null); + wsdlParam.setValue(definition); + axisService.addParameter(wsdlParam); + Parameter userWSDL = new Parameter("useOriginalwsdl", "true"); + axisService.addParameter(userWSDL); + + // Modify schema imports and includes to add "servicename?xsd=" prefix. + // Axis2 does this for schema extensibility elements, but Tuscany has + // overriden the WSDl4J deserializer to create UnknownExtensibilityElement + // elements in place of these. + modifySchemaImportsAndIncludes(definition, name); + + // Axis2 1.3 has a bug with returning incorrect values for the port + // addresses. To work around this, compute the values here. + Parameter modifyAddr = new Parameter("modifyUserWSDLPortAddress", "false"); + axisService.addParameter(modifyAddr); + + return axisService; + } + + /** + * Workaround for https://issues.apache.org/jira/browse/AXIS2-3205 + * @param definition + * @param serviceName + * @return + */ + private static Definition getDefinition(Definition definition, QName serviceName) { + + if (serviceName == null) { + return definition; + } + + if (definition == null) { + return null; + } + Object service = definition.getServices().get(serviceName); + if (service != null) { + return definition; + } + for (Object i : definition.getImports().values()) { + List imports = (List)i; + for (Import imp : imports) { + Definition d = getDefinition(imp.getDefinition(), serviceName); + if (d != null) { + return d; + } + } + } + return null; + } + + private void addSchemas(WSDLDefinition wsdlDef, AxisService axisService) { + for (XSDefinition xsDef : wsdlDef.getXmlSchemas()) { + if (xsDef.getSchema() != null) { + axisService.addSchema(xsDef.getSchema()); + updateSchemaRefs(xsDef.getSchema(), axisService.getName()); + } + } + for (WSDLDefinition impDef : wsdlDef.getImportedDefinitions()) { + addSchemas(impDef, axisService); + } + } + + private void updateSchemaRefs(XmlSchema parentSchema, String name) { + for (Iterator iter = parentSchema.getIncludes().getIterator(); iter.hasNext();) { + Object obj = iter.next(); + if (obj instanceof XmlSchemaExternal) { + XmlSchemaExternal extSchema = (XmlSchemaExternal)obj; + String location = extSchema.getSchemaLocation(); + if (location.length() > 0 && location.indexOf(":/") < 0 && location.indexOf("?xsd=") < 0) { + extSchema.setSchemaLocation(name + "?xsd=" + location); + } + if (extSchema.getSchema() != null) { + updateSchemaRefs(extSchema.getSchema(), name); + } + } + } + } + + private void modifySchemaImportsAndIncludes(Definition definition, String name) { + // adjust the schema locations in types section + Types types = definition.getTypes(); + if (types != null) { + for (Iterator iter = types.getExtensibilityElements().iterator(); iter.hasNext();) { + Object ext = iter.next(); + if (ext instanceof UnknownExtensibilityElement && XSD_QNAME_LIST + .contains(((UnknownExtensibilityElement)ext).getElementType())) { + changeLocations(((UnknownExtensibilityElement)ext).getElement(), name); + } + } + } + for (Iterator iter = definition.getImports().values().iterator(); iter.hasNext();) { + Vector values = (Vector)iter.next(); + for (Iterator valuesIter = values.iterator(); valuesIter.hasNext();) { + Import wsdlImport = (Import)valuesIter.next(); + modifySchemaImportsAndIncludes(wsdlImport.getDefinition(), name); + } + } + } + + private void changeLocations(Element element, String name) { + NodeList nodeList = element.getChildNodes(); + for (int i = 0; i < nodeList.getLength(); i++) { + String tagName = nodeList.item(i).getLocalName(); + if (IMPORT_TAG.equals(tagName) || INCLUDE_TAG.equals(tagName)) { + processImport(nodeList.item(i), name); + } + } + } + + private void processImport(Node importNode, String name) { + NamedNodeMap nodeMap = importNode.getAttributes(); + for (int i = 0; i < nodeMap.getLength(); i++) { + Node attribute = nodeMap.item(i); + if (attribute.getNodeName().equals("schemaLocation")) { + String location = attribute.getNodeValue(); + if (location.indexOf(":/") < 0 & location.indexOf("?xsd=") < 0) { + attribute.setNodeValue(name + "?xsd=" + location); + } + } + } + } + + protected void initAxisOperations(AxisService axisService) { + for (Iterator i = axisService.getOperations(); i.hasNext();) { + AxisOperation axisOp = (AxisOperation)i.next(); + Operation op = getOperation(axisOp); + if (op != null) { + + if (op.isNonBlocking()) { + axisOp.setMessageExchangePattern(WSDL2Constants.MEP_URI_IN_ONLY); + } else { + axisOp.setMessageExchangePattern(WSDL2Constants.MEP_URI_IN_OUT); + } + + MessageReceiver msgrec = null; + Axis2ServiceProvider serviceProvider = new Axis2ServiceProvider(endpoint, wsBinding, messageFactory, modelFactories); + if (op.isNonBlocking()) { + msgrec = new Axis2ServiceInMessageReceiver(serviceProvider, op); + } else { + msgrec = new Axis2ServiceInOutSyncMessageReceiver(serviceProvider, op); + } + axisOp.setMessageReceiver(msgrec); + } + } + } + + protected Operation getOperation(AxisOperation axisOp) { + String operationName = axisOp.getName().getLocalPart(); + Interface iface = wsBinding.getBindingInterfaceContract().getInterface(); + for (Operation op : iface.getOperations()) { + if (op.getName().equalsIgnoreCase(operationName)) { + return op; + } + } + return null; + } +} diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceBindingProvider.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceBindingProvider.java index a0dea01cd2..da05b07d3a 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceBindingProvider.java +++ b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceBindingProvider.java @@ -37,7 +37,7 @@ public class Axis2ServiceBindingProvider implements ServiceBindingProvider { private RuntimeComponentService service; private WebServiceBinding wsBinding; - private Axis2ServiceProvider axisProvider; + private Axis2EngineIntegration axisProvider; public Axis2ServiceBindingProvider(RuntimeEndpoint endpoint, ServletHost servletHost, @@ -62,7 +62,7 @@ public class Axis2ServiceBindingProvider implements ServiceBindingProvider { InterfaceContract contract = wsBinding.getBindingInterfaceContract(); contract.getInterface().resetDataBinding(OMElement.class.getName()); - axisProvider = new Axis2ServiceProvider(endpoint, component, service, wsBinding, servletHost, messageFactory, modelFactories); + axisProvider = new Axis2EngineIntegration(endpoint, component, service, wsBinding, servletHost, messageFactory, modelFactories); } public void start() { diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceClient.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceClient.java index be4e902eaa..e3b02a5bd5 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceClient.java +++ b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceClient.java @@ -18,7 +18,6 @@ */ package org.apache.tuscany.sca.binding.ws.axis2; -import static org.apache.tuscany.sca.binding.ws.axis2.Axis2ConfiguratorHelper.getAxis2ConfigurationContext; import static org.apache.tuscany.sca.binding.ws.axis2.AxisPolicyHelper.SOAP12_INTENT; import static org.apache.tuscany.sca.binding.ws.axis2.AxisPolicyHelper.isIntentRequired; @@ -57,6 +56,7 @@ import org.apache.axis2.addressing.EndpointReferenceHelper; import org.apache.axis2.client.Options; import org.apache.axis2.client.ServiceClient; import org.apache.axis2.context.ConfigurationContext; +import org.apache.axis2.context.ConfigurationContextFactory; import org.apache.axis2.description.AxisEndpoint; import org.apache.axis2.description.AxisService; import org.apache.axis2.description.Parameter; @@ -69,7 +69,6 @@ import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; import org.apache.commons.httpclient.params.HttpConnectionManagerParams; import org.apache.tuscany.sca.assembly.AbstractContract; import org.apache.tuscany.sca.binding.ws.WebServiceBinding; -import org.apache.tuscany.sca.binding.ws.axis2.policy.configuration.Axis2ConfigParamPolicy; import org.apache.tuscany.sca.common.xml.XMLDocumentHelper; import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.invocation.Invoker; @@ -110,6 +109,7 @@ public class Axis2ServiceClient { if (ps == null) { return; } +/* for (Object policy : ps.getPolicies()) { if (policy instanceof Axis2ConfigParamPolicy) { Axis2ConfigParamPolicy axis2ConfigParamPolicy = (Axis2ConfigParamPolicy)policy; @@ -120,6 +120,7 @@ public class Axis2ServiceClient { } } } +*/ } /** @@ -128,8 +129,26 @@ public class Axis2ServiceClient { protected ServiceClient createServiceClient() { try { final boolean isRampartRequired = AxisPolicyHelper.isRampartRequired(wsBinding); - ConfigurationContext configContext = - getAxis2ConfigurationContext(isRampartRequired); + ConfigurationContext configContext = null; + + // get the axis configuration context from the Tuscany axis2.xml file + // TODO - java security + ClassLoader wsBindingCL = getClass().getClassLoader(); + + // TODO - taken the Tuscany configurator out for a while + // but may need to re-introduce a simplified version if we feel + // that it's important to not deploy rampart when it's not required + try { + URL axis2xmlURL = wsBindingCL.getResource("org/apache/tuscany/sca/binding/ws/axis2/engine/conf/tuscany-axis2.xml"); + if (axis2xmlURL != null){ + URL repositoryURL = new URL(axis2xmlURL.toExternalForm().replaceFirst("conf/tuscany-axis2.xml", "repository")); + configContext = ConfigurationContextFactory.createConfigurationContextFromURIs(axis2xmlURL, repositoryURL); + } else { + // throw an exception + } + } catch (Exception ex) { + ex.printStackTrace(); + } createPolicyHandlers(); diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java index 1e62916818..13a4033a0a 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java +++ b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceProvider.java @@ -19,633 +19,68 @@ package org.apache.tuscany.sca.binding.ws.axis2; -import static org.apache.tuscany.sca.binding.ws.axis2.Axis2ConfiguratorHelper.getAxis2ConfigurationContext; - import java.lang.reflect.InvocationTargetException; -import java.net.URI; -import java.net.URISyntaxException; -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Vector; -import java.util.logging.Level; import java.util.logging.Logger; -import javax.wsdl.Definition; -import javax.wsdl.Import; -import javax.wsdl.Port; -import javax.wsdl.Types; -import javax.wsdl.extensions.UnknownExtensibilityElement; -import javax.wsdl.extensions.soap.SOAPAddress; -import javax.wsdl.extensions.soap12.SOAP12Address; +import javax.annotation.Resource; import javax.xml.namespace.QName; +import javax.xml.ws.Provider; +import javax.xml.ws.WebServiceContext; -import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; -import org.apache.axiom.om.OMFactory; import org.apache.axiom.soap.SOAPHeader; -import org.apache.axis2.AxisFault; -import org.apache.axis2.Constants; -import org.apache.axis2.Constants.Configuration; import org.apache.axis2.addressing.AddressingConstants; -import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.context.MessageContext; -import org.apache.axis2.deployment.util.Utils; -import org.apache.axis2.description.AxisEndpoint; -import org.apache.axis2.description.AxisOperation; -import org.apache.axis2.description.AxisService; -import org.apache.axis2.description.Parameter; -import org.apache.axis2.description.TransportInDescription; -import org.apache.axis2.description.TransportOutDescription; -import org.apache.axis2.description.WSDL11ToAxisServiceBuilder; -import org.apache.axis2.description.WSDL2Constants; -import org.apache.axis2.description.WSDLToAxisServiceBuilder; -import org.apache.axis2.engine.ListenerManager; -import org.apache.axis2.engine.MessageReceiver; -import org.apache.axis2.transport.jms.JMSConstants; -import org.apache.axis2.transport.jms.JMSListener; -import org.apache.axis2.transport.jms.JMSSender; -import org.apache.axis2.transport.jms.JMSUtils; -import org.apache.tuscany.sca.assembly.AbstractContract; import org.apache.tuscany.sca.assembly.AssemblyFactory; -import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Endpoint; import org.apache.tuscany.sca.assembly.EndpointReference; import org.apache.tuscany.sca.binding.ws.WebServiceBinding; -import org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceClient.URIResolverImpl; -import org.apache.tuscany.sca.binding.ws.axis2.policy.authentication.token.Axis2TokenAuthenticationPolicy; -import org.apache.tuscany.sca.binding.ws.axis2.policy.configuration.Axis2ConfigParamPolicy; -import org.apache.tuscany.sca.binding.ws.axis2.policy.configurator.Axis2BindingHeaderConfigurator; -import org.apache.tuscany.sca.binding.ws.axis2.policy.header.Axis2HeaderPolicy; -import org.apache.tuscany.sca.binding.ws.axis2.policy.header.Axis2SOAPHeaderString; import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.core.assembly.RuntimeAssemblyFactory; -import org.apache.tuscany.sca.host.http.ServletHost; -import org.apache.tuscany.sca.interfacedef.Interface; import org.apache.tuscany.sca.interfacedef.Operation; -import org.apache.tuscany.sca.interfacedef.java.JavaInterface; -import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition; import org.apache.tuscany.sca.invocation.Message; import org.apache.tuscany.sca.invocation.MessageFactory; -import org.apache.tuscany.sca.policy.PolicySet; -import org.apache.tuscany.sca.policy.PolicySubject; -import org.apache.tuscany.sca.policy.authentication.basic.BasicAuthenticationPolicy; -import org.apache.tuscany.sca.runtime.RuntimeComponent; import org.apache.tuscany.sca.runtime.RuntimeEndpoint; -import org.apache.tuscany.sca.xsd.XSDefinition; -import org.apache.ws.commons.schema.XmlSchema; -import org.apache.ws.commons.schema.XmlSchemaExternal; -import org.apache.ws.security.WSSecurityEngineResult; -import org.apache.ws.security.handler.WSHandlerConstants; -import org.apache.ws.security.handler.WSHandlerResult; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -public class Axis2ServiceProvider { - public static final String IMPORT_TAG = "import"; - public static final String INCLUDE_TAG = "include"; +public class Axis2ServiceProvider implements Provider { private static final Logger logger = Logger.getLogger(Axis2ServiceProvider.class.getName()); - - private RuntimeEndpoint endpoint; - private RuntimeComponent component; - private AbstractContract contract; - private WebServiceBinding wsBinding; - private ServletHost servletHost; - private MessageFactory messageFactory; - private FactoryExtensionPoint modelFactories; - private RuntimeAssemblyFactory assemblyFactory; - private ConfigurationContext configContext; - private JMSSender jmsSender; - private JMSListener jmsListener; - private Map urlMap = new HashMap(); - - private BasicAuthenticationPolicy basicAuthenticationPolicy = null; - private Axis2TokenAuthenticationPolicy axis2TokenAuthenticationPolicy = null; - private List axis2HeaderPolicies = new ArrayList(); - + public static final QName QNAME_WSA_ADDRESS = new QName(AddressingConstants.Final.WSA_NAMESPACE, AddressingConstants.EPR_ADDRESS); public static final QName QNAME_WSA_FROM = new QName(AddressingConstants.Final.WSA_NAMESPACE, AddressingConstants.WSA_FROM); public static final QName QNAME_WSA_REFERENCE_PARAMETERS = new QName(AddressingConstants.Final.WSA_NAMESPACE, AddressingConstants.EPR_REFERENCE_PARAMETERS); - - private static final QName TRANSPORT_JMS_QUALIFIED_INTENT = - new QName("http://docs.oasis-open.org/ns/opencsa/sca/200912", "transport.jms"); - private static final String DEFAULT_QUEUE_CONNECTION_FACTORY = "TuscanyQueueConnectionFactory"; - - //Schema element names - public static final String ELEM_SCHEMA = "schema"; - - //Schema URI - public static final String NS_URI_XSD_1999 = "http://www.w3.org/1999/XMLSchema"; - public static final String NS_URI_XSD_2000 = "http://www.w3.org/2000/10/XMLSchema"; - public static final String NS_URI_XSD_2001 = "http://www.w3.org/2001/XMLSchema"; - - //Schema QNames - public static final QName Q_ELEM_XSD_1999 = new QName(NS_URI_XSD_1999, ELEM_SCHEMA); - public static final QName Q_ELEM_XSD_2000 = new QName(NS_URI_XSD_2000, ELEM_SCHEMA); - public static final QName Q_ELEM_XSD_2001 = new QName(NS_URI_XSD_2001, ELEM_SCHEMA); - public static final List XSD_QNAME_LIST = - Arrays.asList(new QName[] {Q_ELEM_XSD_1999, Q_ELEM_XSD_2000, Q_ELEM_XSD_2001}); - + + + private RuntimeEndpoint endpoint; + private WebServiceBinding wsBinding; + private MessageFactory messageFactory; + private FactoryExtensionPoint modelFactories; + private RuntimeAssemblyFactory assemblyFactory; + + @Resource + WebServiceContext wsContext; + public Axis2ServiceProvider(RuntimeEndpoint endpoint, - RuntimeComponent component, - AbstractContract contract, WebServiceBinding wsBinding, - ServletHost servletHost, MessageFactory messageFactory, - final FactoryExtensionPoint modelFactories) { + FactoryExtensionPoint modelFactories) { this.endpoint = endpoint; - this.component = component; - this.contract = contract; this.wsBinding = wsBinding; - this.servletHost = servletHost; this.messageFactory = messageFactory; this.modelFactories = modelFactories; - this.assemblyFactory = (RuntimeAssemblyFactory)modelFactories.getFactory(AssemblyFactory.class); - - final boolean isRampartRequired = AxisPolicyHelper.isRampartRequired(wsBinding); - configContext = getAxis2ConfigurationContext(isRampartRequired); - - configContext.setContextRoot(servletHost.getContextPath()); - - // Enable MTOM if the policy intent is specified. - if (AxisPolicyHelper.isIntentRequired(wsBinding, AxisPolicyHelper.MTOM_INTENT)) { - configContext.getAxisConfiguration().getParameter(Configuration.ENABLE_MTOM).setLocked(false); - configContext.getAxisConfiguration().getParameter(Configuration.ENABLE_MTOM).setValue("true"); - } - - // Update port addresses with runtime information, and create a - // map from endpoint URIs to WSDL ports that eliminates duplicate - // ports for the same endpoint. - for (Object port : wsBinding.getService().getPorts().values()) { - String portAddress = getPortAddress((Port)port); - String endpointURI = computeEndpointURI(portAddress, servletHost); - setPortAddress((Port)port, endpointURI); - urlMap.put(endpointURI, (Port)port); - } - - /* - // find out which policies are active - if (wsBinding instanceof PolicySubject) { - List policySets = ((PolicySubject)wsBinding).getApplicablePolicySets(); - for (PolicySet ps : policySets) { - for (Object p : ps.getPolicies()) { - if (BasicAuthenticationPolicy.class.isInstance(p)) { - basicAuthenticationPolicy = (BasicAuthenticationPolicy)p; - } else if (Axis2TokenAuthenticationPolicy.class.isInstance(p)) { - axis2TokenAuthenticationPolicy = (Axis2TokenAuthenticationPolicy)p; - } else if (Axis2HeaderPolicy.class.isInstance(p)) { - axis2HeaderPolicies.add((Axis2HeaderPolicy)p); - } else { - // etc. check for other types of policy being present - } - } - } - } - */ + this.assemblyFactory = (RuntimeAssemblyFactory)modelFactories.getFactory(AssemblyFactory.class); } - - static String getPortAddress(Port port) { - Object ext = port.getExtensibilityElements().get(0); - if (ext instanceof SOAPAddress) { - return ((SOAPAddress)ext).getLocationURI(); - } - if (ext instanceof SOAP12Address) { - return ((SOAP12Address)ext).getLocationURI(); - } + + public OMElement invoke(OMElement arg0) { return null; } - - static void setPortAddress(Port port, String locationURI) { - Object ext = port.getExtensibilityElements().get(0); - if (ext instanceof SOAPAddress) { - ((SOAPAddress)ext).setLocationURI(locationURI); - } - if (ext instanceof SOAP12Address) { - ((SOAP12Address)ext).setLocationURI(locationURI); - } - } - - private String computeEndpointURI(String uri, ServletHost servletHost) { - - if (uri == null) { - return null; - } - - // pull out the binding intents to see what sort of transport is required - PolicySet transportJmsPolicySet = AxisPolicyHelper.getPolicySet(wsBinding, TRANSPORT_JMS_QUALIFIED_INTENT); - if (transportJmsPolicySet != null) { - if (!uri.startsWith("jms:/")) { - uri = "jms:" + uri; - } - - // construct the rest of the URI based on the policy. All the details are put - // into the URI here rather than being place directly into the Axis configuration - // as the Axis JMS sender relies on parsing the target URI - Axis2ConfigParamPolicy axis2ConfigParamPolicy = null; - for (Object policy : transportJmsPolicySet.getPolicies()) { - if (policy instanceof Axis2ConfigParamPolicy) { - axis2ConfigParamPolicy = (Axis2ConfigParamPolicy)policy; - Iterator paramIterator = - axis2ConfigParamPolicy.getParamElements().get(DEFAULT_QUEUE_CONNECTION_FACTORY) - .getChildElements(); - - if (paramIterator.hasNext()) { - StringBuffer uriParams = new StringBuffer("?"); - - while (paramIterator.hasNext()) { - OMElement parameter = (OMElement)paramIterator.next(); - uriParams.append(parameter.getAttributeValue(new QName("", "name"))); - uriParams.append("="); - uriParams.append(parameter.getText()); - - if (paramIterator.hasNext()) { - uriParams.append("&"); - } - } - - uri = uri + uriParams; - } - } - } - } else { - if (!uri.startsWith("jms:")) { - uri = servletHost.getURLMapping(uri).toString(); - } - } - - return uri; - } - - public void start() { - - try { - createPolicyHandlers(); - for (Map.Entry entry : urlMap.entrySet()) { - AxisService axisService = createAxisService(entry.getKey(), entry.getValue()); - configContext.getAxisConfiguration().addService(axisService); - } - - Axis2ServiceServlet servlet = null; - for (String endpointURL : urlMap.keySet()) { - if (endpointURL.startsWith("http://") || endpointURL.startsWith("https://") - || endpointURL.startsWith("/")) { - if (servlet == null) { - servlet = new Axis2ServiceServlet(); - servlet.init(configContext); - } - //[nash] configContext.setContextRoot(endpointURL); - servletHost.addServletMapping(endpointURL, servlet); - } else if (endpointURL.startsWith("jms")) { - logger.log(Level.INFO, "Axis2 JMS URL=" + endpointURL); - - jmsListener = new JMSListener(); - jmsSender = new JMSSender(); - ListenerManager listenerManager = configContext.getListenerManager(); - TransportInDescription trsIn = - configContext.getAxisConfiguration().getTransportIn(Constants.TRANSPORT_JMS); - - // get JMS transport parameters from the computed URL - Map jmsProps = JMSUtils.getProperties(endpointURL); - - // collect the parameters used to configure the JMS transport - OMFactory fac = OMAbstractFactory.getOMFactory(); - OMElement parms = fac.createOMElement(DEFAULT_QUEUE_CONNECTION_FACTORY, null); - - for (String key : jmsProps.keySet()) { - OMElement param = fac.createOMElement("parameter", null); - param.addAttribute("name", key, null); - param.addChild(fac.createOMText(param, jmsProps.get(key))); - parms.addChild(param); - } - - Parameter queueConnectionFactory = new Parameter(DEFAULT_QUEUE_CONNECTION_FACTORY, parms); - trsIn.addParameter(queueConnectionFactory); - - trsIn.setReceiver(jmsListener); - - configContext.getAxisConfiguration().addTransportIn(trsIn); - TransportOutDescription trsOut = - configContext.getAxisConfiguration().getTransportOut(Constants.TRANSPORT_JMS); - //configContext.getAxisConfiguration().addTransportOut( trsOut ); - trsOut.setSender(jmsSender); - - if (listenerManager == null) { - listenerManager = new ListenerManager(); - listenerManager.init(configContext); - } - listenerManager.addListener(trsIn, true); - jmsSender.init(configContext, trsOut); - jmsListener.init(configContext, trsIn); - jmsListener.start(); - } - } - } catch (AxisFault e) { - throw new RuntimeException(e); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } catch (InstantiationException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - public void stop() { - if (jmsListener != null) { - jmsListener.stop(); - jmsListener.destroy(); - } else { - for (String endpointURL : urlMap.keySet()) { - servletHost.removeServletMapping(endpointURL); - } - } - - servletHost = null; - - if (jmsSender != null) - jmsSender.stop(); - - try { - for (String endpointURL : urlMap.keySet()) { - // get the path to the service - URI uriPath = new URI(endpointURL); - String stringURIPath = uriPath.getPath(); - - /* [nash] Need a leading slash for WSDL imports to work with ?wsdl - // remove any "/" from the start of the path - if (stringURIPath.startsWith("/")) { - stringURIPath = stringURIPath.substring(1, stringURIPath.length()); - } - */ - - configContext.getAxisConfiguration().removeService(stringURIPath); - } - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } catch (AxisFault e) { - throw new RuntimeException(e); - } - } - - private AxisService createAxisService(String endpointURL, Port port) throws AxisFault { - AxisService axisService; - if (wsBinding.getWSDLDocument() != null) { - axisService = createWSDLAxisService(endpointURL, port); - } else { - axisService = createJavaAxisService(endpointURL); - } - initAxisOperations(axisService); - return axisService; - } - - /** - * Create an AxisService from the interface class from the SCA service interface - */ - protected AxisService createJavaAxisService(String endpointURL) throws AxisFault { - AxisService axisService = new AxisService(); - String path = URI.create(endpointURL).getPath(); - axisService.setName(path); - axisService.setServiceDescription("Tuscany configured AxisService for service: " + endpointURL); - axisService.setClientSide(false); - Parameter classParam = - new Parameter(Constants.SERVICE_CLASS, ((JavaInterface)contract.getInterfaceContract().getInterface()) - .getJavaClass().getName()); - axisService.addParameter(classParam); - try { - Utils.fillAxisService(axisService, configContext.getAxisConfiguration(), null, null); - } catch (Exception e) { - throw new RuntimeException(e); - } - - return axisService; - } - - /** - * Workaround for https://issues.apache.org/jira/browse/AXIS2-3205 - * @param definition - * @param serviceName - * @return - */ - private static Definition getDefinition(Definition definition, QName serviceName) { - - if (serviceName == null) { - return definition; - } - - if (definition == null) { - return null; - } - Object service = definition.getServices().get(serviceName); - if (service != null) { - return definition; - } - for (Object i : definition.getImports().values()) { - List imports = (List)i; - for (Import imp : imports) { - Definition d = getDefinition(imp.getDefinition(), serviceName); - if (d != null) { - return d; - } - } - } - return null; - } - - /** - * Create an AxisService from the WSDL doc used by ws binding - */ - protected AxisService createWSDLAxisService(String endpointURL, Port port) throws AxisFault { - - Definition definition = wsBinding.getWSDLDocument(); - QName serviceQName = wsBinding.getService().getQName(); - Definition def = getDefinition(definition, serviceQName); - - final WSDLToAxisServiceBuilder builder = new WSDL11ToAxisServiceBuilder(def, serviceQName, port.getName()); - builder.setServerSide(true); - // [rfeng] Add a custom resolver to work around WSCOMMONS-228 - builder.setCustomResolver(new URIResolverImpl(def)); - builder.setBaseUri(def.getDocumentBaseURI()); - // [rfeng] - // AxisService axisService = builder.populateService(); - // Allow privileged access to read properties. Requires PropertiesPermission read in - // security policy. - AxisService axisService; - try { - axisService = AccessController.doPrivileged(new PrivilegedExceptionAction() { - public AxisService run() throws AxisFault { - return builder.populateService(); - } - }); - } catch (PrivilegedActionException e) { - throw (AxisFault)e.getException(); - } - - String name = URI.create(endpointURL).getPath(); - //[nash] HTTP endpoints need a leading slash for WSDL imports to work with ?wsdl - if (endpointURL.startsWith("jms")) { - name = name.startsWith("/") ? name.substring(1) : name; - } - axisService.setName(name); - axisService.setEndpointURL(endpointURL); - axisService.setDocumentation("Tuscany configured AxisService for service: " + endpointURL); - for (Iterator i = axisService.getEndpoints().values().iterator(); i.hasNext();) { - AxisEndpoint ae = (AxisEndpoint)i.next(); - if (endpointURL.startsWith("jms")) { - Parameter qcf = new Parameter(JMSConstants.CONFAC_PARAM, null); - qcf.setValue(DEFAULT_QUEUE_CONNECTION_FACTORY); - axisService.addParameter(qcf); - break; - } - } - - // Add schema information to the AxisService (needed for "?xsd=" support) - addSchemas(wsBinding.getWSDLDefinition(), axisService); - - // Use the existing WSDL - Parameter wsdlParam = new Parameter("wsdl4jDefinition", null); - wsdlParam.setValue(definition); - axisService.addParameter(wsdlParam); - Parameter userWSDL = new Parameter("useOriginalwsdl", "true"); - axisService.addParameter(userWSDL); - - // Modify schema imports and includes to add "servicename?xsd=" prefix. - // Axis2 does this for schema extensibility elements, but Tuscany has - // overriden the WSDl4J deserializer to create UnknownExtensibilityElement - // elements in place of these. - modifySchemaImportsAndIncludes(definition, name); - - // Axis2 1.3 has a bug with returning incorrect values for the port - // addresses. To work around this, compute the values here. - Parameter modifyAddr = new Parameter("modifyUserWSDLPortAddress", "false"); - axisService.addParameter(modifyAddr); - - return axisService; - } - - private void addSchemas(WSDLDefinition wsdlDef, AxisService axisService) { - for (XSDefinition xsDef : wsdlDef.getXmlSchemas()) { - if (xsDef.getSchema() != null) { - axisService.addSchema(xsDef.getSchema()); - updateSchemaRefs(xsDef.getSchema(), axisService.getName()); - } - } - for (WSDLDefinition impDef : wsdlDef.getImportedDefinitions()) { - addSchemas(impDef, axisService); - } - } - - private void updateSchemaRefs(XmlSchema parentSchema, String name) { - for (Iterator iter = parentSchema.getIncludes().getIterator(); iter.hasNext();) { - Object obj = iter.next(); - if (obj instanceof XmlSchemaExternal) { - XmlSchemaExternal extSchema = (XmlSchemaExternal)obj; - String location = extSchema.getSchemaLocation(); - if (location.length() > 0 && location.indexOf(":/") < 0 && location.indexOf("?xsd=") < 0) { - extSchema.setSchemaLocation(name + "?xsd=" + location); - } - if (extSchema.getSchema() != null) { - updateSchemaRefs(extSchema.getSchema(), name); - } - } - } - } - - private void modifySchemaImportsAndIncludes(Definition definition, String name) { - // adjust the schema locations in types section - Types types = definition.getTypes(); - if (types != null) { - for (Iterator iter = types.getExtensibilityElements().iterator(); iter.hasNext();) { - Object ext = iter.next(); - if (ext instanceof UnknownExtensibilityElement && XSD_QNAME_LIST - .contains(((UnknownExtensibilityElement)ext).getElementType())) { - changeLocations(((UnknownExtensibilityElement)ext).getElement(), name); - } - } - } - for (Iterator iter = definition.getImports().values().iterator(); iter.hasNext();) { - Vector values = (Vector)iter.next(); - for (Iterator valuesIter = values.iterator(); valuesIter.hasNext();) { - Import wsdlImport = (Import)valuesIter.next(); - modifySchemaImportsAndIncludes(wsdlImport.getDefinition(), name); - } - } - } - - private void changeLocations(Element element, String name) { - NodeList nodeList = element.getChildNodes(); - for (int i = 0; i < nodeList.getLength(); i++) { - String tagName = nodeList.item(i).getLocalName(); - if (IMPORT_TAG.equals(tagName) || INCLUDE_TAG.equals(tagName)) { - processImport(nodeList.item(i), name); - } - } - } - - private void processImport(Node importNode, String name) { - NamedNodeMap nodeMap = importNode.getAttributes(); - for (int i = 0; i < nodeMap.getLength(); i++) { - Node attribute = nodeMap.item(i); - if (attribute.getNodeName().equals("schemaLocation")) { - String location = attribute.getNodeValue(); - if (location.indexOf(":/") < 0 & location.indexOf("?xsd=") < 0) { - attribute.setNodeValue(name + "?xsd=" + location); - } - } - } - } - - protected void initAxisOperations(AxisService axisService) { - for (Iterator i = axisService.getOperations(); i.hasNext();) { - AxisOperation axisOp = (AxisOperation)i.next(); - Operation op = getOperation(axisOp); - if (op != null) { - - if (op.isNonBlocking()) { - axisOp.setMessageExchangePattern(WSDL2Constants.MEP_URI_IN_ONLY); - } else { - axisOp.setMessageExchangePattern(WSDL2Constants.MEP_URI_IN_OUT); - } - - MessageReceiver msgrec = null; - if (op.isNonBlocking()) { - msgrec = new Axis2ServiceInMessageReceiver(this, op); - } else { - msgrec = new Axis2ServiceInOutSyncMessageReceiver(this, op); - } - axisOp.setMessageReceiver(msgrec); - } - } - } - - protected Operation getOperation(AxisOperation axisOp) { - String operationName = axisOp.getName().getLocalPart(); - Interface iface = wsBinding.getBindingInterfaceContract().getInterface(); - for (Operation op : iface.getOperations()) { - if (op.getName().equalsIgnoreCase(operationName)) { - return op; - } - } - return null; - } - - // methods for Axis2 message receivers + public Object invokeTarget(Operation op, Object[] args, MessageContext inMC) throws InvocationTargetException { String callbackAddress = null; String callbackID = null; - Object conversationID = null; // create a message object and set the args as its body Message msg = messageFactory.createMessage(); @@ -659,29 +94,30 @@ public class Axis2ServiceProvider { if (from != null) { OMElement callbackAddrElement = from.getFirstChildWithName(QNAME_WSA_ADDRESS); if (callbackAddrElement != null) { - if (contract.getInterfaceContract().getCallbackInterface() != null) { + if (endpoint.getService().getInterfaceContract().getCallbackInterface() != null) { callbackAddress = callbackAddrElement.getText(); } } } // get policy specified headers +/* for (Axis2HeaderPolicy policy : axis2HeaderPolicies) { //Axis2BindingHeaderConfigurator.getHeader(inMC, msg, policy.getHeaderName()); } - +*/ +/* if (axis2TokenAuthenticationPolicy != null) { Axis2SOAPHeaderString tokenHeader = new Axis2SOAPHeaderString(); + Axis2BindingHeaderConfigurator.getHeader(inMC, msg, axis2TokenAuthenticationPolicy.getTokenName(), - tokenHeader); + tokenHeader); } +*/ } - //fill message with QoS context info - fillQoSContext(msg, inMC); - // Create a from EPR to hold the details of the callback endpoint EndpointReference from = null; if (callbackAddress != null ) { @@ -697,60 +133,10 @@ public class Axis2ServiceProvider { } Message response = endpoint.invoke(op, msg); + if(response.isFault()) { throw new InvocationTargetException((Throwable) response.getBody()); } return response.getBody(); } - - /** - * Return the binding for this provider as a primitive binding type - * For use when looking up wires registered against the binding. - * - * @return the binding - */ - protected Binding getBinding() { - return wsBinding; - } - - private void createPolicyHandlers() throws IllegalAccessException, InstantiationException, ClassNotFoundException { - if (wsBinding instanceof PolicySubject) { - - // code to create policy handlers using a policy SPI based - // on policy providers - /* - List policyProviders = ((RuntimeComponentService)contract).getPolicyProviders(wsBinding); - - for (PolicyProvider policyProvider : policyProviders){ - policyHandler = policyProvider.createHandler(); - if (policyHandler != null) { - policyHandlerList.add(policyHandler); - } - } - */ - } - } - - private void fillQoSContext(Message message, MessageContext axis2MsgCtx) { - if (axis2MsgCtx.getProperty(WSHandlerConstants.RECV_RESULTS) != null && axis2MsgCtx - .getProperty(WSHandlerConstants.RECV_RESULTS) instanceof Vector) { - Vector recvResults = (Vector)axis2MsgCtx.getProperty(WSHandlerConstants.RECV_RESULTS); - for (int count1 = 0; count1 < recvResults.size(); ++count1) { - if (recvResults.elementAt(count1) instanceof WSHandlerResult) { - WSHandlerResult wshr = (WSHandlerResult)recvResults.elementAt(count1); - Vector results = wshr.getResults(); - for (int count2 = 0; count2 < results.size(); ++count2) { - if (results.elementAt(count2) instanceof WSSecurityEngineResult) { - WSSecurityEngineResult securityResult = - (WSSecurityEngineResult)wshr.getResults().elementAt(count2); - if (securityResult.get("principal") != null) { - message.getHeaders().add(securityResult.get("principal")); - } - } - } - } - } - - } - } } diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceServlet.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceServlet.java index debb2c5764..1909bec0f0 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceServlet.java +++ b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/Axis2ServiceServlet.java @@ -94,54 +94,7 @@ public class Axis2ServiceServlet extends AxisServlet { ServletContext servletContext = config.getServletContext(); servletContext.setAttribute(CONFIGURATION_CONTEXT, tmpconfigContext); - //super.init(config); - - // A copy of the init method from the base class because we need to replace the - // version of the ListenerManager that is used so that we can get it's - // shutdown hook removed properly. - - // prevent this method from being called more than once per instance - if (initCalled == false) { - initCalled = true; - // We can't call super.init() as it will just call the AxisServlet version - // which we are replacing here. So reflect on the base class and - // set the private config field in the base class. - //super.init(config); - try { - Field field = GenericServlet.class.getDeclaredField("config"); - field.setAccessible(true); - field.set(this, config); - } catch (Exception ex){ - ex.printStackTrace(); - } - - try { - this.servletConfig = config; - //ServletContext servletContext = servletConfig.getServletContext(); - this.configContext = - (ConfigurationContext) servletContext.getAttribute(CONFIGURATION_CONTEXT); - if(configContext == null){ - configContext = initConfigContext(config); - config.getServletContext().setAttribute(CONFIGURATION_CONTEXT, configContext); - } - axisConfiguration = configContext.getAxisConfiguration(); - - ListenerManager listenerManager = new TuscanyListenerManager(); - listenerManager.init(configContext); - TransportInDescription transportInDescription = new TransportInDescription( - Constants.TRANSPORT_HTTP); - transportInDescription.setReceiver(this); - listenerManager.addListener(transportInDescription, true); - listenerManager.start(); - ListenerManager.defaultConfigurationContext = configContext; - super.agent = new ListingAgent(configContext); - - initParams(); - - } catch (Exception e) { - throw new ServletException(e); - } - } + super.init(config); } /** @@ -328,6 +281,7 @@ public class Axis2ServiceServlet extends AxisServlet { * Override the AxisServlet method so as to not add "/services" into the URL * and to work with Tuscany service names. can go once moved to Axis2 1.3 */ +/* @Override public EndpointReference[] getEPRsForService(String serviceName, String ip) throws AxisFault { //RUNNING_PORT @@ -352,5 +306,6 @@ public class Axis2ServiceServlet extends AxisServlet { return new EndpointReference[]{new EndpointReference(epURI.toString())}; } + */ } diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/AxisPolicyHelper.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/AxisPolicyHelper.java index 965d29032e..a84b025172 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/AxisPolicyHelper.java +++ b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/AxisPolicyHelper.java @@ -72,8 +72,9 @@ public class AxisPolicyHelper { } public static boolean isRampartRequired(Binding wsBinding) { - return isIntentRequired(wsBinding, AUTHENTICATION_INTENT) || isIntentRequired(wsBinding, INTEGRITY_INTENT) - || isIntentRequired(wsBinding, CONFIDENTIALITY_INTENT); + return isIntentRequired(wsBinding, AUTHENTICATION_INTENT) || + isIntentRequired(wsBinding, INTEGRITY_INTENT) || + isIntentRequired(wsBinding, CONFIDENTIALITY_INTENT); } } diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyAxisConfigurator.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyAxisConfigurator.java deleted file mode 100644 index c8050912d6..0000000000 --- a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyAxisConfigurator.java +++ /dev/null @@ -1,336 +0,0 @@ -/* - * 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.tuscany.sca.binding.ws.axis2; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - -import org.apache.axis2.AxisFault; -import org.apache.axis2.Constants; -import org.apache.axis2.context.ConfigurationContext; -import org.apache.axis2.context.ConfigurationContextFactory; -import org.apache.axis2.deployment.DeploymentConstants; -import org.apache.axis2.deployment.DeploymentErrorMsgs; -import org.apache.axis2.deployment.DeploymentException; -import org.apache.axis2.deployment.ModuleBuilder; -import org.apache.axis2.deployment.URLBasedAxisConfigurator; -import org.apache.axis2.description.AxisModule; -import org.apache.axis2.description.Parameter; -import org.apache.axis2.engine.AxisConfiguration; -import org.apache.axis2.engine.AxisConfigurator; -import org.apache.axis2.i18n.Messages; -import org.apache.tuscany.sca.extensibility.ServiceDiscovery; -import org.oasisopen.sca.ServiceRuntimeException; - -/** - * Helps configure Axis2 from a resource in binding.ws.axis2 instead of Axis2.xml - *

TODO: Review: should there be a single global Axis ConfigurationContext - * - * @version $Rev$ $Date$ - */ -public class TuscanyAxisConfigurator extends URLBasedAxisConfigurator implements AxisConfigurator { - - /* these two fields are part of a temporary fix to solve problems that Maven has with including - * rampart-1.4.mar into the classpath and also at the time of Release 1.0 rampart-1.4.mar seems - * to pull in a SNAPSHOT version of rampart-project pom. Hence rampart.mar has been excluded - * as a Maven dependency and has been packed with this module - */ - /************start of fix *********************************************************************/ - private URL axis2_xml = - getResource("/org/apache/tuscany/sca/binding/ws/axis2/engine/config/axis2.xml"); - private URL axis2_repository = null; - private URL rampart_mar_url = - getResource("/org/apache/tuscany/sca/binding/ws/axis2/engine/config/modules/rampart-1.4.mar"); - /************** end of fix *************************************************************/ - - private boolean isRampartRequired; - - public TuscanyAxisConfigurator(boolean isRampartRequired) throws AxisFault { - //super(TuscanyAxisConfigurator.class.getResource("/org/apache/tuscany/sca/binding/ws/axis2/engine/config/axis2.xml"), - // TuscanyAxisConfigurator.class.getResource("/org/apache/tuscany/sca/binding/ws/axis2/engine/config/modules/rampart.mar")); - super(getResource("/org/apache/tuscany/sca/binding/ws/axis2/engine/config/axis2.xml"), - null); - this.isRampartRequired = isRampartRequired; - } - - private static URL getResource(final String name) { - return AccessController.doPrivileged(new PrivilegedAction() { - public URL run() { - return TuscanyAxisConfigurator.class.getResource(name); - } - }); - } - - public ConfigurationContext getConfigurationContext() throws AxisFault { - if (configContext == null) { - configContext = ConfigurationContextFactory.createConfigurationContext(this); - } - return configContext; - } - - private InputStream getResourceAsStream(final String resource) { - return AccessController.doPrivileged(new PrivilegedAction() { - public InputStream run() { - ClassLoader cl = Thread.currentThread().getContextClassLoader(); - return cl.getResourceAsStream(resource); - } - }); - } - - /* these three methods are part of a temporary fix to solve problems that Maven has with including - * rampart-1.3.mar into the classpath and also at the time of Release 1.0 rampart-1.3.mar seems - * to pull in a SNAPSHOT version of rampart-project pom. Hence rampart.mar has been excluded - * as a Maven dependency and has been packed with this module - */ - /************start of fix *********************************************************************/ - @Override - public AxisConfiguration getAxisConfiguration() throws AxisFault { - InputStream axis2xmlStream; - try { - if (axis2_xml == null) { - axis2xmlStream = - getResourceAsStream(DeploymentConstants.AXIS2_CONFIGURATION_RESOURCE); - } else { - axis2xmlStream = axis2_xml.openStream(); - } - axisConfig = populateAxisConfiguration(axis2xmlStream); - if (isRampartRequired) { - axisConfig.addGlobalModuleRef("rampart"); - } - if (axis2_repository == null) { - Parameter axis2repoPara = axisConfig.getParameter(DeploymentConstants.AXIS2_REPO); - if (axis2repoPara != null) { - String repoValue = (String) axis2repoPara.getValue(); - if (repoValue != null && !"".equals(repoValue.trim())) { - if (repoValue.startsWith("file:/")) { - // we treat this case specially , by assuming file is - // located in the local machine - loadRepository(repoValue); - } else { - loadRepositoryFromURL(new URL(repoValue)); - } - } - } else { - //log.info("No repository found , module will be loaded from classpath"); - try { - loadFromClassPath(); - } catch ( Exception e ) { - if (isRampartRequired) { - loadRampartModule(); - } - } - } - - } else { - loadRepositoryFromURL(axis2_repository); - } - - } catch (IOException e) { - throw new AxisFault(e.getMessage()); - } - axisConfig.setConfigurator(this); - return axisConfig; - } - - public void loadRampartModule() throws DeploymentException { - try { - ClassLoader deploymentClassLoader = - org.apache.axis2.deployment.util.Utils.createClassLoader( - new URL[]{rampart_mar_url}, - axisConfig.getModuleClassLoader(), - true, - (File) axisConfig.getParameterValue(Constants.Configuration.ARTIFACTS_TEMP_DIR)); - final AxisModule module = new AxisModule(); - module.setModuleClassLoader(deploymentClassLoader); - module.setParent(axisConfig); - //String moduleFile = fileUrl.substring(0, fileUrl.indexOf(".mar")); - if (module.getName() == null) { - module.setName("rampart"); - module.setVersion("1.4"); - } - populateModule(module, rampart_mar_url); - module.setFileName(rampart_mar_url); - // Allow privileged access to read properties. Requires PropertiesPermission read in - // security policy. - try { - AccessController.doPrivileged(new PrivilegedExceptionAction() { - public Object run() throws IOException { - addNewModule(module, axisConfig); - return null; - } - }); - } catch (PrivilegedActionException e) { - throw (AxisFault)e.getException(); - } - - calculateDefaultModuleVersion(axisConfig.getModules(), axisConfig); - axisConfig.validateSystemPredefinedPhases(); - } catch (IOException e) { - throw new DeploymentException(e); - } - } - /** - * Get the name of the module , where archive name is combination of module name + its version - * The format of the name is as follows: - * moduleName-00.0000 - * Example: "addressing-01.0001.mar" would return "addressing" - * - * @param moduleName the name of the module archive - * @return the module name parsed out of the file name - */ - public static String getModuleName(String moduleName) { - if (moduleName.endsWith("-SNAPSHOT")) { - return moduleName.substring(0, moduleName.indexOf("-SNAPSHOT")); - } - char delimiter = '-'; - int version_index = moduleName.lastIndexOf(delimiter); - if (version_index > 0) { - String versionString = getModuleVersion(moduleName); - if (versionString == null) { - return moduleName; - } else { - return moduleName.substring(0, version_index); - } - } else { - return moduleName; - } - } - - public static String getModuleVersion(String moduleName) { - if (moduleName.endsWith("-SNAPSHOT")) { - return "SNAPSHOT"; - } - char version_seperator = '-'; - int version_index = moduleName.lastIndexOf(version_seperator); - if (version_index > 0) { - String versionString = moduleName.substring(version_index + 1, moduleName.length()); - try { - Float.parseFloat(versionString); - return versionString; - } catch (NumberFormatException e) { - return null; - } - } else { - return null; - } - } - - public static String getModuleName(String moduleName, String moduleVersion) { - if (moduleVersion != null && moduleVersion.length() != 0) { - moduleName = moduleName + "-" + moduleVersion; - } - return moduleName; - } - - public static boolean isLatest(String moduleVersion, String currentDefaultVersion) { - if (AxisModule.VERSION_SNAPSHOT.equals(moduleVersion)) { - return true; - } else { - float m_version = Float.parseFloat(moduleVersion); - float m_c_vresion = Float.parseFloat(currentDefaultVersion); - return m_version > m_c_vresion; - } - } - - public static void calculateDefaultModuleVersion(HashMap modules, - AxisConfiguration axisConfig) { - Iterator allModules = modules.values().iterator(); - HashMap defaultModules = new HashMap(); - while (allModules.hasNext()) { - AxisModule axisModule = (AxisModule) allModules.next(); - String moduleName = axisModule.getName(); - String moduleNameString; - String moduleVersionString; - if (AxisModule.VERSION_SNAPSHOT.equals(axisModule.getVersion())) { - moduleNameString = axisModule.getName(); - moduleVersionString = axisModule.getVersion(); - } else { - if (axisModule.getVersion() == null) { - moduleNameString = getModuleName(moduleName); - moduleVersionString = getModuleVersion(moduleName); - if (moduleVersionString != null) { - try { - Float.valueOf(moduleVersionString); - axisModule.setVersion(moduleVersionString); - axisModule.setName(moduleName); - } catch (NumberFormatException e) { - moduleVersionString = null; - } - } - } else { - moduleNameString = axisModule.getName(); - moduleVersionString = axisModule.getVersion(); - } - } - String currentDefaultVerison = (String) defaultModules.get(moduleNameString); - if (currentDefaultVerison != null) { - // if the module version is null then , that will be ignore in this case - if (!AxisModule.VERSION_SNAPSHOT.equals(currentDefaultVerison)) { - if (moduleVersionString != null && - isLatest(moduleVersionString, currentDefaultVerison)) { - defaultModules.put(moduleNameString, moduleVersionString); - } - } - } else { - defaultModules.put(moduleNameString, moduleVersionString); - } - - } - Iterator def_mod_itr = defaultModules.keySet().iterator(); - while (def_mod_itr.hasNext()) { - String moduleName = (String) def_mod_itr.next(); - axisConfig.addDefaultModuleVersion(moduleName, (String) defaultModules.get(moduleName)); - } - } - - - private void populateModule(AxisModule module, URL moduleUrl) throws DeploymentException { - try { - ClassLoader classLoader = module.getModuleClassLoader(); - InputStream moduleStream = classLoader.getResourceAsStream("META-INF/module.xml"); - if (moduleStream == null) { - moduleStream = classLoader.getResourceAsStream("meta-inf/module.xml"); - } - if (moduleStream == null) { - throw new DeploymentException( - Messages.getMessage( - DeploymentErrorMsgs.MODULE_XML_MISSING, moduleUrl.toString())); - } - ModuleBuilder moduleBuilder = new ModuleBuilder(moduleStream, module, axisConfig); - moduleBuilder.populateModule(); - } catch (IOException e) { - throw new DeploymentException(e); - } - } - -} diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyListenerManager.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyListenerManager.java deleted file mode 100644 index eb1e1a27aa..0000000000 --- a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyListenerManager.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * 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.tuscany.sca.binding.ws.axis2; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Iterator; - -import org.apache.axis2.AxisFault; -import org.apache.axis2.context.ConfigurationContext; -import org.apache.axis2.description.TransportInDescription; -import org.apache.axis2.engine.ListenerManager; -import org.apache.axis2.transport.TransportListener; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * A Tuscany specific Axis2 ListenerManager. Created purely as part of - * TUSCANY-3149 to unregister the ListenerManager from the runtime - * shutown hook - */ -public class TuscanyListenerManager extends ListenerManager { - private static final Log log = LogFactory.getLog(TuscanyListenerManager.class); - - private ListenerManagerShutdownThread shutdownThread = null; - - /** - * To start all the transports - */ - public synchronized void start() { - - ConfigurationContext configctx = getConfigctx(); - - // very nasty! but this is in order to get someone running who keeps - // getting perm gen errors. This will all go away when we move up to Axis2 1.5 - HashMap startedTransports = null; - - try { - Field field = ListenerManager.class.getDeclaredField("startedTransports"); - field.setAccessible(true); - startedTransports = (HashMap)field.get(this); - } catch (Exception ex){ - ex.printStackTrace(); - } - - for (Iterator transportNames = - configctx.getAxisConfiguration().getTransportsIn().values().iterator(); - transportNames.hasNext();) { - try { - TransportInDescription transportIn = (TransportInDescription) transportNames.next(); - TransportListener listener = transportIn.getReceiver(); - if (listener != null && - startedTransports.get(transportIn.getName()) == null) { - listener.init(configctx, transportIn); - listener.start(); - if (startedTransports.get(transportIn.getName()) == null) { - startedTransports.put(transportIn.getName(), listener); - } - } - } catch (Exception e) { - log.info(e.getMessage(), e); - } - } - shutdownThread = new ListenerManagerShutdownThread(this); - Runtime.getRuntime().addShutdownHook(shutdownThread); - } - - public synchronized void stop() throws AxisFault { - super.stop(); - try { - if (shutdownThread != null) { - Runtime.getRuntime().removeShutdownHook(shutdownThread); - shutdownThread = null; - } - } catch (IllegalStateException e) { - // Ignore - shutdownThread = null; - } - } - - static class ListenerManagerShutdownThread extends Thread { - ListenerManager listenerManager; - - public ListenerManagerShutdownThread(ListenerManager listenerManager) { - super(); - this.listenerManager = listenerManager; - } - - public void run() { - try { - listenerManager.stop(); - } catch (AxisFault axisFault) { - log.error(axisFault.getMessage(), axisFault); - } - } - } - -} diff --git a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyListingAgent.java b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyListingAgent.java index 55f1592657..fb309b7593 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyListingAgent.java +++ b/sca-java-2.x/trunk/modules/binding-ws-axis2-15-runtime/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/TuscanyListingAgent.java @@ -94,10 +94,10 @@ public class TuscanyListingAgent extends ListingAgent { Definition definition = (Definition)wsld4jdefinition.getValue(); for (Object s : definition.getServices().values()) { for (Object p : ((Service)s).getPorts().values()) { - String endpointURL = Axis2ServiceProvider.getPortAddress((Port)p); + String endpointURL = Axis2EngineIntegration.getPortAddress((Port)p); String modifiedURL = setIPAddress(endpointURL, url); modifiedURL = addContextRoot(modifiedURL, serviceName); - Axis2ServiceProvider.setPortAddress((Port)p, modifiedURL); + Axis2EngineIntegration.setPortAddress((Port)p, modifiedURL); } } } @@ -218,10 +218,12 @@ public class TuscanyListingAgent extends ListingAgent { int wsdlPort = wsdlURIObj.getPort(); String wsdlAddr = wsdlHost + (wsdlPort != -1 ? ":" + Integer.toString(wsdlPort) : ""); URI requestURIObj = new URI(requestURI); - String ipAddr = HttpUtils.getIpAddress(); - int requestPort = requestURIObj.getPort(); - String newAddr = ipAddr + (requestPort != -1 ? ":" + Integer.toString(requestPort) : ""); - return wsdlURI.replace(wsdlAddr, newAddr); +// not in Axis2 1.5.1 +// String ipAddr = HttpUtils.getIpAddress(); +// int requestPort = requestURIObj.getPort(); +// String newAddr = ipAddr + (requestPort != -1 ? ":" + Integer.toString(requestPort) : ""); +// return wsdlURI.replace(wsdlAddr, newAddr); + return wsdlURI; } catch (Exception e) { // URI string not in expected format, so return the WSDL URI unmodified return wsdlURI; -- cgit v1.2.3