Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (C) 2010-2011 eBusiness Information, Excilys Group 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 com.googlecode.androidannotations.processing.rest;
 
 import java.util.List;
 import java.util.Map;
 
 
 
 public abstract class MethodProcessor implements ElementProcessor {
 
 
 	public MethodProcessor(ProcessingEnvironment processingEnvRestImplementationsHolder restImplementationHolder) {
 		this. = restImplementationHolder;
 		 = new RestAnnotationHelper(processingEnvgetTarget());
 	}
 
 	protected void generateRestTemplateCallBlock(MethodProcessorHolder methodHolder) {
 		ExecutableElement executableElement = (ExecutableElementmethodHolder.getElement();
 		JClass expectedClass = methodHolder.getExpectedClass();
 		JClass generatedReturnType = methodHolder.getGeneratedReturnType();
 
 		JMethod method;
 		String methodName = executableElement.getSimpleName().toString();
 		boolean methodReturnVoid = generatedReturnType == null && expectedClass == null;
 		if (methodReturnVoid) {
 			method = holder.restImplementationClass.method(.void.classmethodName);
 		} else {
 			method = holder.restImplementationClass.method(.methodHolder.getGeneratedReturnType(), methodName);
 		}
 		method.annotate(Override.class);
 
 		JBlock body = method.body();
 
 		// exchange method call
 		JInvocation restCall = JExpr.invoke(holder.restTemplateField"exchange");
 
 		// add url param
 		restCall.arg(methodHolder.getUrl());
 
 		JClass httpMethod = holder.refClass(.);
 		// add method type param
 		String restMethodInCapitalLetters = getTarget().getSimpleName().toUpperCase();
 		restCall.arg(httpMethod.staticRef(restMethodInCapitalLetters));
 
 		TreeMap<StringJVarmethodParams = (TreeMap<StringJVar>) generateMethodParamsVar(methodexecutableElementholder);
 
 		// update method holder
 		methodHolder.setBody(body);
 		methodHolder.setMethodParams(methodParams);
 
 		JVar hashMapVar = generateHashMapVar(methodHolder);
 
 		restCall = addHttpEntityVar(restCallmethodHolder);
 		restCall = addResponseEntityArg(restCallmethodHolder);
 
 		boolean hasParametersInUrl = hashMapVar != null;
 		if (hasParametersInUrl) {
 			restCall.arg(hashMapVar);
 		}
 
 		restCall = addResultCallMethod(restCallmethodHolder);
		insertRestCallInBody(bodyrestCallmethodReturnVoid);
	}
	protected abstract JInvocation addHttpEntityVar(JInvocation restCallMethodProcessorHolder methodHolder);
	protected abstract JInvocation addResponseEntityArg(JInvocation restCallMethodProcessorHolder methodHolder);
	protected abstract JInvocation addResultCallMethod(JInvocation restCallMethodProcessorHolder methodHolder);
	private void insertRestCallInBody(JBlock bodyJInvocation restCallboolean methodReturnVoid) {
		if (methodReturnVoid)
			body.add(restCall);
		else
			body._return(restCall);
	}
	private JVar generateHashMapVar(MethodProcessorHolder methodHolder) {
		ExecutableElement element = (ExecutableElementmethodHolder.getElement();
		JCodeModel codeModel = methodHolder.getCodeModel();
		JBlock body = methodHolder.getBody();
		TreeMap<StringJVarmethodParams = methodHolder.getMethodParams();
		JVar hashMapVar = null;
		JClass hashMapClass = codeModel.ref(HashMap.class).narrow(String.classObject.class);
		if (!urlVariables.isEmpty()) {
			hashMapVar = body.decl(hashMapClass"urlVariables", JExpr._new(hashMapClass));
			for (String urlVariable : urlVariables) {
				body.invoke(hashMapVar"put").arg(urlVariable).arg(methodParams.get(urlVariable));
				methodParams.remove(urlVariable);
			}
		}
		return hashMapVar;
	}
	protected JVar generateHttpEntityVar(MethodProcessorHolder methodHolder) {
		ExecutableElement executableElement = (ExecutableElementmethodHolder.getElement();
		JInvocation newHttpEntityVarCall;
		TreeMap<StringJVarmethodParams = methodHolder.getMethodParams();
		JVar entitySentToServer = null;
		JType entityType = null
		if (!methodParams.isEmpty()) {
			entitySentToServer = methodParams.firstEntry().getValue();
			entityType = entitySentToServer.type();
		}
		if (entitySentToServer != null) {
			newHttpEntityVarCall = JExpr._new(httpEntity.narrow(entityType));
else {
			newHttpEntityVarCall = JExpr._new(httpEntity.narrow(Object.class));
		}
		JBlock body = methodHolder.getBody();
		JVar httpHeadersVar = generateHttpHeadersVar(bodyexecutableElement);
		boolean hasHeaders = httpHeadersVar != null;
		if (entitySentToServer != null) {
			newHttpEntityVarCall.arg(entitySentToServer);
		}
		if (hasHeaders) {
			newHttpEntityVarCall.arg(httpHeadersVar);
else if (methodParams.isEmpty()) {
			newHttpEntityVarCall.arg(JExpr._null());
		}
		JVar httpEntityVar;
		String httpEntityVarName = "requestEntity";
		if (entitySentToServer != null) {
			httpEntityVar = body.decl(httpEntity.narrow(entityType), httpEntityVarNamenewHttpEntityVarCall);
else {
			httpEntityVar = body.decl(httpEntity.narrow(Object.class), httpEntityVarNamenewHttpEntityVarCall);
		}
		return httpEntityVar;
	}
	protected JVar generateHttpHeadersVar(JBlock bodyExecutableElement executableElement) {
		JVar httpHeadersVar = null;
		JClass httpHeadersClass = holder.refClass(.);
		httpHeadersVar = body.decl(httpHeadersClass"httpHeaders", JExpr._new(httpHeadersClass));
		String mediaType = retrieveAcceptAnnotationValue(executableElement);
		boolean hasMediaTypeDefined = mediaType != null;
		if (hasMediaTypeDefined) {
			JClass collectionsClass = holder.refClass(.);
			JClass mediaTypeClass = holder.refClass(.);
			JInvocation mediaTypeListParam = collectionsClass.staticInvoke("singletonList").arg(mediaTypeClass.staticRef(mediaType));
			body.add(JExpr.invoke(httpHeadersVar"setAccept").arg(mediaTypeListParam));
		}
		return httpHeadersVar;
	}
		Accept acceptAnnotation = executableElement.getAnnotation(Accept.class);
		if (acceptAnnotation == null) {
			acceptAnnotation = executableElement.getEnclosingElement().getAnnotation(Accept.class);
		}
		if (acceptAnnotation != null) {
			return acceptAnnotation.value().name();
else {
			return null;
		}
	}
	private Map<StringJVargenerateMethodParamsVar(JMethod methodExecutableElement executableElementRestImplementationHolder holder) {
		List<? extends VariableElementparams = executableElement.getParameters();
		TreeMap<StringJVarmethodParams = new TreeMap<StringJVar>();
		for (VariableElement parameter : params) {
			String paramName = parameter.getSimpleName().toString();
			String paramType = parameter.asType().toString();
			// TODO check in validator that params are not generic. Or create a
			// helper to fix that case and generate the right code.
			JVar param = method.param(holder.refClass(paramType), paramName);
			methodParams.put(paramNameparam);
		}
		return methodParams;
	}
	protected abstract JVar addHttpHeadersVar(JBlock bodyExecutableElement executableElement);
	public abstract Class<? extends AnnotationgetTarget();
	public abstract void process(Element elementJCodeModel codeModelEBeansHolder eBeansHolderthrows Exception;
New to GrepCode? Check out our FAQ X