You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jb...@apache.org on 2007/03/11 06:09:18 UTC

svn commit: r516854 - in /incubator/tuscany/java/sca/kernel: core/src/main/java/org/apache/tuscany/core/component/ core/src/main/java/org/apache/tuscany/core/component/scope/ core/src/main/java/org/apache/tuscany/core/implementation/ core/src/main/java...

Author: jboynes
Date: Sat Mar 10 21:09:17 2007
New Revision: 516854

URL: http://svn.apache.org/viewvc?view=rev&rev=516854
Log:
remove init and destroy methods from AtomicComponent as they are no longer needed

Modified:
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/SystemSingletonAtomicComponent.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainer.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java
    incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponent.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicCompositeScopeTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerDestroyOnExpirationTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java
    incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentTestCase.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/AtomicComponent.java
    incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.java

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/SystemSingletonAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/SystemSingletonAtomicComponent.java?view=diff&rev=516854&r1=516853&r2=516854
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/SystemSingletonAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/SystemSingletonAtomicComponent.java Sat Mar 10 21:09:17 2007
@@ -25,8 +25,6 @@
 import org.apache.tuscany.spi.ObjectCreationException;
 import org.apache.tuscany.spi.idl.java.JavaServiceContract;
 import org.apache.tuscany.spi.component.AtomicComponent;
-import org.apache.tuscany.spi.component.TargetDestructionException;
-import org.apache.tuscany.spi.component.TargetInitializationException;
 import org.apache.tuscany.spi.component.TargetResolutionException;
 import org.apache.tuscany.spi.component.TargetInvokerCreationException;
 import org.apache.tuscany.spi.component.InstanceWrapper;
@@ -92,14 +90,6 @@
 
     public Object getAssociatedTargetInstance() throws TargetResolutionException {
         return instance;
-    }
-
-    public void init(Object instance) throws TargetInitializationException {
-
-    }
-
-    public void destroy(Object instance) throws TargetDestructionException {
-
     }
 
     public Object createInstance() throws ObjectCreationException {

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainer.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainer.java?view=diff&rev=516854&r1=516853&r2=516854
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainer.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainer.java Sat Mar 10 21:09:17 2007
@@ -22,15 +22,13 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.tuscany.spi.component.AtomicComponent;
+import org.apache.tuscany.spi.component.InstanceWrapper;
 import org.apache.tuscany.spi.component.PersistenceException;
-import org.apache.tuscany.spi.component.SCAObject;
 import org.apache.tuscany.spi.component.ScopeContainer;
 import org.apache.tuscany.spi.component.ScopeContainerMonitor;
 import org.apache.tuscany.spi.component.TargetDestructionException;
-import org.apache.tuscany.spi.component.TargetNotFoundException;
 import org.apache.tuscany.spi.component.TargetResolutionException;
 import org.apache.tuscany.spi.component.WorkContext;
-import org.apache.tuscany.spi.component.InstanceWrapper;
 import org.apache.tuscany.spi.event.Event;
 import org.apache.tuscany.spi.event.RuntimeEventListener;
 import org.apache.tuscany.spi.model.Scope;
@@ -81,62 +79,6 @@
         component.addListener(this);
     }
 
-/*
-    @Override
-    public Object getInstance(AtomicComponent component) throws TargetResolutionException {
-        String conversationId = getConversationId();
-        try {
-            workContext.setCurrentAtomicComponent(component);
-            Object instance = nonDurableStore.readRecord(component, conversationId);
-            if (instance != null) {
-                if (component.getMaxIdleTime() > 0) {
-                    // update expiration
-                    long expire = System.currentTimeMillis() + component.getMaxIdleTime();
-                    nonDurableStore.updateRecord(component, conversationId, instance, expire);
-                }
-            } else {
-                // FIXME should the store really be persisting the wrappers
-                InstanceWrapper wrapper = component.createInstanceWrapper();
-                wrapper.start();
-                instance = wrapper.getInstance();
-                long expire = calculateExpiration(component);
-                nonDurableStore.insertRecord(component, conversationId, instance, expire);
-            }
-            return instance;
-        } catch (StoreReadException e) {
-            throw new TargetResolutionException("Error retrieving target instance", e);
-        } catch (StoreWriteException e) {
-            throw new TargetResolutionException("Error persisting target instance", e);
-        } finally {
-            workContext.setCurrentAtomicComponent(null);
-        }
-    }
-
-    public Object getAssociatedInstance(AtomicComponent component) throws TargetResolutionException {
-        String conversationId = getConversationId();
-        try {
-            workContext.setCurrentAtomicComponent(component);
-            Object instance = nonDurableStore.readRecord(component, conversationId);
-            if (instance != null) {
-                if (component.getMaxIdleTime() > 0) {
-                    // update expiration
-                    long expire = System.currentTimeMillis() + component.getMaxIdleTime();
-                    nonDurableStore.updateRecord(component, conversationId, instance, expire);
-                }
-                return instance;
-            } else {
-                throw new TargetNotFoundException(component.getUri().toString());
-            }
-        } catch (StoreReadException e) {
-            throw new TargetResolutionException("Error retrieving target instance", e);
-        } catch (StoreWriteException e) {
-            throw new TargetResolutionException("Error persisting target instance", e);
-        } finally {
-            workContext.setCurrentAtomicComponent(null);
-        }
-    }
-*/
-
     public void persistNew(AtomicComponent component, String id, Object instance, long expiration)
         throws PersistenceException {
         try {
@@ -233,11 +175,9 @@
         public void onEvent(Event event) {
             if (event instanceof StoreExpirationEvent) {
                 StoreExpirationEvent expiration = (StoreExpirationEvent) event;
-                SCAObject object = expiration.getOwner();
-                assert object instanceof AtomicComponent;
-                AtomicComponent owner = (AtomicComponent) object;
+                InstanceWrapper wrapper = (InstanceWrapper) expiration.getInstance();
                 try {
-                    owner.destroy(expiration.getInstance());
+                    wrapper.stop();
                 } catch (TargetDestructionException e) {
                     monitor.destructionError(e);
                 }

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java?view=diff&rev=516854&r1=516853&r2=516854
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/PojoAtomicComponent.java Sat Mar 10 21:09:17 2007
@@ -35,7 +35,6 @@
 import org.apache.tuscany.spi.ObjectCreationException;
 import org.apache.tuscany.spi.ObjectFactory;
 import org.apache.tuscany.spi.component.TargetDestructionException;
-import org.apache.tuscany.spi.component.TargetInitializationException;
 import org.apache.tuscany.spi.component.TargetResolutionException;
 import org.apache.tuscany.spi.component.InstanceWrapper;
 import org.apache.tuscany.spi.extension.AtomicComponentExtension;
@@ -115,17 +114,6 @@
 
     public boolean isDestroyable() {
         return destroyInvoker != null;
-    }
-
-    public void init(Object instance) throws TargetInitializationException {
-        if (initInvoker != null) {
-            try {
-                initInvoker.invokeEvent(instance);
-            } catch (ObjectCallbackException e) {
-                String uri = getUri().toString();
-                throw new TargetInitializationException("Error initializing component instance", uri, e);
-            }
-        }
     }
 
     public void destroy(Object instance) throws TargetDestructionException {

Modified: incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponent.java?view=diff&rev=516854&r1=516853&r2=516854
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/implementation/java/JavaComponent.java Sat Mar 10 21:09:17 2007
@@ -33,8 +33,6 @@
 import org.apache.tuscany.spi.component.RegistrationException;
 import org.apache.tuscany.spi.component.ScopeContainer;
 import org.apache.tuscany.spi.component.Service;
-import org.apache.tuscany.spi.component.TargetDestructionException;
-import org.apache.tuscany.spi.component.TargetInitializationException;
 import org.apache.tuscany.spi.component.TargetInvokerCreationException;
 import org.apache.tuscany.spi.component.TargetResolutionException;
 import org.apache.tuscany.spi.component.WorkContext;
@@ -231,14 +229,6 @@
 
     public long getMaxAge() {
         return 0;
-    }
-
-    public void init(Object instance) throws TargetInitializationException {
-
-    }
-
-    public void destroy(Object instance) throws TargetDestructionException {
-
     }
 
     public Object createInstance() throws ObjectCreationException {

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicCompositeScopeTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicCompositeScopeTestCase.java?view=diff&rev=516854&r1=516853&r2=516854
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicCompositeScopeTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/BasicCompositeScopeTestCase.java Sat Mar 10 21:09:17 2007
@@ -19,7 +19,6 @@
 package org.apache.tuscany.core.component.scope;
 
 import java.net.URI;
-import java.lang.reflect.Method;
 
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.spi.component.ScopeContainer;

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerDestroyOnExpirationTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerDestroyOnExpirationTestCase.java?view=diff&rev=516854&r1=516853&r2=516854
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerDestroyOnExpirationTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/component/scope/ConversationalScopeContainerDestroyOnExpirationTestCase.java Sat Mar 10 21:09:17 2007
@@ -18,29 +18,26 @@
  */
 package org.apache.tuscany.core.component.scope;
 
+import junit.framework.TestCase;
+import org.easymock.EasyMock;
+import org.easymock.IAnswer;
+
+import org.apache.tuscany.core.component.WorkContextImpl;
 import org.apache.tuscany.spi.component.AtomicComponent;
-import org.apache.tuscany.spi.component.SCAObject;
-import org.apache.tuscany.spi.component.ScopeContainer;
+import org.apache.tuscany.spi.component.InstanceWrapper;
 import org.apache.tuscany.spi.component.WorkContext;
-import org.apache.tuscany.spi.event.Event;
-import org.apache.tuscany.spi.event.EventFilter;
 import org.apache.tuscany.spi.event.RuntimeEventListener;
-import org.apache.tuscany.spi.services.store.RecoveryListener;
 import org.apache.tuscany.spi.services.store.Store;
 import org.apache.tuscany.spi.services.store.StoreExpirationEvent;
-import org.apache.tuscany.spi.services.store.StoreReadException;
-import org.apache.tuscany.spi.services.store.StoreWriteException;
-
-import junit.framework.TestCase;
-import org.apache.tuscany.core.component.WorkContextImpl;
-import org.easymock.EasyMock;
 
 /**
  * @version $Rev$ $Date$
  */
 public class ConversationalScopeContainerDestroyOnExpirationTestCase extends TestCase {
-    private ScopeContainer container;
-    private TestStore store;
+    private Store store;
+    private RuntimeEventListener listener;
+    private WorkContext context;
+    private InstanceWrapper wrapper;
     private AtomicComponent component;
 
     /**
@@ -48,74 +45,28 @@
      * conversational instance expires
      */
     public void testDestroyNotification() throws Exception {
-        store.getListener().onEvent(new StoreExpirationEvent(this, component, new Object()));
-        EasyMock.verify(component);
+        store.addListener(EasyMock.isA(RuntimeEventListener.class));
+        EasyMock.expectLastCall().andStubAnswer(new IAnswer<Object>(){
+            public Object answer() throws Throwable {
+                listener = (RuntimeEventListener) EasyMock.getCurrentArguments()[0];
+                return null;
+            }
+        });
+        wrapper.stop();
+        EasyMock.replay(store);
+        EasyMock.replay(wrapper);
+
+        new ConversationalScopeContainer(store, context, null);
+        listener.onEvent(new StoreExpirationEvent(this, component, wrapper));
+        EasyMock.verify(store);
+        EasyMock.verify(wrapper);
     }
 
     protected void setUp() throws Exception {
         super.setUp();
+        store = EasyMock.createMock(Store.class);
+        wrapper = EasyMock.createMock(InstanceWrapper.class);
         component = EasyMock.createMock(AtomicComponent.class);
-        component.destroy(EasyMock.isA(Object.class));
-        EasyMock.replay(component);
-        store = new TestStore();
-        WorkContext context = new WorkContextImpl();
-        container = new ConversationalScopeContainer(store, context, null);
-        container.start();
-    }
-
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        container.stop();
-    }
-
-    private class TestStore implements Store {
-        private RuntimeEventListener listener;
-
-        public RuntimeEventListener getListener() {
-            return listener;
-        }
-
-        public void insertRecord(SCAObject owner, String id, Object object, long expiration)
-            throws StoreWriteException {
-
-        }
-
-        public void updateRecord(SCAObject owner, String id, Object object, long expiration)
-            throws StoreWriteException {
-
-        }
-
-        public Object readRecord(SCAObject owner, String id) throws StoreReadException {
-            return null;
-        }
-
-        public void removeRecord(SCAObject owner, String id) throws StoreWriteException {
-
-        }
-
-        public void removeRecords() throws StoreWriteException {
-
-        }
-
-        public void recover(RecoveryListener listener) throws StoreReadException {
-
-        }
-
-        public void publish(Event object) {
-
-        }
-
-        public void addListener(RuntimeEventListener listener) {
-            this.listener = listener;
-        }
-
-        public void addListener(EventFilter filter, RuntimeEventListener listener) {
-
-        }
-
-        public void removeListener(RuntimeEventListener listener) {
-
-        }
+        context = new WorkContextImpl();
     }
-
 }

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java?view=diff&rev=516854&r1=516853&r2=516854
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/PojoAtomicComponentTestCase.java Sat Mar 10 21:09:17 2007
@@ -42,18 +42,6 @@
     private PojoConfiguration config;
 
     @SuppressWarnings({"unchecked"})
-    public void testDestroy() throws Exception {
-        EventInvoker<Object> invoker = EasyMock.createMock(EventInvoker.class);
-        invoker.invokeEvent(EasyMock.notNull());
-        EasyMock.replay(invoker);
-        config.setDestroyInvoker(invoker);
-        AtomicComponent component = new TestAtomicComponent(config);
-        assertTrue(component.isDestroyable());
-        component.destroy(new Object());
-        EasyMock.verify(invoker);
-    }
-
-    @SuppressWarnings({"unchecked"})
     public void testNoCallbackWires() throws Exception {
         ScopeContainer container = EasyMock.createMock(ScopeContainer.class);
         EasyMock.expect(container.getScope()).andReturn(Scope.CONVERSATION);
@@ -64,17 +52,6 @@
         component.setScopeContainer(container);
         component.start();
         EasyMock.verify(container);
-    }
-
-    @SuppressWarnings({"unchecked"})
-    public void testInit() throws Exception {
-        EventInvoker<Object> invoker = EasyMock.createMock(EventInvoker.class);
-        invoker.invokeEvent(EasyMock.notNull());
-        EasyMock.replay(invoker);
-        config.setInitInvoker(invoker);
-        AtomicComponent component = new TestAtomicComponent(config);
-        component.init(new Object());
-        EasyMock.verify(invoker);
     }
 
     public void testOptimizable() throws Exception {

Modified: incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentTestCase.java?view=diff&rev=516854&r1=516853&r2=516854
==============================================================================
--- incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentTestCase.java (original)
+++ incubator/tuscany/java/sca/kernel/core/src/test/java/org/apache/tuscany/core/implementation/system/component/SystemAtomicComponentTestCase.java Sat Mar 10 21:09:17 2007
@@ -40,18 +40,6 @@
     private EventInvoker<Object> initInvoker;
     private EventInvoker<Object> destroyInvoker;
 
-    public void testDefaultCreationAndInit() throws Exception {
-        PojoObjectFactory<Foo> factory = new PojoObjectFactory<Foo>(Foo.class.getConstructor((Class[]) null));
-        PojoConfiguration configuration = new PojoConfiguration();
-        configuration.setInstanceFactory(factory);
-        configuration.setInitInvoker(initInvoker);
-        configuration.setName(new URI("foo"));
-        SystemAtomicComponentImpl component = new SystemAtomicComponentImpl(configuration);
-        Foo foo = (Foo) component.createInstance();
-        component.init(foo);
-        assertTrue(foo.initialized);
-    }
-
     public void testDestroy() throws Exception {
         PojoObjectFactory<Foo> factory = new PojoObjectFactory<Foo>(Foo.class.getConstructor((Class[]) null));
         PojoConfiguration configuration = new PojoConfiguration();

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/AtomicComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/AtomicComponent.java?view=diff&rev=516854&r1=516853&r2=516854
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/AtomicComponent.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/component/AtomicComponent.java Sat Mar 10 21:09:17 2007
@@ -64,22 +64,6 @@
     long getMaxAge();
 
     /**
-     * Notifies the given instance of an initialization event.
-     *
-     * @throws TargetInitializationException
-     */
-    @Deprecated
-    void init(Object instance) throws TargetInitializationException;
-
-    /**
-     * Notifies the given instance of a destroy event.
-     *
-     * @throws TargetDestructionException
-     */
-    @Deprecated
-    void destroy(Object instance) throws TargetDestructionException;
-
-    /**
      * Creates a new implementation instance, generally used as a callback by a {@link
      * org.apache.tuscany.spi.component.ScopeContainer}.
      *

Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.java?view=diff&rev=516854&r1=516853&r2=516854
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/extension/AtomicComponentExtension.java Sat Mar 10 21:09:17 2007
@@ -24,8 +24,6 @@
 import org.apache.tuscany.spi.component.AtomicComponent;
 import org.apache.tuscany.spi.component.ComponentException;
 import org.apache.tuscany.spi.component.ScopeContainer;
-import org.apache.tuscany.spi.component.TargetDestructionException;
-import org.apache.tuscany.spi.component.TargetInitializationException;
 import org.apache.tuscany.spi.component.WorkContext;
 import org.apache.tuscany.spi.model.Scope;
 import org.apache.tuscany.spi.wire.ProxyService;
@@ -95,14 +93,6 @@
     public void start() throws CoreRuntimeException {
         super.start();
         scopeContainer.register(this);
-    }
-
-    public void init(Object instance) throws TargetInitializationException {
-
-    }
-
-    public void destroy(Object instance) throws TargetDestructionException {
-
     }
 
     public void removeInstance() throws ComponentException {



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