You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by tv...@apache.org on 2009/05/06 00:32:09 UTC

svn commit: r771994 - in /incubator/pivot/trunk: ./ tutorials/src/pivot/tutorials/ tutorials/src/pivot/tutorials/drawing/ wtk/src/pivot/wtkx/

Author: tvolkert
Date: Tue May  5 22:32:08 2009
New Revision: 771994

URL: http://svn.apache.org/viewvc?rev=771994&view=rev
Log:
Completed BindProcessor v1

Modified:
    incubator/pivot/trunk/build.xml
    incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java
    incubator/pivot/trunk/tutorials/src/pivot/tutorials/drawing/RotateLine.java
    incubator/pivot/trunk/wtk/src/pivot/wtkx/Bind.java
    incubator/pivot/trunk/wtk/src/pivot/wtkx/BindException.java
    incubator/pivot/trunk/wtk/src/pivot/wtkx/BindProcessor.java
    incubator/pivot/trunk/wtk/src/pivot/wtkx/Load.java
    incubator/pivot/trunk/wtk/src/pivot/wtkx/WTKXSerializer.java

Modified: incubator/pivot/trunk/build.xml
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/build.xml?rev=771994&r1=771993&r2=771994&view=diff
==============================================================================
--- incubator/pivot/trunk/build.xml (original)
+++ incubator/pivot/trunk/build.xml Tue May  5 22:32:08 2009
@@ -540,7 +540,7 @@
             target="${compiler.target}"
             encoding="${compiler.encoding}"
             failonerror="true">
-            <compilerarg value="-Xlint"/>
+            <compilerarg line="-Xlint -processor pivot.wtkx.BindProcessor"/>
             <classpath>
                 <pathelement location="core/${folder.bin}"/>
                 <pathelement location="web/${folder.bin}"/>

Modified: incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java?rev=771994&r1=771993&r2=771994&view=diff
==============================================================================
--- incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java (original)
+++ incubator/pivot/trunk/tutorials/src/pivot/tutorials/Demo.java Tue May  5 22:32:08 2009
@@ -81,6 +81,8 @@
 import pivot.wtk.media.Image;
 import pivot.wtk.text.Document;
 import pivot.wtk.text.PlainTextSerializer;
+import pivot.wtkx.Bind;
+import pivot.wtkx.Load;
 import pivot.wtkx.WTKXSerializer;
 
 public class Demo implements Application {
@@ -97,7 +99,7 @@
                 WTKXSerializer wtkxSerializer = new WTKXSerializer();
 
                 try {
-                    component = (Component)wtkxSerializer.readObject(resourceName);
+                    component = (Component)wtkxSerializer.readObject(getClass().getResource(resourceName));
                     rollup.setContent(component);
                     initialize(wtkxSerializer);
                 } catch(SerializationException exception) {
@@ -139,6 +141,21 @@
 
     private Window window = null;
 
+    @Load("demo.wtkx") private Component content;
+    @Bind(resource="content") private Rollup buttonsRollup;
+    @Bind(resource="content") private Rollup listsRollup;
+    @Bind(resource="content") private Rollup textRollup;
+    @Bind(resource="content") private Rollup calendarsRollup;
+    @Bind(resource="content") private Rollup navigationRollup;
+    @Bind(resource="content") private Rollup splittersRollup;
+    @Bind(resource="content") private Rollup menusRollup;
+    @Bind(resource="content") private Rollup metersRollup;
+    @Bind(resource="content") private Rollup spinnersRollup;
+    @Bind(resource="content") private Rollup tablesRollup;
+    @Bind(resource="content") private Rollup treesRollup;
+    @Bind(resource="content") private Rollup dragDropRollup;
+    @Bind(resource="content") private Rollup alertsRollup;
+
     public static void main(String[] args) {
         DesktopApplicationContext.main(Demo.class, args);
     }
@@ -153,22 +170,17 @@
         terraTheme.loadScheme(schemeLocation);
         */
 
-        WTKXSerializer wtkxSerializer = new WTKXSerializer();
-        Component content = (Component)wtkxSerializer.readObject("pivot/tutorials/demo.wtkx");
-
-        final Rollup buttonsRollup = (Rollup)wtkxSerializer.getObjectByName("buttonsRollup");
-        buttonsRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/buttons.wtkx") {
+        buttonsRollup.getRollupStateListeners().add(new RollupStateHandler("buttons.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
                 // No-op
             }
         });
 
-        Rollup listsRollup = (Rollup)wtkxSerializer.getObjectByName("listsRollup");
-        listsRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/lists.wtkx") {
+        listsRollup.getRollupStateListeners().add(new RollupStateHandler("lists.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
-                ListView editableListView = (ListView)wtkxSerializer.getObjectByName("editableListView");
+                ListView editableListView = wtkxSerializer.getObjectByName("editableListView");
                 List<ListItem> listData = (List<ListItem>)editableListView.getListData();
                 listData.setComparator(new Comparator<ListItem>() {
                     public int compare(ListItem listItem1, ListItem listItem2) {
@@ -178,19 +190,18 @@
                     }
                 });
 
-                ListView iconListView = (ListView)wtkxSerializer.getObjectByName("iconListView");
+                ListView iconListView = wtkxSerializer.getObjectByName("iconListView");
                 iconListView.setItemDisabled(3, true);
                 iconListView.setItemDisabled(4, true);
 
-                ListView checkedListView = (ListView)wtkxSerializer.getObjectByName("checkedListView");
+                ListView checkedListView = wtkxSerializer.getObjectByName("checkedListView");
                 checkedListView.setItemChecked(0, true);
                 checkedListView.setItemChecked(2, true);
                 checkedListView.setItemChecked(3, true);
             }
         });
 
-        Rollup textRollup = (Rollup)wtkxSerializer.getObjectByName("textRollup");
-        textRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/text.wtkx") {
+        textRollup.getRollupStateListeners().add(new RollupStateHandler("text.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
                 PlainTextSerializer plainTextSerializer = new PlainTextSerializer("UTF-8");
@@ -203,7 +214,7 @@
                     System.out.println(exception);
                 }
 
-                TextArea textArea = (TextArea)wtkxSerializer.getObjectByName("textArea");
+                TextArea textArea = wtkxSerializer.getObjectByName("textArea");
                 textArea.setDocument(document);
 
                 final WatermarkDecorator watermarkDecorator = new WatermarkDecorator("Preview");
@@ -225,24 +236,21 @@
             }
         });
 
-        Rollup calendarsRollup = (Rollup)wtkxSerializer.getObjectByName("calendarsRollup");
-        calendarsRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/calendars.wtkx") {
+        calendarsRollup.getRollupStateListeners().add(new RollupStateHandler("calendars.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
                 // No-op
             }
         });
 
-        Rollup navigationRollup = (Rollup)wtkxSerializer.getObjectByName("navigationRollup");
-        navigationRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/navigation.wtkx") {
+        navigationRollup.getRollupStateListeners().add(new RollupStateHandler("navigation.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
                 // No-op
             }
         });
 
-        Rollup splittersRollup = (Rollup)wtkxSerializer.getObjectByName("splittersRollup");
-        splittersRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/splitters.wtkx") {
+        splittersRollup.getRollupStateListeners().add(new RollupStateHandler("splitters.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
                 // No-op
@@ -277,11 +285,10 @@
             }
         };
 
-        Rollup menusRollup = (Rollup)wtkxSerializer.getObjectByName("menusRollup");
-        menusRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/menus.wtkx") {
+        menusRollup.getRollupStateListeners().add(new RollupStateHandler("menus.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) throws SerializationException, IOException {
-                menuImageView = (ImageView)wtkxSerializer.getObjectByName("imageView");
+                menuImageView = wtkxSerializer.getObjectByName("imageView");
                 menuImageView.getComponentMouseButtonListeners().add(new ComponentMouseButtonListener.Adapter() {
                     @Override
                     public boolean mouseDown(Component component, Mouse.Button button, int x, int y) {
@@ -295,7 +302,7 @@
                     }
                 });
 
-                Menu.Item helpAboutMenuItem = (Menu.Item)wtkxSerializer.getObjectByName("menubar.helpAboutMenuItem");
+                Menu.Item helpAboutMenuItem = wtkxSerializer.getObjectByName("menubar.helpAboutMenuItem");
                 helpAboutMenuItem.getButtonPressListeners().add(new ButtonPressListener() {
                     public void buttonPressed(Button button) {
                         String about = "Origin: " + ApplicationContext.getOrigin()
@@ -309,22 +316,20 @@
             }
         });
 
-        Rollup metersRollup = (Rollup)wtkxSerializer.getObjectByName("metersRollup");
-        metersRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/meters.wtkx") {
+        metersRollup.getRollupStateListeners().add(new RollupStateHandler("meters.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
                 // No-op
             }
         });
 
-        Rollup spinnersRollup = (Rollup)wtkxSerializer.getObjectByName("spinnersRollup");
-        spinnersRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/spinners.wtkx") {
+        spinnersRollup.getRollupStateListeners().add(new RollupStateHandler("spinners.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
-                Spinner numericSpinner = (Spinner)wtkxSerializer.getObjectByName("numericSpinner");
+                Spinner numericSpinner = wtkxSerializer.getObjectByName("numericSpinner");
                 initializeNumericSpinner(numericSpinner);
 
-                Spinner dateSpinner = (Spinner)wtkxSerializer.getObjectByName("dateSpinner");
+                Spinner dateSpinner = wtkxSerializer.getObjectByName("dateSpinner");
                 initializeDateSpinner(dateSpinner);
 
                 SliderValueListener sliderValueListener = new SliderValueListener() {
@@ -335,51 +340,48 @@
                     }
                 };
 
-                redSlider = (Slider)wtkxSerializer.getObjectByName("redSlider");
+                redSlider = wtkxSerializer.getObjectByName("redSlider");
                 redSlider.getSliderValueListeners().add(sliderValueListener);
 
-                greenSlider = (Slider)wtkxSerializer.getObjectByName("greenSlider");
+                greenSlider = wtkxSerializer.getObjectByName("greenSlider");
                 greenSlider.getSliderValueListeners().add(sliderValueListener);
 
-                blueSlider = (Slider)wtkxSerializer.getObjectByName("blueSlider");
+                blueSlider = wtkxSerializer.getObjectByName("blueSlider");
                 blueSlider.getSliderValueListeners().add(sliderValueListener);
 
                 Color color = new Color(redSlider.getValue(), greenSlider.getValue(),
                     blueSlider.getValue());
-                colorBorder = (Border)wtkxSerializer.getObjectByName("colorBorder");
+                colorBorder = wtkxSerializer.getObjectByName("colorBorder");
                 colorBorder.getStyles().put("backgroundColor", color);
             }
         });
 
-        Rollup tablesRollup = (Rollup)wtkxSerializer.getObjectByName("tablesRollup");
-        tablesRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/tables.wtkx") {
+        tablesRollup.getRollupStateListeners().add(new RollupStateHandler("tables.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
-                sortableTableView = (TableView)wtkxSerializer.getObjectByName("sortableTableView");
-                sortableTableViewHeader = (TableViewHeader)wtkxSerializer.getObjectByName("sortableTableViewHeader");
-                customTableView = (TableView)wtkxSerializer.getObjectByName("customTableView");
+                sortableTableView = wtkxSerializer.getObjectByName("sortableTableView");
+                sortableTableViewHeader = wtkxSerializer.getObjectByName("sortableTableViewHeader");
+                customTableView = wtkxSerializer.getObjectByName("customTableView");
                 initializeTableViews();
 
                 /*
-                ScrollPane sortableScrollPane = (ScrollPane)wtkxSerializer.getObjectByName("sortableScrollPane");
+                ScrollPane sortableScrollPane = wtkxSerializer.getObjectByName("sortableScrollPane");
                 sortableScrollPane.getStyles().put("verticalIncrement",
                     sortableTableView.getStyles().get("rowHeight"));
                 */
             }
         });
 
-        Rollup treesRollup = (Rollup)wtkxSerializer.getObjectByName("treesRollup");
-        treesRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/trees.wtkx") {
+        treesRollup.getRollupStateListeners().add(new RollupStateHandler("trees.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
-                TreeView editableTreeView = (TreeView)wtkxSerializer.getObjectByName("editableTreeView");
+                TreeView editableTreeView = wtkxSerializer.getObjectByName("editableTreeView");
                 TreeBranch treeData = (TreeBranch)editableTreeView.getTreeData();
                 treeData.setComparator(new TreeNodeComparator());
             }
         });
 
-        Rollup dragDropRollup = (Rollup)wtkxSerializer.getObjectByName("dragDropRollup");
-        dragDropRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/dragdrop.wtkx") {
+        dragDropRollup.getRollupStateListeners().add(new RollupStateHandler("dragdrop.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
                 DragSource imageDragSource = new DragSource() {
@@ -484,26 +486,25 @@
                     }
                 };
 
-                ImageView imageView1 = (ImageView)wtkxSerializer.getObjectByName("imageView1");
+                ImageView imageView1 = wtkxSerializer.getObjectByName("imageView1");
                 imageView1.setDragSource(imageDragSource);
                 imageView1.setDropTarget(imageDropTarget);
 
-                ImageView imageView2 = (ImageView)wtkxSerializer.getObjectByName("imageView2");
+                ImageView imageView2 = wtkxSerializer.getObjectByName("imageView2");
                 imageView2.setDragSource(imageDragSource);
                 imageView2.setDropTarget(imageDropTarget);
 
-                ImageView imageView3 = (ImageView)wtkxSerializer.getObjectByName("imageView3");
+                ImageView imageView3 = wtkxSerializer.getObjectByName("imageView3");
                 imageView3.setDragSource(imageDragSource);
                 imageView3.setDropTarget(imageDropTarget);
             }
         });
 
-        Rollup alertsRollup = (Rollup)wtkxSerializer.getObjectByName("alertsRollup");
-        alertsRollup.getRollupStateListeners().add(new RollupStateHandler("pivot/tutorials/alerts.wtkx") {
+        alertsRollup.getRollupStateListeners().add(new RollupStateHandler("alerts.wtkx") {
             @Override
             protected void initialize(WTKXSerializer wtkxSerializer) {
-                alertButton = (PushButton)wtkxSerializer.getObjectByName("alertButton");
-                promptButton = (PushButton)wtkxSerializer.getObjectByName("promptButton");
+                alertButton = wtkxSerializer.getObjectByName("alertButton");
+                promptButton = wtkxSerializer.getObjectByName("promptButton");
                 initializeAlertButtons();
             }
         });

Modified: incubator/pivot/trunk/tutorials/src/pivot/tutorials/drawing/RotateLine.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/tutorials/src/pivot/tutorials/drawing/RotateLine.java?rev=771994&r1=771993&r2=771994&view=diff
==============================================================================
--- incubator/pivot/trunk/tutorials/src/pivot/tutorials/drawing/RotateLine.java (original)
+++ incubator/pivot/trunk/tutorials/src/pivot/tutorials/drawing/RotateLine.java Tue May  5 22:32:08 2009
@@ -27,21 +27,15 @@
 import pivot.wtk.media.drawing.Shape;
 import pivot.wtkx.Bind;
 import pivot.wtkx.Load;
-import pivot.wtkx.WTKXSerializer;
 
 public class RotateLine implements Application {
-    @Load(name="rotate_line.wtkd")
-    private Drawing drawing = null;
-
-    @Bind(resource="drawing", id="rotation")
-    private Shape.Rotate rotation = null;
+    @Load("rotate_line.wtkd") private Drawing drawing;
+    @Bind(resource="drawing") private Shape.Rotate rotation;
 
     private Window window = null;
 
     public void startup(Display display, Dictionary<String, String> properties)
         throws Exception{
-        WTKXSerializer.bind(this);
-
         ApplicationContext.scheduleRecurringCallback(new Runnable() {
             public void run() {
                 int angle = (int)rotation.getAngle();

Modified: incubator/pivot/trunk/wtk/src/pivot/wtkx/Bind.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtkx/Bind.java?rev=771994&r1=771993&r2=771994&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtkx/Bind.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtkx/Bind.java Tue May  5 22:32:08 2009
@@ -23,9 +23,9 @@
  *
  * @author gbrown
  */
-@Retention(RetentionPolicy.RUNTIME)
+@Retention(RetentionPolicy.SOURCE)
 @Target(ElementType.FIELD)
 public @interface Bind {
     public String resource();
-    public String id();
+    public String id() default "\0";
 }

Modified: incubator/pivot/trunk/wtk/src/pivot/wtkx/BindException.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtkx/BindException.java?rev=771994&r1=771993&r2=771994&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtkx/BindException.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtkx/BindException.java Tue May  5 22:32:08 2009
@@ -21,7 +21,7 @@
  *
  * @author gbrown
  */
-public class BindException extends Exception {
+public class BindException extends RuntimeException {
     private static final long serialVersionUID = 0;
 
     public BindException() {

Modified: incubator/pivot/trunk/wtk/src/pivot/wtkx/BindProcessor.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtkx/BindProcessor.java?rev=771994&r1=771993&r2=771994&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtkx/BindProcessor.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtkx/BindProcessor.java Tue May  5 22:32:08 2009
@@ -29,29 +29,53 @@
 import javax.lang.model.element.TypeElement;
 import javax.tools.Diagnostic;
 
+import pivot.collections.ArrayList;
 import pivot.collections.ArrayStack;
 import pivot.collections.HashMap;
 
-//import com.sun.tools.javac.processing.JavacProcessingEnvironment;
-//import com.sun.tools.javac.code.Flags;
-//import com.sun.tools.javac.code.Symbol;
+import com.sun.tools.javac.processing.JavacProcessingEnvironment;
+import com.sun.tools.javac.parser.Parser;
+import com.sun.tools.javac.parser.Scanner;
 import com.sun.tools.javac.tree.JCTree;
-//import com.sun.tools.javac.tree.TreeMaker;
 import com.sun.tools.javac.tree.TreeTranslator;
-//import com.sun.tools.javac.util.Context;
-//import com.sun.tools.javac.util.List;
-//import com.sun.tools.javac.util.Name;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.List;
 import com.sun.source.util.Trees;
 
+/**
+ * Annotation processor that injects instance initializers into classes that
+ * use the <tt>@Load</tt> and <tt>@Bind</tt> annotations to perform the loading
+ * and binding.
+ *
+ * @author tvolkert
+ */
 @SupportedAnnotationTypes("pivot.wtkx.*")
 @SupportedSourceVersion(SourceVersion.RELEASE_6)
 public class BindProcessor extends AbstractProcessor {
+    /**
+     *
+     * @author tvolkert
+     */
     private static class BindScope {
-        public HashMap<String, Load> loadAnnotations = null;
-        public HashMap<String, Bind> bindAnnotations = null;
+        public static class LoadGroup {
+            public JCTree.JCVariableDecl loadField = null;
+            public ArrayList<JCTree.JCVariableDecl> bindFields = null;
+
+            public LoadGroup(JCTree.JCVariableDecl loadField) {
+                this.loadField = loadField;
+            }
+        }
+
+        // Maps load field names to their corresponding load group
+        public HashMap<String, LoadGroup> loadGroups = null;
     }
 
-    private class BindTranslator extends TreeTranslator {
+    /**
+     * This actually does the work of instance initializer injection.
+     *
+     * @author tvolkert
+     */
+    private class BindInjector extends TreeTranslator {
         private ArrayStack<BindScope> bindScopeStack = new ArrayStack<BindScope>();
 
         @Override
@@ -62,32 +86,77 @@
             super.visitClassDef(tree);
             bindScopeStack.pop();
 
-            if (bindScope.loadAnnotations != null) {
-                for (String fieldName : bindScope.loadAnnotations) {
-                    Load loadAnnotation = bindScope.loadAnnotations.get(fieldName);
+            if (bindScope.loadGroups != null) {
+                StringBuilder sourceCode = new StringBuilder("{");
+
+                sourceCode.append("pivot.wtkx.WTKXSerializer wtkxSerializer;");
+                sourceCode.append("Object resource;");
+                sourceCode.append("Object value;");
+
+                for (String loadFieldName : bindScope.loadGroups) {
+                    BindScope.LoadGroup loadGroup = bindScope.loadGroups.get(loadFieldName);
+                    JCTree.JCVariableDecl loadField = loadGroup.loadField;
+                    Element loadElement = loadField.sym;
+                    Load loadAnnotation = loadElement.getAnnotation(Load.class);
 
                     if (DEBUG) {
                         processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE,
-                            String.format("Processing load(%s, %s#%s)", loadAnnotation.name(),
-                            tree.name.toString(), fieldName));
+                            String.format("Processing load(%s, %s#%s)", loadAnnotation.value(),
+                            tree.name.toString(), loadFieldName));
                     }
 
-                    // TODO
+                    // Load the WTKX resource
+                    sourceCode.append("wtkxSerializer = new pivot.wtkx.WTKXSerializer();");
+                    sourceCode.append(String.format("java.net.URL location = getClass().getResource(\"%s\");", loadAnnotation.value()));
+                    sourceCode.append("try {");
+                    sourceCode.append("resource = wtkxSerializer.readObject(location);");
+                    sourceCode.append("} catch (Exception ex) {");
+                    sourceCode.append("throw new pivot.wtkx.BindException(ex);");
+                    sourceCode.append("}");
+
+                    // Bind the resource to the field
+                    sourceCode.append(String.format("%s = (%s)resource;", loadFieldName, loadField.vartype.toString()));
+
+                    // Bind the resource lookups to their corresponding fields
+                    if (loadGroup.bindFields != null) {
+                        for (JCTree.JCVariableDecl bindField : loadGroup.bindFields) {
+                            String bindFieldName = bindField.name.toString();
+                            Element bindElement = bindField.sym;
+                            Bind bindAnnotation = bindElement.getAnnotation(Bind.class);
+
+                            String bindID = bindAnnotation.id();
+                            if ("\0".equals(bindID)) {
+                                // The bind ID defaults to the field name
+                                bindID = bindFieldName;
+                            }
+
+                            if (DEBUG) {
+                                processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE,
+                                    String.format("Processing bind(%s.%s, %s#%s)", bindAnnotation.resource(),
+                                    bindID, tree.name.toString(), bindFieldName));
+                            }
+
+                            sourceCode.append(String.format("value = wtkxSerializer.getObjectByName(\"%s\");", bindID));
+                            sourceCode.append("if (value == null) {");
+                            sourceCode.append(String.format("throw new pivot.wtkx.BindException(\"Element not found: %s.\");", bindID));
+                            sourceCode.append("}");
+                            sourceCode.append(String.format("%s = (%s)value;", bindFieldName, bindField.vartype.toString()));
+                        }
+                    }
                 }
-            }
 
-            if (bindScope.bindAnnotations != null) {
-                for (String fieldName : bindScope.bindAnnotations) {
-                    Bind bindAnnotation = bindScope.bindAnnotations.get(fieldName);
+                sourceCode.append("}");
 
-                    if (DEBUG) {
-                        processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE,
-                            String.format("Processing bind(%s.%s, %s#%s)", bindAnnotation.resource(),
-                                bindAnnotation.id(), tree.name.toString(), fieldName));
-                    }
+                // Parse our source code into a AST block
+                Scanner.Factory scannerFactory = Scanner.Factory.instance(context);
+                Parser.Factory parserFactory = Parser.Factory.instance(context);
+
+                Scanner scanner = scannerFactory.newScanner(sourceCode.toString());
+                Parser parser = parserFactory.newParser(scanner, false, false);
+                JCTree.JCBlock block = parser.block();
 
-                    // TODO
-                }
+                // Add the AST block (instance initializer) to the class
+                tree.defs = tree.defs.prepend(block);
             }
         }
 
@@ -95,89 +164,69 @@
         public void visitVarDef(JCTree.JCVariableDecl tree) {
             super.visitVarDef(tree);
 
-            Element element = tree.sym;
+            Load loadAnnotation = null;
+            Bind bindAnnotation = null;
 
+            Element element = tree.sym;
             if (element != null) {
-                String fieldName = tree.name.toString();
-
-                Load loadAnnotation = element.getAnnotation(Load.class);
-                Bind bindAnnotation = element.getAnnotation(Bind.class);
+                loadAnnotation = element.getAnnotation(Load.class);
+                bindAnnotation = element.getAnnotation(Bind.class);
+            } else if (tree.mods != null
+                && tree.mods.annotations != null) {
+                List<JCTree.JCAnnotation> annotations = tree.mods.annotations;
+                // TODO
+            }
 
-                if (loadAnnotation != null
-                    && bindAnnotation != null) {
-                    processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR,
-                        "Cannot combine " + Load.class.getName()
-                        + " and " + Bind.class.getName() + " annotations.", element);
-                } else if (loadAnnotation != null) {
-                    BindScope bindScope = bindScopeStack.peek();
+            if (loadAnnotation != null
+                && bindAnnotation != null) {
+                processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR,
+                    "Cannot combine " + Load.class.getName()
+                    + " and " + Bind.class.getName() + " annotations.", element);
+            } else if (loadAnnotation != null) {
+                BindScope bindScope = bindScopeStack.peek();
+                String fieldName = tree.name.toString();
 
-                    if (bindScope.loadAnnotations == null) {
-                        bindScope.loadAnnotations = new HashMap<String, Load>();
-                    }
+                if (bindScope.loadGroups == null) {
+                    bindScope.loadGroups = new HashMap<String, BindScope.LoadGroup>();
+                }
 
-                    bindScope.loadAnnotations.put(fieldName, loadAnnotation);
-                    loadTally++;
-                } else if (bindAnnotation != null) {
-                    BindScope bindScope = bindScopeStack.peek();
+                bindScope.loadGroups.put(fieldName, new BindScope.LoadGroup(tree));
+                loadTally++;
+            } else if (bindAnnotation != null) {
+                BindScope bindScope = bindScopeStack.peek();
+
+                if (bindScope.loadGroups != null
+                    && bindScope.loadGroups.containsKey(bindAnnotation.resource())) {
+                    BindScope.LoadGroup loadGroup = bindScope.loadGroups.get(bindAnnotation.resource());
 
-                    if (bindScope.bindAnnotations == null) {
-                        bindScope.bindAnnotations = new HashMap<String, Bind>();
+                    if (loadGroup.bindFields == null) {
+                        loadGroup.bindFields = new ArrayList<JCTree.JCVariableDecl>();
                     }
 
-                    bindScope.bindAnnotations.put(fieldName, bindAnnotation);
+                    loadGroup.bindFields.add(tree);
                     bindTally++;
+                } else {
+                    processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR,
+                        "Resource not found: " + bindAnnotation.resource(), element);
                 }
             }
         }
-
-        // TODO remove.  This is reference code
-        /*
-        @Override
-        public void visitAssert(JCTree.JCAssert tree) {
-            super.visitAssert(tree);
-            JCTree.JCStatement newNode = makeIfThrowException(tree);
-            result = newNode;
-            //tally++;
-        }
-
-        private JCTree.JCStatement makeIfThrowException(JCTree.JCAssert node) {
-            // make: if (!(condition) throw new AssertionError(detail);
-            List<JCTree.JCExpression> args = (node.getDetail() == null
-                ? List.<JCTree.JCExpression> nil()
-                : List.of(node.detail));
-            JCTree.JCExpression expr = treeMaker.NewClass(null,
-                                              null,
-                                              treeMaker.Ident(names.fromString("AssertionError")),
-                                              args,
-                                              null);
-
-            return treeMaker.If(treeMaker.Unary(JCTree.NOT, node.cond),
-                           treeMaker.Throw(expr),
-                           null);
-
-        }
-        */
     }
 
-    private int loadTally;
-    private int bindTally;
+    private int loadTally = 0;
+    private int bindTally = 0;
 
     private Trees trees;
-    //private TreeMaker treeMaker;
-    //private Name.Table names;
+    private Context context;
 
-    private static final boolean DEBUG = true;
+    private static final boolean DEBUG = false;
 
     @Override
-    public synchronized void init(ProcessingEnvironment env) {
-        super.init(env);
+    public synchronized void init(ProcessingEnvironment processingEnvironment) {
+        super.init(processingEnvironment);
 
-        trees = Trees.instance(env);
-        //Context context = ((JavacProcessingEnvironment)env).getContext();
-        //treeMaker = TreeMaker.instance(context);
-        //names = Name.Table.instance(context);
-        loadTally = 0;
-        bindTally = 0;
+        trees = Trees.instance(processingEnvironment);
+        context = ((JavacProcessingEnvironment)processingEnvironment).getContext();
     }
 
     @Override
@@ -187,13 +236,13 @@
         if (!roundEnvironment.processingOver()) {
             claimAnnotations = true;
 
-            BindTranslator bindTranslator = new BindTranslator();
+            BindInjector bindInjector = new BindInjector();
 
             for (Element rootElement : roundEnvironment.getRootElements()) {
                 if (rootElement.getKind() == ElementKind.CLASS) {
-                    // Visit each Class tree with our bindTranslator visitor
+                    // Visit each Class tree with our bindInjector visitor
                     JCTree tree = (JCTree)trees.getTree(rootElement);
-                    tree.accept(bindTranslator);
+                    tree.accept(bindInjector);
                 }
             }
         } else {

Modified: incubator/pivot/trunk/wtk/src/pivot/wtkx/Load.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtkx/Load.java?rev=771994&r1=771993&r2=771994&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtkx/Load.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtkx/Load.java Tue May  5 22:32:08 2009
@@ -23,8 +23,8 @@
  *
  * @author gbrown
  */
-@Retention(RetentionPolicy.RUNTIME)
+@Retention(RetentionPolicy.SOURCE)
 @Target(ElementType.FIELD)
 public @interface Load {
-    public String name();
+    public String value();
 }

Modified: incubator/pivot/trunk/wtk/src/pivot/wtkx/WTKXSerializer.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtkx/WTKXSerializer.java?rev=771994&r1=771993&r2=771994&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtkx/WTKXSerializer.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtkx/WTKXSerializer.java Tue May  5 22:32:08 2009
@@ -928,96 +928,4 @@
 
         return method;
     }
-
-    /**
-     * Applies WTKX binding annotations to an object.
-     *
-     * @param object
-     */
-    public static void bind(Object object)
-        throws IOException, BindException  {
-        assert(object != null);
-
-        // Maps resource field name to the serializer that loaded the resource
-        HashMap<String, WTKXSerializer> wtkxSerializers = new HashMap<String, WTKXSerializer>();
-
-        // Walk field lists and resolve WTKX annotations
-        Class<?> type = object.getClass();
-        Field[] fields = type.getDeclaredFields();
-        for (int i = 0; i < fields.length; i++) {
-            Field field = fields[i];
-            Load loadAnnotation = field.getAnnotation(Load.class);
-
-            if (loadAnnotation != null) {
-                // Create a serializer for the resource
-                String fieldName = field.getName();
-                assert(!wtkxSerializers.containsKey(fieldName));
-
-                WTKXSerializer wtkxSerializer = new WTKXSerializer();
-                wtkxSerializers.put(fieldName, wtkxSerializer);
-
-                // Load the resource
-                URL location = type.getResource(loadAnnotation.name());
-                Object resource;
-                try {
-                    resource = wtkxSerializer.readObject(location);
-                } catch(SerializationException exception) {
-                    throw new BindException(exception);
-                }
-
-                // Set the resource into the field
-                if (!field.isAccessible()) {
-                    try {
-                        field.setAccessible(true);
-                    } catch (Exception ex) {
-                        // No-op; the callers might have used public fields, in
-                        // which case we don't need to make them accessible
-                    }
-                }
-
-                try {
-                    field.set(object, resource);
-                } catch(IllegalAccessException exception) {
-                    throw new BindException(exception);
-                }
-            }
-
-            Bind bindAnnotation = field.getAnnotation(Bind.class);
-            if (bindAnnotation != null) {
-                if (loadAnnotation != null) {
-                    throw new BindException("Cannot combine " + Load.class.getName()
-                        + " and " + Bind.class.getName() + " annotations.");
-                }
-
-                // Bind to the value loaded by the field's serializer
-                String fieldName = bindAnnotation.resource();
-                WTKXSerializer wtkxSerializer = wtkxSerializers.get(fieldName);
-                if (wtkxSerializer == null) {
-                    throw new BindException("\"" + fieldName + "\" is not a valid resource name.");
-                }
-
-                String id = bindAnnotation.id();
-                Object value = wtkxSerializer.getObjectByName(id);
-                if (value == null) {
-                    throw new BindException("\"" + id + "\" does not exist.");
-                }
-
-                // Set the value into the field
-                if (!field.isAccessible()) {
-                    try {
-                        field.setAccessible(true);
-                    } catch (Exception ex) {
-                        // No-op; the callers might have used public fields, in
-                        // which case we don't need to make them accessible
-                    }
-                }
-
-                try {
-                    field.set(object, value);
-                } catch(IllegalAccessException exception) {
-                    throw new BindException(exception);
-                }
-            }
-        }
-    }
 }