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 extends Annotation> target) {
return target.getSimpleName() + "ed";
}
- public DeclaredType extractAnnotationClassParameter(Element element, Class extends Annotation> target) {
+ public List extractAnnotationClassArrayParameter(Element element, Class extends Annotation> target, String methodName) {
+ AnnotationMirror annotationMirror = findAnnotationMirror(element, target);
+
+ Map extends ExecutableElement, ? extends AnnotationValue> elementValues = annotationMirror.getElementValues();
+
+ for (Map.Entry extends ExecutableElement, ? extends AnnotationValue> 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 extends Annotation> target, String methodName) {
AnnotationMirror annotationMirror = findAnnotationMirror(element, target);
Map extends ExecutableElement, ? extends AnnotationValue> elementValues = annotationMirror.getElementValues();
for (Map.Entry extends ExecutableElement, ? extends AnnotationValue> 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 ext
return null;
}
+ public DeclaredType extractAnnotationClassParameter(Element element, Class extends Annotation> 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 extends Annotation> 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 extends Element> 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 extends VariableElement> 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 extends VariableElement> 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 extends Annotation> 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 extends String> 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
-
-