You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by an...@apache.org on 2006/09/28 14:14:08 UTC

svn commit: r450828 - in /incubator/tuscany/sandbox/ant/container.easy/src: main/java/org/apache/tuscany/container/easy/ test/java/org/apache/tuscany/container/easy/ test/java/org/apache/tuscany/container/easy/mock/

Author: antelder
Date: Thu Sep 28 05:14:07 2006
New Revision: 450828

URL: http://svn.apache.org/viewvc?view=rev&rev=450828
Log:
Start at getting async to work (copied from the groovy container)

Added:
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/AsyncInvoker.java
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/AsyncMonitor.java
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/AsyncInvokerTestCase.java
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/AsyncTarget.java
Modified:
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java
    incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java
    incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/AsyncInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/AsyncInvoker.java?view=auto&rev=450828
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/AsyncInvoker.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/AsyncInvoker.java Thu Sep 28 05:14:07 2006
@@ -0,0 +1,210 @@
+/*
+ * 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.container.easy;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.tuscany.spi.component.TargetException;
+import org.apache.tuscany.spi.component.WorkContext;
+import org.apache.tuscany.spi.services.work.WorkScheduler;
+import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.InvocationRuntimeException;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.TargetInvoker;
+import org.osoa.sca.CompositeContext;
+import org.osoa.sca.CurrentCompositeContext;
+import org.osoa.sca.SCA;
+import org.osoa.sca.ServiceRuntimeException;
+
+/**
+ * Responsible for performing a non-blocking dispatch on a component implementation instance
+ * 
+ * TODO: Pretty much a direct copy of what the groovy container does for async
+ */
+public class AsyncInvoker extends EasyInvoker {
+
+    private static final ContextBinder BINDER = new ContextBinder();
+    private static final Message RESPONSE = new AsyncInvoker.ImmutableMessage();
+
+    private InboundWire wire;
+    private WorkScheduler workScheduler;
+    private AsyncMonitor monitor;
+    private WorkContext workContext;
+    private Object target;
+    private Object messageId;
+
+    /**
+     * Creates a new invoker
+     *
+     * @param operation     the operation the invoker is associated with
+     * @param wire
+     * @param component     the target component
+     * @param workScheduler the work scheduler to run the invocation
+     * @param monitor       the monitor to pass events to
+     * @param workContext
+     */
+    public AsyncInvoker(String operation,
+                              InboundWire wire,
+                              EasyComponent component,
+                              WorkScheduler workScheduler,
+                              AsyncMonitor monitor,
+                              WorkContext workContext) {
+        super(operation, component);
+        this.wire = wire;
+        this.workScheduler = workScheduler;
+        this.monitor = monitor;
+        this.workContext = workContext;
+    }
+
+    // Override invocation methods to defer invocation to work item
+    // Both methods return null to indicate asynchrony; result will
+    // be conveyed by callback
+    @Override
+    public Object invokeTarget(final Object payload) throws InvocationTargetException {
+        final CompositeContext currentContext = CurrentCompositeContext.getContext();
+        // Schedule the invocation of the next interceptor in a new Work instance
+        try {
+            workScheduler.scheduleWork(new Runnable() {
+                private Object currentMessageId = messageId;
+
+                public void run() {
+                    workContext.setCurrentMessageId(null);
+                    workContext.setCurrentCorrelationId(currentMessageId);
+                    CompositeContext oldContext = CurrentCompositeContext.getContext();
+                    try {
+                        BINDER.setContext(currentContext);
+                        // REVIEW response must be null for one-way and non-null for callback
+                        AsyncInvoker.super.invokeTarget(payload);
+                    } catch (Exception e) {
+                        // REVIEW uncomment when it is available
+                        // monitor.executionError(e);
+                        e.printStackTrace();
+                    } finally {
+                        BINDER.setContext(oldContext);
+                    }
+                }
+            });
+        } catch (Exception e) {
+            throw new ServiceRuntimeException(e);
+        }
+        return RESPONSE;
+    }
+
+    public Message invoke(Message msg) throws InvocationRuntimeException {
+        // can't just call overriden invoke because it would bypass async
+        try {
+            messageId = msg.getMessageId();
+            wire.addMapping(messageId, msg.getFromAddress());
+            return (Message) invokeTarget(msg.getBody());
+        } catch (Throwable e) {
+            // FIXME need to log exceptions
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public AsyncInvoker clone() {
+        AsyncInvoker invoker = (AsyncInvoker) super.clone();
+        invoker.workScheduler = this.workScheduler;
+        invoker.monitor = this.monitor;
+        return invoker;
+    }
+
+    /**
+     * Resolves the target service instance or returns a cached one
+     */
+    protected Object getInstance() throws TargetException {
+        if (!isCacheable()) {
+            return component.getTargetInstance();
+        } else {
+            if (target == null) {
+                target = component.getTargetInstance();
+            }
+            return target;
+        }
+    }
+
+    protected static class ContextBinder extends SCA {
+        public void setContext(CompositeContext context) {
+            setCompositeContext(context);
+        }
+
+        public void start() {
+            throw new AssertionError();
+        }
+
+        public void stop() {
+            throw new AssertionError();
+        }
+    }
+
+    /**
+     * A dummy message passed back on an invocation
+     */
+    protected static class ImmutableMessage implements Message {
+
+        public Object getBody() {
+            return null;
+        }
+
+        public void setBody(Object body) {
+            throw new UnsupportedOperationException();
+        }
+
+        public void setTargetInvoker(TargetInvoker invoker) {
+            throw new UnsupportedOperationException();
+        }
+
+        public TargetInvoker getTargetInvoker() {
+            return null;
+        }
+
+        public Object getFromAddress() {
+            return null;
+        }
+
+        public void setFromAddress(Object fromAddress) {
+            throw new UnsupportedOperationException();
+        }
+
+        public Object getMessageId() {
+            return null;
+        }
+
+        public void setMessageId(Object messageId) {
+            throw new UnsupportedOperationException();
+        }
+
+        public Object getCorrelationId() {
+            return null;
+        }
+
+        public void setCorrelationId(Object correlationId) {
+            throw new UnsupportedOperationException();
+        }
+
+        public boolean isFault() {
+            return false;
+        }
+
+        public void setBodyWithFault(Object fault) {
+            throw new UnsupportedOperationException();
+        }
+    }
+}

Added: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/AsyncMonitor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/AsyncMonitor.java?view=auto&rev=450828
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/AsyncMonitor.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/AsyncMonitor.java Thu Sep 28 05:14:07 2006
@@ -0,0 +1,31 @@
+/*
+ * 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.container.easy;
+
+/**
+ * A monitor used to log events during non-blocking invocations
+ */
+public interface AsyncMonitor {
+
+    /**
+     * Logs an exception thrown during an invocation
+     */
+    void executionError(Exception e);
+
+}

Modified: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java?view=diff&rev=450828&r1=450827&r2=450828
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java (original)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyComponent.java Thu Sep 28 05:14:07 2006
@@ -80,6 +80,10 @@
         return new EasyInvoker(method.getName(), this);
     }
 
+    public TargetInvoker createAsyncTargetInvoker(InboundWire wire, Operation operation) {
+        return new AsyncInvoker(operation.getName(), wire, this, workScheduler, null, workContext);
+    }
+
     // TODO: move all the following up to AtomicComponentExtension?
 
     public List<Class<?>> getServiceInterfaces() {

Modified: incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java?view=diff&rev=450828&r1=450827&r2=450828
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java (original)
+++ incubator/tuscany/sandbox/ant/container.easy/src/main/java/org/apache/tuscany/container/easy/EasyInvoker.java Thu Sep 28 05:14:07 2006
@@ -27,20 +27,20 @@
  */
 public class EasyInvoker extends TargetInvokerExtension {
 
-    private EasyComponent context;
+    protected EasyComponent component;
 
-    private String functionName;
+    protected String functionName;
 
-    public EasyInvoker(String functionName, EasyComponent context) {
+    public EasyInvoker(String functionName, EasyComponent component) {
         this.functionName = functionName;
-        this.context = context;
+        this.component = component;
     }
 
     /**
      * Invoke the function
      */
     public Object invokeTarget(final Object payload) throws InvocationTargetException {
-        EasyInstance target = (EasyInstance) context.getTargetInstance();
+        EasyInstance target = (EasyInstance) component.getTargetInstance();
         try {
 
             return target.invokeTarget(functionName, (Object[]) payload);

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/AsyncInvokerTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/AsyncInvokerTestCase.java?view=auto&rev=450828
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/AsyncInvokerTestCase.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/AsyncInvokerTestCase.java Thu Sep 28 05:14:07 2006
@@ -0,0 +1,206 @@
+/*
+ * 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.container.easy;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.getCurrentArguments;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+
+import java.lang.reflect.Method;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.container.easy.AsyncInvoker.ContextBinder;
+import org.apache.tuscany.container.easy.AsyncInvoker.ImmutableMessage;
+import org.apache.tuscany.container.easy.mock.AsyncTarget;
+import org.apache.tuscany.spi.component.WorkContext;
+import org.apache.tuscany.spi.services.work.WorkScheduler;
+import org.apache.tuscany.spi.wire.InboundWire;
+import org.apache.tuscany.spi.wire.Message;
+import org.apache.tuscany.spi.wire.MessageImpl;
+import org.easymock.IAnswer;
+import org.easymock.classextension.EasyMock;
+
+/**
+ */
+public class AsyncInvokerTestCase extends TestCase {
+    
+    public void testInvoke() throws Exception {
+        EasyInstance instance = createMock(EasyInstance.class);
+        expect(instance.invokeTarget("invoke", null)).andReturn(null).once();
+        replay(instance);
+        EasyComponent component = EasyMock.createMock(EasyComponent.class);
+        expect(component.getTargetInstance()).andReturn(instance);
+        EasyMock.replay(component);
+        AsyncMonitor monitor = createMock(AsyncMonitor.class);
+        replay(monitor);
+
+        WorkScheduler scheduler = createMock(WorkScheduler.class);
+        scheduler.scheduleWork(isA(Runnable.class));
+        expectLastCall().andStubAnswer(new IAnswer() {
+            public Object answer() throws Throwable {
+                Runnable runnable = (Runnable) getCurrentArguments()[0];
+                runnable.run();
+                return null;
+            }
+        });
+        replay(scheduler);
+        WorkContext context = createMock(WorkContext.class);
+        Method method = AsyncTarget.class.getMethod("invoke");
+        method.setAccessible(true);
+        InboundWire wire = createMock(InboundWire.class);
+        AsyncInvoker invoker = new AsyncInvoker("invoke", wire, component, scheduler, monitor, context);
+        Message msg = new MessageImpl();
+        invoker.invoke(msg);
+        verify(instance);
+    }
+    
+    public void testClone() {
+        AsyncInvoker invoker = new AsyncInvoker(null, null, null,null,null,null);
+        assertNotNull(invoker.clone());
+    }
+
+    public void testGetInstance() {
+        EasyComponent component = EasyMock.createMock(EasyComponent.class);
+        expect(component.getTargetInstance()).andReturn("petra");
+        EasyMock.replay(component);
+        AsyncInvoker invoker = new AsyncInvoker(null, null, component,null,null,null);
+        assertEquals("petra", invoker.getInstance());
+    }
+
+    public void testGetInstanceCacheable() {
+        EasyComponent component = EasyMock.createMock(EasyComponent.class);
+        expect(component.getTargetInstance()).andReturn("petra");
+        EasyMock.replay(component);
+        AsyncInvoker invoker = new AsyncInvoker(null, null, component,null,null,null);
+        invoker.setCacheable(true);
+        assertEquals("petra", invoker.getInstance());
+    }
+
+    public void testGetBody() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        assertNull(message.getBody());
+    }
+
+    public void testSetBody() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        try {
+            message.setBody(null);
+            fail();
+        } catch (UnsupportedOperationException e) {
+            // expected
+        }
+    }
+
+    public void testGetTargetInvoker() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        assertNull(message.getTargetInvoker());
+    }
+
+    public void testSetTargetInvoker() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        try {
+            message.setTargetInvoker(null);
+            fail();
+        } catch (UnsupportedOperationException e) {
+            // expected
+        }
+    }
+
+    public void testGetFromAddress() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        assertNull(message.getFromAddress());
+    }
+
+    public void testSetFromAddress() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        try {
+            message.setFromAddress(null);
+            fail();
+        } catch (UnsupportedOperationException e) {
+            // expected
+        }
+    }
+
+    public void testGetMessageId() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        assertNull(message.getMessageId());
+    }
+
+    public void testSetMessageId() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        try {
+            message.setMessageId(null);
+            fail();
+        } catch (UnsupportedOperationException e) {
+            // expected
+        }
+    }
+
+    public void testGetCorrelationId() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        assertNull(message.getCorrelationId());
+    }
+
+    public void testSetCorrelationId() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        try {
+            message.setCorrelationId(null);
+            fail();
+        } catch (UnsupportedOperationException e) {
+            // expected
+        }
+    }
+
+    public void testIsFault() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        assertFalse(message.isFault());
+    }
+
+    public void testSetBodyWithFault() {
+        ImmutableMessage message = new AsyncInvoker.ImmutableMessage();
+        try {
+            message.setBodyWithFault(null);
+            fail();
+        } catch (UnsupportedOperationException e) {
+            // expected
+        }
+    }
+
+    public void testContextBinder() {
+        ContextBinder contextBinder = new AsyncInvoker.ContextBinder();
+        contextBinder.setContext(null);
+        try {
+            contextBinder.start();
+            fail();
+        } catch (AssertionError e) {
+            // expected
+        }
+        try {
+            contextBinder.stop();
+            fail();
+        } catch (AssertionError e) {
+            // expected
+        }
+    }
+}

Modified: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java?view=diff&rev=450828&r1=450827&r2=450828
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java (original)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyComponentTestCase.java Thu Sep 28 05:14:07 2006
@@ -109,6 +109,11 @@
         assertEquals(services, pc.getServiceInterfaces());
     }
 
+    public void testCreateAsyncTargetInvoker() {
+        EasyComponent pc = new EasyComponent(null,null,new ArrayList(), null, scopeContainer, null,null);
+        assertNotNull(pc.createAsyncTargetInvoker(null, new Operation("foo", null,null,null)));
+    }
+    
     @Override
     @SuppressWarnings("unchecked")
     protected void setUp() throws Exception {

Modified: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java?view=diff&rev=450828&r1=450827&r2=450828
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java (original)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/EasyInstanceFactoryTestCase.java Thu Sep 28 05:14:07 2006
@@ -1,6 +1,7 @@
 package org.apache.tuscany.container.easy;
 
 import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -38,6 +39,14 @@
         MockInstanceFactory factory = new MockInstanceFactory("foo", getClass().getClassLoader());
         assertEquals("foo", factory.getResourceName());
         assertEquals(getClass().getClassLoader(), factory.getClassLoader());
+    }
+
+    public void testGetResponseClasses() {
+        MockInstanceFactory factory = new MockInstanceFactory("foo", getClass().getClassLoader());
+        Map<String, Class> classes = factory.getResponseClasses(Arrays.asList( new Class[]{ Runnable.class}));
+        assertEquals(1, classes.size());
+        assertEquals("run", classes.keySet().iterator().next());
+        assertEquals(void.class, classes.get("run"));
     }
 
     protected void setUp() throws Exception {

Added: incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/AsyncTarget.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/AsyncTarget.java?view=auto&rev=450828
==============================================================================
--- incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/AsyncTarget.java (added)
+++ incubator/tuscany/sandbox/ant/container.easy/src/test/java/org/apache/tuscany/container/easy/mock/AsyncTarget.java Thu Sep 28 05:14:07 2006
@@ -0,0 +1,26 @@
+/*
+ * 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.container.easy.mock;
+
+/**
+ */
+public interface AsyncTarget {
+
+    void invoke();
+}



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