From 5527b985e8169928ef946d3edb4228afae29a056 Mon Sep 17 00:00:00 2001 From: rockytriton Date: Fri, 24 May 2013 10:51:47 -0500 Subject: [PATCH 1/5] getRootUrl support --- .../helper/ValidatorHelper.java | 19 +++++++++++++++++++ .../processing/rest/RestProcessor.java | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) 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..ed2e4589b2 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(); @@ -797,6 +801,8 @@ 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 +815,18 @@ public void unannotatedMethodReturnsRestTemplate(TypeElement typeElement, IsVali foundGetRestTemplateMethod = true; } } + } else if (simpleName.equals(METHOD_NAME_GET_ROOT_URL)) { + 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"); + } + + if (executableElement.getParameters().size() != 0) { + valid.invalidate(); + annotationHelper.printError(enclosedElement, "The method getRootUrl cannot have parameters on a " + TargetAnnotationHelper.annotationName(Rest.class) + " annotated interface"); + } } else if (returnType.getKind() == TypeKind.VOID) { List parameters = executableElement.getParameters(); if (parameters.size() == 1) { @@ -816,6 +834,7 @@ public void unannotatedMethodReturnsRestTemplate(TypeElement typeElement, IsVali if (firstParameter.asType().toString().equals(CanonicalNameConstants.REST_TEMPLATE)) { if (!foundSetRestTemplateMethod) { foundSetRestTemplateMethod = true; + annotationHelper.printAnnotationWarning(executableElement, "Found SET URL"); } else { valid.invalidate(); annotationHelper.printError(enclosedElement, "You can only have oneRestTemplate setter method on a " + TargetAnnotationHelper.annotationName(Rest.class) + " annotated interface"); 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..e73c34abec 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) { + if (method.getParameters().size() == 0 && method.getReturnType().toString().equals(STRING) && method.getSimpleName().toString().equals("getRootUrl")) { + String methodName = method.getSimpleName().toString(); + + JMethod getRootUrlMethod = holder.restImplementationClass.method(JMod.PUBLIC, eBeansHolder.refClass(STRING), methodName); + + getRootUrlMethod.annotate(Override.class); + getRootUrlMethod.body()._return(holder.rootUrlField); + return; // Only one implementation + } + } + } } From edf2dcdfef6548213b531614204fc9c33b643a27 Mon Sep 17 00:00:00 2001 From: rockytriton Date: Fri, 24 May 2013 14:36:44 -0500 Subject: [PATCH 2/5] added tests and fixed some other getRootUrl validation issues --- .../helper/ValidatorHelper.java | 15 ++++++++++----- .../processing/rest/RestProcessor.java | 4 ++-- .../org/androidannotations/rest/RestTest.java | 11 +++++++++++ 3 files changed, 23 insertions(+), 7 deletions(-) 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 ed2e4589b2..f9b372f963 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java @@ -799,6 +799,7 @@ public void unannotatedMethodReturnsRestTemplate(TypeElement typeElement, IsVali } if (!hasRestAnnotation) { + ExecutableElement executableElement = (ExecutableElement) enclosedElement; TypeMirror returnType = executableElement.getReturnType(); String simpleName = executableElement.getSimpleName().toString(); @@ -816,17 +817,22 @@ public void unannotatedMethodReturnsRestTemplate(TypeElement typeElement, IsVali } } } else if (simpleName.equals(METHOD_NAME_GET_ROOT_URL)) { - if (!foundGetRootUrlMethod) { - foundGetRootUrlMethod = true; - } else { + if (!returnType.toString().equals(CanonicalNameConstants.STRING)) { valid.invalidate(); - annotationHelper.printError(enclosedElement, "The can be only one getRootUrl method on a " + TargetAnnotationHelper.annotationName(Rest.class) + " annotated interface"); + 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) { @@ -834,7 +840,6 @@ public void unannotatedMethodReturnsRestTemplate(TypeElement typeElement, IsVali if (firstParameter.asType().toString().equals(CanonicalNameConstants.REST_TEMPLATE)) { if (!foundSetRestTemplateMethod) { foundSetRestTemplateMethod = true; - annotationHelper.printAnnotationWarning(executableElement, "Found SET URL"); } else { valid.invalidate(); annotationHelper.printError(enclosedElement, "You can only have oneRestTemplate setter method on a " + TargetAnnotationHelper.annotationName(Rest.class) + " annotated interface"); 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 e73c34abec..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 @@ -174,9 +174,9 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHo private void implementGetRootUrl(RestImplementationHolder holder, EBeansHolder eBeansHolder, List methods) { for (ExecutableElement method : methods) { - if (method.getParameters().size() == 0 && method.getReturnType().toString().equals(STRING) && method.getSimpleName().toString().equals("getRootUrl")) { - String methodName = method.getSimpleName().toString(); + 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); 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); + } + } From 86d3f485e5d0be0c39b42948fc6ad9ce8670245f Mon Sep 17 00:00:00 2001 From: rockytriton Date: Fri, 24 May 2013 14:42:23 -0500 Subject: [PATCH 3/5] added new test class --- .../rest/ClientWithWrongEnhancedMethod.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/ClientWithWrongEnhancedMethod.java 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..35767466b5 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/ClientWithWrongEnhancedMethod.java @@ -0,0 +1,19 @@ +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 From 4c15846b4a231df7a3612649ca8af5fa16b4483b Mon Sep 17 00:00:00 2001 From: rockytriton Date: Fri, 24 May 2013 14:43:33 -0500 Subject: [PATCH 4/5] added legal stuff --- .../rest/ClientWithWrongEnhancedMethod.java | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/ClientWithWrongEnhancedMethod.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/ClientWithWrongEnhancedMethod.java index 35767466b5..f9c1b937d9 100644 --- a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/ClientWithWrongEnhancedMethod.java +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/rest/ClientWithWrongEnhancedMethod.java @@ -1,3 +1,18 @@ +/** + * 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; @@ -6,14 +21,19 @@ @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(); + // Correct + RestTemplate getTemplate(); + + String getRootUrl(); + + // Wrong + Object getRestTemplate(); + + String getURL(); + + String getRootURL(); + + String getRootURL(String param); + + boolean setRootURL(); } \ No newline at end of file From 7f8afdf159002f4f3e552fa7662b240fa9d898ef Mon Sep 17 00:00:00 2001 From: rockytriton Date: Sun, 26 May 2013 17:04:42 -0500 Subject: [PATCH 5/5] added getRootUrl to test project --- .../main/java/org/androidannotations/test15/rest/MyService.java | 2 ++ 1 file changed, 2 insertions(+) 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(); }