13bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar/*
23bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
33bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
43bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * you may not use this file except in compliance with the License.
53bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * You may obtain a copy of the License at
63bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
73bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Unless required by applicable law or agreed to in writing, software
83bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
93bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
103bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * See the License for the specific language governing permissions and
113bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * limitations under the License.
123bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar */
133bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
14fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.tool;
153bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.store.ResourceBundle;
17fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.util.L;
184df4ba38a62b791bbbc25e923efe8d9c2f9a52e9Yigit Boyarimport android.databinding.tool.writer.BRWriter;
19fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.writer.DataBinderWriter;
20fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.writer.JavaFileWriter;
213bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
22b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport java.util.Set;
23b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar
243bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar/**
253bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Chef class for compiler.
263bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar *
273bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Different build systems can initiate a version of this to handle their work
283bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar */
293bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyarpublic class CompilerChef {
301b9940e612fc73202837fbe9db2f9035f307b5d1George Mount    private JavaFileWriter mFileWriter;
313bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    private ResourceBundle mResourceBundle;
323bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    private DataBinder mDataBinder;
333bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
34b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar    private CompilerChef() {
353bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
363bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
378e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount    public static CompilerChef createChef(ResourceBundle bundle, JavaFileWriter fileWriter) {
38b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar        CompilerChef chef = new CompilerChef();
39b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar
408e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount        chef.mResourceBundle = bundle;
41b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar        chef.mFileWriter = fileWriter;
428e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount        chef.mResourceBundle.validateMultiResLayouts();
43b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar        return chef;
44b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar    }
45b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar
468e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount    public ResourceBundle getResourceBundle() {
478e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount        return mResourceBundle;
48b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar    }
49b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar
503bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    public void ensureDataBinder() {
513bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        if (mDataBinder == null) {
523bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar            mDataBinder = new DataBinder(mResourceBundle);
533bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar            mDataBinder.setFileWriter(mFileWriter);
543bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        }
553bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
568e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount
573bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    public boolean hasAnythingToGenerate() {
588e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount        L.d("checking if we have anything to generate. bundle size: %s",
593bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar                mResourceBundle == null ? -1 : mResourceBundle.getLayoutBundles().size());
603bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        return mResourceBundle != null && mResourceBundle.getLayoutBundles().size() > 0;
613bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
623bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
634df4ba38a62b791bbbc25e923efe8d9c2f9a52e9Yigit Boyar    public void writeDataBinderMapper(int minSdk, BRWriter brWriter) {
643bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        ensureDataBinder();
65fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mount        final String pkg = "android.databinding";
663bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        DataBinderWriter dbr = new DataBinderWriter(pkg, mResourceBundle.getAppPackage(),
67e7c2a5e45d7651899790bd347da635875f9c73fbGeorge Mount                "DataBinderMapper", mDataBinder.getLayoutBinders(), minSdk);
684df4ba38a62b791bbbc25e923efe8d9c2f9a52e9Yigit Boyar        mFileWriter.writeToFile(pkg + "." + dbr.getClassName(), dbr.write(brWriter));
693bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
7061630faa88ee4817834d47294a0e17f19d8e1c51George Mount
7161630faa88ee4817834d47294a0e17f19d8e1c51George Mount    /**
7261630faa88ee4817834d47294a0e17f19d8e1c51George Mount     * Adds variables to list of Bindables.
7361630faa88ee4817834d47294a0e17f19d8e1c51George Mount     */
7461630faa88ee4817834d47294a0e17f19d8e1c51George Mount    public void addBRVariables(BindableHolder bindables) {
7561630faa88ee4817834d47294a0e17f19d8e1c51George Mount        ensureDataBinder();
7661630faa88ee4817834d47294a0e17f19d8e1c51George Mount        for (LayoutBinder layoutBinder : mDataBinder.mLayoutBinders) {
7761630faa88ee4817834d47294a0e17f19d8e1c51George Mount            for (String variableName : layoutBinder.getUserDefinedVariables().keySet()) {
78dea555cf42dc3583604699c8c018d22681f56166George Mount                bindables.addVariable(variableName, layoutBinder.getClassName());
7961630faa88ee4817834d47294a0e17f19d8e1c51George Mount            }
8061630faa88ee4817834d47294a0e17f19d8e1c51George Mount        }
8161630faa88ee4817834d47294a0e17f19d8e1c51George Mount    }
82e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount
83e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount    public void sealModels() {
84e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        ensureDataBinder();
85e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        mDataBinder.sealModels();
86e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount    }
873bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
88dea555cf42dc3583604699c8c018d22681f56166George Mount    public void writeViewBinderInterfaces(boolean isLibrary) {
893bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        ensureDataBinder();
90dea555cf42dc3583604699c8c018d22681f56166George Mount        mDataBinder.writerBaseClasses(isLibrary);
913bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
928e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount
9396e1c821dd446d1ed78f8ae61131550588f60a24George Mount    public void writeViewBinders(int minSdk) {
943bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        ensureDataBinder();
9596e1c821dd446d1ed78f8ae61131550588f60a24George Mount        mDataBinder.writeBinders(minSdk);
963bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
9761630faa88ee4817834d47294a0e17f19d8e1c51George Mount
98e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount    public void writeComponent() {
99e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        ensureDataBinder();
100e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        mDataBinder.writeComponent();
101e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount    }
102e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount
103b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar    public Set<String> getWrittenClassNames() {
104b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar        ensureDataBinder();
105b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar        return mDataBinder.getWrittenClassNames();
106b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar    }
107b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar
10861630faa88ee4817834d47294a0e17f19d8e1c51George Mount    public interface BindableHolder {
10961630faa88ee4817834d47294a0e17f19d8e1c51George Mount        void addVariable(String variableName, String containingClassName);
11061630faa88ee4817834d47294a0e17f19d8e1c51George Mount    }
1113bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar}
112