Downgrade to java 1.6

This CL removes java 1.7 code so that we can easily integrate
w/ Idea.

It also partially removes dependency on ModelAnalyzer for
interface generation so that we can call it from the Idea
plugin.

Change-Id: Id7616987f5660911e951ddf20dacd4f407dacbd9
diff --git a/annotationprocessor/build.gradle b/annotationprocessor/build.gradle
index 8a0a9ac..d0099d6 100644
--- a/annotationprocessor/build.gradle
+++ b/annotationprocessor/build.gradle
@@ -17,6 +17,9 @@
 apply plugin: 'java'
 apply plugin: 'maven'
 
+sourceCompatibility = 1.7
+targetCompatibility = 1.7
+
 buildscript {
     repositories {
         mavenLocal()
diff --git a/baseLibrary/build.gradle b/baseLibrary/build.gradle
index e32fabf..4e0c991 100644
--- a/baseLibrary/build.gradle
+++ b/baseLibrary/build.gradle
@@ -18,8 +18,8 @@
 apply plugin: 'maven'
 apply plugin: 'application'
 
-sourceCompatibility = 1.7
-mainClassName = "org.antlr.v4.Tool"
+sourceCompatibility = javaTargetCompatibility
+targetCompatibility = javaSourceCompatibility
 
 buildscript {
     repositories {
diff --git a/build.gradle b/build.gradle
index d1bd9cd..18b0ea2 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,6 +2,8 @@
 ext.releaseVersion = "0.3"
 ext.snapshotVersion = "0.3-SNAPSHOT"
 ext.androidPluginVersion = "1.0.0"
+ext.javaTargetCompatibility = 1.6
+ext.javaSourceCompatibility = 1.6
 
 subprojects {
     group = 'com.android.databinding'
diff --git a/compiler/build.gradle b/compiler/build.gradle
index 8ebb27a..1e0f593 100644
--- a/compiler/build.gradle
+++ b/compiler/build.gradle
@@ -19,6 +19,8 @@
 apply plugin: 'maven'
 
 
+sourceCompatibility = javaTargetCompatibility
+targetCompatibility = javaSourceCompatibility
 
 buildscript {
     repositories {
@@ -42,10 +44,17 @@
     compile project(":xmlGrammar")
     testCompile "com.android.databinding:library:$version@jar"
 }
+
+task fatJar(type: Jar) {
+    baseName = project.name + '-all'
+    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
+    with jar
+}
+
 uploadArchives {
     repositories {
         mavenDeployer {
             repository(url: mavenLocal().url)
         }
     }
-}
\ No newline at end of file
+}
diff --git a/compiler/src/main/java/com/android/databinding/BindingTarget.java b/compiler/src/main/java/com/android/databinding/BindingTarget.java
index a78398a..b0f1ff3 100644
--- a/compiler/src/main/java/com/android/databinding/BindingTarget.java
+++ b/compiler/src/main/java/com/android/databinding/BindingTarget.java
@@ -28,7 +28,7 @@
 import java.util.Map;
 
 public class BindingTarget {
-    List<Binding> mBindings = new ArrayList<>();
+    List<Binding> mBindings = new ArrayList<Binding>();
     ExprModel mModel;
     ModelClass mResolvedClass;
     // if this target presents itself in multiple layout files with different view types,
diff --git a/compiler/src/main/java/com/android/databinding/DataBinder.java b/compiler/src/main/java/com/android/databinding/DataBinder.java
index 1514a9e..0db8aae 100644
--- a/compiler/src/main/java/com/android/databinding/DataBinder.java
+++ b/compiler/src/main/java/com/android/databinding/DataBinder.java
@@ -30,7 +30,7 @@
  * The main class that handles parsing files and generating classes.
  */
 public class DataBinder {
-    List<LayoutBinder> mLayoutBinders = new ArrayList<>();
+    List<LayoutBinder> mLayoutBinders = new ArrayList<LayoutBinder>();
 
     private JavaFileWriter mFileWriter;
 
@@ -48,7 +48,7 @@
     }
     
     public void writerBinderInterfaces() {
-        Set<String> writtenFiles = new HashSet<>();
+        Set<String> writtenFiles = new HashSet<String>();
         for (LayoutBinder layoutBinder : mLayoutBinders) {
             String interfaceName = layoutBinder.getInterfaceName();
             if (writtenFiles.contains(interfaceName)) {
diff --git a/compiler/src/main/java/com/android/databinding/ExpressionVisitor.java b/compiler/src/main/java/com/android/databinding/ExpressionVisitor.java
index 9adca33..7b3f2f5 100644
--- a/compiler/src/main/java/com/android/databinding/ExpressionVisitor.java
+++ b/compiler/src/main/java/com/android/databinding/ExpressionVisitor.java
@@ -23,15 +23,18 @@
 import com.android.databinding.expr.StaticIdentifierExpr;
 import com.android.databinding.reflection.ModelAnalyzer;
 import com.android.databinding.reflection.ModelClass;
+import com.android.databinding.util.L;
 
 import org.antlr.v4.runtime.misc.NotNull;
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.TerminalNode;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
-import java.util.Objects;
+import java.util.Map;
 
 public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> {
     private final ExprModel mModel;
@@ -69,7 +72,7 @@
         } catch (Exception e) {
             System.out.println("Error while parsing! " + ctx.getText());
             e.printStackTrace();
-            throw e;
+            throw new RuntimeException(e);
         }
     }
 
@@ -144,10 +147,10 @@
     @Override
     public Expr visitMethodInvocation(
             @NotNull BindingExpressionParser.MethodInvocationContext ctx) {
-        List<Expr> args = new ArrayList<>();
+        List<Expr> args = new ArrayList<Expr>();
         if (ctx.args != null) {
             for (ParseTree item : ctx.args.children) {
-                if (Objects.equals(item.getText(), ",")) {
+                if (ObjectUtils.equals(item.getText(), ",")) {
                     continue;
                 }
                 args.add(item.accept(this));
@@ -164,10 +167,10 @@
 
     @Override
     public Expr visitResources(@NotNull BindingExpressionParser.ResourcesContext ctx) {
-        final List<Expr> args = new ArrayList<>();
+        final List<Expr> args = new ArrayList<Expr>();
         if (ctx.resourceParameters() != null) {
             for (ParseTree item : ctx.resourceParameters().expressionList().children) {
-                if (Objects.equals(item.getText(), ",")) {
+                if (ObjectUtils.equals(item.getText(), ",")) {
                     continue;
                 }
                 args.add(item.accept(this));
diff --git a/compiler/src/main/java/com/android/databinding/LayoutBinder.java b/compiler/src/main/java/com/android/databinding/LayoutBinder.java
index c08163f..faf60f7 100644
--- a/compiler/src/main/java/com/android/databinding/LayoutBinder.java
+++ b/compiler/src/main/java/com/android/databinding/LayoutBinder.java
@@ -47,7 +47,7 @@
     private String mPackage;
     private String mProjectPackage;
     private String mBaseClassName;
-    private final HashMap<String, String> mUserDefinedVariables = new HashMap<>();
+    private final HashMap<String, String> mUserDefinedVariables = new HashMap<String, String>();
 
     private LayoutBinderWriter mWriter;
     private ResourceBundle.LayoutFileBundle mBundle;
@@ -56,7 +56,7 @@
             ResourceBundle.LayoutFileBundle layoutBundle) {
         mExprModel = new ExprModel();
         mExpressionParser = new ExpressionParser(mExprModel);
-        mBindingTargets = new ArrayList<>();
+        mBindingTargets = new ArrayList<BindingTarget>();
         mBundle = layoutBundle;
         mProjectPackage = resourceBundle.getAppPackage();
         mPackage = mProjectPackage + ".generated";
@@ -79,7 +79,7 @@
     }
 
     public void resolveWhichExpressionsAreUsed() {
-        List<Expr> used = new ArrayList<>();
+        List<Expr> used = new ArrayList<Expr>();
         for (BindingTarget target : mBindingTargets) {
             for (Binding binding : target.getBindings()) {
                 binding.getExpr().setIsUsed(true);
diff --git a/compiler/src/main/java/com/android/databinding/LayoutXmlProcessor.java b/compiler/src/main/java/com/android/databinding/LayoutXmlProcessor.java
index 9bca851..ed170bf 100644
--- a/compiler/src/main/java/com/android/databinding/LayoutXmlProcessor.java
+++ b/compiler/src/main/java/com/android/databinding/LayoutXmlProcessor.java
@@ -88,6 +88,10 @@
         return true;
     }
 
+    public ResourceBundle getResourceBundle() {
+        return mResourceBundle;
+    }
+
     public void writeIntermediateFile(File sdkDir) throws JAXBException {
         if (mWritten) {
             return;
diff --git a/compiler/src/main/java/com/android/databinding/expr/Expr.java b/compiler/src/main/java/com/android/databinding/expr/Expr.java
index d2b9514..7bf5eeb 100644
--- a/compiler/src/main/java/com/android/databinding/expr/Expr.java
+++ b/compiler/src/main/java/com/android/databinding/expr/Expr.java
@@ -34,10 +34,10 @@
 abstract public class Expr {
 
     public static final int NO_ID = -1;
-    protected List<Expr> mChildren = new ArrayList<>();
+    protected List<Expr> mChildren = new ArrayList<Expr>();
 
     // any expression that refers to this. Useful if this expr is duplicate and being replaced
-    private List<Expr> mParents = new ArrayList<>();
+    private List<Expr> mParents = new ArrayList<Expr>();
 
     private Boolean mIsDynamic;
 
@@ -295,7 +295,7 @@
      * conditionals.
      */
     protected List<Dependency> constructDynamicChildrenDependencies() {
-        List<Dependency> dependencies = new ArrayList<>();
+        List<Dependency> dependencies = new ArrayList<Dependency>();
         for (Expr node : mChildren) {
             if (!node.isDynamic()) {
                 continue;
@@ -582,7 +582,7 @@
     static class Node {
 
         BitSet mBitSet = new BitSet();
-        List<Node> mParents = new ArrayList<>();
+        List<Node> mParents = new ArrayList<Node>();
         int mConditionFlag = -1;
 
         public boolean areAllPathsSatisfied(BitSet readSoFar) {
diff --git a/compiler/src/main/java/com/android/databinding/expr/ExprModel.java b/compiler/src/main/java/com/android/databinding/expr/ExprModel.java
index 3328006..7b8d430 100644
--- a/compiler/src/main/java/com/android/databinding/expr/ExprModel.java
+++ b/compiler/src/main/java/com/android/databinding/expr/ExprModel.java
@@ -34,9 +34,9 @@
 
 public class ExprModel {
 
-    Map<String, Expr> mExprMap = new HashMap<>();
+    Map<String, Expr> mExprMap = new HashMap<String, Expr>();
 
-    List<Expr> mBindingExpressions = new ArrayList<>();
+    List<Expr> mBindingExpressions = new ArrayList<Expr>();
 
     private int mInvalidateableFieldLimit = 0;
 
@@ -62,7 +62,7 @@
 
     private List<Expr> mObservables;
 
-    private Map<String, String> mImports = new HashMap<>();
+    private Map<String, String> mImports = new HashMap<String, String>();
 
     /**
      * Adds the expression to the list of expressions and returns it.
@@ -216,11 +216,11 @@
      * Give id to each expression. Will be useful if we serialize.
      */
     public void seal() {
-        List<Expr> notifiableExpressions = new ArrayList<>();
+        List<Expr> notifiableExpressions = new ArrayList<Expr>();
         //ensure class analyzer. We need to know observables at this point
         final ModelAnalyzer modelAnalyzer = ModelAnalyzer.getInstance();
 
-        ArrayList<Expr> exprs = new ArrayList<>(mBindingExpressions);
+        ArrayList<Expr> exprs = new ArrayList<Expr>(mBindingExpressions);
         for (Expr expr: exprs) {
             expr.updateExpr(modelAnalyzer);
         }
diff --git a/compiler/src/main/java/com/android/databinding/expr/IdentifierExpr.java b/compiler/src/main/java/com/android/databinding/expr/IdentifierExpr.java
index ba5583f..a826123 100644
--- a/compiler/src/main/java/com/android/databinding/expr/IdentifierExpr.java
+++ b/compiler/src/main/java/com/android/databinding/expr/IdentifierExpr.java
@@ -21,6 +21,7 @@
 
 import com.android.databinding.reflection.ModelAnalyzer;
 import com.android.databinding.reflection.ModelClass;
+import com.android.databinding.util.L;
 
 import java.util.List;
 
@@ -52,6 +53,16 @@
         return mUserDefinedType;
     }
 
+    public String getExpandedUserDefinedType(ModelAnalyzer modelAnalyzer) {
+        Preconditions.checkNotNull(mUserDefinedType,
+                "Identifiers must have user defined types from the XML file. %s is missing it",
+                mName);
+        final String expanded = modelAnalyzer
+                .applyImports(mUserDefinedType, getModel().getImports());
+        L.d("expanded version of %s is %s", mUserDefinedType, expanded);
+        return expanded;
+    }
+
     @Override
     public boolean isDynamic() {
         return true;
diff --git a/compiler/src/main/java/com/android/databinding/expr/MethodCallExpr.java b/compiler/src/main/java/com/android/databinding/expr/MethodCallExpr.java
index fcec227..41d6145 100644
--- a/compiler/src/main/java/com/android/databinding/expr/MethodCallExpr.java
+++ b/compiler/src/main/java/com/android/databinding/expr/MethodCallExpr.java
@@ -45,7 +45,7 @@
     @Override
     protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) {
         if (mGetter == null) {
-            List<ModelClass> args = new ArrayList<>();
+            List<ModelClass> args = new ArrayList<ModelClass>();
             for (Expr expr : getArgs()) {
                 args.add(expr.getResolvedType());
             }
diff --git a/compiler/src/main/java/com/android/databinding/expr/ResourceExpr.java b/compiler/src/main/java/com/android/databinding/expr/ResourceExpr.java
index 555fdd7..9eb5f36 100644
--- a/compiler/src/main/java/com/android/databinding/expr/ResourceExpr.java
+++ b/compiler/src/main/java/com/android/databinding/expr/ResourceExpr.java
@@ -38,6 +38,9 @@
                     .put("typedArray", "array")
                     .build();
 
+    // lazily initialized
+    private Map<String, ModelClass> mResourceToTypeMapping;
+
     protected final String mPackage;
 
     protected final String mResourceType;
@@ -56,63 +59,61 @@
         mResourceId = resourceName;
     }
 
+    private Map<String, ModelClass> getResourceToTypeMapping(ModelAnalyzer modelAnalyzer) {
+        if (mResourceToTypeMapping == null) {
+            final Map<String, String> imports = getModel().getImports();
+            mResourceToTypeMapping = ImmutableMap.<String, ModelClass>builder()
+                    .put("anim", modelAnalyzer.findClass("android.view.animation.Animation",
+                            imports))
+                    .put("animator", modelAnalyzer.findClass("android.animation.Animator",
+                            imports))
+                    .put("colorStateList",
+                            modelAnalyzer.findClass("android.content.res.ColorStateList",
+                                    imports))
+                    .put("drawable", modelAnalyzer.findClass("android.graphics.drawable.Drawable",
+                            imports))
+                    .put("stateListAnimator",
+                            modelAnalyzer.findClass("android.animation.StateListAnimator",
+                                    imports))
+                    .put("transition", modelAnalyzer.findClass("android.transition.Transition",
+                            imports))
+                    .put("typedArray", modelAnalyzer.findClass("android.content.res.TypedArray",
+                            imports))
+                    .put("interpolator",
+                            modelAnalyzer.findClass("android.view.animation.Interpolator", imports))
+                    .put("bool", modelAnalyzer.findClass(boolean.class))
+                    .put("color", modelAnalyzer.findClass(int.class))
+                    .put("dimenOffset", modelAnalyzer.findClass(int.class))
+                    .put("dimenSize", modelAnalyzer.findClass(int.class))
+                    .put("id", modelAnalyzer.findClass(int.class))
+                    .put("integer", modelAnalyzer.findClass(int.class))
+                    .put("layout", modelAnalyzer.findClass(int.class))
+                    .put("dimen", modelAnalyzer.findClass(float.class))
+                    .put("fraction", modelAnalyzer.findClass(float.class))
+                    .put("intArray", modelAnalyzer.findClass(int[].class))
+                    .put("string", modelAnalyzer.findClass(String.class))
+                    .put("stringArray", modelAnalyzer.findClass(String[].class))
+                    .build();
+        }
+        return mResourceToTypeMapping;
+    }
+
     @Override
     protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) {
-        String type;
-        switch (mResourceType) {
-            case "anim":
-                type = "android.view.animation.Animation";
-                break;
-            case "animator":
-                type = "android.animation.Animator";
-                break;
-            case "bool":
-                return modelAnalyzer.findClass(boolean.class);
-            case "color":
-            case "dimenOffset":
-            case "dimenSize":
-            case "id":
-            case "integer":
-            case "layout":
-                return modelAnalyzer.findClass(int.class);
-            case "plurals":
-                if (getChildren().isEmpty()) {
-                    return modelAnalyzer.findClass(int.class);
-                } else {
-                    return modelAnalyzer.findClass(String.class);
-                }
-            case "colorStateList":
-                type = "android.content.res.ColorStateList";
-                break;
-            case "dimen":
-            case "fraction":
-                return modelAnalyzer.findClass(float.class);
-            case "drawable":
-                type = "android.graphics.drawable.Drawable";
-                break;
-            case "intArray":
-                return modelAnalyzer.findClass(int[].class);
-            case "interpolator":
-                type = "";
-                break;
-            case "stateListAnimator":
-                type = "android.animation.StateListAnimator";
-                break;
-            case "string":
-                return modelAnalyzer.findClass(String.class);
-            case "stringArray":
-                return modelAnalyzer.findClass(String[].class);
-            case "transition":
-                type = "android.transition.Transition";
-                break;
-            case "typedArray":
-                type = "android.content.res.TypedArray";
-                break;
-            default:
-                type = mResourceType;
-                break;
+        final Map<String, ModelClass> mapping = getResourceToTypeMapping(
+                modelAnalyzer);
+        final ModelClass modelClass = mapping.get(mResourceType);
+        if (modelClass != null) {
+            return modelClass;
         }
-        return modelAnalyzer.findClass(type, getModel().getImports());
+        if ("plurals".equals(mResourceType)) {
+            if (getChildren().isEmpty()) {
+                return modelAnalyzer.findClass(int.class);
+            } else {
+                return modelAnalyzer.findClass(String.class);
+            }
+        }
+        return modelAnalyzer.findClass(mResourceType, getModel().getImports());
     }
 
     @Override
@@ -139,40 +140,38 @@
         final String context = "getRoot().getContext()";
         final String resources = "getRoot().getResources()";
         final String resourceName = mPackage + "R." + getResourceObject() + "." + mResourceId;
-        switch (mResourceType) {
-            case "anim": return "android.view.animation.AnimationUtils.loadAnimation(" + context + ", " + resourceName + ")";
-            case "animator": return "android.animation.AnimatorInflater.loadAnimator(" + context + ", " + resourceName + ")";
-            case "bool": return resources + ".getBoolean(" + resourceName + ")";
-            case "color": return resources + ".getColor(" + resourceName + ")";
-            case "colorStateList": return resources + ".getColorStateList(" + resourceName + ")";
-            case "dimen": return resources + ".getDimension(" + resourceName + ")";
-            case "dimenOffset": return resources + ".getDimensionPixelOffset(" + resourceName + ")";
-            case "dimenSize": return resources + ".getDimensionPixelSize(" + resourceName + ")";
-            case "drawable": return resources + ".getDrawable(" + resourceName + ")";
-            case "fraction": {
-                String base = getChildCode(0, "1");
-                String pbase = getChildCode(1, "1");
-                return resources + ".getFraction(" + resourceName + ", " + base + ", " + pbase +
-                        ")";
-            }
-            case "id": return resourceName;
-            case "intArray": return resources + ".getIntArray(" + resourceName + ")";
-            case "integer": return resources + ".getInteger(" + resourceName + ")";
-            case "interpolator":  return "android.view.animation.AnimationUtils.loadInterpolator(" + context + ", " + resourceName + ")";
-            case "layout": return resourceName;
-            case "plurals": {
-                if (getChildren().isEmpty()) {
-                    return resourceName;
-                } else {
-                    return makeParameterCall(resourceName, "getQuantityString");
-                }
-            }
-            case "stateListAnimator": return "android.animation.AnimatorInflater.loadStateListAnimator(" + context + ", " + resourceName + ")";
-            case "string": return makeParameterCall(resourceName, "getString");
-            case "stringArray": return resources + ".getStringArray(" + resourceName + ")";
-            case "transition": return "android.transition.TransitionInflater.from(" + context + ").inflateTransition(" + resourceName + ")";
-            case "typedArray": return resources + ".obtainTypedArray(" + resourceName + ")";
+        if ("anim".equals(mResourceType)) return "android.view.animation.AnimationUtils.loadAnimation(" + context + ", " + resourceName + ")";
+        if ("animator".equals(mResourceType)) return "android.animation.AnimatorInflater.loadAnimator(" + context + ", " + resourceName + ")";
+        if ("bool".equals(mResourceType)) return resources + ".getBoolean(" + resourceName + ")";
+        if ("color".equals(mResourceType)) return resources + ".getColor(" + resourceName + ")";
+        if ("colorStateList".equals(mResourceType)) return resources + ".getColorStateList(" + resourceName + ")";
+        if ("dimen".equals(mResourceType)) return resources + ".getDimension(" + resourceName + ")";
+        if ("dimenOffset".equals(mResourceType)) return resources + ".getDimensionPixelOffset(" + resourceName + ")";
+        if ("dimenSize".equals(mResourceType)) return resources + ".getDimensionPixelSize(" + resourceName + ")";
+        if ("drawable".equals(mResourceType)) return resources + ".getDrawable(" + resourceName + ")";
+        if ("fraction".equals(mResourceType)) {
+            String base = getChildCode(0, "1");
+            String pbase = getChildCode(1, "1");
+            return resources + ".getFraction(" + resourceName + ", " + base + ", " + pbase +
+                    ")";
         }
+        if ("id".equals(mResourceType)) return resourceName;
+        if ("intArray".equals(mResourceType)) return resources + ".getIntArray(" + resourceName + ")";
+        if ("integer".equals(mResourceType)) return resources + ".getInteger(" + resourceName + ")";
+        if ("interpolator".equals(mResourceType))  return "android.view.animation.AnimationUtils.loadInterpolator(" + context + ", " + resourceName + ")";
+        if ("layout".equals(mResourceType)) return resourceName;
+        if ("plurals".equals(mResourceType)) {
+            if (getChildren().isEmpty()) {
+                return resourceName;
+            } else {
+                return makeParameterCall(resourceName, "getQuantityString");
+            }
+        }
+        if ("stateListAnimator".equals(mResourceType)) return "android.animation.AnimatorInflater.loadStateListAnimator(" + context + ", " + resourceName + ")";
+        if ("string".equals(mResourceType)) return makeParameterCall(resourceName, "getString");
+        if ("stringArray".equals(mResourceType)) return resources + ".getStringArray(" + resourceName + ")";
+        if ("transition".equals(mResourceType)) return "android.transition.TransitionInflater.from(" + context + ").inflateTransition(" + resourceName + ")";
+        if ("typedArray".equals(mResourceType)) return resources + ".obtainTypedArray(" + resourceName + ")";
         final String property = Character.toUpperCase(mResourceType.charAt(0)) +
                 mResourceType.substring(1);
         return resources + ".get" + property + "(" + resourceName + ")";
diff --git a/compiler/src/main/java/com/android/databinding/reflection/ModelAnalyzer.java b/compiler/src/main/java/com/android/databinding/reflection/ModelAnalyzer.java
index b0e66c8..0397119 100644
--- a/compiler/src/main/java/com/android/databinding/reflection/ModelAnalyzer.java
+++ b/compiler/src/main/java/com/android/databinding/reflection/ModelAnalyzer.java
@@ -122,6 +122,63 @@
         sAnalyzer = annotationAnalyzer;
     }
 
+    /**
+     * Takes a raw className (potentially w/ generics and arrays) and expands definitions using
+     * the import statements.
+     * <p>
+     * For instance, this allows user to define variables
+     * <variable type="User" name="user"/>
+     * if they previously imported User.
+     * <import name="com.example.User"/>
+     */
+    public String applyImports(String className, Map<String, String> imports) {
+        className = className.trim();
+        int numDimensions = 0;
+        String generic = null;
+        // handle array
+        while (className.endsWith("[]")) {
+            numDimensions++;
+            className = className.substring(0, className.length() - 2);
+        }
+        // handle generics
+        final int lastCharIndex = className.length() - 1;
+        if ('>' == className.charAt(lastCharIndex)) {
+            // has generic.
+            int open = className.indexOf('<');
+            if (open == -1) {
+                L.e("un-matching generic syntax for %s", className);
+                return className;
+            }
+            generic = applyImports(className.substring(open + 1, lastCharIndex), imports);
+            className = className.substring(0, open);
+        }
+        int dotIndex = className.indexOf('.');
+        final String qualifier;
+        final String rest;
+        if (dotIndex == -1) {
+            qualifier = className;
+            rest = null;
+        } else {
+            qualifier = className.substring(0, dotIndex);
+            rest = className.substring(dotIndex); // includes dot
+        }
+        final String expandedQualifier = imports.get(qualifier);
+        String result;
+        if (expandedQualifier != null) {
+            result = rest == null ? expandedQualifier : expandedQualifier + rest;
+        } else {
+            result = className; // no change
+        }
+        // now append back dimension and generics
+        if (generic != null) {
+            result = result + "<" + applyImports(generic, imports) + ">";
+        }
+        while (numDimensions-- > 0) {
+            result = result + "[]";
+        }
+        return result;
+    }
+
     public String getDefaultValue(String className) {
         if ("int".equals(className)) {
             return "0";
diff --git a/compiler/src/main/java/com/android/databinding/reflection/SdkUtil.java b/compiler/src/main/java/com/android/databinding/reflection/SdkUtil.java
index 6efe2bd..2031252 100644
--- a/compiler/src/main/java/com/android/databinding/reflection/SdkUtil.java
+++ b/compiler/src/main/java/com/android/databinding/reflection/SdkUtil.java
@@ -72,7 +72,7 @@
 
     private static class ApiChecker {
 
-        private Map<String, Integer> mFullLookup = new HashMap<>();
+        private Map<String, Integer> mFullLookup = new HashMap<String, Integer>();
 
         private Document mDoc;
 
@@ -116,7 +116,6 @@
                         String methodDesc = child.getAttributes().getNamedItem("name")
                                 .getNodeValue();
                         String key = cacheKey(classDesc, methodDesc);
-                        L.d("adding method lookup %s as %s", key, since);
                         mFullLookup.put(key, since);
                     }
                 }
diff --git a/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationAnalyzer.java b/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationAnalyzer.java
index d3e32ed..c6e3388 100644
--- a/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationAnalyzer.java
+++ b/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationAnalyzer.java
@@ -413,7 +413,7 @@
     }
 
     private ArrayList<String> splitTemplateParameters(String templateParameters) {
-        ArrayList<String> list = new ArrayList<>();
+        ArrayList<String> list = new ArrayList<String>();
         int index = 0;
         int openCount = 0;
         StringBuilder arg = new StringBuilder();
@@ -438,7 +438,7 @@
 
     @Override
     public List<URL> getResources(String name) {
-        ArrayList<URL> urls = new ArrayList<>();
+        ArrayList<URL> urls = new ArrayList<URL>();
         try {
             Enumeration<URL> resources = getClass().getClassLoader().getResources(name);
             while (resources.hasMoreElements()) {
diff --git a/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationClass.java b/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationClass.java
index de54044..f345db1 100644
--- a/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationClass.java
+++ b/compiler/src/main/java/com/android/databinding/reflection/annotation/AnnotationClass.java
@@ -68,7 +68,7 @@
             for (ModelMethod method : getMethods("get", 1)) {
                 ModelClass parameter = method.getParameterTypes()[0];
                 if (parameter.isInt() || parameter.isLong()) {
-                    ArrayList<ModelClass> parameters = new ArrayList<>(1);
+                    ArrayList<ModelClass> parameters = new ArrayList<ModelClass>(1);
                     parameters.add(parameter);
                     return (AnnotationClass) method.getReturnType(parameters);
                 }
@@ -92,7 +92,7 @@
         if (typeUtil.isSameType(interfaceType, typeUtil.erasure(mTypeMirror))) {
             foundInterface = mTypeMirror;
         } else {
-            ArrayList<TypeMirror> toCheck = new ArrayList<>();
+            ArrayList<TypeMirror> toCheck = new ArrayList<TypeMirror>();
             toCheck.add(mTypeMirror);
             while (!toCheck.isEmpty()) {
                 TypeMirror typeMirror = toCheck.remove(0);
@@ -251,7 +251,7 @@
 
     @Override
     public ModelMethod[] getMethods(String name, int numParameters) {
-        ArrayList<AnnotationMethod> matching = new ArrayList<>();
+        ArrayList<AnnotationMethod> matching = new ArrayList<AnnotationMethod>();
         if (mTypeMirror.getKind() == TypeKind.DECLARED) {
             DeclaredType declaredType = (DeclaredType) mTypeMirror;
             getMethods(declaredType, matching, name, numParameters);
diff --git a/compiler/src/main/java/com/android/databinding/store/LayoutFileParser.java b/compiler/src/main/java/com/android/databinding/store/LayoutFileParser.java
index d13b170..93c5cd9 100644
--- a/compiler/src/main/java/com/android/databinding/store/LayoutFileParser.java
+++ b/compiler/src/main/java/com/android/databinding/store/LayoutFileParser.java
@@ -20,6 +20,7 @@
 import com.android.databinding.util.XmlEditor;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
@@ -57,9 +58,10 @@
     public ResourceBundle.LayoutFileBundle parseXml(File xml, String pkg, int layoutId)
             throws ParserConfigurationException, IOException, SAXException,
             XPathExpressionException {
-        final File original = stripFileAndGetOriginal(xml, "" + layoutId);
+        File original = stripFileAndGetOriginal(xml, "" + layoutId);
         if (original == null) {
-            return null;
+            L.d("assuming the file is the original for %s", xml.getAbsoluteFile());
+            original = xml;
         }
         L.d("parsing file %s", xml.getAbsolutePath());
 
@@ -177,7 +179,7 @@
     }
 
     private List<Node> toList(NodeList nodeList) {
-        List<Node> result = new ArrayList<>();
+        List<Node> result = new ArrayList<Node>();
         for (int i = 0; i < nodeList.getLength(); i ++) {
             result.add(nodeList.item(i));
         }
@@ -186,8 +188,8 @@
 
     private String getFullViewClassName(String viewName) {
         if (viewName.indexOf('.') == -1) {
-            if (Objects.equals(viewName, "View") || Objects.equals(viewName, "ViewGroup") ||
-                    Objects.equals(viewName, "ViewStub")) {
+            if (ObjectUtils.equals(viewName, "View") || ObjectUtils.equals(viewName, "ViewGroup") ||
+                    ObjectUtils.equals(viewName, "ViewStub")) {
                 return "android.view." + viewName;
             }
             return "android.widget." + viewName;
diff --git a/compiler/src/main/java/com/android/databinding/store/ResourceBundle.java b/compiler/src/main/java/com/android/databinding/store/ResourceBundle.java
index e6faf11..7422e67 100644
--- a/compiler/src/main/java/com/android/databinding/store/ResourceBundle.java
+++ b/compiler/src/main/java/com/android/databinding/store/ResourceBundle.java
@@ -44,7 +44,8 @@
 
     private String mAppPackage;
 
-    private HashMap<String, List<LayoutFileBundle>> mLayoutBundles = new HashMap<>();
+    private HashMap<String, List<LayoutFileBundle>> mLayoutBundles
+            = new HashMap<String, List<LayoutFileBundle>>();
 
     public ResourceBundle(String appPackage) {
         mAppPackage = appPackage;
@@ -80,8 +81,8 @@
         for (Map.Entry<String, List<LayoutFileBundle>> bundles : multiResLayouts) {
             // validate all ids are in correct view types
             // and all variables have the same name
-            Map<String, String> variableTypes = new HashMap<>();
-            Map<String, String> importTypes = new HashMap<>();
+            Map<String, String> variableTypes = new HashMap<String, String>();
+            Map<String, String> importTypes = new HashMap<String, String>();
 
             for (LayoutFileBundle bundle : bundles.getValue()) {
                 bundle.mHasVariations = true;
@@ -123,9 +124,9 @@
                 }
             }
 
-            Set<String> includeBindingIds = new HashSet<>();
-            Set<String> viewBindingIds = new HashSet<>();
-            Map<String, String> viewTypes = new HashMap<>();
+            Set<String> includeBindingIds = new HashSet<String>();
+            Set<String> viewBindingIds = new HashSet<String>();
+            Map<String, String> viewTypes = new HashMap<String, String>();
             L.d("validating ids for %s", bundles.getKey());
             for (LayoutFileBundle bundle : bundles.getValue()) {
                 for (BindingTargetBundle target : bundle.mBindingTargetBundles) {
@@ -207,15 +208,15 @@
 
         @XmlElement(name="Variables")
         @XmlJavaTypeAdapter(NameTypeAdapter.class)
-        public Map<String, String> mVariables = new HashMap<>();
+        public Map<String, String> mVariables = new HashMap<String, String>();
 
         @XmlElement(name="Imports")
         @XmlJavaTypeAdapter(NameTypeAdapter.class)
-        public Map<String, String> mImports = new HashMap<>();
+        public Map<String, String> mImports = new HashMap<String, String>();
 
         @XmlElementWrapper(name="Targets")
         @XmlElement(name="Target")
-        public List<BindingTargetBundle> mBindingTargetBundles = new ArrayList<>();
+        public List<BindingTargetBundle> mBindingTargetBundles = new ArrayList<BindingTargetBundle>();
 
         // for XML binding
         public LayoutFileBundle() {
@@ -317,7 +318,7 @@
         public boolean mUsed = true;
         @XmlElementWrapper(name="Expressions")
         @XmlElement(name="Expression")
-        public List<BindingBundle> mBindingBundleList = new ArrayList<>();
+        public List<BindingBundle> mBindingBundleList = new ArrayList<BindingBundle>();
         @XmlAttribute(name="include")
         public String mIncludedLayout;
         private String mInterfaceType;
@@ -420,7 +421,7 @@
 
         @Override
         public HashMap<String, String> unmarshal(MarshalledMapType v) throws Exception {
-            HashMap<String, String> map = new HashMap<>();
+            HashMap<String, String> map = new HashMap<String, String>();
             if (v.entries != null) {
                 for (MarshalledNameType entry : v.entries) {
                     map.put(entry.name, entry.type);
@@ -435,7 +436,7 @@
                 return null;
             }
             MarshalledMapType marshalled = new MarshalledMapType();
-            marshalled.entries = new ArrayList<>();
+            marshalled.entries = new ArrayList<MarshalledNameType>();
             for (String name : v.keySet()) {
                 MarshalledNameType nameType = new MarshalledNameType();
                 nameType.name = name;
diff --git a/compiler/src/main/java/com/android/databinding/store/SetterStore.java b/compiler/src/main/java/com/android/databinding/store/SetterStore.java
index 77e1e34..fe14b7e 100644
--- a/compiler/src/main/java/com/android/databinding/store/SetterStore.java
+++ b/compiler/src/main/java/com/android/databinding/store/SetterStore.java
@@ -130,7 +130,7 @@
             TypeElement declaredOn) {
         HashMap<String, MethodDescription> renamed = mStore.renamedMethods.get(attribute);
         if (renamed == null) {
-            renamed = new HashMap<>();
+            renamed = new HashMap<String, MethodDescription>();
             mStore.renamedMethods.put(attribute, renamed);
         }
         MethodDescription methodDescription =
@@ -142,7 +142,7 @@
         HashMap<AccessorKey, MethodDescription> adapters = mStore.adapterMethods.get(attribute);
 
         if (adapters == null) {
-            adapters = new HashMap<>();
+            adapters = new HashMap<AccessorKey, MethodDescription>();
             mStore.adapterMethods.put(attribute, adapters);
         }
         List<? extends VariableElement> parameters = bindingMethod.getParameters();
@@ -193,14 +193,14 @@
         MethodDescription methodDescription = new MethodDescription(conversionMethod);
         HashMap<String, MethodDescription> convertTo = mStore.conversionMethods.get(fromType);
         if (convertTo == null) {
-            convertTo = new HashMap<>();
+            convertTo = new HashMap<String, MethodDescription>();
             mStore.conversionMethods.put(fromType, convertTo);
         }
         convertTo.put(toType, methodDescription);
     }
 
     public void clear(Set<String> classes) {
-        ArrayList<AccessorKey> removedAccessorKeys = new ArrayList<>();
+        ArrayList<AccessorKey> removedAccessorKeys = new ArrayList<AccessorKey>();
         for (HashMap<AccessorKey, MethodDescription> adapters : mStore.adapterMethods.values()) {
             for (AccessorKey key : adapters.keySet()) {
                 MethodDescription description = adapters.get(key);
@@ -211,7 +211,7 @@
             removeFromMap(adapters, removedAccessorKeys);
         }
 
-        ArrayList<String> removedRenamed = new ArrayList<>();
+        ArrayList<String> removedRenamed = new ArrayList<String>();
         for (HashMap<String, MethodDescription> renamed : mStore.renamedMethods.values()) {
             for (String key : renamed.keySet()) {
                 if (classes.contains(renamed.get(key).type)) {
@@ -221,7 +221,7 @@
             removeFromMap(renamed, removedRenamed);
         }
 
-        ArrayList<String> removedConversions = new ArrayList<>();
+        ArrayList<String> removedConversions = new ArrayList<String>();
         for (HashMap<String, MethodDescription> convertTos : mStore.conversionMethods.values()) {
             for (String toType : convertTos.keySet()) {
                 MethodDescription methodDescription = convertTos.get(toType);
@@ -232,7 +232,7 @@
             removeFromMap(convertTos, removedConversions);
         }
 
-        ArrayList<String> removedUntaggable = new ArrayList<>();
+        ArrayList<String> removedUntaggable = new ArrayList<String>();
         for (String typeName : mStore.untaggableTypes.keySet()) {
             if (classes.contains(mStore.untaggableTypes.get(typeName))) {
                 removedUntaggable.add(typeName);
@@ -334,7 +334,7 @@
 
     private ModelMethod getBestSetter(ModelClass viewType, ModelClass argumentType,
             String attribute, Map<String, String> imports) {
-        List<String> setterCandidates = new ArrayList<>();
+        List<String> setterCandidates = new ArrayList<String>();
         HashMap<String, MethodDescription> renamed = mStore.renamedMethods.get(attribute);
         if (renamed != null) {
             for (String className : renamed.keySet()) {
@@ -357,7 +357,7 @@
             ModelMethod[] methods = viewType.getMethods(name, 1);
             ModelClass bestParameterType = null;
 
-            List<ModelClass> args = new ArrayList<>();
+            List<ModelClass> args = new ArrayList<ModelClass>();
             args.add(argumentType);
             for (ModelMethod method : methods) {
                 ModelClass[] parameterTypes = method.getParameterTypes();
@@ -626,12 +626,12 @@
     private static class IntermediateV1 implements Serializable, Intermediate {
         private static final long serialVersionUID = 1;
         public final HashMap<String, HashMap<AccessorKey, MethodDescription>> adapterMethods =
-                new HashMap<>();
+                new HashMap<String, HashMap<AccessorKey, MethodDescription>>();
         public final HashMap<String, HashMap<String, MethodDescription>> renamedMethods =
-                new HashMap<>();
+                new HashMap<String, HashMap<String, MethodDescription>>();
         public final HashMap<String, HashMap<String, MethodDescription>> conversionMethods =
-                new HashMap<>();
-        public final HashMap<String, String> untaggableTypes = new HashMap<>();
+                new HashMap<String, HashMap<String, MethodDescription>>();
+        public final HashMap<String, String> untaggableTypes = new HashMap<String, String>();
 
         public IntermediateV1() {
         }
diff --git a/compiler/src/main/kotlin/com/android/databinding/util/ParserHelper.kt b/compiler/src/main/kotlin/com/android/databinding/util/ParserHelper.kt
index 9b9cefe..3a898a1 100644
--- a/compiler/src/main/kotlin/com/android/databinding/util/ParserHelper.kt
+++ b/compiler/src/main/kotlin/com/android/databinding/util/ParserHelper.kt
@@ -16,7 +16,7 @@
 object ParserHelper {
     public fun toClassName(name:String) : String  {
 
-        return stripExtension(name).split("[_-]").map { "${it.substring(0,1).toUpperCase()}${it.substring(1)}" }.join("")
+        return stripExtension(name).split("[_-]").map { it.capitalize() }.join("")
     }
 
 
diff --git a/compiler/src/main/kotlin/com/android/databinding/writer/KCode.kt b/compiler/src/main/kotlin/com/android/databinding/writer/KCode.kt
index 23ce6ca..0456a47 100644
--- a/compiler/src/main/kotlin/com/android/databinding/writer/KCode.kt
+++ b/compiler/src/main/kotlin/com/android/databinding/writer/KCode.kt
@@ -19,6 +19,8 @@
 
     private var sameLine = false
 
+    private val lineSeparator = System.getProperty("line.separator")
+
     class Appendix(val glue : String, val code : KCode)
 
     private val nodes = arrayListOf<Any>()
@@ -141,7 +143,7 @@
             is KCode -> {
                 val childTab = n + (if(it.sameLine) 0 else 1)
                 if (addedChild || newlineFirstNode) {
-                    sb.append(System.lineSeparator())
+                    sb.append(lineSeparator)
                     sb.append("${indent(childTab)}")
                 }
                 it.toS(childTab, sb)
diff --git a/compiler/src/main/kotlin/com/android/databinding/writer/LayoutBinderWriter.kt b/compiler/src/main/kotlin/com/android/databinding/writer/LayoutBinderWriter.kt
index b4b5986..a832805 100644
--- a/compiler/src/main/kotlin/com/android/databinding/writer/LayoutBinderWriter.kt
+++ b/compiler/src/main/kotlin/com/android/databinding/writer/LayoutBinderWriter.kt
@@ -38,6 +38,7 @@
 import com.android.databinding.expr.BracketExpr
 import com.android.databinding.reflection.Callable
 import com.android.databinding.expr.CastExpr
+import com.android.databinding.reflection.ModelAnalyzer
 
 fun String.stripNonJava() = this.split("[^a-zA-Z0-9]").map{ it.trim() }.joinToCamelCaseAsVar()
 
@@ -717,7 +718,8 @@
             variables.forEach {
                 if (it.getUserDefinedType() != null) {
                     tab("@Bindable")
-                    val type = it.getResolvedType().toJavaCode();
+                    //it.getExpandedUserDefinedType(ModelAnalyzer.getInstance());
+                    val type = ModelAnalyzer.getInstance().applyImports(it.getUserDefinedType(), model.getImports())
                     tab("public void ${it.setterName}(${type} ${it.readableUniqueName});")
                 }
             }
diff --git a/compiler/src/test/java/com/android/databinding/MockLayoutBinder.java b/compiler/src/test/java/com/android/databinding/MockLayoutBinder.java
index dcdad42..6ef97d2 100644
--- a/compiler/src/test/java/com/android/databinding/MockLayoutBinder.java
+++ b/compiler/src/test/java/com/android/databinding/MockLayoutBinder.java
@@ -21,4 +21,4 @@
         super(new ResourceBundle("com.test"),
                 new ResourceBundle.LayoutFileBundle("blah.xml", 1, "."));
     }
-}
+}
\ No newline at end of file
diff --git a/compiler/src/test/java/com/android/databinding/reflection/java/JavaAnalyzer.java b/compiler/src/test/java/com/android/databinding/reflection/java/JavaAnalyzer.java
index f03d77c..8e6d7f7 100644
--- a/compiler/src/test/java/com/android/databinding/reflection/java/JavaAnalyzer.java
+++ b/compiler/src/test/java/com/android/databinding/reflection/java/JavaAnalyzer.java
@@ -58,7 +58,7 @@
                     .build();
     private static final String BINDABLE_ANNOTATION_NAME = "android.binding.Bindable";
 
-    private HashMap<String, JavaClass> mClassCache = new HashMap<>();
+    private HashMap<String, JavaClass> mClassCache = new HashMap<String, JavaClass>();
 
     private final ClassLoader mClassLoader;
 
@@ -110,7 +110,7 @@
     public Callable findMethod(ModelClass modelClass, String name, List<ModelClass> argClasses,
             boolean staticAccess) {
         Class klass = ((JavaClass) modelClass).mClass;
-        ArrayList<Class> args = new ArrayList<>(argClasses.size());
+        ArrayList<Class> args = new ArrayList<Class>(argClasses.size());
         for (int i = 0; i < argClasses.size(); i++) {
             args.add(((JavaClass) argClasses.get(i)).mClass);
         }
diff --git a/compiler/src/test/java/com/android/databinding/reflection/java/JavaClass.java b/compiler/src/test/java/com/android/databinding/reflection/java/JavaClass.java
index 2ea2d2d..5d7a287 100644
--- a/compiler/src/test/java/com/android/databinding/reflection/java/JavaClass.java
+++ b/compiler/src/test/java/com/android/databinding/reflection/java/JavaClass.java
@@ -199,7 +199,7 @@
     @Override
     public ModelMethod[] getMethods(String name, int numParameters) {
         Method[] methods = mClass.getMethods();
-        ArrayList<JavaMethod> matching = new ArrayList<>();
+        ArrayList<JavaMethod> matching = new ArrayList<JavaMethod>();
         for (Method method : methods) {
             if (method.getName().equals(name) &&
                     method.getParameterTypes().length == numParameters) {
@@ -211,6 +211,9 @@
 
     @Override
     public ModelClass getSuperclass() {
+        if (mClass.getSuperclass() == null) {
+            return null;
+        }
         return new JavaClass(mClass.getSuperclass());
     }
 
diff --git a/gradlePlugin/build.gradle b/gradlePlugin/build.gradle
index a12ba47..0579516 100644
--- a/gradlePlugin/build.gradle
+++ b/gradlePlugin/build.gradle
@@ -18,6 +18,9 @@
 apply plugin: "kotlin"
 apply plugin: 'maven'
 
+sourceCompatibility = javaTargetCompatibility
+targetCompatibility = javaSourceCompatibility
+
 buildscript {
     repositories {
         mavenCentral()
diff --git a/gradlePlugin/src/main/kotlin/DataBindingProcessLayoutsTask.kt b/gradlePlugin/src/main/kotlin/DataBindingProcessLayoutsTask.kt
new file mode 100644
index 0000000..7732f96
--- /dev/null
+++ b/gradlePlugin/src/main/kotlin/DataBindingProcessLayoutsTask.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * 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 com.android.databinding
+
+import org.gradle.api.DefaultTask
+import org.gradle.api.tasks.TaskAction
+import com.android.databinding.LayoutXmlProcessor
+import kotlin.properties.Delegates
+import com.android.databinding.util.Log
+import java.io.File
+
+open class DataBindingProcessLayoutsTask : DefaultTask() {
+    {
+        Log.d {"created data binding task"}
+    }
+    var xmlProcessor: LayoutXmlProcessor by Delegates.notNull()
+    var sdkDir : File by Delegates.notNull()
+    [TaskAction]
+    public fun doIt() {
+        Log.d {"running process layouts task"}
+        xmlProcessor.processResources()
+        xmlProcessor.writeIntermediateFile(sdkDir)
+    }
+}
\ No newline at end of file
diff --git a/gradlePlugin/src/main/kotlin/plugin.kt b/gradlePlugin/src/main/kotlin/plugin.kt
index 5913a55..3741ba9 100644
--- a/gradlePlugin/src/main/kotlin/plugin.kt
+++ b/gradlePlugin/src/main/kotlin/plugin.kt
@@ -52,10 +52,12 @@
 import java.io.ByteArrayOutputStream
 import org.apache.commons.codec.binary.Base64
 import com.android.builder.model.ApiVersion
+import com.android.databinding.util.Log
+import org.gradle.api.Action
 
 class DataBinderPlugin : Plugin<Project> {
 
-    inner class GradleFileWriter(var outputBase : String) : JavaFileWriter {
+    inner class GradleFileWriter(var outputBase: String) : JavaFileWriter {
         override fun writeToFile(canonicalName: String, contents: String) {
             val f = File("$outputBase/${canonicalName.replaceAll("\\.", "/")}.java")
             log("Asked to write to ${canonicalName}. outputting to:${f.getAbsolutePath()}")
@@ -65,28 +67,28 @@
     }
 
     var xmlProcessor: LayoutXmlProcessor by Delegates.notNull()
-    var project : Project by Delegates.notNull()
+    var project: Project by Delegates.notNull()
 
-    var generatedBinderSrc : File by Delegates.notNull()
+    var generatedBinderSrc: File by Delegates.notNull()
 
-    var generatedBinderOut : File by Delegates.notNull()
+    var generatedBinderOut: File by Delegates.notNull()
 
-    var androidJar : File by Delegates.notNull()
+    var androidJar: File by Delegates.notNull()
 
-    var variantData : ApplicationVariantData by Delegates.notNull()
+    var variantData: ApplicationVariantData by Delegates.notNull()
 
-    var codeGenTargetFolder : File by Delegates.notNull()
+    var codeGenTargetFolder: File by Delegates.notNull()
 
-    var viewBinderSource : File by Delegates.notNull()
+    var viewBinderSource: File by Delegates.notNull()
 
-    var sdkDir : File by Delegates.notNull()
+    var sdkDir: File by Delegates.notNull()
 
     val viewBinderSourceRoot by Delegates.lazy {
         File(project.getBuildDir(), "databinder")
     }
 
 
-    var fileWriter : GradleFileWriter by Delegates.notNull()
+    var fileWriter: GradleFileWriter by Delegates.notNull()
 
     val viewBinderCompileOutput by Delegates.lazy { File(viewBinderSourceRoot, "out") }
 
@@ -102,15 +104,33 @@
             log("after eval")
             //processDebugResources
             variants.forEach { variant ->
-//                val preTasks = it.getTasksByName("pre${variant}Build", true)
-//                preTasks.forEach {
-//                    it.doLast (generateAttr)
-//                }
                 val processResTasks = it.getTasksByName("process${variant}Resources", true)
                 processResTasks.forEach {
-                    it.doFirst(preprocessLayoutFiles)
-                    it.doLast(generateIntermediateFile)
+                    Log.d { "${it} depends on ${it.getDependsOn()}" }
                 }
+                project.getTasks().create("processDataBinding${variant}Resources",
+                        javaClass<DataBindingProcessLayoutsTask>(),
+                        object : Action<DataBindingProcessLayoutsTask> {
+                            override fun execute(task: DataBindingProcessLayoutsTask) {
+                                task.xmlProcessor = xmlProcessor
+                                task.sdkDir = sdkDir
+                                processResTasks.forEach {
+                                    // until we add these as a new source folder,
+                                    // do it the old way
+
+                                    // TODO uncomment this and comment below
+                                    // it.dependsOn(task)
+                                    it.doFirst(preprocessLayoutFiles)
+                                    it.doLast(generateIntermediateFile)
+                                }
+                                processResTasks.forEach {
+                                    it.getDependsOn().filterNot { it == task }.forEach {
+                                        Log.d { "adding dependency on ${it} for ${task}" }
+                                        task.dependsOn(it)
+                                    }
+                                }
+                            }
+                        });
             }
         }
     }
@@ -123,7 +143,8 @@
         val ss = p.getExtensions().getByName("android") as AppExtension
         sdkDir = ss.getSdkDirectory()
         val minSdkVersion = ss.getDefaultConfig().getMinSdkVersion()
-        androidJar = File(ss.getSdkDirectory().getAbsolutePath() + "/platforms/${ss.getCompileSdkVersion()}/android.jar")
+        androidJar = File(ss.getSdkDirectory().getAbsolutePath()
+                + "/platforms/${ss.getCompileSdkVersion()}/android.jar")
         log("creating parser!")
         log("project build dir:${p.getBuildDir()}")
         val clazz = javaClass<ApplicationVariantImpl>()
@@ -152,7 +173,9 @@
         log("compile options: ${options.optionMap()}")
         viewBinderSource = File(viewBinderSourceRoot.getAbsolutePath() + "/src")
         viewBinderSource.mkdirs()
-        variantData.registerJavaGeneratingTask(project.task("dataBinderDummySourceGenTask", MethodClosure(this,"dummySourceGenTask" )), File(viewBinderSourceRoot.getAbsolutePath() + "/src/"))
+        variantData.registerJavaGeneratingTask(project.task("dataBinderDummySourceGenTask",
+                MethodClosure(this, "dummySourceGenTask")),
+                        File(viewBinderSourceRoot.getAbsolutePath() + "/src/"))
         viewBinderCompileOutput.mkdirs()
         log("view binder source will be ${viewBinderSource}")
         log("adding out dir to input files ${viewBinderCompileOutput}")
@@ -165,21 +188,20 @@
         }
         inputFiles.add(viewBinderCompileOutput)
         dexTask.setInputFiles(inputFiles)
-        log("updated dexTask input files ${dexTask.getInputFiles()} vs ${inputFiles} vs dir ${dexTask.getInputDir()}")
 
         dexTask.doFirst(MethodClosure(this, "preDexAnalysis"))
         val writerOutBase = codeGenTargetFolder.getAbsolutePath();
         fileWriter = GradleFileWriter(writerOutBase)
-        return LayoutXmlProcessor(packageName, resourceFolders, fileWriter, minSdkVersion.getApiLevel())
+        return LayoutXmlProcessor(packageName, resourceFolders, fileWriter,
+                minSdkVersion.getApiLevel())
     }
 
 
-
-    fun dummySourceGenTask(o : Any?) {
+    fun dummySourceGenTask(o: Any?) {
         System.out.println("running dummySourceGenTask")
     }
 
-    fun preDexAnalysis(o : Any?) {
+    fun preDexAnalysis(o: Any?) {
         val jCompileTask = variantData.javaCompileTask
         val dexTask = variantData.dexTask
         log("dex task files: ${dexTask.getInputFiles()} ${dexTask.getInputFiles().javaClass}")
@@ -189,7 +211,6 @@
         val cpFiles = arrayListOf<File>()
         cpFiles.addAll(dexTask.getInputFiles())
         cpFiles.addAll(jCompileTask.getClasspath().getFiles())
-        //project.task("compileGenerated", MethodClosure(this, "compileGenerated"))
     }
 
     fun preprocessLayoutFiles(o: Any?) {
diff --git a/grammarBuilder/build.gradle b/grammarBuilder/build.gradle
index cd82724..17e9c4b 100644
--- a/grammarBuilder/build.gradle
+++ b/grammarBuilder/build.gradle
@@ -18,7 +18,9 @@
 apply plugin: 'application'
 apply plugin: 'maven'
 
-sourceCompatibility = 1.7
+sourceCompatibility = javaTargetCompatibility
+targetCompatibility = javaSourceCompatibility
+
 mainClassName = "org.antlr.v4.Tool"
 
 run {
diff --git a/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/MainActivity.java b/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/MainActivity.java
index dd06cdc..d4a5466 100644
--- a/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/MainActivity.java
+++ b/samples/BindingDemo/app/src/main/java/com/android/example/bindingdemo/MainActivity.java
@@ -1,6 +1,7 @@
 package com.android.example.bindingdemo;
 
 import android.binding.Bindable;
+import android.binding.BinderBundle;
 import android.binding.Observable;
 import android.binding.OnPropertyChangedListener;
 import android.support.v7.app.ActionBarActivity;
diff --git a/samples/BindingDemo/app/src/main/res/layout/list_item.xml b/samples/BindingDemo/app/src/main/res/layout/list_item.xml
index 607c091..ea0ddd3 100644
--- a/samples/BindingDemo/app/src/main/res/layout/list_item.xml
+++ b/samples/BindingDemo/app/src/main/res/layout/list_item.xml
@@ -40,7 +40,7 @@
         android:layout_marginLeft="@dimen/user_name_margin_left"
         android:id="@+id/fullname"
         android:gravity="center"
-        android:text="@{user.name.substring(0,1).toUpperCase() + &quot;. &quot; + user.lastName}"
+        android:text='@{user.name.substring(0,1).toUpperCase() + "." + user.lastName}'
         android:layout_width="wrap_content"
         android:layout_height="match_parent" />
 </android.support.v7.widget.CardView>
\ No newline at end of file
diff --git a/xmlGrammar/build.gradle b/xmlGrammar/build.gradle
index 2489f0e..ea0d5f0 100644
--- a/xmlGrammar/build.gradle
+++ b/xmlGrammar/build.gradle
@@ -3,7 +3,9 @@
 apply plugin: 'application'
 apply plugin: 'maven'
 
-sourceCompatibility = 1.5
+sourceCompatibility = javaTargetCompatibility
+targetCompatibility = javaSourceCompatibility
+
 mainClassName = "org.antlr.v4.Tool"