Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2002-2013 the original author or authors.
   * 
   * Licensed 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.springframework.data.gemfire.function;
 
 import java.util.Map;
 import java.util.Set;
 
 
 import  com.gemstone.gemfire.cache.Region;
 import  com.gemstone.gemfire.cache.execute.FunctionContext;
 import  com.gemstone.gemfire.cache.execute.RegionFunctionContext;
 import  com.gemstone.gemfire.cache.execute.ResultSender;
 import  com.gemstone.gemfire.cache.partition.PartitionRegionHelper;

Author(s):
David Turanski
Since:
1.3.0
 
 
 	private static Log logger = LogFactory.getLog(FunctionContextInjectingArgumentResolver.class);
 
 	private final int regionParameterPosition;
 	private final int filterParameterPosition;
 	private final int functionContextParameterPosition;
 	private final int resultSenderParameterPosition;
 	private final Method method;
 
 
 		this. = method;
 		int annotatedRegionDataParameterPosition = GemfireFunctionUtils.getAnnotationParameterPosition(method,
 				RegionData.classnew Class[] { Map.class });
 		int regionTypeParameterPosition = getArgumentTypePosition(method, Region.class);
 
 		if (annotatedRegionDataParameterPosition >= 0 && regionTypeParameterPosition >= 0) {
 			Assert.isTrue(
 					annotatedRegionDataParameterPosition == regionTypeParameterPosition,
 					String.format(
 							"Function method signature for method %s cannot contain an @RegionData parameter and a different Region type parameter",
 							method.getName()));
 		}
 
 		int tempRegionParameterPosition = -1;
 
 		if (annotatedRegionDataParameterPosition >= 0) {
 			tempRegionParameterPosition = annotatedRegionDataParameterPosition;
 		} else if (regionTypeParameterPosition >= 0) {
 			tempRegionParameterPosition = regionTypeParameterPosition;
 		}
 
 		 = tempRegionParameterPosition;
 		 = GemfireFunctionUtils.getAnnotationParameterPosition(methodFilter.class,
 				new Class[] { Set.class });
 		 = getArgumentTypePosition(method, FunctionContext.class);
 		 = getArgumentTypePosition(method, ResultSender.class);
 
 		if ( >= 0 &&  >= 0) {
 					"region parameter and filter parameter must be different");
 		}
 
 	}
 
 	public Object[] resolveFunctionArguments(FunctionContext functionContext) {
 
 		Object[] args = super.resolveFunctionArguments(functionContext);
 
 		if (functionContext instanceof RegionFunctionContext) {
 			if (this. >= 0) {
 				args = ArrayUtils.insert(args,
 						getRegionForContext((RegionFunctionContext) functionContext));
 			}
 
 			if (this. >= 0) {
 				args = ArrayUtils.insert(args,
 						((RegionFunctionContext) functionContext).getFilter());
 			}
 		}
 		if (this. >= 0) {
			args = ArrayUtils.insert(argsfunctionContext);
		}
		if (this. >= 0) {
			args = ArrayUtils.insert(argsfunctionContext.getResultSender());
		}
		Assert.isTrue(args.length == .getParameterTypes().length, String.format(
				"wrong number of arguments for method %s. Expected :%d, actual: %d".getName(),
				.getParameterTypes().lengthargs.length));
		return args;
	}
	/*
	 * @param regionFunctionContext
	 * @return
	 */
	private static Region<?, ?> getRegionForContext(RegionFunctionContext regionFunctionContext) {
		Region<?, ?> region = regionFunctionContext.getDataSet();
		if (PartitionRegionHelper.isPartitionedRegion(region)) {
				.debug("this is a partitioned region - filtering local data for context");
			}
			region = PartitionRegionHelper.getLocalDataForContext(regionFunctionContext);
		}
			.debug("region contains " + region.size() + " items");
		}
		return region;
	}
	private static int getArgumentTypePosition(Method methodClass<?> requiredType) {
		int position = -1;
		int i = 0;
		for (Class<?> clazz : method.getParameterTypes()) {
			if (requiredType.equals(clazz)) {
				Assert.state(
						position < 0,
						String.format("Method %s signature cannot contain more than one parameter of type %s.",
								method.getName(), requiredType.getName()));
				position = i;
			}
			i++;
		}
		return position;
	}
New to GrepCode? Check out our FAQ X