You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jm...@apache.org on 2007/03/20 01:39:42 UTC

svn commit: r520196 - in /incubator/tuscany/java/sca/kernel: core/src/main/java/org/apache/tuscany/core/builder/ core/src/main/java/org/apache/tuscany/core/implementation/java/ core/src/main/java/org/apache/tuscany/core/implementation/system/generator/...

Author: jmarino
Date: Mon Mar 19 17:39:40 2007
New Revision: 520196

URL: http://svn.apache.org/viewvc?view=rev&rev=520196
Log:
add autowire resolution to AssemblyService; create SystemPhysicalComponentGenerator

Added:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/generator/
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/generator/SystemPhysicalComponentGenerator.java   (with props)
Modified:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaPhysicalComponentGenerator.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/model/physical/java/JavaPhysicalComponentDefinition.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/AutowireResolver.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/DefaultAutowireResolver.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/deployment/AssemblyServiceImpl.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/physical/PhysicalInterceptorDefinition.java

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java?view=diff&rev=520196&r1=520195&r2=520196
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/builder/ConnectorImpl.java Mon Mar 19 17:39:40 2007
@@ -335,13 +335,6 @@
         for (InvocationChain chain : wire.getCallbackInvocationChains().values()) {
             chain.setTargetInvoker(source.createTargetInvoker(null, chain.getOperation()));
         }
-        // TODO the above will deleted be replaced when we cut-over to the physical marshallers
-        for (InvocationChain chain : wire.getPhysicalInvocationChains().values()) {
-            chain.setTargetInvoker(target.createTargetInvoker(name, chain.getPhysicalOperation()));
-        }
-        for (InvocationChain chain : wire.getCallbackPhysicalInvocationChains().values()) {
-            chain.setTargetInvoker(source.createTargetInvoker(null, chain.getPhysicalOperation()));
-        }
     }
 
     /**

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaPhysicalComponentGenerator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaPhysicalComponentGenerator.java?view=diff&rev=520196&r1=520195&r2=520196
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaPhysicalComponentGenerator.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaPhysicalComponentGenerator.java Mon Mar 19 17:39:40 2007
@@ -56,7 +56,6 @@
 @EagerInit
 public class JavaPhysicalComponentGenerator implements ComponentGenerator<ComponentDefinition<JavaImplementation>> {
 
-
     public JavaPhysicalComponentGenerator(@Reference GeneratorRegistry registry) {
         registry.register(JavaImplementation.class, this);
     }

Added: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/generator/SystemPhysicalComponentGenerator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/generator/SystemPhysicalComponentGenerator.java?view=auto&rev=520196
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/generator/SystemPhysicalComponentGenerator.java (added)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/generator/SystemPhysicalComponentGenerator.java Mon Mar 19 17:39:40 2007
@@ -0,0 +1,130 @@
+/*
+ * 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.core.implementation.system.generator;
+
+import java.lang.annotation.ElementType;
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import org.osoa.sca.annotations.EagerInit;
+import org.osoa.sca.annotations.Reference;
+
+import org.apache.tuscany.spi.generator.ComponentGenerator;
+import org.apache.tuscany.spi.generator.GenerationException;
+import org.apache.tuscany.spi.generator.GeneratorContext;
+import org.apache.tuscany.spi.generator.GeneratorRegistry;
+import org.apache.tuscany.spi.implementation.java.JavaMappedReference;
+import org.apache.tuscany.spi.implementation.java.JavaMappedService;
+import org.apache.tuscany.spi.implementation.java.PojoComponentType;
+import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.Property;
+import org.apache.tuscany.spi.model.ReferenceDefinition;
+import org.apache.tuscany.spi.model.ServiceDefinition;
+import org.apache.tuscany.spi.model.physical.PhysicalWireSourceDefinition;
+import org.apache.tuscany.spi.model.physical.PhysicalWireTargetDefinition;
+
+import org.apache.tuscany.core.implementation.system.model.SystemImplementation;
+import org.apache.tuscany.core.implementation.system.model.SystemPhysicalComponentDefinition;
+import org.apache.tuscany.core.model.physical.instancefactory.InjectionSiteMapping;
+import org.apache.tuscany.core.model.physical.instancefactory.InjectionSource;
+import org.apache.tuscany.core.model.physical.instancefactory.MemberSite;
+import org.apache.tuscany.core.model.physical.instancefactory.ReflectiveIFProviderDefinition;
+import org.apache.tuscany.core.model.physical.java.JavaPhysicalWireSourceDefinition;
+import org.apache.tuscany.core.model.physical.java.JavaPhysicalWireTargetDefinition;
+
+/**
+ * @version $Rev$ $Date$
+ */
+@EagerInit
+public class SystemPhysicalComponentGenerator implements ComponentGenerator<ComponentDefinition<SystemImplementation>> {
+
+
+    public SystemPhysicalComponentGenerator(@Reference GeneratorRegistry registry) {
+        registry.register(SystemImplementation.class, this);
+    }
+
+    @SuppressWarnings({"unchecked"})
+    public void generate(ComponentDefinition<SystemImplementation> definition, GeneratorContext context) {
+        SystemImplementation implementation = definition.getImplementation();
+        // TODO not a safe cast
+        PojoComponentType<JavaMappedService, JavaMappedReference, Property<?>> type = implementation.getComponentType();
+        SystemPhysicalComponentDefinition pDefinition = new SystemPhysicalComponentDefinition();
+        pDefinition.setComponentId(definition.getUri());
+        pDefinition.setScope(type.getImplementationScope());
+        // TODO get classloader id
+        ReflectiveIFProviderDefinition provider = new ReflectiveIFProviderDefinition();
+        Method destroyMethod = type.getDestroyMethod();
+        if (destroyMethod != null) {
+            provider.setDestroyMethod(destroyMethod.toString());
+        }
+        Method initMethod = type.getInitMethod();
+        if (initMethod != null) {
+            provider.setInitMethod(initMethod.toString());
+        }
+        provider.setImplementationClass(implementation.getImplementationClass().getName());
+        // TODO ctor arguments
+        // TODO set CDI source for ref, props, and callbacks
+        Map<String, JavaMappedReference> references = type.getReferences();
+        for (Map.Entry<String, JavaMappedReference> entry : references.entrySet()) {
+            JavaMappedReference reference = entry.getValue();
+            Member member = reference.getMember();
+            InjectionSource source = new InjectionSource();
+            source.setName(entry.getKey());
+            source.setValueType(InjectionSource.ValueSourceType.REFERENCE);
+            MemberSite memberSite = new MemberSite();
+            memberSite.setName(member.getName());
+            if (member instanceof Method) {
+                memberSite.setElementType(ElementType.METHOD);
+            } else if (member instanceof Field) {
+                memberSite.setElementType(ElementType.FIELD);
+            } else {
+                throw new AssertionError("Illegal injection type");
+            }
+
+            InjectionSiteMapping mapping = new InjectionSiteMapping();
+            mapping.setSource(source);
+            mapping.setSite(memberSite);
+            provider.addInjectionSite(mapping);
+        }
+
+        pDefinition.setInstanceFactoryProviderDefinition(provider);
+        context.getPhysicalChangeSet().addComponentDefinition(pDefinition);
+    }
+
+    public PhysicalWireSourceDefinition generateWireSource(ComponentDefinition<SystemImplementation> definition,
+                                                           ReferenceDefinition serviceDefinition,
+                                                           GeneratorContext context)
+        throws GenerationException {
+        JavaPhysicalWireSourceDefinition wireDefinition = new JavaPhysicalWireSourceDefinition();
+        wireDefinition.setUri(definition.getUri());
+        return wireDefinition;
+    }
+
+    public PhysicalWireTargetDefinition generateWireTarget(ComponentDefinition<SystemImplementation> definition,
+                                                           ServiceDefinition serviceDefinition,
+                                                           GeneratorContext context)
+        throws GenerationException {
+        JavaPhysicalWireTargetDefinition wireDefinition = new JavaPhysicalWireTargetDefinition();
+        wireDefinition.setUri(definition.getUri());
+        return wireDefinition;
+    }
+
+}

Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/generator/SystemPhysicalComponentGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/system/generator/SystemPhysicalComponentGenerator.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/model/physical/java/JavaPhysicalComponentDefinition.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/model/physical/java/JavaPhysicalComponentDefinition.java?view=diff&rev=520196&r1=520195&r2=520196
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/model/physical/java/JavaPhysicalComponentDefinition.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/model/physical/java/JavaPhysicalComponentDefinition.java Mon Mar 19 17:39:40 2007
@@ -18,10 +18,6 @@
  */
 package org.apache.tuscany.core.model.physical.java;
 
-import java.net.URI;
-
-import org.apache.tuscany.core.component.InstanceFactoryProvider;
-import org.apache.tuscany.spi.model.physical.PhysicalComponentDefinition;
 import org.apache.tuscany.spi.model.physical.POJOComponentDefinition;
 
 /**

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/AutowireResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/AutowireResolver.java?view=diff&rev=520196&r1=520195&r2=520196
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/AutowireResolver.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/AutowireResolver.java Mon Mar 19 17:39:40 2007
@@ -45,10 +45,20 @@
                  ComponentDefinition<? extends Implementation<?>> definition) throws ResolutionException;
 
     /**
+     * Resolves autowires for a composite component type and its decendents
+     *
+     * @param compositeType the component type to resolve autowires for
+     * @throws ResolutionException
+     */
+    @SuppressWarnings({"unchecked"})
+    public void resolve(CompositeComponentType<?, ?, ?> compositeType) throws ResolutionException;
+
+    /**
      * Adds the uri of a host system service that can be an autowire target
      *
      * @param contract the service contract of the system service
      * @param uri      the component uri
      */
     void addHostUri(ServiceContract contract, URI uri);
+
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/DefaultAutowireResolver.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/DefaultAutowireResolver.java?view=diff&rev=520196&r1=520195&r2=520196
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/DefaultAutowireResolver.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/resolver/DefaultAutowireResolver.java Mon Mar 19 17:39:40 2007
@@ -90,6 +90,27 @@
         hostAutowire.put(contract, uri);
     }
 
+    public void resolve(CompositeComponentType<?, ?, ?> compositeType) throws ResolutionException {
+        for (ComponentDefinition<? extends Implementation<?>> child : compositeType.getComponents().values()) {
+            Implementation<?> implementation = child.getImplementation();
+            ComponentType<?, ?, ?> childType = implementation.getComponentType();
+            if (childType instanceof CompositeComponentType) {
+                // recurse decendents for composites
+                resolve(null, child);
+            }
+            Map<String, ReferenceTarget> targets = child.getReferenceTargets();
+            for (ReferenceDefinition reference : childType.getReferences().values()) {
+                ReferenceTarget target = targets.get(reference.getUri().getFragment());
+                if (target == null) {
+                    continue;
+                }
+                if (target.isAutowire()) {
+                    ServiceContract requiredContract = reference.getServiceContract();
+                    resolve(compositeType, requiredContract, target, reference.isRequired());
+                }
+            }
+        }
+    }
     /**
      * Performs the actual resolution against a composite TODO this should be extensible allowing for path
      * optimizations

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/deployment/AssemblyServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/deployment/AssemblyServiceImpl.java?view=diff&rev=520196&r1=520195&r2=520196
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/deployment/AssemblyServiceImpl.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/deployment/AssemblyServiceImpl.java Mon Mar 19 17:39:40 2007
@@ -28,7 +28,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamConstants;
@@ -36,12 +35,9 @@
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 
-import org.apache.tuscany.core.deployer.RootDeploymentContext;
-import org.apache.tuscany.core.generator.DefaultGeneratorContext;
-import org.apache.tuscany.core.resolver.AutowireResolver;
-import org.apache.tuscany.host.deployment.AssemblyService;
-import org.apache.tuscany.host.deployment.DeploymentException;
-import org.apache.tuscany.host.deployment.UnsupportedContentTypeException;
+import org.osoa.sca.annotations.EagerInit;
+import org.osoa.sca.annotations.Reference;
+
 import org.apache.tuscany.spi.component.ScopeContainer;
 import org.apache.tuscany.spi.component.ScopeRegistry;
 import org.apache.tuscany.spi.deployer.ChangeSetHandler;
@@ -67,10 +63,16 @@
 import org.apache.tuscany.spi.model.Scope;
 import org.apache.tuscany.spi.model.ServiceDefinition;
 import org.apache.tuscany.spi.model.physical.PhysicalChangeSet;
+import org.apache.tuscany.spi.resolver.ResolutionException;
 import org.apache.tuscany.spi.services.discovery.DiscoveryException;
 import org.apache.tuscany.spi.services.discovery.DiscoveryService;
-import org.osoa.sca.annotations.EagerInit;
-import org.osoa.sca.annotations.Reference;
+
+import org.apache.tuscany.core.deployer.RootDeploymentContext;
+import org.apache.tuscany.core.generator.DefaultGeneratorContext;
+import org.apache.tuscany.core.resolver.AutowireResolver;
+import org.apache.tuscany.host.deployment.AssemblyService;
+import org.apache.tuscany.host.deployment.DeploymentException;
+import org.apache.tuscany.host.deployment.UnsupportedContentTypeException;
 
 /**
  * @version $Rev$ $Date$
@@ -86,7 +88,7 @@
     private final ModelMarshallerRegistry marshallerRegistry;
     private final DiscoveryService discoveryService;
     private ComponentDefinition<CompositeImplementation> domain;
-    
+    private final Map<String, ChangeSetHandler> registry = new HashMap<String, ChangeSetHandler>();
 
     public AssemblyServiceImpl(@Reference LoaderRegistry loaderRegistry,
                                @Reference GeneratorRegistry generatorRegistry,
@@ -104,8 +106,6 @@
         domain = createDomain();
     }
 
-    private final Map<String, ChangeSetHandler> registry = new HashMap<String, ChangeSetHandler>();
-
     public void applyChanges(URL changeSet) throws DeploymentException, IOException {
         if (changeSet == null) {
             throw new IllegalArgumentException("changeSet is null");
@@ -151,7 +151,6 @@
     }
 
     public void include(InputStream stream) throws DeploymentException {
-
         try {
             XMLStreamReader reader = xmlFactory.createXMLStreamReader(stream);
             while (reader.next() != XMLStreamConstants.START_ELEMENT) {
@@ -167,6 +166,11 @@
 
             CompositeComponentType<?, ?, ?> type =
                 (CompositeComponentType<?, ?, ?>) loaderRegistry.load(null, reader, deploymentContext);
+            try {
+                autowireResolver.resolve(type);
+            } catch (ResolutionException e) {
+                throw new DeploymentException(e);
+            }
             Map<URI, GeneratorContext> contexts = new HashMap<URI, GeneratorContext>();
             // TODO create physical resource definitions
             // create physical component definitions
@@ -207,7 +211,13 @@
                                 String serviceName = uri.getFragment();
                                 Implementation<?> targetImplementation = targetComponent.getImplementation();
                                 ComponentType<?, ?, ?> targetType = targetImplementation.getComponentType();
-                                ServiceDefinition serviceDefinition = targetType.getServices().get(serviceName);
+                                ServiceDefinition serviceDefinition = null;
+                                if (serviceName == null) {
+                                    serviceDefinition = targetType.getServices().get(serviceName);
+                                } else if (targetType.getServices().size() == 1) {
+                                    // default service
+                                    serviceDefinition = targetType.getServices().get(0);
+                                }
                                 assert serviceDefinition != null;
                                 generatorRegistry.generateWire(child,
                                     referenceDefinition,
@@ -216,14 +226,12 @@
                             } else {
                                 throw new AssertionError();
                             }
-
-
                         }
                     }
                 } catch (GenerationException e) {
                     throw new DeploymentException(e);
                 }
-                
+
                 marshallAndSend(id, context);
 
             }
@@ -241,18 +249,19 @@
     /*
      * Marshalls and sends the PCS.
      */
-    private void marshallAndSend(URI id, GeneratorContext context) throws XMLStreamException, MarshalException, DiscoveryException {
-        
+    private void marshallAndSend(URI id, GeneratorContext context)
+        throws XMLStreamException, MarshalException, DiscoveryException {
+
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         PhysicalChangeSet pcs = context.getPhysicalChangeSet();
 
         XMLStreamWriter pcsWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(out);
         marshallerRegistry.marshall(pcs, pcsWriter);
-        
+
         ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
         XMLStreamReader pcsReader = XMLInputFactory.newInstance().createXMLStreamReader(in);
         discoveryService.sendMessage(id.toASCIIString(), pcsReader);
-        
+
     }
 
     private void generate(ComponentDefinition<?> component, Map<URI, GeneratorContext> contexts)

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/physical/PhysicalInterceptorDefinition.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/physical/PhysicalInterceptorDefinition.java?view=diff&rev=520196&r1=520195&r2=520196
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/physical/PhysicalInterceptorDefinition.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/model/physical/PhysicalInterceptorDefinition.java Mon Mar 19 17:39:40 2007
@@ -23,15 +23,13 @@
 import org.apache.tuscany.spi.model.ModelObject;
 
 /**
- * Model class representing the portable definition of an interceptor. This class 
- * is used to describe the interceptors around inbound and outbound wires on a 
- * physical component definition.
- * 
- * @version $Rev$ $Date$
+ * Model class representing the portable definition of an interceptor. This class is used to describe the interceptors
+ * around inbound and outbound wires on a physical component definition.
  *
+ * @version $Rev$ $Date$
  */
 public class PhysicalInterceptorDefinition extends ModelObject {
-    
+
     // The qualified name of the interceptor builder
     private QName builder;
 
@@ -41,6 +39,7 @@
 
     /**
      * Gets the qualified name of the builder.
+     *
      * @return Qualified name of the builder.
      */
     public QName getBuilder() {
@@ -49,10 +48,12 @@
 
     /**
      * Sets the qualified name of the builder.
+     *
      * @param builder Qualified name of the builder.
      */
     public void setBuilder(QName builder) {
         this.builder = builder;
     }
+
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org