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