diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java index 1f9c9109cd..d880430808 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/AndroidAnnotationProcessor.java @@ -16,18 +16,13 @@ package org.androidannotations; import static org.androidannotations.helper.AndroidManifestFinder.ANDROID_MANIFEST_FILE_OPTION; -import static org.androidannotations.helper.CanonicalNameConstants.PRODUCE; -import static org.androidannotations.helper.CanonicalNameConstants.SUBSCRIBE; import static org.androidannotations.helper.ModelConstants.TRACE_OPTION; import static org.androidannotations.rclass.ProjectRClassFinder.RESOURCE_PACKAGE_NAME_OPTION; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; -import java.util.Collections; -import java.util.HashSet; import java.util.Iterator; -import java.util.Map; import java.util.Properties; import java.util.Set; @@ -42,246 +37,23 @@ import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; -import org.androidannotations.annotations.AfterInject; -import org.androidannotations.annotations.AfterTextChange; -import org.androidannotations.annotations.AfterViews; -import org.androidannotations.annotations.App; -import org.androidannotations.annotations.Background; -import org.androidannotations.annotations.Bean; -import org.androidannotations.annotations.BeforeTextChange; -import org.androidannotations.annotations.CheckedChange; -import org.androidannotations.annotations.Click; -import org.androidannotations.annotations.CustomTitle; import org.androidannotations.annotations.EActivity; -import org.androidannotations.annotations.EApplication; -import org.androidannotations.annotations.EBean; -import org.androidannotations.annotations.EFragment; -import org.androidannotations.annotations.EIntentService; -import org.androidannotations.annotations.EProvider; -import org.androidannotations.annotations.EReceiver; -import org.androidannotations.annotations.EService; -import org.androidannotations.annotations.EView; -import org.androidannotations.annotations.EViewGroup; -import org.androidannotations.annotations.Extra; -import org.androidannotations.annotations.FocusChange; -import org.androidannotations.annotations.FragmentArg; -import org.androidannotations.annotations.FragmentById; -import org.androidannotations.annotations.FragmentByTag; -import org.androidannotations.annotations.FromHtml; -import org.androidannotations.annotations.Fullscreen; -import org.androidannotations.annotations.HierarchyViewerSupport; -import org.androidannotations.annotations.HttpsClient; -import org.androidannotations.annotations.InstanceState; -import org.androidannotations.annotations.ItemClick; -import org.androidannotations.annotations.ItemLongClick; -import org.androidannotations.annotations.ItemSelect; -import org.androidannotations.annotations.LongClick; -import org.androidannotations.annotations.NoTitle; -import org.androidannotations.annotations.NonConfigurationInstance; -import org.androidannotations.annotations.OnActivityResult; -import org.androidannotations.annotations.OptionsItem; -import org.androidannotations.annotations.OptionsMenu; -import org.androidannotations.annotations.OptionsMenuItem; -import org.androidannotations.annotations.OrmLiteDao; -import org.androidannotations.annotations.RoboGuice; -import org.androidannotations.annotations.RootContext; -import org.androidannotations.annotations.SeekBarProgressChange; -import org.androidannotations.annotations.SeekBarTouchStart; -import org.androidannotations.annotations.SeekBarTouchStop; -import org.androidannotations.annotations.ServiceAction; -import org.androidannotations.annotations.SystemService; -import org.androidannotations.annotations.TextChange; -import org.androidannotations.annotations.Touch; -import org.androidannotations.annotations.Trace; -import org.androidannotations.annotations.Transactional; -import org.androidannotations.annotations.UiThread; -import org.androidannotations.annotations.ViewById; -import org.androidannotations.annotations.WindowFeature; -import org.androidannotations.annotations.res.AnimationRes; -import org.androidannotations.annotations.res.BooleanRes; -import org.androidannotations.annotations.res.ColorRes; -import org.androidannotations.annotations.res.ColorStateListRes; -import org.androidannotations.annotations.res.DimensionPixelOffsetRes; -import org.androidannotations.annotations.res.DimensionPixelSizeRes; -import org.androidannotations.annotations.res.DimensionRes; -import org.androidannotations.annotations.res.DrawableRes; -import org.androidannotations.annotations.res.HtmlRes; -import org.androidannotations.annotations.res.IntArrayRes; -import org.androidannotations.annotations.res.IntegerRes; -import org.androidannotations.annotations.res.LayoutRes; -import org.androidannotations.annotations.res.MovieRes; -import org.androidannotations.annotations.res.StringArrayRes; -import org.androidannotations.annotations.res.StringRes; -import org.androidannotations.annotations.res.TextArrayRes; -import org.androidannotations.annotations.res.TextRes; -import org.androidannotations.annotations.rest.Accept; -import org.androidannotations.annotations.rest.Delete; -import org.androidannotations.annotations.rest.Get; -import org.androidannotations.annotations.rest.Head; -import org.androidannotations.annotations.rest.Options; -import org.androidannotations.annotations.rest.Post; -import org.androidannotations.annotations.rest.Put; -import org.androidannotations.annotations.rest.Rest; -import org.androidannotations.annotations.rest.RestService; -import org.androidannotations.annotations.sharedpreferences.Pref; -import org.androidannotations.annotations.sharedpreferences.SharedPref; import org.androidannotations.exception.ProcessingException; import org.androidannotations.exception.VersionMismatchException; import org.androidannotations.generation.CodeModelGenerator; +import org.androidannotations.handler.AnnotationHandlers; import org.androidannotations.helper.AndroidManifest; import org.androidannotations.helper.AndroidManifestFinder; import org.androidannotations.helper.ErrorHelper; import org.androidannotations.helper.Option; -import org.androidannotations.helper.TimeStats; -import org.androidannotations.model.AndroidRes; -import org.androidannotations.model.AndroidSystemServices; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.model.AnnotationElementsHolder; -import org.androidannotations.model.ModelExtractor; -import org.androidannotations.processing.AfterInjectProcessor; -import org.androidannotations.processing.AfterTextChangeProcessor; -import org.androidannotations.processing.AfterViewsProcessor; -import org.androidannotations.processing.AppProcessor; -import org.androidannotations.processing.BackgroundProcessor; -import org.androidannotations.processing.BeanProcessor; -import org.androidannotations.processing.BeforeTextChangeProcessor; -import org.androidannotations.processing.CheckedChangeProcessor; -import org.androidannotations.processing.ClickProcessor; -import org.androidannotations.processing.CustomTitleProcessor; -import org.androidannotations.processing.EActivityProcessor; -import org.androidannotations.processing.EApplicationProcessor; -import org.androidannotations.processing.EBeanProcessor; -import org.androidannotations.processing.EFragmentProcessor; -import org.androidannotations.processing.EIntentServiceProcessor; -import org.androidannotations.processing.EProviderProcessor; -import org.androidannotations.processing.EReceiverProcessor; -import org.androidannotations.processing.EServiceProcessor; -import org.androidannotations.processing.EViewGroupProcessor; -import org.androidannotations.processing.EViewProcessor; -import org.androidannotations.processing.ExtraProcessor; -import org.androidannotations.processing.FocusChangeProcessor; -import org.androidannotations.processing.FragmentArgProcessor; -import org.androidannotations.processing.FragmentByIdProcessor; -import org.androidannotations.processing.FragmentByTagProcessor; -import org.androidannotations.processing.FromHtmlProcessor; -import org.androidannotations.processing.FullscreenProcessor; -import org.androidannotations.processing.HierarchyViewerSupportProcessor; -import org.androidannotations.processing.HttpsClientProcessor; -import org.androidannotations.processing.InstanceStateProcessor; -import org.androidannotations.processing.ItemClickProcessor; -import org.androidannotations.processing.ItemLongClickProcessor; -import org.androidannotations.processing.ItemSelectedProcessor; -import org.androidannotations.processing.LongClickProcessor; -import org.androidannotations.processing.ModelProcessor; -import org.androidannotations.processing.ModelProcessor.ProcessResult; -import org.androidannotations.processing.NoTitleProcessor; -import org.androidannotations.processing.NonConfigurationInstanceProcessor; -import org.androidannotations.processing.OnActivityResultProcessor; -import org.androidannotations.processing.OptionsItemProcessor; -import org.androidannotations.processing.OptionsMenuItemProcessor; -import org.androidannotations.processing.OptionsMenuProcessor; -import org.androidannotations.processing.OrmLiteDaoProcessor; -import org.androidannotations.processing.PrefProcessor; -import org.androidannotations.processing.ProduceProcessor; -import org.androidannotations.processing.ResProcessor; -import org.androidannotations.processing.RestServiceProcessor; -import org.androidannotations.processing.RoboGuiceProcessor; -import org.androidannotations.processing.RootContextProcessor; -import org.androidannotations.processing.SeekBarProgressChangeProcessor; -import org.androidannotations.processing.SeekBarTouchStartProcessor; -import org.androidannotations.processing.SeekBarTouchStopProcessor; -import org.androidannotations.processing.ServiceActionProcessor; -import org.androidannotations.processing.SharedPrefProcessor; -import org.androidannotations.processing.SubscribeProcessor; -import org.androidannotations.processing.SystemServiceProcessor; -import org.androidannotations.processing.TextChangeProcessor; -import org.androidannotations.processing.TouchProcessor; -import org.androidannotations.processing.TraceProcessor; -import org.androidannotations.processing.TransactionalProcessor; -import org.androidannotations.processing.UiThreadProcessor; -import org.androidannotations.processing.ViewByIdProcessor; -import org.androidannotations.processing.WindowFeatureProcessor; -import org.androidannotations.processing.rest.DeleteProcessor; -import org.androidannotations.processing.rest.GetProcessor; -import org.androidannotations.processing.rest.HeadProcessor; -import org.androidannotations.processing.rest.OptionsProcessor; -import org.androidannotations.processing.rest.PostProcessor; -import org.androidannotations.processing.rest.PutProcessor; -import org.androidannotations.processing.rest.RestImplementationsHolder; -import org.androidannotations.processing.rest.RestProcessor; +import org.androidannotations.model.*; +import org.androidannotations.process.ModelProcessor; +import org.androidannotations.process.ModelValidator; +import org.androidannotations.process.TimeStats; import org.androidannotations.rclass.AndroidRClassFinder; import org.androidannotations.rclass.CoumpoundRClass; import org.androidannotations.rclass.IRClass; import org.androidannotations.rclass.ProjectRClassFinder; -import org.androidannotations.validation.AfterInjectValidator; -import org.androidannotations.validation.AfterTextChangeValidator; -import org.androidannotations.validation.AfterViewsValidator; -import org.androidannotations.validation.AppValidator; -import org.androidannotations.validation.BeanValidator; -import org.androidannotations.validation.BeforeTextChangeValidator; -import org.androidannotations.validation.CheckedChangeValidator; -import org.androidannotations.validation.ClickValidator; -import org.androidannotations.validation.CustomTitleValidator; -import org.androidannotations.validation.EActivityValidator; -import org.androidannotations.validation.EApplicationValidator; -import org.androidannotations.validation.EBeanValidator; -import org.androidannotations.validation.EFragmentValidator; -import org.androidannotations.validation.EIntentServiceValidator; -import org.androidannotations.validation.EProviderValidator; -import org.androidannotations.validation.EReceiverValidator; -import org.androidannotations.validation.EServiceValidator; -import org.androidannotations.validation.EViewGroupValidator; -import org.androidannotations.validation.EViewValidator; -import org.androidannotations.validation.ExtraValidator; -import org.androidannotations.validation.FocusChangeValidator; -import org.androidannotations.validation.FragmentArgValidator; -import org.androidannotations.validation.FragmentByIdValidator; -import org.androidannotations.validation.FragmentByTagValidator; -import org.androidannotations.validation.FromHtmlValidator; -import org.androidannotations.validation.FullscreenValidator; -import org.androidannotations.validation.HierarchyViewerSupportValidator; -import org.androidannotations.validation.HttpsClientValidator; -import org.androidannotations.validation.InstanceStateValidator; -import org.androidannotations.validation.ItemClickValidator; -import org.androidannotations.validation.ItemLongClickValidator; -import org.androidannotations.validation.ItemSelectedValidator; -import org.androidannotations.validation.LongClickValidator; -import org.androidannotations.validation.ModelValidator; -import org.androidannotations.validation.NoTitleValidator; -import org.androidannotations.validation.NonConfigurationInstanceValidator; -import org.androidannotations.validation.OnActivityResultValidator; -import org.androidannotations.validation.OptionsItemValidator; -import org.androidannotations.validation.OptionsMenuItemValidator; -import org.androidannotations.validation.OptionsMenuValidator; -import org.androidannotations.validation.OrmLiteDaoValidator; -import org.androidannotations.validation.PrefValidator; -import org.androidannotations.validation.ProduceValidator; -import org.androidannotations.validation.ResValidator; -import org.androidannotations.validation.RestServiceValidator; -import org.androidannotations.validation.RoboGuiceValidator; -import org.androidannotations.validation.RootContextValidator; -import org.androidannotations.validation.RunnableValidator; -import org.androidannotations.validation.SeekBarProgressChangeValidator; -import org.androidannotations.validation.SeekBarTouchStartValidator; -import org.androidannotations.validation.SeekBarTouchStopValidator; -import org.androidannotations.validation.ServiceActionValidator; -import org.androidannotations.validation.SharedPrefValidator; -import org.androidannotations.validation.SubscribeValidator; -import org.androidannotations.validation.SystemServiceValidator; -import org.androidannotations.validation.TextChangeValidator; -import org.androidannotations.validation.TouchValidator; -import org.androidannotations.validation.TraceValidator; -import org.androidannotations.validation.TransactionalValidator; -import org.androidannotations.validation.ViewByIdValidator; -import org.androidannotations.validation.WindowFeatureValidator; -import org.androidannotations.validation.rest.AcceptValidator; -import org.androidannotations.validation.rest.DeleteValidator; -import org.androidannotations.validation.rest.GetValidator; -import org.androidannotations.validation.rest.HeadValidator; -import org.androidannotations.validation.rest.OptionsValidator; -import org.androidannotations.validation.rest.PostValidator; -import org.androidannotations.validation.rest.PutValidator; -import org.androidannotations.validation.rest.RestValidator; @SupportedSourceVersion(SourceVersion.RELEASE_6) @SupportedOptions({ TRACE_OPTION, ANDROID_MANIFEST_FILE_OPTION, RESOURCE_PACKAGE_NAME_OPTION }) @@ -290,10 +62,9 @@ public class AndroidAnnotationProcessor extends AbstractProcessor { private final Properties properties = new Properties(); private final Properties propertiesApi = new Properties(); private final TimeStats timeStats = new TimeStats(); + private AnnotationHandlers annotationHandlers; private final ErrorHelper errorHelper = new ErrorHelper(); - private Set supportedAnnotationNames; - @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); @@ -308,9 +79,9 @@ public synchronized void init(ProcessingEnvironment processingEnv) { } timeStats.setMessager(messager); - messager.printMessage(Diagnostic.Kind.NOTE, "Starting AndroidAnnotations annotation processing"); + annotationHandlers = new AnnotationHandlers(processingEnv); } private void checkApiAndCoreVersions() throws VersionMismatchException { @@ -393,9 +164,11 @@ private void processThrowing(Set annotations, RoundEnviro AndroidSystemServices androidSystemServices = new AndroidSystemServices(); - AnnotationElements validatedModel = validateAnnotations(extractedModel, rClass, androidSystemServices, androidManifest); + annotationHandlers.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + + AnnotationElements validatedModel = validateAnnotations(extractedModel); - ProcessResult processResult = processAnnotations(validatedModel, rClass, androidSystemServices, androidManifest); + ModelProcessor.ProcessResult processResult = processAnnotations(validatedModel); generateSources(processResult); } @@ -441,196 +214,24 @@ private Option findRClasses(AndroidManifest androidManifest) throws IOE return Option.of(coumpoundRClass); } - private AnnotationElements validateAnnotations(AnnotationElementsHolder extractedModel, IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) throws ProcessingException, Exception { + private AnnotationElements validateAnnotations(AnnotationElementsHolder extractedModel) throws ProcessingException, Exception { timeStats.start("Validate Annotations"); - ModelValidator modelValidator = buildModelValidator(rClass, androidSystemServices, androidManifest); + ModelValidator modelValidator = new ModelValidator(annotationHandlers); AnnotationElements validatedAnnotations = modelValidator.validate(extractedModel); timeStats.stop("Validate Annotations"); return validatedAnnotations; } - private ModelValidator buildModelValidator(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { - ModelValidator modelValidator = new ModelValidator(); - modelValidator.register(new EApplicationValidator(processingEnv, androidManifest)); - modelValidator.register(new EActivityValidator(processingEnv, rClass, androidManifest)); - modelValidator.register(new EServiceValidator(processingEnv, androidManifest)); - modelValidator.register(new EIntentServiceValidator(processingEnv, androidManifest)); - modelValidator.register(new EReceiverValidator(processingEnv, androidManifest)); - modelValidator.register(new EProviderValidator(processingEnv, androidManifest)); - modelValidator.register(new EFragmentValidator(processingEnv, rClass)); - modelValidator.register(new EViewGroupValidator(processingEnv, rClass)); - modelValidator.register(new EViewValidator(processingEnv)); - modelValidator.register(new EBeanValidator(processingEnv)); - modelValidator.register(new RoboGuiceValidator(processingEnv)); - modelValidator.register(new ViewByIdValidator(processingEnv, rClass)); - modelValidator.register(new FragmentByIdValidator(processingEnv, rClass)); - modelValidator.register(new FragmentByTagValidator(processingEnv)); - modelValidator.register(new FromHtmlValidator(processingEnv, rClass)); - modelValidator.register(new ClickValidator(processingEnv, rClass)); - modelValidator.register(new LongClickValidator(processingEnv, rClass)); - modelValidator.register(new TouchValidator(processingEnv, rClass)); - modelValidator.register(new FocusChangeValidator(processingEnv, rClass)); - modelValidator.register(new CheckedChangeValidator(processingEnv, rClass)); - modelValidator.register(new ItemClickValidator(processingEnv, rClass)); - modelValidator.register(new ItemSelectedValidator(processingEnv, rClass)); - modelValidator.register(new ItemLongClickValidator(processingEnv, rClass)); - for (AndroidRes androidRes : AndroidRes.values()) { - modelValidator.register(new ResValidator(androidRes, processingEnv, rClass)); - } - modelValidator.register(new TransactionalValidator(processingEnv)); - modelValidator.register(new ExtraValidator(processingEnv)); - modelValidator.register(new FragmentArgValidator(processingEnv)); - modelValidator.register(new SystemServiceValidator(processingEnv, androidSystemServices)); - modelValidator.register(new SharedPrefValidator(processingEnv)); - modelValidator.register(new PrefValidator(processingEnv)); - modelValidator.register(new RestValidator(processingEnv, androidManifest)); - modelValidator.register(new DeleteValidator(processingEnv)); - modelValidator.register(new GetValidator(processingEnv)); - modelValidator.register(new HeadValidator(processingEnv)); - modelValidator.register(new OptionsValidator(processingEnv)); - modelValidator.register(new PostValidator(processingEnv)); - modelValidator.register(new PutValidator(processingEnv)); - modelValidator.register(new AcceptValidator(processingEnv)); - modelValidator.register(new AppValidator(processingEnv)); - modelValidator.register(new OptionsMenuValidator(processingEnv, rClass)); - modelValidator.register(new OptionsMenuItemValidator(processingEnv, rClass)); - modelValidator.register(new OptionsItemValidator(processingEnv, rClass)); - modelValidator.register(new NoTitleValidator(processingEnv)); - modelValidator.register(new WindowFeatureValidator(processingEnv)); - modelValidator.register(new CustomTitleValidator(processingEnv, rClass)); - modelValidator.register(new FullscreenValidator(processingEnv)); - modelValidator.register(new RestServiceValidator(processingEnv)); - modelValidator.register(new RootContextValidator(processingEnv)); - modelValidator.register(new NonConfigurationInstanceValidator(processingEnv)); - modelValidator.register(new BeanValidator(processingEnv)); - modelValidator.register(new AfterInjectValidator(processingEnv)); - modelValidator.register(new BeforeTextChangeValidator(processingEnv, rClass)); - modelValidator.register(new TextChangeValidator(processingEnv, rClass)); - modelValidator.register(new AfterTextChangeValidator(processingEnv, rClass)); - modelValidator.register(new SeekBarProgressChangeValidator(processingEnv, rClass)); - modelValidator.register(new SeekBarTouchStartValidator(processingEnv, rClass)); - modelValidator.register(new SeekBarTouchStopValidator(processingEnv, rClass)); - modelValidator.register(new ServiceActionValidator(processingEnv)); - /* - * Any view injection or listener binding should occur before - * AfterViewsValidator - */ - modelValidator.register(new AfterViewsValidator(processingEnv)); - modelValidator.register(new TraceValidator(processingEnv)); - modelValidator.register(new SubscribeValidator(processingEnv)); - modelValidator.register(new ProduceValidator(processingEnv)); - modelValidator.register(new RunnableValidator(UiThread.class.getName(), processingEnv)); - modelValidator.register(new RunnableValidator(Background.class.getName(), processingEnv)); - modelValidator.register(new InstanceStateValidator(processingEnv)); - modelValidator.register(new OrmLiteDaoValidator(processingEnv, rClass)); - modelValidator.register(new HttpsClientValidator(processingEnv, rClass)); - modelValidator.register(new OnActivityResultValidator(processingEnv, rClass)); - modelValidator.register(new HierarchyViewerSupportValidator(processingEnv, androidManifest)); - - return modelValidator; - } - - private boolean traceActivated() { - Map options = processingEnv.getOptions(); - if (options.containsKey(TRACE_OPTION)) { - String trace = options.get(TRACE_OPTION); - return !"false".equals(trace); - } else { - return true; - } - } - - private ProcessResult processAnnotations(AnnotationElements validatedModel, IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) throws ProcessingException, Exception { + private ModelProcessor.ProcessResult processAnnotations(AnnotationElements validatedModel) throws Exception { timeStats.start("Process Annotations"); - ModelProcessor modelProcessor = buildModelProcessor(rClass, androidSystemServices, androidManifest, validatedModel); - ProcessResult processResult = modelProcessor.process(validatedModel); + annotationHandlers.setValidatedModel(validatedModel); + ModelProcessor modelProcessor = new ModelProcessor(processingEnv, annotationHandlers); + ModelProcessor.ProcessResult processResult = modelProcessor.process(validatedModel); timeStats.stop("Process Annotations"); return processResult; } - private ModelProcessor buildModelProcessor(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest, AnnotationElements validatedModel) { - ModelProcessor modelProcessor = new ModelProcessor(); - modelProcessor.register(new EApplicationProcessor()); - modelProcessor.register(new EActivityProcessor(processingEnv, rClass, androidManifest)); - modelProcessor.register(new EServiceProcessor(processingEnv)); - modelProcessor.register(new EIntentServiceProcessor(processingEnv)); - modelProcessor.register(new EReceiverProcessor()); - modelProcessor.register(new EProviderProcessor()); - modelProcessor.register(new EFragmentProcessor(processingEnv, rClass)); - modelProcessor.register(new EViewGroupProcessor(processingEnv, rClass)); - modelProcessor.register(new EViewProcessor()); - modelProcessor.register(new EBeanProcessor()); - modelProcessor.register(new SharedPrefProcessor(processingEnv, rClass)); - modelProcessor.register(new PrefProcessor(validatedModel)); - modelProcessor.register(new RoboGuiceProcessor()); - modelProcessor.register(new ViewByIdProcessor(processingEnv, rClass)); - modelProcessor.register(new FragmentByIdProcessor(processingEnv, rClass)); - modelProcessor.register(new FragmentByTagProcessor(processingEnv)); - modelProcessor.register(new FromHtmlProcessor(processingEnv, rClass)); - modelProcessor.register(new ClickProcessor(processingEnv, rClass)); - modelProcessor.register(new LongClickProcessor(processingEnv, rClass)); - modelProcessor.register(new TouchProcessor(processingEnv, rClass)); - modelProcessor.register(new FocusChangeProcessor(processingEnv, rClass)); - modelProcessor.register(new CheckedChangeProcessor(processingEnv, rClass)); - modelProcessor.register(new ItemClickProcessor(processingEnv, rClass)); - modelProcessor.register(new ItemSelectedProcessor(processingEnv, rClass)); - modelProcessor.register(new ItemLongClickProcessor(processingEnv, rClass)); - for (AndroidRes androidRes : AndroidRes.values()) { - modelProcessor.register(new ResProcessor(processingEnv, androidRes, rClass)); - } - modelProcessor.register(new TransactionalProcessor()); - modelProcessor.register(new ExtraProcessor(processingEnv)); - modelProcessor.register(new FragmentArgProcessor(processingEnv)); - modelProcessor.register(new SystemServiceProcessor(androidSystemServices)); - RestImplementationsHolder restImplementationsHolder = new RestImplementationsHolder(); - modelProcessor.register(new RestProcessor(processingEnv, restImplementationsHolder)); - modelProcessor.register(new GetProcessor(processingEnv, restImplementationsHolder)); - modelProcessor.register(new PostProcessor(processingEnv, restImplementationsHolder)); - modelProcessor.register(new PutProcessor(processingEnv, restImplementationsHolder)); - modelProcessor.register(new DeleteProcessor(processingEnv, restImplementationsHolder)); - modelProcessor.register(new HeadProcessor(processingEnv, restImplementationsHolder)); - modelProcessor.register(new OptionsProcessor(processingEnv, restImplementationsHolder)); - modelProcessor.register(new AppProcessor()); - modelProcessor.register(new OptionsMenuProcessor(processingEnv, rClass)); - modelProcessor.register(new OptionsMenuItemProcessor(processingEnv, rClass)); - modelProcessor.register(new OptionsItemProcessor(processingEnv, rClass)); - modelProcessor.register(new NoTitleProcessor()); - modelProcessor.register(new WindowFeatureProcessor()); - modelProcessor.register(new CustomTitleProcessor(processingEnv, rClass)); - modelProcessor.register(new FullscreenProcessor()); - modelProcessor.register(new RestServiceProcessor()); - modelProcessor.register(new OrmLiteDaoProcessor(processingEnv)); - modelProcessor.register(new RootContextProcessor()); - modelProcessor.register(new NonConfigurationInstanceProcessor(processingEnv)); - modelProcessor.register(new BeanProcessor(processingEnv)); - modelProcessor.register(new BeforeTextChangeProcessor(processingEnv, rClass)); - modelProcessor.register(new TextChangeProcessor(processingEnv, rClass)); - modelProcessor.register(new AfterTextChangeProcessor(processingEnv, rClass)); - modelProcessor.register(new SeekBarProgressChangeProcessor(processingEnv, rClass)); - modelProcessor.register(new SeekBarTouchStartProcessor(processingEnv, rClass)); - modelProcessor.register(new SeekBarTouchStopProcessor(processingEnv, rClass)); - modelProcessor.register(new ServiceActionProcessor(processingEnv)); - /* - * Any view injection or listener binding should occur before - * AfterViewsProcessor - */ - modelProcessor.register(new AfterViewsProcessor()); - if (traceActivated()) { - modelProcessor.register(new TraceProcessor()); - } - modelProcessor.register(new SubscribeProcessor()); - modelProcessor.register(new ProduceProcessor()); - modelProcessor.register(new UiThreadProcessor()); - modelProcessor.register(new BackgroundProcessor()); - modelProcessor.register(new AfterInjectProcessor()); - modelProcessor.register(new InstanceStateProcessor(processingEnv)); - modelProcessor.register(new HttpsClientProcessor(rClass)); - modelProcessor.register(new OnActivityResultProcessor(processingEnv, rClass)); - modelProcessor.register(new HierarchyViewerSupportProcessor()); - return modelProcessor; - } - - private void generateSources(ProcessResult processResult) throws IOException { + private void generateSources(ModelProcessor.ProcessResult processResult) throws IOException { timeStats.start("Generate Sources"); Messager messager = processingEnv.getMessager(); messager.printMessage(Diagnostic.Kind.NOTE, "Number of files generated by AndroidAnnotations: " + processResult.codeModel.countArtifacts()); @@ -660,104 +261,6 @@ private void handleException(Set annotations, RoundEnviro @Override public Set getSupportedAnnotationTypes() { - if (supportedAnnotationNames == null) { - Class[] annotationClassesArray = { // - // - EActivity.class, // - App.class, // - EViewGroup.class, // - EView.class, // - AfterViews.class, // - RoboGuice.class, // - ViewById.class, // - Click.class, // - LongClick.class, // - ItemClick.class, // - ItemLongClick.class, // - Touch.class, // - ItemSelect.class, // - UiThread.class, // - Transactional.class, // - Background.class, // - Extra.class, // - SystemService.class, // - SharedPref.class, // - Pref.class, // - StringRes.class, // - ColorRes.class, // - AnimationRes.class, // - BooleanRes.class, // - ColorStateListRes.class, // - DimensionRes.class, // - DimensionPixelOffsetRes.class, // - DimensionPixelSizeRes.class, // - DrawableRes.class, // - IntArrayRes.class, // - IntegerRes.class, // - LayoutRes.class, // - MovieRes.class, // - TextRes.class, // - TextArrayRes.class, // - StringArrayRes.class, // - Rest.class, // - Get.class, // - Head.class, // - Options.class, // - Post.class, // - Put.class, // - Delete.class, // - Accept.class, // - FromHtml.class, // - OptionsMenu.class, // - OptionsMenuItem.class, // - OptionsItem.class, // - HtmlRes.class, // - NoTitle.class, // - WindowFeature.class, // - CustomTitle.class, // - Fullscreen.class, // - RestService.class, // - EBean.class, // - RootContext.class, // - Bean.class, // - AfterInject.class, // - EService.class, // - EIntentService.class, // - ServiceAction.class, // - EReceiver.class, // - EProvider.class, // - Trace.class, // - InstanceState.class, // - NonConfigurationInstance.class, // - EApplication.class, // - EFragment.class, // - FragmentById.class, // - FragmentByTag.class, // - BeforeTextChange.class, // - TextChange.class, // - SeekBarProgressChange.class, // - SeekBarTouchStart.class, // - SeekBarTouchStop.class, // - AfterTextChange.class, // - OrmLiteDao.class, // - HttpsClient.class, // - FragmentArg.class, // - OnActivityResult.class, // - HierarchyViewerSupport.class, // - CheckedChange.class, // - FocusChange.class // - }; - - Set set = new HashSet(annotationClassesArray.length); - for (Class annotationClass : annotationClassesArray) { - set.add(annotationClass.getName()); - } - - set.add(SUBSCRIBE); - set.add(PRODUCE); - - supportedAnnotationNames = Collections.unmodifiableSet(set); - } - return supportedAnnotationNames; + return annotationHandlers.getSupportedAnnotationTypes(); } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/ApiCodeGenerator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/ApiCodeGenerator.java index b93802f8d5..5a8556060e 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/ApiCodeGenerator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/ApiCodeGenerator.java @@ -25,7 +25,7 @@ import javax.lang.model.element.Element; import javax.tools.JavaFileObject; -import org.androidannotations.processing.OriginatingElements; +import org.androidannotations.process.OriginatingElements; public class ApiCodeGenerator { 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 50495ef3fa..3108cd5e6c 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/CodeModelGenerator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/CodeModelGenerator.java @@ -20,7 +20,7 @@ import javax.annotation.processing.Filer; import javax.annotation.processing.Messager; -import org.androidannotations.processing.ModelProcessor.ProcessResult; +import org.androidannotations.process.ModelProcessor; import com.sun.codemodel.writer.PrologCodeWriter; @@ -36,7 +36,7 @@ public CodeModelGenerator(Filer filer, Messager messager, String aaVersion) { this.aaVersion = aaVersion; } - public void generate(ProcessResult processResult) throws IOException { + public void generate(ModelProcessor.ProcessResult processResult) throws IOException { ApiCodeGenerator apiCodeGenerator = new ApiCodeGenerator(filer); apiCodeGenerator.writeApiClasses(processResult.apiClassesToGenerate, processResult.originatingElements); 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 ef6933e534..3c293af75e 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/SourceCodewriter.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/generation/SourceCodewriter.java @@ -25,7 +25,7 @@ import javax.tools.Diagnostic.Kind; import javax.tools.JavaFileObject; -import org.androidannotations.processing.OriginatingElements; +import org.androidannotations.process.OriginatingElements; import com.sun.codemodel.CodeWriter; import com.sun.codemodel.JPackage; diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractListenerHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractListenerHandler.java new file mode 100644 index 0000000000..a8ab5fbcd8 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractListenerHandler.java @@ -0,0 +1,130 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import com.sun.codemodel.*; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.rclass.IRClass; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeMirror; +import java.util.List; + +import static com.sun.codemodel.JExpr.*; + +public abstract class AbstractListenerHandler extends BaseAnnotationHandler { + + private IdAnnotationHelper helper; + private EComponentWithViewSupportHolder holder; + private String methodName; + + public AbstractListenerHandler(Class targetClass, ProcessingEnvironment processingEnvironment) { + super(targetClass, processingEnvironment); + } + + public AbstractListenerHandler(String target, ProcessingEnvironment processingEnvironment) { + super(target, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + helper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.doesntThrowException(element, valid); + + validatorHelper.uniqueId(element, validatedElements, valid); + } + + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) { + this.holder = holder; + this.methodName = element.getSimpleName().toString(); + + ExecutableElement executableElement = (ExecutableElement) element; + List parameters = executableElement.getParameters(); + TypeMirror returnType = executableElement.getReturnType(); + + List idsRefs = helper.extractAnnotationFieldRefs(processHolder, element, IRClass.Res.ID, true); + + JDefinedClass listenerAnonymousClass = codeModel().anonymousClass(getListenerClass()); + JMethod listenerMethod = createListenerMethod(listenerAnonymousClass); + listenerMethod.annotate(Override.class); + + JBlock listenerMethodBody = listenerMethod.body(); + + JExpression activityRef = holder.getGeneratedClass().staticRef("this"); + JInvocation call = invoke(activityRef, methodName); + + makeCall(listenerMethodBody, call, returnType); + + processParameters(listenerMethod, call, parameters); + + for (JFieldRef idRef : idsRefs) { + if (idRef != null) { + JBlock block = holder.getOnViewChangedBody().block(); + + JExpression findViewExpression = holder.findViewById(idRef); + if (!getViewClass().equals(classes().VIEW)) { + findViewExpression = cast(getViewClass(), findViewExpression); + } + + JVar view = block.decl(getViewClass(), "view", findViewExpression); + block._if(view.ne(_null()))._then().invoke(view, getSetterName()).arg(_new(listenerAnonymousClass)); + } + } + } + + protected abstract void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror returnType); + + protected abstract void processParameters(JMethod listenerMethod, JInvocation call, List userParameters); + + protected abstract JMethod createListenerMethod(JDefinedClass listenerAnonymousClass); + + protected abstract String getSetterName(); + + protected abstract JClass getListenerClass(); + + protected JType getViewClass() { + return classes().VIEW; + } + + protected String getMethodName() { + return methodName; + } + + protected final EComponentWithViewSupportHolder getHolder() { + return holder; + } +} \ No newline at end of file diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RunnableValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractRunnableHandler.java similarity index 62% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RunnableValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractRunnableHandler.java index f89b7e1f45..8f7e653fb4 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RunnableValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractRunnableHandler.java @@ -13,37 +13,24 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EComponentHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; -public class RunnableValidator implements ElementValidator { +public abstract class AbstractRunnableHandler extends BaseAnnotationHandler { - private final String annotationName; - private ValidatorHelper validatorHelper; - - public RunnableValidator(String annotationName, ProcessingEnvironment processingEnv) { - this.annotationName = annotationName; - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return annotationName; + public AbstractRunnableHandler(Class targetClass, ProcessingEnvironment processingEnvironment) { + super(targetClass, processingEnvironment); } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); ExecutableElement executableElement = (ExecutableElement) element; @@ -57,8 +44,5 @@ public boolean validate(Element element, AnnotationElements validatedElements) { validatorHelper.isNotFinal(element, valid); validatorHelper.isNotSynchronized(element, valid); - - return valid.isValid(); } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractSeekBarTouchHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractSeekBarTouchHandler.java new file mode 100644 index 0000000000..ffaf94db5e --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AbstractSeekBarTouchHandler.java @@ -0,0 +1,96 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +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.VariableElement; + +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.holder.OnSeekBarChangeListenerHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JExpression; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JInvocation; +import com.sun.codemodel.JVar; + +public abstract class AbstractSeekBarTouchHandler extends BaseAnnotationHandler { + + private IdAnnotationHelper annotationHelper; + + public AbstractSeekBarTouchHandler(Class targetClass, ProcessingEnvironment processingEnvironment) { + super(targetClass, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.doesntThrowException(element, valid); + + validatorHelper.returnTypeIsVoid((ExecutableElement) element, valid); + + validatorHelper.hasSeekBarTouchTrackingMethodParameters((ExecutableElement) element, valid); + } + + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) throws Exception { + String methodName = element.getSimpleName().toString(); + + List idsRefs = annotationHelper.extractAnnotationFieldRefs(processHolder, element, IRClass.Res.ID, true); + + for (JFieldRef idRef : idsRefs) { + OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder = holder.getOnSeekBarChangeListenerHolder(idRef); + JBlock methodBody = getMethodBodyToCall(onSeekBarChangeListenerHolder); + + JExpression activityRef = holder.getGeneratedClass().staticRef("this"); + JInvocation textChangeCall = methodBody.invoke(activityRef, methodName); + + ExecutableElement executableElement = (ExecutableElement) element; + List parameters = executableElement.getParameters(); + + if (parameters.size() == 1) { + JVar progressParameter = getMethodParamToPass(onSeekBarChangeListenerHolder); + textChangeCall.arg(progressParameter); + } + } + } + + protected abstract JBlock getMethodBodyToCall(OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder); + + protected abstract JVar getMethodParamToPass(OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder); +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AfterInjectValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AfterInjectHandler.java similarity index 65% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AfterInjectValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AfterInjectHandler.java index 59e863f6c6..74584bd09d 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AfterInjectValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AfterInjectHandler.java @@ -13,36 +13,25 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import org.androidannotations.annotations.AfterInject; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EComponentHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; -public class AfterInjectValidator implements ElementValidator { +public class AfterInjectHandler extends BaseAnnotationHandler { - private ValidatorHelper validatorHelper; - - public AfterInjectValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); + public AfterInjectHandler(ProcessingEnvironment processingEnvironment) { + super(AfterInject.class, processingEnvironment); } @Override - public String getTarget() { - return AfterInject.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); ExecutableElement executableElement = (ExecutableElement) element; @@ -54,8 +43,11 @@ public boolean validate(Element element, AnnotationElements validatedElements) { validatorHelper.doesntThrowException(executableElement, valid); validatorHelper.param.zeroParameter(executableElement, valid); - - return valid.isValid(); } + @Override + public void process(Element element, EComponentHolder holder) { + String methodName = element.getSimpleName().toString(); + holder.getInitBody().invoke(methodName); + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AfterTextChangeHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AfterTextChangeHandler.java new file mode 100644 index 0000000000..bc2a04577f --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AfterTextChangeHandler.java @@ -0,0 +1,119 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +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.VariableElement; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.annotations.AfterTextChange; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.holder.TextWatcherHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JExpression; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JInvocation; +import com.sun.codemodel.JVar; + +public class AfterTextChangeHandler extends BaseAnnotationHandler { + + private IdAnnotationHelper idAnnotationHelper; + + public AfterTextChangeHandler(ProcessingEnvironment processingEnvironment) { + super(AfterTextChange.class, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + idAnnotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.doesntThrowException(element, valid); + + validatorHelper.returnTypeIsVoid((ExecutableElement) element, valid); + + validatorHelper.hasAfterTextChangedMethodParameters((ExecutableElement) element, valid); + } + + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) throws Exception { + String methodName = element.getSimpleName().toString(); + + ExecutableElement executableElement = (ExecutableElement) element; + List parameters = executableElement.getParameters(); + + int editableParameterPosition = -1; + int viewParameterPosition = -1; + TypeMirror viewParameterType = null; + + for (int i = 0; i < parameters.size(); i++) { + VariableElement parameter = parameters.get(i); + TypeMirror parameterType = parameter.asType(); + + if (CanonicalNameConstants.EDITABLE.equals(parameterType.toString())) { + editableParameterPosition = i; + } else { + TypeMirror textViewType = idAnnotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.TEXT_VIEW).asType(); + if (idAnnotationHelper.isSubtype(parameterType, textViewType)) { + viewParameterPosition = i; + viewParameterType = parameterType; + } + } + } + + List idsRefs = idAnnotationHelper.extractAnnotationFieldRefs(processHolder, element, IRClass.Res.ID, true); + + for (JFieldRef idRef : idsRefs) { + TextWatcherHolder textWatcherHolder = holder.getTextWatcherHolder(idRef, viewParameterType); + JBlock methodBody = textWatcherHolder.getAfterTextChangedBody(); + + JExpression activityRef = holder.getGeneratedClass().staticRef("this"); + JInvocation textChangeCall = methodBody.invoke(activityRef, methodName); + + for (int i = 0; i < parameters.size(); i++) { + if (i == editableParameterPosition) { + JVar afterTextChangeEditableParam = textWatcherHolder.getAfterTextChangedEditableParam(); + textChangeCall.arg(afterTextChangeEditableParam); + } else if (i == viewParameterPosition) { + JVar viewParameter = textWatcherHolder.getTextViewVariable(); + textChangeCall.arg(viewParameter); + } + } + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AfterViewsValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AfterViewsHandler.java similarity index 65% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AfterViewsValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AfterViewsHandler.java index 661b1daaa1..a866b6c6f8 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AfterViewsValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AfterViewsHandler.java @@ -13,36 +13,25 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import org.androidannotations.annotations.AfterViews; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; -public class AfterViewsValidator implements ElementValidator { +public class AfterViewsHandler extends BaseAnnotationHandler { - private ValidatorHelper validatorHelper; - - public AfterViewsValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); + public AfterViewsHandler(ProcessingEnvironment processingEnvironment) { + super(AfterViews.class, processingEnvironment); } @Override - public String getTarget() { - return AfterViews.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); ExecutableElement executableElement = (ExecutableElement) element; @@ -54,8 +43,11 @@ public boolean validate(Element element, AnnotationElements validatedElements) { validatorHelper.doesntThrowException(executableElement, valid); validatorHelper.param.zeroParameter(executableElement, valid); - - return valid.isValid(); } + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) throws Exception { + String methodName = element.getSimpleName().toString(); + holder.getOnViewChangedBody().invoke(methodName); + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ElementValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AnnotationHandler.java similarity index 53% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ElementValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AnnotationHandler.java index 24afca6b95..56ee5e841c 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ElementValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AnnotationHandler.java @@ -13,25 +13,28 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.lang.model.element.Element; -import org.androidannotations.helper.HasTarget; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.holder.GeneratedClassHolder; +import org.androidannotations.model.AndroidSystemServices; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.ProcessHolder; +import org.androidannotations.rclass.IRClass; + +public interface AnnotationHandler { + + String getTarget(); -public interface ElementValidator extends HasTarget { - - /** - * Method used to filter validated elements from annotated elements - * - * @param element - * the element to validate - * @param validatedElements - * to already validated elements - * @return true if the element should be added to the validatedElements, - * false otherwise - */ boolean validate(Element element, AnnotationElements validatedElements); + void process(Element element, T holder) throws Exception; + + void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest); + + void setValidatedModel(AnnotationElements validatedModel); + + void setProcessHolder(ProcessHolder processHolder); } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AnnotationHandlers.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AnnotationHandlers.java new file mode 100644 index 0000000000..e06c337f3a --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AnnotationHandlers.java @@ -0,0 +1,191 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static org.androidannotations.helper.ModelConstants.TRACE_OPTION; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.annotation.processing.ProcessingEnvironment; + +import org.androidannotations.handler.rest.DeleteHandler; +import org.androidannotations.handler.rest.GetHandler; +import org.androidannotations.handler.rest.HeadHandler; +import org.androidannotations.handler.rest.OptionsHandler; +import org.androidannotations.handler.rest.PostHandler; +import org.androidannotations.handler.rest.PutHandler; +import org.androidannotations.handler.rest.RestHandler; +import org.androidannotations.handler.rest.RestServiceHandler; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.holder.GeneratedClassHolder; +import org.androidannotations.model.AndroidRes; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.ProcessHolder; +import org.androidannotations.rclass.IRClass; + +public class AnnotationHandlers { + + private List> annotationHandlers = new ArrayList>(); + private List> generatingAnnotationHandlers = new ArrayList>(); + private List> decoratingAnnotationHandlers = new ArrayList>(); + private Set supportedAnnotationNames; + + public AnnotationHandlers(ProcessingEnvironment processingEnvironment) { + add(new EApplicationHandler(processingEnvironment)); + add(new EActivityHandler(processingEnvironment)); + add(new EProviderHandler(processingEnvironment)); + add(new EReceiverHandler(processingEnvironment)); + add(new EServiceHandler(processingEnvironment)); + add(new EIntentServiceHandler(processingEnvironment)); + add(new EFragmentHandler(processingEnvironment)); + add(new EBeanHandler(processingEnvironment)); + add(new EViewGroupHandler(processingEnvironment)); + add(new EViewHandler(processingEnvironment)); + add(new SharedPrefHandler(processingEnvironment)); + add(new PrefHandler(processingEnvironment)); + add(new RoboGuiceHandler(processingEnvironment)); + add(new ViewByIdHandler(processingEnvironment)); + add(new FragmentByIdHandler(processingEnvironment)); + add(new FragmentByTagHandler(processingEnvironment)); + add(new FromHtmlHandler(processingEnvironment)); + add(new ClickHandler(processingEnvironment)); + add(new LongClickHandler(processingEnvironment)); + add(new TouchHandler(processingEnvironment)); + add(new FocusChangeHandler(processingEnvironment)); + add(new CheckedChangeHandler(processingEnvironment)); + add(new ItemClickHandler(processingEnvironment)); + add(new ItemSelectHandler(processingEnvironment)); + add(new ItemLongClickHandler(processingEnvironment)); + for (AndroidRes androidRes : AndroidRes.values()) { + add(new ResHandler(androidRes, processingEnvironment)); + } + add(new TransactionalHandler(processingEnvironment)); + add(new ExtraHandler(processingEnvironment)); + add(new FragmentArgHandler(processingEnvironment)); + add(new SystemServiceHandler(processingEnvironment)); + add(new RestHandler(processingEnvironment)); + add(new GetHandler(processingEnvironment)); + add(new PostHandler(processingEnvironment)); + add(new PutHandler(processingEnvironment)); + add(new DeleteHandler(processingEnvironment)); + add(new HeadHandler(processingEnvironment)); + add(new OptionsHandler(processingEnvironment)); + add(new AppHandler(processingEnvironment)); + add(new OptionsMenuHandler(processingEnvironment)); + add(new OptionsMenuItemHandler(processingEnvironment)); + add(new OptionsItemHandler(processingEnvironment)); + add(new NoTitleHandler(processingEnvironment)); + add(new CustomTitleHandler(processingEnvironment)); + add(new FullscreenHandler(processingEnvironment)); + add(new RestServiceHandler(processingEnvironment)); + add(new OrmLiteDaoHandler(processingEnvironment)); + add(new RootContextHanlder(processingEnvironment)); + add(new NonConfigurationInstanceHandler(processingEnvironment)); + add(new BeanHandler(processingEnvironment)); + add(new BeforeTextChangeHandler(processingEnvironment)); + add(new TextChangeHandler(processingEnvironment)); + add(new AfterTextChangeHandler(processingEnvironment)); + add(new SeekBarProgressChangeHandler(processingEnvironment)); + add(new SeekBarTouchStartHandler(processingEnvironment)); + add(new SeekBarTouchStopHandler(processingEnvironment)); + add(new ServiceActionHandler(processingEnvironment)); + add(new SubscribeHandler(processingEnvironment)); + add(new ProduceHandler(processingEnvironment)); + add(new InstanceStateHandler(processingEnvironment)); + add(new HttpsClientHandler(processingEnvironment)); + add(new OnActivityResultHandler(processingEnvironment)); + add(new HierarchyViewerSupportHandler(processingEnvironment)); + add(new WindowFeatureHandler(processingEnvironment)); + + /* After injection methods must be after injections */ + add(new AfterInjectHandler(processingEnvironment)); + add(new AfterViewsHandler(processingEnvironment)); + + if (traceActivated(processingEnvironment)) { + add(new TraceHandler(processingEnvironment)); + } + /* UIThreadHandler and BackgroundHandler must be after TraceHandler */ + add(new UiThreadHandler(processingEnvironment)); + add(new BackgroundHandler(processingEnvironment)); + } + + private void add(AnnotationHandler annotationHandler) { + annotationHandlers.add(annotationHandler); + decoratingAnnotationHandlers.add(annotationHandler); + } + + private void add(GeneratingAnnotationHandler annotationHandler) { + annotationHandlers.add(annotationHandler); + generatingAnnotationHandlers.add(annotationHandler); + } + + public List> get() { + return annotationHandlers; + } + + public List> getGenerating() { + return generatingAnnotationHandlers; + } + + public List> getDecorating() { + return decoratingAnnotationHandlers; + } + + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + for (AnnotationHandler annotationHandler : annotationHandlers) { + annotationHandler.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + } + } + + public void setValidatedModel(AnnotationElements validatedModel) { + for (AnnotationHandler annotationHandler : annotationHandlers) { + annotationHandler.setValidatedModel(validatedModel); + } + } + + public void setProcessHolder(ProcessHolder processHolder) { + for (AnnotationHandler annotationHandler : annotationHandlers) { + annotationHandler.setProcessHolder(processHolder); + } + } + + private boolean traceActivated(ProcessingEnvironment processingEnvironment) { + Map options = processingEnvironment.getOptions(); + if (options.containsKey(TRACE_OPTION)) { + String trace = options.get(TRACE_OPTION); + return !"false".equals(trace); + } else { + return true; + } + } + + public Set getSupportedAnnotationTypes() { + if (supportedAnnotationNames == null) { + Set annotationNames = new HashSet(); + for (AnnotationHandler annotationHandler : annotationHandlers) { + annotationNames.add(annotationHandler.getTarget()); + } + supportedAnnotationNames = Collections.unmodifiableSet(annotationNames); + } + return supportedAnnotationNames; + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AppValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AppHandler.java similarity index 53% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AppValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AppHandler.java index 60fc01757f..7e71d321f7 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AppValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/AppHandler.java @@ -13,42 +13,44 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.ref; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import org.androidannotations.annotations.App; import org.androidannotations.annotations.EApplication; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.helper.ModelConstants; +import org.androidannotations.holder.EApplicationHolder; +import org.androidannotations.holder.EComponentHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; -public class AppValidator implements ElementValidator { +import com.sun.codemodel.JClass; - private ValidatorHelper validatorHelper; +public class AppHandler extends BaseAnnotationHandler { - public AppValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); + public AppHandler(ProcessingEnvironment processingEnvironment) { + super(App.class, processingEnvironment); } @Override - public String getTarget() { - return App.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - IsValid valid = new IsValid(); - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); validatorHelper.typeHasAnnotation(EApplication.class, element, valid); validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); } + @Override + public void process(Element element, EComponentHolder holder) { + String fieldName = element.getSimpleName().toString(); + String applicationQualifiedName = element.asType().toString(); + JClass applicationClass = refClass(applicationQualifiedName + ModelConstants.GENERATION_SUFFIX); + + holder.getInitBody().assign(ref(fieldName), applicationClass.staticInvoke(EApplicationHolder.GET_APPLICATION_INSTANCE)); + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BackgroundHandler.java similarity index 73% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BackgroundHandler.java index da44ef9a43..a8a999bb8a 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BackgroundHandler.java @@ -13,11 +13,12 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import static com.sun.codemodel.JExpr._new; import static com.sun.codemodel.JExpr.lit; +import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; @@ -29,39 +30,36 @@ import org.androidannotations.api.BackgroundExecutor; import org.androidannotations.api.BackgroundExecutor.Task; import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.holder.EComponentHolder; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; -import com.sun.codemodel.JClassAlreadyExistsException; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JDefinedClass; import com.sun.codemodel.JInvocation; import com.sun.codemodel.JMethod; import com.sun.codemodel.JMod; -public class BackgroundProcessor implements DecoratingElementProcessor { +public class BackgroundHandler extends AbstractRunnableHandler { - private final APTCodeModelHelper helper = new APTCodeModelHelper(); + private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); - @Override - public String getTarget() { - return Background.class.getName(); + public BackgroundHandler(ProcessingEnvironment processingEnvironment) { + super(Background.class, processingEnvironment); } @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) throws JClassAlreadyExistsException { - + public void process(Element element, EComponentHolder holder) throws Exception { ExecutableElement executableElement = (ExecutableElement) element; - holder.generateApiClass(element, BackgroundExecutor.class); + generateApiClass(element, BackgroundExecutor.class); - JMethod delegatingMethod = helper.overrideAnnotatedMethod(executableElement, holder); + JMethod delegatingMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); - JBlock previousMethodBody = helper.removeBody(delegatingMethod); + JBlock previousMethodBody = codeModelHelper.removeBody(delegatingMethod); - JDefinedClass anonymousTaskClass = codeModel.anonymousClass(Task.class); + JDefinedClass anonymousTaskClass = codeModel().anonymousClass(Task.class); - JMethod executeMethod = anonymousTaskClass.method(JMod.PUBLIC, codeModel.VOID, "execute"); + JMethod executeMethod = anonymousTaskClass.method(JMod.PUBLIC, codeModel().VOID, "execute"); executeMethod.annotate(Override.class); // Catch exception in user code @@ -81,7 +79,7 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) t int delay = annotation.delay(); String serial = annotation.serial(); - JClass backgroundExecutorClass = holder.refClass(BackgroundExecutor.class); + JClass backgroundExecutorClass = refClass(BackgroundExecutor.class); JInvocation newTask = _new(anonymousTaskClass).arg(lit(id)).arg(lit(delay)).arg(lit(serial)); JInvocation executeCall = backgroundExecutorClass.staticInvoke("execute").arg(newTask); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BaseAnnotationHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BaseAnnotationHandler.java new file mode 100644 index 0000000000..a3d7bc16d8 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BaseAnnotationHandler.java @@ -0,0 +1,113 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; + +import com.sun.codemodel.JClass; +import com.sun.codemodel.JCodeModel; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.GeneratedClassHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; +import org.androidannotations.rclass.IRClass; + +public abstract class BaseAnnotationHandler implements AnnotationHandler { + + private final String target; + protected ProcessingEnvironment processingEnv; + protected IdValidatorHelper validatorHelper; + protected IRClass rClass; + protected AndroidSystemServices androidSystemServices; + protected AndroidManifest androidManifest; + protected AnnotationElements validatedModel; + protected ProcessHolder processHolder; + + public BaseAnnotationHandler(Class targetClass, ProcessingEnvironment processingEnvironment) { + this(targetClass.getName(), processingEnvironment); + } + + public BaseAnnotationHandler(String target, ProcessingEnvironment processingEnvironment) { + this.target = target; + this.processingEnv = processingEnvironment; + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + this.rClass = rClass; + this.androidSystemServices = androidSystemServices; + this.androidManifest = androidManifest; + initValidatorHelper(); + } + + private void initValidatorHelper() { + IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, target, rClass); + validatorHelper = new IdValidatorHelper(annotationHelper); + } + + @Override + public void setValidatedModel(AnnotationElements validatedModel) { + this.validatedModel = validatedModel; + } + + @Override + public void setProcessHolder(ProcessHolder processHolder) { + this.processHolder = processHolder; + } + + public ProcessingEnvironment processingEnvironment() { + return processHolder.processingEnvironment(); + } + + public ProcessHolder.Classes classes() { + return processHolder.classes(); + } + + public JCodeModel codeModel() { + return processHolder.codeModel(); + } + + public JClass refClass(String fullyQualifiedClassName) { + return processHolder.refClass(fullyQualifiedClassName); + } + + public JClass refClass(Class clazz) { + return processHolder.refClass(clazz); + } + + public void generateApiClass(Element originatingElement, Class apiClass) { + processHolder.generateApiClass(originatingElement, apiClass); + } + + @Override + public String getTarget() { + return target; + } + + @Override + public boolean validate(Element element, AnnotationElements validatedElements) { + IsValid valid = new IsValid(); + validate(element, validatedElements, valid); + return valid.isValid(); + } + + protected abstract void validate(Element element, AnnotationElements validatedElements, IsValid valid); +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BeanProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BeanHandler.java similarity index 50% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BeanProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BeanHandler.java index c148b0ce77..e41320009a 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BeanProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BeanHandler.java @@ -13,74 +13,68 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import static com.sun.codemodel.JExpr._null; import static com.sun.codemodel.JExpr.ref; import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX; -import static org.androidannotations.processing.EBeanProcessor.GET_INSTANCE_METHOD_NAME; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; -import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.Bean; +import org.androidannotations.annotations.EBean; import org.androidannotations.annotations.NonConfigurationInstance; import org.androidannotations.helper.TargetAnnotationHelper; +import org.androidannotations.holder.EBeanHolder; +import org.androidannotations.holder.EComponentHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JFieldRef; import com.sun.codemodel.JInvocation; -public class BeanProcessor implements DecoratingElementProcessor { +public class BeanHandler extends BaseAnnotationHandler { - private TargetAnnotationHelper annotationHelper; + private final TargetAnnotationHelper annotationHelper; - public BeanProcessor(ProcessingEnvironment processingEnv) { + public BeanHandler(ProcessingEnvironment processingEnvironment) { + super(Bean.class, processingEnvironment); annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); } @Override - public String getTarget() { - return Bean.class.getName(); - } + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { + validatorHelper.isNotPrivate(element, valid); - DeclaredType targetAnnotationClassValue = annotationHelper.extractAnnotationClassParameter(element); + validatorHelper.typeOrTargetValueHasAnnotation(EBean.class, element, valid); + } - TypeMirror elementType; - if (targetAnnotationClassValue != null) { - elementType = targetAnnotationClassValue; - } else { + @Override + public void process(Element element, EComponentHolder holder) throws Exception { + TypeMirror elementType = annotationHelper.extractAnnotationClassParameter(element); + if (elementType == null) { elementType = element.asType(); } String fieldName = element.getSimpleName().toString(); - String typeQualifiedName = elementType.toString(); - - JClass injectedClass = holder.refClass(typeQualifiedName + GENERATION_SUFFIX); + JClass injectedClass = refClass(typeQualifiedName + GENERATION_SUFFIX); JFieldRef beanField = ref(fieldName); - { - // getInstance - JBlock body = holder.initBody; - - boolean hasNonConfigurationInstanceAnnotation = element.getAnnotation(NonConfigurationInstance.class) != null; + JBlock block = holder.getInitBody(); - if (hasNonConfigurationInstanceAnnotation) { - body = body._if(beanField.eq(_null()))._then(); - } - - JInvocation getInstance = injectedClass.staticInvoke(GET_INSTANCE_METHOD_NAME).arg(holder.contextRef); - body.assign(beanField, getInstance); + boolean hasNonConfigurationInstanceAnnotation = element.getAnnotation(NonConfigurationInstance.class) != null; + if (hasNonConfigurationInstanceAnnotation) { + block = block._if(beanField.eq(_null()))._then(); } + JInvocation getInstance = injectedClass.staticInvoke(EBeanHolder.GET_INSTANCE_METHOD_NAME).arg(holder.getContextRef()); + block.assign(beanField, getInstance); } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BeforeTextChangeProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BeforeTextChangeHandler.java similarity index 52% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BeforeTextChangeProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BeforeTextChangeHandler.java index 201eb1836b..d7e2e627b8 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BeforeTextChangeProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/BeforeTextChangeHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import java.util.List; @@ -25,41 +25,54 @@ import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.BeforeTextChange; -import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.AndroidManifest; import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.TextWatcherHelper; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.holder.TextWatcherHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JExpression; import com.sun.codemodel.JFieldRef; import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; import com.sun.codemodel.JVar; -/** - */ -public class BeforeTextChangeProcessor implements DecoratingElementProcessor { +public class BeforeTextChangeHandler extends BaseAnnotationHandler { - private final TextWatcherHelper helper; + private IdAnnotationHelper idAnnotationHelper; - private final APTCodeModelHelper codeModelHelper; - - public BeforeTextChangeProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - codeModelHelper = new APTCodeModelHelper(); - helper = new TextWatcherHelper(processingEnv, getTarget(), rClass, codeModelHelper); + public BeforeTextChangeHandler(ProcessingEnvironment processingEnvironment) { + super(BeforeTextChange.class, processingEnvironment); } @Override - public String getTarget() { - return BeforeTextChange.class.getName(); + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + idAnnotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); } @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.doesntThrowException(element, valid); + + validatorHelper.returnTypeIsVoid((ExecutableElement) element, valid); + validatorHelper.hasBeforeTextChangedMethodParameters((ExecutableElement) element, valid); + } + + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) throws Exception { String methodName = element.getSimpleName().toString(); ExecutableElement executableElement = (ExecutableElement) element; @@ -88,49 +101,41 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { afterParameterPosition = i; } } else { - TypeMirror textViewType = helper.typeElementFromQualifiedName(CanonicalNameConstants.TEXT_VIEW).asType(); - if (helper.isSubtype(parameterType, textViewType)) { + TypeMirror textViewType = idAnnotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.TEXT_VIEW).asType(); + if (idAnnotationHelper.isSubtype(parameterType, textViewType)) { viewParameterPosition = i; viewParameterType = parameterType; } } - } - List idsRefs = helper.extractAnnotationFieldRefs(holder, element, Res.ID, true); + List idsRefs = idAnnotationHelper.extractAnnotationFieldRefs(processHolder, element, IRClass.Res.ID, true); for (JFieldRef idRef : idsRefs) { - TextWatcherHolder textWatcherHolder = helper.getOrCreateListener(codeModel, holder, idRef, viewParameterType); + TextWatcherHolder textWatcherHolder = holder.getTextWatcherHolder(idRef, viewParameterType); + JBlock methodBody = textWatcherHolder.getBeforeTextChangedBody(); - JInvocation textChangeCall; - JMethod methodToCall = textWatcherHolder.beforeTextChangedMethod; - - JBlock previousBody = codeModelHelper.removeBody(methodToCall); - JBlock methodBody = methodToCall.body(); - - methodBody.add(previousBody); - JExpression activityRef = holder.generatedClass.staticRef("this"); - textChangeCall = methodBody.invoke(activityRef, methodName); + JExpression activityRef = holder.getGeneratedClass().staticRef("this"); + JInvocation textChangeCall = methodBody.invoke(activityRef, methodName); for (int i = 0; i < parameters.size(); i++) { if (i == startParameterPosition) { - JVar startParameter = codeModelHelper.findParameterByName(methodToCall, "start"); + JVar startParameter = textWatcherHolder.getBeforeTextChangedStartParam(); textChangeCall.arg(startParameter); } else if (i == countParameterPosition) { - JVar countParameter = codeModelHelper.findParameterByName(methodToCall, "count"); + JVar countParameter = textWatcherHolder.getBeforeTextChangedCountParam(); textChangeCall.arg(countParameter); } else if (i == afterParameterPosition) { - JVar afterParameter = codeModelHelper.findParameterByName(methodToCall, "after"); + JVar afterParameter = textWatcherHolder.getBeforeTextChangedAfterParam(); textChangeCall.arg(afterParameter); } else if (i == charSequenceParameterPosition) { - JVar charSequenceParam = codeModelHelper.findParameterByName(methodToCall, "s"); + JVar charSequenceParam = textWatcherHolder.getBeforeTextChangedCharSequenceParam(); textChangeCall.arg(charSequenceParam); } else if (i == viewParameterPosition) { - JVar viewParameter = textWatcherHolder.viewVariable; + JVar viewParameter = textWatcherHolder.getTextViewVariable(); textChangeCall.arg(viewParameter); } } } } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/CheckedChangeProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java similarity index 60% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/CheckedChangeProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java index 0be130f41f..7986717f9e 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/CheckedChangeProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CheckedChangeHandler.java @@ -13,36 +13,43 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; 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.VariableElement; import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.CheckedChange; -import org.androidannotations.rclass.IRClass; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; import com.sun.codemodel.JInvocation; import com.sun.codemodel.JMethod; import com.sun.codemodel.JMod; +import com.sun.codemodel.JType; import com.sun.codemodel.JVar; -public class CheckedChangeProcessor extends AbstractListenerProcessor { +public class CheckedChangeHandler extends AbstractListenerHandler { - public CheckedChangeProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); + public CheckedChangeHandler(ProcessingEnvironment processingEnvironment) { + super(CheckedChange.class, processingEnvironment); } @Override - public String getTarget() { - return CheckedChange.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + ExecutableElement executableElement = (ExecutableElement) element; + validatorHelper.returnTypeIsVoid(executableElement, valid); + + validatorHelper.param.hasZeroOrOneCompoundButtonOrTwoCompoundButtonBooleanParameters(executableElement, valid); } @Override @@ -52,8 +59,8 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror @Override protected void processParameters(JMethod listenerMethod, JInvocation call, List parameters) { - JVar btnParam = listenerMethod.param(classes.COMPOUND_BUTTON, "buttonView"); - JVar isCheckedParam = listenerMethod.param(codeModel.BOOLEAN, "isChecked"); + JVar btnParam = listenerMethod.param(classes().COMPOUND_BUTTON, "buttonView"); + JVar isCheckedParam = listenerMethod.param(codeModel().BOOLEAN, "isChecked"); boolean isCheckedParamExists = parameters.size() == 2; boolean btnParamExists = parameters.size() >= 1; @@ -67,7 +74,7 @@ protected void processParameters(JMethod listenerMethod, JInvocation call, List< @Override protected JMethod createListenerMethod(JDefinedClass listenerAnonymousClass) { - return listenerAnonymousClass.method(JMod.PUBLIC, codeModel.VOID, "onCheckedChanged"); + return listenerAnonymousClass.method(JMod.PUBLIC, codeModel().VOID, "onCheckedChanged"); } @Override @@ -77,11 +84,11 @@ protected String getSetterName() { @Override protected JClass getListenerClass() { - return holder.refClass("android.widget.CompoundButton.OnCheckedChangeListener"); + return classes().COMPOUND_BUTTON_ON_CHECKED_CHANGE_LISTENER; } @Override - protected JExpression castWidget(JInvocation view) { - return JExpr.cast(classes.COMPOUND_BUTTON, view); + protected JType getViewClass() { + return classes().COMPOUND_BUTTON; } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ClickProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ClickHandler.java similarity index 64% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ClickProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ClickHandler.java index ccb829cb44..c723f481af 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ClickProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ClickHandler.java @@ -13,16 +13,19 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; 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.VariableElement; import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.Click; -import org.androidannotations.rclass.IRClass; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; @@ -32,15 +35,21 @@ import com.sun.codemodel.JMod; import com.sun.codemodel.JVar; -public class ClickProcessor extends AbstractListenerProcessor { +public class ClickHandler extends AbstractListenerHandler { - public ClickProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); + public ClickHandler(ProcessingEnvironment processingEnvironment) { + super(Click.class, processingEnvironment); } @Override - public String getTarget() { - return Click.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + ExecutableElement executableElement = (ExecutableElement) element; + + validatorHelper.returnTypeIsVoid(executableElement, valid); + + validatorHelper.param.zeroOrOneViewParameter(executableElement, valid); } @Override @@ -52,7 +61,7 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror protected void processParameters(JMethod listenerMethod, JInvocation call, List parameters) { boolean hasItemParameter = parameters.size() == 1; - JVar viewParam = listenerMethod.param(classes.VIEW, "view"); + JVar viewParam = listenerMethod.param(classes().VIEW, "view"); if (hasItemParameter) { call.arg(viewParam); @@ -61,7 +70,7 @@ protected void processParameters(JMethod listenerMethod, JInvocation call, List< @Override protected JMethod createListenerMethod(JDefinedClass listenerAnonymousClass) { - return listenerAnonymousClass.method(JMod.PUBLIC, codeModel.VOID, "onClick"); + return listenerAnonymousClass.method(JMod.PUBLIC, codeModel().VOID, "onClick"); } @Override @@ -71,7 +80,7 @@ protected String getSetterName() { @Override protected JClass getListenerClass() { - return classes.VIEW_ON_CLICK_LISTENER; + return classes().VIEW_ON_CLICK_LISTENER; } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CustomTitleHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CustomTitleHandler.java new file mode 100644 index 0000000000..2ef9adbfd2 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/CustomTitleHandler.java @@ -0,0 +1,58 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; + +import org.androidannotations.annotations.CustomTitle; +import org.androidannotations.helper.AnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EActivityHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldRef; + +public class CustomTitleHandler extends BaseAnnotationHandler { + + private final AnnotationHelper annotationHelper; + + public CustomTitleHandler(ProcessingEnvironment processingEnvironment) { + super(CustomTitle.class, processingEnvironment); + annotationHelper = new AnnotationHelper(processingEnv); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.hasEActivity(element, validatedElements, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.LAYOUT, IdValidatorHelper.FallbackStrategy.NEED_RES_ID, valid); + } + + @Override + public void process(Element element, EActivityHolder holder) { + JBlock onViewChangedBody = holder.getOnViewChangedBody(); + + JFieldRef contentViewId = annotationHelper.extractAnnotationFieldRefs(processHolder, element, getTarget(), rClass.get(IRClass.Res.LAYOUT), false).get(0); + + JFieldRef customTitleFeature = classes().WINDOW.staticRef("FEATURE_CUSTOM_TITLE"); + holder.getInitBody().invoke("requestWindowFeature").arg(customTitleFeature); + onViewChangedBody.add(holder.getContextRef().invoke("getWindow").invoke("setFeatureInt").arg(customTitleFeature).arg(contentViewId)); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EActivityHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EActivityHandler.java new file mode 100644 index 0000000000..7db5ddb115 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EActivityHandler.java @@ -0,0 +1,78 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import java.util.List; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; + +import org.androidannotations.annotations.EActivity; +import org.androidannotations.helper.AnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EActivityHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JMethod; + +public class EActivityHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { + + private AnnotationHelper annotationHelper; + + public EActivityHandler(ProcessingEnvironment processingEnvironment) { + super(EActivity.class, processingEnvironment); + annotationHelper = new AnnotationHelper(processingEnv); + } + + @Override + public EActivityHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new EActivityHolder(processHolder, annotatedElement, androidManifest); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.extendsActivity(element, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.LAYOUT, IdValidatorHelper.FallbackStrategy.ALLOW_NO_RES_ID, valid); + + validatorHelper.isNotFinal(element, valid); + + validatorHelper.componentRegistered(element, androidManifest, valid); + } + + @Override + public void process(Element element, EActivityHolder holder) { + + List fieldRefs = annotationHelper.extractAnnotationFieldRefs(processHolder, element, getTarget(), rClass.get(IRClass.Res.LAYOUT), false); + + JFieldRef contentViewId = null; + if (fieldRefs.size() == 1) { + contentViewId = fieldRefs.get(0); + } + + if (contentViewId != null) { + JBlock onCreateBody = holder.getOnCreate().body(); + JMethod setContentView = holder.getSetContentViewLayout(); + onCreateBody.invoke(setContentView).arg(contentViewId); + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EApplicationValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EApplicationHandler.java similarity index 53% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EApplicationValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EApplicationHandler.java index c8980314b9..18f44c695d 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EApplicationValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EApplicationHandler.java @@ -13,45 +13,40 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; import org.androidannotations.annotations.EApplication; -import org.androidannotations.helper.AndroidManifest; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EApplicationHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; -public class EApplicationValidator implements ElementValidator { +public class EApplicationHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { - private final ValidatorHelper validatorHelper; - private final AndroidManifest androidManifest; - - public EApplicationValidator(ProcessingEnvironment processingEnv, AndroidManifest androidManifest) { - this.androidManifest = androidManifest; - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); + public EApplicationHandler(ProcessingEnvironment processingEnvironment) { + super(EApplication.class, processingEnvironment); } @Override - public String getTarget() { - return EApplication.class.getName(); + public EApplicationHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new EApplicationHolder(processHolder, annotatedElement); } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { validatorHelper.extendsApplication(element, valid); validatorHelper.isNotFinal(element, valid); validatorHelper.applicationRegistered(element, androidManifest, valid); - - return valid.isValid(); } + @Override + public void process(Element element, EApplicationHolder holder) { + /* Do nothing */ + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EBeanHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EBeanHandler.java new file mode 100644 index 0000000000..34e3e9e8e2 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EBeanHandler.java @@ -0,0 +1,61 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; + +import org.androidannotations.annotations.EBean; +import org.androidannotations.holder.EBeanHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; + +public class EBeanHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { + + public EBeanHandler(ProcessingEnvironment processingEnvironment) { + super(EBean.class, processingEnvironment); + } + + @Override + public EBeanHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedComponent) throws Exception { + return new EBeanHolder(processHolder, annotatedComponent); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.isNotFinal(element, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.hasEmptyOrContextConstructor(element, valid); + } + + @Override + public void process(Element element, EBeanHolder holder) { + EBean eBeanAnnotation = element.getAnnotation(EBean.class); + EBean.Scope eBeanScope = eBeanAnnotation.scope(); + boolean hasSingletonScope = eBeanScope == EBean.Scope.Singleton; + + holder.createFactoryMethod(hasSingletonScope); + + if (!hasSingletonScope) { + holder.invokeInitInConstructor(); + holder.createRebindMethod(); + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EFragmentHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EFragmentHandler.java new file mode 100644 index 0000000000..772dfe3385 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EFragmentHandler.java @@ -0,0 +1,84 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.FALSE; +import static com.sun.codemodel.JExpr._null; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; + +import org.androidannotations.annotations.EFragment; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EFragmentHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JVar; + +public class EFragmentHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { + + public EFragmentHandler(ProcessingEnvironment processingEnvironment) { + super(EFragment.class, processingEnvironment); + } + + @Override + public EFragmentHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new EFragmentHolder(processHolder, annotatedElement); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.isNotFinal(element, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.LAYOUT, IdValidatorHelper.FallbackStrategy.ALLOW_NO_RES_ID, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.hasEmptyConstructor(element, valid); + + validatorHelper.extendsFragment(element, valid); + } + + @Override + public void process(Element element, EFragmentHolder holder) { + + IdAnnotationHelper idAnnotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + + JFieldRef contentViewId = idAnnotationHelper.extractOneAnnotationFieldRef(processHolder, element, IRClass.Res.LAYOUT, false); + + if (contentViewId != null) { + + JBlock block = holder.getSetContentViewBlock(); + JVar inflater = holder.getInflater(); + JVar container = holder.getContainer(); + + JFieldVar contentView = holder.getContentView(); + + block._if(contentView.eq(_null())) // + ._then() // + .assign(contentView, inflater.invoke("inflate").arg(contentViewId).arg(container).arg(FALSE)); + } + + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EIntentServiceHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EIntentServiceHandler.java new file mode 100644 index 0000000000..11b9c3601c --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EIntentServiceHandler.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import org.androidannotations.annotations.EIntentService; +import org.androidannotations.annotations.ServiceAction; +import org.androidannotations.holder.EIntentServiceHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; + +public class EIntentServiceHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { + + public EIntentServiceHandler(ProcessingEnvironment processingEnvironment) { + super(EIntentService.class, processingEnvironment); + } + + @Override + public EIntentServiceHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new EIntentServiceHolder(processHolder, annotatedElement, androidManifest); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.extendsIntentService(element, valid); + + validatorHelper.hasNotMultipleAnnotatedMethodWithSameName(element, valid, ServiceAction.class); + + validatorHelper.isNotFinal(element, valid); + + validatorHelper.componentRegistered(element, androidManifest, valid); + } + + @Override + public void process(Element element, EIntentServiceHolder holder) { + /* Do nothing */ + } + +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EProviderValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EProviderHandler.java similarity index 54% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EProviderValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EProviderHandler.java index 8584943cdf..1f35342f18 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EProviderValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EProviderHandler.java @@ -13,45 +13,40 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; import org.androidannotations.annotations.EProvider; -import org.androidannotations.helper.AndroidManifest; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EProviderHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; -public class EProviderValidator implements ElementValidator { +public class EProviderHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { - private final ValidatorHelper validatorHelper; - private final AndroidManifest androidManifest; - - public EProviderValidator(ProcessingEnvironment processingEnv, AndroidManifest androidManifest) { - this.androidManifest = androidManifest; - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); + public EProviderHandler(ProcessingEnvironment processingEnvironment) { + super(EProvider.class, processingEnvironment); } @Override - public String getTarget() { - return EProvider.class.getName(); + public EProviderHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new EProviderHolder(processHolder, annotatedElement); } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { validatorHelper.extendsProvider(element, valid); validatorHelper.isNotFinal(element, valid); validatorHelper.componentRegistered(element, androidManifest, valid); - - return valid.isValid(); } + @Override + public void process(Element element, EProviderHolder holder) { + /* Do nothing */ + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EReceiverValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EReceiverHandler.java similarity index 55% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EReceiverValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EReceiverHandler.java index 39a7b707b6..2de796c221 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EReceiverValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EReceiverHandler.java @@ -13,46 +13,41 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; import org.androidannotations.annotations.EReceiver; -import org.androidannotations.helper.AndroidManifest; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EReceiverHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; -public class EReceiverValidator implements ElementValidator { +public class EReceiverHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { - private final ValidatorHelper validatorHelper; - private final AndroidManifest androidManifest; - - public EReceiverValidator(ProcessingEnvironment processingEnv, AndroidManifest androidManifest) { - this.androidManifest = androidManifest; - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); + public EReceiverHandler(ProcessingEnvironment processingEnvironment) { + super(EReceiver.class, processingEnvironment); } @Override - public String getTarget() { - return EReceiver.class.getName(); + public EReceiverHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new EReceiverHolder(processHolder, annotatedElement); } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { validatorHelper.extendsReceiver(element, valid); validatorHelper.isNotFinal(element, valid); final boolean NO_WARNING = false; validatorHelper.componentRegistered(element, androidManifest, NO_WARNING, valid); - - return valid.isValid(); } + @Override + public void process(Element element, EReceiverHolder holder) { + /* Do nothing */ + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EServiceValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EServiceHandler.java similarity index 54% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EServiceValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EServiceHandler.java index 0ec10d7705..a53551abf5 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EServiceValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EServiceHandler.java @@ -13,45 +13,40 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; import org.androidannotations.annotations.EService; -import org.androidannotations.helper.AndroidManifest; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EServiceHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; -public class EServiceValidator implements ElementValidator { +public class EServiceHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { - private final ValidatorHelper validatorHelper; - private final AndroidManifest androidManifest; - - public EServiceValidator(ProcessingEnvironment processingEnv, AndroidManifest androidManifest) { - this.androidManifest = androidManifest; - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); + public EServiceHandler(ProcessingEnvironment processingEnvironment) { + super(EService.class, processingEnvironment); } @Override - public String getTarget() { - return EService.class.getName(); + public EServiceHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new EServiceHolder(processHolder, annotatedElement, androidManifest); } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { validatorHelper.extendsService(element, valid); validatorHelper.isNotFinal(element, valid); validatorHelper.componentRegistered(element, androidManifest, valid); - - return valid.isValid(); } + @Override + public void process(Element element, EServiceHolder holder) { + /* Do nothing */ + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EViewGroupHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EViewGroupHandler.java new file mode 100644 index 0000000000..7a0a4bdc9b --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EViewGroupHandler.java @@ -0,0 +1,71 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; + +import org.androidannotations.annotations.EViewGroup; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EViewGroupHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JFieldRef; + +public class EViewGroupHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { + + private IdAnnotationHelper annotationHelper; + + public EViewGroupHandler(ProcessingEnvironment processingEnvironment) { + super(EViewGroup.class, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public EViewGroupHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new EViewGroupHolder(processHolder, annotatedElement); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.extendsViewGroup(element, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.LAYOUT, IdValidatorHelper.FallbackStrategy.ALLOW_NO_RES_ID, valid); + + validatorHelper.isNotFinal(element, valid); + } + + @Override + public void process(Element element, EViewGroupHolder holder) { + JFieldRef contentViewId = annotationHelper.extractOneAnnotationFieldRef(processHolder, element, IRClass.Res.LAYOUT, false); + if (contentViewId != null) { + holder.getSetContentViewBlock().invoke("inflate").arg(holder.getContextRef()).arg(contentViewId).arg(JExpr._this()); + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EViewValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EViewHandler.java similarity index 53% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EViewValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EViewHandler.java index 2d8e8ac2c6..77dc346e23 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EViewValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/EViewHandler.java @@ -13,41 +13,38 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; import org.androidannotations.annotations.EView; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EViewHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; -public class EViewValidator implements ElementValidator { +public class EViewHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { - private final ValidatorHelper validatorHelper; - private TargetAnnotationHelper annotationHelper; - - public EViewValidator(ProcessingEnvironment processingEnv) { - annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); + public EViewHandler(ProcessingEnvironment processingEnvironment) { + super(EView.class, processingEnvironment); } @Override - public String getTarget() { - return EView.class.getName(); + public EViewHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new EViewHolder(processHolder, annotatedElement); } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { validatorHelper.extendsView(element, valid); validatorHelper.isNotFinal(element, valid); - - return valid.isValid(); } + @Override + public void process(Element element, EViewHolder holder) { + /* Do nothing */ + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ExtraHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ExtraHandler.java new file mode 100644 index 0000000000..4e47e02680 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ExtraHandler.java @@ -0,0 +1,147 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JExpr.lit; +import static com.sun.codemodel.JMod.FINAL; +import static com.sun.codemodel.JMod.PUBLIC; +import static com.sun.codemodel.JMod.STATIC; +import static org.androidannotations.helper.CanonicalNameConstants.PARCELABLE; +import static org.androidannotations.helper.CanonicalNameConstants.SERIALIZABLE; +import static org.androidannotations.helper.CanonicalNameConstants.STRING; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +import org.androidannotations.annotations.Extra; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.AnnotationHelper; +import org.androidannotations.helper.BundleHelper; +import org.androidannotations.helper.CaseHelper; +import org.androidannotations.holder.HasExtras; +import org.androidannotations.holder.HasIntentBuilder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JExpression; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JInvocation; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; + +public class ExtraHandler extends BaseAnnotationHandler { + + private final AnnotationHelper annotationHelper; + private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + + public ExtraHandler(ProcessingEnvironment processingEnvironment) { + super(Extra.class, processingEnvironment); + annotationHelper = new AnnotationHelper(processingEnv); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + /* + * TODO since we override setIntent(), we should check that the + * setIntent() method can be overridden + */ + + validatorHelper.enclosingElementHasEActivity(element, validatedElements, valid); + + validatorHelper.isNotPrivate(element, valid); + } + + @Override + public void process(Element element, HasExtras holder) { + Extra annotation = element.getAnnotation(Extra.class); + String extraKey = annotation.value(); + String fieldName = element.getSimpleName().toString(); + if (extraKey.isEmpty()) { + extraKey = fieldName; + } + + JFieldVar extraKeyStaticField = createStaticExtraField(holder, extraKey, fieldName); + injectExtraInComponent(element, holder, extraKeyStaticField, fieldName); + + if (holder instanceof HasIntentBuilder) + createIntentInjectionMethod(element, (HasIntentBuilder) holder, extraKeyStaticField, fieldName); + } + + private JFieldVar createStaticExtraField(HasExtras holder, String extraKey, String fieldName) { + String staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(null, fieldName, "Extra"); + JFieldVar staticExtraField = holder.getGeneratedClass().fields().get(staticFieldName); + if (staticExtraField == null) { + staticExtraField = holder.getGeneratedClass().field(PUBLIC | STATIC | FINAL, classes().STRING, staticFieldName, lit(extraKey)); + } + return staticExtraField; + } + + private void injectExtraInComponent(Element element, HasExtras hasExtras, JFieldVar extraKeyStaticField, String fieldName) { + JVar extras = hasExtras.getInjectExtras(); + JBlock injectExtrasBlock = hasExtras.getInjectExtrasBlock(); + + BundleHelper bundleHelper = new BundleHelper(annotationHelper, element); + + JFieldRef extraField = JExpr.ref(fieldName); + JBlock ifContainsKey = injectExtrasBlock._if(JExpr.invoke(extras, "containsKey").arg(extraKeyStaticField))._then(); + + JExpression restoreMethodCall = JExpr.invoke(extras, bundleHelper.getMethodNameToRestore()).arg(extraKeyStaticField); + if (bundleHelper.restoreCallNeedCastStatement()) { + + JClass jclass = codeModelHelper.typeMirrorToJClass(element.asType(), hasExtras); + restoreMethodCall = JExpr.cast(jclass, restoreMethodCall); + + if (bundleHelper.restoreCallNeedsSuppressWarning()) { + JMethod injectExtrasMethod = hasExtras.getInjectExtrasMethod(); + if (injectExtrasMethod.annotations().size() == 0) { + injectExtrasMethod.annotate(SuppressWarnings.class).param("value", "unchecked"); + } + } + + } + + /* + * Handle the android bug : getIntent().getExtras().getByteArray() + * always returns null; + */ + restoreMethodCall = handleByteArrayExtraBug(element, extraKeyStaticField, restoreMethodCall); + + ifContainsKey.assign(extraField, restoreMethodCall); + } + + private JExpression handleByteArrayExtraBug(Element element, JFieldVar extraKeyStaticField, JExpression restoreMethodCall) { + if ("byte[]".equals(element.asType().toString())) { + restoreMethodCall = invoke("getIntent").invoke("getByteArrayExtra").arg(extraKeyStaticField); + } + return restoreMethodCall; + } + + private void createIntentInjectionMethod(Element element, HasIntentBuilder holder, JFieldVar extraKeyStaticField, String fieldName) { + holder.getIntentBuilder().getPutExtraMethod(element.asType(), fieldName, extraKeyStaticField); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FocusChangeProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java similarity index 63% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FocusChangeProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java index a8bf27df11..83ab17b234 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FocusChangeProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FocusChangeHandler.java @@ -13,16 +13,19 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; 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.VariableElement; import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.FocusChange; -import org.androidannotations.rclass.IRClass; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; @@ -32,20 +35,21 @@ import com.sun.codemodel.JMod; import com.sun.codemodel.JVar; -/** - * - * @author Rostislav Chekan - * - */ -public class FocusChangeProcessor extends AbstractListenerProcessor { +public class FocusChangeHandler extends AbstractListenerHandler { - public FocusChangeProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); + public FocusChangeHandler(ProcessingEnvironment processingEnvironment) { + super(FocusChange.class, processingEnvironment); } @Override - public String getTarget() { - return FocusChange.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + ExecutableElement executableElement = (ExecutableElement) element; + + validatorHelper.returnTypeIsVoid(executableElement, valid); + + validatorHelper.param.hasZeroOrOneViewOrTwoViewBooleanParameters(executableElement, valid); } @Override @@ -55,8 +59,8 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror @Override protected void processParameters(JMethod listenerMethod, JInvocation call, List parameters) { - JVar viewParam = listenerMethod.param(classes.VIEW, "view"); - JVar hasFocusParam = listenerMethod.param(codeModel.BOOLEAN, "hasFocus"); + JVar viewParam = listenerMethod.param(classes().VIEW, "view"); + JVar hasFocusParam = listenerMethod.param(codeModel().BOOLEAN, "hasFocus"); boolean hasFocusParamExists = parameters.size() == 2; boolean viewParamExists = parameters.size() >= 1; @@ -70,7 +74,7 @@ protected void processParameters(JMethod listenerMethod, JInvocation call, List< @Override protected JMethod createListenerMethod(JDefinedClass listenerAnonymousClass) { - return listenerAnonymousClass.method(JMod.PUBLIC, codeModel.VOID, "onFocusChange"); + return listenerAnonymousClass.method(JMod.PUBLIC, codeModel().VOID, "onFocusChange"); } @Override @@ -80,6 +84,6 @@ protected String getSetterName() { @Override protected JClass getListenerClass() { - return classes.VIEW_ON_FOCUS_CHANGE_LISTENER; + return classes().VIEW_ON_FOCUS_CHANGE_LISTENER; } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FragmentArgHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FragmentArgHandler.java new file mode 100644 index 0000000000..d3673e7ada --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FragmentArgHandler.java @@ -0,0 +1,124 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JExpr.lit; +import static com.sun.codemodel.JMod.FINAL; +import static com.sun.codemodel.JMod.PUBLIC; +import static com.sun.codemodel.JMod.STATIC; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.annotations.FragmentArg; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.AnnotationHelper; +import org.androidannotations.helper.BundleHelper; +import org.androidannotations.helper.CaseHelper; +import org.androidannotations.holder.EFragmentHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JExpression; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; + +public class FragmentArgHandler extends BaseAnnotationHandler { + + private final AnnotationHelper annotationHelper; + private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + + public FragmentArgHandler(ProcessingEnvironment processingEnvironment) { + super(FragmentArg.class, processingEnvironment); + annotationHelper = new AnnotationHelper(processingEnv); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEFragment(element, validatedElements, valid); + + validatorHelper.isNotPrivate(element, valid); + } + + @Override + public void process(Element element, EFragmentHolder holder) { + FragmentArg annotation = element.getAnnotation(FragmentArg.class); + String argKey = annotation.value(); + String fieldName = element.getSimpleName().toString(); + + if (argKey.isEmpty()) { + argKey = fieldName; + } + + BundleHelper bundleHelper = new BundleHelper(annotationHelper, element); + JFieldVar argKeyStaticField = createStaticArgField(holder, argKey, fieldName); + injectArgInComponent(element, holder, bundleHelper, argKeyStaticField, fieldName); + createBuilderInjectionMethod(element, holder, bundleHelper, argKeyStaticField, fieldName); + } + + private JFieldVar createStaticArgField(EFragmentHolder holder, String argKey, String fieldName) { + String staticFieldName; + if (fieldName.endsWith("Arg")) { + staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(fieldName); + } else { + staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(fieldName + "Arg"); + } + return holder.getGeneratedClass().field(PUBLIC | STATIC | FINAL, classes().STRING, staticFieldName, lit(argKey)); + } + + private void injectArgInComponent(Element element, EFragmentHolder holder, BundleHelper bundleHelper, JFieldVar extraKeyStaticField, String fieldName) { + JVar bundle = holder.getInjectBundleArgs(); + JBlock injectExtrasBlock = holder.getInjectArgsBlock(); + JFieldRef extraField = JExpr.ref(fieldName); + + JBlock ifContainsKey = injectExtrasBlock._if(JExpr.invoke(bundle, "containsKey").arg(extraKeyStaticField))._then(); + JExpression restoreMethodCall = JExpr.invoke(bundle, bundleHelper.getMethodNameToRestore()).arg(extraKeyStaticField); + if (bundleHelper.restoreCallNeedCastStatement()) { + + JClass jclass = codeModelHelper.typeMirrorToJClass(element.asType(), holder); + restoreMethodCall = JExpr.cast(jclass, restoreMethodCall); + + if (bundleHelper.restoreCallNeedsSuppressWarning()) { + JMethod injectExtrasMethod = holder.getInjectArgsMethod(); + if (injectExtrasMethod.annotations().size() == 0) { + injectExtrasMethod.annotate(SuppressWarnings.class).param("value", "unchecked"); + } + } + + } + ifContainsKey.assign(extraField, restoreMethodCall); + } + + private void createBuilderInjectionMethod(Element element, EFragmentHolder holder, BundleHelper bundleHelper, JFieldVar argKeyStaticField, String fieldName) { + JDefinedClass builderClass = holder.getBuilderClass(); + JVar builderArgsField = holder.getBuilderArgsField(); + TypeMirror elementType = element.asType(); + JClass paramClass = codeModelHelper.typeMirrorToJClass(elementType, holder); + + JMethod method = builderClass.method(PUBLIC, builderClass, fieldName); + JVar arg = method.param(paramClass, fieldName); + method.body().invoke(builderArgsField, bundleHelper.getMethodNameToSave()).arg(argKeyStaticField).arg(arg); + method.body()._return(_this()); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FragmentByIdHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FragmentByIdHandler.java new file mode 100644 index 0000000000..8e3e81142c --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FragmentByIdHandler.java @@ -0,0 +1,91 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JExpr.ref; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.annotations.FragmentById; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JMethod; + +public class FragmentByIdHandler extends BaseAnnotationHandler { + + private IdAnnotationHelper annotationHelper; + + public FragmentByIdHandler(ProcessingEnvironment processingEnvironment) { + super(FragmentById.class, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); + + validatorHelper.extendsFragment(element, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + } + + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) { + + TypeMirror elementType = element.asType(); + String typeQualifiedName = elementType.toString(); + TypeElement nativeFragmentElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT); + boolean isNativeFragment = nativeFragmentElement != null && annotationHelper.isSubtype(elementType, nativeFragmentElement.asType()); + + JMethod findFragmentById; + if (isNativeFragment) { + findFragmentById = holder.getFindNativeFragmentById(); + } else { + findFragmentById = holder.getFindSupportFragmentById(); + } + + String fieldName = element.getSimpleName().toString(); + + JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(processHolder, element, IRClass.Res.ID, true); + + JBlock methodBody = holder.getOnViewChangedBody(); + + methodBody.assign(ref(fieldName), cast(refClass(typeQualifiedName), invoke(findFragmentById).arg(idRef))); + + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FragmentByTagHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FragmentByTagHandler.java new file mode 100644 index 0000000000..320bd5fc3a --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FragmentByTagHandler.java @@ -0,0 +1,88 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JExpr.lit; +import static com.sun.codemodel.JExpr.ref; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.annotations.FragmentByTag; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JMethod; + +public class FragmentByTagHandler extends BaseAnnotationHandler { + + private IdAnnotationHelper annotationHelper; + + public FragmentByTagHandler(ProcessingEnvironment processingEnvironment) { + super(FragmentByTag.class, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); + + validatorHelper.extendsFragment(element, valid); + + validatorHelper.isNotPrivate(element, valid); + } + + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) { + + TypeMirror elementType = element.asType(); + String typeQualifiedName = elementType.toString(); + TypeMirror nativeFragmentType = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT).asType(); + boolean isNativeFragment = annotationHelper.isSubtype(elementType, nativeFragmentType); + + JMethod findFragmentByTag; + if (isNativeFragment) { + findFragmentByTag = holder.getFindNativeFragmentByTag(); + } else { + findFragmentByTag = holder.getFindSupportFragmentByTag(); + } + + String fieldName = element.getSimpleName().toString(); + FragmentByTag annotation = element.getAnnotation(FragmentByTag.class); + String tagValue = annotation.value(); + if (tagValue.equals("")) { + tagValue = fieldName; + } + + JBlock methodBody = holder.getOnViewChangedBody(); + methodBody.assign(ref(fieldName), cast(refClass(typeQualifiedName), invoke(findFragmentByTag).arg(lit(tagValue)))); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FromHtmlHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FromHtmlHandler.java new file mode 100644 index 0000000000..8f51a0418a --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FromHtmlHandler.java @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr._null; +import static com.sun.codemodel.JExpr.ref; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; + +import org.androidannotations.annotations.FromHtml; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldRef; + +public class FromHtmlHandler extends BaseAnnotationHandler { + + private IdAnnotationHelper annotationHelper; + + public FromHtmlHandler(ProcessingEnvironment processingEnvironment) { + super(FromHtml.class, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); + + validatorHelper.hasViewByIdAnnotation(element, validatedElements, valid); + + validatorHelper.extendsTextView(element, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.STRING, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + } + + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) { + String fieldName = element.getSimpleName().toString(); + + JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(processHolder, element, IRClass.Res.STRING, true); + + JBlock methodBody = holder.getOnViewChangedBody(); + methodBody // + ._if(ref(fieldName).ne(_null())) // + ._then() // + .invoke(ref(fieldName), "setText").arg(classes().HTML.staticInvoke("fromHtml").arg(holder.getContextRef().invoke("getString").arg(idRef))); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FullscreenValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FullscreenHandler.java similarity index 51% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FullscreenValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FullscreenHandler.java index eaac1154c6..5ca87c04d0 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FullscreenValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/FullscreenHandler.java @@ -13,38 +13,35 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; +package org.androidannotations.handler; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JInvocation; import org.androidannotations.annotations.Fullscreen; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EActivityHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; -public class FullscreenValidator implements ElementValidator { +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; - private ValidatorHelper validatorHelper; +import static com.sun.codemodel.JExpr.invoke; - public FullscreenValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } +public class FullscreenHandler extends BaseAnnotationHandler { - @Override - public String getTarget() { - return Fullscreen.class.getName(); + public FullscreenHandler(ProcessingEnvironment processingEnvironment) { + super(Fullscreen.class, processingEnvironment); } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { validatorHelper.hasEActivity(element, validatedElements, valid); - - return valid.isValid(); } + @Override + public void process(Element element, EActivityHolder holder) { + JFieldRef fullScreen = classes().WINDOW_MANAGER_LAYOUT_PARAMS.staticRef("FLAG_FULLSCREEN"); + JInvocation setFlagsInvocation = invoke(invoke("getWindow"), "setFlags").arg(fullScreen).arg(fullScreen); + holder.getInitBody().add(setFlagsInvocation); + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/DecoratingElementProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/GeneratingAnnotationHandler.java similarity index 58% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/DecoratingElementProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/GeneratingAnnotationHandler.java index f2410be6e5..1de8fff9e1 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/DecoratingElementProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/GeneratingAnnotationHandler.java @@ -13,19 +13,14 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; -import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; -import org.androidannotations.helper.HasTarget; -import com.sun.codemodel.JCodeModel; +import org.androidannotations.holder.GeneratedClassHolder; +import org.androidannotations.process.ProcessHolder; -/** - * An enclosed element is either a field or a method. If you come up with a - * better name, please let us know ! - */ -public interface DecoratingElementProcessor extends HasTarget { - - void process(Element element, JCodeModel codeModel, EBeanHolder eBeanHolder) throws Exception; +public interface GeneratingAnnotationHandler extends AnnotationHandler { + T createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception; } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/HierarchyViewerSupportHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/HierarchyViewerSupportHandler.java new file mode 100644 index 0000000000..16ea979599 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/HierarchyViewerSupportHandler.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr._this; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; + +import org.androidannotations.annotations.HierarchyViewerSupport; +import org.androidannotations.api.ViewServer; +import org.androidannotations.holder.EActivityHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import com.sun.codemodel.JInvocation; + +public class HierarchyViewerSupportHandler extends BaseAnnotationHandler { + + public HierarchyViewerSupportHandler(ProcessingEnvironment processingEnvironment) { + super(HierarchyViewerSupport.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.hasEActivity(element, validatedElements, valid); + + validatorHelper.isDebuggable(element, androidManifest, valid); + + validatorHelper.hasInternetPermission(element, androidManifest, valid); + } + + @Override + public void process(Element element, EActivityHolder holder) throws Exception { + generateApiClass(element, ViewServer.class); + + JInvocation viewServerInvocation = classes().VIEW_SERVER.staticInvoke("get").arg(_this()); + + holder.getOnViewChangedBody().invoke(viewServerInvocation, "addWindow").arg(_this()); + holder.getOnDestroyAfterSuperBlock().invoke(viewServerInvocation, "removeWindow").arg(_this()); + holder.getOnResumeAfterSuperBlock().invoke(viewServerInvocation, "setFocusedWindow").arg(_this()); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/HttpsClientProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/HttpsClientHandler.java similarity index 78% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/HttpsClientProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/HttpsClientHandler.java index 341cae2639..33a12a1bc2 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/HttpsClientProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/HttpsClientHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import static com.sun.codemodel.JExpr._new; import static com.sun.codemodel.JExpr._null; @@ -23,18 +23,20 @@ import static com.sun.codemodel.JExpr.lit; import static com.sun.codemodel.JExpr.ref; +import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import org.androidannotations.annotations.HttpsClient; import org.androidannotations.annotations.ResId; -import org.androidannotations.processing.EBeansHolder.Classes; +import org.androidannotations.holder.EComponentHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; import org.androidannotations.rclass.IRInnerClass; import com.sun.codemodel.JBlock; import com.sun.codemodel.JCatchBlock; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JDefinedClass; import com.sun.codemodel.JExpression; import com.sun.codemodel.JFieldRef; @@ -44,40 +46,40 @@ import com.sun.codemodel.JTryBlock; import com.sun.codemodel.JVar; -public class HttpsClientProcessor implements DecoratingElementProcessor { +public class HttpsClientHandler extends BaseAnnotationHandler { - private final IRClass rClass; - - public HttpsClientProcessor(IRClass rClass) { - this.rClass = rClass; + public HttpsClientHandler(ProcessingEnvironment processingEnvironment) { + super(HttpsClient.class, processingEnvironment); } @Override - public String getTarget() { - return HttpsClient.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); + + validatorHelper.annotationParameterIsOptionalValidResId(element, IRClass.Res.RAW, "keyStore", valid); + validatorHelper.annotationParameterIsOptionalValidResId(element, IRClass.Res.RAW, "trustStore", valid); + + validatorHelper.isNotPrivate(element, valid); } @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - + public void process(Element element, EComponentHolder holder) throws Exception { HttpsClient annotation = element.getAnnotation(HttpsClient.class); int trustStoreRawId = annotation.trustStore(); String trustStorePwd = annotation.trustStorePwd(); - int keyStoreRawId = annotation.keyStore(); String keyStorePwd = annotation.keyStorePwd(); boolean allowAllHostnames = annotation.allowAllHostnames(); - - boolean useCustomTrustStore = ResId.DEFAULT_VALUE != trustStoreRawId ? true : false; - boolean useCustomKeyStore = ResId.DEFAULT_VALUE != keyStoreRawId ? true : false; + boolean useCustomTrustStore = ResId.DEFAULT_VALUE != trustStoreRawId; + boolean useCustomKeyStore = ResId.DEFAULT_VALUE != keyStoreRawId; String fieldName = element.getSimpleName().toString(); - JBlock methodBody = holder.initBody; + JBlock methodBody = holder.getInitBody(); - Classes classes = holder.classes(); + ProcessHolder.Classes classes = classes(); - JDefinedClass jAnonClass = codeModel.anonymousClass(classes.DEFAULT_HTTP_CLIENT); + JDefinedClass jAnonClass = codeModel().anonymousClass(classes.DEFAULT_HTTP_CLIENT); JMethod method = jAnonClass.method(JMod.PROTECTED, classes.CLIENT_CONNECTION_MANAGER, "createClientConnectionManager"); method.annotate(Override.class); @@ -91,7 +93,7 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { jVarKeystore.init(classes.KEY_STORE.staticInvoke("getInstance").arg("BKS")); } - if (useCustomTrustStore || !useCustomTrustStore && useCustomKeyStore) { + if (useCustomTrustStore || useCustomKeyStore) { /* * use default trust store */ @@ -108,15 +110,15 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { jVarRes = jTryBlock.body().decl(classes.RESOURCES, "res", invoke("getResources")); } - IRInnerClass rInnerClass = rClass.get(Res.RAW); + IRInnerClass rInnerClass = rClass.get(IRClass.Res.RAW); if (useCustomKeyStore) { - JFieldRef rawIdRef = rInnerClass.getIdStaticRef(keyStoreRawId, holder); + JFieldRef rawIdRef = rInnerClass.getIdStaticRef(keyStoreRawId, processHolder); JInvocation jInvRawKey = jVarRes.invoke("openRawResource").arg(rawIdRef); jVarKeyFile = jTryBlock.body().decl(classes.INPUT_STREAM, "inKeystore", jInvRawKey); } if (useCustomTrustStore) { - JFieldRef rawIdRef = rInnerClass.getIdStaticRef(trustStoreRawId, holder); + JFieldRef rawIdRef = rInnerClass.getIdStaticRef(trustStoreRawId, processHolder); JInvocation jInvRawTrust = jVarRes.invoke("openRawResource").arg(rawIdRef); jVarTrstFile = jTryBlock.body().decl(classes.INPUT_STREAM, "inTrustStore", jInvRawTrust); @@ -132,18 +134,15 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { jTryLoad.body().add(invoke(jVarKeystore, "load").arg(jVarKeyFile).arg(invoke(lit(keyStorePwd), "toCharArray"))); } - if (useCustomTrustStore || !useCustomTrustStore && useCustomKeyStore) { - jTryLoad.body().add(invoke(jVarTrusted, "load").arg(jVarTrstFile).arg(invoke(lit(trustStorePwd), "toCharArray"))); - } + jTryLoad.body().add(invoke(jVarTrusted, "load").arg(jVarTrstFile).arg(invoke(lit(trustStorePwd), "toCharArray"))); + // finally load JBlock jFinally = jTryLoad._finally(); if (useCustomKeyStore) { jFinally.add(invoke(jVarKeyFile, "close")); } - if (useCustomTrustStore || !useCustomTrustStore && useCustomKeyStore) { - jFinally.add(invoke(jVarTrstFile, "close")); - } + jFinally.add(invoke(jVarTrstFile, "close")); } if (null == jVarKeystore && null == jVarTrusted) { @@ -159,7 +158,7 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { } else { JVar jVarSslFact = jTryBlock.body().decl(classes.SSL_SOCKET_FACTORY, "newSslSocketFactory"); - jVarSslFact.init(_new(classes.SSL_SOCKET_FACTORY).arg(null == jVarKeystore ? _null() : jVarKeystore).arg(keyStorePwd).arg(null == jVarTrusted ? _null() : jVarTrusted)); + jVarSslFact.init(_new(classes.SSL_SOCKET_FACTORY).arg(null == jVarKeystore ? _null() : jVarKeystore).arg(keyStorePwd).arg(jVarTrusted)); if (allowAllHostnames) { jTryBlock.body().add(invoke(jVarSslFact, "setHostnameVerifier").arg(classes.SSL_SOCKET_FACTORY.staticRef("ALLOW_ALL_HOSTNAME_VERIFIER"))); @@ -181,7 +180,5 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { jCatchBlock.body()._return(_super().invoke("createClientConnectionManager")); methodBody.assign(ref(fieldName), _new(jAnonClass)); - } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/InstanceStateHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/InstanceStateHandler.java new file mode 100644 index 0000000000..2aca2214d8 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/InstanceStateHandler.java @@ -0,0 +1,89 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.ref; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; + +import org.androidannotations.annotations.InstanceState; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.AnnotationHelper; +import org.androidannotations.helper.BundleHelper; +import org.androidannotations.holder.HasInstanceState; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JExpression; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JInvocation; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; + +public class InstanceStateHandler extends BaseAnnotationHandler { + + public InstanceStateHandler(ProcessingEnvironment processingEnvironment) { + super(InstanceState.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEActivityOrEFragment(element, validatedElements, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.canBeSavedAsInstanceState(element, valid); + } + + @Override + public void process(Element element, HasInstanceState holder) { + String fieldName = element.getSimpleName().toString(); + + JBlock saveStateBody = holder.getSaveStateMethodBody(); + JVar saveStateBundleParam = holder.getSaveStateBundleParam(); + JMethod restoreStateMethod = holder.getRestoreStateMethod(); + JBlock restoreStateBody = restoreStateMethod.body(); + JVar restoreStateBundleParam = holder.getRestoreStateBundleParam(); + + AnnotationHelper annotationHelper = new AnnotationHelper(processingEnv); + BundleHelper bundleHelper = new BundleHelper(annotationHelper, element); + APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + + JFieldRef ref = ref(fieldName); + saveStateBody.invoke(saveStateBundleParam, bundleHelper.getMethodNameToSave()).arg(fieldName).arg(ref); + + JInvocation restoreMethodCall = JExpr.invoke(restoreStateBundleParam, bundleHelper.getMethodNameToRestore()).arg(fieldName); + if (bundleHelper.restoreCallNeedCastStatement()) { + + JClass jclass = codeModelHelper.typeMirrorToJClass(element.asType(), holder); + JExpression castStatement = JExpr.cast(jclass, restoreMethodCall); + restoreStateBody.assign(ref, castStatement); + + if (bundleHelper.restoreCallNeedsSuppressWarning()) { + if (restoreStateMethod.annotations().size() == 0) { + restoreStateMethod.annotate(SuppressWarnings.class).param("value", "unchecked"); + } + } + + } else { + restoreStateBody.assign(ref, restoreMethodCall); + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ItemClickHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ItemClickHandler.java new file mode 100644 index 0000000000..7b6892e3e4 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ItemClickHandler.java @@ -0,0 +1,105 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import com.sun.codemodel.*; +import org.androidannotations.annotations.ItemClick; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import java.util.List; + +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JExpr.invoke; + +public class ItemClickHandler extends AbstractListenerHandler { + + private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + + public ItemClickHandler(ProcessingEnvironment processingEnvironment) { + super(ItemClick.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + ExecutableElement executableElement = (ExecutableElement) element; + + validatorHelper.returnTypeIsVoid(executableElement, valid); + + validatorHelper.param.zeroOrOneParameter(executableElement, valid); + } + + @Override + protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror returnType) { + listenerMethodBody.add(call); + } + + @Override + protected void processParameters(JMethod listenerMethod, JInvocation call, List parameters) { + boolean hasItemParameter = parameters.size() == 1; + + JClass narrowAdapterViewClass = classes().ADAPTER_VIEW.narrow(codeModel().wildcard()); + JVar onItemClickParentParam = listenerMethod.param(narrowAdapterViewClass, "parent"); + listenerMethod.param(classes().VIEW, "view"); + JVar onItemClickPositionParam = listenerMethod.param(codeModel().INT, "position"); + listenerMethod.param(codeModel().LONG, "id"); + + if (hasItemParameter) { + VariableElement parameter = parameters.get(0); + + TypeMirror parameterType = parameter.asType(); + if (parameterType.getKind() == TypeKind.INT) { + call.arg(onItemClickPositionParam); + } else { + JClass parameterClass = codeModelHelper.typeMirrorToJClass(parameterType, getHolder()); + call.arg(cast(parameterClass, invoke(onItemClickParentParam, "getAdapter").invoke("getItem").arg(onItemClickPositionParam))); + + if (parameterClass.isParameterized()) { + listenerMethod.annotate(SuppressWarnings.class).param("value", "unchecked"); + } + } + } + } + + @Override + protected JMethod createListenerMethod(JDefinedClass listenerAnonymousClass) { + return listenerAnonymousClass.method(JMod.PUBLIC, codeModel().VOID, "onItemClick"); + } + + @Override + protected String getSetterName() { + return "setOnItemClickListener"; + } + + @Override + protected JClass getListenerClass() { + return classes().ON_ITEM_CLICK_LISTENER; + } + + @Override + protected JType getViewClass() { + return classes().ADAPTER_VIEW.narrow(codeModel().wildcard()); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ItemLongClickHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ItemLongClickHandler.java new file mode 100644 index 0000000000..1b43d870a0 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ItemLongClickHandler.java @@ -0,0 +1,114 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JExpr.invoke; + +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.VariableElement; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.annotations.ItemLongClick; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JInvocation; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JMod; +import com.sun.codemodel.JType; +import com.sun.codemodel.JVar; + +public class ItemLongClickHandler extends AbstractListenerHandler { + + public ItemLongClickHandler(ProcessingEnvironment processingEnvironment) { + super(ItemLongClick.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + ExecutableElement executableElement = (ExecutableElement) element; + + validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid); + + validatorHelper.param.zeroOrOneParameter(executableElement, valid); + } + + @Override + protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror returnType) { + boolean returnMethodResult = returnType.getKind() != TypeKind.VOID; + if (returnMethodResult) { + listenerMethodBody._return(call); + } else { + listenerMethodBody.add(call); + listenerMethodBody._return(JExpr.TRUE); + } + } + + @Override + protected void processParameters(JMethod listenerMethod, JInvocation call, List parameters) { + boolean hasItemParameter = parameters.size() == 1; + + JClass narrowAdapterViewClass = classes().ADAPTER_VIEW.narrow(codeModel().wildcard()); + JVar onItemClickParentParam = listenerMethod.param(narrowAdapterViewClass, "parent"); + listenerMethod.param(classes().VIEW, "view"); + JVar onItemClickPositionParam = listenerMethod.param(codeModel().INT, "position"); + listenerMethod.param(codeModel().LONG, "id"); + + if (hasItemParameter) { + VariableElement parameter = parameters.get(0); + + TypeMirror parameterType = parameter.asType(); + if (parameterType.getKind() == TypeKind.INT) { + call.arg(onItemClickPositionParam); + } else { + String parameterTypeQualifiedName = parameterType.toString(); + call.arg(cast(refClass(parameterTypeQualifiedName), invoke(onItemClickParentParam, "getAdapter").invoke("getItem").arg(onItemClickPositionParam))); + } + } + } + + @Override + protected JMethod createListenerMethod(JDefinedClass listenerAnonymousClass) { + return listenerAnonymousClass.method(JMod.PUBLIC, codeModel().BOOLEAN, "onItemLongClick"); + } + + @Override + protected String getSetterName() { + return "setOnItemLongClickListener"; + } + + @Override + protected JClass getListenerClass() { + return classes().ON_ITEM_LONG_CLICK_LISTENER; + } + + @Override + protected JType getViewClass() { + return classes().ADAPTER_VIEW.narrow(codeModel().wildcard()); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ItemSelectedProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ItemSelectHandler.java similarity index 50% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ItemSelectedProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ItemSelectHandler.java index 2ec8a65195..7091d6e83c 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ItemSelectedProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ItemSelectHandler.java @@ -13,11 +13,9 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; -import static com.sun.codemodel.JExpr._new; import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr.cast; import static com.sun.codemodel.JExpr.invoke; import static com.sun.codemodel.JExpr.lit; @@ -31,62 +29,52 @@ import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.ItemSelect; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.processing.EBeansHolder.Classes; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JDefinedClass; import com.sun.codemodel.JExpr; -import com.sun.codemodel.JFieldRef; import com.sun.codemodel.JInvocation; import com.sun.codemodel.JMethod; import com.sun.codemodel.JMod; +import com.sun.codemodel.JType; import com.sun.codemodel.JVar; -/** - */ -public class ItemSelectedProcessor implements DecoratingElementProcessor { +public class ItemSelectHandler extends AbstractListenerHandler { - private IdAnnotationHelper helper; + private JMethod onNothingSelectedMethod; - public ItemSelectedProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - helper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + public ItemSelectHandler(ProcessingEnvironment processingEnvironment) { + super(ItemSelect.class, processingEnvironment); } @Override - public String getTarget() { - return ItemSelect.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - Classes classes = holder.classes(); - - String methodName = element.getSimpleName().toString(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); ExecutableElement executableElement = (ExecutableElement) element; - List parameters = executableElement.getParameters(); - List idsRefs = helper.extractAnnotationFieldRefs(holder, element, Res.ID, true); + validatorHelper.returnTypeIsVoid(executableElement, valid); - JDefinedClass onItemSelectedListenerClass = codeModel.anonymousClass(classes.ON_ITEM_SELECTED_LISTENER); - JMethod onItemSelectedMethod = onItemSelectedListenerClass.method(JMod.PUBLIC, codeModel.VOID, "onItemSelected"); - onItemSelectedMethod.annotate(Override.class); + validatorHelper.param.hasOneOrTwoParametersAndFirstIsBoolean(executableElement, valid); + } - JClass narrowAdapterViewClass = classes.ADAPTER_VIEW.narrow(codeModel.wildcard()); - JVar onItemClickParentParam = onItemSelectedMethod.param(narrowAdapterViewClass, "parent"); - onItemSelectedMethod.param(classes.VIEW, "view"); - JVar onItemClickPositionParam = onItemSelectedMethod.param(codeModel.INT, "position"); - onItemSelectedMethod.param(codeModel.LONG, "id"); + @Override + protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror returnType) { + listenerMethodBody.add(call); + } - JInvocation itemSelectedCall = onItemSelectedMethod.body().invoke(methodName); + @Override + protected void processParameters(JMethod listenerMethod, JInvocation itemSelectedCall, List parameters) { + JClass narrowAdapterViewClass = classes().ADAPTER_VIEW.narrow(codeModel().wildcard()); + JVar onItemClickParentParam = listenerMethod.param(narrowAdapterViewClass, "parent"); + listenerMethod.param(classes().VIEW, "view"); + JVar onItemClickPositionParam = listenerMethod.param(codeModel().INT, "position"); + listenerMethod.param(codeModel().LONG, "id"); itemSelectedCall.arg(JExpr.TRUE); - boolean hasItemParameter = parameters.size() == 2; boolean secondParameterIsInt = false; String secondParameterQualifiedName = null; @@ -102,17 +90,12 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { if (secondParameterIsInt) { itemSelectedCall.arg(onItemClickPositionParam); } else { - itemSelectedCall.arg(JExpr.cast(holder.refClass(secondParameterQualifiedName), invoke(onItemClickParentParam, "getAdapter").invoke("getItem").arg(onItemClickPositionParam))); + itemSelectedCall.arg(JExpr.cast(refClass(secondParameterQualifiedName), invoke(onItemClickParentParam, "getAdapter").invoke("getItem").arg(onItemClickPositionParam))); } } - JMethod onNothingSelectedMethod = onItemSelectedListenerClass.method(JMod.PUBLIC, codeModel.VOID, "onNothingSelected"); - onNothingSelectedMethod.annotate(Override.class); - onNothingSelectedMethod.param(narrowAdapterViewClass, "parent"); - - JInvocation nothingSelectedCall = onNothingSelectedMethod.body().invoke(methodName); - + JInvocation nothingSelectedCall = onNothingSelectedMethod.body().invoke(getMethodName()); nothingSelectedCall.arg(JExpr.FALSE); if (hasItemParameter) { if (secondParameterIsInt) { @@ -121,12 +104,28 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { nothingSelectedCall.arg(_null()); } } + } - ViewChangedHolder onViewChanged = holder.onViewChanged(); - for (JFieldRef idRef : idsRefs) { - JBlock body = onViewChanged.body(); - body.add(invoke(cast(narrowAdapterViewClass, onViewChanged.findViewById(idRef)), "setOnItemSelectedListener").arg(_new(onItemSelectedListenerClass))); - } + @Override + protected JMethod createListenerMethod(JDefinedClass listenerAnonymousClass) { + onNothingSelectedMethod = listenerAnonymousClass.method(JMod.PUBLIC, codeModel().VOID, "onNothingSelected"); + onNothingSelectedMethod.annotate(Override.class); + return listenerAnonymousClass.method(JMod.PUBLIC, codeModel().VOID, "onItemSelected"); + } + + @Override + protected String getSetterName() { + return "setOnItemSelectedListener"; + } + + @Override + protected JClass getListenerClass() { + return classes().ON_ITEM_SELECTED_LISTENER; + } + + @Override + protected JType getViewClass() { + return classes().ADAPTER_VIEW.narrow(codeModel().wildcard()); } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/LongClickProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/LongClickHandler.java similarity index 67% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/LongClickProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/LongClickHandler.java index 66e1a23bbd..4e5c9f07cd 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/LongClickProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/LongClickHandler.java @@ -13,17 +13,20 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; 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.VariableElement; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.LongClick; -import org.androidannotations.rclass.IRClass; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; @@ -34,15 +37,21 @@ import com.sun.codemodel.JMod; import com.sun.codemodel.JVar; -public class LongClickProcessor extends AbstractListenerProcessor { +public class LongClickHandler extends AbstractListenerHandler { - public LongClickProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); + public LongClickHandler(ProcessingEnvironment processingEnvironment) { + super(LongClick.class, processingEnvironment); } @Override - public String getTarget() { - return LongClick.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + ExecutableElement executableElement = (ExecutableElement) element; + + validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid); + + validatorHelper.param.zeroOrOneViewParameter(executableElement, valid); } @Override @@ -59,7 +68,7 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror @Override protected void processParameters(JMethod listenerMethod, JInvocation call, List parameters) { boolean hasViewParameter = parameters.size() == 1; - JVar viewParam = listenerMethod.param(classes.VIEW, "view"); + JVar viewParam = listenerMethod.param(classes().VIEW, "view"); if (hasViewParameter) { call.arg(viewParam); } @@ -67,7 +76,7 @@ protected void processParameters(JMethod listenerMethod, JInvocation call, List< @Override protected JMethod createListenerMethod(JDefinedClass listenerAnonymousClass) { - return listenerAnonymousClass.method(JMod.PUBLIC, codeModel.BOOLEAN, "onLongClick"); + return listenerAnonymousClass.method(JMod.PUBLIC, codeModel().BOOLEAN, "onLongClick"); } @Override @@ -77,7 +86,6 @@ protected String getSetterName() { @Override protected JClass getListenerClass() { - return classes.VIEW_ON_LONG_CLICK_LISTENER; + return classes().VIEW_ON_LONG_CLICK_LISTENER; } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/NoTitleValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/NoTitleHandler.java similarity index 57% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/NoTitleValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/NoTitleHandler.java index d486ded02f..2530d003cf 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/NoTitleValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/NoTitleHandler.java @@ -13,38 +13,34 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import org.androidannotations.annotations.NoTitle; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EActivityHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; -public class NoTitleValidator implements ElementValidator { +import com.sun.codemodel.JFieldRef; - private ValidatorHelper validatorHelper; +@SuppressWarnings("deprecation") +public class NoTitleHandler extends BaseAnnotationHandler { - public NoTitleValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); + public NoTitleHandler(ProcessingEnvironment processingEnvironment) { + super(NoTitle.class, processingEnvironment); } @Override - public String getTarget() { - return NoTitle.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.hasEActivity(element, validatedElements, valid); } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); + public void process(Element element, EActivityHolder holder) { + JFieldRef noTitle = classes().WINDOW.staticRef("FEATURE_NO_TITLE"); - validatorHelper.hasEActivity(element, validatedElements, valid); - - return valid.isValid(); + holder.getInitBody().invoke("requestWindowFeature").arg(noTitle); } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/NonConfigurationInstanceHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/NonConfigurationInstanceHandler.java new file mode 100644 index 0000000000..aa2a99f9ff --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/NonConfigurationInstanceHandler.java @@ -0,0 +1,99 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JExpr.ref; +import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.annotations.Bean; +import org.androidannotations.annotations.NonConfigurationInstance; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.AnnotationHelper; +import org.androidannotations.holder.EActivityHolder; +import org.androidannotations.holder.NonConfigurationHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JClassAlreadyExistsException; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JVar; + +public class NonConfigurationInstanceHandler extends BaseAnnotationHandler { + + private final APTCodeModelHelper codeModelHelper; + private final AnnotationHelper annotationHelper; + + public NonConfigurationInstanceHandler(ProcessingEnvironment processingEnvironment) { + super(NonConfigurationInstance.class, processingEnvironment); + annotationHelper = new AnnotationHelper(processingEnv); + codeModelHelper = new APTCodeModelHelper(); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEActivity(element, validatedElements, valid); + + validatorHelper.isNotPrivate(element, valid); + } + + @Override + public void process(Element element, EActivityHolder holder) throws JClassAlreadyExistsException { + String fieldName = element.getSimpleName().toString(); + JClass fieldType = codeModelHelper.typeMirrorToJClass(element.asType(), holder); + + NonConfigurationHolder ncHolder = holder.getNonConfigurationHolder(); + JFieldVar ncHolderField = ncHolder.createField(fieldName, fieldType); + + injectInInit(element, holder, fieldName, ncHolderField); + retainInOnRetain(holder, fieldName, ncHolderField); + } + + private void injectInInit(Element element, EActivityHolder holder, String fieldName, JFieldVar ncHolderField) throws JClassAlreadyExistsException { + JBlock initIfNonConfigurationNotNullBlock = holder.getInitIfNonConfigurationNotNullBlock(); + JVar initNonConfigurationInstance = holder.getInitNonConfigurationInstance(); + initIfNonConfigurationNotNullBlock.assign(ref(fieldName), initNonConfigurationInstance.ref(ncHolderField)); + rebindContextIfBean(element, initIfNonConfigurationNotNullBlock, ncHolderField); + } + + private void retainInOnRetain(EActivityHolder holder, String fieldName, JFieldVar ncHolderField) throws JClassAlreadyExistsException { + JBlock onRetainNonConfigurationInstanceBindBlock = holder.getOnRetainNonConfigurationInstanceBindBlock(); + JVar onRetainNonConfigurationInstance = holder.getOnRetainNonConfigurationInstance(); + onRetainNonConfigurationInstanceBindBlock.assign(onRetainNonConfigurationInstance.ref(ncHolderField), ref(fieldName)); + } + + private void rebindContextIfBean(Element element, JBlock initIfNonConfigurationNotNullBlock, JFieldVar field) { + boolean hasBeanAnnotation = element.getAnnotation(Bean.class) != null; + if (hasBeanAnnotation) { + + TypeMirror elementType = annotationHelper.extractAnnotationClassParameter(element, Bean.class.getName()); + if (elementType == null) { + elementType = element.asType(); + } + String typeQualifiedName = elementType.toString(); + JClass fieldGeneratedBeanClass = refClass(typeQualifiedName + GENERATION_SUFFIX); + + initIfNonConfigurationNotNullBlock.invoke(cast(fieldGeneratedBeanClass, field), "rebind").arg(_this()); + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OnActivityResultHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OnActivityResultHandler.java new file mode 100644 index 0000000000..3069dfe899 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OnActivityResultHandler.java @@ -0,0 +1,99 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +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.VariableElement; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.annotations.OnActivityResult; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.holder.HasOnActivityResult; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JExpression; +import com.sun.codemodel.JInvocation; +import com.sun.codemodel.JVar; + +public class OnActivityResultHandler extends BaseAnnotationHandler { + + public OnActivityResultHandler(ProcessingEnvironment processingEnvironment) { + super(OnActivityResult.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEActivityOrEFragment(element, validatedElements, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.doesntThrowException(element, valid); + + OnActivityResult onResultAnnotation = element.getAnnotation(OnActivityResult.class); + validatorHelper.annotationValuePositiveAndInAShort(element, valid, onResultAnnotation.value()); + + ExecutableElement executableElement = (ExecutableElement) element; + validatorHelper.returnTypeIsVoid(executableElement, valid); + + validatorHelper.hasOnResultMethodParameters(executableElement, valid); + } + + @Override + public void process(Element element, HasOnActivityResult holder) throws Exception { + String methodName = element.getSimpleName().toString(); + + ExecutableElement executableElement = (ExecutableElement) element; + List parameters = executableElement.getParameters(); + + int intentParameterPosition = -1; + int resultCodeParameterPosition = -1; + + for (int i = 0; i < parameters.size(); i++) { + VariableElement parameter = parameters.get(i); + TypeMirror parameterType = parameter.asType(); + + if (CanonicalNameConstants.INTENT.equals(parameterType.toString())) { + intentParameterPosition = i; + } else if (parameterType.getKind().equals(TypeKind.INT) // + || CanonicalNameConstants.INTEGER.equals(parameterType.toString())) { + resultCodeParameterPosition = i; + } + } + + int requestCode = executableElement.getAnnotation(OnActivityResult.class).value(); + JBlock onActivityResultCase = holder.getOnActivityResultCaseBlock(requestCode); + + JExpression activityRef = holder.getGeneratedClass().staticRef("this"); + JInvocation onResultInvocation = onActivityResultCase.invoke(activityRef, methodName); + + for (int i = 0; i < parameters.size(); i++) { + if (i == intentParameterPosition) { + JVar intentParameter = holder.getOnActivityResultDataParam(); + onResultInvocation.arg(intentParameter); + } else if (i == resultCodeParameterPosition) { + JVar resultCodeParameter = holder.getOnActivityResultResultCodeParam(); + onResultInvocation.arg(resultCodeParameter); + } + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OptionsItemHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OptionsItemHandler.java new file mode 100644 index 0000000000..c69fb27b24 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OptionsItemHandler.java @@ -0,0 +1,109 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.TRUE; +import static com.sun.codemodel.JExpr.invoke; + +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.VariableElement; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.annotations.OptionsItem; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.HasOptionsMenu; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JExpression; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JInvocation; + +public class OptionsItemHandler extends BaseAnnotationHandler { + + private IdAnnotationHelper annotationHelper; + + public OptionsItemHandler(ProcessingEnvironment processingEnvironment) { + super(OptionsItem.class, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEActivityOrEFragment(element, validatedElements, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.doesntThrowException(element, valid); + + validatorHelper.uniqueId(element, validatedElements, valid); + + ExecutableElement executableElement = (ExecutableElement) element; + + validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid); + + validatorHelper.param.zeroOrOneMenuItemParameter(executableElement, valid); + } + + @Override + public void process(Element element, HasOptionsMenu holder) { + String methodName = element.getSimpleName().toString(); + + ExecutableElement executableElement = (ExecutableElement) element; + List parameters = executableElement.getParameters(); + TypeMirror returnType = executableElement.getReturnType(); + boolean returnMethodResult = returnType.getKind() != TypeKind.VOID; + + boolean hasItemParameter = parameters.size() == 1; + + List idsRefs = annotationHelper.extractAnnotationFieldRefs(processHolder, element, IRClass.Res.ID, true); + JExpression ifExpr = holder.getOnOptionsItemSelectedItemId().eq(idsRefs.get(0)); + for (int i = 1; i < idsRefs.size(); i++) { + ifExpr = ifExpr.cor(holder.getOnOptionsItemSelectedItemId().eq(idsRefs.get(i))); + } + + JBlock itemIfBody = holder.getOnOptionsItemSelectedIfElseBlock()._if(ifExpr)._then(); + JInvocation methodCall = invoke(methodName); + + if (returnMethodResult) { + itemIfBody._return(methodCall); + } else { + itemIfBody.add(methodCall); + itemIfBody._return(TRUE); + } + + if (hasItemParameter) { + methodCall.arg(holder.getOnOptionsItemSelectedItem()); + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OptionsMenuHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OptionsMenuHandler.java new file mode 100644 index 0000000000..bad4e49a35 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OptionsMenuHandler.java @@ -0,0 +1,70 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import java.util.List; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; + +import org.androidannotations.annotations.OptionsMenu; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.HasOptionsMenu; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JVar; + +public class OptionsMenuHandler extends BaseAnnotationHandler { + + private IdAnnotationHelper annotationHelper; + + public OptionsMenuHandler(ProcessingEnvironment processingEnvironment) { + super(OptionsMenu.class, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.hasEActivityOrEFragment(element, validatedElements, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.MENU, IdValidatorHelper.FallbackStrategy.NEED_RES_ID, valid); + } + + @Override + public void process(Element element, HasOptionsMenu holder) { + JBlock body = holder.getOnCreateOptionsMenuMethodBody(); + JVar menuInflater = holder.getOnCreateOptionsMenuMenuInflaterVar(); + JVar menuParam = holder.getOnCreateOptionsMenuMenuParam(); + + List fieldRefs = annotationHelper.extractAnnotationFieldRefs(processHolder, element, IRClass.Res.MENU, false); + for (JFieldRef optionsMenuRefId : fieldRefs) { + body.invoke(menuInflater, "inflate").arg(optionsMenuRefId).arg(menuParam); + } + + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OptionsMenuItemHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OptionsMenuItemHandler.java new file mode 100644 index 0000000000..810d89655e --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OptionsMenuItemHandler.java @@ -0,0 +1,73 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.ref; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; + +import org.androidannotations.annotations.OptionsMenuItem; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.HasOptionsMenu; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JVar; + +public class OptionsMenuItemHandler extends BaseAnnotationHandler { + + private IdAnnotationHelper annotationHelper; + + public OptionsMenuItemHandler(ProcessingEnvironment processingEnvironment) { + super(OptionsMenuItem.class, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEActivityOrEFragment(element, validatedElements, valid); + + validatorHelper.isDeclaredType(element, valid); + + validatorHelper.extendsMenuItem(element, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + } + + @Override + public void process(Element element, HasOptionsMenu holder) { + String fieldName = element.getSimpleName().toString(); + JBlock body = holder.getOnCreateOptionsMenuMethodBody(); + JVar menuParam = holder.getOnCreateOptionsMenuMenuParam(); + + JFieldRef idsRef = annotationHelper.extractOneAnnotationFieldRef(processHolder, element, IRClass.Res.ID, true); + body.assign(ref(fieldName), menuParam.invoke("findItem").arg(idsRef)); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OrmLiteDaoHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OrmLiteDaoHandler.java new file mode 100644 index 0000000000..d540008cd4 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/OrmLiteDaoHandler.java @@ -0,0 +1,102 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import com.sun.codemodel.*; +import org.androidannotations.annotations.OrmLiteDao; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.helper.TargetAnnotationHelper; +import org.androidannotations.holder.EComponentHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; + +import static com.sun.codemodel.JExpr.ref; + +public class OrmLiteDaoHandler extends BaseAnnotationHandler { + + private TargetAnnotationHelper annotationHelper; + + public OrmLiteDaoHandler(ProcessingEnvironment processingEnvironment) { + super(OrmLiteDao.class, processingEnvironment); + annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.hasOrmLiteJars(element, valid); + + validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.extendsOrmLiteDaoWithValidModelParameter(element, valid); + + validatorHelper.hasASqlLiteOpenHelperParameterizedType(element, valid); + } + + @Override + public void process(Element element, EComponentHolder holder) { + String fieldName = element.getSimpleName().toString(); + + TypeMirror modelObjectTypeMirror = annotationHelper.extractAnnotationParameter(element, "model"); + JExpression modelClass = refClass(modelObjectTypeMirror.toString()).dotclass(); + + TypeMirror databaseHelperTypeMirror = annotationHelper.extractAnnotationParameter(element, "helper"); + JFieldVar databaseHelperRef = holder.getDatabaseHelperRef(databaseHelperTypeMirror); + + JBlock initBody = holder.getInitBody(); + + JExpression injectExpr; + if (elementExtendsRuntimeExceptionDao(element, modelObjectTypeMirror)) { + + injectExpr = classes().RUNTIME_EXCEPTION_DAO// + .staticInvoke("createDao") // + .arg(databaseHelperRef.invoke("getConnectionSource")) // + .arg(modelClass); + + } else { + + injectExpr = databaseHelperRef.invoke("getDao").arg(modelClass); + + } + + JTryBlock tryBlock = initBody._try(); + tryBlock.body().assign(ref(fieldName), injectExpr); + + JCatchBlock catchBlock = tryBlock._catch(classes().SQL_EXCEPTION); + JVar exception = catchBlock.param("e"); + + catchBlock.body() // + .staticInvoke(classes().LOG, "e") // + .arg(holder.getGeneratedClass().name()) // + .arg("Could not create DAO " + fieldName) // + .arg(exception); + } + + private boolean elementExtendsRuntimeExceptionDao(Element element, TypeMirror modelObjectTypeMirror) { + TypeMirror elementType = element.asType(); + TypeElement runtimeExceptionDaoTypeElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.RUNTIME_EXCEPTION_DAO); + TypeMirror wildcardType = annotationHelper.getTypeUtils().getWildcardType(null, null); + DeclaredType runtimeExceptionDaoParameterizedType = annotationHelper.getTypeUtils().getDeclaredType(runtimeExceptionDaoTypeElement, modelObjectTypeMirror, wildcardType); + return annotationHelper.isSubtype(elementType, runtimeExceptionDaoParameterizedType); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/PrefProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PrefHandler.java similarity index 71% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/PrefProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PrefHandler.java index 4b972cfad5..0bae2b5c46 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/PrefProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/PrefHandler.java @@ -13,12 +13,13 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX; import java.util.Set; +import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.type.ErrorType; @@ -27,28 +28,31 @@ import org.androidannotations.annotations.sharedpreferences.Pref; import org.androidannotations.annotations.sharedpreferences.SharedPref; +import org.androidannotations.holder.EComponentHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JExpr; import com.sun.codemodel.JFieldRef; -public class PrefProcessor implements DecoratingElementProcessor { +public class PrefHandler extends BaseAnnotationHandler { - private final AnnotationElements validatedModel; - - public PrefProcessor(AnnotationElements validatedModel) { - this.validatedModel = validatedModel; + public PrefHandler(ProcessingEnvironment processingEnvironment) { + super(Pref.class, processingEnvironment); } @Override - public String getTarget() { - return Pref.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.isSharedPreference(element, validatedElements, valid); } @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { + public void process(Element element, EComponentHolder holder) { String fieldName = element.getSimpleName().toString(); @@ -74,11 +78,11 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { } - JBlock methodBody = holder.initBody; + JBlock methodBody = holder.getInitBody(); JFieldRef field = JExpr.ref(fieldName); - methodBody.assign(field, JExpr._new(holder.refClass(fieldType)).arg(holder.contextRef)); - } + methodBody.assign(field, JExpr._new(refClass(fieldType)).arg(holder.getContextRef())); + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ProduceValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ProduceHandler.java similarity index 63% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ProduceValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ProduceHandler.java index b6909b9e20..1dce2b1ea3 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ProduceValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ProduceHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import static org.androidannotations.helper.CanonicalNameConstants.PRODUCE; @@ -21,34 +21,32 @@ import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.CanonicalNameConstants; import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EComponentHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; -public class ProduceValidator implements ElementValidator { +import com.sun.codemodel.JMethod; + +public class ProduceHandler extends BaseAnnotationHandler { - private final ValidatorHelper validatorHelper; private final TargetAnnotationHelper annotationHelper; + private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); - public ProduceValidator(ProcessingEnvironment processingEnv) { + public ProduceHandler(ProcessingEnvironment processingEnvironment) { + super(CanonicalNameConstants.PRODUCE, processingEnvironment); annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return PRODUCE; } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { if (!annotationHelper.enclosingElementHasEnhancedComponentAnnotation(element)) { - return false; + valid.invalidate(); + return; } - IsValid valid = new IsValid(); - ExecutableElement executableElement = (ExecutableElement) element; /* @@ -65,7 +63,14 @@ public boolean validate(Element element, AnnotationElements validatedElements) { validatorHelper.isNotFinal(element, valid); validatorHelper.param.zeroParameter(executableElement, valid); + } + + @Override + public void process(Element element, EComponentHolder holder) throws Exception { + ExecutableElement executableElement = (ExecutableElement) element; + + JMethod delegatingMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); - return valid.isValid(); + delegatingMethod.annotate(refClass(PRODUCE)); } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ResHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ResHandler.java new file mode 100644 index 0000000000..dbffcb6b40 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ResHandler.java @@ -0,0 +1,97 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JExpr.ref; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.annotations.res.HtmlRes; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EComponentHolder; +import org.androidannotations.model.AndroidRes; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldRef; + +public class ResHandler extends BaseAnnotationHandler { + + private AndroidRes androidRes; + private IdAnnotationHelper annotationHelper; + + public ResHandler(AndroidRes androidRes, ProcessingEnvironment processingEnvironment) { + super(androidRes.getAnnotationClass(), processingEnvironment); + this.androidRes = androidRes; + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); + + TypeMirror fieldTypeMirror = element.asType(); + + validatorHelper.allowedType(element, valid, fieldTypeMirror, androidRes.getAllowedTypes()); + + validatorHelper.resIdsExist(element, androidRes.getRInnerClass(), IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + } + + @Override + public void process(Element element, EComponentHolder holder) { + String fieldName = element.getSimpleName().toString(); + + IRClass.Res resInnerClass = androidRes.getRInnerClass(); + + JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(processHolder, element, resInnerClass, true); + + JBlock methodBody = holder.getInitBody(); + + TypeMirror fieldTypeMirror = element.asType(); + String fieldType = fieldTypeMirror.toString(); + + // Special case for loading animations + if (CanonicalNameConstants.ANIMATION.equals(fieldType)) { + methodBody.assign(ref(fieldName), classes().ANIMATION_UTILS.staticInvoke("loadAnimation").arg(holder.getContextRef()).arg(idRef)); + } else { + String resourceMethodName = androidRes.getResourceMethodName(); + + // Special case for @HtmlRes + if (element.getAnnotation(HtmlRes.class) != null) { + methodBody.assign(ref(fieldName), classes().HTML.staticInvoke("fromHtml").arg(invoke(holder.getResourcesRef(), resourceMethodName).arg(idRef))); + } else { + methodBody.assign(ref(fieldName), invoke(holder.getResourcesRef(), resourceMethodName).arg(idRef)); + } + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/RoboGuiceHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/RoboGuiceHandler.java new file mode 100644 index 0000000000..8a52128757 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/RoboGuiceHandler.java @@ -0,0 +1,247 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr._new; +import static com.sun.codemodel.JExpr._super; +import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JExpr.invoke; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; + +import org.androidannotations.annotations.RoboGuice; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.holder.EActivityHolder; +import org.androidannotations.holder.RoboGuiceHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JExpression; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JInvocation; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JMod; +import com.sun.codemodel.JTryBlock; +import com.sun.codemodel.JVar; + +public class RoboGuiceHandler extends BaseAnnotationHandler { + + private APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + + public RoboGuiceHandler(ProcessingEnvironment processingEnvironment) { + super(RoboGuice.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.hasEActivity(element, validatedElements, valid); + + validatorHelper.hasRoboGuiceJars(element, valid); + } + + @Override + public void process(Element element, EActivityHolder holder) { + RoboGuiceHolder roboGuiceHolder = holder.getRoboGuiceHolder(); + + holder.getGeneratedClass()._implements(classes().INJECTOR_PROVIDER); + + JFieldVar scope = roboGuiceHolder.getScopeField(); + JFieldVar eventManager = roboGuiceHolder.getEventManagerField(); + JMethod getInjector = roboGuiceHolder.getGetInjector(); + listenerFields(element, holder); + + beforeCreateMethod(holder, scope, eventManager, getInjector); + afterSetContentView(holder, scope, eventManager); + onRestartMethod(roboGuiceHolder, scope, eventManager); + onStartMethod(roboGuiceHolder, scope, eventManager); + onResumeMethod(roboGuiceHolder, scope, eventManager); + onPauseMethod(roboGuiceHolder, eventManager); + onNewIntentMethod(roboGuiceHolder, scope, eventManager); + onStopMethod(roboGuiceHolder, scope, eventManager); + onDestroyMethod(roboGuiceHolder, scope, eventManager); + onConfigurationChangedMethod(roboGuiceHolder, eventManager); + onContentChangedMethod(roboGuiceHolder, eventManager); + onActivityResultMethod(roboGuiceHolder, scope, eventManager); + } + + private void listenerFields(Element element, EActivityHolder holder) { + List listenerClasses = extractListenerClasses(element); + if (listenerClasses.size() > 0) { + int i = 1; + for (String listenerClassName : listenerClasses) { + JClass listenerClass = refClass(listenerClassName); + JFieldVar listener = holder.getGeneratedClass().field(JMod.PRIVATE, listenerClass, "listener" + i + "_"); + listener.annotate(SuppressWarnings.class).param("value", "unused"); + listener.annotate(classes().INJECT); + i++; + } + } + } + + private List extractListenerClasses(Element activityElement) { + + List annotationMirrors = activityElement.getAnnotationMirrors(); + + String annotationName = RoboGuice.class.getName(); + AnnotationValue action; + for (AnnotationMirror annotationMirror : annotationMirrors) { + if (annotationName.equals(annotationMirror.getAnnotationType().toString())) { + for (Map.Entry entry : annotationMirror.getElementValues().entrySet()) { + if ("value".equals(entry.getKey().getSimpleName().toString())) { + action = entry.getValue(); + + @SuppressWarnings("unchecked") + List values = (List) action.getValue(); + + List listenerClasses = new ArrayList(); + + for (Object value : values) { + listenerClasses.add(value.toString()); + } + return listenerClasses; + + } + } + } + } + return new ArrayList(0); + } + + private void beforeCreateMethod(EActivityHolder holder, JFieldVar scope, JFieldVar eventManager, JMethod getInjector) { + JBlock body = holder.getInitBody(); + JVar injector = body.decl(classes().INJECTOR, "injector_", invoke(getInjector)); + body.assign(scope, invoke(injector, "getInstance").arg(classes().CONTEXT_SCOPE.dotclass())); + body.invoke(scope, "enter").arg(_this()); + body.invoke(injector, "injectMembers").arg(_this()); + body.assign(eventManager, invoke(injector, "getInstance").arg(classes().EVENT_MANAGER.dotclass())); + fireEvent(eventManager, body, classes().ON_CREATE_EVENT, holder.getInitSavedInstanceParam()); + } + + private void afterSetContentView(EActivityHolder holder, JFieldVar scope, JFieldVar eventManager) { + JBlock onViewChanged = holder.getOnViewChangedBody(); + onViewChanged.invoke(scope, "injectViews"); + fireEvent(eventManager, onViewChanged, classes().ON_CONTENT_VIEW_AVAILABLE_EVENT); + } + + private void onRestartMethod(RoboGuiceHolder holder, JFieldVar scope, JFieldVar eventManager) { + JBlock onRestartBeforeSuperBlock = holder.getOnRestartBeforeSuperBlock(); + onRestartBeforeSuperBlock.invoke(scope, "enter").arg(_this()); + JBlock onRestartAfterSuperBlock = holder.getOnRestartAfterSuperBlock(); + fireEvent(eventManager, onRestartAfterSuperBlock, classes().ON_RESTART_EVENT); + } + + private void onStartMethod(RoboGuiceHolder holder, JFieldVar scope, JFieldVar eventManager) { + JBlock onStartBeforeSuperBlock = holder.getOnStartBeforeSuperBlock(); + onStartBeforeSuperBlock.invoke(scope, "enter").arg(_this()); + JBlock onStartAfterSuperBlock = holder.getOnStartAfterSuperBlock(); + fireEvent(eventManager, onStartAfterSuperBlock, classes().ON_START_EVENT); + } + + private void onResumeMethod(RoboGuiceHolder holder, JFieldVar scope, JFieldVar eventManager) { + JBlock onResumeBeforeSuperBlock = holder.getOnResumeBeforeSuperBlock(); + onResumeBeforeSuperBlock.invoke(scope, "enter").arg(_this()); + JBlock onResumeAfterSuperBlock = holder.getOnResumeAfterSuperBlock(); + fireEvent(eventManager, onResumeAfterSuperBlock, classes().ON_RESUME_EVENT); + } + + private void onPauseMethod(RoboGuiceHolder holder, JFieldVar eventManager) { + JBlock onPauseAfterSuperBlock = holder.getOnPauseAfterSuperBlock(); + fireEvent(eventManager, onPauseAfterSuperBlock, classes().ON_PAUSE_EVENT); + } + + private void onNewIntentMethod(RoboGuiceHolder holder, JFieldVar scope, JFieldVar eventManager) { + JBlock onNewIntentAfterSuperBlock = holder.getOnNewIntentAfterSuperBlock(); + onNewIntentAfterSuperBlock.invoke(scope, "enter").arg(_this()); + fireEvent(eventManager, onNewIntentAfterSuperBlock, classes().ON_NEW_INTENT_EVENT); + } + + private void onStopMethod(RoboGuiceHolder holder, JFieldVar scope, JFieldVar eventManager) { + JBlock onStopBlock = new JBlock(false, false); + onStopBlock.invoke(scope, "enter").arg(_this()); + + JTryBlock tryBlock = onStopBlock._try(); + fireEvent(eventManager, tryBlock.body(), classes().ON_STOP_EVENT); + JBlock finallyBody = tryBlock._finally(); + + finallyBody.invoke(scope, "exit").arg(_this()); + finallyBody.invoke(_super(), "onStop"); + + JMethod onStop = holder.getOnStop(); + codeModelHelper.replaceSuperCall(onStop, onStopBlock); + } + + private void onDestroyMethod(RoboGuiceHolder holder, JFieldVar scope, JFieldVar eventManager) { + JBlock onDestroyBlock = new JBlock(false, false); + onDestroyBlock.invoke(scope, "enter").arg(_this()); + + JTryBlock tryBlock = onDestroyBlock._try(); + fireEvent(eventManager, tryBlock.body(), classes().ON_DESTROY_EVENT); + JBlock finallyBody = tryBlock._finally(); + + finallyBody.invoke(eventManager, "clear").arg(_this()); + finallyBody.invoke(scope, "exit").arg(_this()); + finallyBody.invoke(scope, "dispose").arg(_this()); + finallyBody.invoke(_super(), "onDestroy"); + + JMethod onDestroy = holder.getOnDestroy(); + codeModelHelper.replaceSuperCall(onDestroy, onDestroyBlock); + } + + private void onConfigurationChangedMethod(RoboGuiceHolder holder, JFieldVar eventManager) { + JVar currentConfig = holder.getCurrentConfig(); + JBlock onConfigurationChangedAfterSuperBlock = holder.getOnConfigurationChangedAfterSuperBlock(); + JExpression newConfig = holder.getNewConfig(); + fireEvent(eventManager, onConfigurationChangedAfterSuperBlock, classes().ON_CONFIGURATION_CHANGED_EVENT, currentConfig, newConfig); + } + + private void onContentChangedMethod(RoboGuiceHolder holder, JFieldVar eventManager) { + JBlock onContentChangedAfterSuperBlock = holder.getOnContentChangedAfterSuperBlock(); + fireEvent(eventManager, onContentChangedAfterSuperBlock, classes().ON_CONTENT_CHANGED_EVENT); + } + + private void onActivityResultMethod(RoboGuiceHolder holder, JFieldVar scope, JFieldVar eventManager) { + JBlock onActivityResultAfterSuperBlock = holder.getOnActivityResultAfterSuperBlock(); + JVar requestCode = holder.getRequestCode(); + JVar resultCode = holder.getResultCode(); + JVar data = holder.getData(); + + onActivityResultAfterSuperBlock.invoke(scope, "enter").arg(_this()); + + JTryBlock tryBlock = onActivityResultAfterSuperBlock._try(); + fireEvent(eventManager, tryBlock.body(), classes().ON_ACTIVITY_RESULT_EVENT, requestCode, resultCode, data); + + JBlock finallyBody = tryBlock._finally(); + finallyBody.invoke(scope, "exit").arg(_this()); + } + + private void fireEvent(JFieldVar eventManager, JBlock body, JClass eventClass, JExpression... eventArguments) { + JInvocation newEvent = _new(eventClass); + for (JExpression eventArgument : eventArguments) { + newEvent.arg(eventArgument); + } + body.invoke(eventManager, "fire").arg(newEvent); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/RootContextHanlder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/RootContextHanlder.java new file mode 100644 index 0000000000..a9a096ffca --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/RootContextHanlder.java @@ -0,0 +1,74 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JExpr.lit; +import static com.sun.codemodel.JExpr.ref; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; + +import com.sun.codemodel.*; +import org.androidannotations.annotations.RootContext; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.holder.EBeanHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +public class RootContextHanlder extends BaseAnnotationHandler { + + public RootContextHanlder(ProcessingEnvironment processingEnvironment) { + super(RootContext.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEBeanAnnotation(element, validatedElements, valid); + + validatorHelper.extendsContext(element, valid); + + validatorHelper.isNotPrivate(element, valid); + } + + @Override + public void process(Element element, EBeanHolder holder) { + String fieldName = element.getSimpleName().toString(); + + TypeMirror elementType = element.asType(); + String typeQualifiedName = elementType.toString(); + + JBlock body = holder.getInitBody(); + JExpression contextRef = holder.getContextRef(); + + if (CanonicalNameConstants.CONTEXT.equals(typeQualifiedName)) { + body.assign(ref(fieldName), contextRef); + } else { + JClass extendingContextClass = holder.refClass(typeQualifiedName); + JConditional cond = body._if(holder.getContextRef()._instanceof(extendingContextClass)); + cond._then() // + .assign(ref(fieldName), cast(extendingContextClass, holder.getContextRef())); + + JInvocation warningInvoke = holder.classes().LOG.staticInvoke("w"); + warningInvoke.arg(holder.getGeneratedClass().name()); + JExpression expr = lit("Due to Context class ").plus(holder.getContextRef().invoke("getClass").invoke("getSimpleName")).plus(lit(", the @RootContext " + extendingContextClass.name() + " won't be populated")); + warningInvoke.arg(expr); + cond._else() // + .add(warningInvoke); + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SeekBarProgressChangeProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SeekBarProgressChangeHandler.java similarity index 52% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SeekBarProgressChangeProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SeekBarProgressChangeHandler.java index f2610f68ee..95016514ad 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SeekBarProgressChangeProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SeekBarProgressChangeHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import java.util.List; @@ -25,41 +25,54 @@ import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.SeekBarProgressChange; -import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.AndroidManifest; import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.OnSeekBarChangeListenerHelper; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.holder.OnSeekBarChangeListenerHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JExpression; import com.sun.codemodel.JFieldRef; import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; import com.sun.codemodel.JVar; -/** - */ -public class SeekBarProgressChangeProcessor implements DecoratingElementProcessor { +public class SeekBarProgressChangeHandler extends BaseAnnotationHandler { - private final OnSeekBarChangeListenerHelper helper; + private IdAnnotationHelper annotationHelper; - private final APTCodeModelHelper codeModelHelper; - - public SeekBarProgressChangeProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - codeModelHelper = new APTCodeModelHelper(); - helper = new OnSeekBarChangeListenerHelper(processingEnv, getTarget(), rClass, codeModelHelper); + public SeekBarProgressChangeHandler(ProcessingEnvironment processingEnvironment) { + super(SeekBarProgressChange.class, processingEnvironment); } @Override - public String getTarget() { - return SeekBarProgressChange.class.getName(); + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); } @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.doesntThrowException(element, valid); + + validatorHelper.returnTypeIsVoid((ExecutableElement) element, valid); + validatorHelper.hasSeekBarProgressChangeMethodParameters((ExecutableElement) element, valid); + } + + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) throws Exception { String methodName = element.getSimpleName().toString(); ExecutableElement executableElement = (ExecutableElement) element; @@ -82,35 +95,28 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { } } - List idsRefs = helper.extractAnnotationFieldRefs(holder, element, Res.ID, true); + List idsRefs = annotationHelper.extractAnnotationFieldRefs(processHolder, element, IRClass.Res.ID, true); for (JFieldRef idRef : idsRefs) { - OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder = helper.getOrCreateListener(codeModel, holder, idRef); + OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder = holder.getOnSeekBarChangeListenerHolder(idRef); + JBlock methodBody = onSeekBarChangeListenerHolder.getOnProgressChangedBody(); - JInvocation textChangeCall; - JMethod methodToCall = onSeekBarChangeListenerHolder.onProgressChangedMethod; - - JBlock previousBody = codeModelHelper.removeBody(methodToCall); - JBlock methodBody = methodToCall.body(); - - methodBody.add(previousBody); - JExpression activityRef = holder.generatedClass.staticRef("this"); - textChangeCall = methodBody.invoke(activityRef, methodName); + JExpression activityRef = holder.getGeneratedClass().staticRef("this"); + JInvocation textChangeCall = methodBody.invoke(activityRef, methodName); for (int i = 0; i < parameters.size(); i++) { if (i == seekBarViewParameterPosition) { - JVar seekBarViewParameter = codeModelHelper.findParameterByName(methodToCall, "seekBar"); + JVar seekBarViewParameter = onSeekBarChangeListenerHolder.getOnProgressChangedSeekBarParam(); textChangeCall.arg(seekBarViewParameter); } else if (i == progressParameterPosition) { - JVar progressParameter = codeModelHelper.findParameterByName(methodToCall, "progress"); + JVar progressParameter = onSeekBarChangeListenerHolder.getOnProgressChangedProgressParam(); textChangeCall.arg(progressParameter); } else if (i == fromUserParameterPosition) { - JVar fromUserParameter = codeModelHelper.findParameterByName(methodToCall, "fromUser"); + JVar fromUserParameter = onSeekBarChangeListenerHolder.getOnProgressChangedFromUserParam(); textChangeCall.arg(fromUserParameter); } } } - } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SeekBarTouchStartProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SeekBarTouchStartHandler.java similarity index 51% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SeekBarTouchStartProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SeekBarTouchStartHandler.java index 2fd960de74..392fbc9508 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SeekBarTouchStartProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SeekBarTouchStartHandler.java @@ -13,31 +13,29 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import org.androidannotations.annotations.SeekBarTouchStart; -import org.androidannotations.rclass.IRClass; +import org.androidannotations.holder.OnSeekBarChangeListenerHolder; -import com.sun.codemodel.JMethod; +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JVar; -/** - */ -public class SeekBarTouchStartProcessor extends AbstractTrackingTouchProcessor { +public class SeekBarTouchStartHandler extends AbstractSeekBarTouchHandler { - public SeekBarTouchStartProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); + public SeekBarTouchStartHandler(ProcessingEnvironment processingEnvironment) { + super(SeekBarTouchStart.class, processingEnvironment); } @Override - public String getTarget() { - return SeekBarTouchStart.class.getName(); + protected JBlock getMethodBodyToCall(OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder) { + return onSeekBarChangeListenerHolder.getOnStartTrackingTouchBody(); } @Override - protected JMethod getMethodToCall(OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder) { - JMethod methodToCall = onSeekBarChangeListenerHolder.onStartTrackingTouchMethod; - return methodToCall; + protected JVar getMethodParamToPass(OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder) { + return onSeekBarChangeListenerHolder.getOnStartTrackingTouchSeekBarParam(); } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SeekBarTouchStopProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SeekBarTouchStopHandler.java similarity index 51% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SeekBarTouchStopProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SeekBarTouchStopHandler.java index 712dd36523..791967f411 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SeekBarTouchStopProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SeekBarTouchStopHandler.java @@ -13,32 +13,29 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import org.androidannotations.annotations.SeekBarTouchStop; -import org.androidannotations.rclass.IRClass; +import org.androidannotations.holder.OnSeekBarChangeListenerHolder; -import com.sun.codemodel.JMethod; +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JVar; -/** - */ -public class SeekBarTouchStopProcessor extends AbstractTrackingTouchProcessor { +public class SeekBarTouchStopHandler extends AbstractSeekBarTouchHandler { - public SeekBarTouchStopProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); + public SeekBarTouchStopHandler(ProcessingEnvironment processingEnvironment) { + super(SeekBarTouchStop.class, processingEnvironment); } @Override - public String getTarget() { - return SeekBarTouchStop.class.getName(); + protected JBlock getMethodBodyToCall(OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder) { + return onSeekBarChangeListenerHolder.getOnStopTrackingTouchBody(); } @Override - protected JMethod getMethodToCall(OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder) { - JMethod methodToCall = onSeekBarChangeListenerHolder.onStopTrackingTouchMethod; - return methodToCall; + protected JVar getMethodParamToPass(OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder) { + return onSeekBarChangeListenerHolder.getOnStopTrackingTouchSeekBarParam(); } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ServiceActionHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ServiceActionHandler.java new file mode 100644 index 0000000000..eb1f46ff3c --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ServiceActionHandler.java @@ -0,0 +1,165 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import com.sun.codemodel.*; +import org.androidannotations.annotations.ServiceAction; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.AnnotationHelper; +import org.androidannotations.helper.BundleHelper; +import org.androidannotations.helper.CaseHelper; +import org.androidannotations.holder.EIntentServiceHolder; +import org.androidannotations.holder.HasExtras; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.VariableElement; + +import java.util.ArrayList; +import java.util.List; + +import static com.sun.codemodel.JExpr._null; +import static com.sun.codemodel.JExpr.lit; +import static com.sun.codemodel.JMod.FINAL; +import static com.sun.codemodel.JMod.PUBLIC; +import static com.sun.codemodel.JMod.STATIC; + +public class ServiceActionHandler extends BaseAnnotationHandler { + + private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + private AnnotationHelper annotationHelper; + + public ServiceActionHandler(ProcessingEnvironment processingEnvironment) { + super(ServiceAction.class, processingEnvironment); + annotationHelper = new AnnotationHelper(processingEnvironment); + } + + @Override + protected void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + + validatorHelper.enclosingElementHasEIntentService(element, validatedElements, valid); + + validatorHelper.returnTypeIsVoid((ExecutableElement) element, valid); + + validatorHelper.isNotPrivate(element, valid); + } + + @Override + public void process(Element element, EIntentServiceHolder holder) throws Exception { + + ExecutableElement executableElement = (ExecutableElement) element; + String methodName = element.getSimpleName().toString(); + + ServiceAction annotation = element.getAnnotation(ServiceAction.class); + String extraKey = annotation.value(); + if (extraKey.isEmpty()) { + extraKey = methodName; + } + + JFieldVar actionKeyField = createStaticActionField(holder, extraKey, methodName); + addActionInOnHandleIntent(holder, executableElement, methodName, actionKeyField); + addActionToIntentBuilder(holder, executableElement, methodName, actionKeyField); + } + + private JFieldVar createStaticActionField(EIntentServiceHolder holder, String extraKey, String methodName) { + String staticFieldName = CaseHelper.camelCaseToUpperSnakeCase("action", methodName, null); + return holder.getGeneratedClass().field(PUBLIC | STATIC | FINAL, classes().STRING, staticFieldName, lit(extraKey)); + } + + private void addActionInOnHandleIntent(EIntentServiceHolder holder, ExecutableElement executableElement, String methodName, JFieldVar actionKeyField) { + // If action match, call the method + JInvocation actionCondition = actionKeyField.invoke("equals").arg(holder.getOnHandleIntentIntentAction()); + JBlock callActionBlock = holder.getOnHandleIntentBody()._if(actionCondition)._then(); + JInvocation callActionInvocation = JExpr._super().invoke(methodName); + + // For each method params, we get back value from extras and put it + // in super calls + List methodParameters = executableElement.getParameters(); + if (methodParameters.size() > 0) { + // Extras + JVar extras = callActionBlock.decl(classes().BUNDLE, "extras"); + extras.init(holder.getOnHandleIntentIntent().invoke("getExtras")); + JBlock extrasNotNullBlock = callActionBlock._if(extras.ne(_null()))._then(); + + // Extras params + for (VariableElement param : methodParameters) { + String paramName = param.getSimpleName().toString(); + String extraParamName = paramName + "Extra"; + JFieldVar paramVar = getStaticExtraField(holder, paramName); + JClass extraParamClass = codeModelHelper.typeMirrorToJClass(param.asType(), holder); + BundleHelper bundleHelper = new BundleHelper(annotationHelper, param); + + JExpression getExtraExpression = JExpr.invoke(extras, bundleHelper.getMethodNameToRestore()).arg(paramVar); + if (bundleHelper.restoreCallNeedCastStatement()) { + getExtraExpression = JExpr.cast(extraParamClass, getExtraExpression); + + if (bundleHelper.restoreCallNeedsSuppressWarning()) { + JMethod onHandleIntentMethod = holder.getOnHandleIntentMethod(); + if (onHandleIntentMethod.annotations().size() == 0) { + onHandleIntentMethod.annotate(SuppressWarnings.class).param("value", "unchecked"); + } + } + } + + JVar extraField = extrasNotNullBlock.decl(extraParamClass, extraParamName, getExtraExpression); + callActionInvocation.arg(extraField); + } + extrasNotNullBlock.add(callActionInvocation); + } else { + callActionBlock.add(callActionInvocation); + } + callActionBlock._return(); + } + + private void addActionToIntentBuilder(EIntentServiceHolder holder, ExecutableElement executableElement, String methodName, JFieldVar actionKeyField) { + JMethod method = holder.getIntentBuilderClass().method(PUBLIC, holder.getIntentBuilderClass(), methodName); + JBlock body = method.body(); + + // setAction + body.invoke(holder.getIntentField(), "setAction").arg(actionKeyField); + + // For each method params, we get put value into extras + List methodParameters = executableElement.getParameters(); + if (methodParameters.size() > 0) { + + // Extras params + for (VariableElement param : methodParameters) { + String paramName = param.getSimpleName().toString(); + JClass parameterClass = codeModelHelper.typeMirrorToJClass(param.asType(), holder); + + JFieldVar paramVar = getStaticExtraField(holder, paramName); + JVar methodParam = method.param(parameterClass, paramName); + + JMethod putExtraMethod = holder.getIntentBuilder().getPutExtraMethod(param.asType(), paramName, paramVar); + body.invoke(putExtraMethod).arg(methodParam); + } + + } + body._return(JExpr._this()); + } + + private JFieldVar getStaticExtraField(EIntentServiceHolder holder, String extraName) { + String staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(null, extraName, "Extra"); + JFieldVar staticExtraField = holder.getGeneratedClass().fields().get(staticFieldName); + if (staticExtraField == null) { + staticExtraField = holder.getGeneratedClass().field(PUBLIC | STATIC | FINAL, classes().STRING, staticFieldName, lit(extraName)); + } + return staticExtraField; + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SharedPrefHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SharedPrefHandler.java new file mode 100644 index 0000000000..6369f74a1a --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SharedPrefHandler.java @@ -0,0 +1,245 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JExpr.lit; +import static com.sun.codemodel.JMod.PRIVATE; +import static com.sun.codemodel.JMod.STATIC; + +import java.util.ArrayList; +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.util.ElementFilter; + +import org.androidannotations.annotations.sharedpreferences.*; +import org.androidannotations.api.sharedpreferences.*; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.holder.SharedPrefHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.*; + +public class SharedPrefHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { + + private IdAnnotationHelper annotationHelper; + + public SharedPrefHandler(ProcessingEnvironment processingEnvironment) { + super(SharedPref.class, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public SharedPrefHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new SharedPrefHolder(processHolder, annotatedElement); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + TypeElement typeElement = (TypeElement) element; + + validatorHelper.isInterface(typeElement, valid); + + List inheritedMembers = processingEnv.getElementUtils().getAllMembers(typeElement); + + for (Element memberElement : inheritedMembers) { + if (!memberElement.getEnclosingElement().asType().toString().equals("java.lang.Object")) { + validatorHelper.isPrefMethod(memberElement, valid); + if (valid.isValid()) { + validatorHelper.hasCorrectDefaultAnnotation((ExecutableElement) memberElement, valid); + } + } + } + } + + @Override + public void process(Element element, SharedPrefHolder holder) { + generateConstructor(element, holder); + generateFieldMethodAndEditorFieldMethod(element, holder); + } + + private void generateConstructor(Element element, SharedPrefHolder holder) { + SharedPref sharedPrefAnnotation = element.getAnnotation(SharedPref.class); + SharedPref.Scope scope = sharedPrefAnnotation.value(); + int mode = sharedPrefAnnotation.mode(); + + String interfaceSimpleName = element.getSimpleName().toString(); + JBlock constructorSuperBlock = holder.getConstructorSuperBlock(); + JVar contextParam = holder.getConstructorContextParam(); + + switch (scope) { + case ACTIVITY_DEFAULT: { + JMethod getLocalClassName = getLocalClassName(holder); + constructorSuperBlock.invoke("super") // + .arg(contextParam.invoke("getSharedPreferences") // + .arg(invoke(getLocalClassName).arg(contextParam)) // + .arg(JExpr.lit(mode))); + break; + } + case ACTIVITY: { + JMethod getLocalClassName = getLocalClassName(holder); + constructorSuperBlock.invoke("super") // + .arg(contextParam.invoke("getSharedPreferences") // + .arg(invoke(getLocalClassName).arg(contextParam) // + .plus(JExpr.lit("_" + interfaceSimpleName))) // + .arg(JExpr.lit(mode))); + break; + } + case UNIQUE: { + constructorSuperBlock.invoke("super") // + .arg(contextParam.invoke("getSharedPreferences") // + .arg(JExpr.lit(interfaceSimpleName)) // + .arg(JExpr.lit(mode))); + break; + } + case APPLICATION_DEFAULT: { + JClass preferenceManagerClass = refClass("android.preference.PreferenceManager"); + constructorSuperBlock.invoke("super") // + .arg(preferenceManagerClass.staticInvoke("getDefaultSharedPreferences") // + .arg(contextParam)); + break; + } + } + } + + private JMethod getLocalClassName(SharedPrefHolder holder) { + + JClass stringClass = classes().STRING; + JMethod getLocalClassName = holder.getGeneratedClass().method(PRIVATE | STATIC, stringClass, "getLocalClassName"); + JClass contextClass = classes().CONTEXT; + + JVar contextParam = getLocalClassName.param(contextClass, "context"); + + JBlock body = getLocalClassName.body(); + + JVar packageName = body.decl(stringClass, "packageName", contextParam.invoke("getPackageName")); + + JVar className = body.decl(stringClass, "className", contextParam.invoke("getClass").invoke("getName")); + + JVar packageLen = body.decl(codeModel().INT, "packageLen", packageName.invoke("length")); + + JExpression condition = className.invoke("startsWith").arg(packageName).not() // + .cor(className.invoke("length").lte(packageLen)) // + .cor(className.invoke("charAt").arg(packageLen).ne(lit('.'))); + + body._if(condition)._then()._return(className); + + body._return(className.invoke("substring").arg(packageLen.plus(lit(1)))); + + return getLocalClassName; + } + + private void generateFieldMethodAndEditorFieldMethod(Element element, SharedPrefHolder sharedPrefHolder) { + for (ExecutableElement method : getValidMethods(element)) { + generateFieldMethod(sharedPrefHolder, method); + sharedPrefHolder.createEditorFieldMethods(method); + } + } + + private List getValidMethods(Element element) { + List members = element.getEnclosedElements(); + List methods = ElementFilter.methodsIn(members); + List validMethods = new ArrayList(); + for (ExecutableElement method : methods) { + validMethods.add(method); + } + return validMethods; + } + + private void generateFieldMethod(SharedPrefHolder holder, ExecutableElement method) { + String returnType = method.getReturnType().toString(); + JExpression defaultValue = null; + if ("boolean".equals(returnType)) { + DefaultBoolean defaultAnnotation = method.getAnnotation(DefaultBoolean.class); + if (defaultAnnotation != null) { + defaultValue = JExpr.lit(defaultAnnotation.value()); + } + createFieldMethod(holder, method, defaultValue, IRClass.Res.BOOL, JExpr.lit(false), BooleanPrefField.class, "booleanField"); + } else if ("float".equals(returnType)) { + DefaultFloat defaultAnnotation = method.getAnnotation(DefaultFloat.class); + if (defaultAnnotation != null) { + defaultValue = JExpr.lit(defaultAnnotation.value()); + } + createFieldMethod(holder, method, defaultValue, IRClass.Res.INTEGER, JExpr.lit(0f), FloatPrefField.class, "floatField"); + } else if ("int".equals(returnType)) { + DefaultInt defaultAnnotation = method.getAnnotation(DefaultInt.class); + if (defaultAnnotation != null) { + defaultValue = JExpr.lit(defaultAnnotation.value()); + } + createFieldMethod(holder, method, defaultValue, IRClass.Res.INTEGER, JExpr.lit(0), IntPrefField.class, "intField"); + } else if ("long".equals(returnType)) { + DefaultLong defaultAnnotation = method.getAnnotation(DefaultLong.class); + if (defaultAnnotation != null) { + defaultValue = JExpr.lit(defaultAnnotation.value()); + } + createFieldMethod(holder, method, defaultValue, IRClass.Res.INTEGER, JExpr.lit(0l), LongPrefField.class, "longField"); + } else if (CanonicalNameConstants.STRING.equals(returnType)) { + DefaultString defaultAnnotation = method.getAnnotation(DefaultString.class); + if (defaultAnnotation != null) { + defaultValue = JExpr.lit(defaultAnnotation.value()); + } + createFieldMethod(holder, method, defaultValue, IRClass.Res.STRING, JExpr.lit(""), StringPrefField.class, "stringField"); + } + } + + private void createFieldMethod(SharedPrefHolder holder, ExecutableElement method, JExpression defaultAnnotationValue, IRClass.Res res, JExpression defValue, Class booleanPrefFieldClass, String fieldHelperMethodName) { + JExpression defaultValue = defaultAnnotationValue; + if (defaultAnnotationValue == null) { + if (method.getAnnotation(DefaultRes.class) != null) { + defaultValue = extractResValue(holder, method, res); + } else { + defaultValue = defValue; + } + } + String fieldName = method.getSimpleName().toString(); + holder.createFieldMethod(booleanPrefFieldClass, fieldName, fieldHelperMethodName, defaultValue); + } + + private JExpression extractResValue(SharedPrefHolder holder, Element method, IRClass.Res res) { + JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(processHolder, method, DefaultRes.class.getCanonicalName(), res, true); + + String resourceGetMethodName = null; + switch (res) { + case BOOL: + resourceGetMethodName = "getBoolean"; + break; + case INTEGER: + resourceGetMethodName = "getInteger"; + break; + case STRING: + resourceGetMethodName = "getString"; + break; + default: + break; + } + return holder.getContextField().invoke("getResources").invoke(resourceGetMethodName).arg(idRef); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SubscribeValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SubscribeHandler.java similarity index 63% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SubscribeValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SubscribeHandler.java index bd51fb91e2..f005dc6cf0 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SubscribeValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SubscribeHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import static org.androidannotations.helper.CanonicalNameConstants.SUBSCRIBE; @@ -21,34 +21,32 @@ import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.CanonicalNameConstants; import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EComponentHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; -public class SubscribeValidator implements ElementValidator { +import com.sun.codemodel.JMethod; + +public class SubscribeHandler extends BaseAnnotationHandler { - private final ValidatorHelper validatorHelper; private final TargetAnnotationHelper annotationHelper; + private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); - public SubscribeValidator(ProcessingEnvironment processingEnv) { + public SubscribeHandler(ProcessingEnvironment processingEnvironment) { + super(CanonicalNameConstants.SUBSCRIBE, processingEnvironment); annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return SUBSCRIBE; } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { if (!annotationHelper.enclosingElementHasEnhancedComponentAnnotation(element)) { - return false; + valid.invalidate(); + return; } - IsValid valid = new IsValid(); - ExecutableElement executableElement = (ExecutableElement) element; /* @@ -65,8 +63,14 @@ public boolean validate(Element element, AnnotationElements validatedElements) { validatorHelper.isNotFinal(element, valid); validatorHelper.param.hasExactlyOneParameter(executableElement, valid); - - return valid.isValid(); } + @Override + public void process(Element element, EComponentHolder holder) throws Exception { + ExecutableElement executableElement = (ExecutableElement) element; + + JMethod delegatingMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); + + delegatingMethod.annotate(refClass(SUBSCRIBE)); + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SystemServiceProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SystemServiceHandler.java similarity index 53% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SystemServiceProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SystemServiceHandler.java index e211b9b10f..86ad91525c 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SystemServiceProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/SystemServiceHandler.java @@ -13,37 +13,40 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import static com.sun.codemodel.JExpr.cast; import static com.sun.codemodel.JExpr.ref; +import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.SystemService; -import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.holder.EComponentHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JFieldRef; -public class SystemServiceProcessor implements DecoratingElementProcessor { +public class SystemServiceHandler extends BaseAnnotationHandler { - private final AndroidSystemServices androidSystemServices; - - public SystemServiceProcessor(AndroidSystemServices androidSystemServices) { - this.androidSystemServices = androidSystemServices; + public SystemServiceHandler(ProcessingEnvironment processingEnvironment) { + super(SystemService.class, processingEnvironment); } @Override - public String getTarget() { - return SystemService.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); + + validatorHelper.androidService(androidSystemServices, element, valid); + + validatorHelper.isNotPrivate(element, valid); } @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - + public void process(Element element, EComponentHolder holder) { String fieldName = element.getSimpleName().toString(); TypeMirror serviceType = element.asType(); @@ -51,9 +54,8 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { JFieldRef serviceRef = androidSystemServices.getServiceConstant(serviceType, holder); - JBlock methodBody = holder.initBody; + JBlock methodBody = holder.getInitBody(); - methodBody.assign(ref(fieldName), cast(holder.refClass(fieldTypeQualifiedName), holder.contextRef.invoke("getSystemService").arg(serviceRef))); + methodBody.assign(ref(fieldName), cast(refClass(fieldTypeQualifiedName), holder.getContextRef().invoke("getSystemService").arg(serviceRef))); } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TextChangeProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TextChangeHandler.java similarity index 52% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TextChangeProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TextChangeHandler.java index bbed4b1d40..bd5e94855b 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TextChangeProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TextChangeHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import java.util.List; @@ -25,41 +25,54 @@ import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.TextChange; -import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.AndroidManifest; import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.TextWatcherHelper; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.holder.TextWatcherHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JExpression; import com.sun.codemodel.JFieldRef; import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; import com.sun.codemodel.JVar; -/** - */ -public class TextChangeProcessor implements DecoratingElementProcessor { +public class TextChangeHandler extends BaseAnnotationHandler { - private final TextWatcherHelper helper; + private IdAnnotationHelper idAnnotationHelper; - private final APTCodeModelHelper codeModelHelper; - - public TextChangeProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - codeModelHelper = new APTCodeModelHelper(); - helper = new TextWatcherHelper(processingEnv, getTarget(), rClass, codeModelHelper); + public TextChangeHandler(ProcessingEnvironment processingEnvironment) { + super(TextChange.class, processingEnvironment); } @Override - public String getTarget() { - return TextChange.class.getName(); + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + idAnnotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); } @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.doesntThrowException(element, valid); + + validatorHelper.returnTypeIsVoid((ExecutableElement) element, valid); + validatorHelper.hasTextChangedMethodParameters((ExecutableElement) element, valid); + } + + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) throws Exception { String methodName = element.getSimpleName().toString(); ExecutableElement executableElement = (ExecutableElement) element; @@ -88,50 +101,42 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { beforeParameterPosition = i; } } else { - TypeMirror textViewType = helper.typeElementFromQualifiedName(CanonicalNameConstants.TEXT_VIEW).asType(); - if (helper.isSubtype(parameterType, textViewType)) { + TypeMirror textViewType = idAnnotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.TEXT_VIEW).asType(); + if (idAnnotationHelper.isSubtype(parameterType, textViewType)) { viewParameterPosition = i; viewParameterType = parameterType; } } } - List idsRefs = helper.extractAnnotationFieldRefs(holder, element, Res.ID, true); + List idsRefs = idAnnotationHelper.extractAnnotationFieldRefs(processHolder, element, IRClass.Res.ID, true); for (JFieldRef idRef : idsRefs) { - TextWatcherHolder textWatcherHolder = helper.getOrCreateListener(codeModel, holder, idRef, viewParameterType); - - JInvocation textChangeCall; - JMethod methodToCall = textWatcherHolder.onTextChangedMethod; + TextWatcherHolder textWatcherHolder = holder.getTextWatcherHolder(idRef, viewParameterType); + JBlock methodBody = textWatcherHolder.getOnTextChangedBody(); - JBlock previousBody = codeModelHelper.removeBody(methodToCall); - JBlock methodBody = methodToCall.body(); - - methodBody.add(previousBody); - JExpression activityRef = holder.generatedClass.staticRef("this"); - textChangeCall = methodBody.invoke(activityRef, methodName); + JExpression activityRef = holder.getGeneratedClass().staticRef("this"); + JInvocation textChangeCall = methodBody.invoke(activityRef, methodName); for (int i = 0; i < parameters.size(); i++) { if (i == startParameterPosition) { - JVar startParameter = codeModelHelper.findParameterByName(methodToCall, "start"); + JVar startParameter = textWatcherHolder.getOnTextChangedStartParam(); textChangeCall.arg(startParameter); } else if (i == countParameterPosition) { - JVar countParameter = codeModelHelper.findParameterByName(methodToCall, "count"); + JVar countParameter = textWatcherHolder.getOnTextChangedCountParam(); textChangeCall.arg(countParameter); } else if (i == beforeParameterPosition) { - JVar beforeParameter = codeModelHelper.findParameterByName(methodToCall, "before"); + JVar beforeParameter = textWatcherHolder.getOnTextChangedBeforeParam(); textChangeCall.arg(beforeParameter); } else if (i == charSequenceParameterPosition) { - JVar charSequenceParam = codeModelHelper.findParameterByName(methodToCall, "s"); + JVar charSequenceParam = textWatcherHolder.getOnTextChangedCharSequenceParam(); textChangeCall.arg(charSequenceParam); } else if (i == viewParameterPosition) { - JVar viewParameter = textWatcherHolder.viewVariable; + JVar viewParameter = textWatcherHolder.getTextViewVariable(); textChangeCall.arg(viewParameter); } } } - } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TouchProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java similarity index 70% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TouchProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java index b20921d891..face941be4 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TouchProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TouchHandler.java @@ -13,18 +13,21 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; 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.VariableElement; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import org.androidannotations.annotations.Touch; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.rclass.IRClass; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; @@ -35,17 +38,21 @@ import com.sun.codemodel.JMod; import com.sun.codemodel.JVar; -/** - */ -public class TouchProcessor extends AbstractListenerProcessor { +public class TouchHandler extends AbstractListenerHandler { - public TouchProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); + public TouchHandler(ProcessingEnvironment processingEnvironment) { + super(Touch.class, processingEnvironment); } @Override - public String getTarget() { - return Touch.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + ExecutableElement executableElement = (ExecutableElement) element; + + validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid); + + validatorHelper.param.hasOneMotionEventOrTwoMotionEventViewParameters(executableElement, valid); } @Override @@ -62,8 +69,8 @@ protected void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror @Override protected void processParameters(JMethod listenerMethod, JInvocation call, List parameters) { - JVar viewParam = listenerMethod.param(classes.VIEW, "view"); - JVar eventParam = listenerMethod.param(classes.MOTION_EVENT, "event"); + JVar viewParam = listenerMethod.param(classes().VIEW, "view"); + JVar eventParam = listenerMethod.param(classes().MOTION_EVENT, "event"); boolean hasItemParameter = parameters.size() == 2; VariableElement first = parameters.get(0); @@ -86,7 +93,7 @@ protected void processParameters(JMethod listenerMethod, JInvocation call, List< @Override protected JMethod createListenerMethod(JDefinedClass listenerAnonymousClass) { - return listenerAnonymousClass.method(JMod.PUBLIC, codeModel.BOOLEAN, "onTouch"); + return listenerAnonymousClass.method(JMod.PUBLIC, codeModel().BOOLEAN, "onTouch"); } @Override @@ -96,7 +103,6 @@ protected String getSetterName() { @Override protected JClass getListenerClass() { - return classes.VIEW_ON_TOUCH_LISTENER; + return classes().VIEW_ON_TOUCH_LISTENER; } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TraceProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TraceHandler.java similarity index 69% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TraceProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TraceHandler.java index c00f02ace5..d5488073ab 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TraceProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TraceHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; import static org.androidannotations.helper.AndroidConstants.LOG_DEBUG; import static org.androidannotations.helper.AndroidConstants.LOG_ERROR; @@ -21,12 +21,16 @@ import static org.androidannotations.helper.AndroidConstants.LOG_VERBOSE; import static org.androidannotations.helper.AndroidConstants.LOG_WARN; +import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import org.androidannotations.annotations.Trace; import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.processing.EBeansHolder.Classes; +import org.androidannotations.holder.EComponentHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; import com.sun.codemodel.JBlock; import com.sun.codemodel.JClass; @@ -40,43 +44,50 @@ import com.sun.codemodel.JTryBlock; import com.sun.codemodel.JVar; -public class TraceProcessor implements DecoratingElementProcessor { +public class TraceHandler extends BaseAnnotationHandler { - private final APTCodeModelHelper helper = new APTCodeModelHelper(); + private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + + public TraceHandler(ProcessingEnvironment processingEnvironment) { + super(Trace.class, processingEnvironment); + } @Override - public String getTarget() { - return Trace.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.hasValidLogLevel(element, valid); } @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - Classes classes = holder.classes(); + public void process(Element element, EComponentHolder holder) throws Exception { ExecutableElement executableElement = (ExecutableElement) element; String tag = extractTag(executableElement); int level = executableElement.getAnnotation(Trace.class).level(); - JMethod method = helper.overrideAnnotatedMethod(executableElement, holder); + JMethod method = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); - JBlock previousMethodBody = helper.removeBody(method); + JBlock previousMethodBody = codeModelHelper.removeBody(method); JBlock methodBody = method.body(); - JInvocation isLoggableInvocation = classes.LOG.staticInvoke("isLoggable"); - isLoggableInvocation.arg(JExpr.lit(tag)).arg(logLevelFromInt(level, classes.LOG)); + JInvocation isLoggableInvocation = classes().LOG.staticInvoke("isLoggable"); + isLoggableInvocation.arg(JExpr.lit(tag)).arg(logLevelFromInt(level, classes().LOG)); JConditional ifStatement = methodBody._if(isLoggableInvocation); - JInvocation currentTimeInvoke = classes.SYSTEM.staticInvoke("currentTimeMillis"); + JInvocation currentTimeInvoke = classes().SYSTEM.staticInvoke("currentTimeMillis"); JBlock _thenBody = ifStatement._then(); - JVar startDeclaration = _thenBody.decl(codeModel.LONG, "start", currentTimeInvoke); + JVar startDeclaration = _thenBody.decl(codeModel().LONG, "start", currentTimeInvoke); String methodName = "[" + element.toString() + "]"; // Log In String logMethodName = logMethodNameFromLevel(level); - JInvocation logEnterInvoke = classes.LOG.staticInvoke(logMethodName); + JInvocation logEnterInvoke = classes().LOG.staticInvoke(logMethodName); logEnterInvoke.arg(tag); JExpression enterMessage = JExpr.lit("Entering " + methodName); @@ -89,9 +100,9 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { JBlock finallyBlock = tryBlock._finally(); - JVar durationDeclaration = finallyBlock.decl(codeModel.LONG, "duration", currentTimeInvoke.minus(startDeclaration)); + JVar durationDeclaration = finallyBlock.decl(codeModel().LONG, "duration", currentTimeInvoke.minus(startDeclaration)); - JInvocation logExitInvoke = classes.LOG.staticInvoke(logMethodName); + JInvocation logExitInvoke = classes().LOG.staticInvoke(logMethodName); logExitInvoke.arg(tag); JExpression exitMessage = JExpr.lit("Exiting " + methodName + ", duration in ms: ").plus(durationDeclaration); @@ -148,5 +159,4 @@ private String extractTag(Element element) { } return tag; } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TransactionalProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TransactionalHandler.java similarity index 58% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TransactionalProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TransactionalHandler.java index ba82a99f90..a13668195c 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TransactionalProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/TransactionalHandler.java @@ -13,18 +13,21 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.handler; +import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import org.androidannotations.annotations.Transactional; import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.holder.EComponentHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import com.sun.codemodel.JBlock; import com.sun.codemodel.JCatchBlock; import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JExpr; import com.sun.codemodel.JExpression; import com.sun.codemodel.JInvocation; @@ -32,25 +35,38 @@ import com.sun.codemodel.JTryBlock; import com.sun.codemodel.JVar; -public class TransactionalProcessor implements DecoratingElementProcessor { +public class TransactionalHandler extends BaseAnnotationHandler { - private final APTCodeModelHelper helper = new APTCodeModelHelper(); + private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); - @Override - public String getTarget() { - return Transactional.class.getName(); + public TransactionalHandler(ProcessingEnvironment processingEnvironment) { + super(Transactional.class, processingEnvironment); } @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); + + validatorHelper.isNotPrivate(element, valid); ExecutableElement executableElement = (ExecutableElement) element; + validatorHelper.doesntThrowException(executableElement, valid); + + validatorHelper.isNotFinal(element, valid); + + validatorHelper.param.hasOneOrTwoParametersAndFirstIsDb(executableElement, valid); + } + + @Override + public void process(Element element, EComponentHolder holder) { + ExecutableElement executableElement = (ExecutableElement) element; + String returnTypeName = executableElement.getReturnType().toString(); - JClass returnType = holder.refClass(returnTypeName); + JClass returnType = refClass(returnTypeName); - JMethod method = helper.overrideAnnotatedMethod(executableElement, holder); - helper.removeBody(method); + JMethod method = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); + codeModelHelper.removeBody(method); JVar db = method.params().get(0); @@ -60,7 +76,7 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { JTryBlock tryBlock = body._try(); - JExpression activitySuper = holder.generatedClass.staticRef("super"); + JExpression activitySuper = holder.getGeneratedClass().staticRef("super"); JInvocation superCall = JExpr.invoke(activitySuper, method); for (JVar param : method.params()) { @@ -77,22 +93,20 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { tryBody._return(result); } - JCatchBlock catchBlock = tryBlock._catch(holder.refClass(RuntimeException.class)); + JCatchBlock catchBlock = tryBlock._catch(refClass(RuntimeException.class)); JVar exceptionParam = catchBlock.param("e"); JBlock catchBody = catchBlock.body(); - JInvocation errorInvoke = catchBody.staticInvoke(holder.classes().LOG, "e"); + JInvocation errorInvoke = catchBody.staticInvoke(classes().LOG, "e"); - errorInvoke.arg(holder.generatedClass.name()); + errorInvoke.arg(holder.getGeneratedClass().name()); errorInvoke.arg("Error in transaction"); errorInvoke.arg(exceptionParam); catchBody._throw(exceptionParam); tryBlock._finally().invoke(db, "endTransaction"); - } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/UiThreadHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/UiThreadHandler.java new file mode 100644 index 0000000000..6545ce8972 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/UiThreadHandler.java @@ -0,0 +1,89 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr._new; +import static com.sun.codemodel.JExpr.lit; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; + +import com.sun.codemodel.*; +import org.androidannotations.annotations.UiThread; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.holder.EBeanHolder; +import org.androidannotations.holder.EComponentHolder; + +public class UiThreadHandler extends AbstractRunnableHandler { + + private static final String METHOD_CUR_THREAD = "currentThread"; + private static final String METHOD_MAIN_LOOPER = "getMainLooper"; + private static final String METHOD_GET_THREAD = "getThread"; + + private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + + public UiThreadHandler(ProcessingEnvironment processingEnvironment) { + super(UiThread.class, processingEnvironment); + } + + @Override + public void process(Element element, EComponentHolder holder) throws Exception { + ExecutableElement executableElement = (ExecutableElement) element; + JMethod delegatingMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder); + JDefinedClass anonymousRunnableClass = codeModelHelper.createDelegatingAnonymousRunnableClass(holder, delegatingMethod); + + UiThread annotation = element.getAnnotation(UiThread.class); + long delay = annotation.delay(); + UiThread.Propagation propagation = annotation.propagation(); + + if (delay == 0) { + if (propagation == UiThread.Propagation.REUSE) { + // Put in the check for the UI thread. + addUIThreadCheck(delegatingMethod, holder); + } + + delegatingMethod.body().invoke(holder.getHandler(), "post").arg(_new(anonymousRunnableClass)); + } else { + delegatingMethod.body().invoke(holder.getHandler(), "postDelayed").arg(_new(anonymousRunnableClass)).arg(lit(delay)); + } + } + + /** + * Add the pre-check to see if we are already in the UI thread. + * + * @param delegatingMethod + * @param holder + * @throws JClassAlreadyExistsException + */ + private void addUIThreadCheck(JMethod delegatingMethod, EComponentHolder holder) throws JClassAlreadyExistsException { + // Get the Thread and Looper class. + JClass tClass = holder.classes().THREAD; + JClass lClass = holder.classes().LOOPER; + + // invoke the methods. + JExpression lhs = tClass.staticInvoke(METHOD_CUR_THREAD); + JExpression rhs = lClass.staticInvoke(METHOD_MAIN_LOOPER).invoke(METHOD_GET_THREAD); + + // create the conditional and the block. + JConditional con = delegatingMethod.body()._if(JOp.eq(lhs, rhs)); + JBlock thenBlock = con._then(); + + codeModelHelper.callSuperMethod(delegatingMethod, holder, thenBlock); + + thenBlock._return(); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ViewByIdHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ViewByIdHandler.java new file mode 100644 index 0000000000..f89e9255b9 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/ViewByIdHandler.java @@ -0,0 +1,77 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler; + +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JExpr.ref; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.annotations.ViewById; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.IdAnnotationHelper; +import org.androidannotations.helper.IdValidatorHelper; +import org.androidannotations.holder.EComponentWithViewSupportHolder; +import org.androidannotations.model.AndroidSystemServices; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; +import org.androidannotations.rclass.IRClass; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldRef; + +public class ViewByIdHandler extends BaseAnnotationHandler { + + private IdAnnotationHelper annotationHelper; + + public ViewByIdHandler(ProcessingEnvironment processingEnvironment) { + super(ViewById.class, processingEnvironment); + } + + @Override + public void setAndroidEnvironment(IRClass rClass, AndroidSystemServices androidSystemServices, AndroidManifest androidManifest) { + super.setAndroidEnvironment(rClass, androidSystemServices, androidManifest); + annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); + + validatorHelper.isDeclaredType(element, valid); + + validatorHelper.extendsView(element, valid); + + validatorHelper.resIdsExist(element, IRClass.Res.ID, IdValidatorHelper.FallbackStrategy.USE_ELEMENT_NAME, valid); + + validatorHelper.isNotPrivate(element, valid); + } + + @Override + public void process(Element element, EComponentWithViewSupportHolder holder) { + String fieldName = element.getSimpleName().toString(); + + TypeMirror uiFieldTypeMirror = element.asType(); + String typeQualifiedName = uiFieldTypeMirror.toString(); + + JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(processHolder, element, IRClass.Res.ID, true); + + JBlock methodBody = holder.getOnViewChangedBody(); + methodBody.assign(ref(fieldName), cast(refClass(typeQualifiedName), holder.findViewById(idRef))); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/WindowFeatureValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/WindowFeatureHandler.java similarity index 54% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/WindowFeatureValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/WindowFeatureHandler.java index 644b00236b..03e636fa33 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/WindowFeatureValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/WindowFeatureHandler.java @@ -13,37 +13,36 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.handler; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import org.androidannotations.annotations.WindowFeature; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; +import org.androidannotations.holder.EActivityHolder; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; -public class WindowFeatureValidator implements ElementValidator { +import com.sun.codemodel.JExpr; - private ValidatorHelper validatorHelper; +public class WindowFeatureHandler extends BaseAnnotationHandler { - public WindowFeatureValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); + public WindowFeatureHandler(ProcessingEnvironment processingEnvironment) { + super(WindowFeature.class, processingEnvironment); } @Override - public String getTarget() { - return WindowFeature.class.getName(); + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.hasEActivity(element, validatedElements, valid); } @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - IsValid valid = new IsValid(); - - validatorHelper.hasEActivity(element, validatedElements, valid); + public void process(Element element, EActivityHolder holder) throws Exception { + WindowFeature annotation = element.getAnnotation(WindowFeature.class); + int[] features = annotation.value(); - return valid.isValid(); + for (int feature : features) { + holder.getInitBody().invoke("requestWindowFeature").arg(JExpr.lit(feature)); + } } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/DeleteHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/DeleteHandler.java new file mode 100644 index 0000000000..922f18a332 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/DeleteHandler.java @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler.rest; + +import org.androidannotations.annotations.rest.Delete; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; + +public class DeleteHandler extends RestMethodHandler { + + public DeleteHandler(ProcessingEnvironment processingEnvironment) { + super(Delete.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + validatorHelper.doesNotReturnPrimitive((ExecutableElement) element, valid); + + restAnnotationHelper.urlVariableNamesExistInParametersAndHasOnlyOneMoreParameter((ExecutableElement) element, valid); + } + + @Override + protected String getUrlSuffix(Element element) { + Delete annotation = element.getAnnotation(Delete.class); + return annotation.value(); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/GetHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/GetHandler.java new file mode 100644 index 0000000000..b1dfe89ef3 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/GetHandler.java @@ -0,0 +1,47 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler.rest; + +import javax.annotation.processing.ProcessingEnvironment; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; + +import org.androidannotations.annotations.rest.Get; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +public class GetHandler extends RestMethodHandler { + + public GetHandler(ProcessingEnvironment processingEnvironment) { + super(Get.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + validatorHelper.doesNotReturnPrimitive((ExecutableElement) element, valid); + + restAnnotationHelper.urlVariableNamesExistInParametersAndHasNoOneMoreParameter((ExecutableElement) element, valid); + } + + @Override + protected String getUrlSuffix(Element element) { + Get annotation = element.getAnnotation(Get.class); + return annotation.value(); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/HeadHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/HeadHandler.java new file mode 100644 index 0000000000..4be4279e03 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/HeadHandler.java @@ -0,0 +1,60 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler.rest; + +import com.sun.codemodel.JClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JExpression; +import org.androidannotations.annotations.rest.Head; +import org.androidannotations.holder.RestHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; + +public class HeadHandler extends RestMethodHandler { + + public HeadHandler(ProcessingEnvironment processingEnvironment) { + super(Head.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + validatorHelper.hasHttpHeadersReturnType((ExecutableElement) element, valid); + + restAnnotationHelper.urlVariableNamesExistInParametersAndHasNoOneMoreParameter((ExecutableElement) element, valid); + } + + @Override + protected String getUrlSuffix(Element element) { + Head annotation = element.getAnnotation(Head.class); + return annotation.value(); + } + + @Override + protected JExpression getResponseClass(Element element, RestHolder holder) { + return JExpr._null(); + } + + @Override + protected JExpression addResultCallMethod(JExpression exchangeCall, JClass methodReturnClass) { + return JExpr.invoke(exchangeCall, "getHeaders"); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/OptionsHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/OptionsHandler.java new file mode 100644 index 0000000000..f5b8e5948a --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/OptionsHandler.java @@ -0,0 +1,60 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler.rest; + +import com.sun.codemodel.JClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JExpression; +import org.androidannotations.annotations.rest.Options; +import org.androidannotations.holder.RestHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; + +public class OptionsHandler extends RestMethodHandler { + + public OptionsHandler(ProcessingEnvironment processingEnvironment) { + super(Options.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + validatorHelper.hasSetOfHttpMethodReturnType((ExecutableElement) element, valid); + + restAnnotationHelper.urlVariableNamesExistInParametersAndHasNoOneMoreParameter((ExecutableElement) element, valid); + } + + @Override + protected String getUrlSuffix(Element element) { + Options annotation = element.getAnnotation(Options.class); + return annotation.value(); + } + + @Override + protected JExpression getResponseClass(Element element, RestHolder holder) { + return JExpr._null(); + } + + @Override + protected JExpression addResultCallMethod(JExpression exchangeCall, JClass methodReturnClass) { + return exchangeCall.invoke("getHeaders").invoke("getAllow"); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/PostHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/PostHandler.java new file mode 100644 index 0000000000..fab378a48a --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/PostHandler.java @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler.rest; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; + +import org.androidannotations.annotations.rest.Post; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +public class PostHandler extends RestMethodHandler { + + public PostHandler(ProcessingEnvironment processingEnvironment) { + super(Post.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + validatorHelper.doesNotReturnPrimitive((ExecutableElement) element, valid); + + restAnnotationHelper.urlVariableNamesExistInParametersAndHasOnlyOneMoreParameter((ExecutableElement) element, valid); + } + + @Override + protected String getUrlSuffix(Element element) { + Post annotation = element.getAnnotation(Post.class); + return annotation.value(); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/PutHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/PutHandler.java new file mode 100644 index 0000000000..39bbf50a2c --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/PutHandler.java @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler.rest; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; + +import org.androidannotations.annotations.rest.Put; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +public class PutHandler extends RestMethodHandler { + + public PutHandler(ProcessingEnvironment processingEnvironment) { + super(Put.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + super.validate(element, validatedElements, valid); + + validatorHelper.doesNotReturnPrimitive((ExecutableElement) element, valid); + + restAnnotationHelper.urlVariableNamesExistInParametersAndHasOnlyOneMoreParameter((ExecutableElement) element, valid); + } + + @Override + protected String getUrlSuffix(Element element) { + Put annotation = element.getAnnotation(Put.class); + return annotation.value(); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestHandler.java new file mode 100644 index 0000000000..2e32a38847 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestHandler.java @@ -0,0 +1,115 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler.rest; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JFieldVar; +import org.androidannotations.annotations.rest.Rest; +import org.androidannotations.handler.BaseAnnotationHandler; +import org.androidannotations.handler.GeneratingAnnotationHandler; +import org.androidannotations.helper.AnnotationHelper; +import org.androidannotations.holder.RestHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.ProcessHolder; +import org.androidannotations.process.IsValid; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import java.util.List; + +import static com.sun.codemodel.JExpr.*; +import static org.androidannotations.helper.CanonicalNameConstants.ARRAYLIST; +import static org.androidannotations.helper.CanonicalNameConstants.CLIENT_HTTP_REQUEST_INTERCEPTOR; + +public class RestHandler extends BaseAnnotationHandler implements GeneratingAnnotationHandler { + + private final AnnotationHelper annotationHelper; + + public RestHandler(ProcessingEnvironment processingEnvironment) { + super(Rest.class, processingEnvironment); + annotationHelper = new AnnotationHelper(processingEnv); + } + + @Override + public RestHolder createGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + return new RestHolder(processHolder, annotatedElement); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + TypeElement typeElement = (TypeElement) element; + + validatorHelper.notAlreadyValidated(element, validatedElements, valid); + + validatorHelper.hasSpringAndroidJars(element, valid); + + validatorHelper.isInterface(typeElement, valid); + + validatorHelper.isTopLevel(typeElement, valid); + + validatorHelper.doesNotExtendInvalidInterfaces(typeElement, valid); + + validatorHelper.unannotatedMethodReturnsRestTemplate(typeElement, valid); + + validatorHelper.validateConverters(element, valid); + + validatorHelper.validateInterceptors(element, valid); + + validatorHelper.hasInternetPermission(typeElement, androidManifest, valid); + } + + @Override + public void process(Element element, RestHolder holder) { + setRootUrl(element, holder); + setConverters(element, holder); + setInterceptors(element, holder); + } + + private void setRootUrl(Element element, RestHolder holder) { + TypeElement typeElement = (TypeElement) element; + String rootUrl = typeElement.getAnnotation(Rest.class).rootUrl(); + holder.getInit().body().assign(holder.getRootUrlField(), lit(rootUrl)); + } + + private void setConverters(Element element, RestHolder holder) { + List converters = annotationHelper.extractAnnotationClassArrayParameter(element, getTarget(), "converters"); + JFieldVar restTemplateField = holder.getRestTemplateField(); + JBlock init = holder.getInit().body(); + for (DeclaredType converterType : converters) { + JClass converterClass = refClass(converterType.toString()); + init.add(invoke(restTemplateField, "getMessageConverters").invoke("add").arg(_new(converterClass))); + } + } + + private void setInterceptors(Element element, RestHolder holder) { + List interceptors = annotationHelper.extractAnnotationClassArrayParameter(element, getTarget(), "interceptors"); + if (interceptors != null) { + JClass listClass = refClass(ARRAYLIST); + JClass clientInterceptorClass = refClass(CLIENT_HTTP_REQUEST_INTERCEPTOR); + listClass = listClass.narrow(clientInterceptorClass); + JFieldVar restTemplateField = holder.getRestTemplateField(); + JBlock init = holder.getInit().body(); + init.add(invoke(restTemplateField, "setInterceptors").arg(_new(listClass))); + for (DeclaredType interceptorType : interceptors) { + JClass interceptorClass = refClass(interceptorType.toString()); + init.add(invoke(restTemplateField, "getInterceptors").invoke("add").arg(_new(interceptorClass))); + } + } + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java new file mode 100644 index 0000000000..16dab902c0 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestMethodHandler.java @@ -0,0 +1,240 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler.rest; + +import com.sun.codemodel.*; +import org.androidannotations.handler.BaseAnnotationHandler; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.helper.RestAnnotationHelper; +import org.androidannotations.holder.RestHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeKind; +import java.util.List; +import java.util.Locale; +import java.util.TreeMap; + +public abstract class RestMethodHandler extends BaseAnnotationHandler { + + protected final RestAnnotationHelper restAnnotationHelper; + protected final APTCodeModelHelper codeModelHelper; + + public RestMethodHandler(Class targetClass, ProcessingEnvironment processingEnvironment) { + super(targetClass, processingEnvironment); + restAnnotationHelper = new RestAnnotationHelper(processingEnv, getTarget()); + codeModelHelper = new APTCodeModelHelper(); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.notAlreadyValidated(element, validatedElements, valid); + + validatorHelper.enclosingElementHasRestAnnotation(element, validatedElements, valid); + + validatorHelper.throwsOnlyRestClientException((ExecutableElement) element, valid); + } + + @Override + public void process(Element element, RestHolder holder) { + ExecutableElement executableElement = (ExecutableElement) element; + String methodName = element.getSimpleName().toString(); + JClass methodReturnClass = getMethodReturnClass(element, holder); + boolean methodReturnVoid = executableElement.getReturnType().getKind() == TypeKind.VOID; + + // Creating method signature + JMethod method = holder.getGeneratedClass().method(JMod.PUBLIC, methodReturnClass, methodName); + method.annotate(Override.class); + TreeMap params = addMethodParams(executableElement, holder, method); + JBlock methodBody = method.body(); + + // RestTemplate exchange() method call + JInvocation exchangeCall = JExpr.invoke(holder.getRestTemplateField(), "exchange"); + exchangeCall.arg(getUrl(element, holder)); + exchangeCall.arg(getHttpMethod()); + exchangeCall.arg(getRequestEntity(executableElement, holder, methodBody, params)); + exchangeCall.arg(getResponseClass(element, holder)); + JExpression urlVariables = getUrlVariables(element, holder, methodBody, params); + if (urlVariables != null) { + exchangeCall.arg(urlVariables); + } + + JExpression returnCall = exchangeCall; + JExpression result = setCookies(executableElement, holder, methodBody, exchangeCall); + if (result != null) { + returnCall = result; + } + + if (methodReturnVoid && result == null) { + insertRestTryCatchBlock(holder, methodBody, exchangeCall, methodReturnVoid); + } else if (!methodReturnVoid) { + returnCall = addResultCallMethod(returnCall, methodReturnClass); + insertRestTryCatchBlock(holder, methodBody, returnCall, methodReturnVoid); + } + } + + protected JClass getMethodReturnClass(Element element, RestHolder holder) { + ExecutableElement executableElement = (ExecutableElement) element; + return codeModelHelper.typeMirrorToJClass(executableElement.getReturnType(), holder); + } + + protected TreeMap addMethodParams(ExecutableElement executableElement, RestHolder restHolder, JMethod method) { + List params = executableElement.getParameters(); + TreeMap methodParams = new TreeMap(); + for (VariableElement parameter : params) { + String paramName = parameter.getSimpleName().toString(); + String paramType = parameter.asType().toString(); + + JVar param; + if (parameter.asType().getKind().isPrimitive()) { + param = method.param(JType.parse(codeModel(), paramType), paramName); + } else { + JClass parameterClass = codeModelHelper.typeMirrorToJClass(parameter.asType(), restHolder); + param = method.param(parameterClass, paramName); + } + methodParams.put(paramName, param); + } + return methodParams; + } + + protected JExpression getUrl(Element element, RestHolder restHolder) { + String urlSuffix = getUrlSuffix(element); + JExpression url = JExpr.lit(getUrlSuffix(element)); + if (!(urlSuffix.startsWith("http://") || urlSuffix.startsWith("https://"))) { + url = JExpr.invoke(restHolder.getRootUrlField(), "concat").arg(url); + } + return url; + } + + protected abstract String getUrlSuffix(Element element); + + protected JExpression getHttpMethod() { + JClass httpMethod = classes().HTTP_METHOD; + String simpleName = getTarget().substring(getTarget().lastIndexOf('.') + 1); + String restMethodInCapitalLetters = simpleName.toUpperCase(Locale.ENGLISH); + return httpMethod.staticRef(restMethodInCapitalLetters); + } + + protected JExpression getRequestEntity(ExecutableElement element, RestHolder holder, JBlock methodBody, TreeMap params) { + JVar httpHeaders = restAnnotationHelper.declareHttpHeaders(element, holder, methodBody); + JVar entitySentToServer = restAnnotationHelper.getEntitySentToServer(element, params); + return restAnnotationHelper.declareHttpEntity(processHolder, methodBody, entitySentToServer, httpHeaders); + } + + protected JExpression getResponseClass(Element element, RestHolder holder) { + return restAnnotationHelper.getResponseClass(element, holder); + } + + protected JExpression getUrlVariables(Element element, RestHolder holder, JBlock methodBody, TreeMap params) { + return restAnnotationHelper.declareUrlVariables((ExecutableElement) element, holder, methodBody, params); + } + + protected JExpression addResultCallMethod(JExpression exchangeCall, JClass methodReturnClass) { + if (methodReturnClass != null && !methodReturnClass.fullName().startsWith(CanonicalNameConstants.RESPONSE_ENTITY)) { + return JExpr.invoke(exchangeCall, "getBody"); + } + return exchangeCall; + } + + private JFieldRef setCookies(ExecutableElement executableElement, RestHolder restHolder, JBlock methodBody, JInvocation exchangeCall) { + String[] settingCookies = restAnnotationHelper.settingCookies(executableElement); + if (settingCookies != null) { + boolean methodReturnVoid = executableElement.getReturnType().getKind() == TypeKind.VOID; + JClass methodReturnClass = getMethodReturnClass(executableElement, restHolder); + + JClass responseEntityClass = classes().RESPONSE_ENTITY.narrow(methodReturnVoid ? codeModel().VOID : methodReturnClass); + JVar responseEntity = methodBody.decl(responseEntityClass, "response", exchangeCall); + + // set cookies + JClass stringListClass = classes().LIST.narrow(classes().STRING); + JClass stringArrayClass = classes().STRING.array(); + JArray cookiesArray = JExpr.newArray(classes().STRING); + for (String cookie : settingCookies) { + cookiesArray.add(JExpr.lit(cookie)); + } + JVar requestedCookiesVar = methodBody.decl(stringArrayClass, "requestedCookies", cookiesArray); + + JInvocation setCookiesList = JExpr.invoke(responseEntity, "getHeaders").invoke("get").arg("Set-Cookie"); + JVar allCookiesList = methodBody.decl(stringListClass, "allCookies", setCookiesList); + + // for loop over list... add if in string array + JForEach forEach = methodBody.forEach(classes().STRING, "rawCookie", allCookiesList); + JVar rawCookieVar = forEach.var(); + + JBlock forLoopBody = forEach.body(); + + JForEach innerForEach = forLoopBody.forEach(classes().STRING, "thisCookieName", requestedCookiesVar); + JBlock innerBody = innerForEach.body(); + JBlock thenBlock = innerBody._if(JExpr.invoke(rawCookieVar, "startsWith").arg(innerForEach.var()))._then(); + + // where does the cookie VALUE end? + JInvocation valueEnd = rawCookieVar.invoke("indexOf").arg(JExpr.lit(';')); + JVar valueEndVar = thenBlock.decl(codeModel().INT, "valueEnd", valueEnd); + JBlock fixValueEndBlock = thenBlock._if(valueEndVar.eq(JExpr.lit(-1)))._then(); + fixValueEndBlock.assign(valueEndVar, rawCookieVar.invoke("length")); + + JExpression indexOfValue = rawCookieVar.invoke("indexOf").arg("=").plus(JExpr.lit(1)); + JInvocation cookieValue = rawCookieVar.invoke("substring").arg(indexOfValue).arg(valueEndVar); + thenBlock.invoke(restHolder.getAvailableCookiesField(), "put").arg(innerForEach.var()).arg(cookieValue); + thenBlock._break(); + + return JExpr.ref(responseEntity.name()); + } + return null; + } + + /** + * Adds the try/catch around the rest execution code. + * + * If an exception is caught, it will first check if the handler is set. If + * the handler is set, it will call the handler and return null (or nothing + * if void). If the handler isn't set, it will re-throw the exception so + * that it behaves as it did previous to this feature. + */ + private void insertRestTryCatchBlock(RestHolder holder, JBlock body, JExpression returnCall, boolean methodReturnVoid) { + JTryBlock tryBlock = body._try(); + + if (methodReturnVoid) { + tryBlock.body().add((JInvocation) returnCall); + } else { + tryBlock.body()._return(returnCall); + } + + JCatchBlock jCatch = tryBlock._catch(classes().REST_CLIENT_EXCEPTION); + + JBlock catchBlock = jCatch.body(); + JConditional conditional = catchBlock._if(JOp.ne(holder.getRestErrorHandlerField(), JExpr._null())); + JVar exceptionParam = jCatch.param("e"); + + JBlock thenBlock = conditional._then(); + + // call the handler method if it was set. + thenBlock.add(holder.getRestErrorHandlerField().invoke("onRestClientExceptionThrown").arg(exceptionParam)); + + // return null if exception was caught and handled. + if (!methodReturnVoid) { + thenBlock._return(JExpr._null()); + } + + // re-throw the exception if handler wasn't set. + conditional._else()._throw(exceptionParam); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestServiceHandler.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestServiceHandler.java new file mode 100644 index 0000000000..8e434d659c --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/handler/rest/RestServiceHandler.java @@ -0,0 +1,63 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.handler.rest; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JFieldRef; +import org.androidannotations.annotations.rest.Rest; +import org.androidannotations.annotations.rest.RestService; +import org.androidannotations.handler.BaseAnnotationHandler; +import org.androidannotations.helper.ModelConstants; +import org.androidannotations.holder.EComponentHolder; +import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.type.TypeMirror; + +public class RestServiceHandler extends BaseAnnotationHandler { + + public RestServiceHandler(ProcessingEnvironment processingEnvironment) { + super(RestService.class, processingEnvironment); + } + + @Override + public void validate(Element element, AnnotationElements validatedElements, IsValid valid) { + validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); + + validatorHelper.isNotPrivate(element, valid); + + validatorHelper.typeHasAnnotation(Rest.class, element, valid); + } + + @Override + public void process(Element element, EComponentHolder holder) { + String fieldName = element.getSimpleName().toString(); + + TypeMirror fieldTypeMirror = element.asType(); + String interfaceName = fieldTypeMirror.toString(); + + String generatedClassName = interfaceName + ModelConstants.GENERATION_SUFFIX; + + JBlock methodBody = holder.getInitBody(); + + JFieldRef field = JExpr.ref(fieldName); + + methodBody.assign(field, JExpr._new(refClass(generatedClassName))); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java index ac63fb71d3..3dfc90c13c 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java @@ -15,57 +15,30 @@ */ package org.androidannotations.helper; -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr._this; -import static com.sun.codemodel.JExpr.cast; -import static com.sun.codemodel.JMod.FINAL; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; -import static com.sun.codemodel.JMod.STATIC; -import static javax.lang.model.element.ElementKind.CONSTRUCTOR; -import static org.androidannotations.helper.CanonicalNameConstants.PARCELABLE; -import static org.androidannotations.helper.CanonicalNameConstants.SERIALIZABLE; -import static org.androidannotations.helper.CanonicalNameConstants.STRING; +import java.io.StringWriter; import java.lang.reflect.Field; import java.util.ArrayList; 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.util.ElementFilter; import javax.lang.model.type.ArrayType; import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.type.WildcardType; -import javax.lang.model.util.Elements; -import javax.lang.model.util.Types; - -import org.androidannotations.processing.EBeanHolder; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JClassAlreadyExistsException; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JConditional; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JStatement; -import com.sun.codemodel.JType; -import com.sun.codemodel.JTypeVar; -import com.sun.codemodel.JVar; + +import com.sun.codemodel.*; +import org.androidannotations.holder.EComponentHolder; +import org.androidannotations.holder.GeneratedClassHolder; public class APTCodeModelHelper { - public JClass typeMirrorToJClass(TypeMirror type, EBeanHolder holder) { + public JClass typeMirrorToJClass(TypeMirror type, GeneratedClassHolder holder) { if (type instanceof DeclaredType) { DeclaredType declaredType = (DeclaredType) type; @@ -116,7 +89,7 @@ public Parameter(String name, JClass jClass) { } } - public JMethod overrideAnnotatedMethod(ExecutableElement executableElement, EBeanHolder holder) { + public JMethod overrideAnnotatedMethod(ExecutableElement executableElement, GeneratedClassHolder holder) { String methodName = executableElement.getSimpleName().toString(); @@ -129,21 +102,19 @@ public JMethod overrideAnnotatedMethod(ExecutableElement executableElement, EBea parameters.add(new Parameter(parameterName, parameterClass)); } - JMethod existingMethod = findAlreadyGeneratedMethod(holder.generatedClass, methodName, parameters); + JMethod existingMethod = findAlreadyGeneratedMethod(holder.getGeneratedClass(), methodName, parameters); if (existingMethod != null) { return existingMethod; } - JMethod method = holder.generatedClass.method(JMod.PUBLIC, returnType, methodName); + JMethod method = holder.getGeneratedClass().method(JMod.PUBLIC, returnType, methodName); method.annotate(Override.class); - List methodParameters = new ArrayList(); for (VariableElement parameter : executableElement.getParameters()) { String parameterName = parameter.getSimpleName().toString(); JClass parameterClass = typeMirrorToJClass(parameter.asType(), holder); - JVar param = method.param(JMod.FINAL, parameterClass, parameterName); - methodParameters.add(param); + method.param(JMod.FINAL, parameterClass, parameterName); } for (TypeMirror superThrownType : executableElement.getThrownTypes()) { @@ -173,8 +144,8 @@ private JMethod findAlreadyGeneratedMethod(JDefinedClass definedClass, String me return null; } - public void callSuperMethod(JMethod superMethod, EBeanHolder holder, JBlock callBlock) { - JExpression activitySuper = holder.generatedClass.staticRef("super"); + public void callSuperMethod(JMethod superMethod, GeneratedClassHolder holder, JBlock callBlock) { + JExpression activitySuper = holder.getGeneratedClass().staticRef("super"); JInvocation superCall = JExpr.invoke(activitySuper, superMethod); for (JVar param : superMethod.params()) { @@ -208,6 +179,26 @@ public JBlock removeBody(JMethod method) { return clonedBody; } + public void replaceSuperCall(JMethod method, JBlock replacement) { + String superCallStart = "super."+method.name()+"("; + + JBlock oldBody = removeBody(method); + JBlock newBody = method.body(); + + for (Object content : oldBody.getContents()) { + StringWriter writer = new StringWriter(); + JFormatter formatter = new JFormatter(writer); + JStatement statement = (JStatement) content; + statement.state(formatter); + String statementString = writer.getBuffer().toString(); + if (statementString.startsWith(superCallStart)) { + newBody.add(replacement); + } else { + newBody.add(statement); + } + } + } + public String getIdStringFromIdFieldRef(JFieldRef idRef) { try { Field nameField = JFieldRef.class.getDeclaredField("name"); @@ -233,7 +224,7 @@ public String getIdStringFromIdFieldRef(JFieldRef idRef) { throw new IllegalStateException("Unable to extract target name from JFieldRef"); } - public JDefinedClass createDelegatingAnonymousRunnableClass(EBeanHolder holder, JMethod delegatedMethod) { + public JDefinedClass createDelegatingAnonymousRunnableClass(EComponentHolder holder, JMethod delegatedMethod) { JCodeModel codeModel = holder.codeModel(); @@ -250,231 +241,84 @@ public JDefinedClass createDelegatingAnonymousRunnableClass(EBeanHolder holder, return anonymousRunnableClass; } - public JVar castContextToActivity(EBeanHolder holder, JBlock ifActivityBody) { - JClass activityClass = holder.classes().ACTIVITY; - return ifActivityBody.decl(activityClass, "activity", cast(activityClass, holder.contextRef)); - } + /** + * Gets all of the methods of the class and includes the methods of any + * implemented interfaces. + * + * @param typeElement + * @return full list of methods. + */ + public List getMethods(TypeElement typeElement) { + List enclosedElements = typeElement.getEnclosedElements(); + List methods = new ArrayList(ElementFilter.methodsIn(enclosedElements)); + + // Add methods of the interfaces. These will be valid as they have gone + // through the validator. + for (TypeMirror iface : typeElement.getInterfaces()) { + DeclaredType dt = (DeclaredType) iface; + methods.addAll(ElementFilter.methodsIn(dt.asElement().getEnclosedElements())); + } - public JBlock ifContextInstanceOfActivity(EBeanHolder holder, JBlock methodBody) { - return methodBody._if(holder.contextRef._instanceof(holder.classes().ACTIVITY))._then(); + return methods; } - public void copyConstructorsAndAddStaticEViewBuilders(Element element, JCodeModel codeModel, JClass eBeanClass, EBeanHolder holder, JMethod setContentViewMethod, JMethod init) { - List constructors = new ArrayList(); - for (Element e : element.getEnclosedElements()) { - if (e.getKind() == CONSTRUCTOR) { - constructors.add((ExecutableElement) e); - } - } + public JMethod implementMethod(GeneratedClassHolder holder, List methods, String methodName, String returnType, String... parameterTypes) { + // First get the ExecutableElement method object from the util function. + ExecutableElement method = getMethod(methods, methodName, returnType, parameterTypes); + JMethod jmethod = null; - for (ExecutableElement userConstructor : constructors) { - JMethod copyConstructor = holder.generatedClass.constructor(PUBLIC); - JMethod staticHelper = holder.generatedClass.method(PUBLIC | STATIC, eBeanClass, "build"); - JBlock body = copyConstructor.body(); - JInvocation superCall = body.invoke("super"); - JInvocation newInvocation = JExpr._new(holder.generatedClass); - for (VariableElement param : userConstructor.getParameters()) { - String paramName = param.getSimpleName().toString(); - String paramType = param.asType().toString(); - copyConstructor.param(holder.refClass(paramType), paramName); - staticHelper.param(holder.refClass(paramType), paramName); - superCall.arg(JExpr.ref(paramName)); - newInvocation.arg(JExpr.ref(paramName)); - } + if (method != null) { + // Get the return type or VOID if none. + JType jcReturnType = returnType.equals(TypeKind.VOID.toString()) ? holder.codeModel().VOID : holder.refClass(returnType); - JVar newCall = staticHelper.body().decl(holder.generatedClass, "instance", newInvocation); - staticHelper.body().invoke(newCall, "onFinishInflate"); - staticHelper.body()._return(newCall); - body.invoke(init); - } - } + // Create the implementation and annotate it with the Override + // annotation. + jmethod = holder.getGeneratedClass().method(JMod.PUBLIC, jcReturnType, method.getSimpleName().toString()); + jmethod.annotate(Override.class); - public JVar findParameterByName(JMethod method, String name) { - for (JVar parameter : method.params()) { - if (parameter.name().equals(name)) { - return parameter; + // Create the parameters. + for (int i = 0; i < method.getParameters().size(); i++) { + VariableElement param = method.getParameters().get(i); + jmethod.param(holder.refClass(parameterTypes[i]), param.getSimpleName().toString()); } } - return null; - } - public void addActivityIntentBuilder(JCodeModel codeModel, EBeanHolder holder, AnnotationHelper annotationHelper, boolean addFragmentIntent) throws Exception { - addIntentBuilder(codeModel, holder, annotationHelper, true, addFragmentIntent); + return jmethod; } - public void addServiceIntentBuilder(JCodeModel codeModel, EBeanHolder holder, AnnotationHelper annotationHelper) throws Exception { - addIntentBuilder(codeModel, holder, annotationHelper, false, false); - } - - private void addIntentBuilder(JCodeModel codeModel, EBeanHolder holder, AnnotationHelper annotationHelper, boolean isActivity, boolean addFragmentIntent) throws JClassAlreadyExistsException { - JClass contextClass = holder.classes().CONTEXT; - JClass intentClass = holder.classes().INTENT; - JClass fragmentClass = holder.classes().FRAGMENT; - JClass fragmentSupportClass = holder.classes().SUPPORT_V4_FRAGMENT; - - { - holder.intentBuilderClass = holder.generatedClass._class(PUBLIC | STATIC, "IntentBuilder_"); - - JFieldVar contextField = holder.intentBuilderClass.field(PRIVATE, contextClass, "context_"); - - holder.intentField = holder.intentBuilderClass.field(PRIVATE | FINAL, intentClass, "intent_"); - { - // Constructor - JMethod constructor = holder.intentBuilderClass.constructor(JMod.PUBLIC); - JVar constructorContextParam = constructor.param(contextClass, "context"); - JBlock constructorBody = constructor.body(); - constructorBody.assign(contextField, constructorContextParam); - constructorBody.assign(holder.intentField, _new(intentClass).arg(constructorContextParam).arg(holder.generatedClass.dotclass())); - } - - // Additional constructor for fragments (issue #541) - Elements elementUtils = annotationHelper.getElementUtils(); - boolean fragmentInClasspath = addFragmentIntent && elementUtils.getTypeElement(CanonicalNameConstants.FRAGMENT) != null; - boolean fragmentSupportInClasspath = elementUtils.getTypeElement(CanonicalNameConstants.SUPPORT_V4_FRAGMENT) != null; - - JFieldVar fragmentField = null; - if (fragmentInClasspath) { - fragmentField = addIntentBuilderFragmentConstructor(holder, fragmentClass, "fragment_", contextField); - } - JFieldVar fragmentSupportField = null; - if (fragmentSupportInClasspath) { - fragmentSupportField = addIntentBuilderFragmentConstructor(holder, fragmentSupportClass, "fragmentSupport_", contextField); - } - - { - // get() - JMethod method = holder.intentBuilderClass.method(PUBLIC, intentClass, "get"); - method.body()._return(holder.intentField); - } - - { - // flags() - JMethod method = holder.intentBuilderClass.method(PUBLIC, holder.intentBuilderClass, "flags"); - JVar flagsParam = method.param(codeModel.INT, "flags"); - JBlock body = method.body(); - body.invoke(holder.intentField, "setFlags").arg(flagsParam); - body._return(_this()); - } - - if (isActivity) { - // start() - JMethod method = holder.intentBuilderClass.method(PUBLIC, codeModel.VOID, "start"); - method.body().invoke(contextField, "startActivity").arg(holder.intentField); - - // startForResult() - method = holder.intentBuilderClass.method(PUBLIC, codeModel.VOID, "startForResult"); - JVar requestCode = method.param(codeModel.INT, "requestCode"); - - JBlock body = method.body(); - JClass activityClass = holder.classes().ACTIVITY; - - JConditional condition = null; - if (fragmentSupportField != null) { - condition = body._if(fragmentSupportField.ne(JExpr._null())); - condition._then() // - .invoke(fragmentSupportField, "startActivityForResult").arg(holder.intentField).arg(requestCode); - } - if (fragmentField != null) { - if (condition == null) { - condition = body._if(fragmentField.ne(JExpr._null())); - } else { - condition = condition._elseif(fragmentField.ne(JExpr._null())); + private ExecutableElement getMethod(List methods, String methodName, String returnType, String... parameterTypes) { + for (ExecutableElement method : methods) { + List parameters = method.getParameters(); + + // Get the method return type or "VOID" if none. + String methodReturnType = method.getReturnType().getKind() == TypeKind.VOID ? TypeKind.VOID.toString() : method.getReturnType().toString(); + + if (parameters.size() == parameterTypes.length && methodReturnType.equals(returnType)) { + if (methodName == null || method.getSimpleName().toString().equals(methodName)) { + // At this point, method name, return type and number of + // parameters are correct. Now we need to validate the + // parameter types. + boolean validMethod = true; + + for (int i = 0; i < parameters.size(); i++) { + VariableElement param = parameters.get(i); + + if (!param.asType().toString().equals(parameterTypes[i])) { + // Parameter type does not match, this is not the + // correct method. + validMethod = false; + break; + } } - condition._then() // - .invoke(fragmentField, "startActivityForResult").arg(holder.intentField).arg(requestCode); - } - if (condition == null) { - condition = body._if(contextField._instanceof(activityClass)); - } else { - condition = condition._elseif(contextField._instanceof(activityClass)); - } - condition._then() // - .invoke(JExpr.cast(activityClass, contextField), "startActivityForResult").arg(holder.intentField).arg(requestCode); - condition._else() // - .invoke(contextField, "startActivity").arg(holder.intentField); - } else { - // start() - JMethod method = holder.intentBuilderClass.method(PUBLIC, holder.classes().COMPONENT_NAME, "start"); - method.body()._return(contextField.invoke("startService").arg(holder.intentField)); - - // stop() - method = holder.intentBuilderClass.method(PUBLIC, codeModel.BOOLEAN, "stop"); - method.body()._return(contextField.invoke("stopService").arg(holder.intentField)); - } - - { - // intent() with activity param - JMethod method = holder.generatedClass.method(STATIC | PUBLIC, holder.intentBuilderClass, "intent"); - JVar contextParam = method.param(contextClass, "context"); - method.body()._return(_new(holder.intentBuilderClass).arg(contextParam)); - } - if (fragmentInClasspath) { - // intent() with android.app.Fragment param - JMethod method = holder.generatedClass.method(STATIC | PUBLIC, holder.intentBuilderClass, "intent"); - JVar fragmentParam = method.param(fragmentClass, "fragment"); - method.body()._return(_new(holder.intentBuilderClass).arg(fragmentParam)); - } - if (fragmentSupportInClasspath) { - // intent() with android.support.v4.app.Fragment param - JMethod method = holder.generatedClass.method(STATIC | PUBLIC, holder.intentBuilderClass, "intent"); - JVar fragmentParam = method.param(fragmentSupportClass, "supportFragment"); - method.body()._return(_new(holder.intentBuilderClass).arg(fragmentParam)); - } - } - } - public JInvocation addIntentBuilderPutExtraMethod(JCodeModel codeModel, EBeanHolder holder, APTCodeModelHelper helper, ProcessingEnvironment processingEnv, JMethod method, TypeMirror elementType, String parameterName, JFieldVar extraKeyField) { - boolean castToSerializable = false; - boolean castToParcelable = false; - if (elementType.getKind() == TypeKind.DECLARED) { - Elements elementUtils = processingEnv.getElementUtils(); - Types typeUtils = processingEnv.getTypeUtils(); - TypeMirror parcelableType = elementUtils.getTypeElement(PARCELABLE).asType(); - if (!typeUtils.isSubtype(elementType, parcelableType)) { - TypeMirror stringType = elementUtils.getTypeElement(STRING).asType(); - if (!typeUtils.isSubtype(elementType, stringType)) { - castToSerializable = true; - } - } else { - TypeMirror serializableType = elementUtils.getTypeElement(SERIALIZABLE).asType(); - if (typeUtils.isSubtype(elementType, serializableType)) { - castToParcelable = true; + if (validMethod) { + return method; + } } } } - JClass parameterClass = helper.typeMirrorToJClass(elementType, holder); - JVar extraParameterVar = method.param(parameterClass, parameterName); - JBlock body = method.body(); - JInvocation invocation = body.invoke(holder.intentField, "putExtra").arg(extraKeyField); - if (castToSerializable) { - return invocation.arg(cast(holder.classes().SERIALIZABLE, extraParameterVar)); - } else if (castToParcelable) { - return invocation.arg(cast(holder.classes().PARCELABLE, extraParameterVar)); - } - return invocation.arg(extraParameterVar); - } - - public void addCastMethod(JCodeModel codeModel, EBeanHolder holder) { - JType objectType = codeModel._ref(Object.class); - JMethod method = holder.generatedClass.method(JMod.PRIVATE, objectType, "cast_"); - JTypeVar genericType = method.generify("T"); - method.type(genericType); - JVar objectParam = method.param(objectType, "object"); - method.annotate(SuppressWarnings.class).param("value", "unchecked"); - method.body()._return(JExpr.cast(genericType, objectParam)); - holder.cast = method; + return null; } - private JFieldVar addIntentBuilderFragmentConstructor(EBeanHolder holder, JClass fragmentClass, String fieldName, JFieldVar contextField) { - - JFieldVar fragmentField = holder.intentBuilderClass.field(PRIVATE, fragmentClass, fieldName); - JMethod constructor = holder.intentBuilderClass.constructor(JMod.PUBLIC); - JVar constructorFragmentParam = constructor.param(fragmentClass, "fragment"); - JBlock constructorBody = constructor.body(); - constructorBody.assign(fragmentField, constructorFragmentParam); - constructorBody.assign(contextField, constructorFragmentParam.invoke("getActivity")); - constructorBody.assign(holder.intentField, _new(holder.classes().INTENT).arg(contextField).arg(holder.generatedClass.dotclass())); - return fragmentField; - } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ThirdPartyLibHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ActionBarSherlockHelper.java similarity index 71% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ThirdPartyLibHelper.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ActionBarSherlockHelper.java index 475bf899ea..825906630e 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ThirdPartyLibHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ActionBarSherlockHelper.java @@ -20,40 +20,22 @@ import javax.lang.model.type.NoType; import javax.lang.model.type.TypeMirror; -import org.androidannotations.processing.EBeanHolder; +import org.androidannotations.holder.EComponentHolder; -public class ThirdPartyLibHelper { +public class ActionBarSherlockHelper { private final AnnotationHelper annotationHelper; - public ThirdPartyLibHelper(AnnotationHelper annotationHelper) { + public ActionBarSherlockHelper(AnnotationHelper annotationHelper) { this.annotationHelper = annotationHelper; } - /** - * Checks whether the Activity extends one of the HoloEverywhere Activity - * types - */ - public boolean usesHoloEverywhere(EBeanHolder holder) { - TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(holder.generatedClass._extends().fullName()); - - TypeMirror superType; - while (!((superType = typeElement.getSuperclass()) instanceof NoType)) { - typeElement = (TypeElement) ((DeclaredType) superType).asElement(); - String qName = typeElement.getQualifiedName().toString(); - if (qName.startsWith("org.holoeverywhere")) { - return true; - } - } - return false; - } - /** * Checks whether the Activity extends one of the ActionBarSherlock Activity * types */ - public boolean usesActionBarSherlock(EBeanHolder holder) { - TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(holder.generatedClass._extends().fullName()); + public boolean usesActionBarSherlock(EComponentHolder holder) { + TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(holder.getGeneratedClass()._extends().fullName()); return usesActionBarSherlock(typeElement); } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ActivityIntentBuilder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ActivityIntentBuilder.java new file mode 100644 index 0000000000..d884407db5 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ActivityIntentBuilder.java @@ -0,0 +1,79 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.helper; + +import static com.sun.codemodel.JMod.PUBLIC; + +import org.androidannotations.holder.HasIntentBuilder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JClassAlreadyExistsException; +import com.sun.codemodel.JConditional; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; + +public class ActivityIntentBuilder extends IntentBuilder { + + public ActivityIntentBuilder(HasIntentBuilder holder, AndroidManifest androidManifest) { + super(holder, androidManifest); + } + + @Override + public void build() throws JClassAlreadyExistsException { + super.build(); + createStart(); + createStartForResult(); + } + + private void createStart() { + JMethod method = holder.getIntentBuilderClass().method(PUBLIC, holder.codeModel().VOID, "start"); + method.body().invoke(contextField, "startActivity").arg(holder.getIntentField()); + } + + private void createStartForResult() { + JMethod method = holder.getIntentBuilderClass().method(PUBLIC, holder.codeModel().VOID, "startForResult"); + JVar requestCode = method.param(holder.codeModel().INT, "requestCode"); + + JBlock body = method.body(); + JClass activityClass = holder.classes().ACTIVITY; + JConditional condition = null; + if (fragmentSupportField != null) { + condition = body._if(fragmentSupportField.ne(JExpr._null())); + condition._then() // + .invoke(fragmentSupportField, "startActivityForResult").arg(holder.getIntentField()).arg(requestCode); + } + if (fragmentField != null) { + if (condition == null) { + condition = body._if(fragmentField.ne(JExpr._null())); + } else { + condition = condition._elseif(fragmentField.ne(JExpr._null())); + } + condition._then() // + .invoke(fragmentField, "startActivityForResult").arg(holder.getIntentField()).arg(requestCode); + } + if (condition == null) { + condition = body._if(contextField._instanceof(activityClass)); + } else { + condition = condition._elseif(contextField._instanceof(activityClass)); + } + condition._then() // + .invoke(JExpr.cast(activityClass, contextField), "startActivityForResult").arg(holder.getIntentField()).arg(requestCode); + condition._else() // + .invoke(contextField, "startActivity").arg(holder.getIntentField()); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/AndroidManifestFinder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/AndroidManifestFinder.java index e85ef359b4..6298d22425 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/AndroidManifestFinder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/AndroidManifestFinder.java @@ -224,7 +224,7 @@ private Option parse(File androidManifestFile, boolean libraryP Node debuggableAttribute = applicationNode.getAttributes().getNamedItem("android:debuggable"); if (debuggableAttribute != null) { - applicationDebuggableMode = debuggableAttribute.getNodeValue().equalsIgnoreCase("true") ? true : false; + applicationDebuggableMode = debuggableAttribute.getNodeValue().equalsIgnoreCase("true"); } } @@ -247,7 +247,7 @@ private Option parse(File androidManifestFile, boolean libraryP componentQualifiedNames.addAll(providerQualifiedNames); NodeList usesPermissionNodes = documentElement.getElementsByTagName("uses-permission"); - List usesPermissionQualifiedNames = extractUsesPermissionNames(applicationPackage, usesPermissionNodes); + List usesPermissionQualifiedNames = extractUsesPermissionNames(usesPermissionNodes); List permissionQualifiedNames = new ArrayList(); permissionQualifiedNames.addAll(usesPermissionQualifiedNames); @@ -330,7 +330,7 @@ private String returnClassIfExistsOrNull(String className) { } } - private List extractUsesPermissionNames(String applicationPackage, NodeList usesPermissionNodes) { + private List extractUsesPermissionNames(NodeList usesPermissionNodes) { List usesPermissionQualifiedNames = new ArrayList(); for (int i = 0; i < usesPermissionNodes.getLength(); i++) { diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/AnnotationHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/AnnotationHelper.java index 325f2bac2e..ce17e56031 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/AnnotationHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/AnnotationHelper.java @@ -15,7 +15,6 @@ */ package org.androidannotations.helper; -import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX; import static org.androidannotations.helper.ModelConstants.VALID_ENHANCED_COMPONENT_ANNOTATIONS; import java.lang.annotation.Annotation; @@ -43,7 +42,8 @@ import org.androidannotations.annotations.OnActivityResult; import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.ResId; -import org.androidannotations.processing.EBeanHolder; +import org.androidannotations.holder.GeneratedClassHolder; +import org.androidannotations.process.ProcessHolder; import org.androidannotations.rclass.IRInnerClass; import org.androidannotations.rclass.RInnerClass; @@ -154,9 +154,9 @@ public Types getTypeUtils() { * Returns a list of {@link JFieldRef} linking to the R class, based on the * given annotation * - * @see #extractAnnotationResources(Element, Class, IRInnerClass, boolean) + * @see #extractAnnotationResources(Element, String, IRInnerClass, boolean) */ - public List extractAnnotationFieldRefs(EBeanHolder holder, Element element, String annotationName, IRInnerClass rInnerClass, boolean useElementName) { + public List extractAnnotationFieldRefs(ProcessHolder holder, Element element, String annotationName, IRInnerClass rInnerClass, boolean useElementName) { List fieldRefs = new ArrayList(); for (String refQualifiedName : extractAnnotationResources(element, annotationName, rInnerClass, useElementName)) { @@ -174,7 +174,7 @@ public List extractAnnotationFieldRefs(EBeanHolder holder, Element el * * @param element * the annotated element - * @param target + * @param annotationName * the annotation on the element * @param rInnerClass * the R innerClass the resources belong to @@ -374,9 +374,7 @@ public DeclaredType extractAnnotationClassParameter(Element element, String anno AnnotationValue annotationValue = entry.getValue(); - DeclaredType annotationClass = (DeclaredType) annotationValue.getValue(); - - return annotationClass; + return (DeclaredType) annotationValue.getValue(); } } @@ -387,14 +385,6 @@ public DeclaredType extractAnnotationClassParameter(Element element, String anno return extractAnnotationClassParameter(element, annotationName, "value"); } - public boolean enclosingElementIsGenerated(Element element) { - /* - * TODO This isn't really safe, can we find a better way? - */ - Element enclosingElement = element.getEnclosingElement(); - return enclosingElement.getSimpleName().toString().endsWith(GENERATION_SUFFIX); - } - public boolean enclosingElementHasEnhancedComponentAnnotation(Element element) { Element enclosingElement = element.getEnclosingElement(); return hasOneOfClassAnnotations(enclosingElement, VALID_ENHANCED_COMPONENT_ANNOTATIONS); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/BundleHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/BundleHelper.java index 3c1252713b..e91460fb90 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/BundleHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/BundleHelper.java @@ -31,7 +31,7 @@ import javax.lang.model.type.TypeMirror; public class BundleHelper { - private static final Map methodSuffixNameByTypeName = new HashMap(); + public static final Map methodSuffixNameByTypeName = new HashMap(); static { diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java index 43cec1ed7b..e20e5acc1b 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CanonicalNameConstants.java @@ -38,6 +38,7 @@ public final class CanonicalNameConstants { public static final String COLLECTION = Collection.class.getCanonicalName(); public static final String COLLECTIONS = Collections.class.getCanonicalName(); public static final String STRING = String.class.getCanonicalName(); + public static final String STRING_BUILDER = StringBuilder.class.getCanonicalName(); public static final String CHAR_SEQUENCE = CharSequence.class.getCanonicalName(); public static final String SQL_EXCEPTION = SQLException.class.getCanonicalName(); public static final String INTEGER = Integer.class.getCanonicalName(); @@ -61,6 +62,7 @@ public final class CanonicalNameConstants { public static final String ON_SEEKBAR_CHANGE_LISTENER = "android.widget.SeekBar.OnSeekBarChangeListener"; public static final String TEXT_VIEW = "android.widget.TextView"; public static final String COMPOUND_BUTTON = "android.widget.CompoundButton"; + public static final String COMPOUND_BUTTON_ON_CHECKED_CHANGE_LISTENER = "android.widget.CompoundButton.OnCheckedChangeListener"; public static final String VIEW = "android.view.View"; public static final String VIEW_ON_CLICK_LISTENER = "android.view.View.OnClickListener"; public static final String VIEW_ON_TOUCH_LISTENER = "android.view.View.OnTouchListener"; @@ -128,6 +130,8 @@ public final class CanonicalNameConstants { public static final String REST_TEMPLATE = "org.springframework.web.client.RestTemplate"; public static final String HTTP_MESSAGE_CONVERTER = "org.springframework.http.converter.HttpMessageConverter"; public static final String CLIENT_HTTP_REQUEST_INTERCEPTOR = "org.springframework.http.client.ClientHttpRequestInterceptor"; + public static final String HTTP_AUTHENTICATION = "org.springframework.http.HttpAuthentication"; + public static final String HTTP_BASIC_AUTHENTICATION = "org.springframework.http.HttpBasicAuthentication"; public static final String REST_CLIENT_EXCEPTION = "org.springframework.web.client.RestClientException"; /* diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CaseHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CaseHelper.java index 522c678c22..eee5b8099f 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CaseHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/CaseHelper.java @@ -60,7 +60,15 @@ public static String camelCaseToUpperSnakeCase(String camelCase) { return camelCaseToSnakeCase(camelCase).toUpperCase(); } - public static String camelCaseToUpperSnakeCase(String prefix, String camelCase, String suffix) { + public static String lowerCaseFirst(String string) { + if (string.length() < 2) + return string.toLowerCase(); + String first = string.substring(0, 1).toLowerCase(); + String end = string.substring(1, string.length()); + return first + end; + } + + public static String camelCaseToUpperSnakeCase(String prefix, String camelCase, String suffix) { if (prefix != null && !camelCase.startsWith(prefix)) { camelCase = prefix + "_" + camelCase; } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/GreenDroidConstants.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/GreenDroidHelper.java similarity index 56% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/GreenDroidConstants.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/GreenDroidHelper.java index dfa14b5f2b..28dddbffde 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/GreenDroidConstants.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/GreenDroidHelper.java @@ -15,10 +15,14 @@ */ package org.androidannotations.helper; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public abstract class GreenDroidConstants { +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.TypeElement; + +public class GreenDroidHelper { public static final String GREENDROID_GD_ACTIVITY_CLASS = "greendroid.app.GDActivity"; @@ -35,7 +39,28 @@ public abstract class GreenDroidConstants { GREENDROID_GD_MAP_ACTIVITY_CLASS // }); - private GreenDroidConstants() { + private ProcessingEnvironment processingEnv; + private List greendroidActivityElements; + + public GreenDroidHelper(ProcessingEnvironment processingEnv) { + this.processingEnv = processingEnv; + AnnotationHelper annotationHelper = new AnnotationHelper(processingEnv); + + greendroidActivityElements = new ArrayList(); + for (String greendroidActivityName : GREENDROID_ACTIVITIES_LIST_CLASS) { + TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(greendroidActivityName); + if (typeElement != null) { + greendroidActivityElements.add(typeElement); + } + } } + public boolean usesGreenDroid(TypeElement annotatedElement) { + for (TypeElement greendroidActivityElement : greendroidActivityElements) { + if (processingEnv.getTypeUtils().isSubtype(annotatedElement.asType(), greendroidActivityElement.asType())) { + return true; + } + } + return false; + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/HoloEverywhereHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/HoloEverywhereHelper.java new file mode 100644 index 0000000000..7a91ab8080 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/HoloEverywhereHelper.java @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.helper; + +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.NoType; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.holder.EComponentHolder; + +public class HoloEverywhereHelper { + + private EComponentHolder holder; + + public HoloEverywhereHelper(EComponentHolder holder) { + this.holder = holder; + } + + public boolean usesHoloEverywhere() { + TypeElement typeElement = holder.getAnnotatedElement(); + + TypeMirror superType; + while (!((superType = typeElement.getSuperclass()) instanceof NoType)) { + typeElement = (TypeElement) ((DeclaredType) superType).asElement(); + String qName = typeElement.getQualifiedName().toString(); + if (qName.startsWith("org.holoeverywhere")) { + return true; + } + } + return false; + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IdAnnotationHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IdAnnotationHelper.java index af34c1606b..b11ab0a14e 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IdAnnotationHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IdAnnotationHelper.java @@ -20,7 +20,8 @@ import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; -import org.androidannotations.processing.EBeanHolder; +import org.androidannotations.holder.GeneratedClassHolder; +import org.androidannotations.process.ProcessHolder; import org.androidannotations.rclass.IRClass; import org.androidannotations.rclass.IRClass.Res; import org.androidannotations.rclass.IRInnerClass; @@ -50,15 +51,15 @@ public List extractAnnotationResources(Element element, Res res, boolean return super.extractAnnotationResources(element, getTarget(), rClass.get(res), useElementName); } - public List extractAnnotationFieldRefs(EBeanHolder holder, Element element, Res res, boolean useElementName) { + public List extractAnnotationFieldRefs(ProcessHolder holder, Element element, Res res, boolean useElementName) { return super.extractAnnotationFieldRefs(holder, element, getTarget(), rClass.get(res), useElementName); } - public JFieldRef extractOneAnnotationFieldRef(EBeanHolder holder, Element element, Res res, boolean useElementName) { + public JFieldRef extractOneAnnotationFieldRef(ProcessHolder holder, Element element, Res res, boolean useElementName) { return extractOneAnnotationFieldRef(holder, element, getTarget(), res, useElementName); } - public JFieldRef extractOneAnnotationFieldRef(EBeanHolder holder, Element element, String annotationName, Res res, boolean useElementName) { + public JFieldRef extractOneAnnotationFieldRef(ProcessHolder holder, Element element, String annotationName, Res res, boolean useElementName) { List jFieldRefs = extractAnnotationFieldRefs(holder, element, annotationName, rClass.get(res), useElementName); if (jFieldRefs.size() == 1) { @@ -66,7 +67,5 @@ public JFieldRef extractOneAnnotationFieldRef(EBeanHolder holder, Element elemen } else { return null; } - } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IdValidatorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IdValidatorHelper.java index 41f74b5780..e812b9725b 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IdValidatorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IdValidatorHelper.java @@ -22,8 +22,8 @@ import org.androidannotations.annotations.ResId; import org.androidannotations.model.AnnotationElements; +import org.androidannotations.process.IsValid; import org.androidannotations.rclass.IRClass.Res; -import org.androidannotations.validation.IsValid; public class IdValidatorHelper extends ValidatorHelper { diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IntentBuilder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IntentBuilder.java new file mode 100644 index 0000000000..16eeb88647 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/IntentBuilder.java @@ -0,0 +1,195 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.helper; + +import static com.sun.codemodel.JExpr._new; +import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JMod.FINAL; +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.CanonicalNameConstants.PARCELABLE; +import static org.androidannotations.helper.CanonicalNameConstants.SERIALIZABLE; +import static org.androidannotations.helper.CanonicalNameConstants.STRING; + +import com.sun.codemodel.*; +import com.sun.tools.javac.util.Pair; +import org.androidannotations.holder.HasIntentBuilder; + +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; +import java.lang.annotation.ElementType; +import java.util.HashMap; +import java.util.Map; + +public class IntentBuilder { + + private static final int MIN_SDK_WITH_FRAGMENT_SUPPORT = 11; + + protected HasIntentBuilder holder; + protected AndroidManifest androidManifest; + protected JFieldVar contextField; + protected JClass contextClass; + protected JClass intentClass; + protected JFieldVar fragmentField; + protected JFieldVar fragmentSupportField; + protected Map, JMethod> putExtraMethods = new HashMap, JMethod>(); + + protected Elements elementUtils; + protected Types typeUtils; + protected APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + + public IntentBuilder(HasIntentBuilder holder, AndroidManifest androidManifest) { + this.holder = holder; + this.androidManifest = androidManifest; + elementUtils = holder.processingEnvironment().getElementUtils(); + typeUtils = holder.processingEnvironment().getTypeUtils(); + contextClass = holder.classes().CONTEXT; + intentClass = holder.classes().INTENT; + } + + public void build() throws JClassAlreadyExistsException { + createClass(); + createConstructor(); + createAdditionalConstructor(); // See issue #541 + createGet(); + createFlags(); + createIntent(); + } + + private void createClass() throws JClassAlreadyExistsException { + holder.setIntentBuilderClass(holder.getGeneratedClass()._class(PUBLIC | STATIC, "IntentBuilder_")); + contextField = holder.getIntentBuilderClass().field(PRIVATE, contextClass, "context_"); + holder.setIntentField(holder.getIntentBuilderClass().field(PRIVATE | FINAL, intentClass, "intent_")); + } + + private void createConstructor() { + JMethod constructor = holder.getIntentBuilderClass().constructor(JMod.PUBLIC); + JVar constructorContextParam = constructor.param(contextClass, "context"); + JBlock constructorBody = constructor.body(); + constructorBody.assign(contextField, constructorContextParam); + constructorBody.assign(holder.getIntentField(), _new(intentClass).arg(constructorContextParam).arg(holder.getGeneratedClass().dotclass())); + } + + private void createAdditionalConstructor() { + if (hasFragmentInClasspath()) { + fragmentField = addFragmentConstructor(holder.classes().FRAGMENT, "fragment_"); + } + if (hasFragmentSupportInClasspath()) { + fragmentSupportField = addFragmentConstructor(holder.classes().SUPPORT_V4_FRAGMENT, "fragmentSupport_"); + } + } + + private void createGet() { + JMethod method = holder.getIntentBuilderClass().method(PUBLIC, intentClass, "get"); + method.body()._return(holder.getIntentField()); + } + + private void createFlags() { + JMethod method = holder.getIntentBuilderClass().method(PUBLIC, holder.getIntentBuilderClass(), "flags"); + JVar flagsParam = method.param(holder.codeModel().INT, "flags"); + JBlock body = method.body(); + body.invoke(holder.getIntentField(), "setFlags").arg(flagsParam); + body._return(_this()); + } + + private void createIntent() { + JMethod method = holder.getGeneratedClass().method(STATIC | PUBLIC, holder.getIntentBuilderClass(), "intent"); + JVar contextParam = method.param(contextClass, "context"); + method.body()._return(_new(holder.getIntentBuilderClass()).arg(contextParam)); + + if (hasFragmentInClasspath()) { + // intent() with android.app.Fragment param + method = holder.getGeneratedClass().method(STATIC | PUBLIC, holder.getIntentBuilderClass(), "intent"); + JVar fragmentParam = method.param(holder.classes().FRAGMENT, "fragment"); + method.body()._return(_new(holder.getIntentBuilderClass()).arg(fragmentParam)); + } + if (hasFragmentSupportInClasspath()) { + // intent() with android.support.v4.app.Fragment param + method = holder.getGeneratedClass().method(STATIC | PUBLIC, holder.getIntentBuilderClass(), "intent"); + JVar fragmentParam = method.param(holder.classes().SUPPORT_V4_FRAGMENT, "supportFragment"); + method.body()._return(_new(holder.getIntentBuilderClass()).arg(fragmentParam)); + } + } + + private JFieldVar addFragmentConstructor(JClass fragmentClass, String fieldName) { + JFieldVar fragmentField = holder.getIntentBuilderClass().field(PRIVATE, fragmentClass, fieldName); + JMethod constructor = holder.getIntentBuilderClass().constructor(JMod.PUBLIC); + JVar constructorFragmentParam = constructor.param(fragmentClass, "fragment"); + JBlock constructorBody = constructor.body(); + constructorBody.assign(fragmentField, constructorFragmentParam); + constructorBody.assign(contextField, constructorFragmentParam.invoke("getActivity")); + constructorBody.assign(holder.getIntentField(), _new(holder.classes().INTENT).arg(contextField).arg(holder.getGeneratedClass().dotclass())); + return fragmentField; + } + + private boolean hasFragmentInClasspath() { + boolean fragmentExistsInSdk = androidManifest.getMinSdkVersion() >= MIN_SDK_WITH_FRAGMENT_SUPPORT; + return fragmentExistsInSdk && elementUtils.getTypeElement(CanonicalNameConstants.FRAGMENT) != null; + } + + private boolean hasFragmentSupportInClasspath() { + return elementUtils.getTypeElement(CanonicalNameConstants.SUPPORT_V4_FRAGMENT) != null; + } + + public JMethod getPutExtraMethod(TypeMirror elementType, String parameterName, JFieldVar extraKeyField) { + Pair signature = new Pair(elementType,parameterName); + JMethod putExtraMethod = putExtraMethods.get(signature); + if (putExtraMethod == null) { + putExtraMethod = addPutExtraMethod(elementType, parameterName, extraKeyField); + putExtraMethods.put(signature, putExtraMethod); + } + return putExtraMethod; + } + + private JMethod addPutExtraMethod(TypeMirror elementType, String parameterName, JFieldVar extraKeyField) { + boolean castToSerializable = false; + boolean castToParcelable = false; + if (elementType.getKind() == TypeKind.DECLARED) { + Elements elementUtils = holder.processingEnvironment().getElementUtils(); + TypeMirror parcelableType = elementUtils.getTypeElement(PARCELABLE).asType(); + if (!typeUtils.isSubtype(elementType, parcelableType)) { + TypeMirror stringType = elementUtils.getTypeElement(STRING).asType(); + if (!typeUtils.isSubtype(elementType, stringType)) { + castToSerializable = true; + } + } else { + TypeMirror serializableType = elementUtils.getTypeElement(SERIALIZABLE).asType(); + if (typeUtils.isSubtype(elementType, serializableType)) { + castToParcelable = true; + } + } + } + + JMethod method = holder.getIntentBuilderClass().method(PUBLIC, holder.getIntentBuilderClass(), parameterName); + JClass parameterClass = codeModelHelper.typeMirrorToJClass(elementType, holder); + JVar extraParameterVar = method.param(parameterClass, parameterName); + JBlock body = method.body(); + JInvocation invocation = body.invoke(holder.getIntentField(), "putExtra").arg(extraKeyField); + if (castToSerializable) { + invocation.arg(cast(holder.classes().SERIALIZABLE, extraParameterVar)); + } else if (castToParcelable) { + invocation.arg(cast(holder.classes().PARCELABLE, extraParameterVar)); + } else { + invocation.arg(extraParameterVar); + } + body._return(_this()); + return method; + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/OnSeekBarChangeListenerHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/OnSeekBarChangeListenerHelper.java deleted file mode 100644 index 50bd246bb5..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/OnSeekBarChangeListenerHelper.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.helper; - -import static com.sun.codemodel.JExpr.cast; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.processing.EBeanHolder; -import org.androidannotations.processing.OnSeekBarChangeListenerHolder; -import org.androidannotations.rclass.IRClass; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JVar; - -public class OnSeekBarChangeListenerHelper extends IdAnnotationHelper { - - private final APTCodeModelHelper codeModelHelper; - - public OnSeekBarChangeListenerHelper(// - ProcessingEnvironment processingEnv, // - String annotationName, // - IRClass rClass, // - APTCodeModelHelper codeModelHelper) { - - super(processingEnv, annotationName, rClass); - - this.codeModelHelper = codeModelHelper; - - } - - public OnSeekBarChangeListenerHolder getOrCreateListener(JCodeModel codeModel, EBeanHolder holder, JFieldRef idRef) { - - String idRefString = codeModelHelper.getIdStringFromIdFieldRef(idRef); - OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder = holder.onSeekBarChangeListeners.get(idRefString); - - if (onSeekBarChangeListenerHolder == null) { - JClass seekBarClass = holder.classes().SEEKBAR; - - JDefinedClass onSeekbarChangeListenerClass = codeModel.anonymousClass(holder.classes().ON_SEEKBAR_CHANGE_LISTENER); - - JMethod onStartTrackingTouchMethod = onSeekbarChangeListenerClass.method(JMod.PUBLIC, codeModel.VOID, "onStartTrackingTouch"); - onStartTrackingTouchMethod.param(seekBarClass, "seekBar"); - onStartTrackingTouchMethod.annotate(Override.class); - - JMethod onProgressChangedMethod = onSeekbarChangeListenerClass.method(JMod.PUBLIC, codeModel.VOID, "onProgressChanged"); - onProgressChangedMethod.param(seekBarClass, "seekBar"); - onProgressChangedMethod.param(codeModel.INT, "progress"); - onProgressChangedMethod.param(codeModel.BOOLEAN, "fromUser"); - onProgressChangedMethod.annotate(Override.class); - - JMethod onStopTrackingTouchMethod = onSeekbarChangeListenerClass.method(JMod.PUBLIC, codeModel.VOID, "onStopTrackingTouch"); - onStopTrackingTouchMethod.param(seekBarClass, "seekBar"); - onStopTrackingTouchMethod.annotate(Override.class); - - JBlock block = holder.onViewChanged().body().block(); - - TypeMirror viewParameterType = typeElementFromQualifiedName(CanonicalNameConstants.SEEKBAR).asType(); - - String viewParameterTypeString = viewParameterType.toString(); - JClass viewClass = holder.refClass(viewParameterTypeString); - - JExpression findViewById = cast(viewClass, holder.onViewChanged().findViewById(idRef)); - - JVar viewVariable = block.decl(JMod.FINAL, viewClass, "view", findViewById); - block._if(viewVariable.ne(JExpr._null()))._then().invoke(viewVariable, "setOnSeekBarChangeListener").arg(JExpr._new(onSeekbarChangeListenerClass)); - - onSeekBarChangeListenerHolder = new OnSeekBarChangeListenerHolder(// - onStartTrackingTouchMethod, // - onProgressChangedMethod, // - onStopTrackingTouchMethod, // - viewVariable); - - holder.onSeekBarChangeListeners.put(idRefString, onSeekBarChangeListenerHolder); - } - - return onSeekBarChangeListenerHolder; - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/RestAnnotationHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/RestAnnotationHelper.java index e7f2933bf3..6a1944da5c 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/RestAnnotationHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/RestAnnotationHelper.java @@ -15,22 +15,25 @@ */ package org.androidannotations.helper; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.VariableElement; +import javax.lang.model.element.*; +import javax.lang.model.type.*; -import org.androidannotations.processing.rest.MethodProcessor; -import org.androidannotations.validation.IsValid; +import org.androidannotations.annotations.rest.*; +import org.androidannotations.holder.RestHolder; +import org.androidannotations.process.IsValid; +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.*; public class RestAnnotationHelper extends TargetAnnotationHelper { + private APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + public RestAnnotationHelper(ProcessingEnvironment processingEnv, String annotationName) { super(processingEnv, annotationName); } @@ -44,7 +47,7 @@ public void urlVariableNamesExistInParameters(ExecutableElement element, Set extractUrlVariableNames(ExecutableElement element) { - // extract variables name from root url isn't really useful - - // Element enclosingElement = element.getEnclosingElement(); - // String urlPrefix = - // enclosingElement.getAnnotation(Rest.class).value(); - // String urlSuffix = extractAnnotationValue(element); - // String uriTemplate = urlPrefix + urlSuffix; - Set variableNames = new HashSet(); String uriTemplate = extractAnnotationValueParameter(element); @@ -117,4 +112,358 @@ public Set extractUrlVariableNames(ExecutableElement element) { return variableNames; } + public JVar declareUrlVariables(ExecutableElement element, RestHolder holder, JBlock methodBody, TreeMap methodParams) { + Set urlVariables = extractUrlVariableNames(element); + + // cookies in url? + String[] cookiesToUrl = requiredUrlCookies(element); + if (cookiesToUrl != null) { + for (String cookie : cookiesToUrl) { + urlVariables.add(cookie); + } + } + + JClass hashMapClass = holder.classes().HASH_MAP.narrow(String.class, Object.class); + if (!urlVariables.isEmpty()) { + JVar hashMapVar = methodBody.decl(hashMapClass, "urlVariables", JExpr._new(hashMapClass)); + for (String urlVariable : urlVariables) { + JVar methodParam = methodParams.get(urlVariable); + if (methodParam != null) { + methodBody.invoke(hashMapVar, "put").arg(urlVariable).arg(methodParam); + methodParams.remove(urlVariable); + } else { + // cookie from url + JInvocation cookieValue = holder.getAvailableCookiesField().invoke("get").arg(JExpr.lit(urlVariable)); + methodBody.invoke(hashMapVar, "put").arg(urlVariable).arg(cookieValue); + } + } + return hashMapVar; + } + return null; + } + + public String acceptedHeaders(ExecutableElement executableElement) { + Accept acceptAnnotation = executableElement.getAnnotation(Accept.class); + if (acceptAnnotation == null) { + acceptAnnotation = executableElement.getEnclosingElement().getAnnotation(Accept.class); + } + if (acceptAnnotation != null) { + return acceptAnnotation.value(); + } else { + return null; + } + } + + public String[] requiredHeaders(ExecutableElement executableElement) { + RequiresHeader cookieAnnotation = executableElement.getAnnotation(RequiresHeader.class); + if (cookieAnnotation == null) { + cookieAnnotation = executableElement.getEnclosingElement().getAnnotation(RequiresHeader.class); + } + if (cookieAnnotation != null) { + return cookieAnnotation.value(); + } else { + return null; + } + } + + public String[] requiredCookies(ExecutableElement executableElement) { + RequiresCookie cookieAnnotation = executableElement.getAnnotation(RequiresCookie.class); + if (cookieAnnotation == null) { + cookieAnnotation = executableElement.getEnclosingElement().getAnnotation(RequiresCookie.class); + } + if (cookieAnnotation != null) { + return cookieAnnotation.value(); + } else { + return null; + } + } + + public static String[] requiredUrlCookies(ExecutableElement executableElement) { + RequiresCookieInUrl cookieAnnotation = executableElement.getAnnotation(RequiresCookieInUrl.class); + if (cookieAnnotation == null) { + cookieAnnotation = executableElement.getEnclosingElement().getAnnotation(RequiresCookieInUrl.class); + } + if (cookieAnnotation != null) { + return cookieAnnotation.value(); + } else { + return null; + } + } + + public String[] settingCookies(ExecutableElement executableElement) { + SetsCookie cookieAnnotation = executableElement.getAnnotation(SetsCookie.class); + if (cookieAnnotation == null) { + cookieAnnotation = executableElement.getEnclosingElement().getAnnotation(SetsCookie.class); + } + if (cookieAnnotation != null) { + return cookieAnnotation.value(); + } else { + return null; + } + } + + public boolean requiredAuthentication(ExecutableElement executableElement) { + RequiresAuthentication basicAuthAnnotation = executableElement.getAnnotation(RequiresAuthentication.class); + if (basicAuthAnnotation == null) { + basicAuthAnnotation = executableElement.getEnclosingElement().getAnnotation(RequiresAuthentication.class); + } + return basicAuthAnnotation != null; + } + + public JVar declareHttpHeaders(ExecutableElement executableElement, RestHolder holder, JBlock body) { + JVar httpHeadersVar = null; + + String mediaType = acceptedHeaders(executableElement); + boolean hasMediaTypeDefined = mediaType != null; + + String[] cookies = requiredCookies(executableElement); + boolean requiresCookies = cookies != null && cookies.length > 0; + + String[] headers = requiredHeaders(executableElement); + boolean requiresHeaders = headers != null && headers.length > 0; + + boolean requiresAuth = requiredAuthentication(executableElement); + + if (hasMediaTypeDefined || requiresCookies || requiresHeaders || requiresAuth) { + // we need the headers + httpHeadersVar = body.decl(holder.classes().HTTP_HEADERS, "httpHeaders", JExpr._new(holder.classes().HTTP_HEADERS)); + } + + if (hasMediaTypeDefined) { + JClass collectionsClass = holder.refClass(CanonicalNameConstants.COLLECTIONS); + JClass mediaTypeClass = holder.refClass(CanonicalNameConstants.MEDIA_TYPE); + + JInvocation mediaTypeListParam = collectionsClass.staticInvoke("singletonList").arg(mediaTypeClass.staticInvoke("parseMediaType").arg(mediaType)); + body.add(JExpr.invoke(httpHeadersVar, "setAccept").arg(mediaTypeListParam)); + } + + if (requiresCookies) { + JClass stringBuilderClass = holder.classes().STRING_BUILDER; + JVar cookiesValueVar = body.decl(stringBuilderClass, "cookiesValue", JExpr._new(stringBuilderClass)); + for (String cookie : cookies) { + JInvocation cookieValue = JExpr.invoke(holder.getAvailableCookiesField(), "get").arg(cookie); + JInvocation cookieFormatted = holder.classes().STRING.staticInvoke("format").arg(String.format("%s=%%s;", cookie)).arg(cookieValue); + JInvocation appendCookie = JExpr.invoke(cookiesValueVar, "append").arg(cookieFormatted); + body.add(appendCookie); + } + + JInvocation cookiesToString = cookiesValueVar.invoke("toString"); + body.add(JExpr.invoke(httpHeadersVar, "set").arg("Cookie").arg(cookiesToString)); + } + + if (requiresHeaders) { + for (String header : headers) { + JInvocation headerValue = JExpr.invoke(holder.getAvailableHeadersField(), "get").arg(header); + body.add(JExpr.invoke(httpHeadersVar, "set").arg(header).arg(headerValue)); + } + + } + + if (requiresAuth) { + // attach auth + body.add(httpHeadersVar.invoke("setAuthorization").arg(holder.getAuthenticationField())); + } + + return httpHeadersVar; + } + + public JVar getEntitySentToServer(ExecutableElement element, TreeMap params) { + Set urlVariables = extractUrlVariableNames(element); + for (String paramName : params.keySet()) { + if (!urlVariables.contains(paramName)) { + return params.get(paramName); + } + } + return null; + } + + public JExpression declareHttpEntity(ProcessHolder holder, JBlock body, JVar entitySentToServer, JVar httpHeaders) { + JType entityType = holder.refClass(Object.class); + + if (entitySentToServer != null) { + entityType = entitySentToServer.type(); + if (entityType.isPrimitive()) { + // Don't narrow primitive types... + entityType = entityType.boxify(); + } + } + + JClass httpEntity = holder.classes().HTTP_ENTITY; + JClass narrowedHttpEntity = httpEntity.narrow(entityType); + JInvocation newHttpEntityVarCall = JExpr._new(narrowedHttpEntity); + + if (entitySentToServer != null) { + newHttpEntityVarCall.arg(entitySentToServer); + } + + if (httpHeaders != null) { + newHttpEntityVarCall.arg(httpHeaders); + } else if (entitySentToServer == null) { + return JExpr._null(); + } + + return body.decl(narrowedHttpEntity, "requestEntity", newHttpEntityVarCall); + } + + public JExpression getResponseClass(Element element, RestHolder holder) { + ExecutableElement executableElement = (ExecutableElement) element; + JExpression responseClassExpr = JExpr._null(); + TypeMirror returnType = executableElement.getReturnType(); + if (returnType.getKind() != TypeKind.VOID) { + JClass responseClass = retrieveResponseClass(returnType, holder); + if (responseClass != null) { + responseClassExpr = responseClass.dotclass(); + } + } + return responseClassExpr; + } + + public JClass retrieveResponseClass(TypeMirror returnType, RestHolder holder) { + String returnTypeString = returnType.toString(); + + JClass responseClass; + + if (returnTypeString.startsWith(CanonicalNameConstants.RESPONSE_ENTITY)) { + DeclaredType declaredReturnType = (DeclaredType) returnType; + if (declaredReturnType.getTypeArguments().size() > 0) { + responseClass = resolveResponseClass(declaredReturnType.getTypeArguments().get(0), holder); + } else { + responseClass = holder.classes().RESPONSE_ENTITY; + } + } else { + responseClass = resolveResponseClass(returnType, holder); + } + + return responseClass; + } + + /** + * Resolve the expected class for the input type according to the following + * rules : + *
    + *
  • The type is a primitive : Directly return the JClass as usual
  • + *
  • The type is NOT a generics : Directly return the JClass as usual
  • + *
  • The type is a generics and enclosing type is a class C<T> : + * Generate a subclass of C<T> and return it
  • + *
  • The type is a generics and enclosing type is an interface I<T> + * : Looking the inheritance tree, then
  • + *
      + *
    1. One of the parent is a {@link Map} : Generate a subclass of + * {@link LinkedHashMap}<T> one and return it
    2. + *
    3. One of the parent is a {@link Set} : Generate a subclass of + * {@link TreeSet}<T> one and return it
    4. + *
    5. One of the parent is a {@link Collection} : Generate a subclass of + * {@link ArrayList}<T> one and return it
    6. + *
    7. Return {@link Object} definition
    8. + *
    + *
+ * + */ + private JClass resolveResponseClass(TypeMirror expectedType, RestHolder holder) { + // is a class or an interface + if (expectedType.getKind() == TypeKind.DECLARED) { + DeclaredType declaredType = (DeclaredType) expectedType; + + List typeArguments = declaredType.getTypeArguments(); + + // is NOT a generics, return directly + if (typeArguments.isEmpty()) { + return codeModelHelper.typeMirrorToJClass(declaredType, holder); + } + + // is a generics, must generate a new super class + TypeElement declaredElement = (TypeElement) declaredType.asElement(); + + JClass baseClass = codeModelHelper.typeMirrorToJClass(declaredType, holder).erasure(); + JClass decoratedExpectedClass = retrieveDecoratedResponseClass(declaredType, declaredElement, holder); + if (decoratedExpectedClass == null) { + decoratedExpectedClass = baseClass; + } + return decoratedExpectedClass; + } else if (expectedType.getKind() == TypeKind.ARRAY) { + ArrayType arrayType = (ArrayType) expectedType; + return resolveResponseClass(arrayType.getComponentType(), holder).array(); + } + + // is not a class nor an interface, return directly + return codeModelHelper.typeMirrorToJClass(expectedType, holder); + } + + /** + * Recursive method used to find if one of the grand-parent of the + * enclosingJClass is {@link Map}, {@link Set} or + * {@link Collection}. + */ + private JClass retrieveDecoratedResponseClass(DeclaredType declaredType, TypeElement typeElement, RestHolder holder) { + String classTypeBaseName = typeElement.toString(); + + // Looking for basic java.util interfaces to set a default + // implementation + String decoratedClassName = null; + + if (typeElement.getKind() == ElementKind.INTERFACE) { + if (classTypeBaseName.equals(CanonicalNameConstants.MAP)) { + decoratedClassName = LinkedHashMap.class.getCanonicalName(); + } else if (classTypeBaseName.equals(CanonicalNameConstants.SET)) { + decoratedClassName = TreeSet.class.getCanonicalName(); + } else if (classTypeBaseName.equals(CanonicalNameConstants.LIST)) { + decoratedClassName = ArrayList.class.getCanonicalName(); + } else if (classTypeBaseName.equals(CanonicalNameConstants.COLLECTION)) { + decoratedClassName = ArrayList.class.getCanonicalName(); + } + } else { + decoratedClassName = typeElement.getQualifiedName().toString(); + } + + if (decoratedClassName != null) { + // Configure the super class of the final decorated class + String decoratedClassNameSuffix = ""; + JClass decoratedSuperClass = holder.refClass(decoratedClassName); + for (TypeMirror typeArgument : declaredType.getTypeArguments()) { + if (typeArgument instanceof WildcardType) { + WildcardType wildcardType = (WildcardType) typeArgument; + if (wildcardType.getExtendsBound() != null) { + typeArgument = wildcardType.getExtendsBound(); + } else if (wildcardType.getSuperBound() != null) { + typeArgument = wildcardType.getSuperBound(); + } + } + JClass narrowJClass = codeModelHelper.typeMirrorToJClass(typeArgument, holder); + decoratedSuperClass = decoratedSuperClass.narrow(narrowJClass); + decoratedClassNameSuffix += plainName(narrowJClass); + } + + String decoratedFinalClassName = classTypeBaseName + "_" + decoratedClassNameSuffix; + decoratedFinalClassName = decoratedFinalClassName.replaceAll("\\[\\]", "s"); + String packageName = holder.getGeneratedClass()._package().name(); + decoratedFinalClassName = packageName + "." + decoratedFinalClassName; + JDefinedClass decoratedJClass = holder.definedClass(decoratedFinalClassName); + decoratedJClass._extends(decoratedSuperClass); + + return decoratedJClass; + } + + // Try to find the superclass and make a recursive call to the this + // method + TypeMirror enclosingSuperJClass = typeElement.getSuperclass(); + if (enclosingSuperJClass != null && enclosingSuperJClass.getKind() == TypeKind.DECLARED) { + DeclaredType declaredEnclosingSuperJClass = (DeclaredType) enclosingSuperJClass; + return retrieveDecoratedResponseClass(declaredType, (TypeElement) declaredEnclosingSuperJClass.asElement(), holder); + } + + // Falling back to the current enclosingJClass if Class can't be found + return null; + } + + protected String plainName(JClass jClass) { + String plainName = jClass.erasure().name(); + List typeParameters = jClass.getTypeParameters(); + if (typeParameters.size() > 0) { + plainName += "_"; + for (JClass typeParameter : typeParameters) { + plainName += plainName(typeParameter); + } + } + return plainName; + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ServiceIntentBuilder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ServiceIntentBuilder.java new file mode 100644 index 0000000000..ba7bae30be --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ServiceIntentBuilder.java @@ -0,0 +1,48 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.helper; + +import static com.sun.codemodel.JMod.PUBLIC; + +import org.androidannotations.holder.HasIntentBuilder; + +import com.sun.codemodel.JClassAlreadyExistsException; +import com.sun.codemodel.JMethod; + +public class ServiceIntentBuilder extends IntentBuilder { + + public ServiceIntentBuilder(HasIntentBuilder holder, AndroidManifest androidManifest) { + super(holder, androidManifest); + } + + @Override + public void build() throws JClassAlreadyExistsException { + super.build(); + createStart(); + createStop(); + } + + private void createStart() { + JMethod method = holder.getIntentBuilderClass().method(PUBLIC, holder.classes().COMPONENT_NAME, "start"); + method.body()._return(contextField.invoke("startService").arg(holder.getIntentField())); + } + + private void createStop() { + JMethod method = holder.getIntentBuilderClass().method(PUBLIC, holder.codeModel().BOOLEAN, "stop"); + method.body()._return(contextField.invoke("stopService").arg(holder.getIntentField())); + } + +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/TargetAnnotationHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/TargetAnnotationHelper.java index 1410dbd3a2..283e007ab5 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/TargetAnnotationHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/TargetAnnotationHelper.java @@ -21,7 +21,7 @@ import javax.lang.model.element.Element; import javax.lang.model.type.DeclaredType; -public class TargetAnnotationHelper extends AnnotationHelper implements HasTarget { +public class TargetAnnotationHelper extends AnnotationHelper { private String annotationName; @@ -44,7 +44,6 @@ public DeclaredType extractAnnotationClassParameter(Element element) { return extractAnnotationClassParameter(element, annotationName); } - @Override public String getTarget() { return annotationName; } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/TextWatcherHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/TextWatcherHelper.java deleted file mode 100644 index c02ddac559..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/TextWatcherHelper.java +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.helper; - -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr.cast; -import static com.sun.codemodel.JMod.FINAL; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.processing.EBeanHolder; -import org.androidannotations.processing.TextWatcherHolder; -import org.androidannotations.rclass.IRClass; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JVar; - -public class TextWatcherHelper extends IdAnnotationHelper { - - private final APTCodeModelHelper codeModelHelper; - - public TextWatcherHelper(// - ProcessingEnvironment processingEnv, // - String annotationName, // - IRClass rClass, // - APTCodeModelHelper codeModelHelper) { - - super(processingEnv, annotationName, rClass); - - this.codeModelHelper = codeModelHelper; - - } - - public TextWatcherHolder getOrCreateListener(JCodeModel codeModel, EBeanHolder holder, JFieldRef idRef, TypeMirror viewParameterType) { - - String idRefString = codeModelHelper.getIdStringFromIdFieldRef(idRef); - TextWatcherHolder textWatcherHolder = holder.textWatchers.get(idRefString); - - if (textWatcherHolder == null) { - JClass charSequenceClass = holder.classes().CHAR_SEQUENCE; - - JDefinedClass onTextChangeListenerClass = codeModel.anonymousClass(holder.classes().TEXT_WATCHER); - - JMethod afterTextChangedMethod = onTextChangeListenerClass.method(JMod.PUBLIC, codeModel.VOID, "afterTextChanged"); - afterTextChangedMethod.param(holder.classes().EDITABLE, "s"); - afterTextChangedMethod.annotate(Override.class); - - JMethod onTextChangedMethod = onTextChangeListenerClass.method(JMod.PUBLIC, codeModel.VOID, "onTextChanged"); - onTextChangedMethod.param(charSequenceClass, "s"); - onTextChangedMethod.param(codeModel.INT, "start"); - onTextChangedMethod.param(codeModel.INT, "before"); - onTextChangedMethod.param(codeModel.INT, "count"); - onTextChangedMethod.annotate(Override.class); - - JMethod beforeTextChangedMethod = onTextChangeListenerClass.method(JMod.PUBLIC, codeModel.VOID, "beforeTextChanged"); - beforeTextChangedMethod.param(charSequenceClass, "s"); - beforeTextChangedMethod.param(codeModel.INT, "start"); - beforeTextChangedMethod.param(codeModel.INT, "count"); - beforeTextChangedMethod.param(codeModel.INT, "after"); - beforeTextChangedMethod.annotate(Override.class); - - JBlock block = holder.onViewChanged().body().block(); - - JClass viewClass; - if (viewParameterType != null) { - String viewParameterTypeString = viewParameterType.toString(); - viewClass = holder.refClass(viewParameterTypeString); - } else { - viewClass = holder.classes().TEXT_VIEW; - } - JExpression findViewById = cast(viewClass, holder.onViewChanged().findViewById(idRef)); - - JVar viewVariable = block.decl(FINAL, viewClass, "view", findViewById); - block._if(viewVariable.ne(JExpr._null()))._then().invoke(viewVariable, "addTextChangedListener").arg(_new(onTextChangeListenerClass)); - - textWatcherHolder = new TextWatcherHolder(// - afterTextChangedMethod, // - beforeTextChangedMethod, // - onTextChangedMethod, // - viewVariable); - - holder.textWatchers.put(idRefString, textWatcherHolder); - } - - return textWatcherHolder; - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java index cc25aa2ef4..f250a6f897 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorHelper.java @@ -78,8 +78,7 @@ import org.androidannotations.api.sharedpreferences.SharedPreferencesHelper; import org.androidannotations.model.AndroidSystemServices; import org.androidannotations.model.AnnotationElements; -import org.androidannotations.processing.InstanceStateProcessor; -import org.androidannotations.validation.IsValid; +import org.androidannotations.process.IsValid; public class ValidatorHelper { @@ -104,12 +103,12 @@ public class ValidatorHelper { public final ValidatorParameterHelper param; - private final ThirdPartyLibHelper thirdPartyLibHelper; + private final ActionBarSherlockHelper thirdPartyLibHelper; public ValidatorHelper(TargetAnnotationHelper targetAnnotationHelper) { annotationHelper = targetAnnotationHelper; param = new ValidatorParameterHelper(annotationHelper); - thirdPartyLibHelper = new ThirdPartyLibHelper(annotationHelper); + thirdPartyLibHelper = new ActionBarSherlockHelper(annotationHelper); } public void isNotFinal(Element element, IsValid valid) { @@ -165,13 +164,6 @@ public void doesNotReturnPrimitive(ExecutableElement element, IsValid valid) { } } - public void doesNotReturnArray(ExecutableElement element, IsValid valid) { - if (element.getReturnType().getKind() == TypeKind.ARRAY) { - valid.invalidate(); - annotationHelper.printAnnotationError(element, "%s cannot return array"); - } - } - public void isNotPrivate(Element element, IsValid valid) { if (annotationHelper.isPrivate(element)) { valid.invalidate(); @@ -287,23 +279,6 @@ public void hasViewByIdAnnotation(Element element, AnnotationElements validatedE elementHasAnnotation(ViewById.class, element, validatedElements, valid, error); } - public void elementHasRestAnnotationOrEnclosingElementHasRestAnnotationAndElementHasMethodRestAnnotation(Element element, AnnotationElements validatedElements, IsValid valid) { - String error = "can only be used in an interface annotated with"; - elementHasAnnotation(Rest.class, element, validatedElements, valid, error); - - if (!valid.isValid()) { - enclosingElementHasRestAnnotation(element, validatedElements, valid); - elementHasMethodRestAnnotation(element, validatedElements, valid); - } - - } - - public void elementHasMethodRestAnnotation(Element element, AnnotationElements validatedElements, IsValid valid) { - String error = "can only be used on a method annotated with Rest methods."; - elementHasAnnotationContainsIn(REST_ANNOTATION_CLASSES, element, validatedElements, valid, error); - - } - public void enclosingElementHasRestAnnotation(Element element, AnnotationElements validatedElements, IsValid valid) { String error = "can only be used in an interface annotated with"; enclosingElementHasAnnotation(Rest.class, element, validatedElements, valid, error); @@ -326,21 +301,6 @@ public void elementHasAnnotation(Class annotation, Element } } - public void elementHasAnnotationContainsIn(List> annotations, Element element, AnnotationElements validatedElements, IsValid valid, String error) { - boolean isAnnoted = false; - for (Class annotation : annotations) { - if (elementHasAnnotation(annotation, element, validatedElements)) { - isAnnoted = true; - break; - } - } - - if (!isAnnoted) { - valid.invalidate(); - annotationHelper.printAnnotationError(element, "%s " + error); - } - } - public boolean elementHasAnnotation(Class annotation, Element element, AnnotationElements validatedElements) { Set layoutAnnotatedElements = validatedElements.getRootAnnotatedElements(annotation.getName()); return layoutAnnotatedElements.contains(element); @@ -356,13 +316,6 @@ public void throwsOnlyRestClientException(ExecutableElement element, IsValid val } } - public void elementHasGetOrPostAnnotation(Element element, AnnotationElements validatedElements, IsValid valid) { - - if (!elementHasAnnotation(Get.class, element) && !elementHasAnnotation(Post.class, element)) { - annotationHelper.printAnnotationError(element, "%s can only be used in an interface annotated with Get or Post annotation"); - } - } - public void typeHasAnnotation(Class annotation, Element element, IsValid valid) { TypeMirror elementType = element.asType(); typeHasAnnotation(annotation, elementType, element, valid); @@ -401,27 +354,6 @@ private boolean elementHasAnnotationSafe(Class annotation, return false; } - private boolean elementHasAnnotation(Class annotation, Element element) { - return element.getAnnotation(annotation) != null; - } - - public void elementHasRestAnnotation(Element element, AnnotationElements validatedElements, IsValid valid) { - String error = "can only be used in an interface annotated with"; - elementHasAnnotation(Rest.class, element, validatedElements, valid, error); - } - - public void returnTypeNotGenericUnlessResponseEntity(ExecutableElement element, IsValid valid) { - TypeMirror returnType = element.getReturnType(); - TypeKind returnKind = returnType.getKind(); - if (returnKind == TypeKind.DECLARED) { - DeclaredType declaredReturnType = (DeclaredType) returnType; - if (!declaredReturnType.toString().startsWith("org.springframework.http.ResponseEntity<") && declaredReturnType.getTypeArguments().size() > 0) { - valid.invalidate(); - annotationHelper.printAnnotationError(element, "%s annotated methods cannot return parameterized types, except for ResponseEntity"); - } - } - } - public void hasHttpHeadersReturnType(ExecutableElement element, IsValid valid) { String returnType = element.getReturnType().toString(); if (!returnType.equals("org.springframework.http.HttpHeaders")) { @@ -738,14 +670,14 @@ public void androidService(AndroidSystemServices androidSystemServices, Element } } - public void isDeclaredType(Element element, IsValid valid, TypeMirror uiFieldTypeMirror) { - if (!(uiFieldTypeMirror instanceof DeclaredType)) { + public void isDeclaredType(Element element, IsValid valid) { + if (!(element.asType() instanceof DeclaredType)) { valid.invalidate(); annotationHelper.printAnnotationError(element, "%s can only be used on a field which is a declared type"); } } - public boolean isPrefMethod(Element element) { + public void isPrefMethod(Element element, IsValid valid) { if (!element.getKind().equals(ElementKind.METHOD)) { annotationHelper.printError(element, "Only methods are allowed in an " + annotationHelper.annotationName() + " annotated interface"); } else { @@ -762,25 +694,25 @@ public boolean isPrefMethod(Element element) { if (INVALID_PREF_METHOD_NAMES.contains(methodName)) { annotationHelper.printError(element, "The method name " + methodName + " is forbidden in an " + annotationHelper.annotationName() + " annotated interface"); } else { - return true; + return; } } } } - return false; + valid.invalidate(); } - public void hasCorrectDefaultAnnotation(ExecutableElement method) { - checkDefaultAnnotation(method, DefaultBoolean.class, "boolean", new TypeKindAnnotationCondition(TypeKind.BOOLEAN)); - checkDefaultAnnotation(method, DefaultFloat.class, "float", new TypeKindAnnotationCondition(TypeKind.FLOAT)); - checkDefaultAnnotation(method, DefaultInt.class, "int", new TypeKindAnnotationCondition(TypeKind.INT)); - checkDefaultAnnotation(method, DefaultLong.class, "long", new TypeKindAnnotationCondition(TypeKind.LONG)); + public void hasCorrectDefaultAnnotation(ExecutableElement method, IsValid valid) { + checkDefaultAnnotation(method, DefaultBoolean.class, "boolean", new TypeKindAnnotationCondition(TypeKind.BOOLEAN), valid); + checkDefaultAnnotation(method, DefaultFloat.class, "float", new TypeKindAnnotationCondition(TypeKind.FLOAT), valid); + checkDefaultAnnotation(method, DefaultInt.class, "int", new TypeKindAnnotationCondition(TypeKind.INT), valid); + checkDefaultAnnotation(method, DefaultLong.class, "long", new TypeKindAnnotationCondition(TypeKind.LONG), valid); checkDefaultAnnotation(method, DefaultString.class, "String", new DefaultAnnotationCondition() { @Override public boolean correctReturnType(TypeMirror returnType) { return returnType.toString().equals(CanonicalNameConstants.STRING); } - }); + }, valid); } private interface DefaultAnnotationCondition { @@ -802,11 +734,12 @@ public boolean correctReturnType(TypeMirror returnType) { } - private void checkDefaultAnnotation(ExecutableElement method, Class annotationClass, String expectedReturnType, DefaultAnnotationCondition condition) { + private void checkDefaultAnnotation(ExecutableElement method, Class annotationClass, String expectedReturnType, DefaultAnnotationCondition condition, IsValid valid) { T defaultAnnotation = method.getAnnotation(annotationClass); if (defaultAnnotation != null) { if (!condition.correctReturnType(method.getReturnType())) { annotationHelper.printAnnotationError(method, annotationClass.getName(), TargetAnnotationHelper.annotationName(annotationClass) + " can only be used on a method that returns a " + expectedReturnType); + valid.invalidate(); } } } @@ -1060,7 +993,7 @@ private TypeElement getArrayEnclosingType(String typeString) { } private boolean isKnowInstanceStateType(String type) { - return InstanceStateProcessor.methodSuffixNameByTypeName.containsKey(type); + return BundleHelper.methodSuffixNameByTypeName.containsKey(type); } public void componentRegistered(Element element, AndroidManifest androidManifest, IsValid valid) { @@ -1194,6 +1127,188 @@ public void validateInterceptors(Element element, IsValid valid) { } } + public void hasBeforeTextChangedMethodParameters(ExecutableElement executableElement, IsValid valid) { + List parameters = executableElement.getParameters(); + boolean charSequenceParameterFound = false; + boolean textViewParameterFound = false; + for (VariableElement parameter : parameters) { + String parameterType = parameter.asType().toString(); + if (parameterType.equals(CanonicalNameConstants.CHAR_SEQUENCE)) { + if (charSequenceParameterFound) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type java.lang.CharSequence"); + valid.invalidate(); + } + charSequenceParameterFound = true; + continue; + } + if (parameterType.equals(CanonicalNameConstants.TEXT_VIEW)) { + if (textViewParameterFound) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type android.widget.TextView"); + valid.invalidate(); + } + textViewParameterFound = true; + continue; + } + if (parameter.asType().getKind() == TypeKind.INT || CanonicalNameConstants.INTEGER.equals(parameterType)) { + String parameterName = parameter.toString(); + if ("start".equals(parameterName) || "count".equals(parameterName) || "after".equals(parameterName)) { + continue; + } + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter name. You can only have start, before, or count parameter name. Try to pick a parameter from android.text.TextWatcher.beforeTextChanged() method."); + valid.invalidate(); + continue; + } + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter (" + parameter.toString() + "). %s can only have a android.widget.TextView parameter and/or parameters from android.text.TextWatcher.beforeTextChanged() method."); + valid.invalidate(); + } + } + + public void hasTextChangedMethodParameters(ExecutableElement executableElement, IsValid valid) { + List parameters = executableElement.getParameters(); + boolean charSequenceParameterFound = false; + boolean textViewParameterFound = false; + for (VariableElement parameter : parameters) { + String parameterType = parameter.asType().toString(); + if (parameterType.equals(CanonicalNameConstants.CHAR_SEQUENCE)) { + if (charSequenceParameterFound) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type java.lang.CharSequence"); + valid.invalidate(); + } + charSequenceParameterFound = true; + continue; + } + if (parameterType.equals(CanonicalNameConstants.TEXT_VIEW)) { + if (textViewParameterFound) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type android.widget.TextView"); + valid.invalidate(); + } + textViewParameterFound = true; + continue; + } + if (parameter.asType().getKind() == TypeKind.INT || CanonicalNameConstants.INTEGER.equals(parameterType)) { + String parameterName = parameter.toString(); + if ("start".equals(parameterName) || "before".equals(parameterName) || "count".equals(parameterName)) { + continue; + } + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter name. You can only have start, before, or count parameter name. Try to pick a prameter from the android.text.TextWatcher.onTextChanged() method."); + valid.invalidate(); + continue; + } + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter (" + parameter.toString() + "). %s can only have a android.widget.TextView parameter and/or parameters from android.text.TextWatcher.onTextChanged() method."); + valid.invalidate(); + } + } + + public void hasAfterTextChangedMethodParameters(ExecutableElement executableElement, IsValid valid) { + List parameters = executableElement.getParameters(); + boolean editableParameterFound = false; + boolean textViewParameterFound = false; + for (VariableElement parameter : parameters) { + String parameterType = parameter.asType().toString(); + if (parameterType.equals(CanonicalNameConstants.EDITABLE)) { + if (editableParameterFound) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type android.text.Editable"); + valid.invalidate(); + } + editableParameterFound = true; + continue; + } + if (parameterType.equals(CanonicalNameConstants.TEXT_VIEW)) { + if (textViewParameterFound) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type android.widget.TextView"); + valid.invalidate(); + } + textViewParameterFound = true; + continue; + } + valid.invalidate(); + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter type. %s can only have a android.widget.TextView parameter and/or an android.text.Editable parameter. See android.text.TextWatcher.afterTextChanged() for more informations."); + } + } + + public void hasSeekBarProgressChangeMethodParameters(ExecutableElement executableElement, IsValid valid) { + List parameters = executableElement.getParameters(); + boolean seekBarParameterFound = false; + boolean fromUserParameterFound = false; + boolean progressParameterFound = false; + for (VariableElement parameter : parameters) { + String parameterType = parameter.asType().toString(); + if (parameterType.equals(CanonicalNameConstants.SEEKBAR)) { + if (seekBarParameterFound) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. You can declare only one parameter of type " + CanonicalNameConstants.SEEKBAR); + valid.invalidate(); + } + seekBarParameterFound = true; + continue; + } + if (parameter.asType().getKind() == TypeKind.INT || CanonicalNameConstants.INTEGER.equals(parameterType)) { + if (progressParameterFound) { + annotationHelper.printAnnotationError(executableElement, "You can have only one parameter of type " + CanonicalNameConstants.INTEGER); + valid.invalidate(); + } + progressParameterFound = true; + continue; + } + if (parameter.asType().getKind() == TypeKind.BOOLEAN || CanonicalNameConstants.BOOLEAN.equals(parameterType)) { + if (fromUserParameterFound) { + annotationHelper.printAnnotationError(executableElement, "You can have only one parameter of type " + CanonicalNameConstants.BOOLEAN); + valid.invalidate(); + } + fromUserParameterFound = true; + continue; + } + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter '" + parameter.toString() + "'. %s signature should be " + executableElement.getSimpleName() + "(" + CanonicalNameConstants.SEEKBAR + " seekBar, int progress, boolean fromUser). The 'fromUser' and 'progress' parameters are optional."); + valid.invalidate(); + } + } + + public void hasSeekBarTouchTrackingMethodParameters(ExecutableElement executableElement, IsValid valid) { + List parameters = executableElement.getParameters(); + + if (parameters.size() > 1) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. You can only have one parameter of type " + CanonicalNameConstants.SEEKBAR + ". Try declaring " + executableElement.getSimpleName() + "(" + CanonicalNameConstants.SEEKBAR + " seekBar);"); + valid.invalidate(); + return; + } + + if (parameters.size() == 1) { + String parameterType = parameters.get(0).asType().toString(); + if (!parameterType.equals(CanonicalNameConstants.SEEKBAR)) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. You can only have one parameter of type " + CanonicalNameConstants.SEEKBAR + ". Try declaring " + executableElement.getSimpleName() + "(" + CanonicalNameConstants.SEEKBAR + " seekBar);"); + valid.invalidate(); + } + } + + } + + public void hasOnResultMethodParameters(ExecutableElement executableElement, IsValid valid) { + List parameters = executableElement.getParameters(); + boolean resultCodeParameterFound = false; + boolean intentParameterFound = false; + for (VariableElement parameter : parameters) { + TypeMirror parameterType = parameter.asType(); + if (parameterType.toString().equals(CanonicalNameConstants.INTEGER) // + || parameterType.getKind().equals(TypeKind.INT)) { + if (resultCodeParameterFound) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type int or java.lang.Integer"); + valid.invalidate(); + } + resultCodeParameterFound = true; + continue; + } + if (parameterType.toString().equals(CanonicalNameConstants.INTENT)) { + if (intentParameterFound) { + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type android.content.Intent"); + valid.invalidate(); + } + intentParameterFound = true; + continue; + } + valid.invalidate(); + annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter type. %s can only have a android.content.Intent parameter and/or an Integer parameter"); + } + } + public void hasNotMultipleAnnotatedMethodWithSameName(Element element, IsValid valid, Class annotation) { Set actionNames = new TreeSet(); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java index e0fddb6265..cc8c08d38a 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ValidatorParameterHelper.java @@ -25,7 +25,7 @@ import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; -import org.androidannotations.validation.IsValid; +import org.androidannotations.process.IsValid; public class ValidatorParameterHelper { diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ViewNotifierHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ViewNotifierHelper.java new file mode 100644 index 0000000000..1bfb503239 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/ViewNotifierHelper.java @@ -0,0 +1,73 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.helper; + +import static com.sun.codemodel.JExpr._new; +import static com.sun.codemodel.JExpr._null; +import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JMod.FINAL; +import static com.sun.codemodel.JMod.PRIVATE; + +import org.androidannotations.api.view.HasViews; +import org.androidannotations.api.view.OnViewChangedNotifier; +import org.androidannotations.holder.EComponentHolder; +import org.androidannotations.holder.EViewHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JVar; + +public class ViewNotifierHelper { + + private EComponentHolder holder; + private JFieldVar notifier; + + public ViewNotifierHelper(EComponentHolder holder) { + this.holder = holder; + } + + public void invokeViewChanged(JBlock block) { + block.invoke(notifier, "notifyViewChanged").arg(_this()); + } + + public JVar replacePreviousNotifier(JBlock block) { + JClass notifierClass = holder.refClass(OnViewChangedNotifier.class); + if (notifier == null) { + notifier = holder.getGeneratedClass().field(PRIVATE | FINAL, notifierClass, "onViewChangedNotifier_", _new(notifierClass)); + holder.getGeneratedClass()._implements(HasViews.class); + } + return block.decl(notifierClass, "previousNotifier", notifierClass.staticInvoke("replaceNotifier").arg(notifier)); + } + + public JVar replacePreviousNotifierWithNull(JBlock block) { + JClass notifierClass = holder.refClass(OnViewChangedNotifier.class); + return block.decl(notifierClass, "previousNotifier", notifierClass.staticInvoke("replaceNotifier").arg(_null())); + } + + public void resetPreviousNotifier(JBlock block, JVar previousNotifier) { + JClass notifierClass = holder.refClass(OnViewChangedNotifier.class); + block.staticInvoke(notifierClass, "replaceNotifier").arg(previousNotifier); + } + + public void wrapInitWithNotifier() { + JBlock initBlock = holder.getInit().body(); + JVar previousNotifier = replacePreviousNotifier(initBlock); + ((EViewHolder) holder).setInitBody(holder.getInit().body().block()); + resetPreviousNotifier(initBlock.block(), previousNotifier); + } + +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/BaseGeneratedClassHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/BaseGeneratedClassHolder.java new file mode 100644 index 0000000000..91880f0b29 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/BaseGeneratedClassHolder.java @@ -0,0 +1,91 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JMod.FINAL; +import static com.sun.codemodel.JMod.PUBLIC; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.TypeElement; + +import org.androidannotations.helper.ModelConstants; +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.ClassType; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JCodeModel; +import com.sun.codemodel.JDefinedClass; + +public abstract class BaseGeneratedClassHolder implements GeneratedClassHolder { + + protected final ProcessHolder processHolder; + protected JDefinedClass generatedClass; + protected final TypeElement annotatedElement; + + public BaseGeneratedClassHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + this.processHolder = processHolder; + this.annotatedElement = annotatedElement; + setGeneratedClass(); + } + + protected void setGeneratedClass() throws Exception { + String annotatedComponentQualifiedName = annotatedElement.getQualifiedName().toString(); + String subComponentQualifiedName = annotatedComponentQualifiedName + ModelConstants.GENERATION_SUFFIX; + JClass annotatedComponent = codeModel().directClass(annotatedComponentQualifiedName); + generatedClass = codeModel()._class(PUBLIC | FINAL, subComponentQualifiedName, ClassType.CLASS); + generatedClass._extends(annotatedComponent); + } + + @Override + public JDefinedClass getGeneratedClass() { + return generatedClass; + } + + @Override + public TypeElement getAnnotatedElement() { + return annotatedElement; + } + + @Override + public ProcessingEnvironment processingEnvironment() { + return processHolder.processingEnvironment(); + } + + @Override + public ProcessHolder.Classes classes() { + return processHolder.classes(); + } + + @Override + public JCodeModel codeModel() { + return processHolder.codeModel(); + } + + @Override + public JClass refClass(String fullyQualifiedClassName) { + return processHolder.refClass(fullyQualifiedClassName); + } + + @Override + public JClass refClass(Class clazz) { + return processHolder.refClass(clazz); + } + + @Override + public JDefinedClass definedClass(String fullyQualifiedClassName) { + return processHolder.definedClass(fullyQualifiedClassName); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EActivityHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EActivityHolder.java new file mode 100644 index 0000000000..44ace35d50 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EActivityHolder.java @@ -0,0 +1,698 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JExpr.FALSE; +import static com.sun.codemodel.JExpr.TRUE; +import static com.sun.codemodel.JExpr._new; +import static com.sun.codemodel.JExpr._null; +import static com.sun.codemodel.JExpr._super; +import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JMod.PRIVATE; +import static com.sun.codemodel.JMod.PUBLIC; + +import java.util.ArrayList; +import java.util.List; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeKind; +import javax.lang.model.util.ElementFilter; + +import org.androidannotations.api.SdkVersionHelper; +import org.androidannotations.helper.*; +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JClassAlreadyExistsException; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JExpression; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JInvocation; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JMod; +import com.sun.codemodel.JType; +import com.sun.codemodel.JVar; + +public class EActivityHolder extends EComponentWithViewSupportHolder implements HasIntentBuilder, HasExtras, HasInstanceState, HasOptionsMenu, HasOnActivityResult { + + private GreenDroidHelper greenDroidHelper; + private ActivityIntentBuilder intentBuilder; + private JMethod onCreate; + private JMethod setIntent; + private JMethod setContentViewLayout; + private JVar initSavedInstanceParam; + private JDefinedClass intentBuilderClass; + private JFieldVar intentField; + private InstanceStateHolder instanceStateHolder; + private OnActivityResultHolder onActivityResultHolder; + private RoboGuiceHolder roboGuiceHolder; + private JMethod injectExtrasMethod; + private JBlock injectExtrasBlock; + private JVar injectExtras; + private JBlock onCreateOptionsMenuMethodBody; + private JVar onCreateOptionsMenuMenuInflaterVar; + private JVar onCreateOptionsMenuMenuParam; + private JVar onOptionsItemSelectedItem; + private JVar onOptionsItemSelectedItemId; + private JBlock onOptionsItemSelectedIfElseBlock; + private NonConfigurationHolder nonConfigurationHolder; + private JBlock initIfNonConfigurationNotNullBlock; + private JVar initNonConfigurationInstance; + private JMethod getLastNonConfigurationInstance; + private JBlock onRetainNonConfigurationInstanceBindBlock; + private JVar onRetainNonConfigurationInstance; + private JBlock onDestroyAfterSuperBlock; + private JBlock onResumeAfterSuperBlock; + + public EActivityHolder(ProcessHolder processHolder, TypeElement annotatedElement, AndroidManifest androidManifest) throws Exception { + super(processHolder, annotatedElement); + instanceStateHolder = new InstanceStateHolder(this); + onActivityResultHolder = new OnActivityResultHolder(this); + setSetContentView(); + intentBuilder = new ActivityIntentBuilder(this, androidManifest); + intentBuilder.build(); + handleBackPressed(); + } + + @Override + protected void setContextRef() { + contextRef = _this(); + } + + @Override + protected void setInit() { + init = generatedClass.method(PRIVATE, codeModel().VOID, "init_"); + JClass bundleClass = classes().BUNDLE; + initSavedInstanceParam = init.param(bundleClass, "savedInstanceState"); + getOnCreate(); + } + + public JMethod getOnCreate() { + if (onCreate == null) { + setOnCreate(); + } + return onCreate; + } + + public JMethod getSetIntent() { + if (setIntent == null) { + setSetIntent(); + } + return setIntent; + } + + protected void setOnCreate() { + onCreate = generatedClass.method(PUBLIC, codeModel().VOID, "onCreate"); + onCreate.annotate(Override.class); + JClass bundleClass = classes().BUNDLE; + JVar onCreateSavedInstanceState = onCreate.param(bundleClass, "savedInstanceState"); + JBlock onCreateBody = onCreate.body(); + JVar previousNotifier = viewNotifierHelper.replacePreviousNotifier(onCreateBody); + onCreateBody.invoke(getInit()).arg(onCreateSavedInstanceState); + onCreateBody.invoke(_super(), onCreate).arg(onCreateSavedInstanceState); + viewNotifierHelper.resetPreviousNotifier(onCreateBody, previousNotifier); + } + + protected void setOnStart() { + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onStart"); + method.annotate(Override.class); + JBlock body = method.body(); + getRoboGuiceHolder().onStartBeforeSuperBlock = body.block(); + body.invoke(_super(), method); + getRoboGuiceHolder().onStartAfterSuperBlock = body.block(); + } + + protected void setOnRestart() { + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onRestart"); + method.annotate(Override.class); + JBlock body = method.body(); + getRoboGuiceHolder().onRestartBeforeSuperBlock = body.block(); + body.invoke(_super(), method); + getRoboGuiceHolder().onRestartAfterSuperBlock = body.block(); + } + + protected void setOnResume() { + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onResume"); + method.annotate(Override.class); + JBlock body = method.body(); + getRoboGuiceHolder().onResumeBeforeSuperBlock = body.block(); + body.invoke(_super(), method); + onResumeAfterSuperBlock = body.block(); + } + + protected void setOnPause() { + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onPause"); + method.annotate(Override.class); + JBlock body = method.body(); + body.invoke(_super(), method); + getRoboGuiceHolder().onPauseAfterSuperBlock = body.block(); + } + + protected void setOnNewIntent() { + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onNewIntent"); + method.annotate(Override.class); + JVar intent = method.param(classes().INTENT, "intent"); + JBlock body = method.body(); + body.invoke(_super(), method).arg(intent); + getRoboGuiceHolder().onNewIntentAfterSuperBlock = body.block(); + } + + private void setSetIntent() { + setIntent = generatedClass.method(PUBLIC, codeModel().VOID, "setIntent"); + setIntent.annotate(Override.class); + JVar methodParam = setIntent.param(classes().INTENT, "newIntent"); + JBlock setIntentBody = setIntent.body(); + setIntentBody.invoke(_super(), setIntent).arg(methodParam); + } + + protected void setOnStop() { + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onStop"); + method.annotate(Override.class); + JBlock body = method.body(); + body.invoke(_super(), method); + getRoboGuiceHolder().onStop = method; + } + + protected void setOnDestroy() { + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onDestroy"); + method.annotate(Override.class); + JBlock body = method.body(); + getRoboGuiceHolder().onDestroy = method; + body.invoke(_super(), method); + onDestroyAfterSuperBlock = body.block(); + } + + protected void setOnConfigurationChanged() { + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onConfigurationChanged"); + method.annotate(Override.class); + JClass configurationClass = classes().CONFIGURATION; + JVar newConfig = method.param(configurationClass, "newConfig"); + getRoboGuiceHolder().newConfig = newConfig; + JBlock body = method.body(); + getRoboGuiceHolder().currentConfig = body.decl(configurationClass, "currentConfig", JExpr.invoke("getResources").invoke("getConfiguration")); + body.invoke(_super(), method).arg(newConfig); + getRoboGuiceHolder().onConfigurationChangedAfterSuperBlock = body.block(); + } + + protected void setOnContentChanged() { + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, "onContentChanged"); + method.annotate(Override.class); + JBlock body = method.body(); + body.invoke(_super(), method); + getRoboGuiceHolder().onContentChangedAfterSuperBlock = body.block(); + } + + private void setOnCreateOptionsMenu() { + JClass menuClass = classes().MENU; + JClass menuInflaterClass = classes().MENU_INFLATER; + String getMenuInflaterMethodName = "getMenuInflater"; + if (usesActionBarSherlock()) { + menuClass = classes().SHERLOCK_MENU; + menuInflaterClass = classes().SHERLOCK_MENU_INFLATER; + getMenuInflaterMethodName = "getSupportMenuInflater"; + } + + JMethod method = generatedClass.method(PUBLIC, codeModel().BOOLEAN, "onCreateOptionsMenu"); + method.annotate(Override.class); + JBlock methodBody = method.body(); + onCreateOptionsMenuMenuParam = method.param(menuClass, "menu"); + onCreateOptionsMenuMenuInflaterVar = methodBody.decl(menuInflaterClass, "menuInflater", invoke(getMenuInflaterMethodName)); + onCreateOptionsMenuMethodBody = methodBody.block(); + methodBody._return(_super().invoke(method).arg(onCreateOptionsMenuMenuParam)); + } + + private void setOnOptionsItemSelected() { + JClass menuItemClass = classes().MENU_ITEM; + if (usesActionBarSherlock()) { + menuItemClass = classes().SHERLOCK_MENU_ITEM; + } + + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().BOOLEAN, "onOptionsItemSelected"); + method.annotate(Override.class); + JBlock methodBody = method.body(); + onOptionsItemSelectedItem = method.param(menuItemClass, "item"); + JVar handled = methodBody.decl(codeModel().BOOLEAN, "handled", invoke(_super(), method).arg(onOptionsItemSelectedItem)); + methodBody._if(handled)._then()._return(TRUE); + onOptionsItemSelectedItemId = methodBody.decl(codeModel().INT, "itemId_", onOptionsItemSelectedItem.invoke("getItemId")); + onOptionsItemSelectedIfElseBlock = methodBody.block(); + methodBody._return(FALSE); + } + + private boolean usesActionBarSherlock() { + return new ActionBarSherlockHelper(new AnnotationHelper(processingEnvironment())).usesActionBarSherlock(this); + } + + @Override + protected void setFindNativeFragmentById() { + JMethod method = generatedClass.method(PRIVATE, classes().FRAGMENT, "findNativeFragmentById"); + JVar idParam = method.param(codeModel().INT, "id"); + JBlock body = method.body(); + body._return(invoke("getFragmentManager").invoke("findFragmentById").arg(idParam)); + findNativeFragmentById = method; + } + + @Override + protected void setFindSupportFragmentById() { + JMethod method = generatedClass.method(PRIVATE, classes().SUPPORT_V4_FRAGMENT, "findSupportFragmentById"); + JVar idParam = method.param(codeModel().INT, "id"); + JBlock body = method.body(); + body._return(invoke("getSupportFragmentManager").invoke("findFragmentById").arg(idParam)); + findSupportFragmentById = method; + } + + @Override + protected void setFindNativeFragmentByTag() { + JMethod method = generatedClass.method(PRIVATE, classes().FRAGMENT, "findNativeFragmentByTag"); + JVar tagParam = method.param(classes().STRING, "tag"); + JBlock body = method.body(); + body._return(invoke("getFragmentManager").invoke("findFragmentByTag").arg(tagParam)); + findNativeFragmentByTag = method; + } + + @Override + protected void setFindSupportFragmentByTag() { + JMethod method = generatedClass.method(PRIVATE, classes().SUPPORT_V4_FRAGMENT, "findSupportFragmentByTag"); + JVar tagParam = method.param(classes().STRING, "tag"); + JBlock body = method.body(); + body._return(invoke("getSupportFragmentManager").invoke("findFragmentByTag").arg(tagParam)); + findSupportFragmentByTag = method; + } + + public JMethod getSetContentViewLayout() { + if (setContentViewLayout == null) { + setSetContentView(); + } + return setContentViewLayout; + } + + private void setSetContentView() { + getOnCreate(); + + String setContentViewMethodName; + if (usesGreenDroid()) { + setContentViewMethodName = "setActionBarContentView"; + } else { + setContentViewMethodName = "setContentView"; + } + + JClass layoutParamsClass = classes().VIEW_GROUP_LAYOUT_PARAMS; + + setContentViewLayout = setContentViewMethod(setContentViewMethodName, new JType[] { codeModel().INT }, new String[] { "layoutResID" }); + setContentViewMethod(setContentViewMethodName, new JType[] { classes().VIEW, layoutParamsClass }, new String[] { "view", "params" }); + setContentViewMethod(setContentViewMethodName, new JType[] { classes().VIEW }, new String[] { "view" }); + } + + private JMethod setContentViewMethod(String setContentViewMethodName, JType[] paramTypes, String[] paramNames) { + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().VOID, setContentViewMethodName); + method.annotate(Override.class); + + ArrayList params = new ArrayList(); + for (int i = 0; i < paramTypes.length; i++) { + JVar param = method.param(paramTypes[i], paramNames[i]); + params.add(param); + } + JBlock body = method.body(); + JInvocation superCall = body.invoke(JExpr._super(), method); + for (JVar arg : params) { + superCall.arg(arg); + } + viewNotifierHelper.invokeViewChanged(body); + return method; + } + + public JVar getInitSavedInstanceParam() { + return initSavedInstanceParam; + } + + private boolean usesGreenDroid() { + if (greenDroidHelper == null) { + greenDroidHelper = new GreenDroidHelper(processingEnvironment()); + } + return greenDroidHelper.usesGreenDroid(annotatedElement); + } + + private void handleBackPressed() { + Element declaredOnBackPressedMethod = getOnBackPressedMethod(annotatedElement); + if (declaredOnBackPressedMethod != null) { + + processHolder.generateApiClass(declaredOnBackPressedMethod, SdkVersionHelper.class); + + JMethod onKeyDownMethod = generatedClass.method(PUBLIC, codeModel().BOOLEAN, "onKeyDown"); + onKeyDownMethod.annotate(Override.class); + JVar keyCodeParam = onKeyDownMethod.param(codeModel().INT, "keyCode"); + JClass keyEventClass = classes().KEY_EVENT; + JVar eventParam = onKeyDownMethod.param(keyEventClass, "event"); + + JClass versionHelperClass = refClass(SdkVersionHelper.class); + + JInvocation sdkInt = versionHelperClass.staticInvoke("getSdkInt"); + + JBlock onKeyDownBody = onKeyDownMethod.body(); + + onKeyDownBody._if( // + sdkInt.lt(JExpr.lit(5)) // + .cand(keyCodeParam.eq(keyEventClass.staticRef("KEYCODE_BACK"))) // + .cand(eventParam.invoke("getRepeatCount").eq(JExpr.lit(0)))) // + ._then() // + .invoke("onBackPressed"); + + onKeyDownBody._return( // + JExpr._super().invoke(onKeyDownMethod) // + .arg(keyCodeParam) // + .arg(eventParam)); + + } + } + + private ExecutableElement getOnBackPressedMethod(TypeElement activityElement) { + + AnnotationHelper annotationHelper = new AnnotationHelper(processingEnvironment()); + + List allMembers = annotationHelper.getElementUtils().getAllMembers(activityElement); + + List activityInheritedMethods = ElementFilter.methodsIn(allMembers); + + for (ExecutableElement activityInheritedMethod : activityInheritedMethods) { + if (isCustomOnBackPressedMethod(activityInheritedMethod)) { + return activityInheritedMethod; + } + } + return null; + } + + private boolean isCustomOnBackPressedMethod(ExecutableElement method) { + TypeElement methodClass = (TypeElement) method.getEnclosingElement(); + boolean methodBelongsToActivityClass = methodClass.getQualifiedName().toString().equals(CanonicalNameConstants.ACTIVITY); + return !methodBelongsToActivityClass // + && method.getSimpleName().toString().equals("onBackPressed") // + && method.getThrownTypes().size() == 0 // + && method.getModifiers().contains(Modifier.PUBLIC) // + && method.getReturnType().getKind().equals(TypeKind.VOID) // + && method.getParameters().size() == 0 // + ; + } + + @Override + public IntentBuilder getIntentBuilder() { + return intentBuilder; + } + + @Override + public void setIntentBuilderClass(JDefinedClass intentBuilderClass) { + this.intentBuilderClass = intentBuilderClass; + } + + @Override + public JDefinedClass getIntentBuilderClass() { + return intentBuilderClass; + } + + @Override + public void setIntentField(JFieldVar intentField) { + this.intentField = intentField; + } + + @Override + public JFieldVar getIntentField() { + return intentField; + } + + public RoboGuiceHolder getRoboGuiceHolder() { + if (roboGuiceHolder == null) { + roboGuiceHolder = new RoboGuiceHolder(this); + } + return roboGuiceHolder; + } + + protected void setScopeField() { + getRoboGuiceHolder().scope = getGeneratedClass().field(JMod.PRIVATE, classes().CONTEXT_SCOPE, "scope_"); + } + + protected void setEventManagerField() { + getRoboGuiceHolder().eventManager = generatedClass.field(JMod.PRIVATE, classes().EVENT_MANAGER, "eventManager_"); + } + + public void setGetInjector() { + JMethod method = generatedClass.method(JMod.PUBLIC, classes().INJECTOR, "getInjector"); + method.annotate(Override.class); + JExpression castApplication = cast(classes().INJECTOR_PROVIDER, invoke("getApplication")); + method.body()._return(castApplication.invoke("getInjector")); + getRoboGuiceHolder().getInjector = method; + } + + @Override + public JMethod getInjectExtrasMethod() { + if (injectExtrasMethod == null) { + setInjectExtras(); + } + return injectExtrasMethod; + } + + @Override + public JBlock getInjectExtrasBlock() { + if (injectExtrasBlock == null) { + setInjectExtras(); + } + return injectExtrasBlock; + } + + @Override + public JVar getInjectExtras() { + if (injectExtras == null) { + setInjectExtras(); + } + return injectExtras; + } + + private void setInjectExtras() { + injectExtrasMethod = generatedClass.method(PRIVATE, codeModel().VOID, "injectExtras_"); + JBlock injectExtrasBody = injectExtrasMethod.body(); + injectExtras = injectExtrasBody.decl(classes().BUNDLE, "extras_", invoke("getIntent").invoke("getExtras")); + injectExtrasBlock = injectExtrasBody._if(injectExtras.ne(_null()))._then(); + + getSetIntent().body().invoke(injectExtrasMethod); + getInitBody().invoke(injectExtrasMethod); + } + + @Override + public JBlock getSaveStateMethodBody() { + return instanceStateHolder.getSaveStateMethodBody(); + } + + @Override + public JVar getSaveStateBundleParam() { + return instanceStateHolder.getSaveStateBundleParam(); + } + + @Override + public JMethod getRestoreStateMethod() { + return instanceStateHolder.getRestoreStateMethod(); + } + + @Override + public JVar getRestoreStateBundleParam() { + return instanceStateHolder.getRestoreStateBundleParam(); + } + + @Override + public JBlock getOnCreateOptionsMenuMethodBody() { + if (onCreateOptionsMenuMethodBody == null) { + setOnCreateOptionsMenu(); + } + return onCreateOptionsMenuMethodBody; + } + + @Override + public JVar getOnCreateOptionsMenuMenuInflaterVar() { + if (onCreateOptionsMenuMenuInflaterVar == null) { + setOnCreateOptionsMenu(); + } + return onCreateOptionsMenuMenuInflaterVar; + } + + @Override + public JVar getOnCreateOptionsMenuMenuParam() { + if (onCreateOptionsMenuMenuParam == null) { + setOnCreateOptionsMenu(); + } + return onCreateOptionsMenuMenuParam; + } + + @Override + public JVar getOnOptionsItemSelectedItem() { + if (onOptionsItemSelectedItem == null) { + setOnOptionsItemSelected(); + } + return onOptionsItemSelectedItem; + } + + @Override + public JVar getOnOptionsItemSelectedItemId() { + if (onOptionsItemSelectedItemId == null) { + setOnOptionsItemSelected(); + } + return onOptionsItemSelectedItemId; + } + + @Override + public JBlock getOnOptionsItemSelectedIfElseBlock() { + if (onOptionsItemSelectedIfElseBlock == null) { + setOnOptionsItemSelected(); + } + return onOptionsItemSelectedIfElseBlock; + } + + public NonConfigurationHolder getNonConfigurationHolder() throws JClassAlreadyExistsException { + if (nonConfigurationHolder == null) { + setNonConfigurationHolder(); + } + return nonConfigurationHolder; + } + + private void setNonConfigurationHolder() throws JClassAlreadyExistsException { + nonConfigurationHolder = new NonConfigurationHolder(this); + } + + public JBlock getInitIfNonConfigurationNotNullBlock() throws JClassAlreadyExistsException { + if (initIfNonConfigurationNotNullBlock == null) { + setInitNonConfigurationInstance(); + } + return initIfNonConfigurationNotNullBlock; + } + + public JVar getInitNonConfigurationInstance() throws JClassAlreadyExistsException { + if (initNonConfigurationInstance == null) { + setInitNonConfigurationInstance(); + } + return initNonConfigurationInstance; + } + + private void setInitNonConfigurationInstance() throws JClassAlreadyExistsException { + JBlock initBody = getInitBody(); + JDefinedClass ncHolderClass = getNonConfigurationHolder().getGeneratedClass(); + initNonConfigurationInstance = initBody.decl(ncHolderClass, "nonConfigurationInstance", cast(ncHolderClass, _super().invoke(getGetLastNonConfigurationInstance()))); + initIfNonConfigurationNotNullBlock = initBody._if(initNonConfigurationInstance.ne(_null()))._then(); + } + + public JMethod getGetLastNonConfigurationInstance() throws JClassAlreadyExistsException { + if (getLastNonConfigurationInstance == null) { + setGetLastNonConfigurationInstance(); + } + return getLastNonConfigurationInstance; + } + + private void setGetLastNonConfigurationInstance() throws JClassAlreadyExistsException { + AnnotationHelper annotationHelper = new AnnotationHelper(processingEnvironment()); + TypeElement fragmentActivityTypeElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT_ACTIVITY); + TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(generatedClass._extends().fullName()); + String getLastNonConfigurationInstanceName = "getLastNonConfigurationInstance"; + if (fragmentActivityTypeElement != null && annotationHelper.isSubtype(typeElement.asType(), fragmentActivityTypeElement.asType())) { + getLastNonConfigurationInstanceName = "getLastCustomNonConfigurationInstance"; + } + + NonConfigurationHolder ncHolder = getNonConfigurationHolder(); + JDefinedClass ncHolderClass = ncHolder.getGeneratedClass(); + JFieldVar superNonConfigurationInstanceField = ncHolder.getSuperNonConfigurationInstanceField(); + + getLastNonConfigurationInstance = generatedClass.method(PUBLIC, Object.class, getLastNonConfigurationInstanceName); + getLastNonConfigurationInstance.annotate(Override.class); + JBlock body = getLastNonConfigurationInstance.body(); + JVar nonConfigurationInstance = body.decl(ncHolderClass, "nonConfigurationInstance", cast(ncHolderClass, _super().invoke(getLastNonConfigurationInstance))); + body._if(nonConfigurationInstance.eq(_null()))._then()._return(_null()); + body._return(nonConfigurationInstance.ref(superNonConfigurationInstanceField)); + } + + public JBlock getOnRetainNonConfigurationInstanceBindBlock() throws JClassAlreadyExistsException { + if (onRetainNonConfigurationInstanceBindBlock == null) { + setOnRetainNonConfigurationInstance(); + } + return onRetainNonConfigurationInstanceBindBlock; + } + + public JVar getOnRetainNonConfigurationInstance() throws JClassAlreadyExistsException { + if (onRetainNonConfigurationInstance == null) { + setOnRetainNonConfigurationInstance(); + } + return onRetainNonConfigurationInstance; + } + + private void setOnRetainNonConfigurationInstance() throws JClassAlreadyExistsException { + AnnotationHelper annotationHelper = new AnnotationHelper(processingEnvironment()); + TypeElement fragmentActivityTypeElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT_ACTIVITY); + TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(generatedClass._extends().fullName()); + + String onRetainNonConfigurationInstanceName = "onRetainNonConfigurationInstance"; + if (fragmentActivityTypeElement != null && annotationHelper.isSubtype(typeElement.asType(), fragmentActivityTypeElement.asType())) { + onRetainNonConfigurationInstanceName = "onRetainCustomNonConfigurationInstance"; + } + + NonConfigurationHolder ncHolder = getNonConfigurationHolder(); + JDefinedClass ncHolderClass = ncHolder.getGeneratedClass(); + + JMethod onRetainNonConfigurationInstanceMethod = generatedClass.method(PUBLIC, ncHolderClass, onRetainNonConfigurationInstanceName); + onRetainNonConfigurationInstanceMethod.annotate(Override.class); + JBlock methodBody = onRetainNonConfigurationInstanceMethod.body(); + onRetainNonConfigurationInstance = methodBody.decl(ncHolderClass, "nonConfigurationInstanceState_", _new(ncHolderClass)); + JExpression superCall = _super().invoke(onRetainNonConfigurationInstanceMethod); + methodBody.assign(onRetainNonConfigurationInstance.ref(ncHolder.getSuperNonConfigurationInstanceField()), superCall); + onRetainNonConfigurationInstanceBindBlock = methodBody.block(); + methodBody._return(onRetainNonConfigurationInstance); + } + + @Override + public JBlock getOnActivityResultCaseBlock(int requestCode) { + return onActivityResultHolder.getCaseBlock(requestCode); + } + + @Override + public JVar getOnActivityResultDataParam() { + return onActivityResultHolder.getDataParam(); + } + + @Override + public JVar getOnActivityResultResultCodeParam() { + return onActivityResultHolder.getResultCodeParam(); + } + + public JBlock getOnActivityResultAfterSuperBlock() { + return onActivityResultHolder.getAfterSuperBlock(); + } + + public JVar getOnActivityResultRequestCodeParam() { + return onActivityResultHolder.getRequestCodeParam(); + } + + public JBlock getOnDestroyAfterSuperBlock() { + if (onDestroyAfterSuperBlock == null) { + setOnDestroy(); + } + return onDestroyAfterSuperBlock; + } + + public JBlock getOnResumeAfterSuperBlock() { + if (onResumeAfterSuperBlock == null) { + setOnResume(); + } + return onResumeAfterSuperBlock; + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EApplicationHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EApplicationHolder.java new file mode 100644 index 0000000000..e425325c65 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EApplicationHolder.java @@ -0,0 +1,79 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +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 com.sun.codemodel.JMod.STATIC; + +import javax.lang.model.element.TypeElement; + +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; + +public class EApplicationHolder extends EComponentHolder { + + public static final String GET_APPLICATION_INSTANCE = "getInstance"; + + private JFieldVar staticInstanceField; + + public EApplicationHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + createSingleton(); + createOnCreate(); + } + + private void createSingleton() { + JClass annotatedComponent = generatedClass._extends(); + + staticInstanceField = generatedClass.field(PRIVATE | STATIC, annotatedComponent, "INSTANCE_"); + // Static singleton getter and setter + JMethod getInstance = generatedClass.method(PUBLIC | STATIC, annotatedComponent, GET_APPLICATION_INSTANCE); + getInstance.body()._return(staticInstanceField); + + JMethod setInstance = generatedClass.method(PUBLIC | STATIC, codeModel().VOID, "setForTesting"); + setInstance.javadoc().append("Visible for testing purposes"); + JVar applicationParam = setInstance.param(annotatedComponent, "application"); + setInstance.body().assign(staticInstanceField, applicationParam); + } + + private void createOnCreate() { + JMethod onCreate = generatedClass.method(PUBLIC, codeModel().VOID, "onCreate"); + onCreate.annotate(Override.class); + JBlock onCreateBody = onCreate.body(); + onCreateBody.assign(staticInstanceField, _this()); + onCreateBody.invoke(getInit()); + onCreateBody.invoke(_super(), onCreate); + } + + @Override + protected void setContextRef() { + contextRef = JExpr._this(); + } + + @Override + protected void setInit() { + init = generatedClass.method(PRIVATE, codeModel().VOID, "init_"); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EBeanHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EBeanHolder.java new file mode 100644 index 0000000000..4e12d73567 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EBeanHolder.java @@ -0,0 +1,119 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JExpr._new; +import static com.sun.codemodel.JExpr._null; +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.util.List; + +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.util.ElementFilter; + +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; + +public class EBeanHolder extends EComponentWithViewSupportHolder { + + public static final String GET_INSTANCE_METHOD_NAME = "getInstance" + GENERATION_SUFFIX; + + private JFieldVar contextField; + private JMethod constructor; + + public EBeanHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + setConstructor(); + } + + private void setConstructor() { + constructor = generatedClass.constructor(PRIVATE); + JVar constructorContextParam = constructor.param(classes().CONTEXT, "context"); + JBlock constructorBody = constructor.body(); + List constructors = ElementFilter.constructorsIn(annotatedElement.getEnclosedElements()); + ExecutableElement superConstructor = constructors.get(0); + if (superConstructor.getParameters().size() == 1) { + constructorBody.invoke("super").arg(constructorContextParam); + } + constructorBody.assign(getContextField(), constructorContextParam); + } + + public JFieldVar getContextField() { + if (contextField == null) { + contextField = generatedClass.field(PRIVATE, classes().CONTEXT, "context_"); + } + return contextField; + } + + @Override + protected void setContextRef() { + contextRef = getContextField(); + } + + protected void setInit() { + init = generatedClass.method(PRIVATE, processHolder.codeModel().VOID, "init_"); + } + + public void invokeInitInConstructor() { + JBlock constructorBody = constructor.body(); + constructorBody.invoke(getInit()); + } + + public void createFactoryMethod(boolean hasSingletonScope) { + + JMethod factoryMethod = generatedClass.method(PUBLIC | STATIC, generatedClass, GET_INSTANCE_METHOD_NAME); + + JVar factoryMethodContextParam = factoryMethod.param(classes().CONTEXT, "context"); + + JBlock factoryMethodBody = factoryMethod.body(); + + /* + * Singletons are bound to the application context + */ + if (hasSingletonScope) { + + JFieldVar instanceField = generatedClass.field(PRIVATE | STATIC, generatedClass, "instance_"); + + JBlock creationBlock = factoryMethodBody // + ._if(instanceField.eq(_null())) // + ._then(); + JVar previousNotifier = viewNotifierHelper.replacePreviousNotifierWithNull(creationBlock); + creationBlock.assign(instanceField, _new(generatedClass).arg(factoryMethodContextParam.invoke("getApplicationContext"))); + creationBlock.invoke(instanceField, getInit()); + viewNotifierHelper.resetPreviousNotifier(creationBlock, previousNotifier); + + factoryMethodBody._return(instanceField); + } else { + factoryMethodBody._return(_new(generatedClass).arg(factoryMethodContextParam)); + } + } + + public void createRebindMethod() { + JMethod rebindMethod = generatedClass.method(PUBLIC, codeModel().VOID, "rebind"); + JVar contextParam = rebindMethod.param(classes().CONTEXT, "context"); + JBlock body = rebindMethod.body(); + body.assign(getContextField(), contextParam); + body.invoke(getInit()); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EComponentHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EComponentHolder.java new file mode 100644 index 0000000000..3421e59163 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EComponentHolder.java @@ -0,0 +1,112 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JMod.PRIVATE; + +import java.util.HashMap; +import java.util.Map; + +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; + +import com.sun.codemodel.*; +import org.androidannotations.helper.CaseHelper; +import org.androidannotations.helper.ModelConstants; +import org.androidannotations.process.ProcessHolder; + +public abstract class EComponentHolder extends BaseGeneratedClassHolder { + + private static final String METHOD_MAIN_LOOPER = "getMainLooper"; + + protected JExpression contextRef; + protected JMethod init; + private JVar resourcesRef; + private Map databaseHelperRefs = new HashMap(); + private JVar handler; + + public EComponentHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + } + + public JExpression getContextRef() { + if (contextRef == null) { + setContextRef(); + } + return contextRef; + } + + protected abstract void setContextRef(); + + public JMethod getInit() { + if (init == null) { + setInit(); + } + return init; + } + + protected abstract void setInit(); + + public JBlock getInitBody() { + return getInit().body(); + } + + public JVar getResourcesRef() { + if (resourcesRef == null) { + setResourcesRef(); + } + return resourcesRef; + } + + private void setResourcesRef() { + resourcesRef = getInitBody().decl(classes().RESOURCES, "resources_", getContextRef().invoke("getResources")); + } + + public JFieldVar getDatabaseHelperRef(TypeMirror databaseHelperTypeMirror) { + JFieldVar databaseHelperRef = databaseHelperRefs.get(databaseHelperTypeMirror); + if (databaseHelperRef == null) { + databaseHelperRef = setDatabaseHelperRef(databaseHelperTypeMirror); + } + return databaseHelperRef; + } + + private JFieldVar setDatabaseHelperRef(TypeMirror databaseHelperTypeMirror) { + JClass databaseHelperClass = refClass(databaseHelperTypeMirror.toString()); + String fieldName = CaseHelper.lowerCaseFirst(databaseHelperClass.name()) + ModelConstants.GENERATION_SUFFIX; + JFieldVar databaseHelperRef = generatedClass.field(PRIVATE, databaseHelperClass, fieldName); + databaseHelperRefs.put(databaseHelperTypeMirror, databaseHelperRef); + + JExpression dbHelperClass = databaseHelperClass.dotclass(); + getInitBody().assign(databaseHelperRef, // + classes().OPEN_HELPER_MANAGER.staticInvoke("getHelper").arg(getContextRef()).arg(dbHelperClass)); + + return databaseHelperRef; + } + + public JVar getHandler() { + if (handler == null) { + setHandler(); + } + return handler; + } + + private void setHandler() { + JClass handlerClass = classes().HANDLER; + JClass looperClass = classes().LOOPER; + JInvocation arg = JExpr._new(handlerClass).arg(looperClass.staticInvoke(METHOD_MAIN_LOOPER)); + handler = generatedClass.field(JMod.PRIVATE, handlerClass, "handler_", arg); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EComponentWithViewSupportHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EComponentWithViewSupportHolder.java new file mode 100644 index 0000000000..55b84f58d8 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EComponentWithViewSupportHolder.java @@ -0,0 +1,223 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JExpr._new; +import static com.sun.codemodel.JExpr._null; +import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JExpr.cast; +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JMod.FINAL; +import static com.sun.codemodel.JMod.PRIVATE; +import static com.sun.codemodel.JMod.PUBLIC; + +import java.util.HashMap; + +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; + +import org.androidannotations.api.view.HasViews; +import org.androidannotations.api.view.OnViewChangedListener; +import org.androidannotations.api.view.OnViewChangedNotifier; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.ViewNotifierHelper; +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JFieldRef; +import com.sun.codemodel.JInvocation; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; + +public abstract class EComponentWithViewSupportHolder extends EComponentHolder { + + private APTCodeModelHelper codeModelHelper; + protected ViewNotifierHelper viewNotifierHelper; + private JBlock onViewChangedBody; + private JVar onViewChangedHasViewsParam; + protected JMethod findNativeFragmentById; + protected JMethod findSupportFragmentById; + protected JMethod findNativeFragmentByTag; + protected JMethod findSupportFragmentByTag; + private HashMap textWatcherHolders = new HashMap(); + private HashMap onSeekBarChangeListenerHolders = new HashMap(); + + public EComponentWithViewSupportHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + codeModelHelper = new APTCodeModelHelper(); + viewNotifierHelper = new ViewNotifierHelper(this); + } + + public JBlock getOnViewChangedBody() { + if (onViewChangedBody == null) { + setOnViewChanged(); + } + return onViewChangedBody; + } + + public JVar getOnViewChangedHasViewsParam() { + if (onViewChangedHasViewsParam == null) { + setOnViewChanged(); + } + return onViewChangedHasViewsParam; + } + + protected void setOnViewChanged() { + getGeneratedClass()._implements(OnViewChangedListener.class); + JMethod onViewChanged = getGeneratedClass().method(PUBLIC, codeModel().VOID, "onViewChanged"); + onViewChanged.annotate(Override.class); + onViewChangedBody = onViewChanged.body(); + onViewChangedHasViewsParam = onViewChanged.param(HasViews.class, "hasViews"); + JClass notifierClass = refClass(OnViewChangedNotifier.class); + getInitBody().staticInvoke(notifierClass, "registerOnViewChangedListener").arg(_this()); + } + + public JInvocation findViewById(JFieldRef idRef) { + JInvocation findViewById = invoke(getOnViewChangedHasViewsParam(), "findViewById"); + findViewById.arg(idRef); + return findViewById; + } + + public JMethod getFindNativeFragmentById() { + if (findNativeFragmentById == null) { + setFindNativeFragmentById(); + } + return findNativeFragmentById; + } + + protected void setFindNativeFragmentById() { + findNativeFragmentById = getGeneratedClass().method(PRIVATE, classes().FRAGMENT, "findNativeFragmentById"); + JVar idParam = findNativeFragmentById.param(codeModel().INT, "id"); + + JBlock body = findNativeFragmentById.body(); + + body._if(getContextRef()._instanceof(classes().ACTIVITY).not())._then()._return(_null()); + + JVar activityVar = body.decl(classes().ACTIVITY, "activity_", cast(classes().ACTIVITY, getContextRef())); + + body._return(activityVar.invoke("getFragmentManager").invoke("findFragmentById").arg(idParam)); + } + + public JMethod getFindSupportFragmentById() { + if (findSupportFragmentById == null) { + setFindSupportFragmentById(); + } + return findSupportFragmentById; + } + + protected void setFindSupportFragmentById() { + findSupportFragmentById = getGeneratedClass().method(PRIVATE, classes().SUPPORT_V4_FRAGMENT, "findSupportFragmentById"); + JVar idParam = findSupportFragmentById.param(codeModel().INT, "id"); + + JBlock body = findSupportFragmentById.body(); + + body._if(getContextRef()._instanceof(classes().FRAGMENT_ACTIVITY).not())._then()._return(_null()); + + JVar activityVar = body.decl(classes().FRAGMENT_ACTIVITY, "activity_", cast(classes().FRAGMENT_ACTIVITY, getContextRef())); + + body._return(activityVar.invoke("getSupportFragmentManager").invoke("findFragmentById").arg(idParam)); + } + + public JMethod getFindNativeFragmentByTag() { + if (findNativeFragmentByTag == null) { + setFindNativeFragmentByTag(); + } + return findNativeFragmentByTag; + } + + protected void setFindNativeFragmentByTag() { + findNativeFragmentByTag = getGeneratedClass().method(PRIVATE, classes().FRAGMENT, "findNativeFragmentByTag"); + JVar tagParam = findNativeFragmentByTag.param(classes().STRING, "tag"); + + JBlock body = findNativeFragmentByTag.body(); + + body._if(getContextRef()._instanceof(classes().ACTIVITY).not())._then()._return(_null()); + + JVar activityVar = body.decl(classes().ACTIVITY, "activity_", cast(classes().ACTIVITY, getContextRef())); + + body._return(activityVar.invoke("getFragmentManager").invoke("findFragmentByTag").arg(tagParam)); + } + + public JMethod getFindSupportFragmentByTag() { + if (findSupportFragmentByTag == null) { + setFindSupportFragmentByTag(); + } + return findSupportFragmentByTag; + } + + protected void setFindSupportFragmentByTag() { + findSupportFragmentByTag = getGeneratedClass().method(PRIVATE, classes().SUPPORT_V4_FRAGMENT, "findSupportFragmentByTag"); + JVar tagParam = findSupportFragmentByTag.param(classes().STRING, "tag"); + + JBlock body = findSupportFragmentByTag.body(); + + body._if(getContextRef()._instanceof(classes().FRAGMENT_ACTIVITY).not())._then()._return(_null()); + + JVar activityVar = body.decl(classes().FRAGMENT_ACTIVITY, "activity_", cast(classes().FRAGMENT_ACTIVITY, getContextRef())); + + body._return(activityVar.invoke("getSupportFragmentManager").invoke("findFragmentByTag").arg(tagParam)); + } + + public TextWatcherHolder getTextWatcherHolder(JFieldRef idRef, TypeMirror viewParameterType) { + String idRefString = codeModelHelper.getIdStringFromIdFieldRef(idRef); + TextWatcherHolder textWatcherHolder = textWatcherHolders.get(idRefString); + if (textWatcherHolder == null) { + textWatcherHolder = createTextWatcherHolder(idRef, viewParameterType); + textWatcherHolders.put(idRefString, textWatcherHolder); + } + return textWatcherHolder; + } + + private TextWatcherHolder createTextWatcherHolder(JFieldRef idRef, TypeMirror viewParameterType) { + JDefinedClass onTextChangeListenerClass = codeModel().anonymousClass(classes().TEXT_WATCHER); + JClass viewClass = classes().TEXT_VIEW; + if (viewParameterType != null) { + viewClass = refClass(viewParameterType.toString()); + } + + JBlock onViewChangedBody = getOnViewChangedBody().block(); + JVar viewVariable = onViewChangedBody.decl(FINAL, viewClass, "view", cast(viewClass, findViewById(idRef))); + onViewChangedBody._if(viewVariable.ne(JExpr._null()))._then() // + .invoke(viewVariable, "addTextChangedListener").arg(_new(onTextChangeListenerClass)); + + return new TextWatcherHolder(this, viewVariable, onTextChangeListenerClass); + } + + public OnSeekBarChangeListenerHolder getOnSeekBarChangeListenerHolder(JFieldRef idRef) { + String idRefString = codeModelHelper.getIdStringFromIdFieldRef(idRef); + OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder = onSeekBarChangeListenerHolders.get(idRefString); + if (onSeekBarChangeListenerHolder == null) { + onSeekBarChangeListenerHolder = createOnSeekBarChangeListenerHolder(idRef); + onSeekBarChangeListenerHolders.put(idRefString, onSeekBarChangeListenerHolder); + } + return onSeekBarChangeListenerHolder; + } + + private OnSeekBarChangeListenerHolder createOnSeekBarChangeListenerHolder(JFieldRef idRef) { + JDefinedClass onSeekbarChangeListenerClass = codeModel().anonymousClass(classes().ON_SEEKBAR_CHANGE_LISTENER); + JClass viewClass = classes().SEEKBAR; + + JBlock onViewChangedBody = getOnViewChangedBody().block(); + JVar viewVariable = onViewChangedBody.decl(FINAL, viewClass, "view", cast(viewClass, findViewById(idRef))); + onViewChangedBody._if(viewVariable.ne(JExpr._null()))._then() // + .invoke(viewVariable, "setOnSeekBarChangeListener").arg(_new(onSeekbarChangeListenerClass)); + + return new OnSeekBarChangeListenerHolder(this, onSeekbarChangeListenerClass); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java new file mode 100644 index 0000000000..8a81ed04a8 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EFragmentHolder.java @@ -0,0 +1,368 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JExpr.FALSE; +import static com.sun.codemodel.JExpr.TRUE; +import static com.sun.codemodel.JExpr._new; +import static com.sun.codemodel.JExpr._null; +import static com.sun.codemodel.JExpr._super; +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JMod.PRIVATE; +import static com.sun.codemodel.JMod.PUBLIC; +import static com.sun.codemodel.JMod.STATIC; + +import javax.lang.model.element.TypeElement; + +import org.androidannotations.helper.ActionBarSherlockHelper; +import org.androidannotations.helper.AnnotationHelper; +import org.androidannotations.helper.HoloEverywhereHelper; +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JClassAlreadyExistsException; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JMod; +import com.sun.codemodel.JVar; + +public class EFragmentHolder extends EComponentWithViewSupportHolder implements HasInstanceState, HasOptionsMenu, HasOnActivityResult { + + private JFieldVar contentView; + private JBlock setContentViewBlock; + private JVar inflater; + private JVar container; + private JDefinedClass fragmentBuilderClass; + private JFieldVar fragmentArgumentsBuilderField; + private JMethod injectArgsMethod; + private JBlock injectArgsBlock; + private JVar injectBundleArgs; + private InstanceStateHolder instanceStateHolder; + private OnActivityResultHolder onActivityResultHolder; + private JBlock onCreateOptionsMenuMethodBody; + private JVar onCreateOptionsMenuMenuInflaterVar; + private JVar onCreateOptionsMenuMenuParam; + private JVar onOptionsItemSelectedItem; + private JVar onOptionsItemSelectedItemId; + private JBlock onOptionsItemSelectedIfElseBlock; + + public EFragmentHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + instanceStateHolder = new InstanceStateHolder(this); + onActivityResultHolder = new OnActivityResultHolder(this); + createOnCreate(); + createOnViewCreated(); + createFragmentBuilder(); + } + + private void createOnCreate() { + JMethod onCreate = generatedClass.method(PUBLIC, codeModel().VOID, "onCreate"); + onCreate.annotate(Override.class); + JVar onCreateSavedInstanceState = onCreate.param(classes().BUNDLE, "savedInstanceState"); + JBlock onCreateBody = onCreate.body(); + + JVar previousNotifier = viewNotifierHelper.replacePreviousNotifier(onCreateBody); + createFindViewById(); + onCreateBody.invoke(getInit()).arg(onCreateSavedInstanceState); + onCreateBody.invoke(_super(), onCreate).arg(onCreateSavedInstanceState); + viewNotifierHelper.resetPreviousNotifier(onCreateBody, previousNotifier); + } + + private void createOnViewCreated() { + JMethod onViewCreated = generatedClass.method(PUBLIC, codeModel().VOID, "onViewCreated"); + onViewCreated.annotate(Override.class); + JVar view = onViewCreated.param(classes().VIEW, "view"); + JVar savedInstanceState = onViewCreated.param(classes().BUNDLE, "savedInstanceState"); + JBlock onViewCreatedBody = onViewCreated.body(); + onViewCreatedBody.invoke(_super(), onViewCreated).arg(view).arg(savedInstanceState); + viewNotifierHelper.invokeViewChanged(onViewCreatedBody); + } + + private void createFindViewById() { + JMethod findViewById = generatedClass.method(PUBLIC, classes().VIEW, "findViewById"); + JVar idParam = findViewById.param(codeModel().INT, "id"); + + JBlock body = findViewById.body(); + + JFieldVar contentView = getContentView(); + + body._if(contentView.eq(_null())) // + ._then()._return(_null()); + + body._return(contentView.invoke(findViewById).arg(idParam)); + } + + private void createFragmentBuilder() throws JClassAlreadyExistsException { + fragmentBuilderClass = generatedClass._class(PUBLIC | STATIC, "FragmentBuilder_"); + fragmentArgumentsBuilderField = fragmentBuilderClass.field(PRIVATE, classes().BUNDLE, "args_"); + createFragmentBuilderConstructor(); + createFragmentBuilderBuild(); + createFragmentBuilderCreate(); + } + + private void createFragmentBuilderConstructor() { + JMethod constructor = fragmentBuilderClass.constructor(PRIVATE); + JBlock constructorBody = constructor.body(); + constructorBody.assign(fragmentArgumentsBuilderField, _new(classes().BUNDLE)); + } + + private void createFragmentBuilderBuild() { + JMethod method = fragmentBuilderClass.method(PUBLIC, generatedClass._extends(), "build"); + JBlock body = method.body(); + + JVar fragment = body.decl(generatedClass, "fragment_", _new(generatedClass)); + body.invoke(fragment, "setArguments").arg(fragmentArgumentsBuilderField); + body._return(fragment); + } + + private void createFragmentBuilderCreate() { + JMethod method = generatedClass.method(STATIC | PUBLIC, fragmentBuilderClass, "builder"); + method.body()._return(_new(fragmentBuilderClass)); + } + + private void setOnCreateOptionsMenu() { + JClass menuClass = classes().MENU; + JClass menuInflaterClass = classes().MENU_INFLATER; + if (usesActionBarSherlock()) { + menuClass = classes().SHERLOCK_MENU; + menuInflaterClass = classes().SHERLOCK_MENU_INFLATER; + } + + JMethod method = generatedClass.method(PUBLIC, codeModel().VOID, "onCreateOptionsMenu"); + method.annotate(Override.class); + JBlock methodBody = method.body(); + onCreateOptionsMenuMenuParam = method.param(menuClass, "menu"); + onCreateOptionsMenuMenuInflaterVar = method.param(menuInflaterClass, "inflater"); + onCreateOptionsMenuMethodBody = methodBody.block(); + methodBody.invoke(_super(), method).arg(onCreateOptionsMenuMenuParam).arg(onCreateOptionsMenuMenuInflaterVar); + + getInitBody().invoke("setHasOptionsMenu").arg(JExpr.TRUE); + } + + private void setOnOptionsItemSelected() { + JClass menuItemClass = classes().MENU_ITEM; + if (usesActionBarSherlock()) { + menuItemClass = classes().SHERLOCK_MENU_ITEM; + } + + JMethod method = generatedClass.method(JMod.PUBLIC, codeModel().BOOLEAN, "onOptionsItemSelected"); + method.annotate(Override.class); + JBlock methodBody = method.body(); + onOptionsItemSelectedItem = method.param(menuItemClass, "item"); + JVar handled = methodBody.decl(codeModel().BOOLEAN, "handled", invoke(_super(), method).arg(onOptionsItemSelectedItem)); + methodBody._if(handled)._then()._return(TRUE); + onOptionsItemSelectedItemId = methodBody.decl(codeModel().INT, "itemId_", onOptionsItemSelectedItem.invoke("getItemId")); + onOptionsItemSelectedIfElseBlock = methodBody.block(); + methodBody._return(FALSE); + } + + private boolean usesActionBarSherlock() { + return new ActionBarSherlockHelper(new AnnotationHelper(processingEnvironment())).usesActionBarSherlock(this); + } + + @Override + protected void setContextRef() { + contextRef = JExpr.invoke("getActivity"); + } + + @Override + protected void setInit() { + init = generatedClass.method(PRIVATE, codeModel().VOID, "init_"); + init.param(classes().BUNDLE, "savedInstanceState"); + } + + public JFieldVar getContentView() { + if (contentView == null) { + setContentView(); + setOnCreateView(); + } + return contentView; + } + + private void setContentView() { + contentView = generatedClass.field(PRIVATE, classes().VIEW, "contentView_"); + } + + private void setOnCreateView() { + JMethod onCreateView = generatedClass.method(PUBLIC, classes().VIEW, "onCreateView"); + onCreateView.annotate(Override.class); + + HoloEverywhereHelper holoEverywhereHelper = new HoloEverywhereHelper(this); + JClass inflaterClass; + if (holoEverywhereHelper.usesHoloEverywhere()) { + inflaterClass = classes().HOLO_EVERYWHERE_LAYOUT_INFLATER; + } else { + inflaterClass = classes().LAYOUT_INFLATER; + } + + inflater = onCreateView.param(inflaterClass, "inflater"); + container = onCreateView.param(classes().VIEW_GROUP, "container"); + + JVar savedInstanceState = onCreateView.param(classes().BUNDLE, "savedInstanceState"); + + JBlock body = onCreateView.body(); + body.assign(contentView, _super().invoke(onCreateView).arg(inflater).arg(container).arg(savedInstanceState)); + + setContentViewBlock = body.block(); + + body._return(contentView); + } + + public JBlock getSetContentViewBlock() { + if (setContentViewBlock == null) { + setOnCreateView(); + } + return setContentViewBlock; + } + + public JVar getInflater() { + if (inflater == null) { + setOnCreateView(); + } + return inflater; + } + + public JVar getContainer() { + if (container == null) { + setOnCreateView(); + } + return container; + } + + public JDefinedClass getBuilderClass() { + return fragmentBuilderClass; + } + + public JFieldVar getBuilderArgsField() { + return fragmentArgumentsBuilderField; + } + + public JMethod getInjectArgsMethod() { + if (injectArgsMethod == null) { + setInjectArgs(); + } + return injectArgsMethod; + } + + public JBlock getInjectArgsBlock() { + if (injectArgsBlock == null) { + setInjectArgs(); + } + return injectArgsBlock; + } + + public JVar getInjectBundleArgs() { + if (injectBundleArgs == null) { + setInjectArgs(); + } + return injectBundleArgs; + } + + private void setInjectArgs() { + injectArgsMethod = generatedClass.method(PRIVATE, codeModel().VOID, "injectFragmentArguments_"); + JBlock injectExtrasBody = injectArgsMethod.body(); + injectBundleArgs = injectExtrasBody.decl(classes().BUNDLE, "args_", invoke("getArguments")); + injectArgsBlock = injectExtrasBody._if(injectBundleArgs.ne(_null()))._then(); + + getInitBody().invoke(injectArgsMethod); + } + + @Override + public JBlock getSaveStateMethodBody() { + return instanceStateHolder.getSaveStateMethodBody(); + } + + @Override + public JVar getSaveStateBundleParam() { + return instanceStateHolder.getSaveStateBundleParam(); + } + + @Override + public JMethod getRestoreStateMethod() { + return instanceStateHolder.getRestoreStateMethod(); + } + + @Override + public JVar getRestoreStateBundleParam() { + return instanceStateHolder.getRestoreStateBundleParam(); + } + + @Override + public JBlock getOnCreateOptionsMenuMethodBody() { + if (onCreateOptionsMenuMethodBody == null) { + setOnCreateOptionsMenu(); + } + return onCreateOptionsMenuMethodBody; + } + + @Override + public JVar getOnCreateOptionsMenuMenuInflaterVar() { + if (onCreateOptionsMenuMenuInflaterVar == null) { + setOnCreateOptionsMenu(); + } + return onCreateOptionsMenuMenuInflaterVar; + } + + @Override + public JVar getOnCreateOptionsMenuMenuParam() { + if (onCreateOptionsMenuMenuParam == null) { + setOnCreateOptionsMenu(); + } + return onCreateOptionsMenuMenuParam; + } + + @Override + public JVar getOnOptionsItemSelectedItem() { + if (onOptionsItemSelectedItem == null) { + setOnOptionsItemSelected(); + } + return onOptionsItemSelectedItem; + } + + @Override + public JVar getOnOptionsItemSelectedItemId() { + if (onOptionsItemSelectedItemId == null) { + setOnOptionsItemSelected(); + } + return onOptionsItemSelectedItemId; + } + + @Override + public JBlock getOnOptionsItemSelectedIfElseBlock() { + if (onOptionsItemSelectedIfElseBlock == null) { + setOnOptionsItemSelected(); + } + return onOptionsItemSelectedIfElseBlock; + } + + @Override + public JBlock getOnActivityResultCaseBlock(int requestCode) { + return onActivityResultHolder.getCaseBlock(requestCode); + } + + @Override + public JVar getOnActivityResultDataParam() { + return onActivityResultHolder.getDataParam(); + } + + @Override + public JVar getOnActivityResultResultCodeParam() { + return onActivityResultHolder.getResultCodeParam(); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EIntentServiceHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EIntentServiceHolder.java new file mode 100644 index 0000000000..8e9234a691 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EIntentServiceHolder.java @@ -0,0 +1,77 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import com.sun.codemodel.*; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.process.ProcessHolder; + +import javax.lang.model.element.TypeElement; + +import static com.sun.codemodel.JMod.PUBLIC; + +public class EIntentServiceHolder extends EServiceHolder { + + private APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); + + private JVar onHandleIntentIntent; + private JMethod onHandleIntentMethod; + private JBlock onHandleIntentBody; + private JVar onHandleIntentIntentAction; + + public EIntentServiceHolder(ProcessHolder processHolder, TypeElement annotatedElement, AndroidManifest androidManifest) throws Exception { + super(processHolder, annotatedElement, androidManifest); + } + + public JVar getOnHandleIntentIntent() { + if (onHandleIntentIntent == null) { + createOnHandleIntent(); + } + return onHandleIntentIntent; + } + + public JMethod getOnHandleIntentMethod() { + if (onHandleIntentMethod == null) { + createOnHandleIntent(); + } + return onHandleIntentMethod; + } + + public JBlock getOnHandleIntentBody() { + if (onHandleIntentBody == null) { + createOnHandleIntent(); + } + return onHandleIntentBody; + } + + public JVar getOnHandleIntentIntentAction() { + if (onHandleIntentIntentAction == null) { + createOnHandleIntent(); + } + return onHandleIntentIntentAction; + } + + private void createOnHandleIntent() { + onHandleIntentMethod = generatedClass.method(PUBLIC, codeModel().VOID, "onHandleIntent"); + onHandleIntentIntent = onHandleIntentMethod.param(classes().INTENT, "intent"); + onHandleIntentMethod.annotate(Override.class); + onHandleIntentBody = onHandleIntentMethod.body(); + codeModelHelper.callSuperMethod(onHandleIntentMethod, this, onHandleIntentBody); + JInvocation getActionInvocation = JExpr.invoke(onHandleIntentIntent, "getAction"); + onHandleIntentIntentAction = onHandleIntentBody.decl(classes().STRING, "action", getActionInvocation); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EProviderHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EProviderHolder.java new file mode 100644 index 0000000000..d0ccb21869 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EProviderHolder.java @@ -0,0 +1,54 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JExpr._super; +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JMod.PRIVATE; +import static com.sun.codemodel.JMod.PUBLIC; + +import javax.lang.model.element.TypeElement; + +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JMethod; + +public class EProviderHolder extends EComponentHolder { + + public EProviderHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + } + + @Override + protected void setContextRef() { + contextRef = invoke("getContext"); + } + + @Override + protected void setInit() { + init = generatedClass.method(PRIVATE, codeModel().VOID, "init_"); + createOnCreate(); + } + + private void createOnCreate() { + JMethod onCreate = generatedClass.method(PUBLIC, codeModel().BOOLEAN, "onCreate"); + onCreate.annotate(Override.class); + JBlock onCreateBody = onCreate.body(); + onCreateBody.invoke(getInit()); + onCreateBody._return(invoke(_super(), onCreate)); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EReceiverHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EReceiverHolder.java new file mode 100644 index 0000000000..62e2028cca --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EReceiverHolder.java @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JMod.PRIVATE; +import static com.sun.codemodel.JMod.PUBLIC; + +import javax.lang.model.element.TypeElement; + +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; + +public class EReceiverHolder extends EComponentHolder { + + private JFieldVar contextField; + + public EReceiverHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + } + + @Override + protected void setContextRef() { + contextField = generatedClass.field(PRIVATE, classes().CONTEXT, "context_"); + contextRef = contextField; + } + + @Override + protected void setInit() { + init = generatedClass.method(PRIVATE, codeModel().VOID, "init_"); + createOnReceive(); + } + + private void createOnReceive() { + JMethod onReceive = generatedClass.method(PUBLIC, codeModel().VOID, "onReceive"); + JVar contextParam = onReceive.param(classes().CONTEXT, "context"); + JVar intentParam = onReceive.param(classes().INTENT, "intent"); + onReceive.annotate(Override.class); + JBlock onReceiveBody = onReceive.body(); + onReceiveBody.assign(getContextField(), contextParam); + onReceiveBody.invoke(getInit()); + onReceiveBody.invoke(JExpr._super(), onReceive).arg(contextParam).arg(intentParam); + } + + public JFieldVar getContextField() { + if (contextField == null) { + setContextRef(); + } + return contextField; + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EServiceHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EServiceHolder.java new file mode 100644 index 0000000000..695c53135c --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EServiceHolder.java @@ -0,0 +1,90 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JMod.PRIVATE; +import static com.sun.codemodel.JMod.PUBLIC; + +import javax.lang.model.element.TypeElement; + +import org.androidannotations.helper.AndroidManifest; +import org.androidannotations.helper.IntentBuilder; +import org.androidannotations.helper.ServiceIntentBuilder; +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JMethod; + +public class EServiceHolder extends EComponentHolder implements HasIntentBuilder { + + private ServiceIntentBuilder intentBuilder; + private JDefinedClass intentBuilderClass; + private JFieldVar intentField; + + public EServiceHolder(ProcessHolder processHolder, TypeElement annotatedElement, AndroidManifest androidManifest) throws Exception { + super(processHolder, annotatedElement); + intentBuilder = new ServiceIntentBuilder(this, androidManifest); + intentBuilder.build(); + } + + @Override + public IntentBuilder getIntentBuilder() { + return intentBuilder; + } + + @Override + protected void setContextRef() { + contextRef = _this(); + } + + @Override + protected void setInit() { + init = generatedClass.method(PRIVATE, codeModel().VOID, "init_"); + createOnCreate(); + } + + private void createOnCreate() { + JMethod onCreate = generatedClass.method(PUBLIC, codeModel().VOID, "onCreate"); + onCreate.annotate(Override.class); + JBlock onCreateBody = onCreate.body(); + onCreateBody.invoke(getInit()); + onCreateBody.invoke(JExpr._super(), onCreate); + } + + @Override + public void setIntentBuilderClass(JDefinedClass intentBuilderClass) { + this.intentBuilderClass = intentBuilderClass; + } + + @Override + public JDefinedClass getIntentBuilderClass() { + return intentBuilderClass; + } + + @Override + public void setIntentField(JFieldVar intentField) { + this.intentField = intentField; + } + + @Override + public JFieldVar getIntentField() { + return intentField; + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EViewGroupHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EViewGroupHolder.java new file mode 100644 index 0000000000..c986de15fd --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EViewGroupHolder.java @@ -0,0 +1,57 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JMod.PUBLIC; + +import javax.lang.model.element.TypeElement; + +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JExpr; + +public class EViewGroupHolder extends EViewHolder { + + private JBlock setContentViewBlock; + + public EViewGroupHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + } + + protected void setOnFinishInflate() { + onFinishInflate = generatedClass.method(PUBLIC, codeModel().VOID, "onFinishInflate"); + onFinishInflate.annotate(Override.class); + onFinishInflate.javadoc().append(ALREADY_INFLATED_COMMENT); + + JBlock ifNotInflated = onFinishInflate.body()._if(getAlreadyInflated().not())._then(); + ifNotInflated.assign(getAlreadyInflated(), JExpr.TRUE); + + setContentViewBlock = ifNotInflated.block(); + + getInit(); + viewNotifierHelper.invokeViewChanged(ifNotInflated); + + onFinishInflate.body().invoke(JExpr._super(), "onFinishInflate"); + } + + public JBlock getSetContentViewBlock() { + if (setContentViewBlock == null) { + setOnFinishInflate(); + } + return setContentViewBlock; + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EViewHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EViewHolder.java new file mode 100644 index 0000000000..d6b4777604 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/EViewHolder.java @@ -0,0 +1,179 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JExpr.invoke; +import static com.sun.codemodel.JMod.PRIVATE; +import static com.sun.codemodel.JMod.PUBLIC; +import static com.sun.codemodel.JMod.STATIC; +import static javax.lang.model.element.ElementKind.CONSTRUCTOR; + +import java.util.ArrayList; +import java.util.List; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; + +import org.androidannotations.helper.ModelConstants; +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.ClassType; +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JInvocation; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JMod; +import com.sun.codemodel.JType; +import com.sun.codemodel.JVar; + +public class EViewHolder extends EComponentWithViewSupportHolder { + + protected static final String ALREADY_INFLATED_COMMENT = "" // + + + "The mAlreadyInflated_ hack is needed because of an Android bug\n" // + + + "which leads to infinite calls of onFinishInflate()\n" // + + "when inflating a layout with a parent and using\n" // + + "the tag." // + ; + + private static final String SUPPRESS_WARNING_COMMENT = "" // + + "We use @SuppressWarning here because our java code\n" // + + "generator doesn't know that there is no need\n" // + + "to import OnXXXListeners from View as we already\n" // + + "are in a View." // + ; + + protected JBlock initBody; + protected JMethod onFinishInflate; + protected JFieldVar alreadyInflated; + + public EViewHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + addSuppressWarning(); + createConstructorAndBuilder(); + } + + @Override + protected void setGeneratedClass() throws Exception { + String annotatedComponentQualifiedName = annotatedElement.getQualifiedName().toString(); + String generatedBeanQualifiedName = annotatedComponentQualifiedName + ModelConstants.GENERATION_SUFFIX; + JClass annotatedComponent = codeModel().directClass(annotatedComponentQualifiedName); + + int modifiers; + if (annotatedElement.getModifiers().contains(Modifier.ABSTRACT)) { + modifiers = JMod.PUBLIC | JMod.ABSTRACT; + } else { + modifiers = JMod.PUBLIC | JMod.FINAL; + } + + generatedClass = codeModel()._class(modifiers, generatedBeanQualifiedName, ClassType.CLASS); + generatedClass._extends(annotatedComponent); + } + + private void addSuppressWarning() { + generatedClass.annotate(SuppressWarnings.class).param("value", "unused"); + generatedClass.javadoc().append(SUPPRESS_WARNING_COMMENT); + } + + private void createConstructorAndBuilder() { + List constructors = new ArrayList(); + for (Element e : annotatedElement.getEnclosedElements()) { + if (e.getKind() == CONSTRUCTOR) { + constructors.add((ExecutableElement) e); + } + } + + for (ExecutableElement userConstructor : constructors) { + JMethod copyConstructor = generatedClass.constructor(PUBLIC); + JMethod staticHelper = generatedClass.method(PUBLIC | STATIC, generatedClass._extends(), "build"); + JBlock body = copyConstructor.body(); + JInvocation superCall = body.invoke("super"); + JInvocation newInvocation = JExpr._new(generatedClass); + for (VariableElement param : userConstructor.getParameters()) { + String paramName = param.getSimpleName().toString(); + String paramType = param.asType().toString(); + copyConstructor.param(refClass(paramType), paramName); + staticHelper.param(refClass(paramType), paramName); + superCall.arg(JExpr.ref(paramName)); + newInvocation.arg(JExpr.ref(paramName)); + } + + JVar newCall = staticHelper.body().decl(generatedClass, "instance", newInvocation); + staticHelper.body().invoke(newCall, getOnFinishInflate()); + staticHelper.body()._return(newCall); + body.invoke(getInit()); + } + } + + @Override + protected void setContextRef() { + contextRef = invoke("getContext"); + } + + @Override + protected void setInit() { + init = generatedClass.method(PRIVATE, codeModel().VOID, "init_"); + viewNotifierHelper.wrapInitWithNotifier(); + } + + @Override + public JBlock getInitBody() { + if (initBody == null) { + setInit(); + } + return initBody; + } + + public void setInitBody(JBlock initBody) { + this.initBody = initBody; + } + + public JMethod getOnFinishInflate() { + if (onFinishInflate == null) { + setOnFinishInflate(); + } + return onFinishInflate; + } + + protected void setOnFinishInflate() { + onFinishInflate = generatedClass.method(PUBLIC, codeModel().VOID, "onFinishInflate"); + onFinishInflate.annotate(Override.class); + onFinishInflate.javadoc().append(ALREADY_INFLATED_COMMENT); + + JBlock ifNotInflated = onFinishInflate.body()._if(getAlreadyInflated().not())._then(); + ifNotInflated.assign(getAlreadyInflated(), JExpr.TRUE); + + getInit(); + viewNotifierHelper.invokeViewChanged(ifNotInflated); + + onFinishInflate.body().invoke(JExpr._super(), "onFinishInflate"); + } + + public JFieldVar getAlreadyInflated() { + if (alreadyInflated == null) { + setAlreadyInflated(); + } + return alreadyInflated; + } + + private void setAlreadyInflated() { + alreadyInflated = generatedClass.field(PRIVATE, JType.parse(codeModel(), "boolean"), "alreadyInflated_", JExpr.FALSE); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/PutProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/GeneratedClassHolder.java similarity index 52% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/PutProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/GeneratedClassHolder.java index c0dc6fb10d..f6fb7f9739 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/PutProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/GeneratedClassHolder.java @@ -13,28 +13,31 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing.rest; +package org.androidannotations.holder; import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; -import org.androidannotations.annotations.rest.Put; +import org.androidannotations.process.ProcessHolder; -public class PutProcessor extends MethodCrudProcessor { +import com.sun.codemodel.JClass; +import com.sun.codemodel.JCodeModel; +import com.sun.codemodel.JDefinedClass; - public PutProcessor(ProcessingEnvironment processingEnv, RestImplementationsHolder restImplementationsHolder) { - super(processingEnv, restImplementationsHolder); - } +public interface GeneratedClassHolder { + JDefinedClass getGeneratedClass(); - @Override - public String getTarget() { - return Put.class.getName(); - } + TypeElement getAnnotatedElement(); - @Override - public String retrieveUrlSuffix(Element element) { - Put getAnnotation = element.getAnnotation(Put.class); - return getAnnotation.value(); - } + ProcessingEnvironment processingEnvironment(); + ProcessHolder.Classes classes(); + + JCodeModel codeModel(); + + JClass refClass(String fullyQualifiedClassName); + + JClass refClass(Class clazz); + + JDefinedClass definedClass(String fullyQualifiedClassName); } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/HasTarget.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasExtras.java similarity index 68% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/HasTarget.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasExtras.java index 5a98408f00..e6102da125 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/HasTarget.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasExtras.java @@ -13,11 +13,16 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.helper; +package org.androidannotations.holder; +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; -public interface HasTarget { +public interface HasExtras extends GeneratedClassHolder { + JMethod getInjectExtrasMethod(); - String getTarget(); + JBlock getInjectExtrasBlock(); + JVar getInjectExtras(); } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/NonConfigurationHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasInstanceState.java similarity index 67% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/NonConfigurationHolder.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasInstanceState.java index 99c16a072b..e3d366cd1a 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/NonConfigurationHolder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasInstanceState.java @@ -13,24 +13,18 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.holder; import com.sun.codemodel.JBlock; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JInvocation; import com.sun.codemodel.JMethod; import com.sun.codemodel.JVar; -public class NonConfigurationHolder { +public interface HasInstanceState extends GeneratedClassHolder { + JBlock getSaveStateMethodBody(); - public JDefinedClass holderClass; + JVar getSaveStateBundleParam(); - public JMethod holderConstructor; + JMethod getRestoreStateMethod(); - public JInvocation newHolder; - - public JBlock initIfNonConfigurationNotNullBody; - - public JVar initNonConfigurationInstance; - -} + JVar getRestoreStateBundleParam(); +} \ No newline at end of file diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestImplementationHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasIntentBuilder.java similarity index 63% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestImplementationHolder.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasIntentBuilder.java index 3b96b2f437..ed4c5037a9 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestImplementationHolder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasIntentBuilder.java @@ -13,25 +13,21 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing.rest; +package org.androidannotations.holder; import com.sun.codemodel.JDefinedClass; import com.sun.codemodel.JFieldVar; +import org.androidannotations.helper.IntentBuilder; -public class RestImplementationHolder { +public interface HasIntentBuilder extends GeneratedClassHolder { - public JDefinedClass restImplementationClass; + public IntentBuilder getIntentBuilder(); - public JFieldVar restTemplateField; + public void setIntentBuilderClass(JDefinedClass intentBuilderClass); - public JFieldVar rootUrlField; + public JDefinedClass getIntentBuilderClass(); - public JFieldVar availableHeadersField; - - public JFieldVar availableCookiesField; - - public JFieldVar authenticationField; - - public JFieldVar restErrorHandlerField; + public void setIntentField(JFieldVar intentField); + public JFieldVar getIntentField(); } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/GeneratingElementProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasOnActivityResult.java similarity index 65% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/GeneratingElementProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasOnActivityResult.java index f385371d5f..eec68c1c93 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/GeneratingElementProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasOnActivityResult.java @@ -13,15 +13,15 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.holder; -import javax.lang.model.element.Element; +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JVar; -import org.androidannotations.helper.HasTarget; -import com.sun.codemodel.JCodeModel; +public interface HasOnActivityResult extends GeneratedClassHolder { + JBlock getOnActivityResultCaseBlock(int requestCode); -public interface GeneratingElementProcessor extends HasTarget { - - void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception; + JVar getOnActivityResultDataParam(); + JVar getOnActivityResultResultCodeParam(); } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasOptionsMenu.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasOptionsMenu.java new file mode 100644 index 0000000000..97e001c0e6 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/HasOptionsMenu.java @@ -0,0 +1,33 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JVar; + +public interface HasOptionsMenu extends GeneratedClassHolder { + JBlock getOnCreateOptionsMenuMethodBody(); + + JVar getOnCreateOptionsMenuMenuInflaterVar(); + + JVar getOnCreateOptionsMenuMenuParam(); + + JVar getOnOptionsItemSelectedItem(); + + JVar getOnOptionsItemSelectedItemId(); + + JBlock getOnOptionsItemSelectedIfElseBlock(); +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/InstanceStateHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/InstanceStateHolder.java new file mode 100644 index 0000000000..eddc96361b --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/InstanceStateHolder.java @@ -0,0 +1,143 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JExpr._null; +import static com.sun.codemodel.JExpr.ref; +import static com.sun.codemodel.JMod.PRIVATE; +import static com.sun.codemodel.JMod.PUBLIC; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.TypeElement; + +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JCodeModel; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; + +public class InstanceStateHolder implements HasInstanceState { + + private EComponentHolder holder; + private JBlock saveStateMethodBody; + private JVar saveStateBundleParam; + private JMethod restoreStateMethod; + private JVar restoreStateBundleParam; + + public InstanceStateHolder(EComponentHolder holder) { + this.holder = holder; + } + + @Override + public JBlock getSaveStateMethodBody() { + if (saveStateMethodBody == null) { + setSaveStateMethod(); + } + return saveStateMethodBody; + } + + @Override + public JVar getSaveStateBundleParam() { + if (saveStateBundleParam == null) { + setSaveStateMethod(); + } + return saveStateBundleParam; + } + + private void setSaveStateMethod() { + JMethod method = getGeneratedClass().method(PUBLIC, codeModel().VOID, "onSaveInstanceState"); + method.annotate(Override.class); + saveStateBundleParam = method.param(classes().BUNDLE, "bundle"); + + saveStateMethodBody = method.body(); + + saveStateMethodBody.invoke(JExpr._super(), "onSaveInstanceState").arg(saveStateBundleParam); + } + + @Override + public JMethod getRestoreStateMethod() { + if (restoreStateMethod == null) { + setRestoreStateMethod(); + } + return restoreStateMethod; + } + + @Override + public JVar getRestoreStateBundleParam() { + if (restoreStateBundleParam == null) { + setRestoreStateMethod(); + } + return restoreStateBundleParam; + } + + private void setRestoreStateMethod() { + restoreStateMethod = getGeneratedClass().method(PRIVATE, codeModel().VOID, "restoreSavedInstanceState_"); + restoreStateBundleParam = restoreStateMethod.param(classes().BUNDLE, "savedInstanceState"); + getInit().body().invoke(restoreStateMethod).arg(restoreStateBundleParam); + + restoreStateMethod.body() // + ._if(ref("savedInstanceState").eq(_null())) // + ._then()._return(); + } + + public JMethod getInit() { + return holder.getInit(); + } + + @Override + public JDefinedClass getGeneratedClass() { + return holder.getGeneratedClass(); + } + + @Override + public JCodeModel codeModel() { + return holder.codeModel(); + } + + @Override + public ProcessHolder.Classes classes() { + return holder.classes(); + } + + @Override + public TypeElement getAnnotatedElement() { + return holder.getAnnotatedElement(); + } + + @Override + public ProcessingEnvironment processingEnvironment() { + return holder.processingEnvironment(); + } + + @Override + public JClass refClass(String fullyQualifiedClassName) { + return holder.refClass(fullyQualifiedClassName); + } + + @Override + public JClass refClass(Class clazz) { + return holder.refClass(clazz); + } + + @Override + public JDefinedClass definedClass(String fullyQualifiedClassName) { + return holder.definedClass(fullyQualifiedClassName); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/NonConfigurationHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/NonConfigurationHolder.java new file mode 100644 index 0000000000..688a39fe93 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/NonConfigurationHolder.java @@ -0,0 +1,57 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JMod.PUBLIC; + +import com.sun.codemodel.JClass; +import com.sun.codemodel.JClassAlreadyExistsException; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JMod; + +public class NonConfigurationHolder { + + private JDefinedClass generatedClass; + private JFieldVar superNonConfigurationInstanceField; + + public NonConfigurationHolder(EActivityHolder eActivityHolder) throws JClassAlreadyExistsException { + setGeneratedClass(eActivityHolder); + } + + private void setGeneratedClass(EActivityHolder eActivityHolder) throws JClassAlreadyExistsException { + generatedClass = eActivityHolder.generatedClass._class(JMod.PRIVATE | JMod.STATIC, "NonConfigurationInstancesHolder"); + } + + public JDefinedClass getGeneratedClass() { + return generatedClass; + } + + public JFieldVar getSuperNonConfigurationInstanceField() { + if (superNonConfigurationInstanceField == null) { + setSuperNonConfigurationInstanceField(); + } + return superNonConfigurationInstanceField; + } + + private void setSuperNonConfigurationInstanceField() { + superNonConfigurationInstanceField = generatedClass.field(PUBLIC, Object.class, "superNonConfigurationInstance"); + } + + public JFieldVar createField(String fieldName, JClass fieldType) { + return generatedClass.field(PUBLIC, fieldType, fieldName); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/OnActivityResultHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/OnActivityResultHolder.java new file mode 100644 index 0000000000..a5346282da --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/OnActivityResultHolder.java @@ -0,0 +1,120 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JExpr._super; + +import java.util.HashMap; + +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JCase; +import com.sun.codemodel.JCodeModel; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JMod; +import com.sun.codemodel.JSwitch; +import com.sun.codemodel.JVar; + +public class OnActivityResultHolder { + + private EComponentHolder holder; + private JBlock afterSuperBlock; + private JSwitch zwitch; + private JVar requestCodeParam; + private JVar dataParam; + private JVar resultCodeParam; + private HashMap caseBlocks = new HashMap(); + + public OnActivityResultHolder(EComponentHolder holder) { + this.holder = holder; + } + + public JVar getRequestCodeParam() { + if (requestCodeParam == null) { + setOnActivityResult(); + } + return requestCodeParam; + } + + public JVar getDataParam() { + if (dataParam == null) { + setOnActivityResult(); + } + return dataParam; + } + + public JVar getResultCodeParam() { + if (dataParam == null) { + setOnActivityResult(); + } + return resultCodeParam; + } + + public JBlock getCaseBlock(int requestCode) { + JBlock onActivityResultCaseBlock = caseBlocks.get(requestCode); + if (onActivityResultCaseBlock == null) { + onActivityResultCaseBlock = createCaseBlock(requestCode); + caseBlocks.put(requestCode, onActivityResultCaseBlock); + } + return onActivityResultCaseBlock; + } + + private JBlock createCaseBlock(int requestCode) { + JCase onActivityResultCase = getSwitch()._case(JExpr.lit(requestCode)); + JBlock onActivityResultCaseBlock = onActivityResultCase.body().block(); + onActivityResultCase.body()._break(); + return onActivityResultCaseBlock; + } + + public JSwitch getSwitch() { + if (zwitch == null) { + setSwitch(); + } + return zwitch; + } + + private void setSwitch() { + zwitch = getAfterSuperBlock()._switch(getRequestCodeParam()); + } + + public JBlock getAfterSuperBlock() { + if (afterSuperBlock == null) { + setOnActivityResult(); + } + return afterSuperBlock; + } + + private void setOnActivityResult() { + JMethod method = holder.getGeneratedClass().method(JMod.PUBLIC, codeModel().VOID, "onActivityResult"); + method.annotate(Override.class); + requestCodeParam = method.param(codeModel().INT, "requestCode"); + resultCodeParam = method.param(codeModel().INT, "resultCode"); + dataParam = method.param(classes().INTENT, "data"); + JBlock body = method.body(); + body.invoke(_super(), method).arg(requestCodeParam).arg(resultCodeParam).arg(dataParam); + afterSuperBlock = body.block(); + } + + private JCodeModel codeModel() { + return holder.codeModel(); + } + + public ProcessHolder.Classes classes() { + return holder.classes(); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/OnSeekBarChangeListenerHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/OnSeekBarChangeListenerHolder.java new file mode 100644 index 0000000000..677f1ad64c --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/OnSeekBarChangeListenerHolder.java @@ -0,0 +1,99 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JMod; +import com.sun.codemodel.JVar; + +public class OnSeekBarChangeListenerHolder { + + private EComponentWithViewSupportHolder holder; + private JDefinedClass listenerClass; + private JBlock onProgressChangedBody; + private JVar onProgressChangedSeekBarParam; + private JVar onProgressChangedProgressParam; + private JVar onProgressChangedFromUserParam; + private JBlock onStartTrackingTouchBody; + private JVar onStartTrackingTouchSeekBarParam; + private JBlock onStopTrackingTouchBody; + private JVar onStopTrackingTouchSeekBarParam; + + public OnSeekBarChangeListenerHolder(EComponentWithViewSupportHolder holder, JDefinedClass onSeekbarChangeListenerClass) { + this.holder = holder; + this.listenerClass = onSeekbarChangeListenerClass; + createOnProgressChanged(); + createOnStartTrackingTouch(); + createOnStopTrackingTouch(); + } + + private void createOnProgressChanged() { + JMethod onProgressChangedMethod = listenerClass.method(JMod.PUBLIC, holder.codeModel().VOID, "onProgressChanged"); + onProgressChangedMethod.annotate(Override.class); + onProgressChangedBody = onProgressChangedMethod.body(); + onProgressChangedSeekBarParam = onProgressChangedMethod.param(holder.classes().SEEKBAR, "seekBar"); + onProgressChangedProgressParam = onProgressChangedMethod.param(holder.codeModel().INT, "progress"); + onProgressChangedFromUserParam = onProgressChangedMethod.param(holder.codeModel().BOOLEAN, "fromUser"); + } + + private void createOnStartTrackingTouch() { + JMethod onStartTrackingTouchMethod = listenerClass.method(JMod.PUBLIC, holder.codeModel().VOID, "onStartTrackingTouch"); + onStartTrackingTouchMethod.annotate(Override.class); + onStartTrackingTouchBody = onStartTrackingTouchMethod.body(); + onStartTrackingTouchSeekBarParam = onStartTrackingTouchMethod.param(holder.classes().SEEKBAR, "seekBar"); + } + + private void createOnStopTrackingTouch() { + JMethod onStopTrackingTouchMethod = listenerClass.method(JMod.PUBLIC, holder.codeModel().VOID, "onStopTrackingTouch"); + onStopTrackingTouchMethod.annotate(Override.class); + onStopTrackingTouchBody = onStopTrackingTouchMethod.body(); + onStopTrackingTouchSeekBarParam = onStopTrackingTouchMethod.param(holder.classes().SEEKBAR, "seekBar"); + } + + public JBlock getOnProgressChangedBody() { + return onProgressChangedBody; + } + + public JVar getOnProgressChangedSeekBarParam() { + return onProgressChangedSeekBarParam; + } + + public JVar getOnProgressChangedProgressParam() { + return onProgressChangedProgressParam; + } + + public JVar getOnProgressChangedFromUserParam() { + return onProgressChangedFromUserParam; + } + + public JBlock getOnStartTrackingTouchBody() { + return onStartTrackingTouchBody; + } + + public JVar getOnStartTrackingTouchSeekBarParam() { + return onStartTrackingTouchSeekBarParam; + } + + public JBlock getOnStopTrackingTouchBody() { + return onStopTrackingTouchBody; + } + + public JVar getOnStopTrackingTouchSeekBarParam() { + return onStopTrackingTouchSeekBarParam; + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RestHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RestHolder.java new file mode 100644 index 0000000000..49de493804 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RestHolder.java @@ -0,0 +1,271 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JExpr._new; +import static com.sun.codemodel.JExpr._this; +import static com.sun.codemodel.JMod.FINAL; +import static com.sun.codemodel.JMod.PUBLIC; +import static org.androidannotations.helper.CanonicalNameConstants.HTTP_AUTHENTICATION; +import static org.androidannotations.helper.CanonicalNameConstants.REST_TEMPLATE; +import static org.androidannotations.helper.CanonicalNameConstants.STRING; + +import java.util.List; + +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.TypeKind; +import javax.lang.model.util.ElementFilter; + +import com.sun.codemodel.*; +import org.androidannotations.api.rest.RestErrorHandler; +import org.androidannotations.helper.APTCodeModelHelper; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.helper.ModelConstants; +import org.androidannotations.process.ProcessHolder; + +public class RestHolder extends BaseGeneratedClassHolder { + + private APTCodeModelHelper codeModelHelper; + + private JMethod init; + private JFieldVar rootUrlField; + private JFieldVar restTemplateField; + private JFieldVar availableHeadersField; + private JFieldVar availableCookiesField; + private JFieldVar authenticationField; + private JFieldVar restErrorHandlerField; + + public RestHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + codeModelHelper = new APTCodeModelHelper(); + implementMethods(); + } + + @Override + protected void setGeneratedClass() throws Exception { + String annotatedComponentQualifiedName = annotatedElement.getQualifiedName().toString(); + String subComponentQualifiedName = annotatedComponentQualifiedName + ModelConstants.GENERATION_SUFFIX; + JClass annotatedComponent = codeModel().directClass(annotatedComponentQualifiedName); + generatedClass = codeModel()._class(PUBLIC | FINAL, subComponentQualifiedName, ClassType.CLASS); + generatedClass._implements(annotatedComponent); + } + + private void implementMethods() { + List methods = codeModelHelper.getMethods(getAnnotatedElement()); + + // rest template + implementGetRestTemplate(methods); + implementSetRestTemplate(methods); + + // root url + implementGetRootUrl(methods); + implementSetRootUrl(methods); + + // authentication + implementSetBasicAuth(methods); + implementSetAuthentication(methods); + + // cookies and headers + implementGetCookie(methods); + implementGetHeader(methods); + implementSetCookie(methods); + implementSetHeader(methods); + + // error handler. + implementSetErrorHandler(methods); + } + + private void implementGetRestTemplate(List methods) { + JMethod getRestTemplateMethod = codeModelHelper.implementMethod(this, methods, null, REST_TEMPLATE); + + if (getRestTemplateMethod != null) { + getRestTemplateMethod.body()._return(getRestTemplateField()); + } + } + + private void implementSetRestTemplate(List methods) { + JMethod setRestTemplateMethod = codeModelHelper.implementMethod(this, methods, null, TypeKind.VOID.toString(), REST_TEMPLATE); + + if (setRestTemplateMethod != null) { + setRestTemplateMethod.body().assign(_this().ref(getRestTemplateField()), setRestTemplateMethod.params().get(0)); + } + } + + private void implementGetRootUrl(List methods) { + JMethod getRootUrlMethod = codeModelHelper.implementMethod(this, methods, "getRootUrl", STRING); + + if (getRootUrlMethod != null) { + getRootUrlMethod.body()._return(getRootUrlField()); + } + } + + private void implementSetRootUrl(List methods) { + JMethod setRootUrlMethod = codeModelHelper.implementMethod(this, methods, "setRootUrl", TypeKind.VOID.toString(), STRING); + + if (setRootUrlMethod != null) { + setRootUrlMethod.body().assign(_this().ref(getRootUrlField()), setRootUrlMethod.params().get(0)); + } + } + + private void implementSetBasicAuth(List methods) { + JMethod setAuthMethod = codeModelHelper.implementMethod(this, methods, "setHttpBasicAuth", TypeKind.VOID.toString(), STRING, STRING); + + if (setAuthMethod != null) { + JClass basicAuthClass = classes().HTTP_BASIC_AUTHENTICATION; + JInvocation basicAuthentication = JExpr._new(basicAuthClass).arg(setAuthMethod.params().get(0)).arg(setAuthMethod.params().get(1)); + setAuthMethod.body().assign(_this().ref(getAuthenticationField()), basicAuthentication); + } + } + + private void implementSetAuthentication(List methods) { + JMethod setAuthMethod = codeModelHelper.implementMethod(this, methods, "setAuthentication", TypeKind.VOID.toString(), CanonicalNameConstants.HTTP_AUTHENTICATION); + + if (setAuthMethod != null) { + setAuthMethod.body().assign(_this().ref(getAuthenticationField()), setAuthMethod.params().get(0)); + } + } + + private void implementGetCookie(List methods) { + JMethod getCookieMethod = codeModelHelper.implementMethod(this, methods, "getCookie", STRING, STRING); + + if (getCookieMethod != null) { + JInvocation cookieValue = JExpr.invoke(getAvailableCookiesField(), "get").arg(getCookieMethod.params().get(0)); + getCookieMethod.body()._return(cookieValue); + } + } + + private void implementGetHeader(List methods) { + JMethod getHeaderMethod = codeModelHelper.implementMethod(this, methods, "getHeader", STRING, STRING); + + if (getHeaderMethod != null) { + JInvocation headerValue = JExpr.invoke(getAvailableHeadersField(), "get").arg(getHeaderMethod.params().get(0)); + getHeaderMethod.body()._return(headerValue); + } + } + + private void implementSetCookie(List methods) { + JMethod setCookieMethod = codeModelHelper.implementMethod(this, methods, "setCookie", TypeKind.VOID.toString(), STRING, STRING); + + if (setCookieMethod != null) { + setCookieMethod.body().invoke(getAvailableCookiesField(), "put").arg(setCookieMethod.params().get(0)).arg(setCookieMethod.params().get(1)); + } + } + + private void implementSetHeader(List methods) { + JMethod setHeaderMethod = codeModelHelper.implementMethod(this, methods, "setHeader", TypeKind.VOID.toString(), STRING, STRING); + + if (setHeaderMethod != null) { + setHeaderMethod.body().invoke(getAvailableHeadersField(), "put").arg(setHeaderMethod.params().get(0)).arg(setHeaderMethod.params().get(1)); + } + } + + private void implementSetErrorHandler(List methods) { + JMethod setErrorHandlerMethod = codeModelHelper.implementMethod(this, methods, "setRestErrorHandler", TypeKind.VOID.toString(), RestErrorHandler.class.getName()); + + if (setErrorHandlerMethod != null) { + setErrorHandlerMethod.body().assign(_this().ref(getRestErrorHandlerField()), setErrorHandlerMethod.params().get(0)); + } + } + + public JMethod getInit() { + if (init == null) { + setInit(); + } + return init; + } + + private void setInit() { + init = getGeneratedClass().constructor(JMod.PUBLIC); + } + + public JFieldVar getRootUrlField() { + if (rootUrlField == null) { + setRootUrlField(); + } + return rootUrlField; + } + + private void setRootUrlField() { + rootUrlField = getGeneratedClass().field(JMod.PRIVATE, classes().STRING, "rootUrl"); + } + + public JFieldVar getRestTemplateField() { + if (restTemplateField == null) { + setRestTemplateField(); + } + return restTemplateField; + } + + private void setRestTemplateField() { + restTemplateField = getGeneratedClass().field(JMod.PRIVATE, classes().REST_TEMPLATE, "restTemplate"); + getInit().body().assign(restTemplateField, _new(classes().REST_TEMPLATE)); + } + + public JFieldVar getAvailableHeadersField() { + if (availableHeadersField == null) { + setAvailableHeadersField(); + } + return availableHeadersField; + } + + private void setAvailableHeadersField() { + JClass stringClass = classes().STRING; + JClass mapClass = classes().HASH_MAP.narrow(stringClass, stringClass); + availableHeadersField = getGeneratedClass().field(JMod.PRIVATE, mapClass, "availableHeaders"); + init.body().assign(availableHeadersField, _new(mapClass)); + } + + public JFieldVar getAvailableCookiesField() { + if (availableCookiesField == null) { + setAvailableCookiesField(); + } + return availableCookiesField; + } + + private void setAvailableCookiesField() { + JClass stringClass = classes().STRING; + JClass mapClass = classes().HASH_MAP.narrow(stringClass, stringClass); + availableCookiesField = getGeneratedClass().field(JMod.PRIVATE, mapClass, "availableCookies"); + init.body().assign(availableCookiesField, _new(mapClass)); + } + + public JFieldVar getAuthenticationField() { + if (authenticationField == null) { + setAuthenticationField(); + } + return authenticationField; + } + + private void setAuthenticationField() { + authenticationField = getGeneratedClass().field(JMod.PRIVATE, classes().HTTP_AUTHENTICATION, "authentication"); + } + + public JFieldVar getRestErrorHandlerField() { + if (restErrorHandlerField == null) { + setRestErrorHandlerField(); + } + return restErrorHandlerField; + } + + private void setRestErrorHandlerField() { + JClass restErrorHandlerClass = refClass(RestErrorHandler.class.getName()); + restErrorHandlerField = getGeneratedClass().field(JMod.PRIVATE, restErrorHandlerClass, "restErrorHandler"); + } + +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RoboGuiceHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RoboGuiceHolder.java new file mode 100644 index 0000000000..a177ed96f1 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/RoboGuiceHolder.java @@ -0,0 +1,178 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JVar; + +public class RoboGuiceHolder { + + private EActivityHolder holder; + protected JFieldVar scope; + protected JFieldVar eventManager; + protected JMethod getInjector; + protected JBlock onRestartBeforeSuperBlock; + protected JBlock onRestartAfterSuperBlock; + protected JBlock onStartBeforeSuperBlock; + protected JBlock onStartAfterSuperBlock; + protected JBlock onResumeBeforeSuperBlock; + protected JBlock onPauseAfterSuperBlock; + protected JBlock onNewIntentAfterSuperBlock; + protected JMethod onStop; + protected JMethod onDestroy; + protected JVar newConfig; + protected JVar currentConfig; + protected JBlock onConfigurationChangedAfterSuperBlock; + protected JBlock onContentChangedAfterSuperBlock; + + public RoboGuiceHolder(EActivityHolder holder) { + this.holder = holder; + } + + public JFieldVar getEventManagerField() { + if (eventManager == null) { + holder.setEventManagerField(); + } + return eventManager; + } + + public JFieldVar getScopeField() { + if (scope == null) { + holder.setScopeField(); + } + return scope; + } + + public JMethod getGetInjector() { + if (getInjector == null) { + holder.setGetInjector(); + } + return getInjector; + } + + public JBlock getOnRestartBeforeSuperBlock() { + if (onRestartBeforeSuperBlock == null) { + holder.setOnRestart(); + } + return onRestartBeforeSuperBlock; + } + + public JBlock getOnRestartAfterSuperBlock() { + if (onRestartAfterSuperBlock == null) { + holder.setOnRestart(); + } + return onRestartAfterSuperBlock; + } + + public JBlock getOnStartBeforeSuperBlock() { + if (onStartBeforeSuperBlock == null) { + holder.setOnStart(); + } + return onStartBeforeSuperBlock; + } + + public JBlock getOnStartAfterSuperBlock() { + if (onStartAfterSuperBlock == null) { + holder.setOnStart(); + } + return onStartAfterSuperBlock; + } + + public JBlock getOnResumeBeforeSuperBlock() { + if (onResumeBeforeSuperBlock == null) { + holder.setOnResume(); + } + return onResumeBeforeSuperBlock; + } + + public JBlock getOnResumeAfterSuperBlock() { + return holder.getOnResumeAfterSuperBlock(); + } + + public JBlock getOnPauseAfterSuperBlock() { + if (onPauseAfterSuperBlock == null) { + holder.setOnPause(); + } + return onPauseAfterSuperBlock; + } + + public JBlock getOnNewIntentAfterSuperBlock() { + if (onNewIntentAfterSuperBlock == null) { + holder.setOnNewIntent(); + } + return onNewIntentAfterSuperBlock; + } + + public JMethod getOnStop() { + if (onStop == null) { + holder.setOnStop(); + } + return onStop; + } + + public JMethod getOnDestroy() { + if (onDestroy == null) { + holder.setOnDestroy(); + } + return onDestroy; + } + + public JVar getNewConfig() { + if (newConfig == null) { + holder.setOnConfigurationChanged(); + } + return newConfig; + } + + public JVar getCurrentConfig() { + if (currentConfig == null) { + holder.setOnConfigurationChanged(); + } + return currentConfig; + } + + public JBlock getOnConfigurationChangedAfterSuperBlock() { + if (onConfigurationChangedAfterSuperBlock == null) { + holder.setOnConfigurationChanged(); + } + return onConfigurationChangedAfterSuperBlock; + } + + public JBlock getOnContentChangedAfterSuperBlock() { + if (onContentChangedAfterSuperBlock == null) { + holder.setOnContentChanged(); + } + return onContentChangedAfterSuperBlock; + } + + public JBlock getOnActivityResultAfterSuperBlock() { + return holder.getOnActivityResultAfterSuperBlock(); + } + + public JVar getRequestCode() { + return holder.getOnActivityResultRequestCodeParam(); + } + + public JVar getResultCode() { + return holder.getOnActivityResultResultCodeParam(); + } + + public JVar getData() { + return holder.getOnActivityResultDataParam(); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/SharedPrefHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/SharedPrefHolder.java new file mode 100644 index 0000000000..77795b8076 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/SharedPrefHolder.java @@ -0,0 +1,159 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import static com.sun.codemodel.JMod.FINAL; +import static com.sun.codemodel.JMod.PUBLIC; + +import java.util.HashMap; +import java.util.Map; + +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; + +import org.androidannotations.api.sharedpreferences.BooleanPrefEditorField; +import org.androidannotations.api.sharedpreferences.EditorHelper; +import org.androidannotations.api.sharedpreferences.FloatPrefEditorField; +import org.androidannotations.api.sharedpreferences.IntPrefEditorField; +import org.androidannotations.api.sharedpreferences.LongPrefEditorField; +import org.androidannotations.api.sharedpreferences.SharedPreferencesHelper; +import org.androidannotations.api.sharedpreferences.StringPrefEditorField; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.helper.ModelConstants; +import org.androidannotations.process.ProcessHolder; + +import com.sun.codemodel.ClassType; +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JClass; +import com.sun.codemodel.JClassAlreadyExistsException; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JExpr; +import com.sun.codemodel.JExpression; +import com.sun.codemodel.JFieldVar; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JMod; +import com.sun.codemodel.JVar; + +public class SharedPrefHolder extends BaseGeneratedClassHolder { + + private static class EditorFieldHolder { + public final Class fieldClass; + public final String fieldMethodName; + + public EditorFieldHolder(Class fieldClass, String fieldMethodName) { + this.fieldClass = fieldClass; + this.fieldMethodName = fieldMethodName; + } + } + + private static final Map EDITOR_FIELD_BY_TYPE = new HashMap() { + private static final long serialVersionUID = 1L; + { + put("boolean", new EditorFieldHolder(BooleanPrefEditorField.class, "booleanField")); + put("float", new EditorFieldHolder(FloatPrefEditorField.class, "floatField")); + put("int", new EditorFieldHolder(IntPrefEditorField.class, "intField")); + put("long", new EditorFieldHolder(LongPrefEditorField.class, "longField")); + put(CanonicalNameConstants.STRING, new EditorFieldHolder(StringPrefEditorField.class, "stringField")); + } + }; + + private JBlock constructorSuperBlock; + private JVar constructorContextParam; + private JFieldVar contextField; + private JDefinedClass editorClass; + + public SharedPrefHolder(ProcessHolder processHolder, TypeElement annotatedElement) throws Exception { + super(processHolder, annotatedElement); + + createEditorClass(); + createEditMethod(); + } + + @Override + protected void setGeneratedClass() throws Exception { + String annotatedComponentQualifiedName = annotatedElement.getQualifiedName().toString(); + String subComponentQualifiedName = annotatedComponentQualifiedName + ModelConstants.GENERATION_SUFFIX; + generatedClass = codeModel()._class(PUBLIC | FINAL, subComponentQualifiedName, ClassType.CLASS); + generatedClass._extends(SharedPreferencesHelper.class); + } + + private void createEditorClass() throws JClassAlreadyExistsException { + String interfaceSimpleName = annotatedElement.getSimpleName().toString(); + editorClass = generatedClass._class(JMod.PUBLIC | JMod.STATIC | JMod.FINAL, interfaceSimpleName + "Editor" + ModelConstants.GENERATION_SUFFIX); + editorClass._extends(processHolder.refClass(EditorHelper.class).narrow(editorClass)); + + createEditorConstructor(); + } + + private void createEditorConstructor() { + JMethod editorConstructor = editorClass.constructor(JMod.NONE); + JClass sharedPreferencesClass = processHolder.refClass("android.content.SharedPreferences"); + JVar sharedPreferencesParam = editorConstructor.param(sharedPreferencesClass, "sharedPreferences"); + editorConstructor.body().invoke("super").arg(sharedPreferencesParam); + } + + private void createEditMethod() { + JMethod editMethod = generatedClass.method(JMod.PUBLIC, editorClass, "edit"); + editMethod.body()._return(JExpr._new(editorClass).arg(JExpr.invoke("getSharedPreferences"))); + } + + public void createFieldMethod(Class prefFieldHelperClass, String fieldName, String fieldHelperMethodName, JExpression defaultValue) { + JMethod fieldMethod = generatedClass.method(JMod.PUBLIC, prefFieldHelperClass, fieldName); + fieldMethod.body()._return(JExpr.invoke(fieldHelperMethodName).arg(fieldName).arg(defaultValue)); + } + + public void createEditorFieldMethods(ExecutableElement method) { + String returnType = method.getReturnType().toString(); + EditorFieldHolder editorFieldHolder = EDITOR_FIELD_BY_TYPE.get(returnType); + JClass editorFieldClass = processHolder.refClass(editorFieldHolder.fieldClass); + String fieldName = method.getSimpleName().toString(); + JMethod editorFieldMethod = editorClass.method(JMod.PUBLIC, editorFieldClass.narrow(editorClass), fieldName); + editorFieldMethod.body()._return(JExpr.invoke(editorFieldHolder.fieldMethodName).arg(fieldName)); + } + + public JBlock getConstructorSuperBlock() { + if (constructorSuperBlock == null) { + setConstructor(); + } + return constructorSuperBlock; + } + + public JVar getConstructorContextParam() { + if (constructorContextParam == null) { + setConstructor(); + } + return constructorContextParam; + } + + private void setConstructor() { + JMethod constructor = generatedClass.constructor(JMod.PUBLIC); + constructorContextParam = constructor.param(classes().CONTEXT, "context"); + JBlock constructorBody = constructor.body(); + constructorSuperBlock = constructorBody.block(); + constructorBody.assign(JExpr._this().ref(getContextField()), constructorContextParam); + } + + public JFieldVar getContextField() { + if (contextField == null) { + setContextField(); + } + return contextField; + } + + protected void setContextField() { + contextField = generatedClass.field(JMod.PRIVATE, classes().CONTEXT, "context_"); + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/TextWatcherHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/TextWatcherHolder.java new file mode 100644 index 0000000000..c8b2500c51 --- /dev/null +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/holder/TextWatcherHolder.java @@ -0,0 +1,132 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.androidannotations.holder; + +import com.sun.codemodel.JBlock; +import com.sun.codemodel.JDefinedClass; +import com.sun.codemodel.JMethod; +import com.sun.codemodel.JMod; +import com.sun.codemodel.JPrimitiveType; +import com.sun.codemodel.JVar; + +public class TextWatcherHolder { + + private EComponentWithViewSupportHolder holder; + private JVar textViewVariable; + private JDefinedClass listenerClass; + private JBlock beforeTextChangedBody; + private JVar beforeTextChangedCharSequenceParam; + private JVar beforeTextChangedStartParam; + private JVar beforeTextChangedCountParam; + private JVar beforeTextChangedAfterParam; + private JBlock onTextChangedBody; + private JVar onTextChangedCharSequenceParam; + private JVar onTextChangedStartParam; + private JVar onTextChangedBeforeParam; + private JVar onTextChangedCountParam; + private JBlock afterTextChangedBody; + private JVar afterTextChangedEditableParam; + + public TextWatcherHolder(EComponentWithViewSupportHolder holder, JVar viewVariable, JDefinedClass onTextChangeListenerClass) { + this.holder = holder; + this.textViewVariable = viewVariable; + this.listenerClass = onTextChangeListenerClass; + createBeforeTextChanged(); + createOnTextChanged(); + createAfterTextChanged(); + } + + private void createBeforeTextChanged() { + JPrimitiveType intClass = holder.codeModel().INT; + JMethod beforeTextChangedMethod = listenerClass.method(JMod.PUBLIC, holder.codeModel().VOID, "beforeTextChanged"); + beforeTextChangedMethod.annotate(Override.class); + beforeTextChangedBody = beforeTextChangedMethod.body(); + beforeTextChangedCharSequenceParam = beforeTextChangedMethod.param(holder.classes().CHAR_SEQUENCE, "s"); + beforeTextChangedStartParam = beforeTextChangedMethod.param(intClass, "start"); + beforeTextChangedCountParam = beforeTextChangedMethod.param(intClass, "count"); + beforeTextChangedAfterParam = beforeTextChangedMethod.param(intClass, "after"); + } + + private void createOnTextChanged() { + JPrimitiveType intClass = holder.codeModel().INT; + JMethod onTextChangedMethod = listenerClass.method(JMod.PUBLIC, holder.codeModel().VOID, "onTextChanged"); + onTextChangedMethod.annotate(Override.class); + onTextChangedBody = onTextChangedMethod.body(); + onTextChangedCharSequenceParam = onTextChangedMethod.param(holder.classes().CHAR_SEQUENCE, "s"); + onTextChangedStartParam = onTextChangedMethod.param(intClass, "start"); + onTextChangedBeforeParam = onTextChangedMethod.param(intClass, "before"); + onTextChangedCountParam = onTextChangedMethod.param(intClass, "count"); + } + + private void createAfterTextChanged() { + JMethod afterTextChangedMethod = listenerClass.method(JMod.PUBLIC, holder.codeModel().VOID, "afterTextChanged"); + afterTextChangedMethod.annotate(Override.class); + afterTextChangedBody = afterTextChangedMethod.body(); + afterTextChangedEditableParam = afterTextChangedMethod.param(holder.classes().EDITABLE, "s"); + } + + public JVar getTextViewVariable() { + return textViewVariable; + } + + public JBlock getBeforeTextChangedBody() { + return beforeTextChangedBody; + } + + public JVar getBeforeTextChangedCharSequenceParam() { + return beforeTextChangedCharSequenceParam; + } + + public JVar getBeforeTextChangedStartParam() { + return beforeTextChangedStartParam; + } + + public JVar getBeforeTextChangedCountParam() { + return beforeTextChangedCountParam; + } + + public JVar getBeforeTextChangedAfterParam() { + return beforeTextChangedAfterParam; + } + + public JBlock getOnTextChangedBody() { + return onTextChangedBody; + } + + public JVar getOnTextChangedCharSequenceParam() { + return onTextChangedCharSequenceParam; + } + + public JVar getOnTextChangedStartParam() { + return onTextChangedStartParam; + } + + public JVar getOnTextChangedBeforeParam() { + return onTextChangedBeforeParam; + } + + public JVar getOnTextChangedCountParam() { + return onTextChangedCountParam; + } + + public JBlock getAfterTextChangedBody() { + return afterTextChangedBody; + } + + public JVar getAfterTextChangedEditableParam() { + return afterTextChangedEditableParam; + } +} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/AndroidRes.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/AndroidRes.java index b98f8777b4..b32b1b5824 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/AndroidRes.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/AndroidRes.java @@ -16,12 +16,9 @@ package org.androidannotations.model; import java.lang.annotation.Annotation; -import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; -import javax.lang.model.element.Element; - import org.androidannotations.annotations.res.AnimationRes; import org.androidannotations.annotations.res.BooleanRes; import org.androidannotations.annotations.res.ColorRes; @@ -77,6 +74,10 @@ public Res getRInnerClass() { return rInnerClass; } + public Class getAnnotationClass() { + return annotationClass; + } + public String getTarget() { return annotationClass.getName(); } @@ -88,15 +89,4 @@ public String getResourceMethodName() { public List getAllowedTypes() { return allowedTypes; } - - public int idFromElement(Element element) { - Annotation annotation = element.getAnnotation(annotationClass); - Method valueMethod = annotationClass.getMethods()[0]; - try { - return (Integer) valueMethod.invoke(annotation); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/AndroidSystemServices.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/AndroidSystemServices.java index eaac0ae632..21c01147b5 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/AndroidSystemServices.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/AndroidSystemServices.java @@ -20,7 +20,8 @@ import javax.lang.model.type.TypeMirror; -import org.androidannotations.processing.EBeanHolder; +import org.androidannotations.holder.EComponentHolder; + import com.sun.codemodel.JFieldRef; public class AndroidSystemServices { @@ -74,11 +75,11 @@ public String getServiceConstant(TypeMirror serviceType) { return registeredServices.get(serviceType.toString()); } - public JFieldRef getServiceConstant(TypeMirror serviceType, EBeanHolder holder) { - return extractIdStaticRef(holder, registeredServices.get(serviceType.toString())); + public JFieldRef getServiceConstant(TypeMirror serviceType, EComponentHolder holder) { + return extractIdStaticRef(holder, getServiceConstant(serviceType)); } - private JFieldRef extractIdStaticRef(EBeanHolder holder, String staticFieldQualifiedName) { + private JFieldRef extractIdStaticRef(EComponentHolder holder, String staticFieldQualifiedName) { if (staticFieldQualifiedName != null) { int fieldSuffix = staticFieldQualifiedName.lastIndexOf('.'); String fieldName = staticFieldQualifiedName.substring(fieldSuffix + 1); @@ -89,5 +90,4 @@ private JFieldRef extractIdStaticRef(EBeanHolder holder, String staticFieldQuali return null; } } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/ModelExtractor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/ModelExtractor.java index 9449d8b3d2..bbd4ab4b3f 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/ModelExtractor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/model/ModelExtractor.java @@ -114,18 +114,15 @@ private void extractAnnotations(AnnotationElementsHolder extractedModel, Set elements, TypeElement element) { - if (element instanceof TypeElement) { - TypeElement typeElement = element; - TypeMirror ancestorTypeMirror = typeElement.getSuperclass(); - - if (!isRootObjectClass(ancestorTypeMirror) && ancestorTypeMirror instanceof DeclaredType) { - DeclaredType ancestorDeclaredType = (DeclaredType) ancestorTypeMirror; - Element ancestorElement = ancestorDeclaredType.asElement(); - if (ancestorElement instanceof TypeElement) { - elements.add((TypeElement) ancestorElement); - addAncestorsElements(elements, (TypeElement) ancestorElement); - } + private void addAncestorsElements(Set elements, TypeElement typeElement) { + TypeMirror ancestorTypeMirror = typeElement.getSuperclass(); + + if (!isRootObjectClass(ancestorTypeMirror) && ancestorTypeMirror instanceof DeclaredType) { + DeclaredType ancestorDeclaredType = (DeclaredType) ancestorTypeMirror; + Element ancestorElement = ancestorDeclaredType.asElement(); + if (ancestorElement instanceof TypeElement) { + elements.add((TypeElement) ancestorElement); + addAncestorsElements(elements, (TypeElement) ancestorElement); } } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/IsValid.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/IsValid.java similarity index 94% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/IsValid.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/IsValid.java index 9ca574ff3a..f46d1e0b1c 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/IsValid.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/IsValid.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.process; public class IsValid { diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/ModelProcessor.java similarity index 61% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/ModelProcessor.java index 9aad843c6a..cd0fe5b966 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ModelProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/ModelProcessor.java @@ -13,17 +13,20 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.process; -import java.util.ArrayList; -import java.util.List; import java.util.Set; +import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; +import org.androidannotations.handler.AnnotationHandler; +import org.androidannotations.handler.AnnotationHandlers; +import org.androidannotations.handler.GeneratingAnnotationHandler; +import org.androidannotations.holder.GeneratedClassHolder; import org.androidannotations.exception.ProcessingException; import org.androidannotations.model.AnnotationElements; import org.androidannotations.model.AnnotationElements.AnnotatedAndRootElements; @@ -49,25 +52,22 @@ public ProcessResult(// } } - private final List enclosedProcessors = new ArrayList(); - private final List typeProcessors = new ArrayList(); + private final ProcessingEnvironment processingEnv; + private final AnnotationHandlers annotationHandlers; - public void register(DecoratingElementProcessor processor) { - enclosedProcessors.add(processor); - } - - public void register(GeneratingElementProcessor processor) { - typeProcessors.add(processor); + public ModelProcessor(ProcessingEnvironment processingEnv, AnnotationHandlers annotationHandlers) { + this.processingEnv = processingEnv; + this.annotationHandlers = annotationHandlers; } + @SuppressWarnings({ "unchecked", "rawtypes" }) public ProcessResult process(AnnotationElements validatedModel) throws ProcessingException, Exception { + ProcessHolder processHolder = new ProcessHolder(processingEnv); - JCodeModel codeModel = new JCodeModel(); - - EBeansHolder eBeansHolder = new EBeansHolder(codeModel); + annotationHandlers.setProcessHolder(processHolder); - for (GeneratingElementProcessor processor : typeProcessors) { - String annotationName = processor.getTarget(); + for (GeneratingAnnotationHandler generatingAnnotationHandler : annotationHandlers.getGenerating()) { + String annotationName = generatingAnnotationHandler.getTarget(); Set annotatedElements = validatedModel.getRootAnnotatedElements(annotationName); for (Element annotatedElement : annotatedElements) { /* @@ -76,7 +76,10 @@ public ProcessResult process(AnnotationElements validatedModel) throws Processin * extend them). */ if (!isAbstractClass(annotatedElement)) { - processThrowing(processor, annotatedElement, codeModel, eBeansHolder); + TypeElement typeElement = (TypeElement) annotatedElement; + GeneratedClassHolder generatedClassHolder = generatingAnnotationHandler.createGeneratedClassHolder(processHolder, typeElement); + processHolder.put(annotatedElement, generatedClassHolder); + processThrowing(generatingAnnotationHandler, annotatedElement, generatedClassHolder); } } /* @@ -85,22 +88,22 @@ public ProcessResult process(AnnotationElements validatedModel) throws Processin */ } - for (DecoratingElementProcessor processor : enclosedProcessors) { - String annotationName = processor.getTarget(); + for (AnnotationHandler annotationHandler : annotationHandlers.getDecorating()) { + String annotationName = annotationHandler.getTarget(); /* - * For ancestors, the processor manipulates the annotated elements, - * but uses the holder for the root element + * For ancestors, the annotationHandler manipulates the annotated + * elements, but uses the holder for the root element */ Set ancestorAnnotatedElements = validatedModel.getAncestorAnnotatedElements(annotationName); for (AnnotatedAndRootElements elements : ancestorAnnotatedElements) { - EBeanHolder holder = eBeansHolder.getEBeanHolder(elements.rootTypeElement); + GeneratedClassHolder holder = processHolder.getGeneratedClassHolder(elements.rootTypeElement); /* * Annotations coming from ancestors may be applied to root * elements that are not validated, and therefore not available. */ if (holder != null) { - processThrowing(processor, elements.annotatedElement, codeModel, holder); + processThrowing(annotationHandler, elements.annotatedElement, holder); } } @@ -120,30 +123,22 @@ public ProcessResult process(AnnotationElements validatedModel) throws Processin * classes, because the generated classes are final anyway */ if (!isAbstractClass(enclosingElement)) { - EBeanHolder holder = eBeansHolder.getEBeanHolder(enclosingElement); - processThrowing(processor, annotatedElement, codeModel, holder); + GeneratedClassHolder holder = processHolder.getGeneratedClassHolder(enclosingElement); + processThrowing(annotationHandler, annotatedElement, holder); } } } return new ProcessResult(// - codeModel, // - eBeansHolder.getOriginatingElements(), // - eBeansHolder.getApiClassesToGenerate()); - } - - private void processThrowing(GeneratingElementProcessor processor, Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception, ProcessingException { - try { - processor.process(element, codeModel, eBeansHolder); - } catch (Exception e) { - throw new ProcessingException(e, element); - } + processHolder.codeModel(), // + processHolder.getOriginatingElements(), // + processHolder.getApiClassesToGenerate()); } - private void processThrowing(DecoratingElementProcessor processor, Element element, JCodeModel codeModel, EBeanHolder eBeanHolder) throws Exception, ProcessingException { + private void processThrowing(AnnotationHandler handler, Element element, T generatedClassHolder) throws ProcessingException { try { - processor.process(element, codeModel, eBeanHolder); + handler.process(element, generatedClassHolder); } catch (Exception e) { throw new ProcessingException(e, element); } @@ -158,4 +153,5 @@ private boolean isAbstractClass(Element annotatedElement) { return false; } } + } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ModelValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/ModelValidator.java similarity index 71% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ModelValidator.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/ModelValidator.java index 295aa08c82..cd9a3dcef3 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ModelValidator.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/ModelValidator.java @@ -13,25 +13,25 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.validation; +package org.androidannotations.process; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; import javax.lang.model.element.Element; +import org.androidannotations.handler.AnnotationHandler; +import org.androidannotations.handler.AnnotationHandlers; import org.androidannotations.exception.ProcessingException; import org.androidannotations.model.AnnotationElements; import org.androidannotations.model.AnnotationElementsHolder; public class ModelValidator { - private List validators = new ArrayList(); + private AnnotationHandlers annotationHandlers; - public void register(ElementValidator validator) { - validators.add(validator); + public ModelValidator(AnnotationHandlers annotationHandlers) { + this.annotationHandlers = annotationHandlers; } public AnnotationElements validate(AnnotationElementsHolder extractedModel) throws ProcessingException, Exception { @@ -43,8 +43,8 @@ public AnnotationElements validate(AnnotationElementsHolder extractedModel) thro */ AnnotationElementsHolder validatedElements = extractedModel.validatingHolder(); - for (ElementValidator validator : validators) { - String annotationName = validator.getTarget(); + for (AnnotationHandler annotationHandler : annotationHandlers.get()) { + String annotationName = annotationHandler.getTarget(); Set annotatedElements = extractedModel.getRootAnnotatedElements(annotationName); @@ -53,7 +53,7 @@ public AnnotationElements validate(AnnotationElementsHolder extractedModel) thro validatedElements.putRootAnnotatedElements(annotationName, validatedAnnotatedElements); for (Element annotatedElement : annotatedElements) { - if (validateThrowing(validator, annotatedElement, validatedElements)) { + if (validateThrowing(annotationHandler, annotatedElement, validatedElements)) { validatedAnnotatedElements.add(annotatedElement); } } @@ -61,9 +61,9 @@ public AnnotationElements validate(AnnotationElementsHolder extractedModel) thro return validatedElements; } - private boolean validateThrowing(ElementValidator validator, Element element, AnnotationElements validatedElements) throws Exception, ProcessingException { + private boolean validateThrowing(AnnotationHandler handler, Element element, AnnotationElements validatedElements) throws Exception, ProcessingException { try { - return validator.validate(element, validatedElements); + return handler.validate(element, validatedElements); } catch (Exception e) { throw new ProcessingException(e, element); } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OriginatingElements.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/OriginatingElements.java similarity index 97% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OriginatingElements.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/OriginatingElements.java index ba2e93b950..cff4827a33 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OriginatingElements.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/OriginatingElements.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.process; import java.util.ArrayList; import java.util.HashMap; diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/ProcessHolder.java similarity index 83% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/ProcessHolder.java index e0d2a2f35e..12640b7811 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeansHolder.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/ProcessHolder.java @@ -13,28 +13,21 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.processing; +package org.androidannotations.process; +import com.sun.codemodel.*; +import org.androidannotations.helper.CanonicalNameConstants; +import org.androidannotations.holder.GeneratedClassHolder; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.Element; import java.io.FileInputStream; import java.io.InputStream; import java.io.Serializable; -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 java.util.*; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JClassAlreadyExistsException; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; - -public class EBeansHolder { +public class ProcessHolder { public class Classes { @@ -48,11 +41,15 @@ public class Classes { public final JClass CLASS_CAST_EXCEPTION = refClass(ClassCastException.class); public final JClass SERIALIZABLE = refClass(Serializable.class); public final JClass STRING = refClass(String.class); + public final JClass STRING_BUILDER = refClass(StringBuilder.class); public final JClass SYSTEM = refClass(System.class); public final JClass INPUT_STREAM = refClass(InputStream.class); public final JClass FILE_INPUT_STREAM = refClass(FileInputStream.class); public final JClass SQL_EXCEPTION = refClass(SQLException.class); + public final JClass COLLECTIONS = refClass(Collections.class); public final JClass THREAD = refClass(Thread.class); + public final JClass HASH_MAP = refClass(HashMap.class); + public final JClass LIST = refClass(List.class); /* * Android @@ -66,6 +63,7 @@ public class Classes { public final JClass ON_SEEKBAR_CHANGE_LISTENER = refClass(CanonicalNameConstants.ON_SEEKBAR_CHANGE_LISTENER); public final JClass TEXT_VIEW = refClass(CanonicalNameConstants.TEXT_VIEW); public final JClass COMPOUND_BUTTON = refClass(CanonicalNameConstants.COMPOUND_BUTTON); + public final JClass COMPOUND_BUTTON_ON_CHECKED_CHANGE_LISTENER = refClass(CanonicalNameConstants.COMPOUND_BUTTON_ON_CHECKED_CHANGE_LISTENER); public final JClass VIEW = refClass(CanonicalNameConstants.VIEW); public final JClass VIEW_ON_CLICK_LISTENER = refClass(CanonicalNameConstants.VIEW_ON_CLICK_LISTENER); public final JClass VIEW_ON_TOUCH_LISTENER = refClass(CanonicalNameConstants.VIEW_ON_TOUCH_LISTENER); @@ -153,12 +151,22 @@ public class Classes { public final JClass SINGLE_CLIENT_CONN_MANAGER = refClass(CanonicalNameConstants.SINGLE_CLIENT_CONN_MANAGER); /* - * Springframework + * SpringFramework */ + public final JClass REST_TEMPLATE = refClass(CanonicalNameConstants.REST_TEMPLATE); + public final JClass HTTP_METHOD = refClass(CanonicalNameConstants.HTTP_METHOD); + public final JClass HTTP_ENTITY = refClass(CanonicalNameConstants.HTTP_ENTITY); + public final JClass HTTP_HEADERS = refClass(CanonicalNameConstants.HTTP_HEADERS); + public final JClass MEDIA_TYPE = refClass(CanonicalNameConstants.MEDIA_TYPE); + public final JClass RESPONSE_ENTITY = refClass(CanonicalNameConstants.RESPONSE_ENTITY); + public final JClass HTTP_AUTHENTICATION = refClass(CanonicalNameConstants.HTTP_AUTHENTICATION); + public final JClass HTTP_BASIC_AUTHENTICATION = refClass(CanonicalNameConstants.HTTP_BASIC_AUTHENTICATION); public final JClass REST_CLIENT_EXCEPTION = refClass(CanonicalNameConstants.REST_CLIENT_EXCEPTION); } - private final Map eBeanHolders = new HashMap(); + private final Map generatedClassHolders = new HashMap(); + + private final ProcessingEnvironment processingEnvironment; private final JCodeModel codeModel; @@ -170,8 +178,9 @@ public class Classes { private final OriginatingElements originatingElements = new OriginatingElements(); - public EBeansHolder(JCodeModel codeModel) { - this.codeModel = codeModel; + public ProcessHolder(ProcessingEnvironment processingEnvironment) { + this.processingEnvironment = processingEnvironment; + this.codeModel = new JCodeModel(); classes = new Classes(); refClass(CanonicalNameConstants.STRING); preloadJavaLangClasses(); @@ -182,19 +191,19 @@ private void preloadJavaLangClasses() { loadedClasses.put(Object.class.getName(), refClass(Object.class)); } - public EBeanHolder create(Element element, Class eBeanAnnotation, JDefinedClass generatedClass) { + public void put(Element element, GeneratedClassHolder generatedClassHolder) { + + JDefinedClass generatedClass = generatedClassHolder.getGeneratedClass(); String qualifiedName = generatedClass.fullName(); originatingElements.add(qualifiedName, element); - EBeanHolder activityHolder = new EBeanHolder(this, eBeanAnnotation, generatedClass); - eBeanHolders.put(element, activityHolder); - return activityHolder; + generatedClassHolders.put(element, generatedClassHolder); } - public EBeanHolder getEBeanHolder(Element element) { - return eBeanHolders.get(element); + public GeneratedClassHolder getGeneratedClassHolder(Element element) { + return generatedClassHolders.get(element); } public JClass refClass(Class clazz) { @@ -236,6 +245,10 @@ public JDefinedClass definedClass(String fullyQualifiedClassName) { return refClass; } + public ProcessingEnvironment processingEnvironment() { + return processingEnvironment; + } + public JCodeModel codeModel() { return codeModel; } @@ -256,5 +269,4 @@ 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/helper/TimeStats.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/TimeStats.java similarity index 98% rename from AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/TimeStats.java rename to AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/TimeStats.java index e559c04837..e2f067d953 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/TimeStats.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/process/TimeStats.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations under * the License. */ -package org.androidannotations.helper; +package org.androidannotations.process; import java.util.ArrayList; import java.util.Collections; diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AbstractListenerProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AbstractListenerProcessor.java deleted file mode 100644 index bf182239bd..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AbstractListenerProcessor.java +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr.invoke; - -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.VariableElement; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.processing.EBeansHolder.Classes; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; - -public abstract class AbstractListenerProcessor implements DecoratingElementProcessor { - - private IdAnnotationHelper helper; - protected Classes classes; - protected JCodeModel codeModel; - protected EBeanHolder holder; - - public AbstractListenerProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - helper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - classes = holder.classes(); - this.codeModel = codeModel; - this.holder = holder; - - String methodName = element.getSimpleName().toString(); - - ExecutableElement executableElement = (ExecutableElement) element; - List parameters = executableElement.getParameters(); - TypeMirror returnType = executableElement.getReturnType(); - - List idsRefs = helper.extractAnnotationFieldRefs(holder, element, Res.ID, true); - - JDefinedClass listenerAnonymousClass = codeModel.anonymousClass(getListenerClass()); - JMethod listenerMethod = createListenerMethod(listenerAnonymousClass); - listenerMethod.annotate(Override.class); - - JBlock listenerMethodBody = listenerMethod.body(); - - JExpression activityRef = holder.generatedClass.staticRef("this"); - JInvocation call = invoke(activityRef, methodName); - - makeCall(listenerMethodBody, call, returnType); - - processParameters(listenerMethod, call, parameters); - - for (JFieldRef idRef : idsRefs) { - if (idRef != null) { - ViewChangedHolder onViewChanged = holder.onViewChanged(); - - JBlock block = onViewChanged.body().block(); - JInvocation view = onViewChanged.findViewById(idRef); - block._if(view.ne(_null()))._then().invoke(castWidget(view), getSetterName()).arg(_new(listenerAnonymousClass)); - } - } - } - - protected abstract void makeCall(JBlock listenerMethodBody, JInvocation call, TypeMirror returnType); - - protected abstract void processParameters(JMethod listenerMethod, JInvocation call, List userParameters); - - protected abstract JMethod createListenerMethod(JDefinedClass listenerAnonymousClass); - - protected abstract String getSetterName(); - - protected abstract JClass getListenerClass(); - - protected JExpression castWidget(JInvocation view) { - return view; - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AbstractOptionsMenuProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AbstractOptionsMenuProcessor.java deleted file mode 100644 index fa27a7af29..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AbstractOptionsMenuProcessor.java +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.invoke; -import static com.sun.codemodel.JMod.PUBLIC; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.EFragment; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.ThirdPartyLibHelper; -import org.androidannotations.processing.EBeansHolder.Classes; -import org.androidannotations.rclass.IRClass; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JType; -import com.sun.codemodel.JVar; - -public abstract class AbstractOptionsMenuProcessor implements DecoratingElementProcessor { - - protected final ThirdPartyLibHelper libHelper; - protected final IdAnnotationHelper annotationHelper; - - public AbstractOptionsMenuProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - libHelper = new ThirdPartyLibHelper(annotationHelper); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - if (holder.onCreateOptionMenuMethodBody == null) { - Classes classes = holder.classes(); - - boolean isFragment = holder.eBeanAnnotation == EFragment.class; - - JClass menuClass; - JClass menuInflaterClass; - String getMenuInflaterMethodName; - if (libHelper.usesActionBarSherlock(holder)) { - menuClass = classes.SHERLOCK_MENU; - menuInflaterClass = classes.SHERLOCK_MENU_INFLATER; - getMenuInflaterMethodName = "getSupportMenuInflater"; - } else { - menuClass = classes.MENU; - menuInflaterClass = classes.MENU_INFLATER; - getMenuInflaterMethodName = "getMenuInflater"; - } - - JType returnType; - if (isFragment) { - returnType = codeModel.VOID; - } else { - returnType = codeModel.BOOLEAN; - } - - JBlock body; - JVar menuInflater; - JVar menuParam; - - JMethod method = holder.generatedClass.method(PUBLIC, returnType, "onCreateOptionsMenu"); - method.annotate(Override.class); - - menuParam = method.param(menuClass, "menu"); - - JBlock methodBody = method.body(); - - if (isFragment) { - menuInflater = method.param(menuInflaterClass, "inflater"); - } else { - menuInflater = methodBody.decl(menuInflaterClass, "menuInflater", invoke(getMenuInflaterMethodName)); - } - - body = methodBody.block(); - - JInvocation superCall = invoke(JExpr._super(), method); - superCall.arg(menuParam); - - if (isFragment) { - superCall.arg(menuInflater); - methodBody.add(superCall); - } else { - methodBody._return(superCall); - } - - if (isFragment) { - holder.initBody.invoke("setHasOptionsMenu").arg(JExpr.TRUE); - } - - holder.onCreateOptionMenuMethodBody = body; - holder.onCreateOptionMenuMenuInflaterVariable = menuInflater; - holder.onCreateOptionMenuMenuParam = menuParam; - } - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AbstractTrackingTouchProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AbstractTrackingTouchProcessor.java deleted file mode 100644 index 9868fedb94..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AbstractTrackingTouchProcessor.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -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.VariableElement; - -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.OnSeekBarChangeListenerHelper; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -/** - * Note: this could probably be moved to a helper, rather then being an abstract - * class (favor composition over inheritance) - * - */ -public abstract class AbstractTrackingTouchProcessor implements DecoratingElementProcessor { - - private final OnSeekBarChangeListenerHelper helper; - - private final APTCodeModelHelper codeModelHelper; - - public AbstractTrackingTouchProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - codeModelHelper = new APTCodeModelHelper(); - helper = new OnSeekBarChangeListenerHelper(processingEnv, getTarget(), rClass, codeModelHelper); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - String methodName = element.getSimpleName().toString(); - - List idsRefs = helper.extractAnnotationFieldRefs(holder, element, Res.ID, true); - - for (JFieldRef idRef : idsRefs) { - OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder = helper.getOrCreateListener(codeModel, holder, idRef); - - JInvocation textChangeCall; - JMethod methodToCall = getMethodToCall(onSeekBarChangeListenerHolder); - - JBlock previousBody = codeModelHelper.removeBody(methodToCall); - JBlock methodBody = methodToCall.body(); - - methodBody.add(previousBody); - JExpression activityRef = holder.generatedClass.staticRef("this"); - textChangeCall = methodBody.invoke(activityRef, methodName); - - ExecutableElement executableElement = (ExecutableElement) element; - List parameters = executableElement.getParameters(); - - if (parameters.size() == 1) { - JVar progressParameter = codeModelHelper.findParameterByName(methodToCall, "seekBar"); - textChangeCall.arg(progressParameter); - } - } - - } - - protected abstract JMethod getMethodToCall(OnSeekBarChangeListenerHolder onSeekBarChangeListenerHolder); -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AfterInjectProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AfterInjectProcessor.java deleted file mode 100644 index 3bba64cf75..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AfterInjectProcessor.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.AfterInject; - -import com.sun.codemodel.JCodeModel; - -public class AfterInjectProcessor implements DecoratingElementProcessor { - - @Override - public String getTarget() { - return AfterInject.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - String methodName = element.getSimpleName().toString(); - - holder.initBody.invoke(methodName); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AfterTextChangeProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AfterTextChangeProcessor.java deleted file mode 100644 index d06698b9f5..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AfterTextChangeProcessor.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -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.VariableElement; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.AfterTextChange; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.TextWatcherHelper; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -/** - */ -public class AfterTextChangeProcessor implements DecoratingElementProcessor { - - private final TextWatcherHelper helper; - - private final APTCodeModelHelper codeModelHelper; - - public AfterTextChangeProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - codeModelHelper = new APTCodeModelHelper(); - helper = new TextWatcherHelper(processingEnv, getTarget(), rClass, codeModelHelper); - } - - @Override - public String getTarget() { - return AfterTextChange.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - String methodName = element.getSimpleName().toString(); - - ExecutableElement executableElement = (ExecutableElement) element; - List parameters = executableElement.getParameters(); - - int editableParameterPosition = -1; - int viewParameterPosition = -1; - TypeMirror viewParameterType = null; - - for (int i = 0; i < parameters.size(); i++) { - VariableElement parameter = parameters.get(i); - TypeMirror parameterType = parameter.asType(); - - if (CanonicalNameConstants.EDITABLE.equals(parameterType.toString())) { - editableParameterPosition = i; - } else { - TypeMirror textViewType = helper.typeElementFromQualifiedName(CanonicalNameConstants.TEXT_VIEW).asType(); - if (helper.isSubtype(parameterType, textViewType)) { - viewParameterPosition = i; - viewParameterType = parameterType; - } - } - - } - - List idsRefs = helper.extractAnnotationFieldRefs(holder, element, Res.ID, true); - - for (JFieldRef idRef : idsRefs) { - TextWatcherHolder textWatcherHolder = helper.getOrCreateListener(codeModel, holder, idRef, viewParameterType); - - JInvocation textChangeCall; - JMethod methodToCall = textWatcherHolder.afterTextChangedMethod; - - JBlock previousBody = codeModelHelper.removeBody(methodToCall); - JBlock methodBody = methodToCall.body(); - - methodBody.add(previousBody); - JExpression activityRef = holder.generatedClass.staticRef("this"); - textChangeCall = methodBody.invoke(activityRef, methodName); - - for (int i = 0; i < parameters.size(); i++) { - if (i == editableParameterPosition) { - JVar afterTextChangeEditableParam = codeModelHelper.findParameterByName(methodToCall, "s"); - textChangeCall.arg(afterTextChangeEditableParam); - } else if (i == viewParameterPosition) { - JVar viewParameter = textWatcherHolder.viewVariable; - textChangeCall.arg(viewParameter); - } - } - - } - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AfterViewsProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AfterViewsProcessor.java deleted file mode 100644 index 3053f437e3..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AfterViewsProcessor.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.AfterViews; - -import com.sun.codemodel.JCodeModel; - -public class AfterViewsProcessor implements DecoratingElementProcessor { - - @Override - public String getTarget() { - return AfterViews.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - String methodName = element.getSimpleName().toString(); - - holder.onViewChanged().body().invoke(methodName); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AppProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AppProcessor.java deleted file mode 100644 index e4f2198462..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/AppProcessor.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.ref; - -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.App; -import org.androidannotations.helper.ModelConstants; - -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; - -public class AppProcessor implements DecoratingElementProcessor { - - @Override - public String getTarget() { - return App.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - String applicationQualifiedName = element.asType().toString(); - JClass applicationClass = holder.refClass(applicationQualifiedName + ModelConstants.GENERATION_SUFFIX); - - String fieldName = element.getSimpleName().toString(); - - holder.initBody.assign(ref(fieldName), applicationClass.staticInvoke(EApplicationProcessor.GET_APPLICATION_INSTANCE)); - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/CustomTitleProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/CustomTitleProcessor.java deleted file mode 100644 index 5bc460a1ae..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/CustomTitleProcessor.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.CustomTitle; -import org.androidannotations.helper.AnnotationHelper; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JFieldRef; - -public class CustomTitleProcessor implements DecoratingElementProcessor { - private final AnnotationHelper annotationHelper; - private final IRClass rClass; - - public CustomTitleProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new AnnotationHelper(processingEnv); - this.rClass = rClass; - } - - @Override - public String getTarget() { - return CustomTitle.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - JFieldRef customTitleFeature = holder.classes().WINDOW.staticRef("FEATURE_CUSTOM_TITLE"); - - holder.initBody.invoke("requestWindowFeature").arg(customTitleFeature); - JFieldRef contentViewId = annotationHelper.extractAnnotationFieldRefs(holder, element, getTarget(), rClass.get(Res.LAYOUT), false).get(0); - holder.onViewChanged().body().add(holder.contextRef.invoke("getWindow").invoke("setFeatureInt").arg(customTitleFeature).arg(contentViewId)); - } -} \ No newline at end of file diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EActivityProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EActivityProcessor.java deleted file mode 100644 index 498e6dc102..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EActivityProcessor.java +++ /dev/null @@ -1,263 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._super; -import static com.sun.codemodel.JExpr._this; -import static com.sun.codemodel.JMod.FINAL; -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.util.ArrayList; -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.Modifier; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeKind; -import javax.lang.model.util.ElementFilter; - -import org.androidannotations.annotations.EActivity; -import org.androidannotations.api.SdkVersionHelper; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.AndroidManifest; -import org.androidannotations.helper.AnnotationHelper; -import org.androidannotations.helper.CanonicalNameConstants; -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; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JType; -import com.sun.codemodel.JVar; - -public class EActivityProcessor implements GeneratingElementProcessor { - - private static final int MIN_SDK_WITH_FRAGMENT_SUPPORT = 11; - private final IRClass rClass; - private List greendroidActivityElements; - - private final AnnotationHelper annotationHelper; - - private final ProcessingEnvironment processingEnv; - private final APTCodeModelHelper aptCodeModelHelper; - private AndroidManifest androidManifest; - - public EActivityProcessor(ProcessingEnvironment processingEnv, IRClass rClass, AndroidManifest androidManifest) { - this.processingEnv = processingEnv; - this.rClass = rClass; - this.androidManifest = androidManifest; - annotationHelper = new AnnotationHelper(processingEnv); - aptCodeModelHelper = new APTCodeModelHelper(); - - greendroidActivityElements = new ArrayList(); - for (String greendroidActivityName : GREENDROID_ACTIVITIES_LIST_CLASS) { - TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(greendroidActivityName); - if (typeElement != null) { - greendroidActivityElements.add(typeElement); - } - } - } - - @Override - public String getTarget() { - return EActivity.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - TypeElement typeElement = (TypeElement) element; - - String annotatedActivityQualifiedName = typeElement.getQualifiedName().toString(); - - String subActivityQualifiedName = annotatedActivityQualifiedName + ModelConstants.GENERATION_SUFFIX; - - JDefinedClass generatedClass = codeModel._class(PUBLIC | FINAL, subActivityQualifiedName, ClassType.CLASS); - - EBeanHolder holder = eBeansHolder.create(element, EActivity.class, generatedClass); - - JClass annotatedActivity = codeModel.directClass(annotatedActivityQualifiedName); - - holder.generatedClass._extends(annotatedActivity); - - holder.contextRef = _this(); - - JClass bundleClass = holder.classes().BUNDLE; - - // beforeSetContentView - JMethod init = holder.generatedClass.method(PRIVATE, codeModel.VOID, "init_"); - holder.initBody = init.body(); - holder.beforeCreateSavedInstanceStateParam = init.param(bundleClass, "savedInstanceState"); - - { - // init if activity - holder.initIfActivityBody = holder.initBody; - holder.initActivityRef = _this(); - } - - // onCreate - JMethod onCreate = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onCreate"); - onCreate.annotate(Override.class); - JVar onCreateSavedInstanceState = onCreate.param(bundleClass, "savedInstanceState"); - - boolean usesGreenDroid = usesGreenDroid(typeElement); - - // onCreateBody - { - JBlock onCreateBody = onCreate.body(); - - JVar previousNotifier = holder.replacePreviousNotifier(onCreateBody); - - onCreateBody.invoke(init).arg(onCreateSavedInstanceState); - - onCreateBody.invoke(_super(), onCreate).arg(onCreateSavedInstanceState); - - holder.resetPreviousNotifier(onCreateBody, previousNotifier); - - List fieldRefs = annotationHelper.extractAnnotationFieldRefs(holder, element, getTarget(), rClass.get(Res.LAYOUT), false); - - JFieldRef contentViewId; - if (fieldRefs.size() == 1) { - contentViewId = fieldRefs.get(0); - } else { - contentViewId = null; - } - - if (contentViewId != null) { - // GreenDroid support - if (usesGreenDroid) { - onCreateBody.invoke("setActionBarContentView").arg(contentViewId); - } else { - onCreateBody.invoke("setContentView").arg(contentViewId); - } - } - } - - // Overriding setContentView (with layout id param) - JClass layoutParamsClass = holder.classes().VIEW_GROUP_LAYOUT_PARAMS; - - String setContentViewMethodName; - if (usesGreenDroid) { - setContentViewMethodName = "setActionBarContentView"; - } else { - setContentViewMethodName = "setContentView"; - } - - setContentViewMethod(setContentViewMethodName, codeModel, holder, new JType[] { codeModel.INT }, new String[] { "layoutResID" }); - setContentViewMethod(setContentViewMethodName, codeModel, holder, new JType[] { holder.classes().VIEW, layoutParamsClass }, new String[] { "view", "params" }); - setContentViewMethod(setContentViewMethodName, codeModel, holder, new JType[] { holder.classes().VIEW }, new String[] { "view" }); - - // Handling onBackPressed - 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"); - JClass keyEventClass = holder.classes().KEY_EVENT; - JVar eventParam = onKeyDownMethod.param(keyEventClass, "event"); - - JClass versionHelperClass = holder.refClass(SdkVersionHelper.class); - - JInvocation sdkInt = versionHelperClass.staticInvoke("getSdkInt"); - - JBlock onKeyDownBody = onKeyDownMethod.body(); - - onKeyDownBody._if( // - sdkInt.lt(JExpr.lit(5)) // - .cand(keyCodeParam.eq(keyEventClass.staticRef("KEYCODE_BACK"))) // - .cand(eventParam.invoke("getRepeatCount").eq(JExpr.lit(0)))) // - ._then() // - .invoke("onBackPressed"); - - onKeyDownBody._return( // - JExpr._super().invoke(onKeyDownMethod) // - .arg(keyCodeParam) // - .arg(eventParam)); - - } - - boolean addFragmentIntent = androidManifest.getMinSdkVersion() >= MIN_SDK_WITH_FRAGMENT_SUPPORT; - aptCodeModelHelper.addActivityIntentBuilder(codeModel, holder, annotationHelper, addFragmentIntent); - } - - private void setContentViewMethod(String setContentViewMethodName, JCodeModel codeModel, EBeanHolder holder, JType[] paramTypes, String[] paramNames) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, setContentViewMethodName); - method.annotate(Override.class); - - ArrayList params = new ArrayList(); - for (int i = 0; i < paramTypes.length; i++) { - JVar param = method.param(paramTypes[i], paramNames[i]); - params.add(param); - } - JBlock body = method.body(); - JInvocation superCall = body.invoke(JExpr._super(), method); - for (JVar arg : params) { - superCall.arg(arg); - } - holder.invokeViewChanged(body); - } - - private ExecutableElement getOnBackPressedMethod(TypeElement activityElement) { - - List allMembers = annotationHelper.getElementUtils().getAllMembers(activityElement); - - List activityInheritedMethods = ElementFilter.methodsIn(allMembers); - - for (ExecutableElement activityInheritedMethod : activityInheritedMethods) { - if (isCustomOnBackPressedMethod(activityInheritedMethod)) { - return activityInheritedMethod; - } - } - return null; - } - - private boolean isCustomOnBackPressedMethod(ExecutableElement method) { - TypeElement methodClass = (TypeElement) method.getEnclosingElement(); - boolean methodBelongsToActivityClass = methodClass.getQualifiedName().toString().equals(CanonicalNameConstants.ACTIVITY); - return !methodBelongsToActivityClass // - && method.getSimpleName().toString().equals("onBackPressed") // - && method.getThrownTypes().size() == 0 // - && method.getModifiers().contains(Modifier.PUBLIC) // - && method.getReturnType().getKind().equals(TypeKind.VOID) // - && method.getParameters().size() == 0 // - ; - } - - private boolean usesGreenDroid(TypeElement typeElement) { - for (TypeElement greendroidActivityElement : greendroidActivityElements) { - if (processingEnv.getTypeUtils().isSubtype(typeElement.asType(), greendroidActivityElement.asType())) { - return true; - } - } - return false; - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EApplicationProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EApplicationProcessor.java deleted file mode 100644 index 33c36bac60..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EApplicationProcessor.java +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._super; -import static com.sun.codemodel.JExpr._this; -import static com.sun.codemodel.JMod.FINAL; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; -import static com.sun.codemodel.JMod.STATIC; - -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; - -import org.androidannotations.annotations.EApplication; -import org.androidannotations.helper.ModelConstants; - -import com.sun.codemodel.ClassType; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JVar; - -public class EApplicationProcessor implements GeneratingElementProcessor { - - public static final String GET_APPLICATION_INSTANCE = "getInstance"; - - @Override - public String getTarget() { - return EApplication.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - TypeElement typeElement = (TypeElement) element; - - String annotatedComponentQualifiedName = typeElement.getQualifiedName().toString(); - - String generatedComponentQualifiedName = annotatedComponentQualifiedName + ModelConstants.GENERATION_SUFFIX; - - JDefinedClass generatedClass = codeModel._class(PUBLIC | FINAL, generatedComponentQualifiedName, ClassType.CLASS); - EBeanHolder holder = eBeansHolder.create(element, EApplication.class, generatedClass); - - JClass annotatedComponent = codeModel.directClass(annotatedComponentQualifiedName); - - holder.generatedClass._extends(annotatedComponent); - - holder.contextRef = _this(); - - JFieldVar staticInstanceField = holder.generatedClass.field(PRIVATE | STATIC, annotatedComponent, "INSTANCE_"); - { - // Static singleton getter and setter - JMethod getInstance = holder.generatedClass.method(PUBLIC | JMod.STATIC, annotatedComponent, GET_APPLICATION_INSTANCE); - getInstance.body()._return(staticInstanceField); - - JMethod setInstance = holder.generatedClass.method(PUBLIC | JMod.STATIC, codeModel.VOID, "setForTesting"); - setInstance.javadoc().append("Visible for testing purposes"); - JVar applicationParam = setInstance.param(annotatedComponent, "application"); - setInstance.body().assign(staticInstanceField, applicationParam); - } - - JMethod init = holder.generatedClass.method(PRIVATE, codeModel.VOID, "init_"); - holder.initBody = init.body(); - { - // onCreate - JMethod onCreate = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onCreate"); - onCreate.annotate(Override.class); - JBlock onCreateBody = onCreate.body(); - onCreateBody.assign(staticInstanceField, _this()); - onCreateBody.invoke(init); - onCreateBody.invoke(_super(), onCreate); - } - - { - /* - * Setting to null shouldn't be a problem as long as we do not allow - * - * @Extra on this component - */ - holder.initIfActivityBody = null; - holder.initActivityRef = null; - } - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java deleted file mode 100644 index 7ca53b6c71..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanHolder.java +++ /dev/null @@ -1,220 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr._this; -import static com.sun.codemodel.JMod.FINAL; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; - -import java.lang.annotation.Annotation; -import java.util.HashMap; - -import javax.lang.model.element.Element; - -import org.androidannotations.api.view.HasViews; -import org.androidannotations.api.view.OnViewChangedListener; -import org.androidannotations.api.view.OnViewChangedNotifier; -import org.androidannotations.processing.EBeansHolder.Classes; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JSwitch; -import com.sun.codemodel.JVar; - -public class EBeanHolder { - - public final JDefinedClass generatedClass; - /** - * Only defined on activities - */ - public JVar beforeCreateSavedInstanceStateParam; - public JBlock initBody; - - public JBlock extrasNotNullBlock; - public JVar extras; - public JVar resources; - - public JMethod cast; - - public JFieldVar handler; - - public JBlock onOptionsItemSelectedIfElseBlock; - public JVar onOptionsItemSelectedItemId; - public JVar onOptionsItemSelectedItem; - - public JMethod restoreSavedInstanceStateMethod; - public JBlock saveInstanceStateBlock; - - public JBlock onResumeBlock; - public JBlock onDestroyBlock; - - public JExpression contextRef; - /** - * Should not be used by inner annotations that target services, broadcast - * receivers, and content providers - */ - public JBlock initIfActivityBody; - public JExpression initActivityRef; - - /** - * Only defined in activities - */ - public JDefinedClass intentBuilderClass; - - /** - * Only defined in activities - */ - public JFieldVar intentField; - - /** - * Only defined in activities - */ - public NonConfigurationHolder nonConfigurationHolder; - - /** - * TextWatchers by idRef - */ - public final HashMap textWatchers = new HashMap(); - - /** - * OnActivityResult byResultCode - */ - public final HashMap onActivityResultCases = new HashMap(); - - public JSwitch onActivityResultSwitch; - public JMethod onActivityResultMethod; - - /** - * onSeekBarChangeListeners by idRef - */ - public final HashMap onSeekBarChangeListeners = new HashMap(); - - public JVar fragmentArguments; - public JFieldVar fragmentArgumentsBuilderField; - public JMethod fragmentArgumentsInjectMethod; - public JBlock fragmentArgumentsNotNullBlock; - public JDefinedClass fragmentBuilderClass; - - public JMethod findNativeFragmentById; - public JMethod findSupportFragmentById; - public JMethod findNativeFragmentByTag; - public JMethod findSupportFragmentByTag; - - public JBlock onCreateOptionMenuMethodBody; - public JVar onCreateOptionMenuMenuInflaterVariable; - public JVar onCreateOptionMenuMenuParam; - - private final EBeansHolder eBeansHolder; - public final Class eBeanAnnotation; - - private ViewChangedHolder viewChangedHolder; - - public JVar onHandleIntentIntent; - public JBlock onHandleIntentBody; - - /** - * Only defined in beans that implement {@link HasViews} - */ - private JExpression notifier; - - public EBeanHolder(EBeansHolder eBeansHolder, Class eBeanAnnotation, JDefinedClass generatedClass) { - this.eBeansHolder = eBeansHolder; - this.eBeanAnnotation = eBeanAnnotation; - this.generatedClass = generatedClass; - } - - public Classes classes() { - return eBeansHolder.classes(); - } - - public JCodeModel codeModel() { - return eBeansHolder.codeModel(); - } - - public JClass refClass(String fullyQualifiedClassName) { - return eBeansHolder.refClass(fullyQualifiedClassName); - } - - public JClass refClass(Class clazz) { - return eBeansHolder.refClass(clazz); - } - - public JDefinedClass definedClass(String fullyQualifiedClassName) { - return eBeansHolder.definedClass(fullyQualifiedClassName); - } - - public void generateApiClass(Element originatingElement, Class apiClass) { - eBeansHolder.generateApiClass(originatingElement, apiClass); - } - - public ViewChangedHolder onViewChanged() { - - if (viewChangedHolder == null) { - JCodeModel codeModel = eBeansHolder.codeModel(); - - generatedClass._implements(OnViewChangedListener.class); - JMethod onViewChanged = generatedClass.method(PUBLIC, codeModel.VOID, "onViewChanged"); - onViewChanged.annotate(Override.class); - JVar onViewChangedHasViewsParam = onViewChanged.param(HasViews.class, "hasViews"); - JClass notifierClass = refClass(OnViewChangedNotifier.class); - initBody.staticInvoke(notifierClass, "registerOnViewChangedListener").arg(_this()); - - viewChangedHolder = new ViewChangedHolder(onViewChanged, onViewChangedHasViewsParam); - } - return viewChangedHolder; - } - - public void invokeViewChanged(JBlock block) { - block.invoke(notifier, "notifyViewChanged").arg(_this()); - } - - public JVar replacePreviousNotifier(JBlock block) { - JClass notifierClass = refClass(OnViewChangedNotifier.class); - if (notifier == null) { - notifier = generatedClass.field(PRIVATE | FINAL, notifierClass, "onViewChangedNotifier_", _new(notifierClass)); - generatedClass._implements(HasViews.class); - } - JVar previousNotifier = block.decl(notifierClass, "previousNotifier", notifierClass.staticInvoke("replaceNotifier").arg(notifier)); - return previousNotifier; - } - - public JVar replacePreviousNotifierWithNull(JBlock block) { - JClass notifierClass = refClass(OnViewChangedNotifier.class); - JVar previousNotifier = block.decl(notifierClass, "previousNotifier", notifierClass.staticInvoke("replaceNotifier").arg(_null())); - return previousNotifier; - } - - public void resetPreviousNotifier(JBlock block, JVar previousNotifier) { - JClass notifierClass = refClass(OnViewChangedNotifier.class); - block.staticInvoke(notifierClass, "replaceNotifier").arg(previousNotifier); - } - - public void wrapInitWithNotifier() { - JBlock initBlock = initBody; - JVar previousNotifier = replacePreviousNotifier(initBlock); - initBody = initBody.block(); - resetPreviousNotifier(initBlock, previousNotifier); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanProcessor.java deleted file mode 100644 index 7f1da39e9c..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EBeanProcessor.java +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JMod.FINAL; -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.util.List; - -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.TypeElement; -import javax.lang.model.util.ElementFilter; - -import org.androidannotations.annotations.EBean; -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; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -public class EBeanProcessor implements GeneratingElementProcessor { - - public static final String GET_INSTANCE_METHOD_NAME = "getInstance" + GENERATION_SUFFIX; - - @Override - public String getTarget() { - return EBean.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - TypeElement typeElement = (TypeElement) element; - - String eBeanQualifiedName = typeElement.getQualifiedName().toString(); - - String generatedBeanQualifiedName = eBeanQualifiedName + GENERATION_SUFFIX; - - JDefinedClass generatedClass = codeModel._class(PUBLIC | FINAL, generatedBeanQualifiedName, ClassType.CLASS); - - EBeanHolder holder = eBeansHolder.create(element, EBean.class, generatedClass); - - JClass eBeanClass = codeModel.directClass(eBeanQualifiedName); - - holder.generatedClass._extends(eBeanClass); - - Classes classes = holder.classes(); - - JFieldVar contextField = holder.generatedClass.field(PRIVATE, classes.CONTEXT, "context_"); - - holder.contextRef = contextField; - - JMethod init; - { - // init - init = holder.generatedClass.method(PRIVATE, codeModel.VOID, "init_"); - holder.initBody = init.body(); - } - - { - // init if activity - /* - * We suppress all warnings because we generate an unused warning - * that may or may not valid - */ - init.annotate(SuppressWarnings.class).param("value", "all"); - APTCodeModelHelper helper = new APTCodeModelHelper(); - holder.initIfActivityBody = helper.ifContextInstanceOfActivity(holder, holder.initBody); - holder.initActivityRef = helper.castContextToActivity(holder, holder.initIfActivityBody); - } - - EBean eBeanAnnotation = element.getAnnotation(EBean.class); - EBean.Scope eBeanScope = eBeanAnnotation.scope(); - boolean hasSingletonScope = eBeanScope == EBean.Scope.Singleton; - - { - // Constructor - - JMethod constructor = holder.generatedClass.constructor(PRIVATE); - - JVar constructorContextParam = constructor.param(classes.CONTEXT, "context"); - - JBlock constructorBody = constructor.body(); - - List constructors = ElementFilter.constructorsIn(element.getEnclosedElements()); - - ExecutableElement superConstructor = constructors.get(0); - - if (superConstructor.getParameters().size() == 1) { - constructorBody.invoke("super").arg(constructorContextParam); - } - - constructorBody.assign(contextField, constructorContextParam); - - if (!hasSingletonScope) { - constructorBody.invoke(init); - } - } - - { - // Factory method - - JMethod factoryMethod = holder.generatedClass.method(PUBLIC | STATIC, holder.generatedClass, GET_INSTANCE_METHOD_NAME); - - JVar factoryMethodContextParam = factoryMethod.param(classes.CONTEXT, "context"); - - JBlock factoryMethodBody = factoryMethod.body(); - - /* - * Singletons are bound to the application context - */ - if (hasSingletonScope) { - - JFieldVar instanceField = holder.generatedClass.field(PRIVATE | STATIC, holder.generatedClass, "instance_"); - - JBlock creationBlock = factoryMethodBody // - ._if(instanceField.eq(_null())) // - ._then(); - JVar previousNotifier = holder.replacePreviousNotifierWithNull(creationBlock); - creationBlock.assign(instanceField, _new(holder.generatedClass).arg(factoryMethodContextParam.invoke("getApplicationContext"))); - creationBlock.invoke(instanceField, init); - holder.resetPreviousNotifier(creationBlock, previousNotifier); - - factoryMethodBody._return(instanceField); - } else { - factoryMethodBody._return(_new(holder.generatedClass).arg(factoryMethodContextParam)); - } - } - - { - // rebind(Context) - JMethod rebindMethod = holder.generatedClass.method(PUBLIC, codeModel.VOID, "rebind"); - JVar contextParam = rebindMethod.param(classes.CONTEXT, "context"); - - /* - * No rebinding of context for singletons, their are bound to the - * application context - */ - if (!hasSingletonScope) { - JBlock body = rebindMethod.body(); - body.assign(contextField, contextParam); - body.invoke(init); - } - } - - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EFragmentProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EFragmentProcessor.java deleted file mode 100644 index a6053c380e..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EFragmentProcessor.java +++ /dev/null @@ -1,216 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.FALSE; -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr._super; -import static com.sun.codemodel.JExpr.invoke; -import static com.sun.codemodel.JMod.FINAL; -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 javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; - -import org.androidannotations.annotations.EFragment; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.ThirdPartyLibHelper; -import org.androidannotations.processing.EBeansHolder.Classes; -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; -import com.sun.codemodel.JClassAlreadyExistsException; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -public class EFragmentProcessor implements GeneratingElementProcessor { - - private final IdAnnotationHelper helper; - private ThirdPartyLibHelper holoEverywhereHelper; - - public EFragmentProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - helper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - holoEverywhereHelper = new ThirdPartyLibHelper(helper); - - } - - @Override - public String getTarget() { - return EFragment.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - TypeElement typeElement = (TypeElement) element; - - String beanQualifiedName = typeElement.getQualifiedName().toString(); - - String generatedBeanQualifiedName = beanQualifiedName + GENERATION_SUFFIX; - - JDefinedClass generatedClass = codeModel._class(PUBLIC | FINAL, generatedBeanQualifiedName, ClassType.CLASS); - - EBeanHolder holder = eBeansHolder.create(element, EFragment.class, generatedClass); - - JClass eBeanClass = codeModel.directClass(beanQualifiedName); - - holder.generatedClass._extends(eBeanClass); - - Classes classes = holder.classes(); - - JMethod init; - { - // init - init = holder.generatedClass.method(PRIVATE, codeModel.VOID, "init_"); - init.param(holder.classes().BUNDLE, "savedInstanceState"); - holder.initBody = init.body(); - } - - { - // onCreate() - - JMethod onCreate = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onCreate"); - onCreate.annotate(Override.class); - JVar onCreateSavedInstanceState = onCreate.param(classes.BUNDLE, "savedInstanceState"); - JBlock onCreateBody = onCreate.body(); - - JVar previousNotifier = holder.replacePreviousNotifier(onCreateBody); - - onCreateBody.invoke(init).arg(onCreateSavedInstanceState); - - onCreateBody.invoke(_super(), onCreate).arg(onCreateSavedInstanceState); - - holder.resetPreviousNotifier(onCreateBody, previousNotifier); - } - - holder.contextRef = invoke("getActivity"); - - // contentView - JFieldVar contentView = holder.generatedClass.field(PRIVATE, classes.VIEW, "contentView_"); - - { - // onCreateView() - JMethod onCreateView = holder.generatedClass.method(PUBLIC, classes.VIEW, "onCreateView"); - onCreateView.annotate(Override.class); - - JClass inflaterClass; - if (holoEverywhereHelper.usesHoloEverywhere(holder)) { - inflaterClass = classes.HOLO_EVERYWHERE_LAYOUT_INFLATER; - } else { - inflaterClass = classes.LAYOUT_INFLATER; - } - - JVar inflater = onCreateView.param(inflaterClass, "inflater"); - - JVar container = onCreateView.param(classes.VIEW_GROUP, "container"); - JVar savedInstanceState = onCreateView.param(classes.BUNDLE, "savedInstanceState"); - - JBlock body = onCreateView.body(); - body.assign(contentView, _super().invoke(onCreateView).arg(inflater).arg(container).arg(savedInstanceState)); - - JFieldRef contentViewId = helper.extractOneAnnotationFieldRef(holder, element, Res.LAYOUT, false); - - if (contentViewId != null) { - body._if(contentView.eq(_null())) // - ._then() // - .assign(contentView, inflater.invoke("inflate").arg(contentViewId).arg(container).arg(FALSE)); - } - - body._return(contentView); - } - - { - // onViewCreated - - JMethod onViewCreated = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onViewCreated"); - onViewCreated.annotate(Override.class); - JVar view = onViewCreated.param(classes.VIEW, "view"); - JVar savedInstanceState = onViewCreated.param(classes.BUNDLE, "savedInstanceState"); - - JBlock onViewCreatedBody = onViewCreated.body(); - - onViewCreatedBody.invoke(_super(), onViewCreated).arg(view).arg(savedInstanceState); - - holder.invokeViewChanged(onViewCreatedBody); - } - - { - // findViewById - - JMethod findViewById = holder.generatedClass.method(PUBLIC, classes.VIEW, "findViewById"); - JVar idParam = findViewById.param(codeModel.INT, "id"); - - JBlock body = findViewById.body(); - - body._if(contentView.eq(_null())) // - ._then()._return(_null()); - - body._return(contentView.invoke(findViewById).arg(idParam)); - } - - { - // init if activity - holder.initIfActivityBody = holder.initBody; - holder.initActivityRef = holder.contextRef; - } - - addFragmentBuilder(codeModel, holder, eBeanClass); - } - - private void addFragmentBuilder(JCodeModel codeModel, EBeanHolder holder, JClass eBeanClass) throws JClassAlreadyExistsException { - JClass bundleClass = holder.classes().BUNDLE; - - { - holder.fragmentBuilderClass = holder.generatedClass._class(PUBLIC | STATIC, "FragmentBuilder_"); - holder.fragmentArgumentsBuilderField = holder.fragmentBuilderClass.field(PRIVATE, bundleClass, "args_"); - - { - // Constructor - JMethod constructor = holder.fragmentBuilderClass.constructor(PRIVATE); - JBlock constructorBody = constructor.body(); - constructorBody.assign(holder.fragmentArgumentsBuilderField, _new(bundleClass)); - } - - { - // build() - JMethod method = holder.fragmentBuilderClass.method(PUBLIC, eBeanClass, "build"); - JBlock body = method.body(); - - JVar fragment = body.decl(holder.generatedClass, "fragment_", _new(holder.generatedClass)); - body.invoke(fragment, "setArguments").arg(holder.fragmentArgumentsBuilderField); - body._return(fragment); - } - - { - // create() - JMethod method = holder.generatedClass.method(STATIC | PUBLIC, holder.fragmentBuilderClass, "builder"); - method.body()._return(_new(holder.fragmentBuilderClass)); - } - } - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EIntentServiceProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EIntentServiceProcessor.java deleted file mode 100644 index 341498f748..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EIntentServiceProcessor.java +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._this; -import static com.sun.codemodel.JMod.FINAL; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; - -import org.androidannotations.annotations.EIntentService; -import org.androidannotations.helper.ModelConstants; - -import com.sun.codemodel.ClassType; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -public class EIntentServiceProcessor extends EServiceProcessor { - - public EIntentServiceProcessor(ProcessingEnvironment processingEnv) { - super(processingEnv); - } - - @Override - public String getTarget() { - return EIntentService.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - TypeElement typeElement = (TypeElement) element; - - String annotatedComponentQualifiedName = typeElement.getQualifiedName().toString(); - - String generatedComponentQualifiedName = annotatedComponentQualifiedName + ModelConstants.GENERATION_SUFFIX; - - JDefinedClass generatedClass = codeModel._class(PUBLIC | FINAL, generatedComponentQualifiedName, ClassType.CLASS); - - EBeanHolder holder = eBeansHolder.create(element, EIntentService.class, generatedClass); - - JClass annotatedComponent = codeModel.directClass(annotatedComponentQualifiedName); - - holder.generatedClass._extends(annotatedComponent); - - holder.contextRef = _this(); - - JMethod init = holder.generatedClass.method(PRIVATE, codeModel.VOID, "init_"); - holder.initBody = init.body(); - { - // onCreate - JMethod onCreate = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onCreate"); - onCreate.annotate(Override.class); - JBlock onCreateBody = onCreate.body(); - onCreateBody.invoke(init); - onCreateBody.invoke(JExpr._super(), onCreate); - } - - { - // onHandleIntent - JMethod onHandleIntent = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onHandleIntent"); - JVar intent = onHandleIntent.param(eBeansHolder.classes().INTENT, "intent"); - onHandleIntent.annotate(Override.class); - JBlock onHandleIntentBody = onHandleIntent.body(); - aptCodeModelHelper.callSuperMethod(onHandleIntent, holder, onHandleIntentBody); - - holder.onHandleIntentIntent = intent; - holder.onHandleIntentBody = onHandleIntentBody; - } - - { - /* - * Setting to null shouldn't be a problem as long as we don't allow - * - * @App and @Extra on this component - */ - holder.initIfActivityBody = null; - holder.initActivityRef = null; - } - - aptCodeModelHelper.addServiceIntentBuilder(codeModel, holder, annotationHelper); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EProviderProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EProviderProcessor.java deleted file mode 100644 index 0dd00fdee1..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EProviderProcessor.java +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._super; -import static com.sun.codemodel.JExpr.invoke; -import static com.sun.codemodel.JMod.FINAL; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; - -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; - -import org.androidannotations.annotations.EProvider; -import org.androidannotations.helper.ModelConstants; - -import com.sun.codemodel.ClassType; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JMethod; - -public class EProviderProcessor implements GeneratingElementProcessor { - - @Override - public String getTarget() { - return EProvider.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - TypeElement typeElement = (TypeElement) element; - - String annotatedComponentQualifiedName = typeElement.getQualifiedName().toString(); - - String generatedComponentQualifiedName = annotatedComponentQualifiedName + ModelConstants.GENERATION_SUFFIX; - - JDefinedClass generatedClass = codeModel._class(PUBLIC | FINAL, generatedComponentQualifiedName, ClassType.CLASS); - - EBeanHolder holder = eBeansHolder.create(element, EProvider.class, generatedClass); - - JClass annotatedComponent = codeModel.directClass(annotatedComponentQualifiedName); - - holder.generatedClass._extends(annotatedComponent); - - holder.contextRef = invoke("getContext"); - - JMethod init = holder.generatedClass.method(PRIVATE, codeModel.VOID, "init_"); - holder.initBody = init.body(); - { - // onCreate - JMethod onCreate = holder.generatedClass.method(PUBLIC, codeModel.BOOLEAN, "onCreate"); - onCreate.annotate(Override.class); - JBlock onCreateBody = onCreate.body(); - onCreateBody.invoke(init); - onCreateBody._return(invoke(_super(), onCreate)); - } - - { - /* - * Setting to null shouldn't be a problem as long as we don't allow - * - * @App and @Extra on this component - */ - holder.initIfActivityBody = null; - holder.initActivityRef = null; - } - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EReceiverProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EReceiverProcessor.java deleted file mode 100644 index 15e1b963b9..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EReceiverProcessor.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JMod.FINAL; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; - -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; - -import org.androidannotations.annotations.EReceiver; -import org.androidannotations.helper.ModelConstants; -import org.androidannotations.processing.EBeansHolder.Classes; - -import com.sun.codemodel.ClassType; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -public class EReceiverProcessor implements GeneratingElementProcessor { - - @Override - public String getTarget() { - return EReceiver.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - TypeElement typeElement = (TypeElement) element; - - String annotatedComponentQualifiedName = typeElement.getQualifiedName().toString(); - - String generatedComponentQualifiedName = annotatedComponentQualifiedName + ModelConstants.GENERATION_SUFFIX; - - JDefinedClass generatedClass = codeModel._class(PUBLIC | FINAL, generatedComponentQualifiedName, ClassType.CLASS); - - EBeanHolder holder = eBeansHolder.create(element, EReceiver.class, generatedClass); - - JClass annotatedComponent = codeModel.directClass(annotatedComponentQualifiedName); - - holder.generatedClass._extends(annotatedComponent); - - Classes classes = holder.classes(); - - JFieldVar contextField = holder.generatedClass.field(PRIVATE, classes.CONTEXT, "context_"); - holder.contextRef = contextField; - - JMethod init = holder.generatedClass.method(PRIVATE, codeModel.VOID, "init_"); - holder.initBody = init.body(); - { - // onReceive - JMethod onReceive = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onReceive"); - JVar contextParam = onReceive.param(classes.CONTEXT, "context"); - JVar intentParam = onReceive.param(classes.INTENT, "intent"); - onReceive.annotate(Override.class); - JBlock onReceiveBody = onReceive.body(); - onReceiveBody.assign(contextField, contextParam); - onReceiveBody.invoke(init); - onReceiveBody.invoke(JExpr._super(), onReceive).arg(contextParam).arg(intentParam); - } - - { - /* - * Setting to null shouldn't be a problem as long as we don't allow - * - * @App and @Extra on this component - */ - holder.initIfActivityBody = null; - holder.initActivityRef = null; - } - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EServiceProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EServiceProcessor.java deleted file mode 100644 index 53c0ac7832..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EServiceProcessor.java +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._this; -import static com.sun.codemodel.JMod.FINAL; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; - -import org.androidannotations.annotations.EService; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.AnnotationHelper; -import org.androidannotations.helper.ModelConstants; - -import com.sun.codemodel.ClassType; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JMethod; - -public class EServiceProcessor implements GeneratingElementProcessor { - - final APTCodeModelHelper aptCodeModelHelper; - - final AnnotationHelper annotationHelper; - - public EServiceProcessor(ProcessingEnvironment processingEnv) { - aptCodeModelHelper = new APTCodeModelHelper(); - annotationHelper = new AnnotationHelper(processingEnv); - } - - @Override - public String getTarget() { - return EService.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - TypeElement typeElement = (TypeElement) element; - - String annotatedComponentQualifiedName = typeElement.getQualifiedName().toString(); - - String generatedComponentQualifiedName = annotatedComponentQualifiedName + ModelConstants.GENERATION_SUFFIX; - - JDefinedClass generatedClass = codeModel._class(PUBLIC | FINAL, generatedComponentQualifiedName, ClassType.CLASS); - - EBeanHolder holder = eBeansHolder.create(element, EService.class, generatedClass); - - JClass annotatedComponent = codeModel.directClass(annotatedComponentQualifiedName); - - holder.generatedClass._extends(annotatedComponent); - - holder.contextRef = _this(); - - JMethod init = holder.generatedClass.method(PRIVATE, codeModel.VOID, "init_"); - holder.initBody = init.body(); - { - // onCreate - JMethod onCreate = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onCreate"); - onCreate.annotate(Override.class); - JBlock onCreateBody = onCreate.body(); - onCreateBody.invoke(init); - onCreateBody.invoke(JExpr._super(), onCreate); - } - - { - /* - * Setting to null shouldn't be a problem as long as we don't allow - * - * @App and @Extra on this component - */ - holder.initIfActivityBody = null; - holder.initActivityRef = null; - } - - aptCodeModelHelper.addServiceIntentBuilder(codeModel, holder, annotationHelper); - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EViewGroupProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EViewGroupProcessor.java deleted file mode 100644 index ca773da530..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EViewGroupProcessor.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.invoke; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; - -import org.androidannotations.annotations.EViewGroup; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.ModelConstants; -import org.androidannotations.processing.EBeansHolder.Classes; -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; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JType; - -public class EViewGroupProcessor implements GeneratingElementProcessor { - - private static final String ALREADY_INFLATED_COMMENT = "" // + - + "The mAlreadyInflated_ hack is needed because of an Android bug\n" // + - + "which leads to infinite calls of onFinishInflate()\n" // - + "when inflating a layout with a parent and using\n" // - + "the tag." // - ; - - private static final String SUPPRESS_WARNING_COMMENT = "" // - + "We use @SuppressWarning here because our java code\n" // - + "generator doesn't know that there is no need\n" // - + "to import OnXXXListeners from View as we already\n" // - + "are in a View." // - ; - - private final APTCodeModelHelper codeModelHelper; - - private final IdAnnotationHelper helper; - - public EViewGroupProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - codeModelHelper = new APTCodeModelHelper(); - helper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - } - - @Override - public String getTarget() { - return EViewGroup.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - Classes classes = eBeansHolder.classes(); - - TypeElement typeElement = (TypeElement) element; - - String eBeanQualifiedName = typeElement.getQualifiedName().toString(); - - String generatedBeanQualifiedName = eBeanQualifiedName + ModelConstants.GENERATION_SUFFIX; - - int modifiers; - if (element.getModifiers().contains(Modifier.ABSTRACT)) { - modifiers = JMod.PUBLIC | JMod.ABSTRACT; - } else { - modifiers = JMod.PUBLIC | JMod.FINAL; - } - - JDefinedClass generatedClass = codeModel._class(modifiers, generatedBeanQualifiedName, ClassType.CLASS); - - EBeanHolder holder = eBeansHolder.create(element, EViewGroup.class, generatedClass); - - JClass eBeanClass = codeModel.directClass(eBeanQualifiedName); - - holder.generatedClass._extends(eBeanClass); - - holder.generatedClass.annotate(SuppressWarnings.class).param("value", "unused"); - holder.generatedClass.javadoc().append(SUPPRESS_WARNING_COMMENT); - - { - holder.contextRef = holder.generatedClass.field(PRIVATE, classes.CONTEXT, "context_"); - } - - JMethod init; - { - // init - init = holder.generatedClass.method(PRIVATE, codeModel.VOID, "init_"); - holder.initBody = init.body(); - holder.wrapInitWithNotifier(); - holder.initBody.assign((JFieldVar) holder.contextRef, JExpr.invoke("getContext")); - } - - JFieldVar mAlreadyInflated_ = holder.generatedClass.field(PRIVATE, JType.parse(codeModel, "boolean"), "mAlreadyInflated_", JExpr.FALSE); - - // onFinishInflate - JMethod onFinishInflate = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onFinishInflate"); - onFinishInflate.annotate(Override.class); - onFinishInflate.javadoc().append(ALREADY_INFLATED_COMMENT); - - JBlock ifNotInflated = onFinishInflate.body()._if(JExpr.ref("mAlreadyInflated_").not())._then(); - ifNotInflated.assign(mAlreadyInflated_, JExpr.TRUE); - - JFieldRef contentViewId = helper.extractOneAnnotationFieldRef(holder, element, Res.LAYOUT, false); - - if (contentViewId != null) { - ifNotInflated.invoke("inflate").arg(invoke("getContext")).arg(contentViewId).arg(JExpr._this()); - } - holder.invokeViewChanged(ifNotInflated); - - // finally - onFinishInflate.body().invoke(JExpr._super(), "onFinishInflate"); - - codeModelHelper.copyConstructorsAndAddStaticEViewBuilders(element, codeModel, eBeanClass, holder, onFinishInflate, init); - - { - // init if activity - APTCodeModelHelper helper = new APTCodeModelHelper(); - holder.initIfActivityBody = helper.ifContextInstanceOfActivity(holder, holder.initBody); - holder.initActivityRef = helper.castContextToActivity(holder, holder.initIfActivityBody); - } - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EViewProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EViewProcessor.java deleted file mode 100644 index ea8dadb588..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/EViewProcessor.java +++ /dev/null @@ -1,134 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; - -import javax.lang.model.element.Element; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.TypeElement; - -import org.androidannotations.annotations.EView; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.ModelConstants; -import org.androidannotations.processing.EBeansHolder.Classes; - -import com.sun.codemodel.ClassType; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JType; - -public class EViewProcessor implements GeneratingElementProcessor { - - private static final String ALREADY_INFLATED_COMMENT = "" // + - + "The mAlreadyInflated_ hack is needed because of an Android bug\n" // + - + "which leads to infinite calls of onFinishInflate()\n" // - + "when inflating a layout with a parent and using\n" // - + "the tag." // - ; - - private static final String SUPPRESS_WARNING_COMMENT = "" // - + "We use @SuppressWarning here because our java code\n" // - + "generator doesn't know that there is no need\n" // - + "to import OnXXXListeners from View as we already\n" // - + "are in a View." // - ; - - private final APTCodeModelHelper codeModelHelper; - - public EViewProcessor() { - codeModelHelper = new APTCodeModelHelper(); - } - - @Override - public String getTarget() { - return EView.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - Classes classes = eBeansHolder.classes(); - - TypeElement typeElement = (TypeElement) element; - - String eBeanQualifiedName = typeElement.getQualifiedName().toString(); - - String generatedBeanQualifiedName = eBeanQualifiedName + ModelConstants.GENERATION_SUFFIX; - - int modifiers; - if (element.getModifiers().contains(Modifier.ABSTRACT)) { - modifiers = JMod.PUBLIC | JMod.ABSTRACT; - } else { - modifiers = JMod.PUBLIC | JMod.FINAL; - } - - JDefinedClass generatedClass = codeModel._class(modifiers, generatedBeanQualifiedName, ClassType.CLASS); - EBeanHolder holder = eBeansHolder.create(element, EView.class, generatedClass); - - JClass eBeanClass = codeModel.directClass(eBeanQualifiedName); - - holder.generatedClass._extends(eBeanClass); - - holder.generatedClass.annotate(SuppressWarnings.class).param("value", "unused"); - holder.generatedClass.javadoc().append(SUPPRESS_WARNING_COMMENT); - - { - holder.contextRef = holder.generatedClass.field(PRIVATE, classes.CONTEXT, "context_"); - } - - JMethod init; - { - // init - init = holder.generatedClass.method(PRIVATE, codeModel.VOID, "init_"); - holder.initBody = init.body(); - holder.wrapInitWithNotifier(); - holder.initBody.assign((JFieldVar) holder.contextRef, JExpr.invoke("getContext")); - } - - JFieldVar mAlreadyInflated_ = holder.generatedClass.field(PRIVATE, JType.parse(codeModel, "boolean"), "mAlreadyInflated_", JExpr.FALSE); - - // onFinishInflate - JMethod onFinishInflate = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onFinishInflate"); - onFinishInflate.annotate(Override.class); - onFinishInflate.javadoc().append(ALREADY_INFLATED_COMMENT); - - JBlock ifNotInflated = onFinishInflate.body()._if(JExpr.ref("mAlreadyInflated_").not())._then(); - ifNotInflated.assign(mAlreadyInflated_, JExpr.TRUE); - - holder.invokeViewChanged(ifNotInflated); - - // finally - onFinishInflate.body().invoke(JExpr._super(), "onFinishInflate"); - - codeModelHelper.copyConstructorsAndAddStaticEViewBuilders(element, codeModel, eBeanClass, holder, onFinishInflate, init); - - { - // init if activity - holder.initIfActivityBody = codeModelHelper.ifContextInstanceOfActivity(holder, holder.initBody); - holder.initActivityRef = codeModelHelper.castContextToActivity(holder, holder.initIfActivityBody); - } - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ExtraProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ExtraProcessor.java deleted file mode 100644 index 0118286583..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ExtraProcessor.java +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr._super; -import static com.sun.codemodel.JExpr._this; -import static com.sun.codemodel.JExpr.invoke; -import static com.sun.codemodel.JExpr.lit; -import static com.sun.codemodel.JMod.FINAL; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; -import static com.sun.codemodel.JMod.STATIC; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.Extra; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.CaseHelper; -import org.androidannotations.processing.EBeansHolder.Classes; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCatchBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JPrimitiveType; -import com.sun.codemodel.JTryBlock; -import com.sun.codemodel.JType; -import com.sun.codemodel.JVar; - -public class ExtraProcessor implements DecoratingElementProcessor { - - private final APTCodeModelHelper helper = new APTCodeModelHelper(); - private final ProcessingEnvironment processingEnv; - - public ExtraProcessor(ProcessingEnvironment processingEnv) { - this.processingEnv = processingEnv; - } - - @Override - public String getTarget() { - return Extra.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - Extra annotation = element.getAnnotation(Extra.class); - String extraKey = annotation.value(); - String fieldName = element.getSimpleName().toString(); - - if (extraKey.isEmpty()) { - extraKey = fieldName; - } - - TypeMirror elementType = element.asType(); - boolean isPrimitive = elementType.getKind().isPrimitive(); - - Classes classes = holder.classes(); - - if (!isPrimitive && holder.cast == null) { - helper.addCastMethod(codeModel, holder); - } - - if (holder.extras == null) { - injectExtras(holder, codeModel); - } - - String staticFieldName = CaseHelper.camelCaseToUpperSnakeCase(null, fieldName, "Extra"); - - JFieldVar extraKeyField = holder.generatedClass.field(PUBLIC | STATIC | FINAL, classes.STRING, staticFieldName, lit(extraKey)); - - JBlock ifContainsKey = holder.extrasNotNullBlock._if(JExpr.invoke(holder.extras, "containsKey").arg(extraKeyField))._then(); - - JTryBlock containsKeyTry = ifContainsKey._try(); - - JFieldRef extraField = JExpr.ref(fieldName); - - if (isPrimitive) { - JPrimitiveType primitiveType = JType.parse(codeModel, elementType.toString()); - JClass wrapperType = primitiveType.boxify(); - containsKeyTry.body().assign(extraField, JExpr.cast(wrapperType, holder.extras.invoke("get").arg(extraKeyField))); - } else { - containsKeyTry.body().assign(extraField, JExpr.invoke(holder.cast).arg(holder.extras.invoke("get").arg(extraKeyField))); - } - - JCatchBlock containsKeyCatch = containsKeyTry._catch(classes.CLASS_CAST_EXCEPTION); - JVar exceptionParam = containsKeyCatch.param("e"); - - JInvocation logError = classes.LOG.staticInvoke("e"); - - logError.arg(holder.generatedClass.name()); - logError.arg("Could not cast extra to expected type, the field is left to its default value"); - logError.arg(exceptionParam); - - containsKeyCatch.body().add(logError); - - /* - * holder.intentBuilderClass may be null if the annotated component is - * an abstract activity - */ - if (holder.intentBuilderClass != null) { - { - // flags() - JMethod method = holder.intentBuilderClass.method(PUBLIC, holder.intentBuilderClass, fieldName); - - helper.addIntentBuilderPutExtraMethod(codeModel, holder, helper, processingEnv, method, elementType, fieldName, extraKeyField); - - JBlock body = method.body(); - body._return(_this()); - } - } - - } - - /** - * Adds call to injectExtras_() in onCreate and setIntent() methods. - */ - private void injectExtras(EBeanHolder holder, JCodeModel codeModel) { - - Classes classes = holder.classes(); - - JMethod injectExtrasMethod = holder.generatedClass.method(PRIVATE, codeModel.VOID, "injectExtras_"); - - overrideSetIntent(holder, codeModel, injectExtrasMethod); - - injectExtrasOnInit(holder, classes.INTENT, injectExtrasMethod); - - JBlock injectExtrasBody = injectExtrasMethod.body(); - - JVar intent = injectExtrasBody.decl(classes.INTENT, "intent_", invoke("getIntent")); - - holder.extras = injectExtrasBody.decl(classes.BUNDLE, "extras_"); - holder.extras.init(intent.invoke("getExtras")); - - holder.extrasNotNullBlock = injectExtrasBody._if(holder.extras.ne(_null()))._then(); - } - - private void overrideSetIntent(EBeanHolder holder, JCodeModel codeModel, JMethod initIntentMethod) { - if (holder.intentBuilderClass != null) { - - JMethod setIntentMethod = holder.generatedClass.method(PUBLIC, codeModel.VOID, "setIntent"); - setIntentMethod.annotate(Override.class); - JVar methodParam = setIntentMethod.param(holder.classes().INTENT, "newIntent"); - - JBlock setIntentBody = setIntentMethod.body(); - - setIntentBody.invoke(_super(), setIntentMethod).arg(methodParam); - setIntentBody.invoke(initIntentMethod); - } - } - - private void injectExtrasOnInit(EBeanHolder holder, JClass intentClass, JMethod injectExtrasMethod) { - holder.initBody.invoke(injectExtrasMethod); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FragmentArgProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FragmentArgProcessor.java deleted file mode 100644 index caa87de8eb..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FragmentArgProcessor.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr._this; -import static com.sun.codemodel.JExpr.invoke; -import static com.sun.codemodel.JExpr.ref; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.FragmentArg; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.AnnotationHelper; -import org.androidannotations.helper.BundleHelper; -import org.androidannotations.processing.EBeansHolder.Classes; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCatchBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JTryBlock; -import com.sun.codemodel.JVar; - -public class FragmentArgProcessor implements DecoratingElementProcessor { - - private final APTCodeModelHelper helper = new APTCodeModelHelper(); - private final AnnotationHelper annotationHelper; - - public FragmentArgProcessor(ProcessingEnvironment processingEnv) { - annotationHelper = new AnnotationHelper(processingEnv); - } - - @Override - public String getTarget() { - return FragmentArg.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) throws Exception { - FragmentArg annotation = element.getAnnotation(FragmentArg.class); - String argKey = annotation.value(); - String fieldName = element.getSimpleName().toString(); - - if (argKey.isEmpty()) { - argKey = fieldName; - } - - TypeMirror elementType = element.asType(); - - Classes classes = holder.classes(); - - if (holder.fragmentArguments == null) { - injectFragmentArguments(holder, codeModel); - } - - JBlock ifContainsKey = holder.fragmentArgumentsNotNullBlock._if(JExpr.invoke(holder.fragmentArguments, "containsKey").arg(argKey))._then(); - - JTryBlock containsKeyTry = ifContainsKey._try(); - - JFieldRef argField = ref(fieldName); - - BundleHelper bundleHelper = new BundleHelper(annotationHelper, element); - - JInvocation restoreMethodCall = JExpr.invoke(holder.fragmentArguments, bundleHelper.getMethodNameToRestore()).arg(argKey); - if (bundleHelper.restoreCallNeedCastStatement()) { - - JClass jclass = helper.typeMirrorToJClass(element.asType(), holder); - JExpression castStatement = JExpr.cast(jclass, restoreMethodCall); - containsKeyTry.body().assign(argField, castStatement); - - if (bundleHelper.restoreCallNeedsSuppressWarning()) { - if (holder.fragmentArgumentsInjectMethod.annotations().size() == 0) { - holder.fragmentArgumentsInjectMethod.annotate(SuppressWarnings.class).param("value", "unchecked"); - } - } - - } else { - containsKeyTry.body().assign(argField, restoreMethodCall); - } - - JCatchBlock containsKeyCatch = containsKeyTry._catch(classes.CLASS_CAST_EXCEPTION); - JVar exceptionParam = containsKeyCatch.param("e"); - - JInvocation logError = classes.LOG.staticInvoke("e"); - - logError.arg(holder.generatedClass.name()); - logError.arg("Could not cast argument to the expected type, the field is left to its default value"); - logError.arg(exceptionParam); - - containsKeyCatch.body().add(logError); - - { - JMethod method = holder.fragmentBuilderClass.method(PUBLIC, holder.fragmentBuilderClass, fieldName); - - JClass paramClass = helper.typeMirrorToJClass(elementType, holder); - JVar arg = method.param(paramClass, fieldName); - // Assign - method.body().invoke(holder.fragmentArgumentsBuilderField, bundleHelper.getMethodNameToSave()).arg(argKey).arg(arg); - method.body()._return(_this()); - } - - } - - /** - * Adds call to injectFragmentArguments_() in onCreate and setIntent() - * methods. - */ - private void injectFragmentArguments(EBeanHolder holder, JCodeModel codeModel) { - - Classes classes = holder.classes(); - - holder.fragmentArgumentsInjectMethod = holder.generatedClass.method(PRIVATE, codeModel.VOID, "injectFragmentArguments_"); - - injectArgumentsOnInit(holder, classes.INTENT, holder.fragmentArgumentsInjectMethod); - - JBlock injectArgumentsBody = holder.fragmentArgumentsInjectMethod.body(); - - holder.fragmentArguments = injectArgumentsBody.decl(classes.BUNDLE, "args_"); - holder.fragmentArguments.init(invoke("getArguments")); - - holder.fragmentArgumentsNotNullBlock = injectArgumentsBody._if(holder.fragmentArguments.ne(_null()))._then(); - } - - private void injectArgumentsOnInit(EBeanHolder holder, JClass intentClass, JMethod injectArgumentsMethod) { - holder.initBody.invoke(injectArgumentsMethod); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FragmentByIdProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FragmentByIdProcessor.java deleted file mode 100644 index 29bf61750b..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FragmentByIdProcessor.java +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr.cast; -import static com.sun.codemodel.JExpr.invoke; -import static com.sun.codemodel.JExpr.ref; -import static com.sun.codemodel.JMod.PRIVATE; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.FragmentById; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.processing.EBeansHolder.Classes; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -public class FragmentByIdProcessor implements DecoratingElementProcessor { - - private final IdAnnotationHelper annotationHelper; - - public FragmentByIdProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - } - - @Override - public String getTarget() { - return FragmentById.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - Classes classes = holder.classes(); - - String fieldName = element.getSimpleName().toString(); - - TypeMirror elementType = element.asType(); - String typeQualifiedName = elementType.toString(); - - TypeElement nativeFragmentElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT); - - JMethod findFragmentById; - if (nativeFragmentElement != null && annotationHelper.isSubtype(elementType, nativeFragmentElement.asType())) { - // Injecting native fragment - findFragmentById = null; - - if (holder.findNativeFragmentById == null) { - holder.findNativeFragmentById = holder.generatedClass.method(PRIVATE, classes.FRAGMENT, "findNativeFragmentById"); - JVar idParam = holder.findNativeFragmentById.param(codeModel.INT, "id"); - - JBlock body = holder.findNativeFragmentById.body(); - body._if(holder.contextRef._instanceof(classes.ACTIVITY).not())._then()._return(_null()); - - JVar activityVar = body.decl(classes.ACTIVITY, "activity_", cast(classes.ACTIVITY, holder.contextRef)); - - body._return(activityVar.invoke("getFragmentManager").invoke("findFragmentById").arg(idParam)); - } - - findFragmentById = holder.findNativeFragmentById; - - } else { - // Injecting support fragment - - if (holder.findSupportFragmentById == null) { - holder.findSupportFragmentById = holder.generatedClass.method(PRIVATE, classes.SUPPORT_V4_FRAGMENT, "findSupportFragmentById"); - JVar idParam = holder.findSupportFragmentById.param(codeModel.INT, "id"); - - JBlock body = holder.findSupportFragmentById.body(); - - body._if(holder.contextRef._instanceof(classes.FRAGMENT_ACTIVITY).not())._then()._return(_null()); - - JVar activityVar = body.decl(classes.FRAGMENT_ACTIVITY, "activity_", cast(classes.FRAGMENT_ACTIVITY, holder.contextRef)); - - body._return(activityVar.invoke("getSupportFragmentManager").invoke("findFragmentById").arg(idParam)); - } - - findFragmentById = holder.findSupportFragmentById; - } - - JBlock methodBody = holder.onViewChanged().body(); - - JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(holder, element, Res.ID, true); - - methodBody.assign(ref(fieldName), cast(holder.refClass(typeQualifiedName), invoke(findFragmentById).arg(idRef))); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FragmentByTagProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FragmentByTagProcessor.java deleted file mode 100644 index e5e2d1676a..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FragmentByTagProcessor.java +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr.cast; -import static com.sun.codemodel.JExpr.invoke; -import static com.sun.codemodel.JExpr.lit; -import static com.sun.codemodel.JExpr.ref; -import static com.sun.codemodel.JMod.PRIVATE; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.FragmentByTag; -import org.androidannotations.helper.AnnotationHelper; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.processing.EBeansHolder.Classes; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -public class FragmentByTagProcessor implements DecoratingElementProcessor { - - private final AnnotationHelper annotationHelper; - - public FragmentByTagProcessor(ProcessingEnvironment processingEnv) { - annotationHelper = new AnnotationHelper(processingEnv); - } - - @Override - public String getTarget() { - return FragmentByTag.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - Classes classes = holder.classes(); - - String fieldName = element.getSimpleName().toString(); - - TypeMirror elementType = element.asType(); - String typeQualifiedName = elementType.toString(); - - FragmentByTag annotation = element.getAnnotation(FragmentByTag.class); - String tagValue = annotation.value(); - - if (tagValue.equals("")) { - tagValue = fieldName; - } - - TypeMirror nativeFragmentType = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT).asType(); - - JMethod findFragmentByTag; - if (annotationHelper.isSubtype(elementType, nativeFragmentType)) { - // Injecting native fragment - - findFragmentByTag = null; - - if (holder.findNativeFragmentByTag == null) { - holder.findNativeFragmentByTag = holder.generatedClass.method(PRIVATE, classes.FRAGMENT, "findNativeFragmentByTag"); - JVar tagParam = holder.findNativeFragmentByTag.param(classes.STRING, "tag"); - - JBlock body = holder.findNativeFragmentByTag.body(); - body._if(holder.contextRef._instanceof(classes.ACTIVITY).not())._then()._return(_null()); - - JVar activityVar = body.decl(classes.ACTIVITY, "activity_", cast(classes.ACTIVITY, holder.contextRef)); - - body._return(activityVar.invoke("getFragmentManager").invoke("findFragmentByTag").arg(tagParam)); - } - - findFragmentByTag = holder.findNativeFragmentByTag; - - } else { - // Injecting support fragment - - if (holder.findSupportFragmentByTag == null) { - holder.findSupportFragmentByTag = holder.generatedClass.method(PRIVATE, classes.SUPPORT_V4_FRAGMENT, "findSupportFragmentByTag"); - JVar tagParam = holder.findSupportFragmentByTag.param(classes.STRING, "tag"); - - JBlock body = holder.findSupportFragmentByTag.body(); - - body._if(holder.contextRef._instanceof(classes.FRAGMENT_ACTIVITY).not())._then()._return(_null()); - - JVar activityVar = body.decl(classes.FRAGMENT_ACTIVITY, "activity_", cast(classes.FRAGMENT_ACTIVITY, holder.contextRef)); - - body._return(activityVar.invoke("getSupportFragmentManager").invoke("findFragmentByTag").arg(tagParam)); - } - - findFragmentByTag = holder.findSupportFragmentByTag; - } - - JBlock methodBody = holder.onViewChanged().body(); - methodBody.assign(ref(fieldName), cast(holder.refClass(typeQualifiedName), invoke(findFragmentByTag).arg(lit(tagValue)))); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FromHtmlProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FromHtmlProcessor.java deleted file mode 100644 index a58e496b64..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FromHtmlProcessor.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr.ref; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.FromHtml; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.processing.EBeansHolder.Classes; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JFieldRef; - -public class FromHtmlProcessor implements DecoratingElementProcessor { - - private final IdAnnotationHelper annotationHelper; - - public FromHtmlProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - } - - @Override - public String getTarget() { - return FromHtml.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) throws Exception { - Classes classes = holder.classes(); - - String fieldName = element.getSimpleName().toString(); - - JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(holder, element, Res.STRING, true); - - JBlock methodBody = holder.onViewChanged().body(); - - // - methodBody. // - _if(ref(fieldName).ne(_null())). // - _then() // - .invoke(ref(fieldName), "setText").arg(classes.HTML.staticInvoke("fromHtml").arg(holder.contextRef.invoke("getString").arg(idRef))); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FullscreenProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FullscreenProcessor.java deleted file mode 100644 index 6373d87695..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/FullscreenProcessor.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.invoke; - -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.Fullscreen; - -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; - -public class FullscreenProcessor implements DecoratingElementProcessor { - - @Override - public String getTarget() { - return Fullscreen.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - JFieldRef fullScreen = holder.classes().WINDOW_MANAGER_LAYOUT_PARAMS.staticRef("FLAG_FULLSCREEN"); - - JInvocation arg = invoke(invoke("getWindow"), "setFlags").arg(fullScreen).arg(fullScreen); - holder.initBody.add(arg); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/HierarchyViewerSupportProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/HierarchyViewerSupportProcessor.java deleted file mode 100644 index dd2fb80bf1..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/HierarchyViewerSupportProcessor.java +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._super; -import static com.sun.codemodel.JExpr._this; - -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.HierarchyViewerSupport; -import org.androidannotations.api.ViewServer; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; - -public class HierarchyViewerSupportProcessor implements DecoratingElementProcessor { - - @Override - public String getTarget() { - return HierarchyViewerSupport.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - holder.generateApiClass(element, ViewServer.class); - - // Methods - onViewChanged(codeModel, holder); - onDestroyMethod(codeModel, holder); - onResumeMethod(codeModel, holder); - } - - private void onViewChanged(JCodeModel codeModel, EBeanHolder holder) { - JInvocation viewServerInvocation = holder.classes().VIEW_SERVER.staticInvoke("get").arg(_this()); - holder.onViewChanged().body().invoke(viewServerInvocation, "addWindow").arg(_this()); - } - - private void onDestroyMethod(JCodeModel codeModel, EBeanHolder holder) { - JBlock onDestroyBlock = holder.onDestroyBlock; - - if (onDestroyBlock == null) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onDestroy"); - method.annotate(Override.class); - holder.onDestroyBlock = method.body(); - holder.onDestroyBlock.invoke(_super(), method); - } - - JInvocation viewServerInvocation = holder.classes().VIEW_SERVER.staticInvoke("get").arg(_this()); - holder.onDestroyBlock.invoke(viewServerInvocation, "removeWindow").arg(_this()); - } - - private void onResumeMethod(JCodeModel codeModel, EBeanHolder holder) { - JBlock onResumeBlock = holder.onResumeBlock; - - if (onResumeBlock == null) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onResume"); - method.annotate(Override.class); - holder.onResumeBlock = method.body(); - holder.onResumeBlock.invoke(_super(), method); - } - - JInvocation viewServerInvocation = holder.classes().VIEW_SERVER.staticInvoke("get").arg(_this()); - holder.onResumeBlock.invoke(viewServerInvocation, "setFocusedWindow").arg(_this()); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/InstanceStateProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/InstanceStateProcessor.java deleted file mode 100644 index da6bfe8e69..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/InstanceStateProcessor.java +++ /dev/null @@ -1,166 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr.ref; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.PUBLIC; -import static org.androidannotations.helper.CanonicalNameConstants.BUNDLE; -import static org.androidannotations.helper.CanonicalNameConstants.CHAR_SEQUENCE; -import static org.androidannotations.helper.CanonicalNameConstants.STRING; - -import java.util.HashMap; -import java.util.Map; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.InstanceState; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.AnnotationHelper; -import org.androidannotations.helper.BundleHelper; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -public class InstanceStateProcessor implements DecoratingElementProcessor { - - private static final String BUNDLE_PARAM_NAME = "bundle"; - - public static final Map methodSuffixNameByTypeName = new HashMap(); - - static { - - methodSuffixNameByTypeName.put(BUNDLE, "Bundle"); - - methodSuffixNameByTypeName.put("boolean", "Boolean"); - methodSuffixNameByTypeName.put("boolean[]", "BooleanArray"); - - methodSuffixNameByTypeName.put("byte", "Byte"); - methodSuffixNameByTypeName.put("byte[]", "ByteArray"); - - methodSuffixNameByTypeName.put("char", "Char"); - methodSuffixNameByTypeName.put("char[]", "CharArray"); - - methodSuffixNameByTypeName.put(CHAR_SEQUENCE, "CharSequence"); - - methodSuffixNameByTypeName.put("double", "Double"); - methodSuffixNameByTypeName.put("double[]", "DoubleArray"); - - methodSuffixNameByTypeName.put("float", "Float"); - methodSuffixNameByTypeName.put("float[]", "FloatArray"); - - methodSuffixNameByTypeName.put("int", "Int"); - methodSuffixNameByTypeName.put("int[]", "IntArray"); - methodSuffixNameByTypeName.put("java.util.ArrayList", "IntegerArrayList"); - - methodSuffixNameByTypeName.put("long", "Long"); - methodSuffixNameByTypeName.put("long[]", "LongArray"); - - methodSuffixNameByTypeName.put("short", "Short"); - methodSuffixNameByTypeName.put("short[]", "ShortArray"); - - methodSuffixNameByTypeName.put(STRING, "String"); - methodSuffixNameByTypeName.put("java.lang.String[]", "StringArray"); - methodSuffixNameByTypeName.put("java.util.ArrayList", "StringArrayList"); - } - - private final APTCodeModelHelper helper = new APTCodeModelHelper(); - - private AnnotationHelper annotationHelper; - - public InstanceStateProcessor(ProcessingEnvironment processingEnv) { - annotationHelper = new AnnotationHelper(processingEnv); - } - - @Override - public String getTarget() { - return InstanceState.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - String fieldName = element.getSimpleName().toString(); - - JBlock saveStateBody = getSaveStateMethodBody(codeModel, holder); - JBlock restoreStateBody = getRestoreStateBody(codeModel, holder); - - BundleHelper bundleHelper = new BundleHelper(annotationHelper, element); - - JFieldRef ref = ref(fieldName); - saveStateBody.invoke(ref(BUNDLE_PARAM_NAME), bundleHelper.getMethodNameToSave()).arg(fieldName).arg(ref); - - JInvocation restoreMethodCall = JExpr.invoke(ref("savedInstanceState"), bundleHelper.getMethodNameToRestore()).arg(fieldName); - if (bundleHelper.restoreCallNeedCastStatement()) { - - JClass jclass = helper.typeMirrorToJClass(element.asType(), holder); - JExpression castStatement = JExpr.cast(jclass, restoreMethodCall); - restoreStateBody.assign(ref, castStatement); - - if (bundleHelper.restoreCallNeedsSuppressWarning()) { - if (holder.restoreSavedInstanceStateMethod.annotations().size() == 0) { - holder.restoreSavedInstanceStateMethod.annotate(SuppressWarnings.class).param("value", "unchecked"); - } - } - - } else { - restoreStateBody.assign(ref, restoreMethodCall); - } - } - - private JBlock getRestoreStateBody(JCodeModel codeModel, EBeanHolder holder) { - - if (holder.restoreSavedInstanceStateMethod == null) { - - holder.restoreSavedInstanceStateMethod = holder.generatedClass.method(PRIVATE, codeModel.VOID, "restoreSavedInstanceState_"); - - JVar savedInstanceState = holder.restoreSavedInstanceStateMethod.param(holder.classes().BUNDLE, "savedInstanceState"); - - holder.initIfActivityBody.invoke(holder.restoreSavedInstanceStateMethod).arg(savedInstanceState); - - holder.restoreSavedInstanceStateMethod.body() // - ._if(ref("savedInstanceState").eq(_null())) // - ._then()._return(); - - } - - return holder.restoreSavedInstanceStateMethod.body(); - } - - private JBlock getSaveStateMethodBody(JCodeModel codeModel, EBeanHolder holder) { - - if (holder.saveInstanceStateBlock == null) { - JMethod method = holder.generatedClass.method(PUBLIC, codeModel.VOID, "onSaveInstanceState"); - method.annotate(Override.class); - method.param(holder.classes().BUNDLE, BUNDLE_PARAM_NAME); - - holder.saveInstanceStateBlock = method.body(); - - holder.saveInstanceStateBlock.invoke(JExpr._super(), "onSaveInstanceState").arg(JExpr.ref(BUNDLE_PARAM_NAME)); - } - - return holder.saveInstanceStateBlock; - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ItemClickProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ItemClickProcessor.java deleted file mode 100644 index d7759bbac9..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ItemClickProcessor.java +++ /dev/null @@ -1,113 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr.cast; -import static com.sun.codemodel.JExpr.invoke; - -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.VariableElement; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.ItemClick; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.processing.EBeansHolder.Classes; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JVar; - -public class ItemClickProcessor implements DecoratingElementProcessor { - - private IdAnnotationHelper helper; - private final APTCodeModelHelper codeModelHelper = new APTCodeModelHelper(); - - public ItemClickProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - helper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - } - - @Override - public String getTarget() { - return ItemClick.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - Classes classes = holder.classes(); - - String methodName = element.getSimpleName().toString(); - - ExecutableElement executableElement = (ExecutableElement) element; - List parameters = executableElement.getParameters(); - - boolean hasItemParameter = parameters.size() == 1; - - List idsRefs = helper.extractAnnotationFieldRefs(holder, element, Res.ID, true); - - JDefinedClass onItemClickListenerAnonymousClass = codeModel.anonymousClass(classes.ON_ITEM_CLICK_LISTENER); - JMethod onItemClickMethod = onItemClickListenerAnonymousClass.method(JMod.PUBLIC, codeModel.VOID, "onItemClick"); - onItemClickMethod.annotate(Override.class); - - JClass narrowAdapterViewClass = classes.ADAPTER_VIEW.narrow(codeModel.wildcard()); - JVar onItemClickParentParam = onItemClickMethod.param(narrowAdapterViewClass, "parent"); - onItemClickMethod.param(classes.VIEW, "view"); - JVar onItemClickPositionParam = onItemClickMethod.param(codeModel.INT, "position"); - onItemClickMethod.param(codeModel.LONG, "id"); - - JInvocation itemClickCall = onItemClickMethod.body().invoke(methodName); - - if (hasItemParameter) { - VariableElement parameter = parameters.get(0); - - TypeMirror parameterType = parameter.asType(); - if (parameterType.getKind() == TypeKind.INT) { - itemClickCall.arg(onItemClickPositionParam); - } else { - JClass parameterClass = codeModelHelper.typeMirrorToJClass(parameterType, holder); - itemClickCall.arg(cast(parameterClass, invoke(onItemClickParentParam, "getAdapter").invoke("getItem").arg(onItemClickPositionParam))); - - if (parameterClass.isParameterized()) { - onItemClickMethod.annotate(SuppressWarnings.class).param("value", "unchecked"); - } - } - } - - ViewChangedHolder onViewChanged = holder.onViewChanged(); - for (JFieldRef idRef : idsRefs) { - JBlock block = onViewChanged.body().block(); - - JVar view = block.decl(narrowAdapterViewClass, "view", cast(narrowAdapterViewClass, onViewChanged.findViewById(idRef))); - block._if(view.ne(JExpr._null()))._then().invoke(view, "setOnItemClickListener").arg(_new(onItemClickListenerAnonymousClass)); - } - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ItemLongClickProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ItemLongClickProcessor.java deleted file mode 100644 index b7fbb9108d..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ItemLongClickProcessor.java +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr.cast; -import static com.sun.codemodel.JExpr.invoke; - -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.VariableElement; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.ItemLongClick; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.processing.EBeansHolder.Classes; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JVar; - -public class ItemLongClickProcessor implements DecoratingElementProcessor { - - private IdAnnotationHelper helper; - - public ItemLongClickProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - helper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - } - - @Override - public String getTarget() { - return ItemLongClick.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - Classes classes = holder.classes(); - - String methodName = element.getSimpleName().toString(); - - ExecutableElement executableElement = (ExecutableElement) element; - List parameters = executableElement.getParameters(); - TypeMirror returnType = executableElement.getReturnType(); - boolean returnMethodResult = returnType.getKind() != TypeKind.VOID; - - boolean hasItemParameter = parameters.size() == 1; - - List idsRefs = helper.extractAnnotationFieldRefs(holder, element, Res.ID, true); - - JDefinedClass onItemLongClickListenerClass = codeModel.anonymousClass(classes.ON_ITEM_LONG_CLICK_LISTENER); - JMethod onItemLongClickMethod = onItemLongClickListenerClass.method(JMod.PUBLIC, codeModel.BOOLEAN, "onItemLongClick"); - onItemLongClickMethod.annotate(Override.class); - - JClass narrowAdapterViewClass = classes.ADAPTER_VIEW.narrow(codeModel.wildcard()); - JVar onItemClickParentParam = onItemLongClickMethod.param(narrowAdapterViewClass, "parent"); - onItemLongClickMethod.param(classes.VIEW, "view"); - JVar onItemClickPositionParam = onItemLongClickMethod.param(codeModel.INT, "position"); - onItemLongClickMethod.param(codeModel.LONG, "id"); - - JBlock onItemLongClickBody = onItemLongClickMethod.body(); - - JInvocation itemClickCall = JExpr.invoke(methodName); - - if (returnMethodResult) { - onItemLongClickBody._return(itemClickCall); - } else { - onItemLongClickBody.add(itemClickCall); - onItemLongClickBody._return(JExpr.TRUE); - } - - if (hasItemParameter) { - VariableElement parameter = parameters.get(0); - - TypeMirror parameterType = parameter.asType(); - if (parameterType.getKind() == TypeKind.INT) { - itemClickCall.arg(onItemClickPositionParam); - } else { - String parameterTypeQualifiedName = parameterType.toString(); - itemClickCall.arg(cast(holder.refClass(parameterTypeQualifiedName), invoke(onItemClickParentParam, "getAdapter").invoke("getItem").arg(onItemClickPositionParam))); - } - } - - ViewChangedHolder onViewChanged = holder.onViewChanged(); - for (JFieldRef idRef : idsRefs) { - JBlock block = onViewChanged.body().block(); - JVar view = block.decl(narrowAdapterViewClass, "view", cast(narrowAdapterViewClass, onViewChanged.findViewById(idRef))); - block._if(view.ne(_null()))._then().invoke(view, "setOnItemLongClickListener").arg(_new(onItemLongClickListenerClass)); - } - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/NoTitleProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/NoTitleProcessor.java deleted file mode 100644 index d31731bf0e..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/NoTitleProcessor.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.NoTitle; - -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JFieldRef; - -public class NoTitleProcessor implements DecoratingElementProcessor { - - @Override - public String getTarget() { - return NoTitle.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - JFieldRef noTitle = holder.classes().WINDOW.staticRef("FEATURE_NO_TITLE"); - - holder.initBody.invoke("requestWindowFeature").arg(noTitle); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/NonConfigurationInstanceProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/NonConfigurationInstanceProcessor.java deleted file mode 100644 index 2ca522f65e..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/NonConfigurationInstanceProcessor.java +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr._super; -import static com.sun.codemodel.JExpr._this; -import static com.sun.codemodel.JExpr.cast; -import static com.sun.codemodel.JMod.FINAL; -import static com.sun.codemodel.JMod.PUBLIC; -import static org.androidannotations.helper.ModelConstants.GENERATION_SUFFIX; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.Bean; -import org.androidannotations.annotations.NonConfigurationInstance; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.AnnotationHelper; -import org.androidannotations.helper.CanonicalNameConstants; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JClassAlreadyExistsException; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JVar; - -public class NonConfigurationInstanceProcessor implements DecoratingElementProcessor { - - private APTCodeModelHelper aptCodeModelHelper; - private AnnotationHelper annotationHelper; - - public NonConfigurationInstanceProcessor(ProcessingEnvironment processingEnv) { - annotationHelper = new AnnotationHelper(processingEnv); - aptCodeModelHelper = new APTCodeModelHelper(); - } - - @Override - public String getTarget() { - return NonConfigurationInstance.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) throws JClassAlreadyExistsException { - - NonConfigurationHolder ncHolder = holder.nonConfigurationHolder; - - if (ncHolder == null) { - - ncHolder = new NonConfigurationHolder(); - holder.nonConfigurationHolder = ncHolder; - - ncHolder.holderClass = holder.generatedClass._class(JMod.PRIVATE | JMod.STATIC, "NonConfigurationInstancesHolder"); - - JFieldVar superNonConfigurationInstanceField = ncHolder.holderClass.field(PUBLIC | FINAL, Object.class, "superNonConfigurationInstance"); - - ncHolder.holderConstructor = ncHolder.holderClass.constructor(PUBLIC); - - JVar superNonConfigurationInstanceParam = ncHolder.holderConstructor.param(Object.class, "superNonConfigurationInstance"); - - ncHolder.holderConstructor.body() // - .assign(_this().ref(superNonConfigurationInstanceField), superNonConfigurationInstanceParam); - - TypeElement fragmentActivityTypeElement = annotationHelper.typeElementFromQualifiedName(CanonicalNameConstants.FRAGMENT_ACTIVITY); - TypeElement typeElement = annotationHelper.typeElementFromQualifiedName(holder.generatedClass._extends().fullName()); - - String getLastNonConfigurationInstanceName = "getLastNonConfigurationInstance"; - String onRetainNonConfigurationInstanceName = "onRetainNonConfigurationInstance"; - if (fragmentActivityTypeElement != null && annotationHelper.isSubtype(typeElement.asType(), fragmentActivityTypeElement.asType())) { - getLastNonConfigurationInstanceName = "getLastCustomNonConfigurationInstance"; - onRetainNonConfigurationInstanceName = "onRetainCustomNonConfigurationInstance"; - } - - { - // init() - JBlock initBody = holder.initBody; - ncHolder.initNonConfigurationInstance = initBody.decl(ncHolder.holderClass, "nonConfigurationInstance", cast(ncHolder.holderClass, _super().invoke(getLastNonConfigurationInstanceName))); - ncHolder.initIfNonConfigurationNotNullBody = initBody._if(ncHolder.initNonConfigurationInstance.ne(_null()))._then(); - } - - { - // getLastNonConfigurationInstance() - JMethod getLastNonConfigurationInstance = holder.generatedClass.method(PUBLIC, Object.class, getLastNonConfigurationInstanceName); - - getLastNonConfigurationInstance.annotate(Override.class); - JBlock body = getLastNonConfigurationInstance.body(); - - JVar nonConfigurationInstance = body.decl(ncHolder.holderClass, "nonConfigurationInstance", cast(ncHolder.holderClass, _super().invoke(getLastNonConfigurationInstance))); - - body._if(nonConfigurationInstance.eq(_null()))._then()._return(_null()); - - body._return(nonConfigurationInstance.ref(superNonConfigurationInstanceField)); - } - - { - // onRetainNonConfigurationInstance() - JMethod onRetainNonConfigurationInstance = holder.generatedClass.method(PUBLIC, ncHolder.holderClass, onRetainNonConfigurationInstanceName); - - onRetainNonConfigurationInstance.annotate(Override.class); - ncHolder.newHolder = _new(ncHolder.holderClass); - ncHolder.newHolder.arg(_super().invoke(onRetainNonConfigurationInstance)); - onRetainNonConfigurationInstance.body()._return(ncHolder.newHolder); - } - } - - String fieldName = element.getSimpleName().toString(); - JClass fieldType = aptCodeModelHelper.typeMirrorToJClass(element.asType(), holder); - JFieldVar field = ncHolder.holderClass.field(PUBLIC | FINAL, fieldType, fieldName); - - JVar constructorParam = ncHolder.holderConstructor.param(fieldType, fieldName); - - ncHolder.holderConstructor.body() // - .assign(_this().ref(field), constructorParam); - - ncHolder.newHolder.arg(field); - - ncHolder.initIfNonConfigurationNotNullBody.assign(field, ncHolder.initNonConfigurationInstance.ref(field)); - - boolean hasBeanAnnotation = element.getAnnotation(Bean.class) != null; - if (hasBeanAnnotation) { - - DeclaredType targetAnnotationClassValue = annotationHelper.extractAnnotationClassParameter(element, Bean.class.getName()); - - TypeMirror elementType; - if (targetAnnotationClassValue != null) { - elementType = targetAnnotationClassValue; - } else { - elementType = element.asType(); - } - - String typeQualifiedName = elementType.toString(); - - JClass fieldGeneratedBeanClass = holder.refClass(typeQualifiedName + GENERATION_SUFFIX); - - ncHolder.initIfNonConfigurationNotNullBody.invoke(cast(fieldGeneratedBeanClass, field), "rebind").arg(_this()); - } - - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OnActivityResultProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OnActivityResultProcessor.java deleted file mode 100644 index 843809d696..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OnActivityResultProcessor.java +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -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.VariableElement; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.OnActivityResult; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.rclass.IRClass; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCase; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JSwitch; -import com.sun.codemodel.JVar; - -/** - */ -public class OnActivityResultProcessor implements DecoratingElementProcessor { - - private APTCodeModelHelper codeModelHelper; - - public OnActivityResultProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - codeModelHelper = new APTCodeModelHelper(); - } - - @Override - public String getTarget() { - return OnActivityResult.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - String methodName = element.getSimpleName().toString(); - - ExecutableElement executableElement = (ExecutableElement) element; - List parameters = executableElement.getParameters(); - - int intentParameterPosition = -1; - int resultCodeParameterPosition = -1; - - for (int i = 0; i < parameters.size(); i++) { - VariableElement parameter = parameters.get(i); - TypeMirror parameterType = parameter.asType(); - - if (CanonicalNameConstants.INTENT.equals(parameterType.toString())) { - intentParameterPosition = i; - } else if (parameterType.getKind().equals(TypeKind.INT) // - || CanonicalNameConstants.INTEGER.equals(parameterType.toString())) { - resultCodeParameterPosition = i; - } - - } - - int requestCode = executableElement.getAnnotation(OnActivityResult.class).value(); - - JBlock onActivityResultCase = getOrCreateOnActivityResultMethodBody(codeModel, holder, requestCode); - - JExpression activityRef = holder.generatedClass.staticRef("this"); - JInvocation onResultInvocation = onActivityResultCase.invoke(activityRef, methodName); - - for (int i = 0; i < parameters.size(); i++) { - if (i == intentParameterPosition) { - JVar intentParameter = codeModelHelper.findParameterByName(holder.onActivityResultMethod, "data"); - onResultInvocation.arg(intentParameter); - } else if (i == resultCodeParameterPosition) { - JVar resultCodeParameter = codeModelHelper.findParameterByName(holder.onActivityResultMethod, "resultCode"); - onResultInvocation.arg(resultCodeParameter); - } - } - - } - - public JBlock getOrCreateOnActivityResultMethodBody(JCodeModel codeModel, EBeanHolder holder, int requestCode) { - JClass intentClass = holder.classes().INTENT; - - if (holder.onActivityResultSwitch == null) { - - JMethod onActivityResultMethod = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onActivityResult"); - JVar requestCodeParam = onActivityResultMethod.param(codeModel.INT, "requestCode"); - onActivityResultMethod.param(codeModel.INT, "resultCode"); - onActivityResultMethod.param(intentClass, "data"); - onActivityResultMethod.annotate(Override.class); - - holder.onActivityResultMethod = onActivityResultMethod; - - JBlock onActivityResultMethodBody = onActivityResultMethod.body(); - codeModelHelper.callSuperMethod(onActivityResultMethod, holder, onActivityResultMethodBody); - holder.onActivityResultSwitch = onActivityResultMethodBody._switch(requestCodeParam); - } - - JSwitch onActivityResultSwitch = holder.onActivityResultSwitch; - - JBlock onActivityResultCaseBlock = holder.onActivityResultCases.get(requestCode); - - if (onActivityResultCaseBlock == null) { - - JCase onActivityResultCase = onActivityResultSwitch._case(JExpr.lit(requestCode)); - - onActivityResultCaseBlock = onActivityResultCase.body().block(); - - onActivityResultCase.body()._break(); - - holder.onActivityResultCases.put(requestCode, onActivityResultCaseBlock); - - } - - return onActivityResultCaseBlock; - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OnSeekBarChangeListenerHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OnSeekBarChangeListenerHolder.java deleted file mode 100644 index ca719ab5ea..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OnSeekBarChangeListenerHolder.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -public class OnSeekBarChangeListenerHolder { - - final JMethod onStartTrackingTouchMethod; - - final JMethod onProgressChangedMethod; - - final JMethod onStopTrackingTouchMethod; - - final JVar viewVariable; - - public OnSeekBarChangeListenerHolder(// - JMethod onStartTrackingTouchMethod, // - JMethod onProgressChangedMethod, // - JMethod onStopTrackingTouchMethod, // - JVar viewVariable) { - - this.onStartTrackingTouchMethod = onStartTrackingTouchMethod; - this.onProgressChangedMethod = onProgressChangedMethod; - this.onStopTrackingTouchMethod = onStopTrackingTouchMethod; - this.viewVariable = viewVariable; - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsItemProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsItemProcessor.java deleted file mode 100644 index 080a57a512..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsItemProcessor.java +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.FALSE; -import static com.sun.codemodel.JExpr.TRUE; -import static com.sun.codemodel.JExpr._super; -import static com.sun.codemodel.JExpr.invoke; - -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.VariableElement; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.OptionsItem; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.ThirdPartyLibHelper; -import org.androidannotations.processing.EBeansHolder.Classes; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JVar; - -/** - */ -public class OptionsItemProcessor implements DecoratingElementProcessor { - - private final IdAnnotationHelper helper; - - private final ThirdPartyLibHelper libHelper; - - public OptionsItemProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - helper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - libHelper = new ThirdPartyLibHelper(helper); - } - - @Override - public String getTarget() { - return OptionsItem.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - Classes classes = holder.classes(); - - String methodName = element.getSimpleName().toString(); - - JClass menuItemClass; - if (libHelper.usesActionBarSherlock(holder)) { - menuItemClass = classes.SHERLOCK_MENU_ITEM; - } else { - menuItemClass = classes.MENU_ITEM; - } - - ExecutableElement executableElement = (ExecutableElement) element; - List parameters = executableElement.getParameters(); - TypeMirror returnType = executableElement.getReturnType(); - boolean returnMethodResult = returnType.getKind() != TypeKind.VOID; - - boolean hasItemParameter = parameters.size() == 1; - - List idsRefs = helper.extractAnnotationFieldRefs(holder, element, Res.ID, true); - - if (holder.onOptionsItemSelectedIfElseBlock == null) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.BOOLEAN, "onOptionsItemSelected"); - method.annotate(Override.class); - holder.onOptionsItemSelectedItem = method.param(menuItemClass, "item"); - - JBlock body = method.body(); - JVar handled = body.decl(codeModel.BOOLEAN, "handled", invoke(_super(), method).arg(holder.onOptionsItemSelectedItem)); - - body._if(handled)._then()._return(TRUE); - - holder.onOptionsItemSelectedItemId = body.decl(codeModel.INT, "itemId_", holder.onOptionsItemSelectedItem.invoke("getItemId")); - holder.onOptionsItemSelectedIfElseBlock = body.block(); - - body._return(FALSE); - } - - JExpression ifExpr = holder.onOptionsItemSelectedItemId.eq(idsRefs.get(0)); - - for (int i = 1; i < idsRefs.size(); i++) { - ifExpr = ifExpr.cor(holder.onOptionsItemSelectedItemId.eq(idsRefs.get(i))); - } - - JBlock itemIfBody = holder.onOptionsItemSelectedIfElseBlock._if(ifExpr)._then(); - JInvocation methodCall = invoke(methodName); - - if (returnMethodResult) { - itemIfBody._return(methodCall); - } else { - itemIfBody.add(methodCall); - itemIfBody._return(TRUE); - } - - if (hasItemParameter) { - methodCall.arg(holder.onOptionsItemSelectedItem); - } - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsMenuItemProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsMenuItemProcessor.java deleted file mode 100644 index b99ab88561..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsMenuItemProcessor.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.ref; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.OptionsMenuItem; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JVar; - -/** - */ -public class OptionsMenuItemProcessor extends AbstractOptionsMenuProcessor { - - public OptionsMenuItemProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); - } - - @Override - public String getTarget() { - return OptionsMenuItem.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - super.process(element, codeModel, holder); - - String fieldName = element.getSimpleName().toString(); - JBlock body = holder.onCreateOptionMenuMethodBody; - JVar menuParam = holder.onCreateOptionMenuMenuParam; - - JFieldRef idsRef = annotationHelper.extractOneAnnotationFieldRef(holder, element, Res.ID, true); - - body.assign(ref(fieldName), menuParam.invoke("findItem").arg(idsRef)); - - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsMenuProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsMenuProcessor.java deleted file mode 100644 index 4234a22ac8..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OptionsMenuProcessor.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import java.util.List; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.OptionsMenu; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JVar; - -public class OptionsMenuProcessor extends AbstractOptionsMenuProcessor { - - public OptionsMenuProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); - } - - @Override - public String getTarget() { - return OptionsMenu.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - super.process(element, codeModel, holder); - - JBlock body = holder.onCreateOptionMenuMethodBody; - JVar menuInflater = holder.onCreateOptionMenuMenuInflaterVariable; - JVar menuParam = holder.onCreateOptionMenuMenuParam; - - List fieldRefs = annotationHelper.extractAnnotationFieldRefs(holder, element, Res.MENU, false); - - for (JFieldRef optionsMenuRefId : fieldRefs) { - body.invoke(menuInflater, "inflate").arg(optionsMenuRefId).arg(menuParam); - } - - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OrmLiteDaoProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OrmLiteDaoProcessor.java deleted file mode 100644 index 924e6c1c9f..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/OrmLiteDaoProcessor.java +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.ref; -import static com.sun.codemodel.JMod.PRIVATE; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.OrmLiteDao; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.processing.EBeansHolder.Classes; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCatchBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JTryBlock; -import com.sun.codemodel.JVar; - -/** - * This class generates the code that creates DAOs with ORMLite - */ -public class OrmLiteDaoProcessor implements DecoratingElementProcessor { - - private static final String DATABASE_HELPER_FIELD_NAME = "helper_"; - private TargetAnnotationHelper helper; - - public OrmLiteDaoProcessor(ProcessingEnvironment processingEnv) { - helper = new TargetAnnotationHelper(processingEnv, getTarget()); - } - - @Override - public String getTarget() { - return OrmLiteDao.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - Classes classes = holder.classes(); - - String fieldName = element.getSimpleName().toString(); - - TypeMirror modelObjectTypeMirror = helper.extractAnnotationParameter(element, "model"); - - TypeMirror databaseHelperTypeMirror = helper.extractAnnotationParameter(element, "helper"); - - // database helper field - boolean databaseHelperInjected = holder.generatedClass.fields().containsKey(DATABASE_HELPER_FIELD_NAME); - - JBlock initBody = holder.initBody; - - JFieldVar databaseHelperRef; - if (databaseHelperInjected) { - databaseHelperRef = holder.generatedClass.fields().get(DATABASE_HELPER_FIELD_NAME); - } else { - databaseHelperRef = holder.generatedClass.field(PRIVATE, holder.refClass(databaseHelperTypeMirror.toString()), DATABASE_HELPER_FIELD_NAME); - - // get database helper instance - JExpression dbHelperClass = holder.refClass(databaseHelperTypeMirror.toString()).dotclass(); - - initBody.assign(databaseHelperRef, // - classes.OPEN_HELPER_MANAGER // - .staticInvoke("getHelper") // - .arg(holder.contextRef) // - .arg(dbHelperClass)); - } - - - JExpression modelClass = holder.refClass(modelObjectTypeMirror.toString()).dotclass(); - - JExpression injectExpr; - if (elementExtendsRuntimeExceptionDao(element, modelObjectTypeMirror)) { - - injectExpr = classes.RUNTIME_EXCEPTION_DAO// - .staticInvoke("createDao") // - .arg(databaseHelperRef.invoke("getConnectionSource")) // - .arg(modelClass); - - } else { - - injectExpr = databaseHelperRef.invoke("getDao").arg(modelClass); - - } - - // create dao from database helper - JTryBlock tryBlock = initBody._try(); - - tryBlock.body().assign(ref(fieldName), injectExpr); - - JCatchBlock catchBlock = tryBlock._catch(classes.SQL_EXCEPTION); - JVar exception = catchBlock.param("e"); - - catchBlock.body() // - .staticInvoke(classes.LOG, "e") // - .arg(holder.generatedClass.name()) // - .arg("Could not create DAO " + fieldName) // - .arg(exception); - } - - private boolean elementExtendsRuntimeExceptionDao(Element element, TypeMirror modelObjectTypeMirror) { - TypeMirror elementType = element.asType(); - TypeElement runtimeExceptionDaoTypeElement = helper.typeElementFromQualifiedName(CanonicalNameConstants.RUNTIME_EXCEPTION_DAO); - TypeMirror wildcardType = helper.getTypeUtils().getWildcardType(null, null); - DeclaredType runtimeExceptionDaoParameterizedType = helper.getTypeUtils().getDeclaredType(runtimeExceptionDaoTypeElement, modelObjectTypeMirror, wildcardType); - return helper.isSubtype(elementType, runtimeExceptionDaoParameterizedType); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ProduceProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ProduceProcessor.java deleted file mode 100644 index be05b9dbd0..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ProduceProcessor.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static org.androidannotations.helper.CanonicalNameConstants.PRODUCE; - -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.helper.APTCodeModelHelper; - -import com.sun.codemodel.JClassAlreadyExistsException; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JMethod; - -public class ProduceProcessor implements DecoratingElementProcessor { - - private final APTCodeModelHelper helper = new APTCodeModelHelper(); - - @Override - public String getTarget() { - return PRODUCE; - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) throws JClassAlreadyExistsException { - - ExecutableElement executableElement = (ExecutableElement) element; - - JMethod delegatingMethod = helper.overrideAnnotatedMethod(executableElement, holder); - - delegatingMethod.annotate(holder.refClass(PRODUCE)); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ResProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ResProcessor.java deleted file mode 100644 index 7fce7b2ad9..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ResProcessor.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.invoke; -import static com.sun.codemodel.JExpr.ref; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.res.HtmlRes; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.model.AndroidRes; -import org.androidannotations.processing.EBeansHolder.Classes; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JFieldRef; - -public class ResProcessor implements DecoratingElementProcessor { - - private final AndroidRes androidValue; - - private final IdAnnotationHelper annotationHelper; - - public ResProcessor(ProcessingEnvironment processingEnv, AndroidRes androidValue, IRClass rClass) { - this.androidValue = androidValue; - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - } - - @Override - public String getTarget() { - return androidValue.getTarget(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - Classes classes = holder.classes(); - - String fieldName = element.getSimpleName().toString(); - - Res resInnerClass = androidValue.getRInnerClass(); - - JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(holder, element, resInnerClass, true); - - JBlock methodBody = holder.initBody; - - TypeMirror fieldTypeMirror = element.asType(); - String fieldType = fieldTypeMirror.toString(); - - // Special case for loading animations - if (CanonicalNameConstants.ANIMATION.equals(fieldType)) { - methodBody.assign(ref(fieldName), classes.ANIMATION_UTILS.staticInvoke("loadAnimation").arg(holder.contextRef).arg(idRef)); - } else { - if (holder.resources == null) { - holder.resources = methodBody.decl(classes.RESOURCES, "resources_", holder.contextRef.invoke("getResources")); - } - - String resourceMethodName = androidValue.getResourceMethodName(); - - // Special case for @HtmlRes - if (element.getAnnotation(HtmlRes.class) != null) { - methodBody.assign(ref(fieldName), classes.HTML.staticInvoke("fromHtml").arg(invoke(holder.resources, resourceMethodName).arg(idRef))); - } else { - methodBody.assign(ref(fieldName), invoke(holder.resources, resourceMethodName).arg(idRef)); - } - } - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/RestServiceProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/RestServiceProcessor.java deleted file mode 100644 index 52d42aa687..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/RestServiceProcessor.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.rest.RestService; -import org.androidannotations.helper.ModelConstants; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JFieldRef; - -public class RestServiceProcessor implements DecoratingElementProcessor { - - @Override - public String getTarget() { - return RestService.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - String fieldName = element.getSimpleName().toString(); - - TypeMirror fieldTypeMirror = element.asType(); - String interfaceName = fieldTypeMirror.toString(); - - String generatedClassName = interfaceName + ModelConstants.GENERATION_SUFFIX; - - JBlock methodBody = holder.initBody; - - JFieldRef field = JExpr.ref(fieldName); - - methodBody.assign(field, JExpr._new(holder.refClass(generatedClassName))); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/RoboGuiceProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/RoboGuiceProcessor.java deleted file mode 100644 index 5980634ff7..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/RoboGuiceProcessor.java +++ /dev/null @@ -1,287 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr._super; -import static com.sun.codemodel.JExpr._this; -import static com.sun.codemodel.JExpr.cast; -import static com.sun.codemodel.JExpr.invoke; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.RoboGuice; -import org.androidannotations.processing.EBeansHolder.Classes; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JTryBlock; -import com.sun.codemodel.JVar; - -public class RoboGuiceProcessor implements DecoratingElementProcessor { - - @Override - public String getTarget() { - return RoboGuice.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - holder.generatedClass._implements(holder.classes().INJECTOR_PROVIDER); - - // Fields - JFieldVar scope = scopeField(holder); - JFieldVar eventManager = eventManagerField(holder); - listenerFields(element, holder); - - // Methods - afterSetContentView(codeModel, holder, scope, eventManager); - onRestartMethod(codeModel, holder, scope, eventManager); - onStartMethod(codeModel, holder, scope, eventManager); - onResumeMethod(codeModel, holder, scope, eventManager); - onPauseMethod(codeModel, holder, scope, eventManager); - onNewIntentMethod(codeModel, holder, scope, eventManager); - onStopMethod(codeModel, holder, scope, eventManager); - onDestroyMethod(codeModel, holder, scope, eventManager); - onConfigurationChangedMethod(codeModel, holder, scope, eventManager); - onContentChangedMethod(codeModel, holder, scope, eventManager); - onActivityResultMethod(codeModel, holder, scope, eventManager); - - JMethod getInjectorMethod = getInjectorMethod(holder); - - beforeCreateMethod(holder, scope, eventManager, getInjectorMethod); - - } - - private JMethod getInjectorMethod(EBeanHolder holder) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, holder.classes().INJECTOR, "getInjector"); - method.annotate(Override.class); - JExpression castApplication = cast(holder.classes().INJECTOR_PROVIDER, invoke("getApplication")); - method.body()._return(castApplication.invoke("getInjector")); - return method; - } - - private void onRestartMethod(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onRestart"); - method.annotate(Override.class); - JBlock body = method.body(); - body.invoke(scope, "enter").arg(_this()); - body.invoke(_super(), method); - fireEvent(holder, eventManager, body, holder.classes().ON_RESTART_EVENT); - } - - private void onStartMethod(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onStart"); - method.annotate(Override.class); - JBlock body = method.body(); - body.invoke(scope, "enter").arg(_this()); - body.invoke(_super(), method); - fireEvent(holder, eventManager, body, holder.classes().ON_START_EVENT); - } - - private void onResumeMethod(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onResume"); - method.annotate(Override.class); - holder.onResumeBlock = method.body(); - holder.onResumeBlock.invoke(scope, "enter").arg(_this()); - holder.onResumeBlock.invoke(_super(), method); - fireEvent(holder, eventManager, holder.onResumeBlock, holder.classes().ON_RESUME_EVENT); - } - - private void onPauseMethod(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onPause"); - method.annotate(Override.class); - JBlock body = method.body(); - body.invoke(_super(), method); - fireEvent(holder, eventManager, body, holder.classes().ON_PAUSE_EVENT); - } - - private void onNewIntentMethod(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onNewIntent"); - method.annotate(Override.class); - JVar intent = method.param(holder.classes().INTENT, "intent"); - JBlock body = method.body(); - body.invoke(_super(), method).arg(intent); - body.invoke(scope, "enter").arg(_this()); - fireEvent(holder, eventManager, body, holder.classes().ON_NEW_INTENT_EVENT); - } - - private void fireEvent(EBeanHolder holder, JFieldVar eventManager, JBlock body, JClass eventClass, JExpression... eventArguments) { - JInvocation newEvent = _new(eventClass); - for (JExpression eventArgument : eventArguments) { - newEvent.arg(eventArgument); - } - body.invoke(eventManager, "fire").arg(newEvent); - } - - private void onStopMethod(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onStop"); - method.annotate(Override.class); - JBlock body = method.body(); - body.invoke(scope, "enter").arg(_this()); - - JTryBlock tryBlock = body._try(); - fireEvent(holder, eventManager, tryBlock.body(), holder.classes().ON_STOP_EVENT); - JBlock finallyBody = tryBlock._finally(); - - finallyBody.invoke(scope, "exit").arg(_this()); - finallyBody.invoke(_super(), method); - } - - private void onDestroyMethod(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onDestroy"); - method.annotate(Override.class); - holder.onDestroyBlock = method.body(); - holder.onDestroyBlock.invoke(scope, "enter").arg(_this()); - - JTryBlock tryBlock = holder.onDestroyBlock._try(); - fireEvent(holder, eventManager, tryBlock.body(), holder.classes().ON_DESTROY_EVENT); - JBlock finallyBody = tryBlock._finally(); - - finallyBody.invoke(eventManager, "clear").arg(_this()); - finallyBody.invoke(scope, "exit").arg(_this()); - finallyBody.invoke(scope, "dispose").arg(_this()); - finallyBody.invoke(_super(), method); - } - - private void onConfigurationChangedMethod(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onConfigurationChanged"); - method.annotate(Override.class); - JClass configurationClass = holder.classes().CONFIGURATION; - JVar newConfig = method.param(configurationClass, "newConfig"); - - JBlock body = method.body(); - JVar currentConfig = body.decl(configurationClass, "currentConfig", JExpr.invoke("getResources").invoke("getConfiguration")); - - body.invoke(_super(), method).arg(newConfig); - fireEvent(holder, eventManager, body, holder.classes().ON_CONFIGURATION_CHANGED_EVENT, currentConfig, newConfig); - } - - private void onContentChangedMethod(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onContentChanged"); - method.annotate(Override.class); - JBlock body = method.body(); - body.invoke(_super(), method); - fireEvent(holder, eventManager, body, holder.classes().ON_CONTENT_CHANGED_EVENT); - } - - private void onActivityResultMethod(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JMethod method = holder.generatedClass.method(JMod.PUBLIC, codeModel.VOID, "onActivityResult"); - method.annotate(Override.class); - JVar requestCode = method.param(codeModel.INT, "requestCode"); - JVar resultCode = method.param(codeModel.INT, "resultCode"); - JVar data = method.param(holder.classes().INTENT, "data"); - - JBlock body = method.body(); - - body.invoke(_super(), method).arg(requestCode).arg(resultCode).arg(data); - - body.invoke(scope, "enter").arg(_this()); - - JTryBlock tryBlock = body._try(); - fireEvent(holder, eventManager, tryBlock.body(), holder.classes().ON_ACTIVITY_RESULT_EVENT, requestCode, resultCode, data); - - JBlock finallyBody = tryBlock._finally(); - finallyBody.invoke(scope, "exit").arg(_this()); - } - - private void afterSetContentView(JCodeModel codeModel, EBeanHolder holder, JFieldVar scope, JFieldVar eventManager) { - JBlock onViewChanged = holder.onViewChanged().body(); - onViewChanged.invoke(scope, "injectViews"); - fireEvent(holder, eventManager, onViewChanged, holder.classes().ON_CONTENT_VIEW_AVAILABLE_EVENT); - } - - private JFieldVar eventManagerField(EBeanHolder holder) { - JFieldVar eventManager = holder.generatedClass.field(JMod.PRIVATE, holder.classes().EVENT_MANAGER, "eventManager_"); - return eventManager; - } - - private JFieldVar scopeField(EBeanHolder holder) { - JFieldVar scope = holder.generatedClass.field(JMod.PRIVATE, holder.classes().CONTEXT_SCOPE, "scope_"); - return scope; - } - - private void listenerFields(Element element, EBeanHolder holder) { - List listenerClasses = extractListenerClasses(element); - if (listenerClasses.size() > 0) { - int i = 1; - for (String listenerClassName : listenerClasses) { - JClass listenerClass = holder.refClass(listenerClassName); - JFieldVar listener = holder.generatedClass.field(JMod.PRIVATE, listenerClass, "listener" + i + "_"); - listener.annotate(SuppressWarnings.class).param("value", "unused"); - listener.annotate(holder.classes().INJECT); - i++; - } - } - } - - private List extractListenerClasses(Element activityElement) { - - List annotationMirrors = activityElement.getAnnotationMirrors(); - - String annotationName = RoboGuice.class.getName(); - AnnotationValue action = null; - for (AnnotationMirror annotationMirror : annotationMirrors) { - if (annotationName.equals(annotationMirror.getAnnotationType().toString())) { - for (Map.Entry entry : annotationMirror.getElementValues().entrySet()) { - if ("value".equals(entry.getKey().getSimpleName().toString())) { - action = entry.getValue(); - - @SuppressWarnings("unchecked") - List values = (List) action.getValue(); - - List listenerClasses = new ArrayList(); - - for (Object value : values) { - listenerClasses.add(value.toString()); - } - return listenerClasses; - - } - } - } - } - return new ArrayList(0); - } - - private void beforeCreateMethod(EBeanHolder holder, JFieldVar scope, JFieldVar eventManager, JMethod getInjector) { - Classes classes = holder.classes(); - - JBlock body = holder.initBody; - JVar injector = body.decl(classes.INJECTOR, "injector_", invoke(getInjector)); - body.assign(scope, invoke(injector, "getInstance").arg(classes.CONTEXT_SCOPE.dotclass())); - body.invoke(scope, "enter").arg(_this()); - body.invoke(injector, "injectMembers").arg(_this()); - body.assign(eventManager, invoke(injector, "getInstance").arg(classes.EVENT_MANAGER.dotclass())); - fireEvent(holder, eventManager, body, holder.classes().ON_CREATE_EVENT, holder.beforeCreateSavedInstanceStateParam); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/RootContextProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/RootContextProcessor.java deleted file mode 100644 index 2b2f7bfd33..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/RootContextProcessor.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.cast; -import static com.sun.codemodel.JExpr.lit; -import static com.sun.codemodel.JExpr.ref; -import static org.androidannotations.helper.CanonicalNameConstants.CONTEXT; - -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.RootContext; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JConditional; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JInvocation; - -public class RootContextProcessor implements DecoratingElementProcessor { - - @Override - public String getTarget() { - return RootContext.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - - String fieldName = element.getSimpleName().toString(); - - TypeMirror elementType = element.asType(); - - String typeQualifiedName = elementType.toString(); - - JBlock body = holder.initBody; - if (CONTEXT.equals(typeQualifiedName)) { - body.assign(ref(fieldName), holder.contextRef); - } else { - JClass extendingContextClass = holder.refClass(typeQualifiedName); - JConditional cond = body._if(holder.contextRef._instanceof(extendingContextClass)); - cond._then() // - .assign(ref(fieldName), cast(extendingContextClass, holder.contextRef)); - - JInvocation warningInvoke = holder.classes().LOG.staticInvoke("w"); - warningInvoke.arg(holder.generatedClass.name()); - JExpression expr = lit("Due to Context class ").plus(holder.contextRef.invoke("getClass").invoke("getSimpleName")).plus(lit(", the @RootContext " + extendingContextClass.name() + " won't be populated")); - warningInvoke.arg(expr); - cond._else() // - .add(warningInvoke); - } - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ServiceActionProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ServiceActionProcessor.java deleted file mode 100644 index 6823130fe7..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ServiceActionProcessor.java +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._null; -import static com.sun.codemodel.JExpr.lit; -import static com.sun.codemodel.JMod.FINAL; -import static com.sun.codemodel.JMod.PUBLIC; -import static com.sun.codemodel.JMod.STATIC; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.VariableElement; - -import org.androidannotations.annotations.ServiceAction; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.CaseHelper; -import org.androidannotations.processing.EBeansHolder.Classes; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JPrimitiveType; -import com.sun.codemodel.JType; -import com.sun.codemodel.JVar; - -public class ServiceActionProcessor implements DecoratingElementProcessor { - - private final APTCodeModelHelper helper = new APTCodeModelHelper(); - private final ProcessingEnvironment processingEnv; - - public ServiceActionProcessor(ProcessingEnvironment processingEnv) { - this.processingEnv = processingEnv; - } - - @Override - public String getTarget() { - return ServiceAction.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - Map extraKeyFields = new HashMap(); - - ExecutableElement executableElement = (ExecutableElement) element; - String methodName = element.getSimpleName().toString(); - - Classes classes = holder.classes(); - - // Action field - ServiceAction annotation = element.getAnnotation(ServiceAction.class); - String extraKey = annotation.value(); - if (extraKey.isEmpty()) { - extraKey = methodName; - } - - String staticFieldName = CaseHelper.camelCaseToUpperSnakeCase("action", methodName, null); - - JFieldVar actionKeyField = holder.generatedClass.field(PUBLIC | STATIC | FINAL, classes.STRING, staticFieldName, lit(extraKey)); - - if (holder.onHandleIntentBody != null) { - JBlock actionBlock = holder.onHandleIntentBody.block(); - - // getAction - JInvocation getActionInvok = holder.onHandleIntentIntent.invoke("getAction"); - JVar actionVar = actionBlock.decl(classes.STRING, "action", getActionInvok); - - // If action match, call the method - JBlock callActionBlock = actionBlock._if(actionKeyField.invoke("equals").arg(actionVar))._then(); - JInvocation callActionInvok = JExpr._super().invoke(methodName); - - // For each method params, we get back value from extras and put it - // in super calls - List methodParameters = executableElement.getParameters(); - if (methodParameters.size() > 0) { - if (holder.cast == null) { - helper.addCastMethod(codeModel, holder); - } - - // Extras - JVar extras = callActionBlock.decl(classes.BUNDLE, "extras"); - extras.init(holder.onHandleIntentIntent.invoke("getExtras")); - JBlock extrasNotNullBlock = callActionBlock._if(extras.ne(_null()))._then(); - - List extraFields = new ArrayList(); - - // Extras params - for (VariableElement param : methodParameters) { - holder.onHandleIntentIntent.invoke("getStringExtra"); - - String paramName = param.getSimpleName().toString(); - String extraParamName = paramName + "Extra"; - JClass extraParamClass = helper.typeMirrorToJClass(param.asType(), holder); - boolean isPrimitive = param.asType().getKind().isPrimitive(); - - String extraKeyName = CaseHelper.camelCaseToUpperSnakeCase(null, methodName + paramName, "Extra"); - JFieldVar extraKeyField = holder.generatedClass.field(PUBLIC | STATIC | FINAL, classes.STRING, extraKeyName, lit(extraKeyName)); - extraKeyFields.put(methodName + paramName, extraKeyField); - - JExpression extraInvok; - if (isPrimitive) { - JPrimitiveType primitiveType = JType.parse(codeModel, param.asType().toString()); - JClass wrapperType = primitiveType.boxify(); - extraInvok = JExpr.cast(wrapperType, extras.invoke("get").arg(extraKeyField)); - } else { - extraInvok = JExpr.invoke(holder.cast).arg(extras.invoke("get").arg(extraKeyField)); - } - JVar extraField = extrasNotNullBlock.decl(extraParamClass, extraParamName, extraInvok); - extraFields.add(extraField); - } - - for (JVar extraField : extraFields) { - callActionInvok.arg(extraField); - } - extrasNotNullBlock.add(callActionInvok); - } else { - callActionBlock.add(callActionInvok); - } - - callActionBlock._return(); - } - - /* - * holder.intentBuilderClass may be null if the annotated component is - * an abstract activity - */ - if (holder.intentBuilderClass != null) { - // flags() - JMethod method = holder.intentBuilderClass.method(PUBLIC, holder.intentBuilderClass, methodName); - JBlock body = method.body(); - - // setAction - body.invoke(holder.intentField, "setAction").arg(actionKeyField); - - // For each method params, we get put value into extras - List methodParameters = executableElement.getParameters(); - if (methodParameters.size() > 0) { - - // Extras params - for (VariableElement param : methodParameters) { - String paramName = param.getSimpleName().toString(); - - JFieldVar extraKeyField = extraKeyFields.get(methodName + paramName); - - helper.addIntentBuilderPutExtraMethod(codeModel, holder, helper, processingEnv, method, param.asType(), paramName, extraKeyField); - } - - } - body._return(JExpr._this()); - } - - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SharedPrefProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SharedPrefProcessor.java deleted file mode 100644 index 5a8d7a6158..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SharedPrefProcessor.java +++ /dev/null @@ -1,316 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.invoke; -import static com.sun.codemodel.JExpr.lit; -import static com.sun.codemodel.JMod.PRIVATE; -import static com.sun.codemodel.JMod.STATIC; -import static org.androidannotations.helper.CanonicalNameConstants.CONTEXT; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -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.util.ElementFilter; - -import org.androidannotations.annotations.sharedpreferences.DefaultBoolean; -import org.androidannotations.annotations.sharedpreferences.DefaultFloat; -import org.androidannotations.annotations.sharedpreferences.DefaultInt; -import org.androidannotations.annotations.sharedpreferences.DefaultLong; -import org.androidannotations.annotations.sharedpreferences.DefaultRes; -import org.androidannotations.annotations.sharedpreferences.DefaultString; -import org.androidannotations.annotations.sharedpreferences.SharedPref; -import org.androidannotations.annotations.sharedpreferences.SharedPref.Scope; -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.SharedPreferencesHelper; -import org.androidannotations.api.sharedpreferences.StringPrefEditorField; -import org.androidannotations.api.sharedpreferences.StringPrefField; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.IdAnnotationHelper; -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; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JFieldVar; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JVar; - -public class SharedPrefProcessor implements GeneratingElementProcessor { - - private static class EditorFieldHolder { - public final Class fieldClass; - public final String fieldMethodName; - - public EditorFieldHolder(Class fieldClass, String fieldMethodName) { - this.fieldClass = fieldClass; - this.fieldMethodName = fieldMethodName; - } - } - - private static final Map EDITOR_FIELD_BY_TYPE = new HashMap() { - private static final long serialVersionUID = 1L; - { - put("boolean", new EditorFieldHolder(BooleanPrefEditorField.class, "booleanField")); - put("float", new EditorFieldHolder(FloatPrefEditorField.class, "floatField")); - put("int", new EditorFieldHolder(IntPrefEditorField.class, "intField")); - put("long", new EditorFieldHolder(LongPrefEditorField.class, "longField")); - put(CanonicalNameConstants.STRING, new EditorFieldHolder(StringPrefEditorField.class, "stringField")); - } - }; - - private final IdAnnotationHelper annotationHelper; - - public SharedPrefProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - } - - @Override - public String getTarget() { - return SharedPref.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - TypeElement typeElement = (TypeElement) element; - String interfaceQualifiedName = typeElement.getQualifiedName().toString(); - String interfaceSimpleName = typeElement.getSimpleName().toString(); - - String helperQualifiedName = interfaceQualifiedName + ModelConstants.GENERATION_SUFFIX; - JDefinedClass helperClass = codeModel._class(JMod.PUBLIC | JMod.FINAL, helperQualifiedName, ClassType.CLASS); - EBeanHolder eBeanHolder = eBeansHolder.create(typeElement, SharedPref.class, helperClass); - - helperClass._extends(SharedPreferencesHelper.class); - - // Extracting valid methods - List members = typeElement.getEnclosedElements(); - List methods = ElementFilter.methodsIn(members); - List validMethods = new ArrayList(); - for (ExecutableElement method : methods) { - validMethods.add(method); - } - - // Static editor class - JDefinedClass editorClass = helperClass._class(JMod.PUBLIC | JMod.STATIC | JMod.FINAL, interfaceSimpleName + "Editor" + ModelConstants.GENERATION_SUFFIX); - - editorClass._extends(eBeansHolder.refClass(EditorHelper.class).narrow(editorClass)); - - // Editor constructor - JMethod editorConstructor = editorClass.constructor(JMod.NONE); - JClass sharedPreferencesClass = eBeansHolder.refClass("android.content.SharedPreferences"); - JVar sharedPreferencesParam = editorConstructor.param(sharedPreferencesClass, "sharedPreferences"); - editorConstructor.body().invoke("super").arg(sharedPreferencesParam); - - // Editor field methods - for (ExecutableElement method : validMethods) { - String returnType = method.getReturnType().toString(); - EditorFieldHolder editorFieldHolder = EDITOR_FIELD_BY_TYPE.get(returnType); - JClass editorFieldClass = eBeansHolder.refClass(editorFieldHolder.fieldClass); - String fieldName = method.getSimpleName().toString(); - JMethod editorFieldMethod = editorClass.method(JMod.PUBLIC, editorFieldClass.narrow(editorClass), fieldName); - editorFieldMethod.body()._return(JExpr.invoke(editorFieldHolder.fieldMethodName).arg(fieldName)); - } - - // Helper constructor - JClass contextClass = eBeansHolder.refClass(CanonicalNameConstants.CONTEXT); - - SharedPref sharedPrefAnnotation = typeElement.getAnnotation(SharedPref.class); - Scope scope = sharedPrefAnnotation.value(); - int mode = sharedPrefAnnotation.mode(); - JMethod constructor = helperClass.constructor(JMod.PUBLIC); - JVar contextParam = constructor.param(contextClass, "context"); - switch (scope) { - case ACTIVITY_DEFAULT: { - JMethod getLocalClassName = getLocalClassName(eBeansHolder, helperClass, codeModel); - constructor.body().invoke("super") // - .arg(contextParam.invoke("getSharedPreferences") // - .arg(invoke(getLocalClassName).arg(contextParam)) // - .arg(JExpr.lit(mode))); - break; - } - case ACTIVITY: { - JMethod getLocalClassName = getLocalClassName(eBeansHolder, helperClass, codeModel); - constructor.body().invoke("super") // - .arg(contextParam.invoke("getSharedPreferences") // - .arg(invoke(getLocalClassName).arg(contextParam) // - .plus(JExpr.lit("_" + interfaceSimpleName))) // - .arg(JExpr.lit(mode))); - break; - } - case UNIQUE: { - constructor.body() // - .invoke("super") // - .arg(contextParam.invoke("getSharedPreferences") // - .arg(JExpr.lit(interfaceSimpleName)) // - .arg(JExpr.lit(mode))); - break; - } - case APPLICATION_DEFAULT: { - JClass preferenceManagerClass = eBeansHolder.refClass("android.preference.PreferenceManager"); - constructor.body() // - .invoke("super") // - .arg(preferenceManagerClass.staticInvoke("getDefaultSharedPreferences") // - .arg(contextParam)); - break; - } - } - - // Context field - JFieldVar contextField = helperClass.field(JMod.PRIVATE, eBeansHolder.refClass(CONTEXT), "context"); - constructor.body().assign(JExpr._this().ref(contextField), contextParam); - - // Helper edit method - JMethod editMethod = helperClass.method(JMod.PUBLIC, editorClass, "edit"); - editMethod.body()._return(JExpr._new(editorClass).arg(JExpr.invoke("getSharedPreferences"))); - - // Helper field methods - for (ExecutableElement method : validMethods) { - String returnType = method.getReturnType().toString(); - String fieldName = method.getSimpleName().toString(); - if ("boolean".equals(returnType)) { - JExpression defaultValue; - DefaultBoolean defaultAnnotation = method.getAnnotation(DefaultBoolean.class); - if (defaultAnnotation != null) { - defaultValue = JExpr.lit(defaultAnnotation.value()); - } else if (method.getAnnotation(DefaultRes.class) != null) { - defaultValue = extractResValue(eBeanHolder, method, contextField, Res.BOOL); - } else { - defaultValue = JExpr.lit(false); - } - addFieldHelperMethod(helperClass, fieldName, defaultValue, BooleanPrefField.class, "booleanField"); - } else if ("float".equals(returnType)) { - JExpression defaultValue; - DefaultFloat defaultAnnotation = method.getAnnotation(DefaultFloat.class); - if (defaultAnnotation != null) { - defaultValue = JExpr.lit(defaultAnnotation.value()); - } else if (method.getAnnotation(DefaultRes.class) != null) { - defaultValue = extractResValue(eBeanHolder, method, contextField, Res.INTEGER); - } else { - defaultValue = JExpr.lit(0f); - } - addFieldHelperMethod(helperClass, fieldName, defaultValue, FloatPrefField.class, "floatField"); - } else if ("int".equals(returnType)) { - JExpression defaultValue; - DefaultInt defaultAnnotation = method.getAnnotation(DefaultInt.class); - if (defaultAnnotation != null) { - defaultValue = JExpr.lit(defaultAnnotation.value()); - } else if (method.getAnnotation(DefaultRes.class) != null) { - defaultValue = extractResValue(eBeanHolder, method, contextField, Res.INTEGER); - } else { - defaultValue = JExpr.lit(0); - } - addFieldHelperMethod(helperClass, fieldName, defaultValue, IntPrefField.class, "intField"); - } else if ("long".equals(returnType)) { - JExpression defaultValue; - DefaultLong defaultAnnotation = method.getAnnotation(DefaultLong.class); - if (defaultAnnotation != null) { - defaultValue = JExpr.lit(defaultAnnotation.value()); - } else if (method.getAnnotation(DefaultRes.class) != null) { - defaultValue = extractResValue(eBeanHolder, method, contextField, Res.INTEGER); - } else { - defaultValue = JExpr.lit(0l); - } - addFieldHelperMethod(helperClass, fieldName, defaultValue, LongPrefField.class, "longField"); - } else if (CanonicalNameConstants.STRING.equals(returnType)) { - JExpression defaultValue; - DefaultString defaultAnnotation = method.getAnnotation(DefaultString.class); - if (defaultAnnotation != null) { - defaultValue = JExpr.lit(defaultAnnotation.value()); - } else if (method.getAnnotation(DefaultRes.class) != null) { - defaultValue = extractResValue(eBeanHolder, method, contextField, Res.STRING); - } else { - defaultValue = JExpr.lit(""); - } - addFieldHelperMethod(helperClass, fieldName, defaultValue, StringPrefField.class, "stringField"); - } - } - } - - private JExpression extractResValue(EBeanHolder eBeanHolder, Element method, JFieldVar contextField, Res res) { - JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(eBeanHolder, method, DefaultRes.class.getCanonicalName(), res, true); - - String resourceGetMethodName = null; - switch (res) { - case BOOL: - resourceGetMethodName = "getBoolean"; - break; - case INTEGER: - resourceGetMethodName = "getInteger"; - break; - case STRING: - resourceGetMethodName = "getString"; - break; - default: - break; - } - return contextField.invoke("getResources").invoke(resourceGetMethodName).arg(idRef); - } - - private void addFieldHelperMethod(JDefinedClass helperClass, String fieldName, JExpression defaultValue, Class prefFieldHelperClass, String fieldHelperMethodName) { - JMethod fieldMethod = helperClass.method(JMod.PUBLIC, prefFieldHelperClass, fieldName); - fieldMethod.body()._return(JExpr.invoke(fieldHelperMethodName).arg(fieldName).arg(defaultValue)); - } - - private JMethod getLocalClassName(EBeansHolder eBeansHolder, JDefinedClass helperClass, JCodeModel codeModel) { - - JClass stringClass = eBeansHolder.refClass(String.class); - JMethod getLocalClassName = helperClass.method(PRIVATE | STATIC, stringClass, "getLocalClassName"); - JClass contextClass = eBeansHolder.refClass(CanonicalNameConstants.CONTEXT); - - JVar contextParam = getLocalClassName.param(contextClass, "context"); - - JBlock body = getLocalClassName.body(); - - JVar packageName = body.decl(stringClass, "packageName", contextParam.invoke("getPackageName")); - - JVar className = body.decl(stringClass, "className", contextParam.invoke("getClass").invoke("getName")); - - JVar packageLen = body.decl(codeModel.INT, "packageLen", packageName.invoke("length")); - - JExpression condition = className.invoke("startsWith").arg(packageName).not() // - .cor(className.invoke("length").lte(packageLen)) // - .cor(className.invoke("charAt").arg(packageLen).ne(lit('.'))); - - body._if(condition)._then()._return(className); - - body._return(className.invoke("substring").arg(packageLen.plus(lit(1)))); - - return getLocalClassName; - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SubscribeProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SubscribeProcessor.java deleted file mode 100644 index e4b97e5cdf..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/SubscribeProcessor.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static org.androidannotations.helper.CanonicalNameConstants.SUBSCRIBE; - -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.helper.APTCodeModelHelper; - -import com.sun.codemodel.JClassAlreadyExistsException; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JMethod; - -public class SubscribeProcessor implements DecoratingElementProcessor { - - private final APTCodeModelHelper helper = new APTCodeModelHelper(); - - @Override - public String getTarget() { - return SUBSCRIBE; - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) throws JClassAlreadyExistsException { - - ExecutableElement executableElement = (ExecutableElement) element; - - JMethod delegatingMethod = helper.overrideAnnotatedMethod(executableElement, holder); - - delegatingMethod.annotate(holder.refClass(SUBSCRIBE)); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TextWatcherHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TextWatcherHolder.java deleted file mode 100644 index 87f85cbcc1..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/TextWatcherHolder.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -public class TextWatcherHolder { - - final JMethod afterTextChangedMethod; - - final JMethod beforeTextChangedMethod; - - final JMethod onTextChangedMethod; - - final JVar viewVariable; - - public TextWatcherHolder(// - JMethod afterTextChangedMethod, // - JMethod beforeTextChangedMethod, // - JMethod onTextChangedMethod, JVar viewVariable) { - - this.afterTextChangedMethod = afterTextChangedMethod; - this.beforeTextChangedMethod = beforeTextChangedMethod; - this.onTextChangedMethod = onTextChangedMethod; - this.viewVariable = viewVariable; - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/UiThreadProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/UiThreadProcessor.java deleted file mode 100644 index ebf1564a90..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/UiThreadProcessor.java +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr._new; -import static com.sun.codemodel.JExpr.lit; - -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.UiThread; -import org.androidannotations.annotations.UiThread.Propagation; -import org.androidannotations.helper.APTCodeModelHelper; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JClassAlreadyExistsException; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JConditional; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JOp; - -public class UiThreadProcessor implements DecoratingElementProcessor { - - private static final String METHOD_CUR_THREAD = "currentThread"; - private static final String METHOD_MAIN_LOOPER = "getMainLooper"; - private static final String METHOD_GET_THREAD = "getThread"; - - private final APTCodeModelHelper helper = new APTCodeModelHelper(); - - @Override - public String getTarget() { - return UiThread.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) throws JClassAlreadyExistsException { - - ExecutableElement executableElement = (ExecutableElement) element; - UiThread annotation = element.getAnnotation(UiThread.class); - Propagation propagation = annotation.propagation(); - - JMethod delegatingMethod = helper.overrideAnnotatedMethod(executableElement, holder); - - JDefinedClass anonymousRunnableClass = helper.createDelegatingAnonymousRunnableClass(holder, delegatingMethod); - - { - // Execute Runnable - long delay = annotation.delay(); - - if (holder.handler == null) { - JClass handlerClass = holder.classes().HANDLER; - JClass lClass = holder.classes().LOOPER; - JInvocation arg = JExpr._new(handlerClass).arg(lClass.staticInvoke(METHOD_MAIN_LOOPER)); - holder.handler = holder.generatedClass.field(JMod.PRIVATE, handlerClass, "handler_", arg); - } - - if (delay == 0) { - if (propagation == Propagation.REUSE) { - // Put in the check for the UI thread. - addUIThreadCheck(delegatingMethod, codeModel, holder); - } - - delegatingMethod.body().invoke(holder.handler, "post").arg(_new(anonymousRunnableClass)); - } else { - delegatingMethod.body().invoke(holder.handler, "postDelayed").arg(_new(anonymousRunnableClass)).arg(lit(delay)); - } - } - - } - - /** - * Add the pre-check to see if we are already in the UI thread. - * - * @param delegatingMethod - * @param codeModel - * @param holder - * @throws JClassAlreadyExistsException - */ - private void addUIThreadCheck(JMethod delegatingMethod, JCodeModel codeModel, EBeanHolder holder) throws JClassAlreadyExistsException { - // Get the Thread and Looper class. - JClass tClass = holder.classes().THREAD; - JClass lClass = holder.classes().LOOPER; - - // invoke the methods. - JExpression lhs = tClass.staticInvoke(METHOD_CUR_THREAD); - JExpression rhs = lClass.staticInvoke(METHOD_MAIN_LOOPER).invoke(METHOD_GET_THREAD); - - // create the conditional and the block. - JConditional con = delegatingMethod.body()._if(JOp.eq(lhs, rhs)); - JBlock thenBlock = con._then(); - - helper.callSuperMethod(delegatingMethod, holder, thenBlock); - - thenBlock._return(); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ViewByIdProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ViewByIdProcessor.java deleted file mode 100644 index 9ad31c6f1f..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ViewByIdProcessor.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.cast; -import static com.sun.codemodel.JExpr.ref; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.ViewById; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JFieldRef; - -public class ViewByIdProcessor implements DecoratingElementProcessor { - - private final IdAnnotationHelper annotationHelper; - - public ViewByIdProcessor(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - } - - @Override - public String getTarget() { - return ViewById.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - String fieldName = element.getSimpleName().toString(); - - TypeMirror uiFieldTypeMirror = element.asType(); - String typeQualifiedName = uiFieldTypeMirror.toString(); - - JFieldRef idRef = annotationHelper.extractOneAnnotationFieldRef(holder, element, Res.ID, true); - - ViewChangedHolder onViewChanged = holder.onViewChanged(); - JBlock methodBody = onViewChanged.body(); - methodBody.assign(ref(fieldName), cast(holder.refClass(typeQualifiedName), onViewChanged.findViewById(idRef))); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ViewChangedHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ViewChangedHolder.java deleted file mode 100644 index a1f02530b4..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/ViewChangedHolder.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import static com.sun.codemodel.JExpr.invoke; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JFieldRef; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JVar; - -public class ViewChangedHolder { - - private JMethod onViewChanged; - private JVar onViewChangedHasViewsParam; - - public ViewChangedHolder(JMethod onViewChanged, JVar onViewChangedHasViewsParam) { - this.onViewChanged = onViewChanged; - this.onViewChangedHasViewsParam = onViewChangedHasViewsParam; - } - - public JBlock body() { - return onViewChanged.body(); - } - - public JInvocation findViewById(JFieldRef idRef) { - JInvocation findViewById = invoke(onViewChangedHasViewsParam, "findViewById"); - findViewById.arg(idRef); - return findViewById; - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/WindowFeatureProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/WindowFeatureProcessor.java deleted file mode 100644 index b1107b356b..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/WindowFeatureProcessor.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing; - -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.WindowFeature; - -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; - -public class WindowFeatureProcessor implements DecoratingElementProcessor { - - @Override - public String getTarget() { - return WindowFeature.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - WindowFeature annotation = element.getAnnotation(WindowFeature.class); - int[] features = annotation.value(); - - for (int feature : features) { - holder.initBody.invoke("requestWindowFeature").arg(JExpr.lit(feature)); - } - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/DeleteProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/DeleteProcessor.java deleted file mode 100644 index 0d0ff82ef4..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/DeleteProcessor.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.rest.Delete; - -public class DeleteProcessor extends MethodCrudProcessor { - - public DeleteProcessor(ProcessingEnvironment processingEnv, RestImplementationsHolder restImplementationsHolder) { - super(processingEnv, restImplementationsHolder); - } - - @Override - public String getTarget() { - return Delete.class.getName(); - } - - @Override - public String retrieveUrlSuffix(Element element) { - Delete getAnnotation = element.getAnnotation(Delete.class); - return getAnnotation.value(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/GetProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/GetProcessor.java deleted file mode 100644 index 0a10981911..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/GetProcessor.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.rest.Get; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.processing.EBeanHolder; - -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JVar; - -public class GetProcessor extends MethodCrudProcessor { - - public GetProcessor(ProcessingEnvironment processingEnv, RestImplementationsHolder restImplementationHolder) { - super(processingEnv, restImplementationHolder); - } - - @Override - public String getTarget() { - return Get.class.getName(); - } - - @Override - public String retrieveUrlSuffix(Element element) { - Get getAnnotation = element.getAnnotation(Get.class); - return getAnnotation.value(); - } - - @Override - protected JExpression generateHttpEntityVar(MethodProcessorHolder methodHolder) { - ExecutableElement executableElement = (ExecutableElement) methodHolder.getElement(); - EBeanHolder holder = methodHolder.getHolder(); - JClass httpEntity = holder.refClass(CanonicalNameConstants.HTTP_ENTITY); - - JBlock body = methodHolder.getBody(); - JVar httpHeadersVar = generateHttpHeadersVar(methodHolder, holder, body, executableElement); - - boolean hasHeaders = httpHeadersVar != null; - - if (hasHeaders) { - JInvocation newHttpEntityVarCall = JExpr._new(httpEntity.narrow(Object.class)); - newHttpEntityVarCall.arg(httpHeadersVar); - - String httpEntityVarName = "requestEntity"; - - return body.decl(httpEntity.narrow(Object.class), httpEntityVarName, newHttpEntityVarCall); - } else { - return JExpr._null(); - } - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/HeadProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/HeadProcessor.java deleted file mode 100644 index 203fb700a0..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/HeadProcessor.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.rest.Head; -import org.androidannotations.processing.EBeanHolder; - -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; - -public class HeadProcessor extends MethodProcessor { - - public HeadProcessor(ProcessingEnvironment processingEnv, RestImplementationsHolder restImplementationsHolder) { - super(processingEnv, restImplementationsHolder); - } - - @Override - public String getTarget() { - return Head.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) throws Exception { - - ExecutableElement executableElement = (ExecutableElement) element; - - TypeMirror returnType = executableElement.getReturnType(); - - JClass expectedClass = holder.refClass(returnType.toString()); - - Head headAnnotation = element.getAnnotation(Head.class); - String urlSuffix = headAnnotation.value(); - - generateRestTemplateCallBlock(new MethodProcessorHolder(holder, executableElement, urlSuffix, expectedClass, expectedClass, codeModel)); - } - - @Override - protected JExpression addResultCallMethod(JExpression restCall, MethodProcessorHolder methodHolder) { - return JExpr.invoke(restCall, "getHeaders"); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/MethodCrudProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/MethodCrudProcessor.java deleted file mode 100644 index d7b3a4e911..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/MethodCrudProcessor.java +++ /dev/null @@ -1,279 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing.rest; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.ArrayType; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.type.WildcardType; - -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.processing.EBeanHolder; - -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JPackage; - -public abstract class MethodCrudProcessor extends MethodProcessor { - - protected EBeanHolder holder; - - /** - * Will be use to generate specific classes - */ - protected JPackage restClientPackage; - - protected APTCodeModelHelper helper; - - public MethodCrudProcessor(ProcessingEnvironment processingEnv, RestImplementationsHolder restImplementationsHolder) { - super(processingEnv, restImplementationsHolder); - helper = new APTCodeModelHelper(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) { - this.holder = holder; - restClientPackage = restImplementationsHolder.getEnclosingHolder(element).restImplementationClass._package(); - - String urlSuffix = retrieveUrlSuffix(element); - - ExecutableElement executableElement = (ExecutableElement) element; - MethodProcessorHolder processorHolder = new MethodProcessorHolder(holder, executableElement, urlSuffix, null, null, codeModel); - - // Retrieve return type - TypeMirror returnType = executableElement.getReturnType(); - if (returnType.getKind() != TypeKind.VOID) { - retrieveReturnAndExpectedClasses(returnType, processorHolder); - } - - generateRestTemplateCallBlock(processorHolder); - } - - public abstract String retrieveUrlSuffix(Element element); - - /** - * Retrieve the expected and method return classes to use in generated code. - *

- * If the annotated method return a ResponseEntity<T> then : - * - *

-	 * expectedClass = T.class, methodReturnClass = ResponseEntity<T>
-	 * 
- * - * - * @param returnType - * @param processorHolder - */ - public void retrieveReturnAndExpectedClasses(TypeMirror returnType, MethodProcessorHolder processorHolder) { - String returnTypeString = returnType.toString(); - - JClass expectedClass = null; - JClass returnClass = helper.typeMirrorToJClass(returnType, holder); - - if (returnTypeString.startsWith(CanonicalNameConstants.RESPONSE_ENTITY)) { - DeclaredType declaredReturnType = (DeclaredType) returnType; - if (declaredReturnType.getTypeArguments().size() > 0) { - expectedClass = resolveExpectedClass(declaredReturnType.getTypeArguments().get(0)); - } else { - expectedClass = holder.refClass(CanonicalNameConstants.RESPONSE_ENTITY); - } - } else { - expectedClass = resolveExpectedClass(returnType); - } - - processorHolder.setExpectedClass(expectedClass); - processorHolder.setMethodReturnClass(returnClass); - } - - /** - * Resolve the expected class for the input type according to the following - * rules : - *
    - *
  • The type is a primitive : Directly return the JClass as usual
  • - *
  • The type is NOT a generics : Directly return the JClass as usual
  • - *
  • The type is a generics and enclosing type is a class C<T> : - * Generate a subclass of C<T> and return it
  • - *
  • The type is a generics and enclosing type is an interface I<T> - * : Looking the inheritance tree, then
  • - *
      - *
    1. One of the parent is a {@link Map} : Generate a subclass of - * {@link LinkedHashMap}<T> one and return it
    2. - *
    3. One of the parent is a {@link Set} : Generate a subclass of - * {@link TreeSet}<T> one and return it
    4. - *
    5. One of the parent is a {@link Collection} : Generate a subclass of - * {@link ArrayList}<T> one and return it
    6. - *
    7. Return {@link Object} definition
    8. - *
    - *
- * - * @param expectedType - */ - private JClass resolveExpectedClass(TypeMirror expectedType) { - // is a class or an interface - if (expectedType.getKind() == TypeKind.DECLARED) { - DeclaredType declaredType = (DeclaredType) expectedType; - - List typeArguments = declaredType.getTypeArguments(); - - // is NOT a generics, return directly - if (typeArguments.isEmpty()) { - return helper.typeMirrorToJClass(declaredType, holder); - } - - // is a generics, must generate a new super class - TypeElement declaredElement = (TypeElement) declaredType.asElement(); - - JClass baseClass = helper.typeMirrorToJClass(declaredType, holder).erasure(); - JClass decoratedExpectedClass = retrieveDecoratedExpectedClass(declaredType, declaredElement); - if (decoratedExpectedClass == null) { - decoratedExpectedClass = baseClass; - } - return decoratedExpectedClass; - } else if (expectedType.getKind() == TypeKind.ARRAY) { - ArrayType arrayType = (ArrayType) expectedType; - return resolveExpectedClass(arrayType.getComponentType()).array(); - } - - // is not a class nor an interface, return directly - return helper.typeMirrorToJClass(expectedType, holder); - } - - /** - * Recursive method used to find if one of the grand-parent of the - * enclosingJClass is {@link Map}, {@link Set} or - * {@link Collection}. - * - * @param declaredType - * @param currentClass - * @return - */ - private JClass retrieveDecoratedExpectedClass(DeclaredType declaredType, TypeElement typeElement) { - String classTypeBaseName = typeElement.toString(); - - // Looking for basic java.util interfaces to set a default - // implementation - String decoratedClassName = null; - - if (typeElement.getKind() == ElementKind.INTERFACE) { - if (classTypeBaseName.equals(CanonicalNameConstants.MAP)) { - decoratedClassName = LinkedHashMap.class.getCanonicalName(); - } else if (classTypeBaseName.equals(CanonicalNameConstants.SET)) { - decoratedClassName = TreeSet.class.getCanonicalName(); - } else if (classTypeBaseName.equals(CanonicalNameConstants.LIST)) { - decoratedClassName = ArrayList.class.getCanonicalName(); - } else if (classTypeBaseName.equals(CanonicalNameConstants.COLLECTION)) { - decoratedClassName = ArrayList.class.getCanonicalName(); - } - } else { - decoratedClassName = typeElement.getQualifiedName().toString(); - } - - if (decoratedClassName != null) { - // Configure the super class of the final decorated class - String decoratedClassNameSuffix = ""; - JClass decoratedSuperClass = holder.refClass(decoratedClassName); - for (TypeMirror typeArgument : declaredType.getTypeArguments()) { - if (typeArgument instanceof WildcardType) { - WildcardType wildcardType = (WildcardType) typeArgument; - if (wildcardType.getExtendsBound() != null) { - typeArgument = wildcardType.getExtendsBound(); - } else if (wildcardType.getSuperBound() != null) { - typeArgument = wildcardType.getSuperBound(); - } - } - JClass narrowJClass = helper.typeMirrorToJClass(typeArgument, holder); - decoratedSuperClass = decoratedSuperClass.narrow(narrowJClass); - decoratedClassNameSuffix += plainName(narrowJClass); - } - - String decoratedFinalClassName = classTypeBaseName + "_" + decoratedClassNameSuffix; - decoratedFinalClassName = decoratedFinalClassName.replaceAll("\\[\\]", "s"); - decoratedFinalClassName = restClientPackage.name() + "." + decoratedFinalClassName; - JDefinedClass decoratedJClass = holder.definedClass(decoratedFinalClassName); - decoratedJClass._extends(decoratedSuperClass); - - return decoratedJClass; - } - - // Try to find the superclass and make a recursive call to the this - // method - TypeMirror enclosingSuperJClass = typeElement.getSuperclass(); - if (enclosingSuperJClass != null && enclosingSuperJClass.getKind() == TypeKind.DECLARED) { - DeclaredType declaredEnclosingSuperJClass = (DeclaredType) enclosingSuperJClass; - return retrieveDecoratedExpectedClass(declaredType, (TypeElement) declaredEnclosingSuperJClass.asElement()); - } - - // Falling back to the current enclosingJClass if Class can't be found - return null; - } - - protected String plainName(JClass jClass) { - String plainName = jClass.erasure().name(); - List typeParameters = jClass.getTypeParameters(); - if (typeParameters.size() > 0) { - plainName += "_"; - for (JClass typeParameter : typeParameters) { - plainName += plainName(typeParameter); - } - } - return plainName; - } - - @Override - protected JInvocation addResponseEntityArg(JInvocation restCall, MethodProcessorHolder methodHolder) { - JClass expectedClass = methodHolder.getExpectedClass(); - - if (expectedClass != null) { - return restCall.arg(expectedClass.dotclass()); - } else { - return restCall.arg(JExpr._null()); - } - } - - @Override - protected JExpression addResultCallMethod(JExpression restCall, MethodProcessorHolder methodHolder) { - JClass generatedReturnType = methodHolder.getMethodReturnClass(); - if (generatedReturnType == null) { - return restCall; - } - - if (!generatedReturnType.fullName().startsWith(CanonicalNameConstants.RESPONSE_ENTITY)) { - restCall = JExpr.invoke(restCall, "getBody"); - } - - return restCall; - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/MethodProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/MethodProcessor.java deleted file mode 100644 index caf47a6a3f..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/MethodProcessor.java +++ /dev/null @@ -1,496 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing.rest; - -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.VariableElement; - -import org.androidannotations.annotations.rest.Accept; -import org.androidannotations.annotations.rest.RequiresAuthentication; -import org.androidannotations.annotations.rest.RequiresCookie; -import org.androidannotations.annotations.rest.RequiresCookieInUrl; -import org.androidannotations.annotations.rest.RequiresHeader; -import org.androidannotations.annotations.rest.SetsCookie; -import org.androidannotations.helper.APTCodeModelHelper; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.RestAnnotationHelper; -import org.androidannotations.processing.DecoratingElementProcessor; -import org.androidannotations.processing.EBeanHolder; - -import com.sun.codemodel.JArray; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JCatchBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JConditional; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; -import com.sun.codemodel.JForEach; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JOp; -import com.sun.codemodel.JTryBlock; -import com.sun.codemodel.JType; -import com.sun.codemodel.JVar; - -public abstract class MethodProcessor implements DecoratingElementProcessor { - - protected final RestImplementationsHolder restImplementationsHolder; - protected final RestAnnotationHelper restAnnotationHelper; - protected final APTCodeModelHelper helper = new APTCodeModelHelper(); - - public MethodProcessor(ProcessingEnvironment processingEnv, RestImplementationsHolder restImplementationsHolder) { - this.restImplementationsHolder = restImplementationsHolder; - restAnnotationHelper = new RestAnnotationHelper(processingEnv, getTarget()); - } - - protected void generateRestTemplateCallBlock(MethodProcessorHolder methodHolder) { - RestImplementationHolder holder = restImplementationsHolder.getEnclosingHolder(methodHolder.getElement()); - ExecutableElement executableElement = (ExecutableElement) methodHolder.getElement(); - EBeanHolder eBeanHolder = methodHolder.getHolder(); - JClass expectedClass = methodHolder.getExpectedClass(); - JClass methodReturnClass = methodHolder.getMethodReturnClass(); - - // Creating method signature - JMethod method; - String methodName = executableElement.getSimpleName().toString(); - boolean methodReturnVoid = methodReturnClass == null && expectedClass == null; - if (methodReturnVoid) { - method = holder.restImplementationClass.method(JMod.PUBLIC, void.class, methodName); - } else { - method = holder.restImplementationClass.method(JMod.PUBLIC, methodHolder.getMethodReturnClass(), methodName); - } - method.annotate(Override.class); - - // Keep a reference on method's body - JBlock body = method.body(); - methodHolder.setBody(body); - - // Keep a reference on method's parameters - TreeMap methodParams = extractMethodParamsVar(eBeanHolder, method, executableElement, holder); - methodHolder.setMethodParams(methodParams); - - // RestTemplate exchange() method call - JInvocation restCall = JExpr.invoke(holder.restTemplateField, "exchange"); - - final String urlSuffix = methodHolder.getUrlSuffix(); - if (!(urlSuffix.startsWith("http://") || urlSuffix.startsWith("https://"))) { - // RestTemplate exchange() 1st arg : concat root url + suffix - JInvocation concatCall = JExpr.invoke(holder.rootUrlField, "concat"); - - // RestTemplate exchange() 2nd arg : add url param - restCall.arg(concatCall.arg(JExpr.lit(urlSuffix))); - } else { - // full url provided... don't prefix - restCall.arg(JExpr.lit(urlSuffix)); - } - - // RestTemplate exchange() 3rd arg : add HttpMethod type param - JClass httpMethod = eBeanHolder.refClass(CanonicalNameConstants.HTTP_METHOD); - - // add method type param - String simpleName = getTarget().substring(getTarget().lastIndexOf('.') + 1); - String restMethodInCapitalLetters = simpleName.toUpperCase(Locale.ENGLISH); - - restCall.arg(httpMethod.staticRef(restMethodInCapitalLetters)); - - JVar hashMapVar = generateHashMapVar(holder, methodHolder); - - restCall = addHttpEntityVar(restCall, methodHolder); - restCall = addResponseEntityArg(restCall, methodHolder); - - if (hashMapVar != null) { - restCall.arg(hashMapVar); - } - - final JExpression result; - final boolean usesInstance; // do we have an instance of the entity? - - // attempt to retrieve cookies from the response - String[] settingCookies = retrieveSettingCookieNames(executableElement); - boolean setsCookies = settingCookies != null; - if (setsCookies) { - - JClass voidClass = eBeanHolder.refClass(Void.class); - JClass responseEntityClass = eBeanHolder.refClass(CanonicalNameConstants.RESPONSE_ENTITY).narrow(methodReturnVoid ? voidClass : expectedClass); - JVar responseEntity = body.decl(responseEntityClass, "response", restCall); - - // set cookies - JClass listClass = eBeanHolder.refClass(List.class).narrow(String.class); - JClass stringClass = eBeanHolder.refClass(CanonicalNameConstants.STRING); - JClass stringArrayClass = stringClass.array(); - JArray cookiesArray = JExpr.newArray(stringClass); - for (String cookie : settingCookies) { - cookiesArray.add(JExpr.lit(cookie)); - } - JVar requestedCookiesVar = body.decl(stringArrayClass, "requestedCookies", cookiesArray); - - JInvocation setCookiesList = JExpr.invoke(responseEntity, "getHeaders").invoke("get").arg("Set-Cookie"); - JVar allCookiesList = body.decl(listClass, "allCookies", setCookiesList); - - // for loop over list... add if in string array - JForEach forEach = body.forEach(stringClass, "rawCookie", allCookiesList); - JVar rawCookieVar = forEach.var(); - - JBlock forLoopBody = forEach.body(); - - JForEach innerForEach = forLoopBody.forEach(stringClass, "thisCookieName", requestedCookiesVar); - JBlock innerBody = innerForEach.body(); - JBlock thenBlock = innerBody._if(JExpr.invoke(rawCookieVar, "startsWith").arg(innerForEach.var()))._then(); - - // where does the cookie VALUE end? - JInvocation valueEnd = rawCookieVar.invoke("indexOf").arg(JExpr.lit(';')); - JVar valueEndVar = thenBlock.decl(methodHolder.getCodeModel().INT, "valueEnd", valueEnd); - JBlock fixValueEndBlock = thenBlock._if(valueEndVar.eq(JExpr.lit(-1)))._then(); - fixValueEndBlock.assign(valueEndVar, rawCookieVar.invoke("length")); - - JExpression indexOfValue = rawCookieVar.invoke("indexOf").arg("=").plus(JExpr.lit(1)); - JInvocation cookieValue = rawCookieVar.invoke("substring").arg(indexOfValue).arg(valueEndVar); - thenBlock.invoke(holder.availableCookiesField, "put").arg(innerForEach.var()).arg(cookieValue); - thenBlock._break(); - - result = JExpr.ref(responseEntity.name()); - usesInstance = true; - } else { - result = restCall; - usesInstance = false; - } - - insertRestCallInBody(body, result, methodHolder, methodReturnVoid, usesInstance); - } - - /** - * Add the HttpEntity attribute to restTemplate.exchange() method. - */ - protected JInvocation addHttpEntityVar(JInvocation restCall, MethodProcessorHolder methodHolder) { - return restCall.arg(generateHttpEntityVar(methodHolder)); - } - - /** - * Add the response type to restTemplate.exchange() method. This is used to - * bind the response into a specific Java object. - */ - protected JInvocation addResponseEntityArg(JInvocation restCall, MethodProcessorHolder methodHolder) { - return restCall.arg(JExpr._null()); - } - - /** - * Add an extra method calls on the result of restTemplate.exchange(). By - * default, just return the result - */ - protected JExpression addResultCallMethod(JExpression restCall, MethodProcessorHolder methodHolder) { - return restCall; - } - - private void insertRestCallInBody(JBlock body, JExpression restCall, MethodProcessorHolder methodHolder, boolean methodReturnVoid, boolean usesInstance) { - if (methodReturnVoid && !usesInstance && restCall instanceof JInvocation) { - insertRestTryCatchBlock(body, restCall, methodHolder, methodReturnVoid); - } else if (!methodReturnVoid) { - insertRestTryCatchBlock(body, addResultCallMethod(restCall, methodHolder), methodHolder, methodReturnVoid); - } - } - - /** - * Adds the try/catch around the rest execution code. - * - * If an exception is caught, it will first check if the handler is set. If - * the handler is set, it will call the handler and return null (or nothing - * if void). If the handler isn't set, it will re-throw the exception so - * that it behaves as it did previous to this feature. - * - * @param body - * @param restCall - * @param methodHolder - * @param methodReturnVoid - */ - private void insertRestTryCatchBlock(JBlock body, JExpression restCall, MethodProcessorHolder methodHolder, boolean methodReturnVoid) { - RestImplementationHolder holder = restImplementationsHolder.getEnclosingHolder(methodHolder.getElement()); - - JTryBlock tryBlock = body._try(); - - if (methodReturnVoid) { - tryBlock.body().add((JInvocation) restCall); - } else { - tryBlock.body()._return(restCall); - } - - JCatchBlock jcatch = tryBlock._catch(methodHolder.getHolder().classes().REST_CLIENT_EXCEPTION); - - JBlock catchBlock = jcatch.body(); - JConditional con = catchBlock._if(JOp.ne(holder.restErrorHandlerField, JExpr._null())); - JVar excParam = jcatch.param("e"); - - JBlock thenBlock = con._then(); - - // call the handler method if it was set. - thenBlock.add(holder.restErrorHandlerField.invoke("onRestClientExceptionThrown").arg(excParam)); - - // return null if exception was caught and handled. - if (!methodReturnVoid) { - thenBlock._return(JExpr._null()); - } - - // re-throw the exception if handler wasn't set. - con._else()._throw(excParam); - } - - private JVar generateHashMapVar(RestImplementationHolder holder, MethodProcessorHolder methodHolder) { - ExecutableElement element = (ExecutableElement) methodHolder.getElement(); - JCodeModel codeModel = methodHolder.getCodeModel(); - JBlock body = methodHolder.getBody(); - Map methodParams = methodHolder.getMethodParams(); - JVar hashMapVar = null; - - Set urlVariables = restAnnotationHelper.extractUrlVariableNames(element); - - // cookies in url? - String[] cookiesToUrl = retrieveRequiredUrlCookieNames(element); - if (cookiesToUrl != null) { - for (String cookie : cookiesToUrl) { - urlVariables.add(cookie); - } - } - - JClass hashMapClass = codeModel.ref(HashMap.class).narrow(String.class, Object.class); - if (!urlVariables.isEmpty()) { - hashMapVar = body.decl(hashMapClass, "urlVariables", JExpr._new(hashMapClass)); - - for (String urlVariable : urlVariables) { - JVar methodParam = methodParams.get(urlVariable); - if (methodParam != null) { - body.invoke(hashMapVar, "put").arg(urlVariable).arg(methodParam); - methodParams.remove(urlVariable); - } else { - // cookie from url - JInvocation cookieValue = holder.availableCookiesField.invoke("get").arg(JExpr.lit(urlVariable)); - body.invoke(hashMapVar, "put").arg(urlVariable).arg(cookieValue); - } - } - } - return hashMapVar; - } - - protected JExpression generateHttpEntityVar(MethodProcessorHolder methodHolder) { - ExecutableElement executableElement = (ExecutableElement) methodHolder.getElement(); - EBeanHolder holder = methodHolder.getHolder(); - JClass httpEntity = holder.refClass(CanonicalNameConstants.HTTP_ENTITY); - JInvocation newHttpEntityVarCall; - - TreeMap methodParams = methodHolder.getMethodParams(); - JVar entitySentToServer = null; - JType entityType = null; - if (!methodParams.isEmpty()) { - entitySentToServer = methodParams.firstEntry().getValue(); - entityType = entitySentToServer.type(); - } - - if (entitySentToServer != null) { - if (entityType.isPrimitive()) { - // Don't narrow primitive types... - entityType = entityType.boxify(); - } - newHttpEntityVarCall = JExpr._new(httpEntity.narrow(entityType)); - } else { - newHttpEntityVarCall = JExpr._new(httpEntity.narrow(Object.class)); - } - - JBlock body = methodHolder.getBody(); - JVar httpHeadersVar = generateHttpHeadersVar(methodHolder, holder, body, executableElement); - - boolean hasHeaders = httpHeadersVar != null; - - if (entitySentToServer != null) { - newHttpEntityVarCall.arg(entitySentToServer); - } - - if (hasHeaders) { - newHttpEntityVarCall.arg(httpHeadersVar); - } else if (methodParams.isEmpty()) { - newHttpEntityVarCall.arg(JExpr._null()); - } - - JVar httpEntityVar; - String httpEntityVarName = "requestEntity"; - if (entitySentToServer != null) { - httpEntityVar = body.decl(httpEntity.narrow(entityType), httpEntityVarName, newHttpEntityVarCall); - } else { - httpEntityVar = body.decl(httpEntity.narrow(Object.class), httpEntityVarName, newHttpEntityVarCall); - } - - return httpEntityVar; - } - - protected JVar generateHttpHeadersVar(MethodProcessorHolder methodHolder, EBeanHolder holder, JBlock body, ExecutableElement executableElement) { - JVar httpHeadersVar = null; - - JClass httpHeadersClass = holder.refClass(CanonicalNameConstants.HTTP_HEADERS); - - String mediaType = retrieveAcceptAnnotationValue(executableElement); - boolean hasMediaTypeDefined = mediaType != null; - - String cookies[] = retrieveRequiredCookieNames(executableElement); - boolean requiresCookies = cookies != null && cookies.length > 0; - - String headers[] = retrieveRequiredHeaderNames(executableElement); - boolean requiresHeaders = headers != null && headers.length > 0; - - boolean requiresAuth = requiresAuth(executableElement); - - if (hasMediaTypeDefined || requiresCookies || requiresHeaders || requiresAuth) { - // we need the headers - httpHeadersVar = body.decl(httpHeadersClass, "httpHeaders", JExpr._new(httpHeadersClass)); - } - - if (hasMediaTypeDefined) { - JClass collectionsClass = holder.refClass(CanonicalNameConstants.COLLECTIONS); - JClass mediaTypeClass = holder.refClass(CanonicalNameConstants.MEDIA_TYPE); - - JInvocation mediaTypeListParam = collectionsClass.staticInvoke("singletonList").arg(mediaTypeClass.staticInvoke("parseMediaType").arg(mediaType)); - body.add(JExpr.invoke(httpHeadersVar, "setAccept").arg(mediaTypeListParam)); - } - - if (requiresCookies) { - RestImplementationHolder restHolder = restImplementationsHolder.getEnclosingHolder(methodHolder.getElement()); - - JClass stringClass = holder.refClass(CanonicalNameConstants.STRING); - JClass stringBuilderClass = holder.refClass("java.lang.StringBuilder"); - JVar cookiesValueVar = body.decl(stringBuilderClass, "cookiesValue", JExpr._new(stringBuilderClass)); - for (String cookie : cookies) { - JInvocation cookieValue = JExpr.invoke(restHolder.availableCookiesField, "get").arg(cookie); - JInvocation cookieFormatted = stringClass.staticInvoke("format").arg(String.format("%s=%%s;", cookie)).arg(cookieValue); - JInvocation appendCookie = JExpr.invoke(cookiesValueVar, "append").arg(cookieFormatted); - body.add(appendCookie); - } - - JInvocation cookiesToString = cookiesValueVar.invoke("toString"); - body.add(JExpr.invoke(httpHeadersVar, "set").arg("Cookie").arg(cookiesToString)); - } - - if (requiresHeaders) { - RestImplementationHolder restHolder = restImplementationsHolder.getEnclosingHolder(methodHolder.getElement()); - for (String header : headers) { - JInvocation headerValue = JExpr.invoke(restHolder.availableHeadersField, "get").arg(header); - body.add(JExpr.invoke(httpHeadersVar, "set").arg(header).arg(headerValue)); - } - - } - - if (requiresAuth) { - // attach auth - RestImplementationHolder restHolder = restImplementationsHolder.getEnclosingHolder(methodHolder.getElement()); - body.add(httpHeadersVar.invoke("setAuthorization").arg(restHolder.authenticationField)); - } - - return httpHeadersVar; - } - - private String retrieveAcceptAnnotationValue(ExecutableElement executableElement) { - Accept acceptAnnotation = executableElement.getAnnotation(Accept.class); - if (acceptAnnotation == null) { - acceptAnnotation = executableElement.getEnclosingElement().getAnnotation(Accept.class); - } - if (acceptAnnotation != null) { - return acceptAnnotation.value(); - } else { - return null; - } - } - - private String[] retrieveRequiredHeaderNames(ExecutableElement executableElement) { - RequiresHeader cookieAnnotation = executableElement.getAnnotation(RequiresHeader.class); - if (cookieAnnotation == null) { - cookieAnnotation = executableElement.getEnclosingElement().getAnnotation(RequiresHeader.class); - } - if (cookieAnnotation != null) { - return cookieAnnotation.value(); - } else { - return null; - } - } - - private String[] retrieveRequiredCookieNames(ExecutableElement executableElement) { - RequiresCookie cookieAnnotation = executableElement.getAnnotation(RequiresCookie.class); - if (cookieAnnotation == null) { - cookieAnnotation = executableElement.getEnclosingElement().getAnnotation(RequiresCookie.class); - } - if (cookieAnnotation != null) { - return cookieAnnotation.value(); - } else { - return null; - } - } - - public static String[] retrieveRequiredUrlCookieNames(ExecutableElement executableElement) { - RequiresCookieInUrl cookieAnnotation = executableElement.getAnnotation(RequiresCookieInUrl.class); - if (cookieAnnotation == null) { - cookieAnnotation = executableElement.getEnclosingElement().getAnnotation(RequiresCookieInUrl.class); - } - if (cookieAnnotation != null) { - return cookieAnnotation.value(); - } else { - return null; - } - } - - private String[] retrieveSettingCookieNames(ExecutableElement executableElement) { - SetsCookie cookieAnnotation = executableElement.getAnnotation(SetsCookie.class); - if (cookieAnnotation == null) { - cookieAnnotation = executableElement.getEnclosingElement().getAnnotation(SetsCookie.class); - } - if (cookieAnnotation != null) { - return cookieAnnotation.value(); - } else { - return null; - } - } - - private boolean requiresAuth(ExecutableElement executableElement) { - RequiresAuthentication basicAuthAnnotation = executableElement.getAnnotation(RequiresAuthentication.class); - if (basicAuthAnnotation == null) { - basicAuthAnnotation = executableElement.getEnclosingElement().getAnnotation(RequiresAuthentication.class); - } - return basicAuthAnnotation != null; - } - - private TreeMap extractMethodParamsVar(EBeanHolder eBeanHolder, JMethod method, ExecutableElement executableElement, RestImplementationHolder holder) { - List params = executableElement.getParameters(); - TreeMap methodParams = new TreeMap(); - for (VariableElement parameter : params) { - String paramName = parameter.getSimpleName().toString(); - String paramType = parameter.asType().toString(); - - JVar param = null; - if (parameter.asType().getKind().isPrimitive()) { - param = method.param(JType.parse(eBeanHolder.codeModel(), paramType), paramName); - } else { - JClass parameterClass = helper.typeMirrorToJClass(parameter.asType(), eBeanHolder); - param = method.param(parameterClass, paramName); - } - methodParams.put(paramName, param); - } - - return methodParams; - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/MethodProcessorHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/MethodProcessorHolder.java deleted file mode 100644 index 7f714b1b07..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/MethodProcessorHolder.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing.rest; - -import java.util.TreeMap; - -import javax.lang.model.element.Element; - -import org.androidannotations.processing.EBeanHolder; -import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JVar; - -public class MethodProcessorHolder { - - private Element element; - private String urlSuffix; - private JClass expectedClass; - private JClass methodReturnClass; - private JCodeModel codeModel; - - private JBlock body; - private TreeMap methodParams; - private final EBeanHolder holder; - - public MethodProcessorHolder(EBeanHolder holder, Element element, String urlSuffix, JClass expectedClass, JClass generatedReturnType, JCodeModel codeModel) { - this.holder = holder; - this.element = element; - this.urlSuffix = urlSuffix; - this.expectedClass = expectedClass; - this.methodReturnClass = generatedReturnType; - this.codeModel = codeModel; - } - - public Element getElement() { - return element; - } - - public String getUrlSuffix() { - return urlSuffix; - } - - public JClass getExpectedClass() { - return expectedClass; - } - - public void setExpectedClass(JClass expectedClass) { - this.expectedClass = expectedClass; - } - - public JClass getMethodReturnClass() { - return methodReturnClass; - } - - public void setMethodReturnClass(JClass methodReturnClass) { - this.methodReturnClass = methodReturnClass; - } - - public JCodeModel getCodeModel() { - return codeModel; - } - - public JBlock getBody() { - return body; - } - - public void setBody(JBlock body) { - this.body = body; - } - - public TreeMap getMethodParams() { - return methodParams; - } - - public void setMethodParams(TreeMap methodParams) { - this.methodParams = methodParams; - } - - public EBeanHolder getHolder() { - return holder; - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/OptionsProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/OptionsProcessor.java deleted file mode 100644 index 3f46b72b07..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/OptionsProcessor.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.rest.Options; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.processing.EBeanHolder; - -import com.sun.codemodel.JClass; -import com.sun.codemodel.JCodeModel; -import com.sun.codemodel.JExpr; -import com.sun.codemodel.JExpression; - -public class OptionsProcessor extends MethodProcessor { - - public OptionsProcessor(ProcessingEnvironment processingEnv, RestImplementationsHolder restImplementationsHolder) { - super(processingEnv, restImplementationsHolder); - } - - @Override - public String getTarget() { - return Options.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeanHolder holder) throws Exception { - - ExecutableElement executableElement = (ExecutableElement) element; - - TypeMirror returnType = executableElement.getReturnType(); - - DeclaredType declaredReturnType = (DeclaredType) returnType; - - TypeMirror typeParameter = declaredReturnType.getTypeArguments().get(0); - - JClass expectedClass = holder.refClass(typeParameter.toString()); - - JClass generatedReturnType = holder.refClass(CanonicalNameConstants.SET).narrow(expectedClass); - - Options optionsAnnotation = element.getAnnotation(Options.class); - String urlSuffix = optionsAnnotation.value(); - - generateRestTemplateCallBlock(new MethodProcessorHolder(holder, executableElement, urlSuffix, expectedClass, generatedReturnType, codeModel)); - } - - @Override - protected JExpression addResultCallMethod(JExpression restCall, MethodProcessorHolder methodHolder) { - restCall = JExpr.invoke(restCall, "getHeaders"); - restCall = JExpr.invoke(restCall, "getAllow"); - return restCall; - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/PostProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/PostProcessor.java deleted file mode 100644 index d16d3471a4..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/PostProcessor.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.rest.Post; - -public class PostProcessor extends MethodCrudProcessor { - - public PostProcessor(ProcessingEnvironment processingEnv, RestImplementationsHolder restImplementationHolder) { - super(processingEnv, restImplementationHolder); - } - - @Override - public String getTarget() { - return Post.class.getName(); - } - - @Override - public String retrieveUrlSuffix(Element element) { - Post getAnnotation = element.getAnnotation(Post.class); - return getAnnotation.value(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestImplementationsHolder.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestImplementationsHolder.java deleted file mode 100644 index f0d07bcbf5..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestImplementationsHolder.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing.rest; - -import java.util.HashMap; -import java.util.Map; - -import javax.lang.model.element.Element; - -public class RestImplementationsHolder { - - private Map holders = new HashMap(); - - public RestImplementationHolder create(Element element) { - RestImplementationHolder holder = new RestImplementationHolder(); - holders.put(element, holder); - return holder; - } - - public RestImplementationHolder getEnclosingHolder(Element enclosedElement) { - Element activityElement = enclosedElement.getEnclosingElement(); - return holders.get(activityElement); - } - - public RestImplementationHolder getRelativeHolder(Element element) { - return holders.get(element); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestProcessor.java deleted file mode 100644 index 5fedae9ec0..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/rest/RestProcessor.java +++ /dev/null @@ -1,351 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.processing.rest; - -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 static org.androidannotations.helper.CanonicalNameConstants.ARRAYLIST; -import static org.androidannotations.helper.CanonicalNameConstants.CLIENT_HTTP_REQUEST_INTERCEPTOR; -import static org.androidannotations.helper.CanonicalNameConstants.REST_TEMPLATE; -import static org.androidannotations.helper.CanonicalNameConstants.STRING; - -import java.util.ArrayList; -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.type.TypeMirror; -import javax.lang.model.util.ElementFilter; - -import org.androidannotations.annotations.rest.Rest; -import org.androidannotations.api.rest.RestErrorHandler; -import org.androidannotations.helper.AnnotationHelper; -import org.androidannotations.helper.ModelConstants; -import org.androidannotations.processing.EBeansHolder; -import org.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.JFieldVar; -import com.sun.codemodel.JInvocation; -import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; -import com.sun.codemodel.JType; - -public class RestProcessor implements GeneratingElementProcessor { - private final RestImplementationsHolder restImplementationsHolder; - private AnnotationHelper annotationHelper; - - public RestProcessor(ProcessingEnvironment processingEnv, RestImplementationsHolder restImplementationsHolder) { - annotationHelper = new AnnotationHelper(processingEnv); - this.restImplementationsHolder = restImplementationsHolder; - } - - @Override - public String getTarget() { - return Rest.class.getName(); - } - - @Override - public void process(Element element, JCodeModel codeModel, EBeansHolder eBeansHolder) throws Exception { - - RestImplementationHolder holder = restImplementationsHolder.create(element); - - TypeElement typeElement = (TypeElement) element; - String interfaceName = typeElement.getQualifiedName().toString(); - - String implementationName = interfaceName + ModelConstants.GENERATION_SUFFIX; - - holder.restImplementationClass = codeModel._class(JMod.PUBLIC, implementationName, ClassType.CLASS); - eBeansHolder.create(element, Rest.class, holder.restImplementationClass); - - JClass interfaceClass = eBeansHolder.refClass(interfaceName); - holder.restImplementationClass._implements(interfaceClass); - - // RestTemplate field - JClass restTemplateClass = eBeansHolder.refClass(REST_TEMPLATE); - holder.restTemplateField = holder.restImplementationClass.field(JMod.PRIVATE, restTemplateClass, "restTemplate"); - - // RootUrl field - JClass stringClass = eBeansHolder.refClass(STRING); - holder.rootUrlField = holder.restImplementationClass.field(JMod.PRIVATE, stringClass, "rootUrl"); - - // Error handler field. - JClass restErrorHandlerClass = eBeansHolder.refClass(RestErrorHandler.class.getName()); - holder.restErrorHandlerField = holder.restImplementationClass.field(JMod.PRIVATE, restErrorHandlerClass, "restErrorHandler"); - - // available headers/cookies - JClass mapClass = eBeansHolder.refClass("java.util.HashMap").narrow(stringClass, stringClass); - holder.availableHeadersField = holder.restImplementationClass.field(JMod.PRIVATE, mapClass, "availableHeaders"); - holder.availableCookiesField = holder.restImplementationClass.field(JMod.PRIVATE, mapClass, "availableCookies"); - - // any auth - JClass httpAuthClass = eBeansHolder.refClass("org.springframework.http.HttpAuthentication"); - holder.authenticationField = holder.restImplementationClass.field(JMod.PRIVATE, httpAuthClass, "authentication"); - - { - // 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))); - } - } - - { - // Interceptors - List interceptors = annotationHelper.extractAnnotationClassArrayParameter(element, getTarget(), "interceptors"); - if (interceptors != null) { - JClass listClass = eBeansHolder.refClass(ARRAYLIST); - JClass clientInterceptorClass = eBeansHolder.refClass(CLIENT_HTTP_REQUEST_INTERCEPTOR); - listClass = listClass.narrow(clientInterceptorClass); - constructorBody.add(invoke(holder.restTemplateField, "setInterceptors").arg(_new(listClass))); - for (DeclaredType interceptorType : interceptors) { - JClass interceptorClass = eBeansHolder.refClass(interceptorType.toString()); - constructorBody.add(invoke(holder.restTemplateField, "getInterceptors").invoke("add").arg(_new(interceptorClass))); - } - } - } - constructorBody.assign(holder.rootUrlField, lit(typeElement.getAnnotation(Rest.class).rootUrl())); - - constructorBody.assign(holder.availableHeadersField, _new(mapClass)); - constructorBody.assign(holder.availableCookiesField, _new(mapClass)); - } - - List methods = getMethods(typeElement); - - // rest template - implementGetRestTemplate(holder, codeModel, eBeansHolder, methods); - implementSetRestTemplate(holder, codeModel, eBeansHolder, methods); - - // root url - implementGetRootUrl(holder, codeModel, eBeansHolder, methods); - implementSetRootUrl(holder, codeModel, eBeansHolder, methods); - - // authentication - implementSetBasicAuth(holder, codeModel, eBeansHolder, methods); - implementSetAuthentication(holder, codeModel, eBeansHolder, methods); - - // cookies and headers - implementMapGetMethod(holder, eBeansHolder, methods, holder.availableCookiesField, "getCookie"); - implementMapGetMethod(holder, eBeansHolder, methods, holder.availableHeadersField, "getHeader"); - implementMapPutMethod(holder, eBeansHolder, codeModel, methods, holder.availableCookiesField, "setCookie"); - implementMapPutMethod(holder, eBeansHolder, codeModel, methods, holder.availableHeadersField, "setHeader"); - - // error handler. - implementSetErrorHandler(holder, codeModel, eBeansHolder, methods); - } - - /** - * Gets all of the methods of the class and includes the methods of any - * implemented interfaces. - * - * @param typeElement - * @return full list of methods. - */ - private List getMethods(TypeElement typeElement) { - List enclosedElements = typeElement.getEnclosedElements(); - List methods = new ArrayList(ElementFilter.methodsIn(enclosedElements)); - - // Add methods of the interfaces. These will be valid as they have gone - // through the validator. - for (TypeMirror iface : typeElement.getInterfaces()) { - DeclaredType dt = (DeclaredType) iface; - methods.addAll(ElementFilter.methodsIn(dt.asElement().getEnclosedElements())); - } - - return methods; - } - - /** - * Gets a method by name, return type and parameter types. - * - * Note: Maybe this method should be in a util class somewhere if it could - * be reused by other processors. - * - * @param methods - * @param methodName - * @param returnType - * @param parameterTypes - * @return the ExecutableElement method object. - */ - private ExecutableElement getMethod(List methods, String methodName, String returnType, String... parameterTypes) { - for (ExecutableElement method : methods) { - List parameters = method.getParameters(); - - // Get the method return type or "VOID" if none. - String methodReturnType = method.getReturnType().getKind() == TypeKind.VOID ? TypeKind.VOID.toString() : method.getReturnType().toString(); - - if (parameters.size() == parameterTypes.length && methodReturnType.equals(returnType)) { - if (methodName == null || method.getSimpleName().toString().equals(methodName)) { - // At this point, method name, return type and number of - // parameters are correct. Now we need to validate the - // parameter types. - boolean validMethod = true; - - for (int i = 0; i < parameters.size(); i++) { - VariableElement param = parameters.get(i); - - if (!param.asType().toString().equals(parameterTypes[i])) { - // Parameter type does not match, this is not the - // correct method. - validMethod = false; - break; - } - } - - if (validMethod) { - return method; - } - } - } - } - - return null; - } - - /** - * Implements a method based on its name, return type and parameter types. - * It will return the JMethod object to be given the full implementation. - * - * Note: Maybe this method should be in a util class somewhere if it could - * be reused by other processors. - * - * @param holder - * @param codeModel - * @param eBeansHolder - * @param methods - * @param methodName - * @param returnType - * @param parameterTypes - * @return The JMethod object created. - */ - private JMethod implementMethod(RestImplementationHolder holder, JCodeModel codeModel, EBeansHolder eBeansHolder, List methods, String methodName, String returnType, String... parameterTypes) { - // First get the ExecutableElement method object from the util function. - ExecutableElement method = getMethod(methods, methodName, returnType, parameterTypes); - JMethod jmethod = null; - - if (method != null) { - // Get the return type or VOID if none. - JType jcReturnType = returnType.equals(TypeKind.VOID.toString()) ? codeModel.VOID : eBeansHolder.refClass(returnType); - - // Create the implementation and annotate it with the Override - // annotation. - jmethod = holder.restImplementationClass.method(JMod.PUBLIC, jcReturnType, method.getSimpleName().toString()); - jmethod.annotate(Override.class); - - // Create the parameters. - for (int i = 0; i < method.getParameters().size(); i++) { - VariableElement param = method.getParameters().get(i); - jmethod.param(eBeansHolder.refClass(parameterTypes[i]), param.getSimpleName().toString()); - } - } - - return jmethod; - } - - private void implementMapGetMethod(RestImplementationHolder holder, EBeansHolder eBeansHolder, List methods, JFieldVar field, String methodName) { - JMethod getCookieMethod = implementMethod(holder, null, eBeansHolder, methods, methodName, STRING, STRING); - - if (getCookieMethod != null) { - JInvocation cookieValue = JExpr.invoke(field, "get").arg(getCookieMethod.params().get(0)); - getCookieMethod.body()._return(cookieValue); - } - } - - private void implementMapPutMethod(RestImplementationHolder holder, EBeansHolder eBeansHolder, JCodeModel codeModel, List methods, JFieldVar field, String methodName) { - JMethod putMapMethod = implementMethod(holder, codeModel, eBeansHolder, methods, methodName, TypeKind.VOID.toString(), STRING, STRING); - - if (putMapMethod != null) { - putMapMethod.body().invoke(field, "put").arg(putMapMethod.params().get(0)).arg(putMapMethod.params().get(1)); - } - } - - private void implementSetAuthentication(RestImplementationHolder holder, JCodeModel codeModel, EBeansHolder eBeansHolder, List methods) { - JMethod setAuthMethod = implementMethod(holder, codeModel, eBeansHolder, methods, "setAuthentication", TypeKind.VOID.toString(), "org.springframework.http.HttpAuthentication"); - - if (setAuthMethod != null) { - setAuthMethod.body().assign(_this().ref(holder.authenticationField), setAuthMethod.params().get(0)); - } - } - - private void implementSetBasicAuth(RestImplementationHolder holder, JCodeModel codeModel, EBeansHolder eBeansHolder, List methods) { - JMethod setAuthMethod = implementMethod(holder, codeModel, eBeansHolder, methods, "setHttpBasicAuth", TypeKind.VOID.toString(), STRING, STRING); - - if (setAuthMethod != null) { - JClass basicAuthClass = eBeansHolder.refClass("org.springframework.http.HttpBasicAuthentication"); - JInvocation basicAuthentication = JExpr._new(basicAuthClass).arg(setAuthMethod.params().get(0)).arg(setAuthMethod.params().get(1)); - - setAuthMethod.body().assign(_this().ref(holder.authenticationField), basicAuthentication); - } - } - - private void implementSetErrorHandler(RestImplementationHolder holder, JCodeModel codeModel, EBeansHolder eBeansHolder, List methods) { - JMethod setErrorHandlerMethod = implementMethod(holder, codeModel, eBeansHolder, methods, "setRestErrorHandler", TypeKind.VOID.toString(), RestErrorHandler.class.getName()); - - if (setErrorHandlerMethod != null) { - setErrorHandlerMethod.body().assign(_this().ref(holder.restErrorHandlerField), setErrorHandlerMethod.params().get(0)); - } - } - - private void implementSetRootUrl(RestImplementationHolder holder, JCodeModel codeModel, EBeansHolder eBeansHolder, List methods) { - JMethod setRootUrlMethod = implementMethod(holder, codeModel, eBeansHolder, methods, "setRootUrl", TypeKind.VOID.toString(), STRING); - - if (setRootUrlMethod != null) { - setRootUrlMethod.body().assign(_this().ref(holder.rootUrlField), setRootUrlMethod.params().get(0)); - } - } - - private void implementGetRootUrl(RestImplementationHolder holder, JCodeModel codeModel, EBeansHolder eBeansHolder, List methods) { - JMethod getRootUrlMethod = implementMethod(holder, codeModel, eBeansHolder, methods, "getRootUrl", STRING); - - if (getRootUrlMethod != null) { - getRootUrlMethod.body()._return(holder.rootUrlField); - } - } - - private void implementSetRestTemplate(RestImplementationHolder holder, JCodeModel codeModel, EBeansHolder eBeansHolder, List methods) { - JMethod setRestTemplateMethod = implementMethod(holder, codeModel, eBeansHolder, methods, null, TypeKind.VOID.toString(), REST_TEMPLATE); - - if (setRestTemplateMethod != null) { - setRestTemplateMethod.body().assign(_this().ref(holder.restTemplateField), setRestTemplateMethod.params().get(0)); - } - } - - private void implementGetRestTemplate(RestImplementationHolder holder, JCodeModel codeModel, EBeansHolder eBeansHolder, List methods) { - JMethod getRestTemplateMethod = implementMethod(holder, codeModel, eBeansHolder, methods, null, REST_TEMPLATE); - - if (getRestTemplateMethod != null) { - getRestTemplateMethod.body()._return(holder.restTemplateField); - } - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/CoumpoundInnerClass.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/CoumpoundInnerClass.java index eda77a7d98..6e78ee5622 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/CoumpoundInnerClass.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/CoumpoundInnerClass.java @@ -15,8 +15,8 @@ */ package org.androidannotations.rclass; -import org.androidannotations.processing.EBeanHolder; import com.sun.codemodel.JFieldRef; +import org.androidannotations.process.ProcessHolder; public class CoumpoundInnerClass implements IRInnerClass { @@ -57,7 +57,7 @@ public String getIdQualifiedName(String name) { } @Override - public JFieldRef getIdStaticRef(Integer idValue, EBeanHolder holder) { + public JFieldRef getIdStaticRef(Integer idValue, ProcessHolder holder) { JFieldRef idStaticRef = rInnerClass.getIdStaticRef(idValue, holder); if (idStaticRef == null) { idStaticRef = androidRInnerClass.getIdStaticRef(idValue, holder); @@ -66,7 +66,7 @@ public JFieldRef getIdStaticRef(Integer idValue, EBeanHolder holder) { } @Override - public JFieldRef getIdStaticRef(String name, EBeanHolder holder) { + public JFieldRef getIdStaticRef(String name, ProcessHolder holder) { JFieldRef idStaticRef = rInnerClass.getIdStaticRef(name, holder); if (idStaticRef == null) { idStaticRef = androidRInnerClass.getIdStaticRef(name, holder); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/IRInnerClass.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/IRInnerClass.java index ebe1656519..d0b4a4be95 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/IRInnerClass.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/IRInnerClass.java @@ -15,8 +15,8 @@ */ package org.androidannotations.rclass; -import org.androidannotations.processing.EBeanHolder; import com.sun.codemodel.JFieldRef; +import org.androidannotations.process.ProcessHolder; public interface IRInnerClass { @@ -28,9 +28,9 @@ public interface IRInnerClass { String getIdQualifiedName(String name); - JFieldRef getIdStaticRef(Integer idValue, EBeanHolder holder); + JFieldRef getIdStaticRef(Integer idValue, ProcessHolder holder); - JFieldRef getIdStaticRef(String name, EBeanHolder holder); + JFieldRef getIdStaticRef(String name, ProcessHolder holder); final IRInnerClass EMPTY_R_INNER_CLASS = new RInnerClass(null); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/RInnerClass.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/RInnerClass.java index 0fcaaefb1c..173961ca20 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/RInnerClass.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/rclass/RInnerClass.java @@ -28,9 +28,10 @@ import javax.lang.model.util.ElementFilter; import org.androidannotations.helper.CaseHelper; -import org.androidannotations.processing.EBeanHolder; + import com.sun.codemodel.JClass; import com.sun.codemodel.JFieldRef; +import org.androidannotations.process.ProcessHolder; public class RInnerClass implements IRInnerClass { @@ -104,18 +105,18 @@ public String getIdQualifiedName(String name) { } @Override - public JFieldRef getIdStaticRef(Integer idValue, EBeanHolder holder) { + public JFieldRef getIdStaticRef(Integer idValue, ProcessHolder holder) { String layoutFieldQualifiedName = getIdQualifiedName(idValue); return extractIdStaticRef(holder, layoutFieldQualifiedName); } @Override - public JFieldRef getIdStaticRef(String name, EBeanHolder holder) { + public JFieldRef getIdStaticRef(String name, ProcessHolder holder) { String layoutFieldQualifiedName = getIdQualifiedName(name); return extractIdStaticRef(holder, layoutFieldQualifiedName); } - public static JFieldRef extractIdStaticRef(EBeanHolder holder, String layoutFieldQualifiedName) { + public static JFieldRef extractIdStaticRef(ProcessHolder holder, String layoutFieldQualifiedName) { if (layoutFieldQualifiedName != null) { int fieldSuffix = layoutFieldQualifiedName.lastIndexOf('.'); String fieldName = layoutFieldQualifiedName.substring(fieldSuffix + 1); @@ -127,5 +128,4 @@ public static JFieldRef extractIdStaticRef(EBeanHolder holder, String layoutFiel return null; } } - } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AbstractSeekBarTouchValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AbstractSeekBarTouchValidator.java deleted file mode 100644 index 46fd25057f..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AbstractSeekBarTouchValidator.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -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.VariableElement; - -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public abstract class AbstractSeekBarTouchValidator implements ElementValidator { - - private final IdValidatorHelper validatorHelper; - - private final IdAnnotationHelper annotationHelper; - - public AbstractSeekBarTouchValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - hasProgressChangeMethodParameters(executableElement, valid); - - return valid.isValid(); - } - - private void hasProgressChangeMethodParameters(ExecutableElement executableElement, IsValid valid) { - List parameters = executableElement.getParameters(); - - if (parameters.size() > 1) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. You can only have one parameter of type " + CanonicalNameConstants.SEEKBAR + ". Try declaring " + executableElement.getSimpleName() + "(" + CanonicalNameConstants.SEEKBAR + " seekBar);"); - valid.invalidate(); - return; - } - - if (parameters.size() == 1) { - String parameterType = parameters.get(0).asType().toString(); - if (!parameterType.equals(CanonicalNameConstants.SEEKBAR)) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. You can only have one parameter of type " + CanonicalNameConstants.SEEKBAR + ". Try declaring " + executableElement.getSimpleName() + "(" + CanonicalNameConstants.SEEKBAR + " seekBar);"); - valid.invalidate(); - } - } - - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AfterTextChangeValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AfterTextChangeValidator.java deleted file mode 100644 index ceab3c7b30..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/AfterTextChangeValidator.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -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.VariableElement; - -import org.androidannotations.annotations.AfterTextChange; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class AfterTextChangeValidator implements ElementValidator { - - private final IdValidatorHelper validatorHelper; - - private final IdAnnotationHelper annotationHelper; - - public AfterTextChangeValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return AfterTextChange.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - haveAfterTextChangedMethodParameters(executableElement, valid); - - return valid.isValid(); - } - - private void haveAfterTextChangedMethodParameters(ExecutableElement executableElement, IsValid valid) { - List parameters = executableElement.getParameters(); - boolean editableParameterFound = false; - boolean textViewParameterFound = false; - for (VariableElement parameter : parameters) { - String parameterType = parameter.asType().toString(); - if (parameterType.equals(CanonicalNameConstants.EDITABLE)) { - if (editableParameterFound) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type android.text.Editable"); - valid.invalidate(); - } - editableParameterFound = true; - continue; - } - if (parameterType.equals(CanonicalNameConstants.TEXT_VIEW)) { - if (textViewParameterFound) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type android.widget.TextView"); - valid.invalidate(); - } - textViewParameterFound = true; - continue; - } - valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter type. %s can only have a android.widget.TextView parameter and/or an android.text.Editable parameter. See android.text.TextWatcher.afterTextChanged() for more informations."); - } - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/BeanValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/BeanValidator.java deleted file mode 100644 index 17bef42790..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/BeanValidator.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.Bean; -import org.androidannotations.annotations.EBean; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class BeanValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public BeanValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return Bean.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.typeOrTargetValueHasAnnotation(EBean.class, element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/BeforeTextChangeValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/BeforeTextChangeValidator.java deleted file mode 100644 index 0465c7d56f..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/BeforeTextChangeValidator.java +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -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.VariableElement; -import javax.lang.model.type.TypeKind; - -import org.androidannotations.annotations.BeforeTextChange; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class BeforeTextChangeValidator implements ElementValidator { - - private final IdValidatorHelper validatorHelper; - - private final IdAnnotationHelper annotationHelper; - - public BeforeTextChangeValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return BeforeTextChange.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - haveBeforeTextChangedMethodParameters(executableElement, valid); - - return valid.isValid(); - } - - private void haveBeforeTextChangedMethodParameters(ExecutableElement executableElement, IsValid valid) { - List parameters = executableElement.getParameters(); - boolean charSequenceParameterFound = false; - boolean textViewParameterFound = false; - for (VariableElement parameter : parameters) { - String parameterType = parameter.asType().toString(); - if (parameterType.equals(CanonicalNameConstants.CHAR_SEQUENCE)) { - if (charSequenceParameterFound) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type java.lang.CharSequence"); - valid.invalidate(); - } - charSequenceParameterFound = true; - continue; - } - if (parameterType.equals(CanonicalNameConstants.TEXT_VIEW)) { - if (textViewParameterFound) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type android.widget.TextView"); - valid.invalidate(); - } - textViewParameterFound = true; - continue; - } - if (parameter.asType().getKind() == TypeKind.INT || CanonicalNameConstants.INTEGER.equals(parameterType)) { - String parameterName = parameter.toString(); - if ("start".equals(parameterName) || "count".equals(parameterName) || "after".equals(parameterName)) { - continue; - } - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter name. You can only have start, before, or count parameter name. Try to pick a parameter from android.text.TextWatcher.beforeTextChanged() method."); - valid.invalidate(); - continue; - } - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter (" + parameter.toString() + "). %s can only have a android.widget.TextView parameter and/or parameters from android.text.TextWatcher.beforeTextChanged() method."); - valid.invalidate(); - } - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/CheckedChangeValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/CheckedChangeValidator.java deleted file mode 100644 index 49f853c7b5..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/CheckedChangeValidator.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.CheckedChange; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -/** - * - * @author Rostislav Chekan - * - */ -public class CheckedChangeValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public CheckedChangeValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return CheckedChange.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - validatorHelper.uniqueId(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - validatorHelper.param.hasZeroOrOneCompoundButtonOrTwoCompoundButtonBooleanParameters(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ClickValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ClickValidator.java deleted file mode 100644 index 8093cf3d26..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ClickValidator.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.Click; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class ClickValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public ClickValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return Click.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - validatorHelper.uniqueId(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - validatorHelper.param.zeroOrOneViewParameter(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/CustomTitleValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/CustomTitleValidator.java deleted file mode 100644 index 7da9919775..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/CustomTitleValidator.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.CustomTitle; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; - -public class CustomTitleValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public CustomTitleValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return CustomTitle.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - IsValid valid = new IsValid(); - - validatorHelper.hasEActivity(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, IRClass.Res.LAYOUT, IdValidatorHelper.FallbackStrategy.NEED_RES_ID, valid); - - return valid.isValid(); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EActivityValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EActivityValidator.java deleted file mode 100644 index 595fcf7777..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EActivityValidator.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.EActivity; -import org.androidannotations.helper.AndroidManifest; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class EActivityValidator implements ElementValidator { - - private final IdValidatorHelper validatorHelper; - private final AndroidManifest androidManifest; - - public EActivityValidator(ProcessingEnvironment processingEnv, IRClass rClass, AndroidManifest androidManifest) { - this.androidManifest = androidManifest; - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return EActivity.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.extendsActivity(element, valid); - - validatorHelper.resIdsExist(element, Res.LAYOUT, FallbackStrategy.ALLOW_NO_RES_ID, valid); - - validatorHelper.isNotFinal(element, valid); - - validatorHelper.componentRegistered(element, androidManifest, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EBeanValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EBeanValidator.java deleted file mode 100644 index dbdcc06796..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EBeanValidator.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.EBean; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class EBeanValidator implements ElementValidator { - - private final ValidatorHelper validatorHelper; - - public EBeanValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return EBean.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.isNotFinal(element, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.hasEmptyOrContextConstructor(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EFragmentValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EFragmentValidator.java deleted file mode 100644 index 51dce216f5..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EFragmentValidator.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.EFragment; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class EFragmentValidator implements ElementValidator { - - private final IdValidatorHelper validatorHelper; - - public EFragmentValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return EFragment.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.isNotFinal(element, valid); - - validatorHelper.resIdsExist(element, Res.LAYOUT, FallbackStrategy.ALLOW_NO_RES_ID, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.hasEmptyConstructor(element, valid); - - validatorHelper.extendsFragment(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EIntentServiceValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EIntentServiceValidator.java deleted file mode 100644 index af6822e277..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EIntentServiceValidator.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.EIntentService; -import org.androidannotations.annotations.ServiceAction; -import org.androidannotations.helper.AndroidManifest; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class EIntentServiceValidator implements ElementValidator { - - private final ValidatorHelper validatorHelper; - private final AndroidManifest androidManifest; - - public EIntentServiceValidator(ProcessingEnvironment processingEnv, AndroidManifest androidManifest) { - this.androidManifest = androidManifest; - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return EIntentService.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.extendsIntentService(element, valid); - - validatorHelper.hasNotMultipleAnnotatedMethodWithSameName(element, valid, ServiceAction.class); - - validatorHelper.isNotFinal(element, valid); - - validatorHelper.componentRegistered(element, androidManifest, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EViewGroupValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EViewGroupValidator.java deleted file mode 100644 index d7443502d0..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/EViewGroupValidator.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.EViewGroup; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class EViewGroupValidator implements ElementValidator { - - private final IdValidatorHelper validatorHelper; - private IdAnnotationHelper annotationHelper; - - public EViewGroupValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return EViewGroup.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.extendsViewGroup(element, valid); - - validatorHelper.resIdsExist(element, Res.LAYOUT, FallbackStrategy.ALLOW_NO_RES_ID, valid); - - validatorHelper.isNotFinal(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ExtraValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ExtraValidator.java deleted file mode 100644 index da565e9246..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ExtraValidator.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.Extra; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class ExtraValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public ExtraValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return Extra.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - IsValid valid = new IsValid(); - - /* - * TODO since we override setIntent(), we should check that the - * setIntent() method can be overridden - */ - - validatorHelper.enclosingElementHasEActivity(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FocusChangeValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FocusChangeValidator.java deleted file mode 100644 index 6d6bbc6314..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FocusChangeValidator.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.FocusChange; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class FocusChangeValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public FocusChangeValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return FocusChange.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - validatorHelper.uniqueId(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - validatorHelper.param.hasZeroOrOneViewOrTwoViewBooleanParameters(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FragmentArgValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FragmentArgValidator.java deleted file mode 100644 index 1b29a87a98..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FragmentArgValidator.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.FragmentArg; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class FragmentArgValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public FragmentArgValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return FragmentArg.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEFragment(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FragmentByIdValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FragmentByIdValidator.java deleted file mode 100644 index 09a8b7b00e..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FragmentByIdValidator.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.FragmentById; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class FragmentByIdValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - private IdAnnotationHelper annotationHelper; - - public FragmentByIdValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return FragmentById.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.extendsFragment(element, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FragmentByTagValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FragmentByTagValidator.java deleted file mode 100644 index eb96243017..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FragmentByTagValidator.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.FragmentByTag; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class FragmentByTagValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - private TargetAnnotationHelper annotationHelper; - - public FragmentByTagValidator(ProcessingEnvironment processingEnv) { - annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return FragmentByTag.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.extendsFragment(element, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FromHtmlValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FromHtmlValidator.java deleted file mode 100644 index 0c18290e55..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/FromHtmlValidator.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.FromHtml; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class FromHtmlValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public FromHtmlValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return FromHtml.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.hasViewByIdAnnotation(element, validatedElements, valid); - - validatorHelper.extendsTextView(element, valid); - - validatorHelper.resIdsExist(element, Res.STRING, FallbackStrategy.USE_ELEMENT_NAME, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/HierarchyViewerSupportValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/HierarchyViewerSupportValidator.java deleted file mode 100644 index 3bc62d6112..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/HierarchyViewerSupportValidator.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.HierarchyViewerSupport; -import org.androidannotations.helper.AndroidManifest; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class HierarchyViewerSupportValidator implements ElementValidator { - - private final ValidatorHelper validatorHelper; - private final AndroidManifest androidManifest; - - public HierarchyViewerSupportValidator(ProcessingEnvironment processingEnv, AndroidManifest androidManifest) { - this.androidManifest = androidManifest; - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return HierarchyViewerSupport.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.hasEActivity(element, validatedElements, valid); - - validatorHelper.isDebuggable(element, androidManifest, valid); - - validatorHelper.hasInternetPermission(element, androidManifest, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/HttpsClientValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/HttpsClientValidator.java deleted file mode 100644 index f1c071a467..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/HttpsClientValidator.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.HttpsClient; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class HttpsClientValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public HttpsClientValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return HttpsClient.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); - - validatorHelper.annotationParameterIsOptionalValidResId(element, Res.RAW, "keyStore", valid); - validatorHelper.annotationParameterIsOptionalValidResId(element, Res.RAW, "trustStore", valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/InstanceStateValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/InstanceStateValidator.java deleted file mode 100644 index aadd255824..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/InstanceStateValidator.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.InstanceState; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class InstanceStateValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public InstanceStateValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return InstanceState.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEActivityOrEFragment(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.canBeSavedAsInstanceState(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ItemClickValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ItemClickValidator.java deleted file mode 100644 index 859d0af894..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ItemClickValidator.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.ItemClick; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class ItemClickValidator implements ElementValidator { - - private IdAnnotationHelper annotationHelper; - private IdValidatorHelper validatorHelper; - - public ItemClickValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return ItemClick.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - validatorHelper.uniqueId(element, validatedElements, valid); - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - validatorHelper.param.zeroOrOneParameter(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ItemLongClickValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ItemLongClickValidator.java deleted file mode 100644 index 08d8af4b4b..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ItemLongClickValidator.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.ItemLongClick; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class ItemLongClickValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public ItemLongClickValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return ItemLongClick.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - validatorHelper.uniqueId(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid); - - validatorHelper.param.zeroOrOneParameter(executableElement, valid); - - return valid.isValid(); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ItemSelectedValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ItemSelectedValidator.java deleted file mode 100644 index c0e98089ea..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ItemSelectedValidator.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.ItemSelect; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -/** - */ -public class ItemSelectedValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public ItemSelectedValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return ItemSelect.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - validatorHelper.uniqueId(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.returnTypeIsVoid(executableElement, valid); - - validatorHelper.param.hasOneOrTwoParametersAndFirstIsBoolean(executableElement, valid); - - return valid.isValid(); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/LongClickValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/LongClickValidator.java deleted file mode 100644 index 425fa3c6eb..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/LongClickValidator.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.LongClick; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class LongClickValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public LongClickValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return LongClick.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - validatorHelper.uniqueId(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid); - - validatorHelper.param.zeroOrOneViewParameter(executableElement, valid); - - return valid.isValid(); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/NonConfigurationInstanceValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/NonConfigurationInstanceValidator.java deleted file mode 100644 index aba678c0ce..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/NonConfigurationInstanceValidator.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.NonConfigurationInstance; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class NonConfigurationInstanceValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public NonConfigurationInstanceValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return NonConfigurationInstance.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEActivity(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OnActivityResultValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OnActivityResultValidator.java deleted file mode 100644 index 6849da586c..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OnActivityResultValidator.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -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.VariableElement; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.OnActivityResult; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; - -/** - */ -public class OnActivityResultValidator implements ElementValidator { - - private final IdValidatorHelper validatorHelper; - - private final IdAnnotationHelper annotationHelper; - - public OnActivityResultValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return OnActivityResult.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEActivityOrEFragment(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - OnActivityResult onResultAnnotation = element.getAnnotation(OnActivityResult.class); - validatorHelper.annotationValuePositiveAndInAShort(element, valid, onResultAnnotation.value()); - - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - hasOnResultMethodParameters(executableElement, valid); - - return valid.isValid(); - } - - private void hasOnResultMethodParameters(ExecutableElement executableElement, IsValid valid) { - List parameters = executableElement.getParameters(); - boolean resultCodeParameterFound = false; - boolean intentParameterFound = false; - for (VariableElement parameter : parameters) { - TypeMirror parameterType = parameter.asType(); - if (parameterType.toString().equals(CanonicalNameConstants.INTEGER) // - || parameterType.getKind().equals(TypeKind.INT)) { - if (resultCodeParameterFound) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type int or java.lang.Integer"); - valid.invalidate(); - } - resultCodeParameterFound = true; - continue; - } - if (parameterType.toString().equals(CanonicalNameConstants.INTENT)) { - if (intentParameterFound) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type android.content.Intent"); - valid.invalidate(); - } - intentParameterFound = true; - continue; - } - valid.invalidate(); - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter type. %s can only have a android.content.Intent parameter and/or an Integer parameter"); - } - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OptionsItemValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OptionsItemValidator.java deleted file mode 100644 index 1d8eddf1de..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OptionsItemValidator.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.OptionsItem; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -/** - */ -public class OptionsItemValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public OptionsItemValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass) { - @Override - public String actionName() { - return "Selected"; - }; - }; - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return OptionsItem.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEActivityOrEFragment(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - validatorHelper.uniqueId(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid); - - validatorHelper.param.zeroOrOneMenuItemParameter(executableElement, valid); - - return valid.isValid(); - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OptionsMenuItemValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OptionsMenuItemValidator.java deleted file mode 100644 index b5ca0d5815..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OptionsMenuItemValidator.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.OptionsMenuItem; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class OptionsMenuItemValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public OptionsMenuItemValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return OptionsMenuItem.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - TypeMirror uiFieldTypeMirror = element.asType(); - - validatorHelper.isDeclaredType(element, valid, uiFieldTypeMirror); - - validatorHelper.extendsMenuItem(element, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OptionsMenuValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OptionsMenuValidator.java deleted file mode 100644 index 819ca1aefd..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OptionsMenuValidator.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.OptionsMenu; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class OptionsMenuValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public OptionsMenuValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return OptionsMenu.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.hasEActivityOrEFragment(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.MENU, FallbackStrategy.NEED_RES_ID, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OrmLiteDaoValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OrmLiteDaoValidator.java deleted file mode 100644 index 780cd2ea24..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/OrmLiteDaoValidator.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.OrmLiteDao; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; - -public class OrmLiteDaoValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - private IdAnnotationHelper annotationHelper; - - public OrmLiteDaoValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return OrmLiteDao.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.hasOrmLiteJars(element, valid); - - validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.extendsOrmLiteDaoWithValidModelParameter(element, valid); - - validatorHelper.hasASqlLiteOpenHelperParameterizedType(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/PrefValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/PrefValidator.java deleted file mode 100644 index b612feb5bd..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/PrefValidator.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.sharedpreferences.Pref; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class PrefValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public PrefValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return Pref.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.isSharedPreference(element, validatedElements, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ResValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ResValidator.java deleted file mode 100644 index 14cddc0c7c..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ResValidator.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AndroidRes; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; - -public class ResValidator implements ElementValidator { - - private final AndroidRes androidValue; - private IdValidatorHelper validatorHelper; - - public ResValidator(AndroidRes androidValue, ProcessingEnvironment processingEnv, IRClass rClass) { - this.androidValue = androidValue; - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return androidValue.getTarget(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); - - TypeMirror fieldTypeMirror = element.asType(); - - validatorHelper.allowedType(element, valid, fieldTypeMirror, androidValue.getAllowedTypes()); - - validatorHelper.resIdsExist(element, androidValue.getRInnerClass(), FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RestServiceValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RestServiceValidator.java deleted file mode 100644 index 814397ccfa..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RestServiceValidator.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.rest.Rest; -import org.androidannotations.annotations.rest.RestService; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class RestServiceValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public RestServiceValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return RestService.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.typeHasAnnotation(Rest.class, element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RoboGuiceValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RoboGuiceValidator.java deleted file mode 100644 index 9fc81c093f..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RoboGuiceValidator.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.RoboGuice; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class RoboGuiceValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public RoboGuiceValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return RoboGuice.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.hasEActivity(element, validatedElements, valid); - - validatorHelper.hasRoboGuiceJars(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RootContextValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RootContextValidator.java deleted file mode 100644 index 918baa2cdf..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/RootContextValidator.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.RootContext; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class RootContextValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public RootContextValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return RootContext.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEBeanAnnotation(element, validatedElements, valid); - - validatorHelper.extendsContext(element, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SeekBarProgressChangeValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SeekBarProgressChangeValidator.java deleted file mode 100644 index 5eab418e78..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SeekBarProgressChangeValidator.java +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -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.VariableElement; -import javax.lang.model.type.TypeKind; - -import org.androidannotations.annotations.SeekBarProgressChange; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class SeekBarProgressChangeValidator implements ElementValidator { - - private final IdValidatorHelper validatorHelper; - - private final IdAnnotationHelper annotationHelper; - - public SeekBarProgressChangeValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return SeekBarProgressChange.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - hasProgressChangeMethodParameters(executableElement, valid); - - return valid.isValid(); - } - - private void hasProgressChangeMethodParameters(ExecutableElement executableElement, IsValid valid) { - List parameters = executableElement.getParameters(); - boolean seekBarParameterFound = false; - boolean fromUserParameterFound = false; - boolean progressParameterFound = false; - for (VariableElement parameter : parameters) { - String parameterType = parameter.asType().toString(); - if (parameterType.equals(CanonicalNameConstants.SEEKBAR)) { - if (seekBarParameterFound) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. You can declare only one parameter of type " + CanonicalNameConstants.SEEKBAR); - valid.invalidate(); - } - seekBarParameterFound = true; - continue; - } - if (parameter.asType().getKind() == TypeKind.INT || CanonicalNameConstants.INTEGER.equals(parameterType)) { - if (progressParameterFound) { - annotationHelper.printAnnotationError(executableElement, "You can have only one parameter of type " + CanonicalNameConstants.INTEGER); - valid.invalidate(); - } - progressParameterFound = true; - continue; - } - if (parameter.asType().getKind() == TypeKind.BOOLEAN || CanonicalNameConstants.BOOLEAN.equals(parameterType)) { - if (fromUserParameterFound) { - annotationHelper.printAnnotationError(executableElement, "You can have only one parameter of type " + CanonicalNameConstants.BOOLEAN); - valid.invalidate(); - } - fromUserParameterFound = true; - continue; - } - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter '" + parameter.toString() + "'. %s signature should be " + executableElement.getSimpleName() + "(" + CanonicalNameConstants.SEEKBAR + " seekBar, int progress, boolean fromUser). The 'fromUser' and 'progress' parameters are optional."); - valid.invalidate(); - } - } -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SeekBarTouchStartValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SeekBarTouchStartValidator.java deleted file mode 100644 index 68cb2d1207..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SeekBarTouchStartValidator.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; - -import org.androidannotations.annotations.SeekBarTouchStart; -import org.androidannotations.rclass.IRClass; - -public class SeekBarTouchStartValidator extends AbstractSeekBarTouchValidator { - - public SeekBarTouchStartValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); - } - - @Override - public String getTarget() { - return SeekBarTouchStart.class.getName(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SeekBarTouchStopValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SeekBarTouchStopValidator.java deleted file mode 100644 index a1707dadba..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SeekBarTouchStopValidator.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; - -import org.androidannotations.annotations.SeekBarTouchStop; -import org.androidannotations.rclass.IRClass; - -public class SeekBarTouchStopValidator extends AbstractSeekBarTouchValidator { - - public SeekBarTouchStopValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - super(processingEnv, rClass); - } - - @Override - public String getTarget() { - return SeekBarTouchStop.class.getName(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ServiceActionValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ServiceActionValidator.java deleted file mode 100644 index 3c218cc756..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ServiceActionValidator.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.ServiceAction; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class ServiceActionValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public ServiceActionValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return ServiceAction.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEIntentService(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SharedPrefValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SharedPrefValidator.java deleted file mode 100644 index 9bb60dd5d2..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SharedPrefValidator.java +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -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.util.Elements; - -import org.androidannotations.annotations.sharedpreferences.SharedPref; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class SharedPrefValidator implements ElementValidator { - - private final ValidatorHelper validatorHelper; - private final Elements elements; - - public SharedPrefValidator(ProcessingEnvironment processingEnv) { - elements = processingEnv.getElementUtils(); - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return SharedPref.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - TypeElement typeElement = (TypeElement) element; - - validatorHelper.isInterface(typeElement, valid); - - List inheritedMembers = elements.getAllMembers(typeElement); - - for (Element memberElement : inheritedMembers) { - if (!memberElement.getEnclosingElement().asType().toString().equals("java.lang.Object")) { - boolean isPrefMethod = validatorHelper.isPrefMethod(memberElement); - if (isPrefMethod) { - validatorHelper.hasCorrectDefaultAnnotation((ExecutableElement) memberElement); - } else { - valid.invalidate(); - } - } - } - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SystemServiceValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SystemServiceValidator.java deleted file mode 100644 index 6936b42365..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/SystemServiceValidator.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.SystemService; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AndroidSystemServices; -import org.androidannotations.model.AnnotationElements; - -public class SystemServiceValidator implements ElementValidator { - - private final AndroidSystemServices androidSystemServices; - private ValidatorHelper validatorHelper; - - public SystemServiceValidator(ProcessingEnvironment processingEnv, AndroidSystemServices androidSystemServices) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - this.androidSystemServices = androidSystemServices; - } - - @Override - public String getTarget() { - return SystemService.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); - - validatorHelper.androidService(androidSystemServices, element, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TextChangeValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TextChangeValidator.java deleted file mode 100644 index b70cc6c194..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TextChangeValidator.java +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -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.VariableElement; -import javax.lang.model.type.TypeKind; - -import org.androidannotations.annotations.TextChange; -import org.androidannotations.helper.CanonicalNameConstants; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class TextChangeValidator implements ElementValidator { - - private final IdValidatorHelper validatorHelper; - - private final IdAnnotationHelper annotationHelper; - - public TextChangeValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return TextChange.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - validatorHelper.returnTypeIsVoid(executableElement, valid); - - haveTextChangedMethodParameters(executableElement, valid); - - return valid.isValid(); - } - - private void haveTextChangedMethodParameters(ExecutableElement executableElement, IsValid valid) { - List parameters = executableElement.getParameters(); - boolean charSequenceParameterFound = false; - boolean textViewParameterFound = false; - for (VariableElement parameter : parameters) { - String parameterType = parameter.asType().toString(); - if (parameterType.equals(CanonicalNameConstants.CHAR_SEQUENCE)) { - if (charSequenceParameterFound) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type java.lang.CharSequence"); - valid.invalidate(); - } - charSequenceParameterFound = true; - continue; - } - if (parameterType.equals(CanonicalNameConstants.TEXT_VIEW)) { - if (textViewParameterFound) { - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter declaration. you can declare only one parameter of type android.widget.TextView"); - valid.invalidate(); - } - textViewParameterFound = true; - continue; - } - if (parameter.asType().getKind() == TypeKind.INT || CanonicalNameConstants.INTEGER.equals(parameterType)) { - String parameterName = parameter.toString(); - if ("start".equals(parameterName) || "before".equals(parameterName) || "count".equals(parameterName)) { - continue; - } - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter name. You can only have start, before, or count parameter name. Try to pick a prameter from the android.text.TextWatcher.onTextChanged() method."); - valid.invalidate(); - continue; - } - annotationHelper.printAnnotationError(executableElement, "Unrecognized parameter (" + parameter.toString() + "). %s can only have a android.widget.TextView parameter and/or parameters from android.text.TextWatcher.onTextChanged() method."); - valid.invalidate(); - } - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TouchValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TouchValidator.java deleted file mode 100644 index 15d0ac29de..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TouchValidator.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.Touch; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class TouchValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - - public TouchValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - IdAnnotationHelper annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return Touch.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.doesntThrowException(element, valid); - - validatorHelper.uniqueId(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.returnTypeIsVoidOrBoolean(executableElement, valid); - - validatorHelper.param.hasOneMotionEventOrTwoMotionEventViewParameters(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TraceValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TraceValidator.java deleted file mode 100644 index 6b29aa7d04..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TraceValidator.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; - -import org.androidannotations.annotations.Trace; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class TraceValidator implements ElementValidator { - - private final ValidatorHelper validatorHelper; - - public TraceValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return Trace.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - validatorHelper.hasValidLogLevel(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TransactionalValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TransactionalValidator.java deleted file mode 100644 index 769d7cd1ac..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/TransactionalValidator.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.Transactional; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; - -public class TransactionalValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public TransactionalValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return Transactional.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validatedElements, valid); - - validatorHelper.isNotPrivate(element, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.doesntThrowException(executableElement, valid); - - validatorHelper.isNotFinal(element, valid); - - validatorHelper.param.hasOneOrTwoParametersAndFirstIsDb(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ViewByIdValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ViewByIdValidator.java deleted file mode 100644 index 8f637849be..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/ViewByIdValidator.java +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.type.TypeMirror; - -import org.androidannotations.annotations.ViewById; -import org.androidannotations.helper.IdAnnotationHelper; -import org.androidannotations.helper.IdValidatorHelper; -import org.androidannotations.helper.IdValidatorHelper.FallbackStrategy; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.rclass.IRClass; -import org.androidannotations.rclass.IRClass.Res; - -public class ViewByIdValidator implements ElementValidator { - - private IdValidatorHelper validatorHelper; - private IdAnnotationHelper annotationHelper; - - public ViewByIdValidator(ProcessingEnvironment processingEnv, IRClass rClass) { - annotationHelper = new IdAnnotationHelper(processingEnv, getTarget(), rClass); - validatorHelper = new IdValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return ViewById.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.enclosingElementHasEnhancedViewSupportAnnotation(element, validatedElements, valid); - - TypeMirror uiFieldTypeMirror = element.asType(); - - validatorHelper.isDeclaredType(element, valid, uiFieldTypeMirror); - - validatorHelper.extendsView(element, valid); - - validatorHelper.resIdsExist(element, Res.ID, FallbackStrategy.USE_ELEMENT_NAME, valid); - - validatorHelper.isNotPrivate(element, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/AcceptValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/AcceptValidator.java deleted file mode 100644 index 956b46a692..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/AcceptValidator.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.TypeElement; - -import org.androidannotations.annotations.rest.Accept; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.validation.ElementValidator; -import org.androidannotations.validation.IsValid; - -public class AcceptValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - - public AcceptValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return Accept.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - // Interface annotated - if (element instanceof TypeElement) { - - validatorHelper.elementHasRestAnnotation(element, validatedElements, valid); - - // Method Annotated - } else { - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.enclosingElementHasRestAnnotation(executableElement, validatedElements, valid); - - validatorHelper.elementHasGetOrPostAnnotation(executableElement, validatedElements, valid); - - validatorHelper.throwsOnlyRestClientException(executableElement, valid); - - } - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/DeleteValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/DeleteValidator.java deleted file mode 100644 index 0eb63b84a3..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/DeleteValidator.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.rest.Delete; -import org.androidannotations.helper.RestAnnotationHelper; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.validation.ElementValidator; -import org.androidannotations.validation.IsValid; - -public class DeleteValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - private RestAnnotationHelper restAnnotationHelper; - - public DeleteValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - restAnnotationHelper = new RestAnnotationHelper(processingEnv, getTarget()); - } - - @Override - public String getTarget() { - return Delete.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.notAlreadyValidated(element, validatedElements, valid); - - validatorHelper.enclosingElementHasRestAnnotation(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.throwsOnlyRestClientException(executableElement, valid); - - validatorHelper.doesNotReturnPrimitive(executableElement, valid); - - restAnnotationHelper.urlVariableNamesExistInParametersAndHasOnlyOneMoreParameter(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/GetValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/GetValidator.java deleted file mode 100644 index 2a19b4862f..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/GetValidator.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.rest.Get; -import org.androidannotations.helper.RestAnnotationHelper; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.validation.ElementValidator; -import org.androidannotations.validation.IsValid; - -public class GetValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - private RestAnnotationHelper restAnnotationHelper; - - public GetValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - restAnnotationHelper = new RestAnnotationHelper(processingEnv, getTarget()); - } - - @Override - public String getTarget() { - return Get.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.notAlreadyValidated(element, validatedElements, valid); - - validatorHelper.enclosingElementHasRestAnnotation(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.throwsOnlyRestClientException(executableElement, valid); - - validatorHelper.doesNotReturnPrimitive(executableElement, valid); - - restAnnotationHelper.urlVariableNamesExistInParametersAndHasNoOneMoreParameter(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/HeadValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/HeadValidator.java deleted file mode 100644 index d5c0b7e2b9..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/HeadValidator.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.rest.Head; -import org.androidannotations.helper.RestAnnotationHelper; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.validation.ElementValidator; -import org.androidannotations.validation.IsValid; - -public class HeadValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - private RestAnnotationHelper restAnnotationHelper; - - public HeadValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - restAnnotationHelper = new RestAnnotationHelper(processingEnv, getTarget()); - } - - @Override - public String getTarget() { - return Head.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.notAlreadyValidated(element, validatedElements, valid); - - validatorHelper.enclosingElementHasRestAnnotation(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.throwsOnlyRestClientException(executableElement, valid); - - validatorHelper.hasHttpHeadersReturnType(executableElement, valid); - - restAnnotationHelper.urlVariableNamesExistInParametersAndHasNoOneMoreParameter(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/OptionsValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/OptionsValidator.java deleted file mode 100644 index efa8e67d07..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/OptionsValidator.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.rest.Options; -import org.androidannotations.helper.RestAnnotationHelper; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.validation.ElementValidator; -import org.androidannotations.validation.IsValid; - -public class OptionsValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - private RestAnnotationHelper restAnnotationHelper; - - public OptionsValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - restAnnotationHelper = new RestAnnotationHelper(processingEnv, getTarget()); - } - - @Override - public String getTarget() { - return Options.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.notAlreadyValidated(element, validatedElements, valid); - - validatorHelper.enclosingElementHasRestAnnotation(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.throwsOnlyRestClientException(executableElement, valid); - - validatorHelper.hasSetOfHttpMethodReturnType(executableElement, valid); - - restAnnotationHelper.urlVariableNamesExistInParametersAndHasNoOneMoreParameter(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/PostValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/PostValidator.java deleted file mode 100644 index f5e920518d..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/PostValidator.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.rest.Post; -import org.androidannotations.helper.RestAnnotationHelper; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.validation.ElementValidator; -import org.androidannotations.validation.IsValid; - -public class PostValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - private RestAnnotationHelper restAnnotationHelper; - - public PostValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - restAnnotationHelper = new RestAnnotationHelper(processingEnv, getTarget()); - } - - @Override - public String getTarget() { - return Post.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.notAlreadyValidated(element, validatedElements, valid); - - validatorHelper.enclosingElementHasRestAnnotation(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.throwsOnlyRestClientException(executableElement, valid); - - validatorHelper.doesNotReturnPrimitive(executableElement, valid); - - restAnnotationHelper.urlVariableNamesExistInParametersAndHasOnlyOneMoreParameter(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/PutValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/PutValidator.java deleted file mode 100644 index d0a2ccd2a2..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/PutValidator.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.ExecutableElement; - -import org.androidannotations.annotations.rest.Put; -import org.androidannotations.helper.RestAnnotationHelper; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.validation.ElementValidator; -import org.androidannotations.validation.IsValid; - -public class PutValidator implements ElementValidator { - - private ValidatorHelper validatorHelper; - private RestAnnotationHelper restAnnotationHelper; - - public PutValidator(ProcessingEnvironment processingEnv) { - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - restAnnotationHelper = new RestAnnotationHelper(processingEnv, getTarget()); - } - - @Override - public String getTarget() { - return Put.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - - IsValid valid = new IsValid(); - - validatorHelper.notAlreadyValidated(element, validatedElements, valid); - - validatorHelper.enclosingElementHasRestAnnotation(element, validatedElements, valid); - - ExecutableElement executableElement = (ExecutableElement) element; - - validatorHelper.throwsOnlyRestClientException(executableElement, valid); - - validatorHelper.doesNotReturnPrimitive(executableElement, valid); - - restAnnotationHelper.urlVariableNamesExistInParametersAndHasOnlyOneMoreParameter(executableElement, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/RestValidator.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/RestValidator.java deleted file mode 100644 index f74ab536f4..0000000000 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/validation/rest/RestValidator.java +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (C) 2010-2013 eBusiness Information, Excilys Group - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed To in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.androidannotations.validation.rest; - -import javax.annotation.processing.ProcessingEnvironment; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; - -import org.androidannotations.annotations.rest.Rest; -import org.androidannotations.helper.AndroidManifest; -import org.androidannotations.helper.TargetAnnotationHelper; -import org.androidannotations.helper.ValidatorHelper; -import org.androidannotations.model.AnnotationElements; -import org.androidannotations.validation.ElementValidator; -import org.androidannotations.validation.IsValid; - -public class RestValidator implements ElementValidator { - - private final ValidatorHelper validatorHelper; - private final AndroidManifest androidManifest; - - public RestValidator(ProcessingEnvironment processingEnv, AndroidManifest androidManifest) { - this.androidManifest = androidManifest; - TargetAnnotationHelper annotationHelper = new TargetAnnotationHelper(processingEnv, getTarget()); - validatorHelper = new ValidatorHelper(annotationHelper); - } - - @Override - public String getTarget() { - return Rest.class.getName(); - } - - @Override - public boolean validate(Element element, AnnotationElements validatedElements) { - IsValid valid = new IsValid(); - - TypeElement typeElement = (TypeElement) element; - - validatorHelper.notAlreadyValidated(element, validatedElements, valid); - - validatorHelper.hasSpringAndroidJars(element, valid); - - validatorHelper.isInterface(typeElement, valid); - - validatorHelper.isTopLevel(typeElement, valid); - - validatorHelper.doesNotExtendInvalidInterfaces(typeElement, valid); - - validatorHelper.unannotatedMethodReturnsRestTemplate(typeElement, valid); - - validatorHelper.validateConverters(element, valid); - - validatorHelper.validateInterceptors(element, valid); - - validatorHelper.hasInternetPermission(typeElement, androidManifest, valid); - - return valid.isValid(); - } - -} diff --git a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/ActivityIntentFragmentTest.java b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/ActivityIntentFragmentTest.java index 5b9c39ab1e..addc87d511 100644 --- a/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/ActivityIntentFragmentTest.java +++ b/AndroidAnnotations/androidannotations/src/test/java/org/androidannotations/generation/ActivityIntentFragmentTest.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ package org.androidannotations.generation; import java.io.File; diff --git a/AndroidAnnotations/androidannotations/src/test/resources/org/androidannotations/generation/AndroidManifestMinFroyo.xml b/AndroidAnnotations/androidannotations/src/test/resources/org/androidannotations/generation/AndroidManifestMinFroyo.xml index 000a256ef4..41508bcc14 100644 --- a/AndroidAnnotations/androidannotations/src/test/resources/org/androidannotations/generation/AndroidManifestMinFroyo.xml +++ b/AndroidAnnotations/androidannotations/src/test/resources/org/androidannotations/generation/AndroidManifestMinFroyo.xml @@ -1,5 +1,6 @@ mMap; + Map mMap; public CustomShadowBundle() { mMap = new HashMap(); @@ -131,12 +131,14 @@ public void putParcelableArray(String key, Parcelable[] value) { } @Implementation - public void putParcelableArrayList(String key, ArrayList value) { + public void putParcelableArrayList(String key, + ArrayList value) { mMap.put(key, value); } @Implementation - public void putSparseParcelableArray(String key, SparseArray value) { + public void putSparseParcelableArray(String key, + SparseArray value) { mMap.put(key, value); } @@ -428,7 +430,8 @@ public ArrayList getParcelableArrayList(String key) { } @Implementation - public SparseArray getSparseParcelableArray(String key) { + public SparseArray getSparseParcelableArray( + String key) { Object o = mMap.get(key); if (o == null) { return null; @@ -622,7 +625,4 @@ public boolean equals(Object obj) { return true; } - - - } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/com/xtremelabs/robolectric/shadows/ShadowButton.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/com/xtremelabs/robolectric/shadows/ShadowButton.java index 244742a18b..5dbc92dfd8 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/com/xtremelabs/robolectric/shadows/ShadowButton.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/com/xtremelabs/robolectric/shadows/ShadowButton.java @@ -36,7 +36,8 @@ public boolean performLongClick() { } @Implementation - public void setOnLongClickListener(View.OnLongClickListener onLongClickListener) { + public void setOnLongClickListener( + View.OnLongClickListener onLongClickListener) { this.onLongClickListener = onLongClickListener; } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/com/xtremelabs/robolectric/shadows/ShadowListFragment.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/com/xtremelabs/robolectric/shadows/ShadowListFragment.java index ab5adcd6ab..ca66328564 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/com/xtremelabs/robolectric/shadows/ShadowListFragment.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/com/xtremelabs/robolectric/shadows/ShadowListFragment.java @@ -27,12 +27,13 @@ @Implements(ListFragment.class) public class ShadowListFragment extends ShadowFragment { - final private AdapterView.OnItemClickListener mOnClickListener = // - new AdapterView.OnItemClickListener() { - public void onItemClick(AdapterView parent, View v, int position, long id) { - onListItemClick((ListView) parent, v, position, id); - } - }; + final private AdapterView.OnItemClickListener mOnClickListener = // + new AdapterView.OnItemClickListener() { + public void onItemClick(AdapterView parent, View v, int position, + long id) { + onListItemClick((ListView) parent, v, position, id); + } + }; @Implementation public void onViewCreated(View view, Bundle savedInstanceState) { diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AbstractActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AbstractActivityTest.java index 2ba646a3b1..a099aa3318 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AbstractActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AbstractActivityTest.java @@ -31,5 +31,5 @@ public void activityShouldBeFinal() { assertThat(Modifier.isFinal(modifiers)).isTrue(); } - + } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AndroidAnnotationsTestRunner.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AndroidAnnotationsTestRunner.java index 84a0372c8f..0005ef2e92 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AndroidAnnotationsTestRunner.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AndroidAnnotationsTestRunner.java @@ -22,7 +22,8 @@ import com.xtremelabs.robolectric.RobolectricTestRunner; public class AndroidAnnotationsTestRunner extends RobolectricTestRunner { - public AndroidAnnotationsTestRunner(Class testClass) throws InitializationError { - super(testClass, new File("../functional-test-1-5")); - } + public AndroidAnnotationsTestRunner(Class testClass) + throws InitializationError { + super(testClass, new File("../functional-test-1-5")); + } } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ApplicationInjectedActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ApplicationInjectedActivityTest.java index 4ab3ae8d15..74018ebf27 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ApplicationInjectedActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ApplicationInjectedActivityTest.java @@ -24,29 +24,28 @@ @RunWith(AndroidAnnotationsTestRunner.class) public class ApplicationInjectedActivityTest { - + @Test public void should_have_application_after_create() { new SampleRoboApplication_().onCreate(); ApplicationInjectedActivity_ activity = new ApplicationInjectedActivity_(); - + activity.onCreate(null); assertThat(activity.customApplication).isNotNull(); } - + @Test public void application_can_be_replaced_for_tests() { SampleRoboApplication testApp = new SampleRoboApplication(); - + SampleRoboApplication_.setForTesting(testApp); - + ApplicationInjectedActivity_ activity = new ApplicationInjectedActivity_(); - + activity.onCreate(null); assertThat(activity.customApplication).isSameAs(testApp); } - } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AwaitingResultActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AwaitingResultActivityTest.java index fceb878963..22e629feac 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AwaitingResultActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/AwaitingResultActivityTest.java @@ -28,41 +28,46 @@ public void onlyFirstRequestAnnotatedMethodAreCalled() { AwaitingResultActivity_ activity = new AwaitingResultActivity_(); activity.onActivityResult(AwaitingResultActivity.FIRST_REQUEST, 0, null); - + assertThat(activity.onResultCalled).isTrue(); assertThat(activity.onResultWithDataCalled).isFalse(); - assertThat(activity.onActivityResultWithResultCodeAndDataCalled).isFalse(); - assertThat(activity.onActivityResultWithDataAndResultCodeCalled).isFalse(); + assertThat(activity.onActivityResultWithResultCodeAndDataCalled) + .isFalse(); + assertThat(activity.onActivityResultWithDataAndResultCodeCalled) + .isFalse(); assertThat(activity.onResultWithIntResultCodeCalled).isFalse(); assertThat(activity.onResultWithIntegerResultCodeCalled).isFalse(); } - @Test public void onlySecondRequestAnnotatedMethodAreCalled() { AwaitingResultActivity_ activity = new AwaitingResultActivity_(); - activity.onActivityResult(AwaitingResultActivity.SECOND_REQUEST, 0, null); - + activity.onActivityResult(AwaitingResultActivity.SECOND_REQUEST, 0, + null); + assertThat(activity.onResultCalled).isFalse(); assertThat(activity.onResultWithDataCalled).isTrue(); - assertThat(activity.onActivityResultWithResultCodeAndDataCalled).isTrue(); - assertThat(activity.onActivityResultWithDataAndResultCodeCalled).isTrue(); + assertThat(activity.onActivityResultWithResultCodeAndDataCalled) + .isTrue(); + assertThat(activity.onActivityResultWithDataAndResultCodeCalled) + .isTrue(); assertThat(activity.onResultWithIntResultCodeCalled).isFalse(); assertThat(activity.onResultWithIntegerResultCodeCalled).isFalse(); } - @Test public void onlyThirdRequestAnnotatedMethodAreCalled() { AwaitingResultActivity_ activity = new AwaitingResultActivity_(); activity.onActivityResult(AwaitingResultActivity.THIRD_REQUEST, 0, null); - + assertThat(activity.onResultCalled).isFalse(); assertThat(activity.onResultWithDataCalled).isFalse(); - assertThat(activity.onActivityResultWithResultCodeAndDataCalled).isFalse(); - assertThat(activity.onActivityResultWithDataAndResultCodeCalled).isFalse(); + assertThat(activity.onActivityResultWithResultCodeAndDataCalled) + .isFalse(); + assertThat(activity.onActivityResultWithDataAndResultCodeCalled) + .isFalse(); assertThat(activity.onResultWithIntResultCodeCalled).isTrue(); assertThat(activity.onResultWithIntegerResultCodeCalled).isTrue(); } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ClicksHandledActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ClicksHandledActivityTest.java index 3ba56c9a00..1454c9c947 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ClicksHandledActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ClicksHandledActivityTest.java @@ -50,43 +50,44 @@ public void avoidStackOverflow() { @Test public void handlingWithConvention() { assertThat(activity.conventionButtonEventHandled).isFalse(); - + activity.findViewById(R.id.conventionButton).performClick(); - + assertThat(activity.conventionButtonEventHandled).isTrue(); } @Test public void handlingWithSnakeCase() { assertThat(activity.snakeCaseButtonEventHandled).isFalse(); - + activity.findViewById(R.id.snake_case_button).performClick(); - + assertThat(activity.snakeCaseButtonEventHandled).isTrue(); } @Test public void handlingWithExtendedConvention() { assertThat(activity.extendedConventionButtonEventHandled).isFalse(); - + activity.findViewById(R.id.extendedConventionButton).performClick(); - + assertThat(activity.extendedConventionButtonEventHandled).isTrue(); } @Test public void handlingWithConfigurationOverConvention() { assertThat(activity.overridenConventionButtonEventHandled).isFalse(); - - activity.findViewById(R.id.configurationOverConventionButton).performClick(); - + + activity.findViewById(R.id.configurationOverConventionButton) + .performClick(); + assertThat(activity.overridenConventionButtonEventHandled).isTrue(); } @Test public void unannotatedButtonIsNotHandled() { activity.findViewById(R.id.unboundButton).performClick(); - + assertThat(activity.unboundButtonEventHandled).isFalse(); } @@ -103,26 +104,26 @@ public void viewArgumentIsGiven() { public void multipleButtonsClicked() { assertThat(activity.multipleButtonsEventHandled).isFalse(); - activity.findViewById(R.id.button1).performClick(); + activity.findViewById(R.id.button1).performClick(); assertThat(activity.multipleButtonsEventHandled).isTrue(); assertThat(activity.viewArgument).hasId(R.id.button1); - + activity.multipleButtonsEventHandled = false; - + activity.findViewById(R.id.button2).performClick(); assertThat(activity.multipleButtonsEventHandled).isTrue(); assertThat(activity.viewArgument).hasId(R.id.button2); } - + @Test public void libResBussonClicked() { assertThat(activity.libResButtonEventHandled).isFalse(); - activity.findViewById(R.id.libResButton1).performClick(); + activity.findViewById(R.id.libResButton1).performClick(); assertThat(activity.libResButtonEventHandled).isTrue(); - + activity.libResButtonEventHandled = false; - + activity.findViewById(R.id.libResButton2).performClick(); assertThat(activity.libResButtonEventHandled).isTrue(); } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/EmptyActivityWithLayoutTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/EmptyActivityWithLayoutTest.java index f32e4cf743..06b5b5e09c 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/EmptyActivityWithLayoutTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/EmptyActivityWithLayoutTest.java @@ -30,7 +30,8 @@ public void shouldHaveLayoutAfterCreate() { activity.onCreate(null); activity.setContentView(R.layout.main); - assertThat(activity.findViewById(R.id.helloTextView)).hasId(R.id.helloTextView); + assertThat(activity.findViewById(R.id.helloTextView)).hasId( + R.id.helloTextView); } } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/FakeClipboardManager.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/FakeClipboardManager.java index 38779b9d7a..a80670a90a 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/FakeClipboardManager.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/FakeClipboardManager.java @@ -17,9 +17,7 @@ import android.text.ClipboardManager; -import com.xtremelabs.robolectric.internal.Implementation; -import com.xtremelabs.robolectric.internal.Implements; - +@SuppressWarnings("deprecation") public class FakeClipboardManager extends ClipboardManager { private CharSequence text; diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/FromHtmlActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/FromHtmlActivityTest.java index b1d64c1311..73296478dd 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/FromHtmlActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/FromHtmlActivityTest.java @@ -43,12 +43,14 @@ public void setup() { @Test public void injectionOfHtmlTest() { assertNotNull(activity.textView); - assertEquals(Html.fromHtml(activity.getString(R.string.hello_html)), activity.textView.getText()); + assertEquals(Html.fromHtml(activity.getString(R.string.hello_html)), + activity.textView.getText()); } @Test public void injectionOfHtmlWithDefaultName() { assertNotNull(activity.someView); - assertEquals(Html.fromHtml(activity.getString(R.string.someView)), activity.someView.getText()); + assertEquals(Html.fromHtml(activity.getString(R.string.someView)), + activity.someView.getText()); } } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ItemClicksHandledActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ItemClicksHandledActivityTest.java index ac6f689507..c789bb3a2f 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ItemClicksHandledActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ItemClicksHandledActivityTest.java @@ -37,7 +37,8 @@ public class ItemClicksHandledActivityTest { public void setup() { activity = new ItemClicksHandledActivity_(); activity.onCreate(null); - clickedItem = activity.getResources().getStringArray(R.array.planets_array)[TESTED_CLICKED_INDEX]; + clickedItem = activity.getResources().getStringArray( + R.array.planets_array)[TESTED_CLICKED_INDEX]; } @Test @@ -64,53 +65,63 @@ public void handlingListViewItemClick() { @Test public void handlingSpinnerItemClickWithArgument() { - Spinner spinner = (Spinner) activity.findViewById(R.id.spinnerWithArgument); + Spinner spinner = (Spinner) activity + .findViewById(R.id.spinnerWithArgument); long itemId = spinner.getAdapter().getItemId(TESTED_CLICKED_INDEX); View view = spinner.getChildAt(TESTED_CLICKED_INDEX); assertThat(activity.spinnerWithArgumentSelectedItem).isNull(); spinner.performItemClick(view, TESTED_CLICKED_INDEX, itemId); assertThat(activity.spinnerWithArgumentSelectedItem).isNotNull(); - assertThat(activity.spinnerWithArgumentSelectedItem).isEqualTo(clickedItem); + assertThat(activity.spinnerWithArgumentSelectedItem).isEqualTo( + clickedItem); } @Test public void handlingListViewitemClickWithArgument() { - ListView listView = (ListView) activity.findViewById(R.id.listViewWithArgument); + ListView listView = (ListView) activity + .findViewById(R.id.listViewWithArgument); long itemId = listView.getAdapter().getItemId(TESTED_CLICKED_INDEX); View view = listView.getChildAt(TESTED_CLICKED_INDEX); assertThat(activity.listViewWithArgumentSelectedItem).isNull(); listView.performItemClick(view, TESTED_CLICKED_INDEX, itemId); assertThat(activity.listViewWithArgumentSelectedItem).isNotNull(); - assertThat(activity.listViewWithArgumentSelectedItem).isEqualTo(clickedItem); + assertThat(activity.listViewWithArgumentSelectedItem).isEqualTo( + clickedItem); } @Test public void handlingListViewItemClickWithPosition() { - ListView listView = (ListView) activity.findViewById(R.id.listViewWithPosition); + ListView listView = (ListView) activity + .findViewById(R.id.listViewWithPosition); long itemId = listView.getAdapter().getItemId(TESTED_CLICKED_INDEX); View view = listView.getChildAt(TESTED_CLICKED_INDEX); assertThat(activity.listViewWithPositionClickedPosition).isEqualTo(0); listView.performItemClick(view, TESTED_CLICKED_INDEX, itemId); - assertThat(activity.listViewWithPositionClickedPosition).isEqualTo(TESTED_CLICKED_INDEX); + assertThat(activity.listViewWithPositionClickedPosition).isEqualTo( + TESTED_CLICKED_INDEX); } @Test public void handlingListViewWithPositionItemSelected() { - ListView listView = (ListView) activity.findViewById(R.id.listViewWithPosition); + ListView listView = (ListView) activity + .findViewById(R.id.listViewWithPosition); - assertThat(activity.listViewWithPositionItemSelectedPosition).isEqualTo(0); + assertThat(activity.listViewWithPositionItemSelectedPosition) + .isEqualTo(0); assertThat(activity.listViewWithPositionItemSelected).isFalse(); listView.setSelection(TESTED_CLICKED_INDEX); assertThat(activity.listViewWithPositionItemSelected).isTrue(); - assertThat(activity.listViewWithPositionItemSelectedPosition).isEqualTo(TESTED_CLICKED_INDEX); + assertThat(activity.listViewWithPositionItemSelectedPosition) + .isEqualTo(TESTED_CLICKED_INDEX); } - + @Test public void can_have_one_selected_argument() { - ListView listView = (ListView) activity.findViewById(R.id.listViewWithOneParam); + ListView listView = (ListView) activity + .findViewById(R.id.listViewWithOneParam); assertThat(activity.listViewWithOneParamItemSelected).isFalse(); listView.setSelection(TESTED_CLICKED_INDEX); assertThat(activity.listViewWithOneParamItemSelected).isTrue(); diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/LongClicksHandledActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/LongClicksHandledActivityTest.java index 36d043563e..78abfe0a06 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/LongClicksHandledActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/LongClicksHandledActivityTest.java @@ -78,7 +78,8 @@ public void handlingWithExtendedConvention() { public void handlingWithConfigurationOverConvention() { assertThat(activity.overridenConventionButtonEventHandled).isFalse(); - activity.findViewById(R.id.configurationOverConventionButton).performLongClick(); + activity.findViewById(R.id.configurationOverConventionButton) + .performLongClick(); assertThat(activity.overridenConventionButtonEventHandled).isTrue(); } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/RobolectricParameterized.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/RobolectricParameterized.java index b5cc656018..375f98af5b 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/RobolectricParameterized.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/RobolectricParameterized.java @@ -64,7 +64,10 @@ * public class FibonacciTest { * @Parameters * public static List<Object[]> data() { - * return Arrays.asList(new Object[][] { Fibonacci, { { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } } }); + * return Arrays.asList(new Object[][] { + * Fibonacci, + * { { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, + * { 6, 8 } } }); * } * * private int fInput; @@ -91,18 +94,21 @@ */ public class RobolectricParameterized extends Suite { - public static class TestClassRunnerForParameters extends AndroidAnnotationsTestRunner { + public static class TestClassRunnerForParameters extends + AndroidAnnotationsTestRunner { private int parameterSetNumber; private List parameterList; private RobolectricParameterized motherRunner; - public TestClassRunnerForParameters(Class type) throws InitializationError { + public TestClassRunnerForParameters(Class type) + throws InitializationError { super(type); } - private void init(RobolectricParameterized motherRunner, List parameterList, int parameterSetNumber) { + private void init(RobolectricParameterized motherRunner, + List parameterList, int parameterSetNumber) { this.motherRunner = motherRunner; this.parameterList = parameterList; this.parameterSetNumber = parameterSetNumber; @@ -144,7 +150,8 @@ public Object createTest() throws Exception { } if (initMethod == null) { - throw new RuntimeException("No init method found in parameterized test"); + throw new RuntimeException( + "No init method found in parameterized test"); } initMethod.setAccessible(true); @@ -160,7 +167,10 @@ private Object[] computeParams() throws Exception { try { return parameterList.get(parameterSetNumber); } catch (ClassCastException e) { - throw new Exception(String.format("%s.%s() must return a Collection of arrays.", getTestClass().getName(), motherRunner.getParametersMethod(getTestClass()).getName())); + throw new Exception(String.format( + "%s.%s() must return a Collection of arrays.", + getTestClass().getName(), motherRunner + .getParametersMethod(getTestClass()).getName())); } } @@ -171,7 +181,8 @@ protected String getName() { @Override protected String testName(final FrameworkMethod method) { - return String.format("%s[%s]", method.getName(), parameterSetNumber); + return String + .format("%s[%s]", method.getName(), parameterSetNumber); } @Override @@ -197,7 +208,8 @@ public RobolectricParameterized(Class klass) throws Throwable { super(robolectricClass(klass), Collections. emptyList()); List parametersList = getParametersList(getTestClass()); for (int i = 0; i < parametersList.size(); i++) { - TestClassRunnerForParameters testRunner = new TestClassRunnerForParameters(getTestClass().getJavaClass()); + TestClassRunnerForParameters testRunner = new TestClassRunnerForParameters( + getTestClass().getJavaClass()); testRunner.init(this, parametersList, i); runners.add(testRunner); } @@ -210,26 +222,33 @@ protected List getChildren() { @SuppressWarnings("unchecked") private List getParametersList(TestClass klass) throws Throwable { - return (List) getParametersMethod(klass).invokeExplosively(null); + return (List) getParametersMethod(klass).invokeExplosively( + null); } - private FrameworkMethod getParametersMethod(TestClass testClass) throws Exception { - List methods = testClass.getAnnotatedMethods(Parameters.class); + private FrameworkMethod getParametersMethod(TestClass testClass) + throws Exception { + List methods = testClass + .getAnnotatedMethods(Parameters.class); for (FrameworkMethod each : methods) { int modifiers = each.getMethod().getModifiers(); if (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers)) return each; } - throw new Exception("No public static parameters method on class " + testClass.getName()); + throw new Exception("No public static parameters method on class " + + testClass.getName()); } - private static Class robolectricClass(Class originalClass) throws Exception { + private static Class robolectricClass(Class originalClass) + throws Exception { return getRobolectricLoader().loadClass(originalClass.getName()); } - private static RobolectricClassLoader getRobolectricLoader() throws Exception { - Method getDefaultLoader = RobolectricTestRunner.class.getDeclaredMethod("getDefaultLoader"); + private static RobolectricClassLoader getRobolectricLoader() + throws Exception { + Method getDefaultLoader = RobolectricTestRunner.class + .getDeclaredMethod("getDefaultLoader"); getDefaultLoader.setAccessible(true); return (RobolectricClassLoader) getDefaultLoader.invoke(null); } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/SSLConnectionTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/SSLConnectionTest.java index b4e2e355a0..8c66448e69 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/SSLConnectionTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/SSLConnectionTest.java @@ -51,7 +51,8 @@ public void setup() { @Test public void truststoreProvided() { assertNotNull(activity.mHttpsClientTest1); - ClientConnectionManager ccm = activity.mHttpsClientTest1.getConnectionManager(); + ClientConnectionManager ccm = activity.mHttpsClientTest1 + .getConnectionManager(); assertNotNull(ccm); Scheme httpsScheme = ccm.getSchemeRegistry().getScheme("https"); @@ -61,25 +62,31 @@ public void truststoreProvided() { SocketFactory socketFactHttps = httpsScheme.getSocketFactory(); if (!(socketFactHttps instanceof SSLSocketFactory)) { - Assert.fail("wrong instance should be org.apache.http.conn.ssl.SSLSocketFactory, getting " + socketFactHttps); + Assert.fail("wrong instance should be org.apache.http.conn.ssl.SSLSocketFactory, getting " + + socketFactHttps); } - assertEquals(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER, ((SSLSocketFactory) socketFactHttps).getHostnameVerifier()); + assertEquals(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER, + ((SSLSocketFactory) socketFactHttps).getHostnameVerifier()); } @Test public void strictHostnameVerifier() { assertNotNull(activity.mHttpsClientTest2); - ClientConnectionManager ccm = activity.mHttpsClientTest2.getConnectionManager(); + ClientConnectionManager ccm = activity.mHttpsClientTest2 + .getConnectionManager(); Scheme httpsScheme = ccm.getSchemeRegistry().getScheme("https"); - SSLSocketFactory socketFactHttps = (SSLSocketFactory) httpsScheme.getSocketFactory(); + SSLSocketFactory socketFactHttps = (SSLSocketFactory) httpsScheme + .getSocketFactory(); - assertEquals(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER, ((SSLSocketFactory) socketFactHttps).getHostnameVerifier()); + assertEquals(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER, + ((SSLSocketFactory) socketFactHttps).getHostnameVerifier()); } @Test public void noOptions() { assertNotNull(activity.mHttpsClientTest3); - ClientConnectionManager ccm = activity.mHttpsClientTest3.getConnectionManager(); + ClientConnectionManager ccm = activity.mHttpsClientTest3 + .getConnectionManager(); assertNotNull(ccm); } } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ServiceInjectionTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ServiceInjectionTest.java index 6a9cd03ba0..ba1a5b8623 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ServiceInjectionTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ServiceInjectionTest.java @@ -33,10 +33,12 @@ public class ServiceInjectionTest { @Before public void setup() throws Exception { - Field serviceMapField = ShadowApplication.class.getDeclaredField("SYSTEM_SERVICE_MAP"); + Field serviceMapField = ShadowApplication.class + .getDeclaredField("SYSTEM_SERVICE_MAP"); serviceMapField.setAccessible(true); @SuppressWarnings("unchecked") - Map SYSTEM_SERVICE_MAP = (Map) serviceMapField.get(null); + Map SYSTEM_SERVICE_MAP = (Map) serviceMapField + .get(null); SYSTEM_SERVICE_MAP.put(Context.CLIPBOARD_SERVICE, "android.content.ClipboardManager"); } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ThreadActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ThreadActivityTest.java index c138f40bd3..122f76539b 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ThreadActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ThreadActivityTest.java @@ -65,25 +65,26 @@ public void after() { @Test public void backgroundDelegatesToExecutor() { - + Executor executor = mock(Executor.class); - + BackgroundExecutor.setExecutor(executor); - + activity.emptyBackgroundMethod(); - - verify(executor).execute(Mockito.any()); + + verify(executor).execute(Mockito. any()); } /** - * Verify that non-serialized background tasks are not serialized (ensure that - * serial feature does not force all background tasks to be serialized). + * Verify that non-serialized background tasks are not + * serialized (ensure that serial feature does not force all background + * tasks to be serialized). * - * Start several requests which add an item to a list in background, without "@Background" - * serial attribute enabled. + * Start several requests which add an item to a list in background, without + * "@Background" serial attribute enabled. * - * Once all tasks have completed execution, verify that the items in the list are not ordered - * (with very little false-negative probability). + * Once all tasks have completed execution, verify that the items in the + * list are not ordered (with very little false-negative probability). */ @Test public void parallelBackgroundTasks() { @@ -93,7 +94,8 @@ public void parallelBackgroundTasks() { /* set an executor with 4 threads */ BackgroundExecutor.setExecutor(Executors.newFixedThreadPool(4)); - List list = Collections.synchronizedList(new ArrayList()); + List list = Collections + .synchronizedList(new ArrayList()); /* sem.acquire() will be unlocked exactly after NB_ADD releases */ Semaphore sem = new Semaphore(1 - NB_ADD); @@ -103,8 +105,8 @@ public void parallelBackgroundTasks() { /* execute NB_ADD requests to add an item to the list */ for (int i = 0; i < NB_ADD; i++) { /* - * wait a random delay (between 0 and 20 milliseconds) to increase the probability of - * wrong order + * wait a random delay (between 0 and 20 milliseconds) to increase + * the probability of wrong order */ int delay = random.nextInt(20); activity.addBackground(list, i, delay, sem); @@ -112,12 +114,14 @@ public void parallelBackgroundTasks() { try { /* wait for all tasks to be completed */ - boolean acquired = sem.tryAcquire(MAX_WAITING_TIME, TimeUnit.MILLISECONDS); - Assert.assertTrue("Requested tasks should have completed execution", acquired); + boolean acquired = sem.tryAcquire(MAX_WAITING_TIME, + TimeUnit.MILLISECONDS); + Assert.assertTrue( + "Requested tasks should have completed execution", acquired); /* - * verify that list items are in the wrong order (the probability it is in the right is - * 1/(NB_ADD!), which is nearly 0) + * verify that list items are in the wrong order (the probability it + * is in the right is 1/(NB_ADD!), which is nearly 0) */ boolean rightOrder = true; for (int i = 0; i < NB_ADD && rightOrder; i++) { @@ -125,17 +129,20 @@ public void parallelBackgroundTasks() { } Assert.assertFalse("Items should not be in order", rightOrder); } catch (InterruptedException e) { - Assert.assertFalse("Testing thread should never be interrupted", true); + Assert.assertFalse("Testing thread should never be interrupted", + true); } } /** * Verify that serialized background tasks are correctly serialized. * - * Start several requests which add an item to a list in background, with "@Background" serial - * attribute enabled, so the requests must be executed sequentially. + * Start several requests which add an item to a list in background, with + * "@Background" serial attribute enabled, so the requests must be executed + * sequentially. * - * Once all tasks have completed execution, verify that the items in the list are ordered. + * Once all tasks have completed execution, verify that the items in the + * list are ordered. */ @Test public void serializedBackgroundTasks() { @@ -146,10 +153,11 @@ public void serializedBackgroundTasks() { BackgroundExecutor.setExecutor(Executors.newFixedThreadPool(4)); /* - * the calls are serialized, but not necessarily on the same thread, so we need to - * synchronize to avoid cache effects + * the calls are serialized, but not necessarily on the same thread, so + * we need to synchronize to avoid cache effects */ - List list = Collections.synchronizedList(new ArrayList()); + List list = Collections + .synchronizedList(new ArrayList()); /* sem.acquire() will be unlocked exactly after NB_ADD releases */ Semaphore sem = new Semaphore(1 - NB_ADD); @@ -159,8 +167,8 @@ public void serializedBackgroundTasks() { /* execute NB_ADD requests to add an item to the list */ for (int i = 0; i < NB_ADD; i++) { /* - * wait a random delay (between 0 and 20 milliseconds) to increase the probability of - * wrong order if buggy + * wait a random delay (between 0 and 20 milliseconds) to increase + * the probability of wrong order if buggy */ int delay = random.nextInt(20); activity.addSerializedBackground(list, i, delay, sem); @@ -168,25 +176,30 @@ public void serializedBackgroundTasks() { try { /* wait for all tasks to be completed */ - boolean acquired = sem.tryAcquire(MAX_WAITING_TIME, TimeUnit.MILLISECONDS); - Assert.assertTrue("Requested tasks should have completed execution", acquired); + boolean acquired = sem.tryAcquire(MAX_WAITING_TIME, + TimeUnit.MILLISECONDS); + Assert.assertTrue( + "Requested tasks should have completed execution", acquired); for (int i = 0; i < NB_ADD; i++) { - Assert.assertEquals("Items must be in order", i, (int) list.get(i)); + Assert.assertEquals("Items must be in order", i, + (int) list.get(i)); } } catch (InterruptedException e) { - Assert.assertFalse("Testing thread should never be interrupted", true); + Assert.assertFalse("Testing thread should never be interrupted", + true); } } /** - * Verify that cancellable background tasks are correctly cancelled, and others are not. + * Verify that cancellable background tasks are correctly cancelled, and + * others are not. * - * Start several requests which add an item to a list in background, half explicitly cancelled, - * half not cancelled. + * Start several requests which add an item to a list in background, half + * explicitly cancelled, half not cancelled. * - * Once all tasks have completed execution, check if and only if the items from the uncancelled - * tasks are in the list. + * Once all tasks have completed execution, check if and only if the items + * from the uncancelled tasks are in the list. */ @Test public void cancellableBackgroundTasks() { @@ -197,15 +210,19 @@ public void cancellableBackgroundTasks() { BackgroundExecutor.setExecutor(Executors.newFixedThreadPool(4)); /* - * the calls are serialized, but not necessarily on the same thread, so we need to - * synchronize to avoid cache effects + * the calls are serialized, but not necessarily on the same thread, so + * we need to synchronize to avoid cache effects */ - List list = Collections.synchronizedList(new ArrayList()); + List list = Collections + .synchronizedList(new ArrayList()); /* sem.acquire() will be unlocked exactly after NB_ADD releases */ Semaphore sem = new Semaphore(1 - NB_ADD); - /* execute 2*NB_ADD requests to add an item to the list, half being cancelled */ + /* + * execute 2*NB_ADD requests to add an item to the list, half being + * cancelled + */ for (int i = 0; i < NB_ADD; i++) { activity.addBackground(list, i, 0, sem); activity.addCancellableBackground(list, NB_ADD + i, 4000); @@ -218,16 +235,21 @@ public void cancellableBackgroundTasks() { try { /* wait for all non cancelled tasks to be completed */ - boolean acquired = sem.tryAcquire(MAX_WAITING_TIME, TimeUnit.MILLISECONDS); - Assert.assertTrue("Requested tasks should have completed execution", acquired); + boolean acquired = sem.tryAcquire(MAX_WAITING_TIME, + TimeUnit.MILLISECONDS); + Assert.assertTrue( + "Requested tasks should have completed execution", acquired); - Assert.assertEquals("Only uncancelled tasks must have added items", list.size(), NB_ADD); + Assert.assertEquals("Only uncancelled tasks must have added items", + list.size(), NB_ADD); for (int i = 0; i < NB_ADD; i++) { - Assert.assertTrue("Items must be only from uncancelled tasks", i < NB_ADD); + Assert.assertTrue("Items must be only from uncancelled tasks", + i < NB_ADD); } } catch (InterruptedException e) { - Assert.assertFalse("Testing thread should never be interrupted", true); + Assert.assertFalse("Testing thread should never be interrupted", + true); } } @@ -240,15 +262,19 @@ public void cancellableSerializedBackgroundTasks() { BackgroundExecutor.setExecutor(Executors.newFixedThreadPool(4)); /* - * the calls are serialized, but not necessarily on the same thread, so we need to - * synchronize to avoid cache effects + * the calls are serialized, but not necessarily on the same thread, so + * we need to synchronize to avoid cache effects */ - List list = Collections.synchronizedList(new ArrayList()); + List list = Collections + .synchronizedList(new ArrayList()); /* sem.acquire() will be unlocked exactly after NB_ADD releases */ Semaphore sem = new Semaphore(1 - NB_ADD); - /* execute 2*NB_ADD requests to add an item to the list, half being cancelled */ + /* + * execute 2*NB_ADD requests to add an item to the list, half being + * cancelled + */ for (int i = 0; i < NB_ADD; i++) { activity.addSerializedBackground(list, i, 0, sem); activity.addCancellableSerializedBackground(list, NB_ADD + i, 4000); @@ -261,20 +287,25 @@ public void cancellableSerializedBackgroundTasks() { try { /* wait for all non cancelled tasks to be completed */ - boolean acquired = sem.tryAcquire(MAX_WAITING_TIME, TimeUnit.MILLISECONDS); - Assert.assertTrue("Requested tasks should have completed execution", acquired); + boolean acquired = sem.tryAcquire(MAX_WAITING_TIME, + TimeUnit.MILLISECONDS); + Assert.assertTrue( + "Requested tasks should have completed execution", acquired); /* cancel all tasks with id "to_cancel_2" */ BackgroundExecutor.cancelAll("to_cancel_2", true); - Assert.assertEquals("Only uncancelled tasks must have added items", list.size(), NB_ADD); + Assert.assertEquals("Only uncancelled tasks must have added items", + list.size(), NB_ADD); for (int i = 0; i < NB_ADD; i++) { - Assert.assertTrue("Items must be only from uncancelled tasks", i < NB_ADD); + Assert.assertTrue("Items must be only from uncancelled tasks", + i < NB_ADD); } } catch (InterruptedException e) { - Assert.assertFalse("Testing thread should never be interrupted", true); + Assert.assertFalse("Testing thread should never be interrupted", + true); } } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/TouchesHandledActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/TouchesHandledActivityTest.java index 48cba63392..b50cb368f2 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/TouchesHandledActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/TouchesHandledActivityTest.java @@ -43,7 +43,8 @@ public void setup() { public void handlingWithConvention() { assertThat(activity.conventionButtonEventHandled).isFalse(); - activity.findViewById(R.id.conventionButton).dispatchTouchEvent(mockedEvent); + activity.findViewById(R.id.conventionButton).dispatchTouchEvent( + mockedEvent); assertThat(activity.conventionButtonEventHandled).isTrue(); } @@ -52,7 +53,8 @@ public void handlingWithConvention() { public void handlingWithSnakeCase() { assertThat(activity.snakeCaseButtonEventHandled).isFalse(); - activity.findViewById(R.id.snake_case_button).dispatchTouchEvent(mockedEvent); + activity.findViewById(R.id.snake_case_button).dispatchTouchEvent( + mockedEvent); assertThat(activity.snakeCaseButtonEventHandled).isTrue(); } @@ -61,7 +63,8 @@ public void handlingWithSnakeCase() { public void handlingWithExtendedConvention() { assertThat(activity.extendedConventionButtonEventHandled).isFalse(); - activity.findViewById(R.id.extendedConventionButton).dispatchTouchEvent(mockedEvent); + activity.findViewById(R.id.extendedConventionButton) + .dispatchTouchEvent(mockedEvent); assertThat(activity.extendedConventionButtonEventHandled).isTrue(); } @@ -70,14 +73,16 @@ public void handlingWithExtendedConvention() { public void handlingWithConfigurationOverConvention() { assertThat(activity.overridenConventionButtonEventHandled).isFalse(); - activity.findViewById(R.id.configurationOverConventionButton).dispatchTouchEvent(mockedEvent); + activity.findViewById(R.id.configurationOverConventionButton) + .dispatchTouchEvent(mockedEvent); assertThat(activity.overridenConventionButtonEventHandled).isTrue(); } @Test public void unannotatedButtonIsNotHandled() { - activity.findViewById(R.id.unboundButton).dispatchTouchEvent(mockedEvent); + activity.findViewById(R.id.unboundButton).dispatchTouchEvent( + mockedEvent); assertThat(activity.unboundButtonEventHandled).isFalse(); } @@ -86,7 +91,8 @@ public void unannotatedButtonIsNotHandled() { public void viewArgumentIsGiven() { assertThat(activity.viewArgument).isNull(); - activity.findViewById(R.id.buttonWithViewArgument).dispatchTouchEvent(mockedEvent); + activity.findViewById(R.id.buttonWithViewArgument).dispatchTouchEvent( + mockedEvent); assertThat(activity.viewArgument).hasId(R.id.buttonWithViewArgument); } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/TracedActivityTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/TracedActivityTest.java index b841ce072d..0595aec40a 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/TracedActivityTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/TracedActivityTest.java @@ -25,47 +25,46 @@ @RunWith(AndroidAnnotationsTestRunner.class) public class TracedActivityTest { - @Test - public void servicesAreInjected() throws IOException { - TracedActivity_ activity = new TracedActivity_(); - activity.onCreate(null); - - assertThat(activity.tracedMethodCalled).isFalse(); - activity.tracedMethod(null, null); - assertThat(activity.tracedMethodCalled).isTrue(); + @Test + public void servicesAreInjected() throws IOException { + TracedActivity_ activity = new TracedActivity_(); + activity.onCreate(null); - assertThat(activity.voidTracedMethodCalled).isFalse(); - activity.voidTracedMethod(null, null); - assertThat(activity.voidTracedMethodCalled).isTrue(); + assertThat(activity.tracedMethodCalled).isFalse(); + activity.tracedMethod(null, null); + assertThat(activity.tracedMethodCalled).isTrue(); - assertThat(activity.voidTracedMethodDebugCalled).isFalse(); - activity.voidTracedMethodDebug(); - assertThat(activity.voidTracedMethodDebugCalled).isTrue(); + assertThat(activity.voidTracedMethodCalled).isFalse(); + activity.voidTracedMethod(null, null); + assertThat(activity.voidTracedMethodCalled).isTrue(); - assertThat(activity.voidTracedMethodErrorCalled).isFalse(); - activity.voidTracedMethodError(); - assertThat(activity.voidTracedMethodErrorCalled).isTrue(); + assertThat(activity.voidTracedMethodDebugCalled).isFalse(); + activity.voidTracedMethodDebug(); + assertThat(activity.voidTracedMethodDebugCalled).isTrue(); - assertThat(activity.voidTracedMethodInfoCalled).isFalse(); - activity.voidTracedMethodInfo(); - assertThat(activity.voidTracedMethodInfoCalled).isTrue(); + assertThat(activity.voidTracedMethodErrorCalled).isFalse(); + activity.voidTracedMethodError(); + assertThat(activity.voidTracedMethodErrorCalled).isTrue(); - assertThat(activity.voidTracedMethodVerboseCalled).isFalse(); - activity.voidTracedMethodVerbose(); - assertThat(activity.voidTracedMethodVerboseCalled).isTrue(); + assertThat(activity.voidTracedMethodInfoCalled).isFalse(); + activity.voidTracedMethodInfo(); + assertThat(activity.voidTracedMethodInfoCalled).isTrue(); - assertThat(activity.voidTracedMethodWarnCalled).isFalse(); - activity.voidTracedMethodWarn(); - assertThat(activity.voidTracedMethodWarnCalled).isTrue(); + assertThat(activity.voidTracedMethodVerboseCalled).isFalse(); + activity.voidTracedMethodVerbose(); + assertThat(activity.voidTracedMethodVerboseCalled).isTrue(); - assertThat(activity.overloadedMethodInt).isFalse(); - activity.overloadedMethod(0); - assertThat(activity.overloadedMethodInt).isTrue(); + assertThat(activity.voidTracedMethodWarnCalled).isFalse(); + activity.voidTracedMethodWarn(); + assertThat(activity.voidTracedMethodWarnCalled).isTrue(); + + assertThat(activity.overloadedMethodInt).isFalse(); + activity.overloadedMethod(0); + assertThat(activity.overloadedMethodInt).isTrue(); + + assertThat(activity.overloadedMethodIntFLoat).isFalse(); + activity.overloadedMethod(0, 0f); + assertThat(activity.overloadedMethodIntFLoat).isTrue(); + } - assertThat(activity.overloadedMethodIntFLoat).isFalse(); - activity.overloadedMethod(0, 0f); - assertThat(activity.overloadedMethodIntFLoat).isTrue(); - } - - } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ViewAssert.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ViewAssert.java index 3ee69474bb..217a39a960 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ViewAssert.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ViewAssert.java @@ -36,7 +36,8 @@ public ViewAssert hasId(int id) { } failIfCustomMessageIsSet(); - throw failure(concat("view id is ", inBrackets(actual.getId()), ", should be ", inBrackets(id))); + throw failure(concat("view id is ", inBrackets(actual.getId()), + ", should be ", inBrackets(id))); } } diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ebean/CyclicSingletonTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ebean/CyclicSingletonTest.java index 3acd71aae4..8983e0f33a 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ebean/CyclicSingletonTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ebean/CyclicSingletonTest.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ package org.androidannotations.test15.ebean; import static org.fest.assertions.Assertions.assertThat; diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ebean/SomeSingletonTest.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ebean/SomeSingletonTest.java index c43f86486c..0f353a892f 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ebean/SomeSingletonTest.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/ebean/SomeSingletonTest.java @@ -15,11 +15,8 @@ */ package org.androidannotations.test15.ebean; -import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -import java.lang.reflect.Field; - +import android.content.Context; +import android.view.View; import org.androidannotations.api.view.HasViews; import org.androidannotations.api.view.OnViewChangedNotifier; import org.androidannotations.test15.AndroidAnnotationsTestRunner; @@ -28,8 +25,10 @@ import org.junit.Test; import org.junit.runner.RunWith; -import android.content.Context; -import android.view.View; +import java.lang.reflect.Field; + +import static org.fest.assertions.Assertions.assertThat; +import static org.mockito.Mockito.mock; @RunWith(AndroidAnnotationsTestRunner.class) public class SomeSingletonTest { @@ -47,18 +46,6 @@ public void getInstance_returns_same_instance() { assertThat(firstInstance).isSameAs(secondInstance); } - @Test - public void rebind_does_not_rebind() { - EmptyActivityWithoutLayout_ context = new EmptyActivityWithoutLayout_(); - SomeSingleton_ singleton = SomeSingleton_.getInstance_(context); - - Context initialContext = singleton.context; - - EmptyActivityWithoutLayout_ context2 = new EmptyActivityWithoutLayout_(); - singleton.rebind(context2); - assertThat(singleton.context).isSameAs(initialContext); - } - @Test public void views_are_not_injected() throws Exception { Context context = mock(Context.class); diff --git a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/rest/RequestTestBuilder.java b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/rest/RequestTestBuilder.java index e64ea99698..2b961b31f7 100644 --- a/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/rest/RequestTestBuilder.java +++ b/AndroidAnnotations/functional-test-1-5-tests/src/test/java/org/androidannotations/test15/rest/RequestTestBuilder.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2010-2013 eBusiness Information, Excilys Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed To in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ package org.androidannotations.test15.rest; import static org.mockito.Matchers.argThat; diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/AbstractActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/AbstractActivity.java index 3a4a462b76..c1de952cb8 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/AbstractActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/AbstractActivity.java @@ -15,12 +15,12 @@ */ package org.androidannotations.test15; -import android.app.Activity; -import android.widget.Button; - import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; +import android.app.Activity; +import android.widget.Button; + @EActivity(R.layout.views_injected) public abstract class AbstractActivity extends Activity { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ActivityWithServices.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ActivityWithServices.java index 1e5008b856..4821248303 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ActivityWithServices.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ActivityWithServices.java @@ -15,6 +15,9 @@ */ package org.androidannotations.test15; +import org.androidannotations.annotations.EActivity; +import org.androidannotations.annotations.SystemService; + import android.app.Activity; import android.app.ActivityManager; import android.app.AlarmManager; @@ -33,9 +36,7 @@ import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; -import org.androidannotations.annotations.EActivity; -import org.androidannotations.annotations.SystemService; - +@SuppressWarnings("deprecation") @EActivity public class ActivityWithServices extends Activity { @@ -75,7 +76,6 @@ public class ActivityWithServices extends Activity { @SystemService WifiManager wifiManager; - @SystemService InputMethodManager inputMethodManager; diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ApplicationInjectedActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ApplicationInjectedActivity.java index 7b4c001ef4..970397ae51 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ApplicationInjectedActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ApplicationInjectedActivity.java @@ -15,12 +15,12 @@ */ package org.androidannotations.test15; -import android.app.Activity; - import org.androidannotations.annotations.App; import org.androidannotations.annotations.EActivity; import org.androidannotations.test15.roboguice.SampleRoboApplication; +import android.app.Activity; + @EActivity public class ApplicationInjectedActivity extends Activity { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/AwaitingResultActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/AwaitingResultActivity.java index f80fd8a298..131035b5c7 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/AwaitingResultActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/AwaitingResultActivity.java @@ -15,12 +15,12 @@ */ package org.androidannotations.test15; -import android.app.Activity; -import android.content.Intent; - import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.OnActivityResult; +import android.app.Activity; +import android.content.Intent; + @EActivity(R.layout.views_injected) public class AwaitingResultActivity extends Activity { @@ -28,12 +28,12 @@ public class AwaitingResultActivity extends Activity { static final int SECOND_REQUEST = 22; static final int THIRD_REQUEST = 33; - boolean onResultCalled = false; - boolean onResultWithDataCalled = false; - boolean onActivityResultWithResultCodeAndDataCalled = false; - boolean onActivityResultWithDataAndResultCodeCalled = false; - boolean onResultWithIntResultCodeCalled = false; - boolean onResultWithIntegerResultCodeCalled = false; + boolean onResultCalled = false; + boolean onResultWithDataCalled = false; + boolean onActivityResultWithResultCodeAndDataCalled = false; + boolean onActivityResultWithDataAndResultCodeCalled = false; + boolean onResultWithIntResultCodeCalled = false; + boolean onResultWithIntegerResultCodeCalled = false; @OnActivityResult(FIRST_REQUEST) void onResult() { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/BackpressedActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/BackpressedActivity.java index d88383ff1d..fa0eedc5b3 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/BackpressedActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/BackpressedActivity.java @@ -15,10 +15,10 @@ */ package org.androidannotations.test15; -import android.app.Activity; - import org.androidannotations.annotations.EActivity; +import android.app.Activity; + @EActivity(R.layout.main) public class BackpressedActivity extends Activity { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CheckedChangeHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CheckedChangeHandledActivity.java index 6f7880586c..3a873e3b9a 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CheckedChangeHandledActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CheckedChangeHandledActivity.java @@ -49,7 +49,8 @@ public void buttonWithViewArgument() { } @CheckedChange({ R.id.button1, R.id.button2 }) - public void multipleButtonWithViewArgument(CompoundButton v, boolean hasFocus) { + public void multipleButtonWithViewArgument(CompoundButton v, + boolean hasFocus) { } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ClicksHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ClicksHandledActivity.java index b3d4e7b835..7357bae8d0 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ClicksHandledActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ClicksHandledActivity.java @@ -15,11 +15,11 @@ */ package org.androidannotations.test15; -import android.view.View; - import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EActivity; +import android.view.View; + @EActivity(R.layout.clickable_widgets) public class ClicksHandledActivity extends EventsHandledAbstractActivity { @@ -27,8 +27,8 @@ public class ClicksHandledActivity extends EventsHandledAbstractActivity { public void onClick(View v) { avoidStackOverflowEventHandled = true; } - - @Click(resName={"libResButton1", "libResButton2"}) + + @Click(resName = { "libResButton1", "libResButton2" }) public void libResButton() { libResButtonEventHandled = true; } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CustomTitleActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CustomTitleActivity.java index f719ed44b8..4b3b9bffbe 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CustomTitleActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/CustomTitleActivity.java @@ -15,10 +15,10 @@ */ package org.androidannotations.test15; -import android.app.Activity; - -import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.CustomTitle; +import org.androidannotations.annotations.EActivity; + +import android.app.Activity; @EActivity @CustomTitle(R.layout.component) diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EmptyActivityWithLayout.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EmptyActivityWithLayout.java index 4a5f534fa2..ad8b40911a 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EmptyActivityWithLayout.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EmptyActivityWithLayout.java @@ -15,10 +15,10 @@ */ package org.androidannotations.test15; -import android.app.Activity; - import org.androidannotations.annotations.EActivity; +import android.app.Activity; + @EActivity(R.layout.main) public class EmptyActivityWithLayout extends Activity { } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EmptyActivityWithoutLayout.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EmptyActivityWithoutLayout.java index 23d017c9ac..82220bcac1 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EmptyActivityWithoutLayout.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/EmptyActivityWithoutLayout.java @@ -15,10 +15,16 @@ */ package org.androidannotations.test15; -import android.app.Activity; - import org.androidannotations.annotations.EActivity; +import android.app.Activity; +import android.os.Bundle; + @EActivity public class EmptyActivityWithoutLayout extends Activity { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtendingActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtendingActivity.java index d7c5497617..2ff77daa38 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtendingActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtendingActivity.java @@ -19,5 +19,5 @@ @EActivity public class ExtendingActivity extends AbstractActivity { - + } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtraInjectedActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtraInjectedActivity.java index e741e00b19..2f1d97e692 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtraInjectedActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ExtraInjectedActivity.java @@ -17,12 +17,12 @@ import java.util.List; -import android.app.Activity; -import android.content.Intent; - import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Extra; +import android.app.Activity; +import android.content.Intent; + @EActivity public class ExtraInjectedActivity extends Activity { @@ -43,7 +43,7 @@ public class ExtraInjectedActivity extends Activity { @Extra String extraWithoutValue; - + @Extra ParcelableSerializableData parcelableSerializableData; @@ -55,7 +55,10 @@ protected void onNewIntent(Intent intent) { void intentWithExtras() { ExtraInjectedActivity_.intent(this).arrayExtra(null).start(); ExtraInjectedActivity_.intent(this).intExtra(42).get(); - ExtraInjectedActivity_.intent(this).stringExtra("hello").startForResult(42); - ExtraInjectedActivity_.intent(this).parcelableSerializableData(new ParcelableSerializableData()).get(); + ExtraInjectedActivity_.intent(this).stringExtra("hello") + .startForResult(42); + ExtraInjectedActivity_.intent(this) + .parcelableSerializableData(new ParcelableSerializableData()) + .get(); } } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FragmentArguments.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FragmentArguments.java index 31091768fc..ece3b131cf 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FragmentArguments.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FragmentArguments.java @@ -17,9 +17,6 @@ import java.util.ArrayList; -import android.app.Fragment; -import android.os.Bundle; - import org.androidannotations.annotations.AfterInject; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.FragmentArg; @@ -28,6 +25,9 @@ import org.androidannotations.test15.instancestate.MyParcelableBean; import org.androidannotations.test15.instancestate.MySerializableBean; +import android.app.Fragment; +import android.os.Bundle; + @EFragment public class FragmentArguments extends Fragment { @@ -171,14 +171,15 @@ public class FragmentArguments extends Fragment { @FragmentArg MyGenericParcelableBean[] myGenericParcelableBeanArray; - + @AfterInject - void afterInject(){ - + void afterInject() { + } static { - FragmentArguments_.builder().myBundle(null).myCharSequence(null).build(); + FragmentArguments_.builder().myBundle(null).myCharSequence(null) + .build(); } } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FromHtmlActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FromHtmlActivity.java index ac81e49373..4751f89e16 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FromHtmlActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/FromHtmlActivity.java @@ -15,13 +15,13 @@ */ package org.androidannotations.test15; -import android.app.Activity; -import android.widget.TextView; - import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.FromHtml; import org.androidannotations.annotations.ViewById; +import android.app.Activity; +import android.widget.TextView; + @EActivity(R.layout.views_injected) public class FromHtmlActivity extends Activity { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/HierarchyViewerActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/HierarchyViewerActivity.java index d06321cea8..cd307f8a65 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/HierarchyViewerActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/HierarchyViewerActivity.java @@ -21,5 +21,5 @@ @HierarchyViewerSupport @EActivity(R.layout.clickable_widgets) public class HierarchyViewerActivity extends AbstractActivity { - + } \ No newline at end of file diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ItemClicksHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ItemClicksHandledActivity.java index 62374c1148..2796bd5c17 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ItemClicksHandledActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ItemClicksHandledActivity.java @@ -15,14 +15,20 @@ */ package org.androidannotations.test15; +import org.androidannotations.annotations.AfterViews; +import org.androidannotations.annotations.EActivity; +import org.androidannotations.annotations.ItemClick; +import org.androidannotations.annotations.ItemLongClick; +import org.androidannotations.annotations.ItemSelect; +import org.androidannotations.annotations.ViewById; + +import java.util.ArrayList; +import java.util.List; + import android.app.Activity; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Spinner; -import org.androidannotations.annotations.*; - -import java.util.ArrayList; -import java.util.List; @EActivity(R.layout.item_clicks_handled) public class ItemClicksHandledActivity extends Activity { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/LongClicksHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/LongClicksHandledActivity.java index ec94167e71..14114d7486 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/LongClicksHandledActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/LongClicksHandledActivity.java @@ -15,14 +15,14 @@ */ package org.androidannotations.test15; -import android.view.View; - import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.LongClick; +import android.view.View; + @EActivity(R.layout.clickable_widgets) public class LongClicksHandledActivity extends EventsHandledAbstractActivity { - + @LongClick(R.id.stackOverflowProofButton) public void onLongClick(View v) { avoidStackOverflowEventHandled = true; @@ -32,35 +32,35 @@ public void onLongClick(View v) { public void conventionButton() { conventionButtonEventHandled = true; } - + @LongClick public void snakeCaseButton() { snakeCaseButtonEventHandled = true; - } - + } + @LongClick public void extendedConventionButtonLongClicked() { extendedConventionButtonEventHandled = true; } - + @LongClick(R.id.configurationOverConventionButton) public void overridenConventionButton() { overridenConventionButtonEventHandled = true; } - + public void unboundButton() { unboundButtonEventHandled = true; } - + @LongClick public void buttonWithViewArgument(View viewArgument) { this.viewArgument = viewArgument; } - @LongClick({R.id.button1, R.id.button2}) + @LongClick({ R.id.button1, R.id.button2 }) public void multipleButtonWithViewArgument(View viewArgument) { this.viewArgument = viewArgument; multipleButtonsEventHandled = true; } - + } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/NoTitleFullscreenActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/NoTitleFullscreenActivity.java index 21c28664ca..4ffcc5f240 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/NoTitleFullscreenActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/NoTitleFullscreenActivity.java @@ -15,12 +15,13 @@ */ package org.androidannotations.test15; -import android.app.Activity; - import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Fullscreen; import org.androidannotations.annotations.NoTitle; +import android.app.Activity; + +@SuppressWarnings("deprecation") @EActivity @NoTitle @Fullscreen diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ParcelableSerializableData.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ParcelableSerializableData.java index d5ae931ff1..1e098c5e7d 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ParcelableSerializableData.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ParcelableSerializableData.java @@ -23,7 +23,7 @@ public class ParcelableSerializableData implements Parcelable, Serializable { private static final long serialVersionUID = 920532042616086169L; - + @Override public int describeContents() { return 0; @@ -31,6 +31,6 @@ public int describeContents() { @Override public void writeToParcel(Parcel dest, int flags) { - + } } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/SSLConnection.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/SSLConnection.java index 5f41e7adeb..0b02036958 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/SSLConnection.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/SSLConnection.java @@ -15,13 +15,12 @@ */ package org.androidannotations.test15; +import org.androidannotations.annotations.EActivity; +import org.androidannotations.annotations.HttpsClient; import org.apache.http.client.HttpClient; import android.app.Activity; -import org.androidannotations.annotations.EActivity; -import org.androidannotations.annotations.HttpsClient; - @EActivity public class SSLConnection extends Activity { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/SeekBarChangeListenedActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/SeekBarChangeListenedActivity.java index 461f2a0d04..33993e3e1b 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/SeekBarChangeListenedActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/SeekBarChangeListenedActivity.java @@ -15,14 +15,14 @@ */ package org.androidannotations.test15; -import android.app.Activity; -import android.widget.SeekBar; - import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.SeekBarProgressChange; import org.androidannotations.annotations.SeekBarTouchStart; import org.androidannotations.annotations.SeekBarTouchStop; +import android.app.Activity; +import android.widget.SeekBar; + @EActivity(R.layout.seekbars) public class SeekBarChangeListenedActivity extends Activity { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TextWatchedActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TextWatchedActivity.java index 211675a12f..39c0c74c0d 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TextWatchedActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TextWatchedActivity.java @@ -15,70 +15,88 @@ */ package org.androidannotations.test15; -import android.app.Activity; -import android.text.Editable; -import android.widget.TextView; - import org.androidannotations.annotations.AfterTextChange; import org.androidannotations.annotations.BeforeTextChange; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.TextChange; +import android.app.Activity; +import android.text.Editable; +import android.widget.TextView; + @EActivity(R.layout.main) public class TextWatchedActivity extends Activity { @AfterTextChange(R.id.helloTextView) - void m1(Editable s) {} + void m1(Editable s) { + } - @AfterTextChange({R.id.helloTextView, R.id.watchedEditText}) - void m2(TextView tv, Editable s) {} + @AfterTextChange({ R.id.helloTextView, R.id.watchedEditText }) + void m2(TextView tv, Editable s) { + } @TextChange(R.id.watchedEditText) - void m3(TextView editText, CharSequence s, int before) {} + void m3(TextView editText, CharSequence s, int before) { + } @TextChange(R.id.watchedEditText) - void m4(TextView editText, CharSequence s, int before) {} + void m4(TextView editText, CharSequence s, int before) { + } @AfterTextChange(R.id.watchedEditText) - void m5(Editable s) {} + void m5(Editable s) { + } @AfterTextChange(R.id.watchedEditText) - void m6(TextView editText, Editable s) {} + void m6(TextView editText, Editable s) { + } @AfterTextChange(R.id.watchedEditText) - void m7(Editable editable, TextView editText) {} + void m7(Editable editable, TextView editText) { + } @TextChange(R.id.helloTextView) - void m8(CharSequence s, int before, int start, int count) {} + void m8(CharSequence s, int before, int start, int count) { + } @TextChange(R.id.helloTextView) - void m9(CharSequence s, int start, int before, int count) {} + void m9(CharSequence s, int start, int before, int count) { + } @TextChange(R.id.helloTextView) - void m10(CharSequence s, int count, int start, int before) {} + void m10(CharSequence s, int count, int start, int before) { + } @BeforeTextChange(R.id.helloTextView) - void m11(CharSequence s) {} + void m11(CharSequence s) { + } @BeforeTextChange(R.id.helloTextView) - void m12(CharSequence s, int count) {} + void m12(CharSequence s, int count) { + } @BeforeTextChange(R.id.helloTextView) - void m14(CharSequence s, int after, int start, int count) {} + void m14(CharSequence s, int after, int start, int count) { + } @BeforeTextChange(R.id.helloTextView) - void m15(TextView tv, CharSequence s, int start, int after, int count) {} + void m15(TextView tv, CharSequence s, int start, int after, int count) { + } @BeforeTextChange(R.id.helloTextView) - void m16(CharSequence s, int count, int start, int after) {} + void m16(CharSequence s, int count, int start, int after) { + } @BeforeTextChange - void helloTextViewBeforeTextChanged() {} + void helloTextViewBeforeTextChanged() { + } @AfterTextChange - void helloTextViewAfterTextChanged() {} + void helloTextViewAfterTextChanged() { + } @TextChange - void helloTextViewTextChanged() {} + void helloTextViewTextChanged() { + } } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java index 5b0e66237a..bd6f8ddf3f 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java @@ -29,11 +29,16 @@ import org.androidannotations.test15.instancestate.MySerializableBean; import android.app.Activity; -import android.os.Looper; +import android.os.Bundle; @EActivity public class ThreadActivity extends Activity { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + @UiThread void emptyUiMethod() { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TouchesHandledActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TouchesHandledActivity.java index dc164839fe..67921f89cb 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TouchesHandledActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TouchesHandledActivity.java @@ -15,12 +15,12 @@ */ package org.androidannotations.test15; -import android.view.MotionEvent; -import android.view.View; - import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Touch; +import android.view.MotionEvent; +import android.view.View; + @EActivity(R.layout.clickable_widgets) public class TouchesHandledActivity extends EventsHandledAbstractActivity { @@ -28,35 +28,36 @@ public class TouchesHandledActivity extends EventsHandledAbstractActivity { public void conventionButton(MotionEvent evt) { conventionButtonEventHandled = true; } - + @Touch public void snakeCaseButton(MotionEvent evt) { snakeCaseButtonEventHandled = true; - } - + } + @Touch public void extendedConventionButtonTouched(MotionEvent evt) { extendedConventionButtonEventHandled = true; } - + @Touch(R.id.configurationOverConventionButton) public void overridenConventionButton(MotionEvent evt) { overridenConventionButtonEventHandled = true; } - + public void unboundButton(MotionEvent evt) { unboundButtonEventHandled = true; } - + @Touch public void buttonWithViewArgument(MotionEvent evt, View viewArgument) { this.viewArgument = viewArgument; } - @Touch({R.id.button1, R.id.button2}) - public void multipleButtonWithViewArgument(MotionEvent evt, View viewArgument) { + @Touch({ R.id.button1, R.id.button2 }) + public void multipleButtonWithViewArgument(MotionEvent evt, + View viewArgument) { this.viewArgument = viewArgument; multipleButtonsEventHandled = true; } - + } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TracedActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TracedActivity.java index ddf51cafff..9c39b01305 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TracedActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TracedActivity.java @@ -20,10 +20,6 @@ import java.util.Map; import java.util.Set; -import android.app.Activity; -import android.database.sqlite.SQLiteDatabase; -import android.util.Log; - import org.androidannotations.annotations.Background; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Trace; @@ -31,6 +27,11 @@ import org.androidannotations.annotations.UiThread; import org.androidannotations.test15.instancestate.MySerializableBean; +import android.app.Activity; +import android.database.sqlite.SQLiteDatabase; +import android.os.Bundle; +import android.util.Log; + @EActivity public class TracedActivity extends Activity { @@ -44,14 +45,21 @@ public class TracedActivity extends Activity { public boolean overloadedMethodInt = false; public boolean overloadedMethodIntFLoat = false; + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + @Trace - Object tracedMethod(List>>> param1, Void param2) throws IOException { + Object tracedMethod(List>>> param1, Void param2) + throws IOException { tracedMethodCalled = true; return null; } @Trace - void voidTracedMethod(List>>> param1, Void param2) throws IOException { + void voidTracedMethod(List>>> param1, Void param2) + throws IOException { voidTracedMethodCalled = true; } @@ -116,8 +124,7 @@ void mixedTransactionalMethod(SQLiteDatabase db) { @Trace void tracedUsingArrayParameters(// - MySerializableBean[] array, - MySerializableBean[][] multiDimArray) { + MySerializableBean[] array, MySerializableBean[][] multiDimArray) { } } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TransactionalActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TransactionalActivity.java index 3389d19cbf..dafa8e8787 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TransactionalActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/TransactionalActivity.java @@ -17,17 +17,23 @@ import java.util.List; -import android.app.Activity; -import android.database.sqlite.SQLiteDatabase; - import org.androidannotations.annotations.Background; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.Transactional; import org.androidannotations.test15.instancestate.MySerializableBean; +import android.app.Activity; +import android.database.sqlite.SQLiteDatabase; +import android.os.Bundle; + @EActivity public class TransactionalActivity extends Activity { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + @Transactional void successfulTransaction(SQLiteDatabase db) { db.execSQL("Some SQL"); diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ViewsInjectedActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ViewsInjectedActivity.java index 764a5d5359..f5da957cad 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ViewsInjectedActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ViewsInjectedActivity.java @@ -15,15 +15,15 @@ */ package org.androidannotations.test15; +import org.androidannotations.annotations.AfterViews; +import org.androidannotations.annotations.EActivity; +import org.androidannotations.annotations.ViewById; + import android.app.Activity; import android.view.View; import android.widget.Button; import android.widget.TextView; -import org.androidannotations.annotations.AfterViews; -import org.androidannotations.annotations.EActivity; -import org.androidannotations.annotations.ViewById; - @EActivity(R.layout.views_injected) public class ViewsInjectedActivity extends Activity { diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/menu/OptionsMenuActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/menu/OptionsMenuActivity.java index 94bb0fd767..7bced20370 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/menu/OptionsMenuActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/menu/OptionsMenuActivity.java @@ -16,6 +16,7 @@ package org.androidannotations.test15.menu; import android.app.Activity; +import android.os.Bundle; import android.view.MenuItem; import org.androidannotations.annotations.EActivity; @@ -41,6 +42,11 @@ public class OptionsMenuActivity extends Activity { boolean multipleMenuItems; boolean menu_add; + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + @OptionsItem void menuRefreshSelected() { menuRefreshSelected = true; diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/sherlock/MySherlockActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/sherlock/MySherlockActivity.java index 8e88ea9c3d..f8ae927243 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/sherlock/MySherlockActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/sherlock/MySherlockActivity.java @@ -17,6 +17,7 @@ +import android.os.Bundle; import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.view.MenuItem; import org.androidannotations.annotations.EActivity; @@ -36,6 +37,11 @@ public class MySherlockActivity extends SherlockActivity { boolean multipleMenuItems; boolean menu_add; + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + @OptionsItem void menuRefreshSelected() { menuRefreshSelected = true;