diff --git a/gradle.properties b/gradle.properties index 91b1bf10..d9a7ce1a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ log4jVersion = 1.2.16 slf4jVersion = 1.6.4 # Common libraries -springVersion = 3.2.0.RC1 +springVersion = 3.2.0.RELEASE springDataCommonsVersion = 1.5.0.BUILD-SNAPSHOT gemfireVersion = 7.0 diff --git a/src/main/java/org/springframework/data/gemfire/client/ClientCacheFactoryBean.java b/src/main/java/org/springframework/data/gemfire/client/ClientCacheFactoryBean.java index e7975bd6..994bf565 100644 --- a/src/main/java/org/springframework/data/gemfire/client/ClientCacheFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/client/ClientCacheFactoryBean.java @@ -72,6 +72,7 @@ public class ClientCacheFactoryBean extends CacheFactoryBean { if (pdxReadSerialized != null) { factory.setPdxReadSerialized(pdxReadSerialized); } + } } diff --git a/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java b/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java index 41c7e9d2..9e1781fe 100644 --- a/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/client/PoolFactoryBean.java @@ -179,7 +179,7 @@ public class PoolFactoryBean implements FactoryBean, InitializingBean, .setSubscriptionMessageTrackingTimeout(subscriptionMessageTrackingTimeout); poolFactory.setSubscriptionRedundancy(subscriptionRedundancy); poolFactory.setThreadLocalConnections(threadLocalConnections); - + pool = poolFactory.create(name); } } diff --git a/src/main/java/org/springframework/data/gemfire/function/PojoFunctionWrapper.java b/src/main/java/org/springframework/data/gemfire/function/PojoFunctionWrapper.java index 96654cf4..81fae5be 100644 --- a/src/main/java/org/springframework/data/gemfire/function/PojoFunctionWrapper.java +++ b/src/main/java/org/springframework/data/gemfire/function/PojoFunctionWrapper.java @@ -19,7 +19,6 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -57,7 +56,7 @@ public class PojoFunctionWrapper implements Function { this.functionArgumentResolver = new FunctionContextInjectingArgumentResolver(method); - this.id = StringUtils.hasText(id) ? id : ClassUtils.getQualifiedMethodName(method); + this.id = StringUtils.hasText(id) ? id : method.getName(); this.target = target; this.method = method; diff --git a/src/main/java/org/springframework/data/gemfire/function/config/AbstractFunctionExecutionBeanDefinitionBuilder.java b/src/main/java/org/springframework/data/gemfire/function/config/AbstractFunctionExecutionBeanDefinitionBuilder.java index a85f0af5..583fe16d 100644 --- a/src/main/java/org/springframework/data/gemfire/function/config/AbstractFunctionExecutionBeanDefinitionBuilder.java +++ b/src/main/java/org/springframework/data/gemfire/function/config/AbstractFunctionExecutionBeanDefinitionBuilder.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; /** * Base class for function execution bean definition builders * @author David Turanski @@ -54,16 +55,18 @@ abstract class AbstractFunctionExecutionBeanDefinitionBuilder { BeanDefinitionBuilder functionTemplateBuilder = getGemfireOperationsBeanDefinitionBuilder(registry); functionTemplateBuilder.setLazyInit(true); + String resultCollectorRef = (String)configuration.getAttribute("resultCollector"); + if (StringUtils.hasText(resultCollectorRef)){ + functionTemplateBuilder.addPropertyReference("resultCollector",resultCollectorRef); + } + AbstractBeanDefinition functionTemplate = functionTemplateBuilder .getBeanDefinition(); String functionTemplateName = BeanDefinitionReaderUtils.registerWithGeneratedName(functionTemplate, registry); builder.addConstructorArgReference(functionTemplateName); - - - builder.addPropertyValue("functionId", (String)configuration.getAttribute("id")); - + return builder.getBeanDefinition(); } diff --git a/src/main/java/org/springframework/data/gemfire/function/config/FunctionExecutionBeanDefinitionRegistrar.java b/src/main/java/org/springframework/data/gemfire/function/config/FunctionExecutionBeanDefinitionRegistrar.java index 89b5f581..68bcfed7 100644 --- a/src/main/java/org/springframework/data/gemfire/function/config/FunctionExecutionBeanDefinitionRegistrar.java +++ b/src/main/java/org/springframework/data/gemfire/function/config/FunctionExecutionBeanDefinitionRegistrar.java @@ -69,6 +69,7 @@ public class FunctionExecutionBeanDefinitionRegistrar implements ImportBeanDefin if (!StringUtils.hasLength(beanName)) { beanName = BeanDefinitionReaderUtils.generateBeanName(beanDefinition, registry); } + AbstractFunctionExecutionBeanDefinitionBuilder builder = FunctionExecutionBeanDefinitionBuilderFactory .newInstance(new FunctionExecutionConfiguration(beanDefinition, functionExecutionAnnotation)); diff --git a/src/main/java/org/springframework/data/gemfire/function/config/FunctionExecutionComponentProvider.java b/src/main/java/org/springframework/data/gemfire/function/config/FunctionExecutionComponentProvider.java index f04c4bf2..214fb034 100644 --- a/src/main/java/org/springframework/data/gemfire/function/config/FunctionExecutionComponentProvider.java +++ b/src/main/java/org/springframework/data/gemfire/function/config/FunctionExecutionComponentProvider.java @@ -26,7 +26,6 @@ import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AbstractTypeHierarchyTraversingFilter; import org.springframework.core.type.filter.TypeFilter; -import org.springframework.data.gemfire.function.execution.FunctionExecution; import org.springframework.util.Assert; /** @@ -68,7 +67,7 @@ class FunctionExecutionComponentProvider extends ClassPathScanningCandidateCompo /** * Custom extension of {@link #addIncludeFilter(TypeFilter)} to extend the added {@link TypeFilter}. For the * {@link TypeFilter} handed we'll have two filters registered: one additionally enforcing the - * {@link FunctionExecutionDefinition} annotation, the other one forcing the extension of {@link FunctionExecution}. + * {@link FunctionExecutionDefinition} annotation, the other one forcing the extension of {@link AbstractFunctionExecution}. * * @see ClassPathScanningCandidateComponentProvider#addIncludeFilter(TypeFilter) */ diff --git a/src/main/java/org/springframework/data/gemfire/function/config/GemfireFunction.java b/src/main/java/org/springframework/data/gemfire/function/config/GemfireFunction.java index 767a201c..d00d7e7f 100644 --- a/src/main/java/org/springframework/data/gemfire/function/config/GemfireFunction.java +++ b/src/main/java/org/springframework/data/gemfire/function/config/GemfireFunction.java @@ -28,8 +28,7 @@ import java.lang.annotation.Target; @Target({ElementType.METHOD}) public @interface GemfireFunction { /** - * The name of the registered function. If not provided the fully qualified method name will be used, - * e.g., 'com.example.SomeClass.someMethod' + * The name of the registered function. If not provided the simple method name will be used * @return the function id */ String id() default ""; diff --git a/src/main/java/org/springframework/data/gemfire/function/config/OnMember.java b/src/main/java/org/springframework/data/gemfire/function/config/OnMember.java index 37eb3998..0c7eead6 100644 --- a/src/main/java/org/springframework/data/gemfire/function/config/OnMember.java +++ b/src/main/java/org/springframework/data/gemfire/function/config/OnMember.java @@ -28,12 +28,14 @@ import java.lang.annotation.Target; public @interface OnMember { /** - * The bean name and also the default name of the registered function, if single method on the interface. - * If multiple methods declared use the (@link FunctionId) annotation on each method - * @return the function id + * The bean name */ String id() default ""; + /** + * Optional ResultCollector bean reference + */ + String resultCollector() default ""; //TODO SpEL expression for DistributedMember? diff --git a/src/main/java/org/springframework/data/gemfire/function/config/OnMembers.java b/src/main/java/org/springframework/data/gemfire/function/config/OnMembers.java index a46138e2..91600c1f 100644 --- a/src/main/java/org/springframework/data/gemfire/function/config/OnMembers.java +++ b/src/main/java/org/springframework/data/gemfire/function/config/OnMembers.java @@ -27,12 +27,15 @@ import java.lang.annotation.Target; public @interface OnMembers { /** - * The bean name and also the default name of the registered function, if single method on the interface. - * If multiple methods declared use the (@link FunctionId) annotation on each method - * @return the function id + * The bean name */ String id() default ""; + /** + * Optional ResultCollector bean reference + */ + String resultCollector() default ""; + //TODO SpEL expression for DistributedMembers? /** diff --git a/src/main/java/org/springframework/data/gemfire/function/config/OnRegion.java b/src/main/java/org/springframework/data/gemfire/function/config/OnRegion.java index 0dbad85a..b7a315fd 100644 --- a/src/main/java/org/springframework/data/gemfire/function/config/OnRegion.java +++ b/src/main/java/org/springframework/data/gemfire/function/config/OnRegion.java @@ -27,12 +27,15 @@ import java.lang.annotation.Target; public @interface OnRegion { /** - * The bean name and also the default name of the registered function, if single method on the interface. - * If multiple methods declared use the (@link FunctionId) annotation on each method - * @return the function id + * The bean name */ String id() default ""; + /** + * Optional ResultCollector bean reference + */ + String resultCollector() default ""; + /** * The reference to the bean id of the region * @return the region id diff --git a/src/main/java/org/springframework/data/gemfire/function/config/OnServer.java b/src/main/java/org/springframework/data/gemfire/function/config/OnServer.java index f94ed1b9..c1843569 100644 --- a/src/main/java/org/springframework/data/gemfire/function/config/OnServer.java +++ b/src/main/java/org/springframework/data/gemfire/function/config/OnServer.java @@ -27,12 +27,15 @@ import java.lang.annotation.Target; public @interface OnServer { /** - * The bean name and also the default name of the registered function, if single method on the interface. - * If multiple methods declared use the (@link FunctionId) annotation on each method - * @return the function id + * The bean name */ String id() default ""; + /** + * Optional ResultCollector bean reference + */ + String resultCollector() default ""; + /** * The pool bean id (optional) * @return diff --git a/src/main/java/org/springframework/data/gemfire/function/config/OnServers.java b/src/main/java/org/springframework/data/gemfire/function/config/OnServers.java index 271c2602..1ff7fa4f 100644 --- a/src/main/java/org/springframework/data/gemfire/function/config/OnServers.java +++ b/src/main/java/org/springframework/data/gemfire/function/config/OnServers.java @@ -27,12 +27,15 @@ import java.lang.annotation.Target; public @interface OnServers { /** - * The bean name and also the default name of the registered function, if single method on the interface. - * If multiple methods declared use the (@link FunctionId) annotation on each method - * @return the function id + * The bean name */ String id() default ""; + /** + * Optional ResultCollector bean reference + */ + String resultCollector() default ""; + /** * The pool bean name (optional) * @return diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/FunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/AbstractFunctionExecution.java similarity index 71% rename from src/main/java/org/springframework/data/gemfire/function/execution/FunctionExecution.java rename to src/main/java/org/springframework/data/gemfire/function/execution/AbstractFunctionExecution.java index 1b424fb1..a592ea5c 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/FunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/AbstractFunctionExecution.java @@ -30,61 +30,57 @@ import com.gemstone.gemfire.cache.execute.ResultCollector; /** * Base class for * Creating a GemFire {@link Execution} using {@link FunctionService} + * Protected setters support method chaining * @author David Turanski */ -public abstract class FunctionExecution { +abstract class AbstractFunctionExecution { protected final Log logger = LogFactory.getLog(this.getClass()); - private volatile ResultCollector collector; + private volatile ResultCollector resultCollector; private Object[] args; private Function function; private String functionId; private long timeout; - public FunctionExecution(Function function, Object... args) { + public AbstractFunctionExecution(Function function, Object... args) { Assert.notNull(function,"function cannot be null"); this.function = function; this.functionId = function.getId(); this.args = args; } - public FunctionExecution(String functionId, Object... args) { + public AbstractFunctionExecution(String functionId, Object... args) { Assert.isTrue(StringUtils.hasLength(functionId),"functionId cannot be null or empty"); this.functionId = functionId; this.args = args; } - protected FunctionExecution() { - + AbstractFunctionExecution() { + } + + ResultCollector getCollector() { + return resultCollector; } - - - public ResultCollector getCollector() { - return collector; - } - - public Object[] getArgs() { + Object[] getArgs() { return args; } - public String getFunctionId() { + String getFunctionId() { return functionId; } - public Function getFunction() { + Function getFunction() { return function; } - - public void setCollector(ResultCollector collector) { - this.collector = collector; - } - + long getTimeout() { + return timeout; + } @SuppressWarnings("unchecked") - public Iterable execute() { + Iterable execute() { Execution execution = this.getExecution(); if (getKeys() != null) { execution = execution.withFilter(getKeys()); @@ -93,22 +89,24 @@ public abstract class FunctionExecution { execution = execution.withCollector(getCollector()); } - ResultCollector resultsCollector = null; + ResultCollector resultCollector = null; execution = execution.withArgs(getArgs()); if (isRegisteredFunction()){ - resultsCollector = (ResultCollector) execution.execute(functionId); + resultCollector = (ResultCollector) execution.execute(functionId); } else { - resultsCollector = (ResultCollector) execution.execute(function); + resultCollector = (ResultCollector) execution.execute(function); } + logger.debug("ResultsCollector:" + resultCollector.getClass().getName()); + Iterable results = null; if (this.timeout > 0 ){ try { - results= (Iterable)resultsCollector.getResult(this.timeout, TimeUnit.MILLISECONDS); + results= (Iterable)resultCollector.getResult(this.timeout, TimeUnit.MILLISECONDS); } catch (FunctionException e) { throw new RuntimeException(e); @@ -118,14 +116,14 @@ public abstract class FunctionExecution { } } else { - results = (Iterable) resultsCollector.getResult(); + results = (Iterable) resultCollector.getResult(); } return replaceSingletonNullCollectionWithEmptyList(results); } - public T executeAndExtract() { + T executeAndExtract() { Iterable results = this.execute(); if (results == null || !results.iterator().hasNext()) { return null; @@ -136,17 +134,17 @@ public abstract class FunctionExecution { protected abstract Execution getExecution(); - protected FunctionExecution setFunctionId(String functionId) { + protected AbstractFunctionExecution setFunctionId(String functionId) { this.functionId = functionId; return this; } - protected FunctionExecution setFunction(Function function) { + protected AbstractFunctionExecution setFunction(Function function) { this.function = function; return this; } - protected FunctionExecution setArgs(Object... args) { + protected AbstractFunctionExecution setArgs(Object... args) { this.args = args; return this; } @@ -155,14 +153,16 @@ public abstract class FunctionExecution { return null; } - public FunctionExecution setTimeout(long timeout) { + protected AbstractFunctionExecution setTimeout(long timeout) { this.timeout = timeout; return this; } + + protected AbstractFunctionExecution setResultCollector(ResultCollector resultCollector) { + this.resultCollector = resultCollector; + return this; + } - public long getTimeout() { - return timeout; - } /** * @return diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/AbstractFunctionTemplate.java b/src/main/java/org/springframework/data/gemfire/function/execution/AbstractFunctionTemplate.java index 42350de0..5e8972a7 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/AbstractFunctionTemplate.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/AbstractFunctionTemplate.java @@ -17,6 +17,7 @@ import org.apache.commons.logging.LogFactory; import com.gemstone.gemfire.cache.execute.Execution; import com.gemstone.gemfire.cache.execute.Function; +import com.gemstone.gemfire.cache.execute.ResultCollector; /** * @@ -29,40 +30,38 @@ abstract class AbstractFunctionTemplate implements GemfireFunctionOperations { protected Log log = LogFactory.getLog(this.getClass()); protected long timeout; + protected volatile ResultCollector resultCollector; @Override public Iterable execute(Function function, Object... args) { - FunctionExecution functionExecution = getFunctionExecution() + AbstractFunctionExecution functionExecution = getFunctionExecution() .setArgs(args) - .setFunction(function) - .setTimeout(timeout); + .setFunction(function); return execute(functionExecution); } @Override public T executeAndExtract(Function function, Object... args) { - FunctionExecution functionExecution = getFunctionExecution() + AbstractFunctionExecution functionExecution = getFunctionExecution() .setArgs(args) - .setFunction(function) - .setTimeout(timeout); + .setFunction(function); + return executeAndExtract(functionExecution); } @Override public Iterable execute(String functionId, Object... args) { - FunctionExecution functionExecution = getFunctionExecution() + AbstractFunctionExecution functionExecution = getFunctionExecution() .setArgs(args) - .setFunctionId(functionId) - .setTimeout(timeout); + .setFunctionId(functionId); return execute(functionExecution); } @Override public T executeAndExtract(String functionId, Object... args) { - FunctionExecution functionExecution = getFunctionExecution() + AbstractFunctionExecution functionExecution = getFunctionExecution() .setArgs(args) - .setFunctionId(functionId) - .setTimeout(timeout); + .setFunctionId(functionId); return executeAndExtract(functionExecution); } @@ -73,13 +72,15 @@ abstract class AbstractFunctionTemplate implements GemfireFunctionOperations { } - protected Iterable execute(FunctionExecution execution) { - execution.setTimeout(timeout); + protected Iterable execute(AbstractFunctionExecution execution) { + execution.setTimeout(timeout) + .setResultCollector(resultCollector); return execution.execute(); } - protected T executeAndExtract(FunctionExecution execution) { - execution.setTimeout(timeout); + protected T executeAndExtract(AbstractFunctionExecution execution) { + execution.setTimeout(timeout) + .setResultCollector(resultCollector); return execution.executeAndExtract(); } @@ -87,5 +88,13 @@ abstract class AbstractFunctionTemplate implements GemfireFunctionOperations { this.timeout = timeout; } - protected abstract FunctionExecution getFunctionExecution(); + public void setResultCollector(ResultCollector resultCollector) { + this.resultCollector = resultCollector; + } + + public ResultCollector getResultCollector() { + return this.resultCollector; + } + + protected abstract AbstractFunctionExecution getFunctionExecution(); } diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/AllMembersFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/AllMembersFunctionExecution.java index 99d43a68..bb2ad147 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/AllMembersFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/AllMembersFunctionExecution.java @@ -19,7 +19,7 @@ import com.gemstone.gemfire.cache.execute.FunctionService; * @author David Turanski * */ -public class AllMembersFunctionExecution extends FunctionExecution { +public class AllMembersFunctionExecution extends AbstractFunctionExecution { @Override protected Execution getExecution() { diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/DefaultMemberFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/DefaultMemberFunctionExecution.java index d5989f67..25bc0f41 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/DefaultMemberFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/DefaultMemberFunctionExecution.java @@ -19,7 +19,7 @@ import com.gemstone.gemfire.cache.execute.FunctionService; * @author David Turanski * */ -public class DefaultMemberFunctionExecution extends FunctionExecution { +public class DefaultMemberFunctionExecution extends AbstractFunctionExecution { @Override protected Execution getExecution() { diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/DistributedMemberFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/DistributedMemberFunctionExecution.java index 95f96636..f3684ae2 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/DistributedMemberFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/DistributedMemberFunctionExecution.java @@ -22,7 +22,7 @@ import com.gemstone.gemfire.distributed.DistributedMember; * @author David Turanski * */ -public class DistributedMemberFunctionExecution extends FunctionExecution { +public class DistributedMemberFunctionExecution extends AbstractFunctionExecution { private final DistributedMember distributedMember; diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/DistributedMembersFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/DistributedMembersFunctionExecution.java index 9a3f157a..3d9f15c1 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/DistributedMembersFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/DistributedMembersFunctionExecution.java @@ -22,7 +22,7 @@ import com.gemstone.gemfire.distributed.DistributedMember; * @author David Turanski * */ -public class DistributedMembersFunctionExecution extends FunctionExecution { +public class DistributedMembersFunctionExecution extends AbstractFunctionExecution { private final Set distributedMembers; /** diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/FunctionExecutionMethodMetadata.java b/src/main/java/org/springframework/data/gemfire/function/execution/FunctionExecutionMethodMetadata.java index 204aa485..00136ddf 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/FunctionExecutionMethodMetadata.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/FunctionExecutionMethodMetadata.java @@ -41,7 +41,7 @@ abstract class FunctionExecutionMethodMetadata { public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException { T mmd = newMetadataInstance(method); if (mmd.getFunctionId() == null) { - mmd.setFunctionId(serviceInterface.getName() + "." + method.getName()); + mmd.setFunctionId(method.getName()); } methodMetadata.put(method, mmd); diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireFunctionProxyFactoryBean.java b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireFunctionProxyFactoryBean.java index 546008b7..a06894c8 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireFunctionProxyFactoryBean.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireFunctionProxyFactoryBean.java @@ -22,12 +22,11 @@ import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.data.gemfire.function.config.FunctionId; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import com.gemstone.gemfire.cache.execute.FunctionException; +import com.gemstone.gemfire.cache.execute.FunctionService; /** * A proxy Factory Bean for all non-region function execution interfaces @@ -35,7 +34,7 @@ import com.gemstone.gemfire.cache.execute.FunctionException; * @author David Turanski * */ -public class GemfireFunctionProxyFactoryBean implements FactoryBean, MethodInterceptor, BeanClassLoaderAware, InitializingBean { +public class GemfireFunctionProxyFactoryBean implements FactoryBean, MethodInterceptor, BeanClassLoaderAware { protected volatile ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); @@ -45,7 +44,7 @@ public class GemfireFunctionProxyFactoryBean implements FactoryBean, Met private volatile boolean initialized; - protected String functionId; + //protected String functionId; protected Log logger = LogFactory.getLog(this.getClass()); @@ -123,20 +122,6 @@ public class GemfireFunctionProxyFactoryBean implements FactoryBean, Met this.serviceProxy = proxyFactory.getProxy(this.beanClassLoader); this.initialized = true; } - - protected String annotatedFunctionId(Method method) { - FunctionId functionIdAnnotation = method.getAnnotation(FunctionId.class); - return (functionIdAnnotation == null) ? null: functionIdAnnotation.value(); - } - - - /** - * Optional to set a default function Id for a single method interface with no {code}@FunctionId{code} annotations - * @param functionId - */ - public void setFunctionId(String functionId) { - this.functionId = functionId; - } /* * Match the result to the declared return type @@ -164,16 +149,4 @@ public class GemfireFunctionProxyFactoryBean implements FactoryBean, Met } return result; } - - /* (non-Javadoc) - * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() - */ - @Override - public void afterPropertiesSet() throws Exception { - if (this.functionId != null) { - if (this.methodMetadata.isSingletonInterface()) { - this.methodMetadata.getSingletonMethodMetada().setFunctionId(this.functionId); - } - } - } } diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnMemberFunctionTemplate.java b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnMemberFunctionTemplate.java index a54ab0b5..23bc593c 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnMemberFunctionTemplate.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnMemberFunctionTemplate.java @@ -41,7 +41,7 @@ public class GemfireOnMemberFunctionTemplate extends AbstractFunctionTemplate { } - protected FunctionExecution getFunctionExecution() { + protected AbstractFunctionExecution getFunctionExecution() { if (distributedMember == null && groups == null) { return new DefaultMemberFunctionExecution(); } else if (distributedMember == null) { diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnMembersFunctionTemplate.java b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnMembersFunctionTemplate.java index ed64bad6..dd530afa 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnMembersFunctionTemplate.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnMembersFunctionTemplate.java @@ -42,7 +42,7 @@ public class GemfireOnMembersFunctionTemplate extends AbstractFunctionTemplate } - protected FunctionExecution getFunctionExecution() { + protected AbstractFunctionExecution getFunctionExecution() { if (distributedMembers == null && groups == null) { return new AllMembersFunctionExecution(); } else if (distributedMembers == null) { diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnRegionFunctionTemplate.java b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnRegionFunctionTemplate.java index 18800d38..ebf21fc2 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnRegionFunctionTemplate.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnRegionFunctionTemplate.java @@ -66,7 +66,7 @@ public class GemfireOnRegionFunctionTemplate extends AbstractFunctionTemplate i } @Override - protected FunctionExecution getFunctionExecution() { + protected AbstractFunctionExecution getFunctionExecution() { return new RegionFunctionExecution(this.region); } diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnServerFunctionTemplate.java b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnServerFunctionTemplate.java index c02d4f0c..0c76a7bc 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnServerFunctionTemplate.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnServerFunctionTemplate.java @@ -37,7 +37,7 @@ public class GemfireOnServerFunctionTemplate extends AbstractFunctionTemplate { } @Override - protected FunctionExecution getFunctionExecution() { + protected AbstractFunctionExecution getFunctionExecution() { if (this.pool == null) { return new ServerFunctionExecution(this.cache); } diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnServersFunctionTemplate.java b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnServersFunctionTemplate.java index fe519d88..60429090 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnServersFunctionTemplate.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/GemfireOnServersFunctionTemplate.java @@ -37,7 +37,7 @@ public class GemfireOnServersFunctionTemplate extends AbstractFunctionTemplate } @Override - protected FunctionExecution getFunctionExecution() { + protected AbstractFunctionExecution getFunctionExecution() { if (this.pool == null) { return new ServersFunctionExecution(this.cache); } diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/GroupMemberFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/GroupMemberFunctionExecution.java index 99a6c5ee..4187e879 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/GroupMemberFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/GroupMemberFunctionExecution.java @@ -21,7 +21,7 @@ import com.gemstone.gemfire.cache.execute.FunctionService; * @author David Turanski * */ -public class GroupMemberFunctionExecution extends FunctionExecution { +public class GroupMemberFunctionExecution extends AbstractFunctionExecution { private final String groups[]; diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/GroupMembersFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/GroupMembersFunctionExecution.java index ebba718f..d22b116a 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/GroupMembersFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/GroupMembersFunctionExecution.java @@ -21,7 +21,7 @@ import com.gemstone.gemfire.cache.execute.FunctionService; * @author David Turanski * */ -public class GroupMembersFunctionExecution extends FunctionExecution { +public class GroupMembersFunctionExecution extends AbstractFunctionExecution { private final String groups[]; diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/PoolServerFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/PoolServerFunctionExecution.java index 90fd5151..24273da9 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/PoolServerFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/PoolServerFunctionExecution.java @@ -26,7 +26,7 @@ import com.gemstone.gemfire.cache.execute.FunctionService; * @author David Turanski * */ -public class PoolServerFunctionExecution extends FunctionExecution implements InitializingBean { +public class PoolServerFunctionExecution extends AbstractFunctionExecution implements InitializingBean { private Pool pool; diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/PoolServersFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/PoolServersFunctionExecution.java index cc987a72..e8fdcc74 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/PoolServersFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/PoolServersFunctionExecution.java @@ -23,7 +23,7 @@ import com.gemstone.gemfire.cache.execute.FunctionService; * @author David Turanski * */ -public class PoolServersFunctionExecution extends FunctionExecution { +public class PoolServersFunctionExecution extends AbstractFunctionExecution { private final Pool pool; diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/RegionFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/RegionFunctionExecution.java index 0fa86ef9..3d9f42b3 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/RegionFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/RegionFunctionExecution.java @@ -25,7 +25,7 @@ import com.gemstone.gemfire.cache.execute.FunctionService; * @author David Turanski * */ -public class RegionFunctionExecution extends FunctionExecution { +public class RegionFunctionExecution extends AbstractFunctionExecution { private final Region region; diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/ServerFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/ServerFunctionExecution.java index 4ef8d4b5..1a67e5c4 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/ServerFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/ServerFunctionExecution.java @@ -23,7 +23,7 @@ import com.gemstone.gemfire.cache.execute.FunctionService; * @author David Turanski * */ -public class ServerFunctionExecution extends FunctionExecution { +public class ServerFunctionExecution extends AbstractFunctionExecution { private RegionService regionService; diff --git a/src/main/java/org/springframework/data/gemfire/function/execution/ServersFunctionExecution.java b/src/main/java/org/springframework/data/gemfire/function/execution/ServersFunctionExecution.java index cbfafe5f..ac8b466e 100644 --- a/src/main/java/org/springframework/data/gemfire/function/execution/ServersFunctionExecution.java +++ b/src/main/java/org/springframework/data/gemfire/function/execution/ServersFunctionExecution.java @@ -23,7 +23,7 @@ import com.gemstone.gemfire.cache.execute.FunctionService; * @author David Turanski * */ -public class ServersFunctionExecution extends FunctionExecution { +public class ServersFunctionExecution extends AbstractFunctionExecution { private final RegionService regionService; diff --git a/src/test/java/org/springframework/data/gemfire/function/config/AnnotationDrivenFunctionsTest.java b/src/test/java/org/springframework/data/gemfire/function/config/AnnotationDrivenFunctionsTest.java index 9e120cca..65b60833 100644 --- a/src/test/java/org/springframework/data/gemfire/function/config/AnnotationDrivenFunctionsTest.java +++ b/src/test/java/org/springframework/data/gemfire/function/config/AnnotationDrivenFunctionsTest.java @@ -43,21 +43,21 @@ public class AnnotationDrivenFunctionsTest { @Test public void testAnnotatedFunctions() { - assertTrue(FunctionService.isRegistered(FooFunction.class.getName()+".foo")); + assertTrue(FunctionService.isRegistered("foo")); - Function function = FunctionService.getFunction(FooFunction.class.getName()+".foo"); + Function function = FunctionService.getFunction("foo"); assertFalse(function.isHA()); assertFalse(function.optimizeForWrite()); assertFalse(function.hasResult()); - assertTrue(FunctionService.isRegistered(FooFunction.class.getName()+".bar")); - function = FunctionService.getFunction(FooFunction.class.getName()+".bar"); + assertTrue(FunctionService.isRegistered("bar")); + function = FunctionService.getFunction("bar"); assertTrue(function.isHA()); assertFalse(function.optimizeForWrite()); assertTrue(function.hasResult()); - assertTrue(FunctionService.isRegistered("foo")); - function = FunctionService.getFunction("foo"); + assertTrue(FunctionService.isRegistered("foo2")); + function = FunctionService.getFunction("foo2"); assertTrue(function.isHA()); assertTrue(function.optimizeForWrite()); assertTrue(function.hasResult()); @@ -84,7 +84,7 @@ public class AnnotationDrivenFunctionsTest { @Component public static class Foo2Function { - @GemfireFunction(id="foo", HA=true,optimizeForWrite=true) + @GemfireFunction(id="foo2", HA=true,optimizeForWrite=true) public List foo (Object someVal, @RegionData Map region, Object someOtherValue) { return null; } diff --git a/src/test/java/org/springframework/data/gemfire/function/config/FunctionExecutionClientCacheTests.java b/src/test/java/org/springframework/data/gemfire/function/config/FunctionExecutionClientCacheTests.java index febe4898..885945aa 100644 --- a/src/test/java/org/springframework/data/gemfire/function/config/FunctionExecutionClientCacheTests.java +++ b/src/test/java/org/springframework/data/gemfire/function/config/FunctionExecutionClientCacheTests.java @@ -13,19 +13,27 @@ package org.springframework.data.gemfire.function.config; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.concurrent.TimeUnit; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; +import org.springframework.data.gemfire.function.execution.GemfireOnServerFunctionTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.gemstone.gemfire.cache.Region; import com.gemstone.gemfire.cache.client.ClientCache; import com.gemstone.gemfire.cache.client.Pool; +import com.gemstone.gemfire.cache.execute.FunctionException; +import com.gemstone.gemfire.cache.execute.ResultCollector; +import com.gemstone.gemfire.distributed.DistributedMember; /** * @author David Turanski @@ -47,6 +55,9 @@ public class FunctionExecutionClientCacheTests { assertEquals(pool.getServers().get(0), cache.getDefaultPool().getServers().get(0)); context.getBean("r1",Region.class); + + GemfireOnServerFunctionTemplate template = context.getBean(GemfireOnServerFunctionTemplate.class); + assertTrue(template.getResultCollector() instanceof MyResultCollector); } } @@ -61,8 +72,60 @@ public class FunctionExecutionClientCacheTests { ) @Configuration class TestClientCacheConfig { + @Bean + MyResultCollector myResultCollector() { + return new MyResultCollector(); + } +} + +@SuppressWarnings("rawtypes") +class MyResultCollector implements ResultCollector { + + /* (non-Javadoc) + * @see com.gemstone.gemfire.cache.execute.ResultCollector#addResult(com.gemstone.gemfire.distributed.DistributedMember, java.lang.Object) + */ + @Override + public void addResult(DistributedMember arg0, Object arg1) { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see com.gemstone.gemfire.cache.execute.ResultCollector#clearResults() + */ + @Override + public void clearResults() { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see com.gemstone.gemfire.cache.execute.ResultCollector#endResults() + */ + @Override + public void endResults() { + // TODO Auto-generated method stub + + } + + /* (non-Javadoc) + * @see com.gemstone.gemfire.cache.execute.ResultCollector#getResult() + */ + @Override + public Object getResult() throws FunctionException { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see com.gemstone.gemfire.cache.execute.ResultCollector#getResult(long, java.util.concurrent.TimeUnit) + */ + @Override + public Object getResult(long arg0, TimeUnit arg1) throws FunctionException, InterruptedException { + // TODO Auto-generated method stub + return null; + } } - diff --git a/src/test/java/org/springframework/data/gemfire/function/config/FunctionExecutionComponentProviderTest.java b/src/test/java/org/springframework/data/gemfire/function/config/FunctionExecutionComponentProviderTest.java index 2e239730..bb5deaa5 100644 --- a/src/test/java/org/springframework/data/gemfire/function/config/FunctionExecutionComponentProviderTest.java +++ b/src/test/java/org/springframework/data/gemfire/function/config/FunctionExecutionComponentProviderTest.java @@ -31,41 +31,43 @@ import org.springframework.data.gemfire.function.config.one.TestFunctionExecutio * */ public class FunctionExecutionComponentProviderTest { - - @Test - public void testDiscovery() throws ClassNotFoundException { - List includeFilters = new ArrayList(); - FunctionExecutionComponentProvider provider = new FunctionExecutionComponentProvider(includeFilters,AnnotationFunctionExecutionConfigurationSource.getFunctionExecutionAnnotationTypes()); - Set candidates = provider.findCandidateComponents(this.getClass().getPackage().getName()+".one"); - - ScannedGenericBeanDefinition bd = null; - - for (BeanDefinition candidate: candidates) { - if (candidate.getBeanClassName().equals(TestFunctionExecution.class.getName())) { - bd = (ScannedGenericBeanDefinition)candidate; - } - } - - assertNotNull(bd); - - } - - @Test - public void testExcludeFilter() throws ClassNotFoundException { - List includeFilters = new ArrayList(); - FunctionExecutionComponentProvider provider = new FunctionExecutionComponentProvider(includeFilters,AnnotationFunctionExecutionConfigurationSource.getFunctionExecutionAnnotationTypes()); - - provider.addExcludeFilter(new AssignableTypeFilter(TestFunctionExecution.class)); - - Set candidates = provider.findCandidateComponents(this.getClass().getPackage().getName()+".one"); - - for (BeanDefinition candidate: candidates) { - if (candidate.getBeanClassName().equals(TestFunctionExecution.class.getName())) { - fail(TestFunctionExecution.class.getName() + " not excluded"); - } - } - } + + @Test + public void testDiscovery() throws ClassNotFoundException { + List includeFilters = new ArrayList(); + FunctionExecutionComponentProvider provider = new FunctionExecutionComponentProvider(includeFilters, + AnnotationFunctionExecutionConfigurationSource.getFunctionExecutionAnnotationTypes()); + Set candidates = provider.findCandidateComponents(this.getClass().getPackage().getName() + + ".one"); + + ScannedGenericBeanDefinition bd = null; + + for (BeanDefinition candidate : candidates) { + if (candidate.getBeanClassName().equals(TestFunctionExecution.class.getName())) { + bd = (ScannedGenericBeanDefinition) candidate; + } + } + + assertNotNull(bd); + + } + + @Test + public void testExcludeFilter() throws ClassNotFoundException { + List includeFilters = new ArrayList(); + FunctionExecutionComponentProvider provider = new FunctionExecutionComponentProvider(includeFilters, + AnnotationFunctionExecutionConfigurationSource.getFunctionExecutionAnnotationTypes()); + + provider.addExcludeFilter(new AssignableTypeFilter(TestFunctionExecution.class)); + + Set candidates = provider.findCandidateComponents(this.getClass().getPackage().getName() + + ".one"); + + for (BeanDefinition candidate : candidates) { + if (candidate.getBeanClassName().equals(TestFunctionExecution.class.getName())) { + fail(TestFunctionExecution.class.getName() + " not excluded"); + } + } + } } - - diff --git a/src/test/java/org/springframework/data/gemfire/function/config/three/TestClientOnServerFunction.java b/src/test/java/org/springframework/data/gemfire/function/config/three/TestClientOnServerFunction.java index 50eb7a7e..50994bd1 100644 --- a/src/test/java/org/springframework/data/gemfire/function/config/three/TestClientOnServerFunction.java +++ b/src/test/java/org/springframework/data/gemfire/function/config/three/TestClientOnServerFunction.java @@ -22,7 +22,7 @@ import org.springframework.data.gemfire.function.config.OnServer; * @author David Turanski * */ -@OnServer(id="testClientOnServerFunction",pool="gemfirePool") +@OnServer(id="testClientOnServerFunction",pool="gemfirePool",resultCollector="myResultCollector") public interface TestClientOnServerFunction { @FunctionId("f1") public String getString(Object arg1, @Filter Set keys) ; diff --git a/src/test/java/org/springframework/data/gemfire/function/execution/FunctionExecutionTests.java b/src/test/java/org/springframework/data/gemfire/function/execution/FunctionExecutionTests.java index 9660b5be..4be762f2 100644 --- a/src/test/java/org/springframework/data/gemfire/function/execution/FunctionExecutionTests.java +++ b/src/test/java/org/springframework/data/gemfire/function/execution/FunctionExecutionTests.java @@ -95,7 +95,7 @@ public class FunctionExecutionTests { - private void verifyfunctionExecution(FunctionExecution functionExecution) { + private void verifyfunctionExecution(AbstractFunctionExecution functionExecution) { Iterable results = functionExecution .setArgs("1","2","3") .setFunctionId("echoFunction") diff --git a/src/test/java/org/springframework/data/gemfire/function/execution/GemfireFunctionProxyFactoryBeanTests.java b/src/test/java/org/springframework/data/gemfire/function/execution/GemfireFunctionProxyFactoryBeanTests.java index 6e574f58..f9ce372b 100644 --- a/src/test/java/org/springframework/data/gemfire/function/execution/GemfireFunctionProxyFactoryBeanTests.java +++ b/src/test/java/org/springframework/data/gemfire/function/execution/GemfireFunctionProxyFactoryBeanTests.java @@ -55,7 +55,6 @@ public class GemfireFunctionProxyFactoryBeanTests { GemfireFunctionProxyFactoryBean proxy = new GemfireFunctionProxyFactoryBean(IFoo.class,functionOperations); - proxy.setFunctionId(IFoo.class.getName()); MethodInvocation invocation = new TestInvocation(IFoo.class).withMethodNameAndArgTypes("oneArg",String.class); @@ -75,13 +74,12 @@ public class GemfireFunctionProxyFactoryBeanTests { GemfireFunctionProxyFactoryBean proxy = new GemfireFunctionProxyFactoryBean(IFoo.class, functionOperations); - proxy.setFunctionId(IFoo.class.getName()); - + MethodInvocation invocation = new TestInvocation(IFoo.class).withMethodNameAndArgTypes("collections",List.class); List results = Arrays.asList(new Integer[]{1,2,3}); - when(functionOperations.execute(IFoo.class.getName() + ".collections",invocation.getArguments())).thenReturn(results); + when(functionOperations.execute("collections",invocation.getArguments())).thenReturn(results); Object result = proxy.invoke(invocation); assertTrue(result instanceof List); diff --git a/src/test/resources/org/springframework/data/gemfire/function/config/FunctionExecutionCacheClientTests-context.xml b/src/test/resources/org/springframework/data/gemfire/function/config/FunctionExecutionCacheClientTests-context.xml index 3c631caa..48ec0c9e 100644 --- a/src/test/resources/org/springframework/data/gemfire/function/config/FunctionExecutionCacheClientTests-context.xml +++ b/src/test/resources/org/springframework/data/gemfire/function/config/FunctionExecutionCacheClientTests-context.xml @@ -11,7 +11,7 @@ - +