diff --git a/AndroidAnnotations/androidannotations-api/META-INF/MANIFEST.MF b/AndroidAnnotations/androidannotations-api/META-INF/MANIFEST.MF index de5056e665..c2618481b8 100644 --- a/AndroidAnnotations/androidannotations-api/META-INF/MANIFEST.MF +++ b/AndroidAnnotations/androidannotations-api/META-INF/MANIFEST.MF @@ -7,9 +7,7 @@ Export-Package: org.androidannotations.annotations, org.androidannotations.annotations.res, org.androidannotations.annotations.rest, org.androidannotations.annotations.sharedpreferences, - org.androidannotations.api, - org.androidannotations.api.rest, - org.androidannotations.api.sharedpreferences + org.androidannotations.api.rest Bundle-Vendor: androidannotations Bundle-Activator: org.androidannotations.api.Activator Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/EBean.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/EBean.java index 92bc6e6bc2..60e1239dc5 100644 --- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/EBean.java +++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/EBean.java @@ -20,8 +20,6 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.androidannotations.api.Scope; - /** * Should be used on custom classes to enable usage of AndroidAnnotations * @@ -36,6 +34,20 @@ @Target(ElementType.TYPE) public @interface EBean { + public enum Scope { + + /** + * A new instance of the bean is created each time it is needed + */ + Default, // + + /** + * A new instance of the bean is created the first time it is needed, it is + * then retained and the same instance is always returned. + */ + Singleton, // + } + Scope scope() default Scope.Default; } diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/sharedpreferences/Pref.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/sharedpreferences/Pref.java index 2e4ea20499..45bd1b1b31 100644 --- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/sharedpreferences/Pref.java +++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/sharedpreferences/Pref.java @@ -20,8 +20,6 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.androidannotations.api.sharedpreferences.SharedPreferencesHelper; - /** * Injects a {@link SharedPref} * diff --git a/AndroidAnnotations/androidannotations/pom.xml b/AndroidAnnotations/androidannotations/pom.xml index 95da94706c..49d21ae26c 100644 --- a/AndroidAnnotations/androidannotations/pom.xml +++ b/AndroidAnnotations/androidannotations/pom.xml @@ -33,7 +33,7 @@ com.google.android android 1.6_r2 - test + provided @@ -85,6 +85,12 @@ rebel.xml + + src/main/java + + org/androidannotations/api/** + + diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/BackgroundExecutor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/BackgroundExecutor.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/BackgroundExecutor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/BackgroundExecutor.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/SdkVersionHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/SdkVersionHelper.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/SdkVersionHelper.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/SdkVersionHelper.java diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/rest/MediaType.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/rest/MediaType.java new file mode 100644 index 0000000000..1ab765a905 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/rest/MediaType.java @@ -0,0 +1,41 @@ +/** + * Copyright (C) 2010-2012 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.api.rest; + +public final class MediaType { + + public final static String ALL = "*/*"; + public final static String APPLICATION_ATOM_XML = "application/atom+xml"; + public final static String APPLICATION_RSS_XML = "application/rss+xml"; + public final static String APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded"; + public final static String APPLICATION_JSON = "application/json"; + public final static String APPLICATION_OCTET_STREAM = "application/octet-stream"; + public final static String APPLICATION_XHTML_XML = "application/xhtml+xml"; + public final static String IMAGE_GIF = "image/gif"; + public final static String IMAGE_JPEG = "image/jpeg"; + public final static String IMAGE_PNG = "image/png"; + public final static String APPLICATION_XML = "application/xml"; + public final static String APPLICATION_WILDCARD_XML = "application/*+xml"; + public final static String MULTIPART_FORM_DATA = "multipart/form-data"; + public final static String TEXT_HTML = "text/html"; + public final static String TEXT_PLAIN = "text/plain"; + public final static String TEXT_XML = "text/xml"; + + private MediaType() { + + } + +} diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/AbstractPrefEditorField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/AbstractPrefEditorField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/AbstractPrefEditorField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/AbstractPrefEditorField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/AbstractPrefField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/AbstractPrefField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/AbstractPrefField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/AbstractPrefField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/BooleanPrefEditorField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/BooleanPrefEditorField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/BooleanPrefEditorField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/BooleanPrefEditorField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/BooleanPrefField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/BooleanPrefField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/BooleanPrefField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/BooleanPrefField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/EditorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/EditorHelper.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/EditorHelper.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/EditorHelper.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/FloatPrefEditorField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/FloatPrefEditorField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/FloatPrefEditorField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/FloatPrefEditorField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/FloatPrefField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/FloatPrefField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/FloatPrefField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/FloatPrefField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/IntPrefEditorField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/IntPrefEditorField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/IntPrefEditorField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/IntPrefEditorField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/IntPrefField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/IntPrefField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/IntPrefField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/IntPrefField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/LongPrefEditorField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/LongPrefEditorField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/LongPrefEditorField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/LongPrefEditorField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/LongPrefField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/LongPrefField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/LongPrefField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/LongPrefField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/SharedPreferencesCompat.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/SharedPreferencesCompat.java similarity index 97% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/SharedPreferencesCompat.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/SharedPreferencesCompat.java index eeb4ea5420..e1d0f5c554 100644 --- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/SharedPreferencesCompat.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/SharedPreferencesCompat.java @@ -25,7 +25,7 @@ * Reflection utils to call SharedPreferences$Editor.apply when possible, * falling back to commit when apply isn't available. */ -abstract class SharedPreferencesCompat { +public abstract class SharedPreferencesCompat { private SharedPreferencesCompat() { } diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/SharedPreferencesHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/SharedPreferencesHelper.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/SharedPreferencesHelper.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/SharedPreferencesHelper.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/StringPrefEditorField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/StringPrefEditorField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/StringPrefEditorField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/StringPrefEditorField.java diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/StringPrefField.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/StringPrefField.java similarity index 100% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/sharedpreferences/StringPrefField.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/sharedpreferences/StringPrefField.java diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/ApiCodeGenerator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/ApiCodeGenerator.java new file mode 100644 index 0000000000..fa85b7bf91 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/ApiCodeGenerator.java @@ -0,0 +1,84 @@ +/** + * Copyright (C) 2010-2012 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.generation; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Set; + +import javax.annotation.processing.Filer; +import javax.lang.model.element.Element; +import javax.tools.JavaFileObject; + +import org.androidannotations.processing.OriginatingElements; + +public class ApiCodeGenerator { + + private static final byte[] BUFFER = new byte[4096]; + + private static void copyStream(InputStream input, OutputStream output) throws IOException { + int read; + while ((read = input.read(BUFFER)) != -1) { + output.write(BUFFER, 0, read); + } + } + + private final Filer filer; + + public ApiCodeGenerator(Filer filer) { + this.filer = filer; + } + + public void writeApiClasses(Set> apiClassesToGenerate, OriginatingElements originatingElements) { + + for (Class apiClassToGenerate : apiClassesToGenerate) { + + String canonicalApiClassName = apiClassToGenerate.getCanonicalName(); + + String apiClassFileName = canonicalApiClassName.replace(".", "/") + ".java"; + + InputStream apiClassStream = getClass().getClassLoader().getResourceAsStream(apiClassFileName); + try { + + if (apiClassStream == null) { + /* + * This happens when in AA dev environment, when the + * processor classes are not coming from a jar + */ + apiClassStream = getClass().getClassLoader().getResourceAsStream('/' + apiClassFileName); + } + + Element[] apiClassOriginatingElements = originatingElements.getClassOriginatingElements(canonicalApiClassName); + + JavaFileObject targetedClassFile; + if (apiClassOriginatingElements == null) { + targetedClassFile = filer.createSourceFile(canonicalApiClassName); + } else { + targetedClassFile = filer.createSourceFile(canonicalApiClassName, apiClassOriginatingElements); + } + + OutputStream classFileOutputStream = targetedClassFile.openOutputStream(); + copyStream(apiClassStream, classFileOutputStream); + classFileOutputStream.close(); + + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/CodeModelGenerator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/CodeModelGenerator.java index 2ef6e35225..59a2d46a14 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/CodeModelGenerator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/CodeModelGenerator.java @@ -21,6 +21,7 @@ import javax.annotation.processing.Messager; import org.androidannotations.processing.ModelProcessor.ProcessResult; + import com.sun.codemodel.writer.PrologCodeWriter; public class CodeModelGenerator { @@ -35,11 +36,13 @@ public CodeModelGenerator(Filer filer, Messager messager) { public void generate(ProcessResult processResult) throws IOException { - SourceCodewriter sourceCodeWriter = new SourceCodewriter(filer, messager, processResult.originatingElementsByGeneratedClassQualifiedName); + ApiCodeGenerator apiCodeGenerator = new ApiCodeGenerator(filer); + apiCodeGenerator.writeApiClasses(processResult.apiClassesToGenerate, processResult.originatingElements); + + SourceCodewriter sourceCodeWriter = new SourceCodewriter(filer, messager, processResult.originatingElements); PrologCodeWriter prologCodeWriter = new PrologCodeWriter(sourceCodeWriter, "DO NOT EDIT THIS FILE, IT HAS BEEN GENERATED USING AndroidAnnotations.\n"); processResult.codeModel.build(prologCodeWriter, new ResourceCodeWriter(filer)); } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/SourceCodewriter.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/SourceCodewriter.java index 36227c52da..554bec9d76 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/SourceCodewriter.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/SourceCodewriter.java @@ -17,7 +17,6 @@ import java.io.IOException; import java.io.OutputStream; -import java.util.Map; import javax.annotation.processing.Filer; import javax.annotation.processing.FilerException; @@ -26,6 +25,8 @@ import javax.tools.Diagnostic.Kind; import javax.tools.JavaFileObject; +import org.androidannotations.processing.OriginatingElements; + import com.sun.codemodel.CodeWriter; import com.sun.codemodel.JPackage; @@ -35,7 +36,7 @@ public class SourceCodewriter extends CodeWriter { private final Messager message; private static final VoidOutputStream VOID_OUTPUT_STREAM = new VoidOutputStream(); - private Map originatingElementsByGeneratedClassQualifiedName; + private OriginatingElements originatingElements; private static class VoidOutputStream extends OutputStream { @Override @@ -44,10 +45,10 @@ public void write(int arg0) throws IOException { } } - public SourceCodewriter(Filer filer, Messager message, Map originatingElementsByGeneratedClassQualifiedName) { + public SourceCodewriter(Filer filer, Messager message, OriginatingElements originatingElements) { this.filer = filer; this.message = message; - this.originatingElementsByGeneratedClassQualifiedName = originatingElementsByGeneratedClassQualifiedName; + this.originatingElements = originatingElements; } @Override @@ -55,17 +56,17 @@ public OutputStream openBinary(JPackage pkg, String fileName) throws IOException String qualifiedClassName = toQualifiedClassName(pkg, fileName); message.printMessage(Kind.NOTE, "Generating source file: " + qualifiedClassName); - Element originatingElement = originatingElementsByGeneratedClassQualifiedName.get(qualifiedClassName); + Element[] classOriginatingElements = originatingElements.getClassOriginatingElements(qualifiedClassName); try { JavaFileObject sourceFile; - if (originatingElement != null) { - sourceFile = filer.createSourceFile(qualifiedClassName, originatingElement); - } else { + + if (classOriginatingElements.length == 0) { message.printMessage(Kind.NOTE, "Generating class with no originating element: " + qualifiedClassName); - sourceFile = filer.createSourceFile(qualifiedClassName); } + sourceFile = filer.createSourceFile(qualifiedClassName, classOriginatingElements); + return sourceFile.openOutputStream(); } catch (FilerException e) { message.printMessage(Kind.NOTE, "Could not generate source file for " + qualifiedClassName + ", message: " + e.getMessage()); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java index 742290944f..3caf134b0d 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java @@ -23,6 +23,7 @@ import org.androidannotations.annotations.Background; import org.androidannotations.api.BackgroundExecutor; import org.androidannotations.helper.APTCodeModelHelper; + import com.sun.codemodel.JClass; import com.sun.codemodel.JClassAlreadyExistsException; import com.sun.codemodel.JCodeModel; @@ -45,6 +46,8 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) t ExecutableElement executableElement = (ExecutableElement) element; + holder.generateApiClass(element, BackgroundExecutor.class); + JMethod delegatingMethod = helper.overrideAnnotatedMethod(executableElement, holder); JDefinedClass anonymousRunnableClass = helper.createDelegatingAnonymousRunnableClass(holder, delegatingMethod); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EActivityProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EActivityProcessor.java index ac8febafce..9dcd44e49e 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EActivityProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EActivityProcessor.java @@ -15,11 +15,11 @@ */ package org.androidannotations.processing; -import static org.androidannotations.helper.GreenDroidConstants.GREENDROID_ACTIVITIES_LIST_CLASS; import static com.sun.codemodel.JExpr._super; import static com.sun.codemodel.JExpr._this; import static com.sun.codemodel.JMod.PRIVATE; import static com.sun.codemodel.JMod.PUBLIC; +import static org.androidannotations.helper.GreenDroidConstants.GREENDROID_ACTIVITIES_LIST_CLASS; import java.lang.annotation.Annotation; import java.util.ArrayList; @@ -41,6 +41,7 @@ import org.androidannotations.helper.ModelConstants; import org.androidannotations.rclass.IRClass; import org.androidannotations.rclass.IRClass.Res; + import com.sun.codemodel.ClassType; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; @@ -167,7 +168,11 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHo setContentViewMethod(setContentViewMethodName, codeModel, holder, new JType[] { holder.classes().VIEW }, new String[] { "view" }); // Handling onBackPressed - if (hasOnBackPressedMethod(typeElement)) { + Element declaredOnBackPressedMethod = getOnBackPressedMethod(typeElement); + if (declaredOnBackPressedMethod != null) { + + eBeansHolder.generateApiClass(declaredOnBackPressedMethod, SdkVersionHelper.class); + JMethod onKeyDownMethod = holder.generatedClass.method(PUBLIC, codeModel.BOOLEAN, "onKeyDown"); onKeyDownMethod.annotate(Override.class); JVar keyCodeParam = onKeyDownMethod.param(codeModel.INT, "keyCode"); @@ -215,7 +220,7 @@ private void setContentViewMethod(String setContentViewMethodName, JCodeModel co body.invoke(holder.afterSetContentView); } - private boolean hasOnBackPressedMethod(TypeElement activityElement) { + private ExecutableElement getOnBackPressedMethod(TypeElement activityElement) { List allMembers = annotationHelper.getElementUtils().getAllMembers(activityElement); @@ -223,10 +228,10 @@ private boolean hasOnBackPressedMethod(TypeElement activityElement) { for (ExecutableElement activityInheritedMethod : activityInheritedMethods) { if (isCustomOnBackPressedMethod(activityInheritedMethod)) { - return true; + return activityInheritedMethod; } } - return false; + return null; } private boolean isCustomOnBackPressedMethod(ExecutableElement method) { diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java index 30b815c620..62dbeb33a6 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java @@ -18,9 +18,12 @@ import java.lang.annotation.Annotation; import java.util.HashMap; +import javax.lang.model.element.Element; + import org.androidannotations.annotations.EBean; import org.androidannotations.annotations.EViewGroup; import org.androidannotations.processing.EBeansHolder.Classes; + import com.sun.codemodel.JBlock; import com.sun.codemodel.JCase; import com.sun.codemodel.JClass; @@ -137,4 +140,8 @@ public JClass refClass(Class clazz) { return eBeansHolder.refClass(clazz); } + public void generateApiClass(Element originatingElement, Class apiClass) { + eBeansHolder.generateApiClass(originatingElement, apiClass); + } + } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanProcessor.java index f0763a45d7..058c738739 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanProcessor.java @@ -15,7 +15,6 @@ */ package org.androidannotations.processing; -import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX; import static com.sun.codemodel.JExpr._new; import static com.sun.codemodel.JExpr._null; import static com.sun.codemodel.JExpr.cast; @@ -23,6 +22,7 @@ import static com.sun.codemodel.JMod.PRIVATE; import static com.sun.codemodel.JMod.PUBLIC; import static com.sun.codemodel.JMod.STATIC; +import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX; import java.lang.annotation.Annotation; import java.util.List; @@ -33,9 +33,9 @@ import javax.lang.model.util.ElementFilter; import org.androidannotations.annotations.EBean; -import org.androidannotations.api.Scope; import org.androidannotations.helper.APTCodeModelHelper; import org.androidannotations.processing.EBeansHolder.Classes; + import com.sun.codemodel.ClassType; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; @@ -142,8 +142,8 @@ public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHo } EBean eBeanAnnotation = element.getAnnotation(EBean.class); - Scope eBeanScope = eBeanAnnotation.scope(); - boolean hasSingletonScope = eBeanScope == Scope.Singleton; + EBean.Scope eBeanScope = eBeanAnnotation.scope(); + boolean hasSingletonScope = eBeanScope == EBean.Scope.Singleton; { // Factory method diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java index 1d2e457976..090d001e82 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java @@ -21,11 +21,14 @@ import java.lang.annotation.Annotation; import java.sql.SQLException; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import javax.lang.model.element.Element; import org.androidannotations.helper.CanonicalNameConstants; + import com.sun.codemodel.JClass; import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JDefinedClass; @@ -144,7 +147,9 @@ public class Classes { private final Classes classes; - private final Map originatingElementsByGeneratedClassQualifiedName = new HashMap(); + private final Set> apiClassesToGenerate = new HashSet>(); + + private final OriginatingElements originatingElements = new OriginatingElements(); public EBeansHolder(JCodeModel codeModel) { this.codeModel = codeModel; @@ -161,7 +166,8 @@ private void preloadJavaLangClasses() { public EBeanHolder create(Element element, Class eBeanAnnotation, JDefinedClass generatedClass) { String qualifiedName = generatedClass.fullName(); - originatingElementsByGeneratedClassQualifiedName.put(qualifiedName, element); + + originatingElements.add(qualifiedName, element); EBeanHolder activityHolder = new EBeanHolder(this, eBeanAnnotation, generatedClass); eBeanHolders.put(element, activityHolder); @@ -206,8 +212,17 @@ public Classes classes() { return classes; } - public Map getOriginatingElementsByGeneratedClassQualifiedName() { - return originatingElementsByGeneratedClassQualifiedName; + public OriginatingElements getOriginatingElements() { + return originatingElements; + } + + public Set> getApiClassesToGenerate() { + return apiClassesToGenerate; + } + + public void generateApiClass(Element originatingElement, Class apiClass) { + originatingElements.add(apiClass.getCanonicalName(), originatingElement); + apiClassesToGenerate.add(apiClass); } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java index b81682ab43..687d9cf6db 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java @@ -18,7 +18,6 @@ import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.Set; import javax.lang.model.element.Element; @@ -28,17 +27,25 @@ import org.androidannotations.model.AnnotationElements; import org.androidannotations.model.AnnotationElements.AnnotatedAndRootElements; + import com.sun.codemodel.JCodeModel; public class ModelProcessor { public static class ProcessResult { + public final JCodeModel codeModel; - public final Map originatingElementsByGeneratedClassQualifiedName; + public final OriginatingElements originatingElements; + public final Set> apiClassesToGenerate; + + public ProcessResult(// + JCodeModel codeModel, // + OriginatingElements originatingElements, // + Set> apiClassesToGenerate) { - public ProcessResult(JCodeModel codeModel, Map originatingElementsByGeneratedClassQualifiedName) { this.codeModel = codeModel; - this.originatingElementsByGeneratedClassQualifiedName = originatingElementsByGeneratedClassQualifiedName; + this.originatingElements = originatingElements; + this.apiClassesToGenerate = apiClassesToGenerate; } } @@ -89,7 +96,6 @@ public ProcessResult process(AnnotationElements validatedModel) throws Exception if (annotatedElement instanceof TypeElement) { enclosingElement = annotatedElement; } else { - enclosingElement = annotatedElement.getEnclosingElement(); } @@ -120,7 +126,10 @@ public ProcessResult process(AnnotationElements validatedModel) throws Exception } } - return new ProcessResult(codeModel, eBeansHolder.getOriginatingElementsByGeneratedClassQualifiedName()); + return new ProcessResult(// + codeModel, // + eBeansHolder.getOriginatingElements(), // + eBeansHolder.getApiClassesToGenerate()); } private boolean isAbstractClass(Element annotatedElement) { diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OriginatingElements.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OriginatingElements.java new file mode 100644 index 0000000000..a14e8c7789 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OriginatingElements.java @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2010-2012 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.processing; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.lang.model.element.Element; + +public class OriginatingElements { + + private final Map> originatingElementsByClassName = new HashMap>(); + + public void add(String qualifiedName, Element element) { + List originatingElements = originatingElementsByClassName.get(qualifiedName); + if (originatingElements == null) { + originatingElements = new ArrayList(); + originatingElementsByClassName.put(qualifiedName, originatingElements); + } + originatingElements.add(element); + } + + public Element[] getClassOriginatingElements(String className) { + List originatingElements = originatingElementsByClassName.get(className); + if (originatingElements == null) { + return new Element[0]; + } else { + return originatingElements.toArray(new Element[originatingElements.size()]); + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SharedPrefProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SharedPrefProcessor.java index b34d0dfc9f..61f3608c7a 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SharedPrefProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SharedPrefProcessor.java @@ -38,6 +38,8 @@ import org.androidannotations.annotations.sharedpreferences.DefaultString; import org.androidannotations.annotations.sharedpreferences.SharedPref; import org.androidannotations.annotations.sharedpreferences.SharedPref.Scope; +import org.androidannotations.api.sharedpreferences.AbstractPrefEditorField; +import org.androidannotations.api.sharedpreferences.AbstractPrefField; import org.androidannotations.api.sharedpreferences.BooleanPrefEditorField; import org.androidannotations.api.sharedpreferences.BooleanPrefField; import org.androidannotations.api.sharedpreferences.EditorHelper; @@ -47,10 +49,12 @@ import org.androidannotations.api.sharedpreferences.IntPrefField; import org.androidannotations.api.sharedpreferences.LongPrefEditorField; import org.androidannotations.api.sharedpreferences.LongPrefField; +import org.androidannotations.api.sharedpreferences.SharedPreferencesCompat; import org.androidannotations.api.sharedpreferences.SharedPreferencesHelper; import org.androidannotations.api.sharedpreferences.StringPrefEditorField; import org.androidannotations.api.sharedpreferences.StringPrefField; import org.androidannotations.helper.ModelConstants; + import com.sun.codemodel.ClassType; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; @@ -93,8 +97,9 @@ public Class getTarget() { @Override public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - TypeElement typeElement = (TypeElement) element; + generateApiClass(element, eBeansHolder); + TypeElement typeElement = (TypeElement) element; String interfaceQualifiedName = typeElement.getQualifiedName().toString(); String interfaceSimpleName = typeElement.getSimpleName().toString(); @@ -270,4 +275,22 @@ private JMethod getLocalClassName(EBeansHolder eBeansHolder, JDefinedClass helpe return getLocalClassName; } + + private void generateApiClass(Element originatingElement, EBeansHolder eBeansHolder) { + eBeansHolder.generateApiClass(originatingElement, AbstractPrefEditorField.class); + eBeansHolder.generateApiClass(originatingElement, AbstractPrefField.class); + eBeansHolder.generateApiClass(originatingElement, BooleanPrefEditorField.class); + eBeansHolder.generateApiClass(originatingElement, BooleanPrefField.class); + eBeansHolder.generateApiClass(originatingElement, EditorHelper.class); + eBeansHolder.generateApiClass(originatingElement, FloatPrefEditorField.class); + eBeansHolder.generateApiClass(originatingElement, FloatPrefField.class); + eBeansHolder.generateApiClass(originatingElement, IntPrefEditorField.class); + eBeansHolder.generateApiClass(originatingElement, IntPrefField.class); + eBeansHolder.generateApiClass(originatingElement, LongPrefEditorField.class); + eBeansHolder.generateApiClass(originatingElement, LongPrefField.class); + eBeansHolder.generateApiClass(originatingElement, SharedPreferencesCompat.class); + eBeansHolder.generateApiClass(originatingElement, SharedPreferencesHelper.class); + eBeansHolder.generateApiClass(originatingElement, StringPrefEditorField.class); + eBeansHolder.generateApiClass(originatingElement, StringPrefField.class); + } } diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/Scope.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/ActivityWithBackgroundMethod.java similarity index 67% rename from AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/Scope.java rename to AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/ActivityWithBackgroundMethod.java index c632d0a2c0..2cdbfb2191 100644 --- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/api/Scope.java +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/ActivityWithBackgroundMethod.java @@ -13,19 +13,19 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.api; +package org.androidannotations.generation; -public enum Scope { +import org.androidannotations.annotations.Background; +import org.androidannotations.annotations.EActivity; - /** - * A new instance of the bean is created each time it is needed - */ - Default, // +import android.app.Activity; + +@EActivity +public class ActivityWithBackgroundMethod extends Activity { + + @Background + public void executingOnBackground() { + + } - /** - * A new instance of the bean is created the first time it is needed, it is - * then retained and the same instance is always returned. - */ - Singleton, // - ; } diff --git a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/ActivityWithOnBackPressedMethod.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/ActivityWithOnBackPressedMethod.java new file mode 100644 index 0000000000..1b402b4a07 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/ActivityWithOnBackPressedMethod.java @@ -0,0 +1,28 @@ +/** + * Copyright (C) 2010-2012 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.generation; + +import org.androidannotations.annotations.EActivity; + +import android.app.Activity; + +@EActivity +public class ActivityWithOnBackPressedMethod extends Activity { + + public void onBackPressed() { + } + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/OnBackPressedApiDependenciesTest.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/OnBackPressedApiDependenciesTest.java new file mode 100644 index 0000000000..76e3a29c8a --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/OnBackPressedApiDependenciesTest.java @@ -0,0 +1,49 @@ +/** + * Copyright (C) 2010-2012 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.generation; + +import java.io.IOException; + +import org.androidannotations.AndroidAnnotationProcessor; +import org.androidannotations.api.SdkVersionHelper; +import org.androidannotations.utils.AAProcessorTestHelper; +import org.junit.Before; +import org.junit.Test; + +public class OnBackPressedApiDependenciesTest extends AAProcessorTestHelper { + + @Before + public void setup() { + addManifestProcessorParameter(OnBackPressedApiDependenciesTest.class); + addProcessor(AndroidAnnotationProcessor.class); + ensureOutputDirectoryIsEmpty(); + } + + @Test + public void activity_with_on_back_pressed_generate_api_dependency() throws IOException { + CompileResult result = compileFiles(ActivityWithOnBackPressedMethod.class); + assertClassSourcesGeneratedToOutput(SdkVersionHelper.class); + assertCompilationSuccessful(result); + } + + @Test + public void activity_without_on_back_pressed_do_not_generate_api_dependency() throws IOException { + CompileResult result = compileFiles(ActivityWithBackgroundMethod.class); + assertClassSourcesNotGeneratedToOutput(SdkVersionHelper.class); + assertCompilationSuccessful(result); + } + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/OnBackgroundApiDependenciesTest.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/OnBackgroundApiDependenciesTest.java new file mode 100644 index 0000000000..b55e82c1e2 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/OnBackgroundApiDependenciesTest.java @@ -0,0 +1,49 @@ +/** + * Copyright (C) 2010-2012 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.generation; + +import java.io.IOException; + +import org.androidannotations.AndroidAnnotationProcessor; +import org.androidannotations.api.BackgroundExecutor; +import org.androidannotations.utils.AAProcessorTestHelper; +import org.junit.Before; +import org.junit.Test; + +public class OnBackgroundApiDependenciesTest extends AAProcessorTestHelper { + + @Before + public void setup() { + addManifestProcessorParameter(OnBackgroundApiDependenciesTest.class); + addProcessor(AndroidAnnotationProcessor.class); + ensureOutputDirectoryIsEmpty(); + } + + @Test + public void activity_with_background_annotated_method_generate_api_dependency() throws IOException { + CompileResult result = compileFiles(ActivityWithBackgroundMethod.class); + assertClassSourcesGeneratedToOutput(BackgroundExecutor.class); + assertCompilationSuccessful(result); + } + + @Test + public void activity_without_background_annotated_method_generate_api_dependency() throws IOException { + CompileResult result = compileFiles(ActivityWithOnBackPressedMethod.class); + assertClassSourcesNotGeneratedToOutput(BackgroundExecutor.class); + assertCompilationSuccessful(result); + } + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/SharedPrefs.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/SharedPrefs.java new file mode 100644 index 0000000000..6fde4e6e2b --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/SharedPrefs.java @@ -0,0 +1,36 @@ +/** + * Copyright (C) 2010-2012 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.generation; + +import org.androidannotations.annotations.sharedpreferences.DefaultInt; +import org.androidannotations.annotations.sharedpreferences.DefaultString; +import org.androidannotations.annotations.sharedpreferences.SharedPref; + +@SharedPref +public interface SharedPrefs { + + // The field name will have default value "John" + @DefaultString("John") + String name(); + + // The field age will have default value 42 + @DefaultInt(42) + int age(); + + // The field lastUpdated will have default value 0 + long lastUpdated(); + +} \ No newline at end of file diff --git a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/SharedPrefsApiDependenciesTest.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/SharedPrefsApiDependenciesTest.java new file mode 100644 index 0000000000..f4698dd5ad --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/SharedPrefsApiDependenciesTest.java @@ -0,0 +1,83 @@ +/** + * Copyright (C) 2010-2012 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.generation; + +import java.io.IOException; + +import org.androidannotations.AndroidAnnotationProcessor; +import org.androidannotations.api.sharedpreferences.AbstractPrefEditorField; +import org.androidannotations.api.sharedpreferences.AbstractPrefField; +import org.androidannotations.api.sharedpreferences.BooleanPrefEditorField; +import org.androidannotations.api.sharedpreferences.BooleanPrefField; +import org.androidannotations.api.sharedpreferences.EditorHelper; +import org.androidannotations.api.sharedpreferences.FloatPrefEditorField; +import org.androidannotations.api.sharedpreferences.FloatPrefField; +import org.androidannotations.api.sharedpreferences.IntPrefEditorField; +import org.androidannotations.api.sharedpreferences.IntPrefField; +import org.androidannotations.api.sharedpreferences.LongPrefEditorField; +import org.androidannotations.api.sharedpreferences.LongPrefField; +import org.androidannotations.api.sharedpreferences.SharedPreferencesCompat; +import org.androidannotations.api.sharedpreferences.SharedPreferencesHelper; +import org.androidannotations.api.sharedpreferences.StringPrefEditorField; +import org.androidannotations.api.sharedpreferences.StringPrefField; +import org.androidannotations.manifest.SomeClass; +import org.androidannotations.utils.AAProcessorTestHelper; +import org.junit.Before; +import org.junit.Test; + +public class SharedPrefsApiDependenciesTest extends AAProcessorTestHelper { + + private static final Class[] SHARED_PREF_API_DEPENDENCIES = new Class[] { AbstractPrefEditorField.class,// + AbstractPrefField.class,// + BooleanPrefEditorField.class,// + BooleanPrefField.class,// + EditorHelper.class,// + FloatPrefEditorField.class,// + FloatPrefField.class,// + IntPrefEditorField.class,// + IntPrefField.class,// + LongPrefEditorField.class,// + LongPrefField.class,// + SharedPreferencesCompat.class,// + SharedPreferencesHelper.class,// + StringPrefEditorField.class,// + StringPrefField.class // + }; + + @Before + public void setup() { + addManifestProcessorParameter(SharedPrefsApiDependenciesTest.class); + addProcessor(AndroidAnnotationProcessor.class); + ensureOutputDirectoryIsEmpty(); + } + + @Test + public void shared_prefs_generate_api_dependencies() throws IOException { + compileFiles(SharedPrefs.class); + for (Class apiDependency : SHARED_PREF_API_DEPENDENCIES) { + assertClassSourcesGeneratedToOutput(apiDependency); + } + } + + @Test + public void class_without_prefs_do_not_generate_api_dependencies() throws IOException { + compileFiles(SomeClass.class); + for (Class apiDependency : SHARED_PREF_API_DEPENDENCIES) { + assertClassSourcesNotGeneratedToOutput(apiDependency); + } + } + +} diff --git a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/utils/ProcessorTestHelper.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/utils/ProcessorTestHelper.java index 4980cfe9b6..0cf057a9be 100644 --- a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/utils/ProcessorTestHelper.java +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/utils/ProcessorTestHelper.java @@ -68,6 +68,31 @@ public static void assertOutput(File expectedResult, File output) { } } + public static void assertClassSourcesGeneratedToOutput(Class clazz) { + + String canonicalName = clazz.getCanonicalName(); + String filePath = canonicalName.replace(".", "/").concat(".java"); + + File generatedSourcesDir = new File(OUTPUT_DIRECTORY); + File generatedSourceFile = new File(generatedSourcesDir, filePath); + + File sourcesDir = new File(MAIN_SOURCE_FOLDER); + File expectedResult = new File(sourcesDir, filePath); + + assertOutput(expectedResult, generatedSourceFile); + } + + public static void assertClassSourcesNotGeneratedToOutput(Class clazz) { + + String canonicalName = clazz.getCanonicalName(); + String filePath = canonicalName.replace(".", "/").concat(".java"); + + File generatedSourcesDir = new File(OUTPUT_DIRECTORY); + File output = new File(generatedSourcesDir, filePath); + + assertFalse(output.exists()); + } + public static void assertCompilationSuccessful(CompileResult result) { for (Diagnostic diagnostic : result.diagnostics) { assertFalse("Expected no errors, found " + diagnostic, diagnostic.getKind().equals(Kind.ERROR)); @@ -244,12 +269,37 @@ public void assertCompilationWarningOn(Class expectedErrorClass, String expec } private File ensureOutputDirectory() { - File file = new File(OUTPUT_DIRECTORY); - if (!file.exists()) { - file.mkdirs(); + File outputDir = new File(OUTPUT_DIRECTORY); + if (!outputDir.exists()) { + outputDir.mkdirs(); } - return file; + return outputDir; + } + + public void ensureOutputDirectoryIsEmpty() { + File outputDir = new File(OUTPUT_DIRECTORY); + + String[] childs = outputDir.list(); + + if (childs != null && childs.length > 0) { + deleteDirectoryRecursively(outputDir); + outputDir.mkdirs(); + } + } + + private void deleteDirectoryRecursively(File directory) { + File[] childs = directory.listFiles(); + if (childs != null) { + for (File file : childs) { + if (file.isDirectory()) { + deleteDirectoryRecursively(file); + } else { + file.delete(); + } + } + } + directory.delete(); } private void addCollection(List files, Collection compilationUnits) { diff --git a/AndroidAnnotations/androidannotations/src/test/resources/org/androidannotations/generation/AndroidManifest.xml b/AndroidAnnotations/androidannotations/src/test/resources/org/androidannotations/generation/AndroidManifest.xml new file mode 100644 index 0000000000..01cc00b674 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/test/resources/org/androidannotations/generation/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ebean/SomeSingleton.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ebean/SomeSingleton.java index 2ed5458bcd..cd3d4e1724 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ebean/SomeSingleton.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ebean/SomeSingleton.java @@ -15,14 +15,13 @@ */ package org.androidannotations.test15.ebean; -import static org.androidannotations.api.Scope.Singleton; - -import android.content.Context; - import org.androidannotations.annotations.EBean; +import org.androidannotations.annotations.EBean.Scope; import org.androidannotations.annotations.RootContext; -@EBean(scope = Singleton) +import android.content.Context; + +@EBean(scope = Scope.Singleton) public class SomeSingleton { @RootContext