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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to