From 4fe2eea817b4b2e0b210bc3973e4ebf580f48d5a Mon Sep 17 00:00:00 2001 From: Pierre-Yves Ricau Date: Sun, 4 Nov 2012 17:27:41 +0100 Subject: [PATCH] Adding converters() param to @Rest and renaming value() to rootUrl(). Adding tests on converters validation. #206 --- .../annotations/rest/Rest.java | 3 +- AndroidAnnotations/androidannotations/pom.xml | 7 +++ .../AndroidAnnotationProcessor.java | 2 +- .../helper/AnnotationHelper.java | 43 ++++++++++++++-- .../helper/CanonicalNameConstants.java | 1 + .../helper/ValidatorHelper.java | 36 +++++++++++++- .../processing/EBeansHolder.java | 7 +++ .../processing/rest/RestProcessor.java | 46 ++++++++++++----- .../validation/rest/RestValidator.java | 3 +- .../rest/AbstractConverter.java | 7 +++ .../androidannotations/rest/ClassClient.java | 8 +++ .../rest/ClientWithAbstractConverter.java | 8 +++ .../rest/ClientWithNoConverters.java | 8 +++ .../rest/ClientWithNonConverter.java | 8 +++ .../rest/ClientWithValidConverter.java | 10 ++++ .../ClientWithWrongConstructorConverter.java | 8 +++ .../rest/RestConverterTest.java | 49 +++++++++++++++++++ .../androidannotations/rest/RestTest.java | 25 ++++++++++ .../rest/WrongConstructorConverter.java | 31 ++++++++++++ .../rest/AndroidManifest.xml | 25 ++++++++++ .../functional-test-1-5/pom.xml | 38 +------------- .../test15/rest/MyService.java | 14 ++++-- AndroidAnnotations/pom.xml | 22 ++++----- 23 files changed, 335 insertions(+), 74 deletions(-) create mode 100644 AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/AbstractConverter.java create mode 100644 AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClassClient.java create mode 100644 AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithAbstractConverter.java create mode 100644 AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithNoConverters.java create mode 100644 AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithNonConverter.java create mode 100644 AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithValidConverter.java create mode 100644 AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithWrongConstructorConverter.java create mode 100644 AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/RestConverterTest.java create mode 100644 AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/RestTest.java create mode 100644 AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/WrongConstructorConverter.java create mode 100644 AndroidAnnotations/androidannotations/src/test/resources/com/googlecode/androidannotations/rest/AndroidManifest.xml diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/com/googlecode/androidannotations/annotations/rest/Rest.java b/AndroidAnnotations/androidannotations-api/src/main/java/com/googlecode/androidannotations/annotations/rest/Rest.java index 2a5ceca042..c57ad32e07 100644 --- a/AndroidAnnotations/androidannotations-api/src/main/java/com/googlecode/androidannotations/annotations/rest/Rest.java +++ b/AndroidAnnotations/androidannotations-api/src/main/java/com/googlecode/androidannotations/annotations/rest/Rest.java @@ -23,5 +23,6 @@ @Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) public @interface Rest { - String value() default ""; + String rootUrl() default ""; + Class[] converters(); } diff --git a/AndroidAnnotations/androidannotations/pom.xml b/AndroidAnnotations/androidannotations/pom.xml index 3f3261e215..bbf505708c 100644 --- a/AndroidAnnotations/androidannotations/pom.xml +++ b/AndroidAnnotations/androidannotations/pom.xml @@ -36,6 +36,13 @@ 1.6_r2 test + + + org.springframework.android + spring-android-rest-template + 1.0.0.RELEASE + test + diff --git a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/AndroidAnnotationProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/AndroidAnnotationProcessor.java index eeb963c9c3..f51b159ab5 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/AndroidAnnotationProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/AndroidAnnotationProcessor.java @@ -539,7 +539,7 @@ private ModelProcessor buildModelProcessor(IRClass rClass, AndroidSystemServices modelProcessor.register(new FragmentArgProcessor(processingEnv)); modelProcessor.register(new SystemServiceProcessor(androidSystemServices)); RestImplementationsHolder restImplementationHolder = new RestImplementationsHolder(); - modelProcessor.register(new RestProcessor(restImplementationHolder)); + modelProcessor.register(new RestProcessor(processingEnv, restImplementationHolder)); modelProcessor.register(new GetProcessor(processingEnv, restImplementationHolder)); modelProcessor.register(new PostProcessor(processingEnv, restImplementationHolder)); modelProcessor.register(new PutProcessor(processingEnv, restImplementationHolder)); diff --git a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/AnnotationHelper.java b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/AnnotationHelper.java index 1f9c51b3f0..7370e7d5db 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/AnnotationHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/AnnotationHelper.java @@ -58,7 +58,6 @@ public AnnotationHelper(ProcessingEnvironment processingEnv) { * be a subtype of itself. */ public boolean isSubtype(TypeMirror potentialSubtype, TypeMirror potentialSupertype) { - return processingEnv.getTypeUtils().isSubtype(potentialSubtype, potentialSupertype); } @@ -115,6 +114,10 @@ public boolean isPrivate(Element element) { return element.getModifiers().contains(Modifier.PRIVATE); } + public boolean isPublic(Element element) { + return element.getModifiers().contains(Modifier.PUBLIC); + } + public boolean isAbstract(Element element) { return element.getModifiers().contains(Modifier.ABSTRACT); } @@ -308,17 +311,45 @@ public String actionName(Class target) { return target.getSimpleName() + "ed"; } - public DeclaredType extractAnnotationClassParameter(Element element, Class target) { + public List extractAnnotationClassArrayParameter(Element element, Class target, String methodName) { + AnnotationMirror annotationMirror = findAnnotationMirror(element, target); + + Map elementValues = annotationMirror.getElementValues(); + + for (Map.Entry entry : elementValues.entrySet()) { + /* + * "methodName" is unset when the default value is used + */ + if (methodName.equals(entry.getKey().getSimpleName().toString())) { + + AnnotationValue annotationValue = entry.getValue(); + @SuppressWarnings("unchecked") + List annotationClassArray = (List) annotationValue.getValue(); + + List result = new ArrayList(annotationClassArray.size()); + + for (AnnotationValue annotationClassValue : annotationClassArray) { + result.add((DeclaredType) annotationClassValue.getValue()); + } + + return result; + } + } + + return null; + } + + public DeclaredType extractAnnotationClassParameter(Element element, Class target, String methodName) { AnnotationMirror annotationMirror = findAnnotationMirror(element, target); Map elementValues = annotationMirror.getElementValues(); for (Map.Entry entry : elementValues.entrySet()) { /* - * "value" is unset when the default value is used + * "methodName" is unset when the default value is used */ - if ("value".equals(entry.getKey().getSimpleName().toString())) { + if (methodName.equals(entry.getKey().getSimpleName().toString())) { AnnotationValue annotationValue = entry.getValue(); @@ -331,4 +362,8 @@ public DeclaredType extractAnnotationClassParameter(Element element, Class target) { + return extractAnnotationClassParameter(element, target, "value"); + } + } diff --git a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/CanonicalNameConstants.java b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/CanonicalNameConstants.java index fcef5c3ad9..d37549a7b5 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/CanonicalNameConstants.java +++ b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/CanonicalNameConstants.java @@ -99,6 +99,7 @@ public final class CanonicalNameConstants { public static final String HTTP_METHOD = "org.springframework.http.HttpMethod"; public static final String HTTP_ENTITY = "org.springframework.http.HttpEntity"; public static final String REST_TEMPLATE = "org.springframework.web.client.RestTemplate"; + public static final String HTTP_MESSAGE_CONVERTER = "org.springframework.http.converter.HttpMessageConverter"; /* * RoboGuice diff --git a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/ValidatorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/ValidatorHelper.java index 6f8227b91f..fa360e2478 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/ValidatorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/helper/ValidatorHelper.java @@ -20,6 +20,7 @@ import static com.googlecode.androidannotations.helper.AndroidConstants.LOG_INFO; import static com.googlecode.androidannotations.helper.AndroidConstants.LOG_VERBOSE; import static com.googlecode.androidannotations.helper.AndroidConstants.LOG_WARN; +import static com.googlecode.androidannotations.helper.CanonicalNameConstants.HTTP_MESSAGE_CONVERTER; import static com.googlecode.androidannotations.helper.ModelConstants.GENERATION_SUFFIX; import static java.util.Arrays.asList; @@ -860,7 +861,7 @@ public void hasCorrectDefaultAnnotation(ExecutableElement method) { checkDefaultAnnotation(method, DefaultString.class, "String", new DefaultAnnotationCondition() { @Override public boolean correctReturnType(TypeMirror returnType) { - return returnType.toString().equals("java.lang.String"); + return returnType.toString().equals(CanonicalNameConstants.STRING); } }); } @@ -1123,4 +1124,37 @@ public void componentRegistered(Element element, AndroidManifest androidManifest } + public void validateConverters(Element element, IsValid valid) { + TypeMirror httpMessageConverterType = annotationHelper.typeElementFromQualifiedName(HTTP_MESSAGE_CONVERTER).asType(); + TypeMirror httpMessageConverterTypeErased = annotationHelper.getTypeUtils().erasure(httpMessageConverterType); + List converters = annotationHelper.extractAnnotationClassArrayParameter(element, annotationHelper.getTarget(), "converters"); + for (DeclaredType converterType : converters) { + TypeMirror erasedConverterType = annotationHelper.getTypeUtils().erasure(converterType); + if (annotationHelper.isSubtype(erasedConverterType, httpMessageConverterTypeErased)) { + Element converterElement = converterType.asElement(); + if (converterElement.getKind().isClass()) { + if (!annotationHelper.isAbstract(converterElement)) { + List constructors = ElementFilter.constructorsIn(converterElement.getEnclosedElements()); + for (ExecutableElement constructor : constructors) { + if (annotationHelper.isPublic(constructor) && constructor.getParameters().isEmpty()) { + return; + } + } + valid.invalidate(); + annotationHelper.printAnnotationError(element, "The converter class must have a public no argument constructor"); + } else { + valid.invalidate(); + annotationHelper.printAnnotationError(element, "The converter class must not be abstract"); + } + } else { + valid.invalidate(); + annotationHelper.printAnnotationError(element, "The converter class must be a class"); + } + } else { + valid.invalidate(); + annotationHelper.printAnnotationError(element, "The converter class must be a subtype of " + HTTP_MESSAGE_CONVERTER); + } + } + + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeansHolder.java b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeansHolder.java index 68f30e407c..056ecb7ac2 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeansHolder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/EBeansHolder.java @@ -149,6 +149,13 @@ public class Classes { public EBeansHolder(JCodeModel codeModel) { this.codeModel = codeModel; classes = new Classes(); + refClass(CanonicalNameConstants.STRING); + preloadJavaLangClasses(); + } + + private void preloadJavaLangClasses() { + loadedClasses.put(String.class.getName(), refClass(String.class)); + loadedClasses.put(Object.class.getName(), refClass(Object.class)); } public EBeanHolder create(Element element, Class eBeanAnnotation, JDefinedClass generatedClass) { diff --git a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/rest/RestProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/rest/RestProcessor.java index a3bd655aca..e9c0aebb18 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/rest/RestProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/processing/rest/RestProcessor.java @@ -15,37 +15,45 @@ */ package com.googlecode.androidannotations.processing.rest; +import static com.googlecode.androidannotations.helper.CanonicalNameConstants.REST_TEMPLATE; +import static com.googlecode.androidannotations.helper.CanonicalNameConstants.STRING; +import static com.sun.codemodel.JExpr._new; import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JExpr.lit; import java.lang.annotation.Annotation; import java.util.List; +import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeKind; import javax.lang.model.util.ElementFilter; import com.googlecode.androidannotations.annotations.rest.Rest; +import com.googlecode.androidannotations.helper.AnnotationHelper; import com.googlecode.androidannotations.helper.ModelConstants; import com.googlecode.androidannotations.processing.EBeansHolder; import com.googlecode.androidannotations.processing.GeneratingElementProcessor; import com.sun.codemodel.ClassType; +import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; import com.sun.codemodel.JMethod; import com.sun.codemodel.JMod; import com.sun.codemodel.JVar; public class RestProcessor implements GeneratingElementProcessor { - private static final String SPRING_REST_TEMPLATE_QUALIFIED_NAME = "org.springframework.web.client.RestTemplate"; - private static final String JAVA_STRING_QUALIFIED_NAME = "java.lang.String"; private final RestImplementationsHolder restImplementationHolder; + private AnnotationHelper annotationHelper; - public RestProcessor(RestImplementationsHolder restImplementationHolder) { + public RestProcessor(ProcessingEnvironment processingEnv, RestImplementationsHolder restImplementationHolder) { + annotationHelper = new AnnotationHelper(processingEnv); this.restImplementationHolder = restImplementationHolder; } @@ -71,23 +79,35 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHo holder.restImplementationClass._implements(interfaceClass); // RestTemplate field - JClass restTemplateClass = eBeansHolder.refClass(SPRING_REST_TEMPLATE_QUALIFIED_NAME); + JClass restTemplateClass = eBeansHolder.refClass(REST_TEMPLATE); holder.restTemplateField = holder.restImplementationClass.field(JMod.PRIVATE, restTemplateClass, "restTemplate"); // RootUrl field - JClass stringClass = eBeansHolder.refClass(JAVA_STRING_QUALIFIED_NAME); + JClass stringClass = eBeansHolder.refClass(STRING); holder.rootUrlField = holder.restImplementationClass.field(JMod.PRIVATE, stringClass, "rootUrl"); - // Default constructor - JMethod defaultConstructor = holder.restImplementationClass.constructor(JMod.PUBLIC); - defaultConstructor.body().assign(holder.restTemplateField, JExpr._new(restTemplateClass)); - defaultConstructor.body().assign(holder.rootUrlField, JExpr.lit(typeElement.getAnnotation(Rest.class).value())); + { + // Constructor + JMethod constructor = holder.restImplementationClass.constructor(JMod.PUBLIC); + JBlock constructorBody = constructor.body(); + constructorBody.assign(holder.restTemplateField, _new(restTemplateClass)); + + { + // Converters + List converters = annotationHelper.extractAnnotationClassArrayParameter(element, getTarget(), "converters"); + for (DeclaredType converterType : converters) { + JClass converterClass = eBeansHolder.refClass(converterType.toString()); + constructorBody.add(invoke(holder.restTemplateField, "getMessageConverters").invoke("add").arg(_new(converterClass))); + } + } + constructorBody.assign(holder.rootUrlField, lit(typeElement.getAnnotation(Rest.class).rootUrl())); + } // Implement getRestTemplate method List enclosedElements = typeElement.getEnclosedElements(); List methods = ElementFilter.methodsIn(enclosedElements); for (ExecutableElement method : methods) { - if (method.getParameters().size() == 0 && method.getReturnType().toString().equals(SPRING_REST_TEMPLATE_QUALIFIED_NAME)) { + if (method.getParameters().size() == 0 && method.getReturnType().toString().equals(REST_TEMPLATE)) { String methodName = method.getSimpleName().toString(); JMethod getRestTemplateMethod = holder.restImplementationClass.method(JMod.PUBLIC, restTemplateClass, methodName); getRestTemplateMethod.annotate(Override.class); @@ -100,7 +120,7 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHo List parameters = method.getParameters(); if (parameters.size() == 1 && method.getReturnType().getKind() == TypeKind.VOID) { VariableElement firstParameter = parameters.get(0); - if (firstParameter.asType().toString().equals(SPRING_REST_TEMPLATE_QUALIFIED_NAME)) { + if (firstParameter.asType().toString().equals(REST_TEMPLATE)) { String methodName = method.getSimpleName().toString(); JMethod setRestTemplateMethod = holder.restImplementationClass.method(JMod.PUBLIC, codeModel.VOID, methodName); setRestTemplateMethod.annotate(Override.class); @@ -118,7 +138,7 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHo List parameters = method.getParameters(); if (parameters.size() == 1 && method.getReturnType().getKind() == TypeKind.VOID) { VariableElement firstParameter = parameters.get(0); - if (firstParameter.asType().toString().equals(JAVA_STRING_QUALIFIED_NAME) && method.getSimpleName().toString().equals("setRootUrl")) { + if (firstParameter.asType().toString().equals(STRING) && method.getSimpleName().toString().equals("setRootUrl")) { JMethod setRootUrlMethod = holder.restImplementationClass.method(JMod.PUBLIC, codeModel.VOID, method.getSimpleName().toString()); setRootUrlMethod.annotate(Override.class); diff --git a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/validation/rest/RestValidator.java b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/validation/rest/RestValidator.java index 44b0af3695..fd841cd5e0 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/validation/rest/RestValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/com/googlecode/androidannotations/validation/rest/RestValidator.java @@ -44,7 +44,6 @@ public Class getTarget() { @Override public boolean validate(Element element, AnnotationElements validatedElements) { - IsValid valid = new IsValid(); TypeElement typeElement = (TypeElement) element; @@ -61,6 +60,8 @@ public boolean validate(Element element, AnnotationElements validatedElements) { validatorHelper.unannotatedMethodReturnsRestTemplate(typeElement, valid); + validatorHelper.validateConverters(element, valid); + return valid.isValid(); } diff --git a/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/AbstractConverter.java b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/AbstractConverter.java new file mode 100644 index 0000000000..3697104eb6 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/AbstractConverter.java @@ -0,0 +1,7 @@ +package com.googlecode.androidannotations.rest; + +import org.springframework.http.converter.AbstractHttpMessageConverter; + +public abstract class AbstractConverter extends AbstractHttpMessageConverter { + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClassClient.java b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClassClient.java new file mode 100644 index 0000000000..2c41f2a5d3 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClassClient.java @@ -0,0 +1,8 @@ +package com.googlecode.androidannotations.rest; + +import com.googlecode.androidannotations.annotations.rest.Rest; + +@Rest(converters = {}) +public class ClassClient { + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithAbstractConverter.java b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithAbstractConverter.java new file mode 100644 index 0000000000..76faa0151b --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithAbstractConverter.java @@ -0,0 +1,8 @@ +package com.googlecode.androidannotations.rest; + +import com.googlecode.androidannotations.annotations.rest.Rest; + +@Rest(converters = { AbstractConverter.class }) +public interface ClientWithAbstractConverter { + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithNoConverters.java b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithNoConverters.java new file mode 100644 index 0000000000..4ff4f7e31c --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithNoConverters.java @@ -0,0 +1,8 @@ +package com.googlecode.androidannotations.rest; + +import com.googlecode.androidannotations.annotations.rest.Rest; + +@Rest(converters = {}) +public interface ClientWithNoConverters { + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithNonConverter.java b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithNonConverter.java new file mode 100644 index 0000000000..b2c6c4ae24 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithNonConverter.java @@ -0,0 +1,8 @@ +package com.googlecode.androidannotations.rest; + +import com.googlecode.androidannotations.annotations.rest.Rest; + +@Rest(converters = { Object.class }) +public interface ClientWithNonConverter { + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithValidConverter.java b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithValidConverter.java new file mode 100644 index 0000000000..78cc555448 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithValidConverter.java @@ -0,0 +1,10 @@ +package com.googlecode.androidannotations.rest; + +import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter; + +import com.googlecode.androidannotations.annotations.rest.Rest; + +@Rest(converters = { MappingJacksonHttpMessageConverter.class }) +public interface ClientWithValidConverter { + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithWrongConstructorConverter.java b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithWrongConstructorConverter.java new file mode 100644 index 0000000000..0a7d987807 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/ClientWithWrongConstructorConverter.java @@ -0,0 +1,8 @@ +package com.googlecode.androidannotations.rest; + +import com.googlecode.androidannotations.annotations.rest.Rest; + +@Rest(converters = { WrongConstructorConverter.class }) +public interface ClientWithWrongConstructorConverter { + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/RestConverterTest.java b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/RestConverterTest.java new file mode 100644 index 0000000000..0f591d7849 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/RestConverterTest.java @@ -0,0 +1,49 @@ +package com.googlecode.androidannotations.rest; + +import java.io.IOException; + +import org.junit.Before; +import org.junit.Test; + +import com.googlecode.androidannotations.AndroidAnnotationProcessor; +import com.googlecode.androidannotations.utils.AAProcessorTestHelper; + +public class RestConverterTest extends AAProcessorTestHelper { + + @Before + public void setup() { + addManifestProcessorParameter(RestConverterTest.class); + addProcessor(AndroidAnnotationProcessor.class); + } + + @Test + public void client_with_no_converters_compiles() { + CompileResult result = compileFiles(ClientWithNoConverters.class); + assertCompilationSuccessful(result); + } + + @Test + public void client_with_valid_converter_compiles() { + CompileResult result = compileFiles(ClientWithValidConverter.class); + assertCompilationSuccessful(result); + } + + @Test + public void client_with_abstract_converter_does_not_compile() throws IOException { + CompileResult result = compileFiles(ClientWithAbstractConverter.class); + assertCompilationErrorOn(ClientWithAbstractConverter.class, "@Rest", result); + } + + @Test + public void client_with_non_converter_does_not_compile() throws IOException { + CompileResult result = compileFiles(ClientWithNonConverter.class); + assertCompilationErrorOn(ClientWithNonConverter.class, "@Rest", result); + } + + @Test + public void client_with_wrong_constructor_converter_does_not_compile() throws IOException { + CompileResult result = compileFiles(ClientWithWrongConstructorConverter.class); + assertCompilationErrorOn(ClientWithWrongConstructorConverter.class, "@Rest", result); + } + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/RestTest.java b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/RestTest.java new file mode 100644 index 0000000000..22b555c945 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/RestTest.java @@ -0,0 +1,25 @@ +package com.googlecode.androidannotations.rest; + +import java.io.IOException; + +import org.junit.Before; +import org.junit.Test; + +import com.googlecode.androidannotations.AndroidAnnotationProcessor; +import com.googlecode.androidannotations.utils.AAProcessorTestHelper; + +public class RestTest extends AAProcessorTestHelper { + + @Before + public void setup() { + addManifestProcessorParameter(RestTest.class); + addProcessor(AndroidAnnotationProcessor.class); + } + + @Test + public void class_client_does_not_compile() throws IOException { + CompileResult result = compileFiles(ClassClient.class); + assertCompilationErrorOn(ClassClient.class, "@Rest", result); + } + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/WrongConstructorConverter.java b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/WrongConstructorConverter.java new file mode 100644 index 0000000000..f2833849d9 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/com/googlecode/androidannotations/rest/WrongConstructorConverter.java @@ -0,0 +1,31 @@ +package com.googlecode.androidannotations.rest; + +import java.io.IOException; + +import org.springframework.http.HttpInputMessage; +import org.springframework.http.HttpOutputMessage; +import org.springframework.http.converter.AbstractHttpMessageConverter; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.http.converter.HttpMessageNotWritableException; + +public class WrongConstructorConverter extends AbstractHttpMessageConverter { + + public WrongConstructorConverter(String someParam) { + } + + @Override + protected boolean supports(Class clazz) { + throw new UnsupportedOperationException(); + } + + @Override + protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { + throw new UnsupportedOperationException(); + } + + @Override + protected void writeInternal(String t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { + throw new UnsupportedOperationException(); + } + +} diff --git a/AndroidAnnotations/androidannotations/src/test/resources/com/googlecode/androidannotations/rest/AndroidManifest.xml b/AndroidAnnotations/androidannotations/src/test/resources/com/googlecode/androidannotations/rest/AndroidManifest.xml new file mode 100644 index 0000000000..47b599ab8d --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/resources/com/googlecode/androidannotations/rest/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/AndroidAnnotations/functional-test-1-5/pom.xml b/AndroidAnnotations/functional-test-1-5/pom.xml index fd6db0600e..4fa793129b 100644 --- a/AndroidAnnotations/functional-test-1-5/pom.xml +++ b/AndroidAnnotations/functional-test-1-5/pom.xml @@ -13,7 +13,7 @@ functional-test-1-5 - 1.0.0.M2 + 1.0.0.RELEASE 1.7.2 2.4.1 1.0.0-r2 @@ -79,12 +79,6 @@ - - - com.google.code.android-rome-feed-reader - android-rome-feed-reader - ${android-rome-version} - com.google.android support-v4 @@ -130,34 +124,4 @@ - - - - android-rome-feed-reader-repository - Android ROME Feed Reader Repository - https://android-rome-feed-reader.googlecode.com/svn/maven2/releases - - - - org.springframework.maven.snapshot - Spring Maven Snapshot Repository - http://maven.springframework.org/snapshot - - false - - - true - - - - - org.springframework.maven.milestone - Spring Maven Milestone Repository - http://maven.springframework.org/milestone - - false - - - - diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/com/googlecode/androidannotations/test15/rest/MyService.java b/AndroidAnnotations/functional-test-1-5/src/main/java/com/googlecode/androidannotations/test15/rest/MyService.java index 7cd1f0adec..5f99e46d5a 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/com/googlecode/androidannotations/test15/rest/MyService.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/com/googlecode/androidannotations/test15/rest/MyService.java @@ -20,6 +20,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -33,8 +34,8 @@ import com.googlecode.androidannotations.annotations.rest.Rest; import com.googlecode.androidannotations.api.rest.MediaType; -@Rest("http://company.com/ajax/services") -// if defined, the url will be added as a prefix to every request +// if defined, the rootUrl will be added as a prefix to every request +@Rest(rootUrl = "http://company.com/ajax/services", converters = { MappingJacksonHttpMessageConverter.class }) public interface MyService { // url variables are mapped to method parameter names. @@ -56,13 +57,16 @@ public interface MyService { * You may (or may not) declare throwing RestClientException (as a reminder, * since it's a RuntimeException), but nothing else. */ - ResponseEntity getEvents2(String location, int year) throws RestClientException; + ResponseEntity getEvents2(String location, int year) + throws RestClientException; @Get("/events/{year}/{location}") - ResponseEntity getEventsArray2(String location, int year) throws RestClientException; + ResponseEntity getEventsArray2(String location, int year) + throws RestClientException; @Get("/events/{year}/{location}") - ResponseEntity getEventsArrayOfArrays2(String location, int year) throws RestClientException; + ResponseEntity getEventsArrayOfArrays2(String location, int year) + throws RestClientException; // There should be max 1 parameter that is not mapped to an attribute. This // parameter will be used as the post entity. diff --git a/AndroidAnnotations/pom.xml b/AndroidAnnotations/pom.xml index 7b3f664d0a..dc2698dbbc 100644 --- a/AndroidAnnotations/pom.xml +++ b/AndroidAnnotations/pom.xml @@ -40,11 +40,21 @@ Owner + + mat.boniface + Mathieu Boniface + mat.boniface@gmail.com + eBusiness Information + http://www.ebusinessinformation.fr + + Committer + + athomas.nc Alexandre Thomas athomas.nc@gmail.com - http://twitter.com/twikeuk + http://twitter.com/AleksThomas eBusiness Information http://www.ebusinessinformation.fr @@ -71,16 +81,6 @@ Committer - - mat.boniface - Mathieu Boniface - mat.boniface@gmail.com - eBusiness Information - http://www.ebusinessinformation.fr - - Committer - -