LayoutBinder.java revision 43596c2b2997e40b709627419732100d78a62ff0
1d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar/*
2d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
3d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *
4d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * you may not use this file except in compliance with the License.
6d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * You may obtain a copy of the License at
7d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *
8d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar *
10d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * See the License for the specific language governing permissions and
14d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * limitations under the License.
15d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar */
16d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
1743596c2b2997e40b709627419732100d78a62ff0Yigit Boyarpackage com.android.databinding;
18d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
19d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport com.google.common.base.Preconditions;
20d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
2143596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.writer.LayoutBinderWriter;
2243596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.Expr;
2343596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.ExprModel;
2443596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.IdentifierExpr;
2543596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.expr.StaticIdentifierExpr;
2643596c2b2997e40b709627419732100d78a62ff0Yigit Boyarimport com.android.databinding.util.L;
27d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
28d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport org.w3c.dom.Node;
29d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
30d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.ArrayList;
31d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.List;
32d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
33d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar/**
34d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * Keeps all information about the bindings per layout file
35d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar */
36d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarpublic class LayoutBinder {
37d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    /*
38d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    * val pkg: String, val projectPackage: String, val baseClassName: String,
39d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        val layoutName:String, val lb: LayoutExprBinding*/
40d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    private final ExprModel mExprModel;
41d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    private final Node mRoot;
42d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    private final ExpressionParser mExpressionParser;
43d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    private final List<BindingTarget> mBindingTargets;
44d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    private String mPackage;
45d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    private String mProjectPackage;
46d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    private String mBaseClassName;
47d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    private String mLayoutname;
48d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
4943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar    private LayoutBinderWriter mWriter;
5043596c2b2997e40b709627419732100d78a62ff0Yigit Boyar
51d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public LayoutBinder(Node root) {
52d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mRoot = root;
53d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mExprModel = new ExprModel();
54d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mExpressionParser = new ExpressionParser(mExprModel);
55d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mBindingTargets = new ArrayList<>();
56d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
57d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
58d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public IdentifierExpr addVariable(String name, String type) {
59d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final IdentifierExpr id = mExprModel.identifier(name);
60d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        id.setUserDefinedType(type);
61d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        id.enableDirectInvalidation();
62d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return id;
63d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
64d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
65d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public StaticIdentifierExpr addImport(String alias, String type) {
66d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final StaticIdentifierExpr id = mExprModel.staticIdentifier(alias);
67d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        L.d("adding import %s as %s klass: %s", type, alias, id.getClass().getSimpleName());
68d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        id.setUserDefinedType(type);
69d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return id;
70d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
71d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
72d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public BindingTarget createBindingTarget(Node parent, String nodeValue, String viewClassName) {
73d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final BindingTarget target = new BindingTarget(parent, nodeValue, viewClassName);
74d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mBindingTargets.add(target);
75d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        target.setModel(mExprModel);
76d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return target;
77d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
78d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
79d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public Expr parse(String input) {
80d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        final Expr parsed = mExpressionParser.parse(input);
81d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        parsed.setBindingExpression(true);
82d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return parsed;
83d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
84d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
85d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public List<BindingTarget> getBindingTargets() {
86d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mBindingTargets;
87d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
88d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
89d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public boolean isEmpty() {
90d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mExprModel.size() == 0;
91d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
92d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
93d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public ExprModel getModel() {
94d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mExprModel;
95d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
96d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
9743596c2b2997e40b709627419732100d78a62ff0Yigit Boyar    private void ensureWriter() {
9843596c2b2997e40b709627419732100d78a62ff0Yigit Boyar        if (mWriter == null) {
9943596c2b2997e40b709627419732100d78a62ff0Yigit Boyar            mWriter = new LayoutBinderWriter(this);
10043596c2b2997e40b709627419732100d78a62ff0Yigit Boyar        }
10143596c2b2997e40b709627419732100d78a62ff0Yigit Boyar    }
10243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar    public String writeViewBinderInterface() {
10343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar        ensureWriter();
10443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar        return mWriter.writeInterface();
10543596c2b2997e40b709627419732100d78a62ff0Yigit Boyar    }
10643596c2b2997e40b709627419732100d78a62ff0Yigit Boyar
10743596c2b2997e40b709627419732100d78a62ff0Yigit Boyar
10843596c2b2997e40b709627419732100d78a62ff0Yigit Boyar    public String writeViewBinder() {
109d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mExprModel.seal();
11043596c2b2997e40b709627419732100d78a62ff0Yigit Boyar        ensureWriter();
111d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        Preconditions.checkNotNull(mPackage, "package cannot be null");
112d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        Preconditions.checkNotNull(mProjectPackage, "project package cannot be null");
113d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        Preconditions.checkNotNull(mBaseClassName, "base class name cannot be null");
11443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar        return mWriter.write();
115d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
116d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
117d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public String getPackage() {
118d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mPackage;
119d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
120d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
121d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void setPackage(String aPackage) {
122d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mPackage = aPackage;
123d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
124d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
125d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public String getProjectPackage() {
126d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mProjectPackage;
127d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
128d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
129d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void setProjectPackage(String projectPackage) {
130d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mProjectPackage = projectPackage;
131d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
132d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
133d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public String getBaseClassName() {
134d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mBaseClassName;
135d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
136d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
137d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void setBaseClassName(String baseClassName) {
138d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mBaseClassName = baseClassName;
139d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
140d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
141d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public String getLayoutname() {
142d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mLayoutname;
143d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
144d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
145d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public void setLayoutname(String layoutname) {
146d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        mLayoutname = layoutname;
147d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
148d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar
149d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    public String getClassName() {
150d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar        return mBaseClassName + "Impl";
151d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar    }
15243596c2b2997e40b709627419732100d78a62ff0Yigit Boyar
15343596c2b2997e40b709627419732100d78a62ff0Yigit Boyar    public String getInterfaceName() {
15443596c2b2997e40b709627419732100d78a62ff0Yigit Boyar        return mBaseClassName;
15543596c2b2997e40b709627419732100d78a62ff0Yigit Boyar    }
156d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar}
157