You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by jc...@apache.org on 2013/07/30 04:08:40 UTC

svn commit: r1508275 - in /commons/proper/proxy/branches/version-2.0-work: core/src/main/java/org/apache/commons/proxy2/interceptor/ core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ core/src/main/java/org/apache/commons/proxy2/intercep...

Author: jcarman
Date: Tue Jul 30 02:08:40 2013
New Revision: 1508275

URL: http://svn.apache.org/r1508275
Log:
Implementing new StubInterceptorBuilder functionality.

Added:
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ArgumentMatcher.java
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/InvocationMatcher.java
      - copied, changed from r1508076, commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/InvocationMatcher.java
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/argument/
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/argument/ArgumentMatcherUtils.java
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/MethodNameMatcher.java
      - copied, changed from r1508076, commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/MethodNameMatcher.java
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/ReturnTypeMatcher.java
      - copied, changed from r1508076, commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ReturnTypeMatcher.java
    commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/Behavior.java
    commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/StubInterceptorBuilder.java
    commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/TrainingContext.java
    commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/StubInterface.java
    commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/TestStubInterceptorBuilder.java
Removed:
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/InvocationMatcher.java
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/MethodNameMatcher.java
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ReturnTypeMatcher.java
Modified:
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/InterceptorUtils.java
    commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/SwitchInterceptor.java
    commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/TestSwitchInterceptor.java
    commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/matcher/TestMethodNameMatcher.java
    commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/matcher/TestReturnTypeMatcher.java

Modified: commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/InterceptorUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/InterceptorUtils.java?rev=1508275&r1=1508274&r2=1508275&view=diff
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/InterceptorUtils.java (original)
+++ commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/InterceptorUtils.java Tue Jul 30 02:08:40 2013
@@ -18,6 +18,7 @@
 package org.apache.commons.proxy2.interceptor;
 
 import org.apache.commons.proxy2.Interceptor;
+import org.apache.commons.proxy2.ObjectProvider;
 import org.apache.commons.proxy2.provider.ObjectProviderUtils;
 
 public final class InterceptorUtils
@@ -31,6 +32,11 @@ public final class InterceptorUtils
         return new ObjectProviderInterceptor(ObjectProviderUtils.constant(value));
     }
 
+    public static Interceptor provider(ObjectProvider<?> provider)
+    {
+        return new ObjectProviderInterceptor(provider);
+    }
+
 //----------------------------------------------------------------------------------------------------------------------
 // Constructors
 //----------------------------------------------------------------------------------------------------------------------

Modified: commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/SwitchInterceptor.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/SwitchInterceptor.java?rev=1508275&r1=1508274&r2=1508275&view=diff
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/SwitchInterceptor.java (original)
+++ commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/SwitchInterceptor.java Tue Jul 30 02:08:40 2013
@@ -21,13 +21,14 @@ import org.apache.commons.lang3.tuple.Im
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.proxy2.Interceptor;
 import org.apache.commons.proxy2.Invocation;
+import org.apache.commons.proxy2.interceptor.matcher.InvocationMatcher;
 
 import java.io.Serializable;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
- * A {@link SwitchInterceptor} maintains a list of {@link InvocationMatcher}/{@link Interceptor} pairs.  Each
+ * A {@link SwitchInterceptor} maintains a list of {@link org.apache.commons.proxy2.interceptor.matcher.InvocationMatcher}/{@link Interceptor} pairs.  Each
  * invocation will be checked against the registered InvocationMatchers.  If one matches the current invocation, then
  * the corresponding Interceptor will be called.  If no InvocationMatchers match, then the invocation will merely
  * {@link org.apache.commons.proxy2.Invocation#proceed()} method is called.

Added: commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ArgumentMatcher.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ArgumentMatcher.java?rev=1508275&view=auto
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ArgumentMatcher.java (added)
+++ commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ArgumentMatcher.java Tue Jul 30 02:08:40 2013
@@ -0,0 +1,27 @@
+/*
+ * 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.commons.proxy2.interceptor.matcher;
+
+public interface ArgumentMatcher
+{
+//----------------------------------------------------------------------------------------------------------------------
+// Other Methods
+//----------------------------------------------------------------------------------------------------------------------
+
+    boolean matches(Object argument);
+}

Copied: commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/InvocationMatcher.java (from r1508076, commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/InvocationMatcher.java)
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/InvocationMatcher.java?p2=commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/InvocationMatcher.java&p1=commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/InvocationMatcher.java&r1=1508076&r2=1508275&rev=1508275&view=diff
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/InvocationMatcher.java (original)
+++ commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/InvocationMatcher.java Tue Jul 30 02:08:40 2013
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.commons.proxy2.interceptor;
+package org.apache.commons.proxy2.interceptor.matcher;
 
 import org.apache.commons.proxy2.Invocation;
 

Added: commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/argument/ArgumentMatcherUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/argument/ArgumentMatcherUtils.java?rev=1508275&view=auto
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/argument/ArgumentMatcherUtils.java (added)
+++ commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/argument/ArgumentMatcherUtils.java Tue Jul 30 02:08:40 2013
@@ -0,0 +1,47 @@
+package org.apache.commons.proxy2.interceptor.matcher.argument;
+
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.proxy2.interceptor.matcher.ArgumentMatcher;
+
+public class ArgumentMatcherUtils
+{
+//----------------------------------------------------------------------------------------------------------------------
+// Static Methods
+//----------------------------------------------------------------------------------------------------------------------
+
+    public static ArgumentMatcher any()
+    {
+        return new ArgumentMatcher()
+        {
+            @Override
+            public boolean matches(Object argument)
+            {
+                return true;
+            }
+        };
+    }
+
+    public static ArgumentMatcher eq(final Object value)
+    {
+        return new ArgumentMatcher()
+        {
+            @Override
+            public boolean matches(Object argument)
+            {
+                return ObjectUtils.equals(argument, value);
+            }
+        };
+    }
+
+    public static ArgumentMatcher isInstance(final Class<?> type)
+    {
+        return new ArgumentMatcher()
+        {
+            @Override
+            public boolean matches(Object argument)
+            {
+                return type.isInstance(argument);
+            }
+        };
+    }
+}

Copied: commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/MethodNameMatcher.java (from r1508076, commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/MethodNameMatcher.java)
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/MethodNameMatcher.java?p2=commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/MethodNameMatcher.java&p1=commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/MethodNameMatcher.java&r1=1508076&r2=1508275&rev=1508275&view=diff
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/MethodNameMatcher.java (original)
+++ commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/MethodNameMatcher.java Tue Jul 30 02:08:40 2013
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.commons.proxy2.interceptor.matcher;
+package org.apache.commons.proxy2.interceptor.matcher.invocation;
 
 import org.apache.commons.proxy2.Invocation;
-import org.apache.commons.proxy2.interceptor.InvocationMatcher;
+import org.apache.commons.proxy2.interceptor.matcher.InvocationMatcher;
 
 /**
  * A {@link MethodNameMatcher} simply checks to see that the method name of the invocation matches the target method

Copied: commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/ReturnTypeMatcher.java (from r1508076, commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ReturnTypeMatcher.java)
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/ReturnTypeMatcher.java?p2=commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/ReturnTypeMatcher.java&p1=commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ReturnTypeMatcher.java&r1=1508076&r2=1508275&rev=1508275&view=diff
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/ReturnTypeMatcher.java (original)
+++ commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/interceptor/matcher/invocation/ReturnTypeMatcher.java Tue Jul 30 02:08:40 2013
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.commons.proxy2.interceptor.matcher;
+package org.apache.commons.proxy2.interceptor.matcher.invocation;
 
 import org.apache.commons.proxy2.Invocation;
-import org.apache.commons.proxy2.interceptor.InvocationMatcher;
+import org.apache.commons.proxy2.interceptor.matcher.InvocationMatcher;
 
 public class ReturnTypeMatcher implements InvocationMatcher
 {

Modified: commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/TestSwitchInterceptor.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/TestSwitchInterceptor.java?rev=1508275&r1=1508274&r2=1508275&view=diff
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/TestSwitchInterceptor.java (original)
+++ commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/TestSwitchInterceptor.java Tue Jul 30 02:08:40 2013
@@ -18,7 +18,7 @@
 package org.apache.commons.proxy2.interceptor;
 
 import org.apache.commons.proxy2.Invocation;
-import org.apache.commons.proxy2.interceptor.matcher.MethodNameMatcher;
+import org.apache.commons.proxy2.interceptor.matcher.invocation.MethodNameMatcher;
 import org.apache.commons.proxy2.util.AbstractTestCase;
 import org.apache.commons.proxy2.util.Echo;
 import org.apache.commons.proxy2.util.MockInvocation;

Modified: commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/matcher/TestMethodNameMatcher.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/matcher/TestMethodNameMatcher.java?rev=1508275&r1=1508274&r2=1508275&view=diff
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/matcher/TestMethodNameMatcher.java (original)
+++ commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/matcher/TestMethodNameMatcher.java Tue Jul 30 02:08:40 2013
@@ -17,6 +17,7 @@
 
 package org.apache.commons.proxy2.interceptor.matcher;
 
+import org.apache.commons.proxy2.interceptor.matcher.invocation.MethodNameMatcher;
 import org.apache.commons.proxy2.util.AbstractTestCase;
 import org.apache.commons.proxy2.util.Echo;
 import org.apache.commons.proxy2.util.MockInvocation;

Modified: commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/matcher/TestReturnTypeMatcher.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/matcher/TestReturnTypeMatcher.java?rev=1508275&r1=1508274&r2=1508275&view=diff
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/matcher/TestReturnTypeMatcher.java (original)
+++ commons/proper/proxy/branches/version-2.0-work/core/src/test/java/org/apache/commons/proxy2/interceptor/matcher/TestReturnTypeMatcher.java Tue Jul 30 02:08:40 2013
@@ -18,7 +18,7 @@
 package org.apache.commons.proxy2.interceptor.matcher;
 
 import org.apache.commons.proxy2.Invocation;
-import org.apache.commons.proxy2.interceptor.InvocationMatcher;
+import org.apache.commons.proxy2.interceptor.matcher.invocation.ReturnTypeMatcher;
 import org.apache.commons.proxy2.util.AbstractTestCase;
 import org.apache.commons.proxy2.util.Echo;
 import org.apache.commons.proxy2.util.MockInvocation;

Added: commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/Behavior.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/Behavior.java?rev=1508275&view=auto
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/Behavior.java (added)
+++ commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/Behavior.java Tue Jul 30 02:08:40 2013
@@ -0,0 +1,95 @@
+/*
+ * 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.commons.proxy2.stub;
+
+import org.apache.commons.proxy2.ObjectProvider;
+import org.apache.commons.proxy2.interceptor.InterceptorUtils;
+import org.apache.commons.proxy2.interceptor.matcher.ArgumentMatcher;
+import org.apache.commons.proxy2.interceptor.matcher.argument.ArgumentMatcherUtils;
+
+public abstract class Behavior<T>
+{
+//----------------------------------------------------------------------------------------------------------------------
+// Fields
+//----------------------------------------------------------------------------------------------------------------------
+
+    private TrainingContext trainingContext;
+
+//----------------------------------------------------------------------------------------------------------------------
+// Abstract Methods
+//----------------------------------------------------------------------------------------------------------------------
+
+    protected abstract void train(T stub);
+
+//----------------------------------------------------------------------------------------------------------------------
+// Other Methods
+//----------------------------------------------------------------------------------------------------------------------
+
+    protected <R> R any()
+    {
+        recordArgumentMatcher(ArgumentMatcherUtils.any());
+        return null;
+    }
+
+    private void recordArgumentMatcher(ArgumentMatcher matcher)
+    {
+        trainingContext.addArgumentMatcher(matcher);
+    }
+
+    protected <R> R eq(R value)
+    {
+        recordArgumentMatcher(ArgumentMatcherUtils.eq(value));
+        return null;
+    }
+
+    protected <R> R isInstance(Class<R> type)
+    {
+        recordArgumentMatcher(ArgumentMatcherUtils.isInstance(type));
+        return null;
+    }
+
+    void train(TrainingContext context, T stub)
+    {
+        this.trainingContext = context;
+        train(stub);
+    }
+
+    protected <R> When<R> when(R expression)
+    {
+        return new When();
+    }
+
+//----------------------------------------------------------------------------------------------------------------------
+// Inner Classes
+//----------------------------------------------------------------------------------------------------------------------
+
+    protected class When<R>
+    {
+        protected Behavior<T> thenReturn(R value)
+        {
+            trainingContext.setInterceptor(InterceptorUtils.constant(value));
+            return Behavior.this;
+        }
+
+        protected Behavior<T> thenReturn(ObjectProvider<R> provider)
+        {
+            trainingContext.setInterceptor(InterceptorUtils.provider(provider));
+            return Behavior.this;
+        }
+    }
+}

Added: commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/StubInterceptorBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/StubInterceptorBuilder.java?rev=1508275&view=auto
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/StubInterceptorBuilder.java (added)
+++ commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/StubInterceptorBuilder.java Tue Jul 30 02:08:40 2013
@@ -0,0 +1,83 @@
+/*
+ * 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.commons.proxy2.stub;
+
+import org.apache.commons.proxy2.Interceptor;
+import org.apache.commons.proxy2.Invoker;
+import org.apache.commons.proxy2.ProxyFactory;
+import org.apache.commons.proxy2.ProxyUtils;
+import org.apache.commons.proxy2.interceptor.SwitchInterceptor;
+
+import java.lang.reflect.Method;
+
+public class StubInterceptorBuilder
+{
+//----------------------------------------------------------------------------------------------------------------------
+// Fields
+//----------------------------------------------------------------------------------------------------------------------
+
+    private final ProxyFactory proxyFactory;
+    private final SwitchInterceptor interceptor = new SwitchInterceptor();
+
+//----------------------------------------------------------------------------------------------------------------------
+// Constructors
+//----------------------------------------------------------------------------------------------------------------------
+
+    public StubInterceptorBuilder(ProxyFactory proxyFactory)
+    {
+        this.proxyFactory = proxyFactory;
+    }
+
+//----------------------------------------------------------------------------------------------------------------------
+// Other Methods
+//----------------------------------------------------------------------------------------------------------------------
+
+    public Interceptor build()
+    {
+        return interceptor;
+    }
+
+    public <T> StubInterceptorBuilder configure(Class<T> type, Behavior<T> behavior)
+    {
+        final TrainingContext context = new TrainingContext(interceptor);
+        T stub = proxyFactory.createInvokerProxy(new TrainingContextInvoker(context), type);
+        behavior.train(context, stub);
+        return this;
+    }
+
+//----------------------------------------------------------------------------------------------------------------------
+// Inner Classes
+//----------------------------------------------------------------------------------------------------------------------
+
+    private static class TrainingContextInvoker implements Invoker
+    {
+        private final TrainingContext trainingContext;
+
+        private TrainingContextInvoker(TrainingContext trainingContext)
+        {
+            this.trainingContext = trainingContext;
+        }
+
+        @Override
+        public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable
+        {
+            trainingContext.stubMethodInvoked(method, arguments);
+            return ProxyUtils.nullValue(method.getReturnType());
+        }
+    }
+}

Added: commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/TrainingContext.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/TrainingContext.java?rev=1508275&view=auto
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/TrainingContext.java (added)
+++ commons/proper/proxy/branches/version-2.0-work/stub/src/main/java/org/apache/commons/proxy2/stub/TrainingContext.java Tue Jul 30 02:08:40 2013
@@ -0,0 +1,151 @@
+/*
+ * 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.commons.proxy2.stub;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.proxy2.Interceptor;
+import org.apache.commons.proxy2.Invocation;
+import org.apache.commons.proxy2.interceptor.SwitchInterceptor;
+import org.apache.commons.proxy2.interceptor.matcher.ArgumentMatcher;
+import org.apache.commons.proxy2.interceptor.matcher.InvocationMatcher;
+import org.apache.commons.proxy2.invoker.RecordedInvocation;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+public class TrainingContext
+{
+//----------------------------------------------------------------------------------------------------------------------
+// Fields
+//----------------------------------------------------------------------------------------------------------------------
+
+    private List<ArgumentMatcher> argumentMatchers = new LinkedList<ArgumentMatcher>();
+    private InvocationMatcher matcher;
+    private Interceptor interceptor;
+    private final SwitchInterceptor switchInterceptor;
+
+//----------------------------------------------------------------------------------------------------------------------
+// Constructors
+//----------------------------------------------------------------------------------------------------------------------
+
+    public TrainingContext(SwitchInterceptor switchInterceptor)
+    {
+        this.switchInterceptor = switchInterceptor;
+    }
+
+//----------------------------------------------------------------------------------------------------------------------
+// Other Methods
+//----------------------------------------------------------------------------------------------------------------------
+
+    public void addArgumentMatcher(ArgumentMatcher argumentMatcher)
+    {
+        argumentMatchers.add(argumentMatcher);
+    }
+
+    public void setInterceptor(Interceptor interceptor)
+    {
+        this.interceptor = interceptor;
+        addCase();
+    }
+
+    private void addCase()
+    {
+        if (matcher != null && interceptor != null)
+        {
+            switchInterceptor.when(matcher).then(interceptor);
+            matcher = null;
+            interceptor = null;
+            argumentMatchers.clear();
+        }
+    }
+
+    public void stubMethodInvoked(Method method, Object[] arguments)
+    {
+        final ArgumentMatcher[] matchersArray = argumentMatchers.toArray(new ArgumentMatcher[argumentMatchers.size()]);
+        argumentMatchers.clear();
+        final RecordedInvocation invocation = new RecordedInvocation(method, arguments);
+        if (ArrayUtils.isEmpty(matchersArray))
+        {
+            this.matcher = new ExactArgumentsMatcher(invocation);
+        }
+        else if (matchersArray.length == arguments.length)
+        {
+            this.matcher = new ArgumentMatchersMatcher(invocation, matchersArray);
+        }
+        else
+        {
+            throw new IllegalStateException("Either use exact arguments or argument matchers, but not both.");
+        }
+        addCase();
+    }
+
+//----------------------------------------------------------------------------------------------------------------------
+// Inner Classes
+//----------------------------------------------------------------------------------------------------------------------
+
+    private static class ArgumentMatchersMatcher implements InvocationMatcher
+    {
+        private final RecordedInvocation recordedInvocation;
+        private final ArgumentMatcher[] matchers;
+
+        private ArgumentMatchersMatcher(RecordedInvocation recordedInvocation, ArgumentMatcher[] matchers)
+        {
+            this.recordedInvocation = recordedInvocation;
+            this.matchers = matchers;
+        }
+
+        @Override
+        public boolean matches(Invocation invocation)
+        {
+            return invocation.getMethod().equals(recordedInvocation.getInvokedMethod()) &&
+                    allArgumentsMatch(invocation.getArguments());
+        }
+
+        private boolean allArgumentsMatch(Object[] arguments)
+        {
+            for (int i = 0; i < arguments.length; i++)
+            {
+                Object argument = arguments[i];
+                if (!matchers[i].matches(argument))
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
+    private static class ExactArgumentsMatcher implements InvocationMatcher
+    {
+        private final RecordedInvocation recordedInvocation;
+
+        private ExactArgumentsMatcher(RecordedInvocation recordedInvocation)
+        {
+            this.recordedInvocation = recordedInvocation;
+        }
+
+        @Override
+        public boolean matches(Invocation invocation)
+        {
+            return invocation.getMethod().equals(recordedInvocation.getInvokedMethod()) &&
+                    Arrays.equals(invocation.getArguments(), recordedInvocation.getArguments());
+        }
+    }
+}

Added: commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/StubInterface.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/StubInterface.java?rev=1508275&view=auto
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/StubInterface.java (added)
+++ commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/StubInterface.java Tue Jul 30 02:08:40 2013
@@ -0,0 +1,29 @@
+/*
+ * 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.commons.proxy2.stub;
+
+public interface StubInterface
+{
+//----------------------------------------------------------------------------------------------------------------------
+// Other Methods
+//----------------------------------------------------------------------------------------------------------------------
+
+    public String one(String value);
+    public String three(String arg1, String arg2);
+    public String two(String value);
+}

Added: commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/TestStubInterceptorBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/TestStubInterceptorBuilder.java?rev=1508275&view=auto
==============================================================================
--- commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/TestStubInterceptorBuilder.java (added)
+++ commons/proper/proxy/branches/version-2.0-work/stub/src/test/java/org/apache/commons/proxy2/stub/TestStubInterceptorBuilder.java Tue Jul 30 02:08:40 2013
@@ -0,0 +1,136 @@
+/*
+ * 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.commons.proxy2.stub;
+
+import org.apache.commons.proxy2.Interceptor;
+import org.apache.commons.proxy2.ProxyFactory;
+import org.apache.commons.proxy2.cglib.CglibProxyFactory;
+import org.apache.commons.proxy2.invoker.NullInvoker;
+import org.apache.commons.proxy2.provider.ObjectProviderUtils;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestStubInterceptorBuilder
+{
+//----------------------------------------------------------------------------------------------------------------------
+// Fields
+//----------------------------------------------------------------------------------------------------------------------
+
+    private ProxyFactory proxyFactory;
+    private StubInterface target;
+
+//----------------------------------------------------------------------------------------------------------------------
+// Other Methods
+//----------------------------------------------------------------------------------------------------------------------
+
+    @Before
+    public void setUp()
+    {
+        this.proxyFactory = new CglibProxyFactory();
+        this.target = proxyFactory.createInvokerProxy(NullInvoker.INSTANCE, StubInterface.class);
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void testMixingArgumentMatchingStrategies()
+    {
+        StubInterceptorBuilder builder = new StubInterceptorBuilder(proxyFactory);
+        builder.configure(StubInterface.class, new Behavior<StubInterface>()
+        {
+            @Override
+            protected void train(StubInterface stub)
+            {
+                when(stub.three(isInstance(String.class), "World")).thenReturn(ObjectProviderUtils.constant("World"));
+            }
+        });
+    }
+
+    @Test
+    public void testWithArgumentMatchers()
+    {
+        StubInterceptorBuilder builder = new StubInterceptorBuilder(proxyFactory);
+        Interceptor interceptor = builder.configure(StubInterface.class, new Behavior<StubInterface>()
+        {
+            @Override
+            protected void train(StubInterface stub)
+            {
+                when(stub.one(isInstance(String.class))).thenReturn(ObjectProviderUtils.constant("World"));
+            }
+        }).build();
+
+        final StubInterface proxy = proxyFactory.createInterceptorProxy(target, interceptor, StubInterface.class);
+        assertEquals("World", proxy.one("Hello"));
+        assertEquals("World", proxy.one("Whatever"));
+    }
+
+    @Test
+    public void testWithMismatchedArgument()
+    {
+        StubInterceptorBuilder builder = new StubInterceptorBuilder(proxyFactory);
+        Interceptor interceptor = builder.configure(StubInterface.class, new Behavior<StubInterface>()
+        {
+            @Override
+            protected void train(StubInterface stub)
+            {
+                when(stub.one(eq("Hello"))).thenReturn("World");
+            }
+        }).build();
+        final StubInterface proxy = proxyFactory.createInterceptorProxy(target, interceptor, StubInterface.class);
+        assertEquals("World", proxy.one("Hello"));
+        assertEquals(null, proxy.one("Whatever"));
+    }
+
+    @Test
+    public void testWithMultipleMethodsTrained()
+    {
+        StubInterceptorBuilder builder = new StubInterceptorBuilder(proxyFactory);
+        Interceptor interceptor = builder.configure(StubInterface.class, new Behavior<StubInterface>()
+        {
+            @Override
+            protected void train(StubInterface stub)
+            {
+                when(stub.one("Hello")).thenReturn("World");
+                when(stub.two("Foo")).thenReturn("Bar");
+            }
+        }).build();
+
+        final StubInterface proxy = proxyFactory.createInterceptorProxy(target, interceptor, StubInterface.class);
+        assertEquals("World", proxy.one("Hello"));
+        assertEquals("Bar", proxy.two("Foo"));
+    }
+
+    @Test
+    public void testWithSingleMethodTrained()
+    {
+        StubInterceptorBuilder builder = new StubInterceptorBuilder(proxyFactory);
+        Interceptor interceptor = builder.configure(StubInterface.class, new Behavior<StubInterface>()
+        {
+            @Override
+            protected void train(StubInterface stub)
+            {
+                when(stub.one("Hello")).thenReturn("World");
+            }
+        }).build();
+
+        final StubInterface proxy = proxyFactory.createInterceptorProxy(target, interceptor, StubInterface.class);
+        assertEquals("World", proxy.one("Hello"));
+        assertEquals(null, proxy.two("Whatever"));
+        assertEquals(null, proxy.one("Mismatch!"));
+    }
+}