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 17fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.tool; 18fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mount 19731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyarimport android.databinding.tool.processing.Scope; 20731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyarimport android.databinding.tool.processing.ScopedException; 21fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.store.ResourceBundle; 22fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.util.L; 23e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mountimport android.databinding.tool.writer.ComponentWriter; 24fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.writer.JavaFileWriter; 25d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 26d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.ArrayList; 273bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyarimport java.util.HashSet; 28d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarimport java.util.List; 293bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyarimport java.util.Map; 303bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyarimport java.util.Set; 31d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 32d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar/** 33d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar * The main class that handles parsing files and generating classes. 34d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar */ 35d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyarpublic class DataBinder { 36895b618d9c6e3deb56465d0759cda57f50c46214Yigit Boyar List<LayoutBinder> mLayoutBinders = new ArrayList<LayoutBinder>(); 37e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount private static final String COMPONENT_CLASS = "android.databinding.DataBindingComponent"; 38d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 391b9940e612fc73202837fbe9db2f9035f307b5d1George Mount private JavaFileWriter mFileWriter; 40d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 41b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar Set<String> writtenClasses = new HashSet<String>(); 42b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 433bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar public DataBinder(ResourceBundle resourceBundle) { 443bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar L.d("reading resource bundle into data binder"); 453bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar for (Map.Entry<String, List<ResourceBundle.LayoutFileBundle>> entry : 463bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar resourceBundle.getLayoutBundles().entrySet()) { 473bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar for (ResourceBundle.LayoutFileBundle bundle : entry.getValue()) { 48731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar try { 49731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar mLayoutBinders.add(new LayoutBinder(bundle)); 50731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar } catch (ScopedException ex) { 51731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar Scope.defer(ex); 52731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar } 535bf3700759ff21696becadd4e6fcfe2c0db6cb83Yigit Boyar } 54d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 55d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 563bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar public List<LayoutBinder> getLayoutBinders() { 573bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar return mLayoutBinders; 58d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 598b1da958f181639d33dfaa907c0ee66add2decd6Yigit Boyar 60e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount public void sealModels() { 61e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount for (LayoutBinder layoutBinder : mLayoutBinders) { 62e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount layoutBinder.sealModel(); 63e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount } 64e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount } 65e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount 66dea555cf42dc3583604699c8c018d22681f56166George Mount public void writerBaseClasses(boolean isLibrary) { 673bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar for (LayoutBinder layoutBinder : mLayoutBinders) { 68731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar try { 69731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar Scope.enter(layoutBinder); 70731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar if (isLibrary || layoutBinder.hasVariations()) { 71731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar String className = layoutBinder.getClassName(); 72731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar String canonicalName = layoutBinder.getPackage() + "." + className; 73731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar if (writtenClasses.contains(canonicalName)) { 74731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar continue; 75731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar } 76731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar L.d("writing data binder base %s", canonicalName); 77731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar mFileWriter.writeToFile(canonicalName, 78731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar layoutBinder.writeViewBinderBaseClass(isLibrary)); 79731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar writtenClasses.add(canonicalName); 80dea555cf42dc3583604699c8c018d22681f56166George Mount } 81731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar } catch (ScopedException ex){ 82731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar Scope.defer(ex); 83731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar } finally { 84731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar Scope.exit(); 853bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar } 863bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar } 87d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 888b1da958f181639d33dfaa907c0ee66add2decd6Yigit Boyar 8996e1c821dd446d1ed78f8ae61131550588f60a24George Mount public void writeBinders(int minSdk) { 903bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar for (LayoutBinder layoutBinder : mLayoutBinders) { 91731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar try { 92731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar Scope.enter(layoutBinder); 93731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar String className = layoutBinder.getImplementationName(); 94731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar String canonicalName = layoutBinder.getPackage() + "." + className; 95731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar L.d("writing data binder %s", canonicalName); 96731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar writtenClasses.add(canonicalName); 97731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar mFileWriter.writeToFile(canonicalName, layoutBinder.writeViewBinder(minSdk)); 98731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar } catch (ScopedException ex) { 99731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar Scope.defer(ex); 100731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar } finally { 101731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar Scope.exit(); 102731b74f7f44e67312a1fc4161c4e0aae221b2417Yigit Boyar } 103d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 104d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 105d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 106e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount public void writeComponent() { 107a128d1c99ea98bb48c45d648906652e3d618d513George Mount ComponentWriter componentWriter = new ComponentWriter(); 108e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount 109e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount writtenClasses.add(COMPONENT_CLASS); 110e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount mFileWriter.writeToFile(COMPONENT_CLASS, componentWriter.createComponent()); 111e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount } 112e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount 113b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public Set<String> getWrittenClassNames() { 114b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar return writtenClasses; 115b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 116b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 1171b9940e612fc73202837fbe9db2f9035f307b5d1George Mount public void setFileWriter(JavaFileWriter fileWriter) { 1183bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar mFileWriter = fileWriter; 119d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 120d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar 1211b9940e612fc73202837fbe9db2f9035f307b5d1George Mount public JavaFileWriter getFileWriter() { 1223bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar return mFileWriter; 123d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar } 124d7af42b29ddf22f0068f7496c5ac6f4f34b543b6Yigit Boyar} 125