diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java index 06762a8b1c..f9b372f963 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java @@ -80,6 +80,8 @@ public class ValidatorHelper { private static final String METHOD_NAME_SET_ROOT_URL = "setRootUrl"; + private static final String METHOD_NAME_GET_ROOT_URL = "getRootUrl"; + private static final List VALID_PREF_RETURN_TYPES = Arrays.asList("int", "boolean", "float", "long", CanonicalNameConstants.STRING); private static final List INVALID_PREF_METHOD_NAMES = Arrays.asList("edit", "getSharedPreferences", "clear", "getEditor", "apply"); @@ -780,6 +782,8 @@ public void unannotatedMethodReturnsRestTemplate(TypeElement typeElement, IsVali boolean foundGetRestTemplateMethod = false; boolean foundSetRestTemplateMethod = false; boolean foundSetRootUrlMethod = false; + boolean foundGetRootUrlMethod = false; + for (Element enclosedElement : enclosedElements) { if (enclosedElement.getKind() != ElementKind.METHOD) { valid.invalidate(); @@ -795,8 +799,11 @@ public void unannotatedMethodReturnsRestTemplate(TypeElement typeElement, IsVali } if (!hasRestAnnotation) { + ExecutableElement executableElement = (ExecutableElement) enclosedElement; TypeMirror returnType = executableElement.getReturnType(); + String simpleName = executableElement.getSimpleName().toString(); + if (returnType.toString().equals(CanonicalNameConstants.REST_TEMPLATE)) { if (executableElement.getParameters().size() > 0) { valid.invalidate(); @@ -809,6 +816,23 @@ public void unannotatedMethodReturnsRestTemplate(TypeElement typeElement, IsVali foundGetRestTemplateMethod = true; } } + } else if (simpleName.equals(METHOD_NAME_GET_ROOT_URL)) { + if (!returnType.toString().equals(CanonicalNameConstants.STRING)) { + valid.invalidate(); + annotationHelper.printError(enclosedElement, "The method getRootUrl must return String on a " + TargetAnnotationHelper.annotationName(Rest.class) + " annotated interface"); + } + + if (executableElement.getParameters().size() != 0) { + valid.invalidate(); + annotationHelper.printError(enclosedElement, "The method getRootUrl cannot have parameters on a " + TargetAnnotationHelper.annotationName(Rest.class) + " annotated interface"); + } + + if (!foundGetRootUrlMethod) { + foundGetRootUrlMethod = true; + } else { + valid.invalidate(); + annotationHelper.printError(enclosedElement, "The can be only one getRootUrl method on a " + TargetAnnotationHelper.annotationName(Rest.class) + " annotated interface"); + } } else if (returnType.getKind() == TypeKind.VOID) { List parameters = executableElement.getParameters(); if (parameters.size() == 1) { diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestProcessor.java index 6f1d73b252..b0f49bcc1b 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestProcessor.java @@ -150,6 +150,9 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHo } } + // Implement getRootUrl method + implementGetRootUrl(holder, eBeansHolder, methods); + // Implement setRootUrl method for (ExecutableElement method : methods) { List parameters = method.getParameters(); @@ -168,4 +171,18 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHo } } + + private void implementGetRootUrl(RestImplementationHolder holder, EBeansHolder eBeansHolder, List methods) { + for (ExecutableElement method : methods) { + String methodName = method.getSimpleName().toString(); + + if (method.getParameters().size() == 0 && method.getReturnType().toString().equals(STRING) && methodName.equals("getRootUrl")) { + JMethod getRootUrlMethod = holder.restImplementationClass.method(JMod.PUBLIC, eBeansHolder.refClass(STRING), methodName); + + getRootUrlMethod.annotate(Override.class); + getRootUrlMethod.body()._return(holder.rootUrlField); + return; // Only one implementation + } + } + } } diff --git a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/ClientWithWrongEnhancedMethod.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/ClientWithWrongEnhancedMethod.java new file mode 100644 index 0000000000..f9c1b937d9 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/ClientWithWrongEnhancedMethod.java @@ -0,0 +1,39 @@ +/** + * Copyright (C) 2010-2013 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 org.androidannotations.rest; + +import org.androidannotations.annotations.rest.Rest; +import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +@Rest(converters = { MappingJacksonHttpMessageConverter.class }) +public interface ClientWithWrongEnhancedMethod { + // Correct + RestTemplate getTemplate(); + + String getRootUrl(); + + // Wrong + Object getRestTemplate(); + + String getURL(); + + String getRootURL(); + + String getRootURL(String param); + + boolean setRootURL(); +} \ No newline at end of file diff --git a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/RestTest.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/RestTest.java index 1a8339e4d2..dedbc94331 100644 --- a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/RestTest.java +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/RestTest.java @@ -81,4 +81,15 @@ public void client_with_path_variables() throws IOException { assertCompilationSuccessful(result); } + @Test + public void client_with_wrong_enhanced_methods() throws IOException { + CompileResult result = compileFiles(ClientWithWrongEnhancedMethod.class); + assertCompilationErrorOn(ClientWithWrongEnhancedMethod.class, "Object getRestTemplate();", result); + assertCompilationErrorOn(ClientWithWrongEnhancedMethod.class, "String getURL();", result); + assertCompilationErrorOn(ClientWithWrongEnhancedMethod.class, "String getRootURL();", result); + assertCompilationErrorOn(ClientWithWrongEnhancedMethod.class, "String getRootURL(String param);", result); + assertCompilationErrorOn(ClientWithWrongEnhancedMethod.class, "boolean setRootURL();", result); + assertCompilationErrorCount(5, result); + } + } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/MyService.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/MyService.java index 7f921b060b..a6eb34917b 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/MyService.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/rest/MyService.java @@ -206,4 +206,6 @@ ResponseEntity getEventsArrayOfArrays2(String location, int year) void setRestTemplate(RestTemplate restTemplate); void setRootUrl(String test); + + String getRootUrl(); }