You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2006/02/25 03:56:21 UTC
svn commit: r380888 [1/2] - in /incubator/tuscany/java/sca:
binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/
binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/
binding.axis/src/main/java/org/apache/tuscany/bind...
Author: jsdelfino
Date: Fri Feb 24 18:56:18 2006
New Revision: 380888
URL: http://svn.apache.org/viewcvs?rev=380888&view=rev
Log:
integrated WSDL loading and Java interface generation
Added:
incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/
incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java (with props)
incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java (with props)
incubator/tuscany/java/sca/binding.axis/src/main/resources/system.fragment
Removed:
incubator/tuscany/java/sca/binding.axis/src/test/resources/tuscany-model.config
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/pojo/
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/sdo/
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/config/
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/xsd/
incubator/tuscany/java/sca/model/src/main/java/org/osoa/
Modified:
incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/WebServiceBindingImpl.java
incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/loader/WebServiceSCDLModelLoader.java
incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/assembly/tests/WebServiceAssemblyLoaderTestCase.java
incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/mediator/tests/SOAPMediatorTestCase.java
incubator/tuscany/java/sca/binding.axis/src/test/resources/org/apache/tuscany/binding/axis/assembly/tests/sca.module
incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java
incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java
incubator/tuscany/java/sca/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java
incubator/tuscany/java/sca/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/JavaAssemblyLoaderTestCase.java
incubator/tuscany/java/sca/container.js/src/main/java/org/apache/tuscany/container/js/assembly/impl/JavaScriptImplementationImpl.java
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/ModuleComponentConfigurationLoaderImpl.java
incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Aggregate.java
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AggregateImpl.java
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyModelContextImpl.java
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/SCDLModelLoader.java
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLModelContentHandlerImpl.java
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java
incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java
incubator/tuscany/java/sca/model/src/main/resources/model/sca-core.xsd
incubator/tuscany/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd
incubator/tuscany/java/sca/model/src/test/java/org/apache/tuscany/model/assembly/tests/SCDLAssemblyLoaderTestCase.java
Modified: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/WebServiceBindingImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/WebServiceBindingImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/WebServiceBindingImpl.java (original)
+++ incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/assembly/impl/WebServiceBindingImpl.java Fri Feb 24 18:56:18 2006
@@ -16,10 +16,15 @@
*/
package org.apache.tuscany.binding.axis.assembly.impl;
+import java.util.Collection;
+import java.util.List;
+
import javax.wsdl.Definition;
import javax.wsdl.Port;
+import javax.wsdl.Service;
import org.apache.tuscany.binding.axis.assembly.WebServiceBinding;
+import org.apache.tuscany.model.assembly.AssemblyModelContext;
import org.apache.tuscany.model.assembly.impl.BindingImpl;
/**
@@ -29,6 +34,7 @@
private Definition definition;
private Port port;
+ private String portURI;
/**
* Constructor
@@ -65,5 +71,46 @@
checkNotFrozen();
this.definition=definition;
}
-
+
+ /**
+ * @param portURI The portURI to set.
+ */
+ public void setPortURI(String portURI) {
+ this.portURI = portURI;
+ }
+
+ /**
+ * @see org.apache.tuscany.model.assembly.impl.BindingImpl#initialize(org.apache.tuscany.model.assembly.AssemblyModelContext)
+ */
+ public void initialize(AssemblyModelContext modelContext) {
+ if (isInitialized())
+ return;
+ super.initialize(modelContext);
+
+ // Get the WSDL port namespace and name
+ if (port==null && portURI!=null) {
+ int h=portURI.indexOf('#');
+ String portNamespace=portURI.substring(0,h);
+ String portName=portURI.substring(h+1);
+
+ // Load the WSDL definitions for the given namespace
+ List<Definition> definitions=modelContext.getAssemblyLoader().loadDefinitions(portNamespace);
+ if (definitions==null)
+ throw new IllegalArgumentException("Cannot find WSDL definition for "+portNamespace);
+ for (Definition definition: definitions) {
+
+ // Find the port with the given name
+ for (Service service : (Collection<Service>)definition.getServices().values()) {
+ Port port=service.getPort(portName);
+ if (port!=null) {
+ this.definition=definition;
+ this.port=port;
+ return;
+ }
+ }
+ }
+ throw new IllegalArgumentException("Cannot find WSDL port "+portURI);
+ }
+ }
+
}
Added: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java?rev=380888&view=auto
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java (added)
+++ incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java Fri Feb 24 18:56:18 2006
@@ -0,0 +1,348 @@
+package org.apache.tuscany.binding.axis.builder;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.tuscany.container.java.assembly.JavaImplementation;
+import org.apache.tuscany.container.java.config.JavaComponentRuntimeConfiguration;
+import org.apache.tuscany.core.builder.BuilderConfigException;
+import org.apache.tuscany.core.builder.BuilderException;
+import org.apache.tuscany.core.builder.NoAccessorException;
+import org.apache.tuscany.core.builder.RuntimeConfigurationBuilder;
+import org.apache.tuscany.core.builder.impl.ProxyObjectFactory;
+import org.apache.tuscany.core.config.JavaIntrospectionHelper;
+import org.apache.tuscany.core.context.AggregateContext;
+import org.apache.tuscany.core.context.QualifiedName;
+import org.apache.tuscany.core.injection.EventInvoker;
+import org.apache.tuscany.core.injection.FactoryInitException;
+import org.apache.tuscany.core.injection.FieldInjector;
+import org.apache.tuscany.core.injection.Injector;
+import org.apache.tuscany.core.injection.MethodEventInvoker;
+import org.apache.tuscany.core.injection.MethodInjector;
+import org.apache.tuscany.core.injection.SDOObjectFactory;
+import org.apache.tuscany.core.injection.SingletonObjectFactory;
+import org.apache.tuscany.core.invocation.InvocationConfiguration;
+import org.apache.tuscany.core.invocation.ProxyConfiguration;
+import org.apache.tuscany.core.invocation.impl.InvokerInterceptor;
+import org.apache.tuscany.core.invocation.spi.ProxyFactory;
+import org.apache.tuscany.core.invocation.spi.ProxyFactoryFactory;
+import org.apache.tuscany.core.message.MessageFactory;
+import org.apache.tuscany.core.runtime.RuntimeContext;
+import org.apache.tuscany.core.system.annotation.Autowire;
+import org.apache.tuscany.model.assembly.AssemblyModelObject;
+import org.apache.tuscany.model.assembly.ConfiguredProperty;
+import org.apache.tuscany.model.assembly.ConfiguredReference;
+import org.apache.tuscany.model.assembly.ConfiguredService;
+import org.apache.tuscany.model.assembly.Scope;
+import org.apache.tuscany.model.assembly.Service;
+import org.apache.tuscany.model.assembly.ServiceContract;
+import org.apache.tuscany.model.assembly.SimpleComponent;
+import org.osoa.sca.annotations.ComponentName;
+import org.osoa.sca.annotations.Context;
+import org.osoa.sca.annotations.Destroy;
+import org.osoa.sca.annotations.Init;
+
+import commonj.sdo.DataObject;
+
+/**
+ * Builds runtime configurations for component implementations that map to
+ * {@link org.apache.tuscany.container.java.assembly.JavaImplementation}. The logical model is then decorated with the
+ * runtime configuration.
+ *
+ * @see org.apache.tuscany.core.builder.RuntimeConfiguration
+ *
+ * @version $Rev: 368822 $ $Date: 2006-01-13 10:54:38 -0800 (Fri, 13 Jan 2006) $
+ */
+@org.osoa.sca.annotations.Scope("MODULE")
+public class JavaComponentContextBuilder implements RuntimeConfigurationBuilder<AggregateContext> {
+
+ private RuntimeContext runtimeContext;
+ private ProxyFactoryFactory proxyFactoryFactory;
+ private MessageFactory messageFactory;
+ private RuntimeConfigurationBuilder referenceBuilder;
+
+ @Init(eager=true)
+ public void init() {
+ runtimeContext.addBuilder(this);
+ }
+
+ /**
+ * @param runtimeContext The runtimeContext to set.
+ */
+ @Autowire
+ public void setRuntimeContext(RuntimeContext runtimeContext) {
+ this.runtimeContext = runtimeContext;
+ }
+
+ /**
+ * Sets the factory used to construct proxies implmementing the business interface required by a reference
+ */
+ @Autowire
+ public void setProxyFactoryFactory(ProxyFactoryFactory factory) {
+ this.proxyFactoryFactory = factory;
+ }
+
+ /**
+ * Sets the factory used to construct invocation messages
+ *
+ * @param msgFactory
+ */
+ @Autowire
+ public void setMessageFactory(MessageFactory msgFactory) {
+ this.messageFactory = msgFactory;
+ }
+
+ /**
+ * Sets a builder responsible for creating source-side and target-side invocation chains for a reference. The
+ * reference builder may be hierarchical, containing other child reference builders that operate on specific
+ * metadata used to construct and invocation chain.
+ *
+ * @see org.apache.tuscany.core.builder.impl.HierarchicalBuilder
+ */
+ public void setReferenceBuilder(RuntimeConfigurationBuilder builder) {
+ this.referenceBuilder = builder;
+ }
+
+ // ----------------------------------
+ // Constructors
+ // ----------------------------------
+
+ public JavaComponentContextBuilder() {
+ }
+
+ // ----------------------------------
+ // Methods
+ // ----------------------------------
+
+ public void build(AssemblyModelObject modelObject, AggregateContext parentContext) throws BuilderException {
+ if (!(modelObject instanceof SimpleComponent)) {
+ return;
+ }
+ SimpleComponent component = (SimpleComponent) modelObject;
+ if (component.getComponentImplementation() instanceof JavaImplementation) {
+ JavaImplementation javaImpl = (JavaImplementation) component.getComponentImplementation();
+ // FIXME scope
+ Scope scope = component.getComponentImplementation().getComponentType().getServices().get(0).getServiceContract()
+ .getScope();
+ Class implClass = null;
+ Set<Field> fields;
+ Set<Method> methods;
+ try {
+ implClass = javaImpl.getImplementationClass();
+ fields = JavaIntrospectionHelper.getAllFields(implClass);
+ methods = JavaIntrospectionHelper.getAllUniqueMethods(implClass);
+ String name = component.getName();
+ Constructor ctr = implClass.getConstructor((Class[]) null);
+
+ List<Injector> injectors = new ArrayList();
+
+ EventInvoker initInvoker = null;
+ boolean eagerInit = false;
+ EventInvoker destroyInvoker = null;
+ // FIXME this should be run as part of the LCM load
+ for (Field field : fields) {
+ ComponentName compName = field.getAnnotation(ComponentName.class);
+ if (compName != null) {
+ Injector injector = new FieldInjector(field, new SingletonObjectFactory(name));
+ injectors.add(injector);
+ }
+ Context context = field.getAnnotation(Context.class);
+ if (context != null) {
+ Injector injector = new FieldInjector(field, new SingletonObjectFactory(parentContext));
+ injectors.add(injector);
+ }
+ }
+ for (Method method : methods) {
+ // FIXME Java5
+ Init init = method.getAnnotation(Init.class);
+ if (init != null && initInvoker == null) {
+ initInvoker = new MethodEventInvoker(method);
+ eagerInit = init.eager();
+ continue;
+ }
+ // @spec - should we allow the same method to have @init and
+ // @destroy?
+ Destroy destroy = method.getAnnotation(Destroy.class);
+ if (destroy != null && destroyInvoker == null) {
+ destroyInvoker = new MethodEventInvoker(method);
+ continue;
+ }
+ ComponentName compName = method.getAnnotation(ComponentName.class);
+ if (compName != null) {
+ Injector injector = new MethodInjector(method, new SingletonObjectFactory(name));
+ injectors.add(injector);
+ }
+ Context context = method.getAnnotation(Context.class);
+ if (context != null) {
+ Injector injector = new MethodInjector(method, new SingletonObjectFactory(parentContext));
+ injectors.add(injector);
+ }
+ }
+ // handle properties
+ List<ConfiguredProperty> configuredProperties = component.getConfiguredProperties();
+ // FIXME should return empty properties - does it?
+ if (configuredProperties != null) {
+ for (ConfiguredProperty property : configuredProperties) {
+ Injector injector = createPropertyInjector(property, fields, methods);
+ injectors.add(injector);
+ }
+ }
+ JavaComponentRuntimeConfiguration config = new JavaComponentRuntimeConfiguration(name, JavaIntrospectionHelper
+ .getDefaultConstructor(implClass), eagerInit, initInvoker, destroyInvoker, scope);
+ component.getComponentImplementation().setRuntimeConfiguration(config);
+
+ // create target-side invocation chains for each service offered by the implementation
+ for (ConfiguredService configuredService : component.getConfiguredServices()) {
+ Service service = configuredService.getService();
+ ServiceContract serviceContract = service.getServiceContract();
+ Map<Method, InvocationConfiguration> iConfigMap = new HashMap();
+ ProxyFactory proxyFactory = proxyFactoryFactory.createProxyFactory();
+ Set<Method> javaMethods = JavaIntrospectionHelper.getAllUniqueMethods(serviceContract.getInterface());
+ for (Method method : javaMethods) {
+ InvocationConfiguration iConfig = new InvocationConfiguration(method);
+ iConfigMap.put(method, iConfig);
+ }
+ QualifiedName qName = new QualifiedName(component.getName() + "/" + service.getName());
+ ProxyConfiguration pConfiguration = new ProxyConfiguration(qName, iConfigMap, null, messageFactory);
+ proxyFactory.setBusinessInterface(serviceContract.getInterface());
+ proxyFactory.setProxyConfiguration(pConfiguration);
+ config.addTargetProxyFactory(service.getName(), proxyFactory);
+ configuredService.setProxyFactory(proxyFactory);
+ if (referenceBuilder != null) {
+ // invoke the reference builder to handle target-side metadata
+ referenceBuilder.build(configuredService, parentContext);
+ }
+ // add tail interceptor
+ for (InvocationConfiguration iConfig : (Collection<InvocationConfiguration>) iConfigMap.values()) {
+ iConfig.addTargetInterceptor(new InvokerInterceptor());
+ }
+
+ }
+
+ // handle references
+ List<ConfiguredReference> configuredReferences = component.getConfiguredReferences();
+ if (configuredReferences != null) {
+ for (ConfiguredReference reference : configuredReferences) {
+ ProxyFactory proxyFactory = proxyFactoryFactory.createProxyFactory();
+ ServiceContract serviceContract = reference.getReference().getServiceContract();
+ Map<Method, InvocationConfiguration> iConfigMap = new HashMap();
+ Set<Method> javaMethods = JavaIntrospectionHelper.getAllUniqueMethods(serviceContract.getInterface());
+ for (Method method : javaMethods) {
+ InvocationConfiguration iConfig = new InvocationConfiguration(method);
+ iConfigMap.put(method, iConfig);
+ }
+ String targetCompName = reference.getTargetConfiguredServices().get(0).getAggregatePart().getName();
+ String targetSerivceName = reference.getTargetConfiguredServices().get(0).getService().getName();
+
+ QualifiedName qName = new QualifiedName(targetCompName + "/" + targetSerivceName);
+ // QualifiedName qName = new QualifiedName(reference.getAggregatePart().getName() + "/"
+ // + reference.getPort().getName());
+ ProxyConfiguration pConfiguration = new ProxyConfiguration(qName, iConfigMap, null, messageFactory);
+ proxyFactory.setBusinessInterface(serviceContract.getInterface());
+ proxyFactory.setProxyConfiguration(pConfiguration);
+ config.addSourceProxyFactory(reference.getReference().getName(), proxyFactory);
+ reference.setProxyFactory(proxyFactory);
+ if (referenceBuilder != null) {
+ // invoke the reference builder to handle metadata associated with the reference
+ referenceBuilder.build(reference, parentContext);
+ }
+ Injector injector = createReferenceInjector(reference.getReference().getName(), proxyFactory, fields,
+ methods);
+ injectors.add(injector);
+ }
+ }
+ config.setSetters(injectors);
+ } catch (BuilderException e) {
+ e.addContextName(component.getName());
+ e.addContextName(parentContext.getName());
+ throw e;
+ } catch (NoSuchMethodException e) {
+ BuilderConfigException ce = new BuilderConfigException("Class does not have a no-arg constructor", e);
+ ce.setIdentifier(implClass.getName());
+ ce.addContextName(component.getName());
+ ce.addContextName(parentContext.getName());
+ throw ce;
+ }
+ }
+ }
+
+ // ----------------------------------
+ // Private methods
+ // ----------------------------------
+
+ /**
+ * Creates an <code>Injector</code> for component properties
+ */
+ private Injector createPropertyInjector(ConfiguredProperty property, Set<Field> fields, Set<Method> methods)
+ throws NoAccessorException {
+ Object value = property.getValue();
+ String propName = property.getProperty().getName();
+ // @FIXME is this how to get property type of object
+ Class type = value.getClass();
+
+ // There is no efficient way to do this
+ Method method = null;
+ Field field = JavaIntrospectionHelper.findClosestMatchingField(propName, type, fields);
+ if (field == null) {
+ method = JavaIntrospectionHelper.findClosestMatchingMethod(propName, new Class[] { type }, methods);
+ if (method == null) {
+ throw new NoAccessorException(propName);
+ }
+ }
+ Injector injector = null;
+ // FIXME support types other than String
+ if (value instanceof DataObject) {
+ if (field != null) {
+ injector = new FieldInjector(field, new SDOObjectFactory((DataObject) value));
+ } else {
+ injector = new MethodInjector(method, new SDOObjectFactory((DataObject) value));
+ }
+ } else if (JavaIntrospectionHelper.isImmutable(type)) {
+ if (field != null) {
+ injector = new FieldInjector(field, new SingletonObjectFactory(value));
+ } else {
+ injector = new MethodInjector(method, new SingletonObjectFactory(value));
+ }
+ }
+ return injector;
+
+ }
+
+ /**
+ * Creates an <code>Injector</code> for service references
+ */
+ private Injector createReferenceInjector(String refName, ProxyFactory proxyFactory, Set<Field> fields, Set<Method> methods)
+ throws NoAccessorException, BuilderConfigException {
+ Method method = null;
+ Field field = JavaIntrospectionHelper.findClosestMatchingField(refName, proxyFactory.getBusinessInterface(), fields);
+ if (field == null) {
+ method = JavaIntrospectionHelper.findClosestMatchingMethod(refName,
+ new Class[] { proxyFactory.getBusinessInterface() }, methods);
+ if (method == null) {
+ throw new NoAccessorException(refName);
+ }
+ }
+ Injector injector;
+ try {
+ if (field != null) {
+ injector = new FieldInjector(field, new ProxyObjectFactory(proxyFactory));
+ } else {
+ injector = new MethodInjector(method, new ProxyObjectFactory(proxyFactory));
+ }
+ } catch (FactoryInitException e) {
+ BuilderConfigException ce = new BuilderConfigException("Error configuring reference", e);
+ ce.setIdentifier(refName);
+ throw ce;
+ }
+ return injector;
+
+ }
+
+}
Propchange: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaComponentContextBuilder.java
------------------------------------------------------------------------------
svn:keywords = Rev,Date
Added: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java?rev=380888&view=auto
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java (added)
+++ incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java Fri Feb 24 18:56:18 2006
@@ -0,0 +1,75 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+ *
+ * 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.tuscany.binding.axis.builder;
+
+import org.apache.tuscany.container.java.config.JavaComponentRuntimeConfiguration;
+import org.apache.tuscany.container.java.handler.ScopedJavaComponentInvoker;
+import org.apache.tuscany.core.builder.BuilderConfigException;
+import org.apache.tuscany.core.builder.WireBuilder;
+import org.apache.tuscany.core.context.ScopeContext;
+import org.apache.tuscany.core.invocation.InvocationConfiguration;
+import org.apache.tuscany.core.invocation.spi.ProxyFactory;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Scope;
+
+/**
+ * Completes a wire to a Java-based target component by adding a scoped java invoker to the source chain
+ *
+ * @version $Rev$ $Date$
+ */
+@Scope("MODULE")
+public class JavaTargetWireBuilder implements WireBuilder {
+
+ public JavaTargetWireBuilder() {
+ }
+
+ @Init(eager = true)
+ public void init() {
+ }
+
+ public void connect(ProxyFactory sourceFactory, ProxyFactory targetFactory, Class targetType, boolean downScope,
+ ScopeContext targetScopeContext) throws BuilderConfigException {
+ if (!(JavaComponentRuntimeConfiguration.class.isAssignableFrom(targetType))) {
+ return;
+ }
+ for (InvocationConfiguration sourceInvocationConfig : sourceFactory.getProxyConfiguration().getInvocationConfigurations()
+ .values()) {
+ ScopedJavaComponentInvoker invoker = new ScopedJavaComponentInvoker(sourceFactory.getProxyConfiguration()
+ .getTargetName(), sourceInvocationConfig.getMethod(), targetScopeContext);
+ if (downScope) {
+ // the source scope is shorter than the target, so the invoker can cache the target instance
+ invoker.setCacheable(true);
+ } else {
+ invoker.setCacheable(false);
+ }
+ sourceInvocationConfig.setTargetInvoker(invoker);
+ }
+ }
+
+ public void completeTargetChain(ProxyFactory targetFactory, Class targetType, ScopeContext targetScopeContext)
+ throws BuilderConfigException {
+ // TODO implement.
+ // if (!(JavaComponentRuntimeConfiguration.class.isAssignableFrom(targetType))) {
+ // return;
+ // }
+ // for (InvocationConfiguration targetInvocationConfig :
+ // targetFactory.getProxyConfiguration().getInvocationConfigurations()
+ // .values()) {
+ // ScopedJavaComponentInvoker invoker = new ScopedJavaComponentInvoker(targetFactory.getProxyConfiguration()
+ // .getTargetName(), ((JavaOperationType) targetInvocationConfig.getOperationType()).getJavaMethod(),
+ // targetScopeContext);
+ // targetInvocationConfig.setTargetInvoker(invoker);
+ // }
+ }
+}
Propchange: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/builder/JavaTargetWireBuilder.java
------------------------------------------------------------------------------
svn:keywords = Rev,Date
Modified: incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/loader/WebServiceSCDLModelLoader.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/loader/WebServiceSCDLModelLoader.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/loader/WebServiceSCDLModelLoader.java (original)
+++ incubator/tuscany/java/sca/binding.axis/src/main/java/org/apache/tuscany/binding/axis/loader/WebServiceSCDLModelLoader.java Fri Feb 24 18:56:18 2006
@@ -1,23 +1,21 @@
package org.apache.tuscany.binding.axis.loader;
import java.util.Collection;
+import java.util.List;
import javax.wsdl.Definition;
import javax.wsdl.Port;
import javax.wsdl.Service;
-import javax.wsdl.WSDLException;
-import javax.wsdl.factory.WSDLFactory;
-import javax.wsdl.xml.WSDLReader;
import org.apache.tuscany.binding.axis.assembly.WebServiceAssemblyFactory;
import org.apache.tuscany.binding.axis.assembly.WebServiceBinding;
import org.apache.tuscany.binding.axis.assembly.impl.WebServiceAssemblyFactoryImpl;
+import org.apache.tuscany.binding.axis.assembly.impl.WebServiceBindingImpl;
import org.apache.tuscany.core.runtime.RuntimeContext;
import org.apache.tuscany.core.system.annotation.Autowire;
import org.apache.tuscany.model.assembly.AssemblyModelContext;
import org.apache.tuscany.model.assembly.AssemblyModelObject;
import org.apache.tuscany.model.scdl.loader.SCDLModelLoader;
-import org.apache.tuscany.model.util.XMLNameUtil;
import org.osoa.sca.annotations.Init;
/**
@@ -32,7 +30,7 @@
/**
* Constructs a new WebServiceSCDLModelLoader.
*/
- public WebServiceSCDLModelLoader(AssemblyModelContext modelContext) {
+ public WebServiceSCDLModelLoader() {
this.wsFactory=new WebServiceAssemblyFactoryImpl();
}
@@ -58,35 +56,11 @@
WebServiceBinding binding=wsFactory.createWebServiceBinding();
binding.setURI(scdlBinding.getUri());
- // Get the WSDL port namespace and name
- String portURI=scdlBinding.getPort();
- int h=portURI.indexOf('#');
- String portNamespace=portURI.substring(0,h);
- String portName=portURI.substring(h+1);
-
- // Load the WSDL file
- String packageName=XMLNameUtil.getPackageNameFromNamespace(portNamespace);
- String fileName=XMLNameUtil.getValidNameFromXMLName(portName, false);
- String wsdlURI=packageName+'/'+fileName+".wsdl";
- Definition definition;
- try {
- WSDLReader reader=WSDLFactory.newInstance().newWSDLReader();
- definition = reader.readWSDL(wsdlURI);
- } catch (WSDLException e) {
- throw new IllegalArgumentException(e);
- }
- binding.setWSDLDefinition(definition);
-
- // Find the specified port
- for (Service service : (Collection<Service>)definition.getServices().values()) {
- Port port=service.getPort(portName);
- if (port!=null) {
- binding.setWSDLPort(port);
- break;
- }
- }
+ // Set the port URI into the assembly binding, it'll be resolved in the initialize method
+ ((WebServiceBindingImpl)binding).setPortURI(scdlBinding.getPort());
return binding;
+
} else
return null;
}
Added: incubator/tuscany/java/sca/binding.axis/src/main/resources/system.fragment
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/main/resources/system.fragment?rev=380888&view=auto
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/main/resources/system.fragment (added)
+++ incubator/tuscany/java/sca/binding.axis/src/main/resources/system.fragment Fri Feb 24 18:56:18 2006
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable.
+
+ 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.
+ -->
+<moduleFragment xmlns="http://www.osoa.org/xmlns/sca/0.9" xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:system="http://org.apache.tuscany/xmlns/system/0.9"
+ name="org.apache.tuscany.binding.axis">
+
+ <component name="org.apache.tuscany.container.java.builder.JavaComponentContextBuilder">
+ <system:implementation.system class="org.apache.tuscany.container.java.builder.JavaComponentContextBuilder"/>
+ </component>
+
+ <component name="org.apache.tuscany.container.java.builder.JavaTargetWireBuilder">
+ <system:implementation.system class="org.apache.tuscany.container.java.builder.JavaTargetWireBuilder"/>
+ </component>
+ <!-- this needs to be wired to the defailt wire builder in the core system.fragment
+ <wire>
+ <source.uri>org.apache.tuscany.core.builder.impl.DefaultWireBuilder/wireBuilders</source.uri>
+ <target.uri>org.apache.tuscany.container.java.builder.JavaTargetWireBuilder</target.uri>
+ </wire>
+ -->
+ <component name="org.apache.tuscany.container.java.loader.JavaSCDLModelLoader">
+ <system:implementation.system class="org.apache.tuscany.container.java.loader.JavaSCDLModelLoader"/>
+ </component>
+
+
+
+
+</moduleFragment>
Modified: incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/assembly/tests/WebServiceAssemblyLoaderTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/assembly/tests/WebServiceAssemblyLoaderTestCase.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/assembly/tests/WebServiceAssemblyLoaderTestCase.java (original)
+++ incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/assembly/tests/WebServiceAssemblyLoaderTestCase.java Fri Feb 24 18:56:18 2006
@@ -16,25 +16,33 @@
*/
package org.apache.tuscany.binding.axis.assembly.tests;
+import java.util.ArrayList;
+import java.util.List;
+
import junit.framework.Assert;
import junit.framework.TestCase;
import org.apache.tuscany.binding.axis.assembly.WebServiceBinding;
+import org.apache.tuscany.binding.axis.loader.WebServiceSCDLModelLoader;
+import org.apache.tuscany.common.resource.ResourceLoader;
+import org.apache.tuscany.common.resource.impl.ResourceLoaderImpl;
+import org.apache.tuscany.model.assembly.AssemblyFactory;
import org.apache.tuscany.model.assembly.AssemblyModelContext;
import org.apache.tuscany.model.assembly.Binding;
import org.apache.tuscany.model.assembly.Component;
import org.apache.tuscany.model.assembly.EntryPoint;
import org.apache.tuscany.model.assembly.ExternalService;
import org.apache.tuscany.model.assembly.Module;
+import org.apache.tuscany.model.assembly.impl.AssemblyFactoryImpl;
import org.apache.tuscany.model.assembly.impl.AssemblyModelContextImpl;
import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader;
+import org.apache.tuscany.model.scdl.loader.SCDLModelLoader;
+import org.apache.tuscany.model.scdl.loader.impl.SCDLAssemblyModelLoaderImpl;
/**
*/
public class WebServiceAssemblyLoaderTestCase extends TestCase {
- private AssemblyModelContext modelContext;
-
/**
*
*/
@@ -44,8 +52,15 @@
public void testLoader() {
- AssemblyModelLoader loader = modelContext.getAssemblyLoader();
- Module module = loader.getModule(getClass().getResource("sca.module").toString());
+ ResourceLoader resourceLoader=new ResourceLoaderImpl(Thread.currentThread().getContextClassLoader());
+ WebServiceSCDLModelLoader wsLoader=new WebServiceSCDLModelLoader();
+ List<SCDLModelLoader> scdlLoaders=new ArrayList<SCDLModelLoader>();
+ scdlLoaders.add(wsLoader);
+ AssemblyModelLoader assemblyLoader=new SCDLAssemblyModelLoaderImpl(scdlLoaders);
+ AssemblyFactory assemblyFactory=new AssemblyFactoryImpl();
+ AssemblyModelContext modelContext=new AssemblyModelContextImpl(assemblyFactory, assemblyLoader, resourceLoader);
+
+ Module module = assemblyLoader.loadModule(getClass().getResource("sca.module").toString());
module.initialize(modelContext);
Assert.assertTrue(module.getName().equals("tuscany.binding.axis.assembly.tests.bigbank.account"));
@@ -67,7 +82,6 @@
super.setUp();
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
- modelContext = new AssemblyModelContextImpl();
}
}
Modified: incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/mediator/tests/SOAPMediatorTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/mediator/tests/SOAPMediatorTestCase.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/mediator/tests/SOAPMediatorTestCase.java (original)
+++ incubator/tuscany/java/sca/binding.axis/src/test/java/org/apache/tuscany/binding/axis/mediator/tests/SOAPMediatorTestCase.java Fri Feb 24 18:56:18 2006
@@ -70,7 +70,7 @@
modelContext = new AssemblyModelContextImpl();
AssemblyModelLoader loader = modelContext.getAssemblyLoader();
- Module module = loader.getModule(getClass().getResource("sca.module").toString());
+ Module module = loader.loadModule(getClass().getResource("sca.module").toString());
module.initialize(modelContext);
AssemblyFactory factory = new AssemblyFactoryImpl();
Modified: incubator/tuscany/java/sca/binding.axis/src/test/resources/org/apache/tuscany/binding/axis/assembly/tests/sca.module
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/binding.axis/src/test/resources/org/apache/tuscany/binding/axis/assembly/tests/sca.module?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/binding.axis/src/test/resources/org/apache/tuscany/binding/axis/assembly/tests/sca.module (original)
+++ incubator/tuscany/java/sca/binding.axis/src/test/resources/org/apache/tuscany/binding/axis/assembly/tests/sca.module Fri Feb 24 18:56:18 2006
@@ -20,19 +20,18 @@
<entryPoint name="AccountService">
<interface.java interface="org.apache.tuscany.binding.axis.assembly.tests.bigbank.account.services.account.AccountService"/>
- <binding.ws port="http://www.bigbank.com/AccountService#AccountServiceSOAP"/>
+ <binding.ws port="http://www.bigbank.com/AccountService/#AccountServiceSOAP"/>
<reference>AccountServiceComponent</reference>
</entryPoint>
+ <entryPoint name="AccountService2">
+ <interface.wsdl interface="http://www.bigbank.com/AccountService/#AccountService"/>
+ <binding.ws port="http://www.bigbank.com/AccountService/#AccountServiceSOAP"/>
+ <reference>AccountServiceComponent</reference>
+ </entryPoint>
+
<component name="AccountServiceComponent">
<implementation.java class="org.apache.tuscany.binding.axis.assembly.tests.bigbank.account.services.account.AccountServiceImpl"/>
- <properties>
- <v:currency>EURO</v:currency>
- </properties>
- <references>
- <v:accountDataService>AccountDataServiceComponent</v:accountDataService>
- <v:stockQuoteService>StockQuoteService</v:stockQuoteService>
- </references>
</component>
<component name="AccountDataServiceComponent">
@@ -47,8 +46,16 @@
<externalService name="StockQuoteService">
<interface.java interface="org.apache.tuscany.binding.axis.assembly.tests.bigbank.account.services.stockquote.StockQuoteService"/>
- <binding.ws port="http://www.quickstockquote.com/StockQuoteService#StockQuoteServiceSOAP"/>
- </externalService>
-
+ <binding.ws port="http://webservice.stockquote#StockQuoteWebService"/>
+ </externalService>
+
+ <import.wsdl
+ location="org/apache/tuscany/binding/axis/assembly/tests/bigbank/account/services/account/AccountService.wsdl"
+ namespace="http://www.bigbank.com/AccountService/"/>
+
+ <import.wsdl
+ location="org/apache/tuscany/binding/axis/assembly/tests/bigbank/account/services/stockquote/StockQuoteWebService.wsdl"
+ namespace="http://webservice.stockquote"/>
+
</module>
Modified: incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java (original)
+++ incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/ResourceLoader.java Fri Feb 24 18:56:18 2006
@@ -49,6 +49,13 @@
Class<?> loadClass(String name) throws ClassNotFoundException;
/**
+ * Converts an array of bytes into a Class.
+ * @param bytes
+ * @return
+ */
+ Class<?> addClass(byte[] bytes);
+
+ /**
* Finds the first resource with the given name.
* <p/>
* Each parent is searched first (in the order returned by {@link #getParents()})
Modified: incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java (original)
+++ incubator/tuscany/java/sca/common/src/main/java/org/apache/tuscany/common/resource/impl/ResourceLoaderImpl.java Fri Feb 24 18:56:18 2006
@@ -35,14 +35,39 @@
*/
public class ResourceLoaderImpl implements ResourceLoader {
private final WeakReference<ClassLoader> classLoaderReference;
+ private WeakReference<GeneratedClassLoader> generatedClassLoaderReference;
private final List<ResourceLoader> parents;
/**
+ * A class loader that allows new classes to be defined from an array of bytes
+ */
+ private class GeneratedClassLoader extends ClassLoader {
+
+ /**
+ * Constructs a new ResourceLoaderImpl.GeneratedClassLoader.
+ */
+ public GeneratedClassLoader(ClassLoader classLoader) {
+ super(classLoader);
+ }
+
+ /**
+ * Converts an array of bytes into a Class.
+ * @param bytes
+ * @return
+ */
+ private Class<?> addClass(byte[] bytes) {
+ return defineClass(null, bytes, 0, bytes.length);
+ }
+
+ }
+
+ /**
* Constructs a new ResourceLoaderImpl.
* @param classLoader
*/
public ResourceLoaderImpl(ClassLoader classLoader) {
classLoaderReference = new WeakReference(classLoader);
+ generatedClassLoaderReference = new WeakReference(new GeneratedClassLoader(classLoader));
ClassLoader parentCL = classLoader.getParent();
parents = parentCL == null ? Collections.EMPTY_LIST : Collections.singletonList(new ResourceLoaderImpl(parentCL));
}
@@ -68,6 +93,15 @@
public Class loadClass(String name) throws ClassNotFoundException {
return getClassLoader().loadClass(name);
+ }
+
+ public Class<?> addClass(byte[] bytes) {
+ GeneratedClassLoader cl = generatedClassLoaderReference.get();
+ if (cl == null) {
+ cl=new GeneratedClassLoader(getClassLoader());
+ generatedClassLoaderReference = new WeakReference(cl);
+ }
+ return cl.addClass(bytes);
}
public Iterator<URL> getResources(String name) throws IOException {
Modified: incubator/tuscany/java/sca/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java (original)
+++ incubator/tuscany/java/sca/container.java/src/main/java/org/apache/tuscany/container/java/assembly/impl/JavaImplementationImpl.java Fri Feb 24 18:56:18 2006
@@ -82,7 +82,7 @@
String baseName = JavaIntrospectionHelper.getBaseName(implClass);
URL componentTypeFile = implClass.getResource(baseName + ".componentType");
if (componentTypeFile != null) {
- return modelContext.getAssemblyLoader().getComponentType(componentTypeFile.toString());
+ return modelContext.getAssemblyLoader().loadComponentType(componentTypeFile.toString());
} else {
JavaAssemblyFactory factory = new JavaAssemblyFactoryImpl();
ComponentTypeIntrospector introspector = new Java5ComponentTypeIntrospector(factory);
Modified: incubator/tuscany/java/sca/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/JavaAssemblyLoaderTestCase.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/JavaAssemblyLoaderTestCase.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/JavaAssemblyLoaderTestCase.java (original)
+++ incubator/tuscany/java/sca/container.java/src/test/java/org/apache/tuscany/container/java/assembly/tests/JavaAssemblyLoaderTestCase.java Fri Feb 24 18:56:18 2006
@@ -58,7 +58,7 @@
AssemblyFactory assemblyFactory=new AssemblyFactoryImpl();
AssemblyModelContext modelContext=new AssemblyModelContextImpl(assemblyFactory, assemblyLoader, resourceLoader);
- Module module = assemblyLoader.getModule(getClass().getResource("sca.module").toString());
+ Module module = assemblyLoader.loadModule(getClass().getResource("sca.module").toString());
module.initialize(modelContext);
Assert.assertTrue(module.getName().equals("tuscany.container.java.assembly.tests.bigbank.account"));
Modified: incubator/tuscany/java/sca/container.js/src/main/java/org/apache/tuscany/container/js/assembly/impl/JavaScriptImplementationImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/container.js/src/main/java/org/apache/tuscany/container/js/assembly/impl/JavaScriptImplementationImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/container.js/src/main/java/org/apache/tuscany/container/js/assembly/impl/JavaScriptImplementationImpl.java (original)
+++ incubator/tuscany/java/sca/container.js/src/main/java/org/apache/tuscany/container/js/assembly/impl/JavaScriptImplementationImpl.java Fri Feb 24 18:56:18 2006
@@ -105,7 +105,7 @@
String prefix = script.substring(0,script.lastIndexOf('.'));
URL componentTypeFile = resourceLoader.getResource(prefix + ".componentType");
if (componentTypeFile != null) {
- return modelContext.getAssemblyLoader().getComponentType(componentTypeFile.toString());
+ return modelContext.getAssemblyLoader().loadComponentType(componentTypeFile.toString());
} else {
// TODO we could introspect the JavaScript source
return modelContext.getAssemblyFactory().createComponentType();
Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/ModuleComponentConfigurationLoaderImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/ModuleComponentConfigurationLoaderImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/ModuleComponentConfigurationLoaderImpl.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/config/impl/ModuleComponentConfigurationLoaderImpl.java Fri Feb 24 18:56:18 2006
@@ -119,12 +119,12 @@
public ModuleComponent loadModuleComponent(String name, String uri, String moduleUri, Collection<String> moduleFragmentUris) throws ConfigurationLoadException {
// Load the module file
- Module module=modelLoader.getModule(moduleUri);
+ Module module=modelLoader.loadModule(moduleUri);
// Load the sca.fragment files
if (moduleFragmentUris!=null) {
for (String moduleFragmentUri : moduleFragmentUris) {
- ModuleFragment moduleFragment=modelLoader.getModuleFragment(moduleFragmentUri);
+ ModuleFragment moduleFragment=modelLoader.loadModuleFragment(moduleFragmentUri);
module.getModuleFragments().add(moduleFragment);
}
}
Modified: incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java (original)
+++ incubator/tuscany/java/sca/core/src/main/java/org/apache/tuscany/core/system/assembly/impl/SystemImplementationImpl.java Fri Feb 24 18:56:18 2006
@@ -70,7 +70,7 @@
String baseName = getBaseName(implClass);
URL componentTypeFile = implClass.getResource(baseName + ".componentType");
if (componentTypeFile != null) {
- return modelContext.getAssemblyLoader().getComponentType(componentTypeFile.toString());
+ return modelContext.getAssemblyLoader().loadComponentType(componentTypeFile.toString());
} else {
//FIXME Return a made-up component type for now
// We need to introspect the component implementation class, support a subset of what
Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Aggregate.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Aggregate.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Aggregate.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/Aggregate.java Fri Feb 24 18:56:18 2006
@@ -18,6 +18,8 @@
import java.util.List;
+import javax.wsdl.Import;
+
/**
* Represents an aggregate. An aggregate contains AggregateParts (e.g. components, entry points
* and external services).
@@ -92,5 +94,18 @@
* @return
*/
List<Wire> getWires();
+
+ /**
+ * Returns the WSDL imports.
+ * @return
+ */
+ List<Import> getWSDLImports();
+
+ /**
+ * Returns the WSDL imports for the given namespace.
+ * @param namespace
+ * @return
+ */
+ List<Import> getWSDLImports(String namespace);
}
Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AggregateImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AggregateImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AggregateImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AggregateImpl.java Fri Feb 24 18:56:18 2006
@@ -16,12 +16,19 @@
*/
package org.apache.tuscany.model.assembly.impl;
+import java.io.IOException;
+import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.wsdl.Definition;
+import javax.wsdl.Import;
+import javax.wsdl.xml.WSDLReader;
+
+import org.apache.tuscany.common.resource.ResourceLoader;
import org.apache.tuscany.model.assembly.Aggregate;
import org.apache.tuscany.model.assembly.AggregatePart;
import org.apache.tuscany.model.assembly.AssemblyModelContext;
@@ -47,6 +54,8 @@
private Map<String, ExternalService> externalServicesMap;
private List<AggregatePart> aggregateParts;
private List<Wire> wires=new ArrayList<Wire>();
+ private List<Import> wsdlImports=new ArrayList<Import>();
+ private Map<String, List<Import>> wsdlImportsMap;
/**
* Constructor
@@ -130,6 +139,21 @@
}
/**
+ * @see org.apache.tuscany.model.assembly.Aggregate#getWSDLImports()
+ */
+ public List<Import> getWSDLImports() {
+ return wsdlImports;
+ }
+
+ /**
+ * @see org.apache.tuscany.model.assembly.Aggregate#getWSDLImports(java.lang.String)
+ */
+ public List<Import> getWSDLImports(String namespace) {
+ checkInitialized();
+ return wsdlImportsMap.get(namespace);
+ }
+
+ /**
* @see org.apache.tuscany.model.assembly.Aggregate#getConfiguredService(org.apache.tuscany.model.assembly.ServiceURI)
*/
public ConfiguredService getConfiguredService(ServiceURI address) {
@@ -164,6 +188,35 @@
if (isInitialized())
return;
super.initialize(modelContext);
+
+ // Populate map of WSDL imports
+ ResourceLoader resourceLoader=modelContext.getResourceLoader();
+ WSDLReader reader=null;
+ wsdlImportsMap = new HashMap<String, List<Import>>();
+ for (Import wsdlImport : wsdlImports) {
+ String namespace=wsdlImport.getNamespaceURI();
+ List<Import> list=wsdlImportsMap.get(namespace);
+ if (list==null) {
+ list=new ArrayList<Import>();
+ wsdlImportsMap.put(namespace, list);
+ }
+ list.add(wsdlImport);
+
+ // Load the WSDL definition if necessary
+ if (wsdlImport.getDefinition()==null) {
+ String location=wsdlImport.getLocationURI();
+ Definition definition;
+ try {
+ URL url=resourceLoader.getResource(location);
+ if (url==null)
+ throw new IllegalArgumentException("Cannot find "+location);
+ definition = modelContext.getAssemblyLoader().loadDefinition(url.toString());
+ } catch (IOException e) {
+ throw new IllegalArgumentException(e);
+ }
+ wsdlImport.setDefinition(definition);
+ }
+ }
// Populate maps of components, entry points and external services
aggregateParts = new ArrayList<AggregatePart>();
@@ -202,6 +255,8 @@
super.freeze();
// Freeze lists
+ wsdlImports=Collections.unmodifiableList(wsdlImports);
+ freeze(wsdlImports);
components=Collections.unmodifiableList(components);
freeze(components);
entryPoints=Collections.unmodifiableList(entryPoints);
Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyModelContextImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyModelContextImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyModelContextImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/AssemblyModelContextImpl.java Fri Feb 24 18:56:18 2006
@@ -39,10 +39,10 @@
this.assemblyFactory = assemblyFactory;
else
this.assemblyFactory = new AssemblyFactoryImpl();
+ this.resourceLoader = resourceLoader;
this.assemblyLoader = assemblyLoader;
if (assemblyLoader!=null)
assemblyLoader.setModelContext(this);
- this.resourceLoader = resourceLoader;
}
/**
Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/impl/ModuleImpl.java Fri Feb 24 18:56:18 2006
@@ -99,7 +99,8 @@
for (ModuleFragment moduleFragment : moduleFragments) {
moduleFragmentsMap.put(moduleFragment.getName(), moduleFragment);
- // Add all components, entry points and external services from the module fragments
+ // Add all WSDL imports, components, entry points and external services from the module fragments
+ getWSDLImports().addAll(moduleFragment.getWSDLImports());
getComponents().addAll(moduleFragment.getComponents());
getEntryPoints().addAll(moduleFragment.getEntryPoints());
getExternalServices().addAll(moduleFragment.getExternalServices());
Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/assembly/loader/AssemblyModelLoader.java Fri Feb 24 18:56:18 2006
@@ -16,6 +16,11 @@
*/
package org.apache.tuscany.model.assembly.loader;
+import java.util.List;
+
+import javax.wsdl.Definition;
+import javax.wsdl.PortType;
+
import org.apache.tuscany.model.assembly.AssemblyModelContext;
import org.apache.tuscany.model.assembly.ComponentType;
import org.apache.tuscany.model.assembly.Module;
@@ -38,27 +43,46 @@
* @param uri
* @return
*/
- Module getModule(String uri);
+ Module loadModule(String uri);
/**
* Returns the module at the given uri
* @param uri
* @return
*/
- ModuleFragment getModuleFragment(String uri);
+ ModuleFragment loadModuleFragment(String uri);
/**
* Returns the component type at the given uri
* @param uri
* @return
*/
- ComponentType getComponentType(String uri);
+ ComponentType loadComponentType(String uri);
/**
* Returns the subsystem at the given uri.
* @param uri
* @return
*/
- Subsystem getSubsystem(String uri);
+ Subsystem loadSubsystem(String uri);
+
+ /**
+ * Load a WSDL definition
+ */
+ Definition loadDefinition(String uri);
+
+ /**
+ * Load definitions by namespace
+ * @param uri
+ * @return
+ */
+ List<Definition> loadDefinitions(String namespace);
+
+ /**
+ * Load a class
+ * @param uri
+ * @return
+ */
+ Class loadClass(String className) throws ClassNotFoundException;
}
Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/SCDLModelLoader.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/SCDLModelLoader.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/SCDLModelLoader.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/SCDLModelLoader.java Fri Feb 24 18:56:18 2006
@@ -16,6 +16,7 @@
*/
package org.apache.tuscany.model.scdl.loader;
+import org.apache.tuscany.model.assembly.Aggregate;
import org.apache.tuscany.model.assembly.AssemblyModelContext;
import org.apache.tuscany.model.assembly.AssemblyModelObject;
Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLAssemblyModelLoaderImpl.java Fri Feb 24 18:56:18 2006
@@ -18,9 +18,17 @@
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import javax.wsdl.Definition;
+import javax.wsdl.WSDLException;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+
+import org.apache.tuscany.common.resource.ResourceLoader;
import org.apache.tuscany.model.assembly.AssemblyModelContext;
import org.apache.tuscany.model.assembly.ComponentType;
import org.apache.tuscany.model.assembly.Module;
@@ -37,10 +45,19 @@
public class SCDLAssemblyModelLoaderImpl implements AssemblyModelLoader {
private SCDLXMLReader xmlReader=new SCDLXMLReader();
+ private WSDLReader wsdlReader;
private AssemblyModelContext modelContext;
+ private ResourceLoader resourceLoader;
private List<SCDLModelLoader> scdlModelLoaders;
+ private Map<String, ComponentType> componentTypes=new HashMap<String, ComponentType>();
+ private Map<String, Module> modules=new HashMap<String, Module>();
+ private Map<String, ModuleFragment> moduleFragments=new HashMap<String, ModuleFragment>();
+ private Map<String, Subsystem> subsystems=new HashMap<String, Subsystem>();
+ private Map<String, Definition> definitions=new HashMap<String, Definition>();
+ private Map<String, List<Definition>> definitionsByNamespace=new HashMap<String, List<Definition>>();
+
/**
* Constructor
*/
@@ -53,55 +70,125 @@
*/
public void setModelContext(AssemblyModelContext modelContext) {
this.modelContext = modelContext;
+ this.resourceLoader=this.modelContext.getResourceLoader();
}
/**
- * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#getComponentType(java.lang.String)
+ * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadComponentType(java.lang.String)
*/
- public ComponentType getComponentType(String uri) {
+ public ComponentType loadComponentType(String uri) {
+ ComponentType componentType=componentTypes.get(uri);
+ if (componentType!=null)
+ return componentType;
// Load the SCDL component type
org.apache.tuscany.model.scdl.ComponentType scdlComponentType=xmlReader.getComponentType(uri);
// Transform it to an assembly component type
- return transform(scdlComponentType).getComponentType();
+ componentType=transform(scdlComponentType).getComponentType();
+
+ componentTypes.put(uri, componentType);
+ return componentType;
}
/**
- * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#getModule(java.lang.String)
+ * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadModule(java.lang.String)
*/
- public Module getModule(String uri) {
+ public Module loadModule(String uri) {
+ Module module=modules.get(uri);
+ if (module!=null)
+ return module;
// Load the SCDL module
org.apache.tuscany.model.scdl.Module scdlModule=xmlReader.getModule(uri);
// Transform it to an assembly module
- return transform(scdlModule).getModule();
+ module=transform(scdlModule).getModule();
+
+ modules.put(uri, module);
+ return module;
}
/**
- * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#getModuleFragment(java.lang.String)
+ * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadModuleFragment(java.lang.String)
*/
- public ModuleFragment getModuleFragment(String uri) {
+ public ModuleFragment loadModuleFragment(String uri) {
+ ModuleFragment moduleFragment=moduleFragments.get(uri);
+ if (moduleFragment!=null)
+ return moduleFragment;
// Load the SCDL module fragment
org.apache.tuscany.model.scdl.ModuleFragment scdlFragment=xmlReader.getModuleFragment(uri);
// Transform it to an assembly module fragment
- return transform(scdlFragment).getModuleFragment();
+ moduleFragment=transform(scdlFragment).getModuleFragment();
+
+ moduleFragments.put(uri, moduleFragment);
+ return moduleFragment;
}
/**
- * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#getSubsystem(java.lang.String)
+ * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadSubsystem(java.lang.String)
*/
- public Subsystem getSubsystem(String uri) {
+ public Subsystem loadSubsystem(String uri) {
+ Subsystem subsystem=subsystems.get(uri);
+ if (subsystem!=null)
+ return subsystem;
// Load the SCDL subsystem
org.apache.tuscany.model.scdl.Subsystem scdlSubsystem=xmlReader.getSubsystem(uri);
- return transform(scdlSubsystem).getSubsystem();
+ subsystem=transform(scdlSubsystem).getSubsystem();
+
+ subsystems.put(uri, subsystem);
+ return subsystem;
+ }
+
+ /**
+ * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadDefinition(java.lang.String)
+ */
+ public Definition loadDefinition(String uri) {
+ Definition definition=definitions.get(uri);
+ if (definition!=null)
+ return definition;
+
+ try {
+ if (wsdlReader==null)
+ wsdlReader=WSDLFactory.newInstance().newWSDLReader();
+ definition = wsdlReader.readWSDL(uri);
+ } catch (WSDLException e) {
+ throw new IllegalArgumentException(e);
+ }
+ if (definition==null)
+ throw new IllegalArgumentException("Could not load WSDL definition at "+uri);
+
+ definitions.put(uri, definition);
+
+ String namespace=definition.getTargetNamespace();
+ List<Definition> list=definitionsByNamespace.get(namespace);
+ if (list==null) {
+ list=new ArrayList<Definition>();
+ definitionsByNamespace.put(namespace, list);
+ }
+ list.add(definition);
+
+ return definition;
+ }
+
+ /**
+ * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadDefinitions(java.lang.String)
+ */
+ public List<Definition> loadDefinitions(String namespace) {
+ return definitionsByNamespace.get(namespace);
}
+ /**
+ * @see org.apache.tuscany.model.assembly.loader.AssemblyModelLoader#loadClass(java.lang.String)
+ */
+ public Class loadClass(String className) throws ClassNotFoundException {
+ return resourceLoader.loadClass(className);
+ }
+
/**
* Transform a model and return the handler containing the result of the transformation.
* @param object
Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLModelContentHandlerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLModelContentHandlerImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLModelContentHandlerImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/scdl/loader/impl/SCDLModelContentHandlerImpl.java Fri Feb 24 18:56:18 2006
@@ -19,6 +19,11 @@
import java.util.List;
import java.util.Map;
+import javax.wsdl.Definition;
+import javax.wsdl.Import;
+import javax.wsdl.WSDLException;
+import javax.wsdl.factory.WSDLFactory;
+
import org.apache.tuscany.model.assembly.Aggregate;
import org.apache.tuscany.model.assembly.AssemblyFactory;
import org.apache.tuscany.model.assembly.AssemblyModelContext;
@@ -51,11 +56,13 @@
import org.apache.tuscany.model.scdl.Service;
import org.apache.tuscany.model.scdl.Subsystem;
import org.apache.tuscany.model.scdl.SystemWire;
+import org.apache.tuscany.model.scdl.WSDLImport;
import org.apache.tuscany.model.scdl.WSDLPortType;
import org.apache.tuscany.model.scdl.loader.SCDLModelLoader;
import org.apache.tuscany.model.scdl.util.ScdlSwitch;
import org.apache.tuscany.model.types.java.JavaServiceContract;
import org.apache.tuscany.model.types.wsdl.WSDLServiceContract;
+import org.apache.tuscany.model.types.wsdl.impl.WSDLServiceContractImpl;
import org.apache.tuscany.model.util.ModelContentHandler;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.FeatureMap;
@@ -87,6 +94,7 @@
private org.apache.tuscany.model.assembly.ModuleFragment currentModuleFragment;
private org.apache.tuscany.model.assembly.Subsystem currentSubsystem;
private org.apache.tuscany.model.assembly.ModuleComponent currentModuleComponent;
+ private Definition definition;
/**
* Constructor
@@ -247,15 +255,42 @@
*/
public Object caseWSDLPortType(WSDLPortType object) {
final WSDLServiceContract serviceContract=factory.createWSDLServiceContract();
- serviceContract.setInterface(null);
- serviceContract.setCallbackInterface(null);
serviceContract.setScope(Scope.INSTANCE);
+ ((WSDLServiceContractImpl)serviceContract).setPortTypeURI(object.getInterface());
+ ((WSDLServiceContractImpl)serviceContract).setCallbackPortTypeURI(object.getCallbackInterface());
+
linkServiceContract(object, serviceContract);
return serviceContract;
}
+ /**
+ * @see org.apache.tuscany.model.scdl.util.ScdlSwitch#caseWSDLImport(org.apache.tuscany.model.scdl.WSDLImport)
+ */
+ public Object caseWSDLImport(WSDLImport object) {
+ if (definition==null) {
+ try {
+ WSDLFactory wsdlFactory=WSDLFactory.newInstance();
+ definition=wsdlFactory.newDefinition();
+ } catch (WSDLException e) {
+ throw new IllegalStateException(e);
+ }
+
+ }
+ final Import wsdlImport=definition.createImport();
+ wsdlImport.setNamespaceURI(object.getNamespace());
+ wsdlImport.setLocationURI(object.getLocation());
+
+ linkers.add(new Runnable() {
+ public void run() {
+ currentAggregate.getWSDLImports().add(wsdlImport);
+ };
+ });
+
+ return wsdlImport;
+ }
+
/**
* Link a service contract with the correct owner.
* @param object
Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/types/wsdl/impl/WSDLServiceContractImpl.java Fri Feb 24 18:56:18 2006
@@ -16,13 +16,28 @@
*/
package org.apache.tuscany.model.types.wsdl.impl;
+import static org.objectweb.asm.Opcodes.ACC_ABSTRACT;
+import static org.objectweb.asm.Opcodes.ACC_INTERFACE;
+import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
+import static org.objectweb.asm.Opcodes.V1_5;
+
+import java.util.List;
+
+import javax.wsdl.Definition;
+import javax.wsdl.Operation;
import javax.wsdl.PortType;
import javax.xml.namespace.QName;
+import org.apache.tuscany.common.resource.ResourceLoader;
import org.apache.tuscany.model.assembly.AssemblyModelContext;
import org.apache.tuscany.model.assembly.impl.ServiceContractImpl;
+import org.apache.tuscany.model.assembly.loader.AssemblyModelLoader;
import org.apache.tuscany.model.types.wsdl.WSDLServiceContract;
import org.apache.tuscany.model.util.XMLNameUtil;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Type;
+
+import commonj.sdo.DataObject;
/**
* An implementation of WSDLServiceContract.
@@ -31,7 +46,9 @@
private PortType portType;
private PortType callbackPortType;
-
+ private String portTypeURI;
+ private String callbackPortTypeURI;
+
/**
* Constructor
*/
@@ -69,34 +86,127 @@
}
/**
+ * @param portTypeURI The portTypeURI to set.
+ */
+ public void setPortTypeURI(String portTypeURI) {
+ this.portTypeURI = portTypeURI;
+ }
+
+ /**
+ * @param callbackPortTypeURI The callbackPortTypeURI to set.
+ */
+ public void setCallbackPortTypeURI(String callbackPortTypeURI) {
+ this.callbackPortTypeURI = callbackPortTypeURI;
+ }
+
+ /**
* @see org.apache.tuscany.model.assembly.impl.ExtensibleImpl#initialize(org.apache.tuscany.model.assembly.AssemblyModelContext)
*/
public void initialize(AssemblyModelContext modelContext) {
if (isInitialized())
return;
super.initialize(modelContext);
+
+ // Resolve the WSDL portType and callback portType
+ AssemblyModelLoader modelLoader=modelContext.getAssemblyLoader();
+ if (portTypeURI!=null && portType==null) {
+ portType=getPortType(modelLoader, portTypeURI);
+ }
+ if (callbackPortTypeURI!=null && callbackPortType==null) {
+ callbackPortType=getPortType(modelLoader, callbackPortTypeURI);
+ }
// Load the Java interface for the portType
if (portType!=null && getInterface()==null) {
QName qname=portType.getQName();
- String interfaceName=XMLNameUtil.getPackageNameFromNamespace(qname.getNamespaceURI())+XMLNameUtil.getValidNameFromXMLName(qname.getLocalPart(), true);
+ String interfaceName=XMLNameUtil.getFullyQualifiedClassNameFromQName(qname.getNamespaceURI(), qname.getLocalPart());
+ Class interfaceClass;
try {
- super.setInterface(modelContext.getResourceLoader().loadClass(interfaceName));
+ // Load the interface
+ interfaceClass=modelLoader.loadClass(interfaceName);
} catch (ClassNotFoundException e) {
- throw new IllegalArgumentException(e);
+ // Generate the interface on the fly
+ interfaceClass=generateJavaInterface(modelContext.getResourceLoader(), portType, interfaceName);
}
+ super.setInterface(interfaceClass);
}
// Load the Java interface for the callback portType
if (callbackPortType!=null && getCallbackInterface()==null) {
QName qname=callbackPortType.getQName();
- String interfaceName=XMLNameUtil.getPackageNameFromNamespace(qname.getNamespaceURI())+XMLNameUtil.getValidNameFromXMLName(qname.getLocalPart(), true);
+ String interfaceName=XMLNameUtil.getFullyQualifiedClassNameFromQName(qname.getNamespaceURI(), qname.getLocalPart());
+ Class interfaceClass;
try {
- super.setCallbackInterface(modelContext.getResourceLoader().loadClass(interfaceName));
+ // Load the interface
+ interfaceClass=modelLoader.loadClass(interfaceName);
} catch (ClassNotFoundException e) {
- throw new IllegalArgumentException(e);
+ // Generate the interface on the fly
+ interfaceClass=generateJavaInterface(modelContext.getResourceLoader(), portType, interfaceName);
}
+ super.setCallbackInterface(interfaceClass);
+ }
+ }
+
+ /**
+ * Get a portType from the given uri
+ * @param loader
+ * @param uri
+ * @return
+ */
+ private PortType getPortType(AssemblyModelLoader loader, String uri) {
+
+ // Get the WSDL port namespace and name
+ int h=uri.indexOf('#');
+ String namespace=uri.substring(0,h);
+ String name=uri.substring(h+1);
+ QName qname=new QName(namespace, name);
+
+ // Load the WSDL definitions for the given namespace
+ List<Definition> definitions=loader.loadDefinitions(namespace);
+ if (definitions==null)
+ throw new IllegalArgumentException("Cannot find WSDL definition for "+namespace);
+ for (Definition definition: definitions) {
+
+ // Find the port with the given name
+ PortType portType=definition.getPortType(qname);
+ return portType;
+ }
+ throw new IllegalArgumentException("Cannot find WSDL portType "+uri);
+ }
+
+ /**
+ * Generate a Java interface from a WSDL portType.
+ * @param portType
+ * @param interfaceName
+ * @return
+ */
+ private Class generateJavaInterface(ResourceLoader resourceLoader, PortType portType, String interfaceName) {
+ ClassWriter cw=new ClassWriter(false);
+
+ // Generate the interface
+ interfaceName=interfaceName.replace('.', '/');
+ cw.visit(V1_5, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE, interfaceName, null, "java/lang/Object", new String[0]);
+
+
+ // Generate methods from the WSDL operations
+ for (Operation operation : (List<Operation>)portType.getOperations()) {
+ String methodName=XMLNameUtil.getJavaNameFromXMLName(operation.getName(), false);
+
+ //FIXME integrate XSD to Java type mapping here
+ String inputType = Type.getDescriptor(DataObject.class);
+ String outputType = Type.getDescriptor(DataObject.class);
+
+ cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, methodName, "("+inputType+")"+outputType, null, null).visitEnd();
}
+
+ // Generate the bytecodes
+ cw.visitEnd();
+ byte[] bytes=cw.toByteArray();
+
+ // Add the class to the resource loader
+ Class interfaceClass=(Class)resourceLoader.addClass(bytes);
+
+ return interfaceClass;
}
}
Modified: incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java (original)
+++ incubator/tuscany/java/sca/model/src/main/java/org/apache/tuscany/model/util/XMLNameUtil.java Fri Feb 24 18:56:18 2006
@@ -84,7 +84,7 @@
if (qualifiedPackageName.length() > 0) {
qualifiedPackageName.append('.');
}
- qualifiedPackageName.append(getValidNameFromXMLName(packageName, false));
+ qualifiedPackageName.append(getJavaNameFromXMLName(packageName, false));
}
}
return qualifiedPackageName.toString();
@@ -151,13 +151,13 @@
}
/**
- * Returns a valid name from an XML Name
+ * Returns a valid Java name from an XML Name
*
* @param name
* @param isUpperCase
* @return
*/
- public static String getValidNameFromXMLName(String name, boolean isUpperCase) {
+ public static String getJavaNameFromXMLName(String name, boolean isUpperCase) {
List parsedName = parseName(name, '_');
StringBuffer result = new StringBuffer();
for (Iterator i = parsedName.iterator(); i.hasNext();) {
@@ -175,6 +175,16 @@
return result.length() == 0 ? "_" : Character.isJavaIdentifierStart(result.charAt(0)) ? isUpperCase ? result.toString() : decapitalizeName(result.toString()) : "_" + result;
}
+ /**
+ * Returns a valid fully qualified class name from a QName
+ * @param namespace
+ * @param name
+ * @return
+ */
+ public static String getFullyQualifiedClassNameFromQName(String namespace, String name) {
+ return XMLNameUtil.getPackageNameFromNamespace(namespace)+'.'+XMLNameUtil.getJavaNameFromXMLName(name, true);
+ }
+
/**
* Decapitalize a name.
* @param name
Modified: incubator/tuscany/java/sca/model/src/main/resources/model/sca-core.xsd
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/resources/model/sca-core.xsd?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/resources/model/sca-core.xsd (original)
+++ incubator/tuscany/java/sca/model/src/main/resources/model/sca-core.xsd Fri Feb 24 18:56:18 2006
@@ -61,6 +61,8 @@
<element minOccurs="0" maxOccurs="unbounded" name="component" type="sca:Component"/>
<element minOccurs="0" maxOccurs="unbounded" name="externalService" type="sca:ExternalService"/>
<element minOccurs="0" maxOccurs="unbounded" name="wire" type="sca:ModuleWire"/>
+ <!-- This is a Tuscany extension -->
+ <element minOccurs="0" maxOccurs="unbounded" name="import" type="sca:Import"/>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="NCName" use="required"/>
@@ -215,5 +217,9 @@
<enumeration value="must"/>
</restriction>
</simpleType>
+
+ <!-- This is a Tuscany extension -->
+ <element name="import" type="sca:Import"/>
+ <complexType name="Import"/>
</schema>
Modified: incubator/tuscany/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd
URL: http://svn.apache.org/viewcvs/incubator/tuscany/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd?rev=380888&r1=380887&r2=380888&view=diff
==============================================================================
--- incubator/tuscany/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd (original)
+++ incubator/tuscany/java/sca/model/src/main/resources/model/sca-interface-wsdl.xsd Fri Feb 24 18:56:18 2006
@@ -20,4 +20,20 @@
</extension>
</complexContent>
</complexType>
+
+ <!-- This is a Tuscany extension -->
+ <element name="import.wsdl" type="sca:WSDLImport" substitutionGroup="sca:import"/>
+ <complexType name="WSDLImport">
+ <complexContent>
+ <extension base="sca:Import">
+ <sequence>
+ <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="namespace" type="anyURI" use="required"/>
+ <attribute name="location" type="anyURI" use="required"/>
+ <anyAttribute namespace="##any" processContents="lax"/>
+ </extension>
+ </complexContent>
+ </complexType>
+
</schema>