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);
- }
- }
- }
- }
}