# HG changeset patch # User Jaroslav Tulach # Date 1245506779 -7200 # Node ID 219810ff3c722f44096936c4ae97598a11e914f0 # Parent 3a98792518f09ee2106bdd5c5376236e6f452f1d Example of "compile time caches" and their possible usage in Component Injection area diff -r 3a98792518f0 -r 219810ff3c72 samples/componentinjection/anagram-modular/build.xml --- a/samples/componentinjection/anagram-modular/build.xml Tue May 26 09:01:40 2009 +0200 +++ b/samples/componentinjection/anagram-modular/build.xml Sat Jun 20 16:06:19 2009 +0200 @@ -1,5 +1,5 @@ - + @@ -11,6 +11,14 @@ + + + + + + + + @@ -96,6 +104,12 @@ + + + + + + diff -r 3a98792518f0 -r 219810ff3c72 samples/componentinjection/anagram-modular/nbproject/project.xml --- a/samples/componentinjection/anagram-modular/nbproject/project.xml Tue May 26 09:01:40 2009 +0200 +++ b/samples/componentinjection/anagram-modular/nbproject/project.xml Sat Jun 20 16:06:19 2009 +0200 @@ -21,6 +21,18 @@ UTF-8 + + java + src-api-compiletimecaches + UTF-8 + + + + java + src-word-annotated + UTF-8 + + java src-word-static @@ -123,6 +135,16 @@ folder + build/api-compiletimecaches/classes + build + + + folder + build/word-annotated/classes + build + + + folder build/word-static/classes build @@ -178,6 +200,14 @@ src-api + + src-api-compiletimecaches + + + + src-word-annotated + + src-word-static @@ -243,6 +273,18 @@ 1.5 + src-api-compiletimecaches + src-api:../../libs/dist/org-openide-filesystems.jar:../../libs/dist/org-openide-util.jar + build/api-compiletimecaches/classes + 1.5 + + + src-word-annotated + src-api:src-api-compiletimecaches:../../libs/dist/org-openide-filesystems.jar:../../libs/dist/org-openide-util.jar + build/word-annotated/classes + 1.5 + + src-word-static src-api build/word-static/classes diff -r 3a98792518f0 -r 219810ff3c72 samples/componentinjection/anagram-modular/src-api-compiletimecaches/org/apidesign/anagram/api/annotations/Words.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/componentinjection/anagram-modular/src-api-compiletimecaches/org/apidesign/anagram/api/annotations/Words.java Sat Jun 20 16:06:19 2009 +0200 @@ -0,0 +1,28 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.apidesign.anagram.api.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.apidesign.anagram.api.WordLibrary; + +/** + * Annotations to mark a static method returning array of Strings with. + * Such method is then treated as a provider of {@link WordLibrary}. + *

+ * Its retention is set to source one, as it is + * processed by associated WordsProcessor during compile time. + * + * @author Jaroslav Tulach + */ +// BEGIN: anagram.api.Words +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.METHOD) +public @interface Words { +} +// END: anagram.api.Words diff -r 3a98792518f0 -r 219810ff3c72 samples/componentinjection/anagram-modular/src-api-compiletimecaches/org/apidesign/anagram/impl/annotations/WordsImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/componentinjection/anagram-modular/src-api-compiletimecaches/org/apidesign/anagram/impl/annotations/WordsImpl.java Sat Jun 20 16:06:19 2009 +0200 @@ -0,0 +1,31 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.apidesign.anagram.impl.annotations; + +import java.util.Map; +import org.apidesign.anagram.api.WordLibrary; + +/** + * + * @author Jaroslav Tulach + */ +// BEGIN: anagram.api.WordsImpl +public class WordsImpl implements WordLibrary { + private Map map; + + private WordsImpl(Map m) { + this.map = m; + } + + public static WordsImpl create(Map attributes) { + return new WordsImpl(attributes); + } + + public String[] getWords() { + return (String[])map.get("words"); // NOI18N + } +} +// END: anagram.api.WordsImpl diff -r 3a98792518f0 -r 219810ff3c72 samples/componentinjection/anagram-modular/src-api-compiletimecaches/org/apidesign/anagram/impl/annotations/WordsProcessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/componentinjection/anagram-modular/src-api-compiletimecaches/org/apidesign/anagram/impl/annotations/WordsProcessor.java Sat Jun 20 16:06:19 2009 +0200 @@ -0,0 +1,79 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.apidesign.anagram.impl.annotations; + +import java.util.Set; +import javax.annotation.processing.Processor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.util.Elements; +import org.apidesign.anagram.api.annotations.Words; +import org.openide.filesystems.annotations.LayerBuilder.File; +import org.openide.filesystems.annotations.LayerGeneratingProcessor; +import org.openide.filesystems.annotations.LayerGenerationException; +import org.openide.util.lookup.ServiceProvider; + +/** Compile time caches example. Processor that is triggered + * during compilation when a @Words annotations is found. + * It generates some declarative registrations, so the annotated object + * is found later during runtime, but not instantiated before it is really + * needed. + * + * @author Jaroslav Tulach + */ +// BEGIN: anagram.api.WordsProcessor +@ServiceProvider(service=Processor.class) +@SupportedAnnotationTypes("org.apidesign.anagram.api.annotations.Words") +@SupportedSourceVersion(SourceVersion.RELEASE_5) +public class WordsProcessor extends LayerGeneratingProcessor { + + @Override + protected boolean handleProcess( + Set set, RoundEnvironment env + ) throws LayerGenerationException { + Elements elements = processingEnv.getElementUtils(); + + for (Element e : env.getElementsAnnotatedWith(Words.class)) { + Words w = e.getAnnotation(Words.class); + + TypeElement te = (TypeElement)e.getEnclosingElement(); + String teName = elements.getBinaryName(te).toString(); +// FINISH: anagram.api.WordsProcessor + +// BEGIN: anagram.api.WordsProcessorLayer + File f = layer(e).file( + "Services/" + teName.replace('.', '-') + ".instance" + ); + f.methodvalue( + "instanceCreate", + "org.apidesign.anagram.impl.annotations.WordsImpl", + "create" + ); + f.stringvalue( + "instanceClass", + "org.apidesign.anagram.impl.annotations.WordsImpl" + ); + f.stringvalue( + "instanceOf", + "org.apidesign.anagram.api.WordLibrary" + ); + f.methodvalue( + "words", + teName, + e.getSimpleName().toString() + ); + f.write(); +// END: anagram.api.WordsProcessorLayer + } + + return true; + } + +} diff -r 3a98792518f0 -r 219810ff3c72 samples/componentinjection/anagram-modular/src-app-lookup/org/apidesign/anagram/app/lookup/Main.java --- a/samples/componentinjection/anagram-modular/src-app-lookup/org/apidesign/anagram/app/lookup/Main.java Tue May 26 09:01:40 2009 +0200 +++ b/samples/componentinjection/anagram-modular/src-app-lookup/org/apidesign/anagram/app/lookup/Main.java Sat Jun 20 16:06:19 2009 +0200 @@ -6,6 +6,10 @@ private Main() { } public static void main(String[] args) throws Exception { + // BEGIN: anagram.words.annotation.layersetup + System.setProperty("org.openide.util.Lookup.paths", "Services"); + // END: anagram.words.annotation.layersetup + UI ui = new AnagramsWithLookup(); ui.display(); } diff -r 3a98792518f0 -r 219810ff3c72 samples/componentinjection/anagram-modular/src-word-annotated/org/apidesign/anagram/wordannotated/WordsFactory.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/componentinjection/anagram-modular/src-word-annotated/org/apidesign/anagram/wordannotated/WordsFactory.java Sat Jun 20 16:06:19 2009 +0200 @@ -0,0 +1,19 @@ + +package org.apidesign.anagram.wordannotated; + +import org.apidesign.anagram.api.annotations.Words; + +// BEGIN: anagram.words.annotation.usage +public class WordsFactory { + @Words + public static String[] myWords() { + return new String[] { + "microprocessor", + "navigation", + "optimization", + "parameter", + "patrick", + }; + } +} +// END: anagram.words.annotation.usage