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