CompilerChef.java revision 96e1c821dd446d1ed78f8ae61131550588f60a24
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;
18fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.writer.DataBinderWriter;
19fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.writer.JavaFileWriter;
203bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
213bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar/**
223bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Chef class for compiler.
233bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar *
243bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Different build systems can initiate a version of this to handle their work
253bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar */
263bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyarpublic class CompilerChef {
271b9940e612fc73202837fbe9db2f9035f307b5d1George Mount    private JavaFileWriter mFileWriter;
283bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    private ResourceBundle mResourceBundle;
293bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    private DataBinder mDataBinder;
303bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
31b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar    private CompilerChef() {
323bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
333bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
348e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount    public static CompilerChef createChef(ResourceBundle bundle, JavaFileWriter fileWriter) {
35b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar        CompilerChef chef = new CompilerChef();
36b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar
378e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount        chef.mResourceBundle = bundle;
38b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar        chef.mFileWriter = fileWriter;
398e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount        chef.mResourceBundle.validateMultiResLayouts();
40b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar        return chef;
41b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar    }
42b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar
438e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount    public ResourceBundle getResourceBundle() {
448e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount        return mResourceBundle;
45b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar    }
46b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar
473bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    public void ensureDataBinder() {
483bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        if (mDataBinder == null) {
493bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar            mDataBinder = new DataBinder(mResourceBundle);
503bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar            mDataBinder.setFileWriter(mFileWriter);
513bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        }
523bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
538e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount
543bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    public boolean hasAnythingToGenerate() {
558e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount        L.d("checking if we have anything to generate. bundle size: %s",
563bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar                mResourceBundle == null ? -1 : mResourceBundle.getLayoutBundles().size());
573bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        return mResourceBundle != null && mResourceBundle.getLayoutBundles().size() > 0;
583bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
593bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
60e7c2a5e45d7651899790bd347da635875f9c73fbGeorge Mount    public void writeDbrFile(int minSdk) {
613bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        ensureDataBinder();
62fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mount        final String pkg = "android.databinding";
633bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        DataBinderWriter dbr = new DataBinderWriter(pkg, mResourceBundle.getAppPackage(),
64e7c2a5e45d7651899790bd347da635875f9c73fbGeorge Mount                "DataBinderMapper", mDataBinder.getLayoutBinders(), minSdk);
653bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        if (dbr.getLayoutBinders().size() > 0) {
66fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mount            mFileWriter.writeToFile(pkg + "." + dbr.getClassName(), dbr.write());
673bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        }
683bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
6961630faa88ee4817834d47294a0e17f19d8e1c51George Mount
7061630faa88ee4817834d47294a0e17f19d8e1c51George Mount    /**
7161630faa88ee4817834d47294a0e17f19d8e1c51George Mount     * Adds variables to list of Bindables.
7261630faa88ee4817834d47294a0e17f19d8e1c51George Mount     */
7361630faa88ee4817834d47294a0e17f19d8e1c51George Mount    public void addBRVariables(BindableHolder bindables) {
7461630faa88ee4817834d47294a0e17f19d8e1c51George Mount        ensureDataBinder();
7561630faa88ee4817834d47294a0e17f19d8e1c51George Mount        for (LayoutBinder layoutBinder : mDataBinder.mLayoutBinders) {
7661630faa88ee4817834d47294a0e17f19d8e1c51George Mount            for (String variableName : layoutBinder.getUserDefinedVariables().keySet()) {
77dea555cf42dc3583604699c8c018d22681f56166George Mount                bindables.addVariable(variableName, layoutBinder.getClassName());
7861630faa88ee4817834d47294a0e17f19d8e1c51George Mount            }
7961630faa88ee4817834d47294a0e17f19d8e1c51George Mount        }
8061630faa88ee4817834d47294a0e17f19d8e1c51George Mount    }
813bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar
82dea555cf42dc3583604699c8c018d22681f56166George Mount    public void writeViewBinderInterfaces(boolean isLibrary) {
833bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        ensureDataBinder();
84dea555cf42dc3583604699c8c018d22681f56166George Mount        mDataBinder.writerBaseClasses(isLibrary);
853bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
868e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount
8796e1c821dd446d1ed78f8ae61131550588f60a24George Mount    public void writeViewBinders(int minSdk) {
883bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar        ensureDataBinder();
8996e1c821dd446d1ed78f8ae61131550588f60a24George Mount        mDataBinder.writeBinders(minSdk);
903bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar    }
9161630faa88ee4817834d47294a0e17f19d8e1c51George Mount
9261630faa88ee4817834d47294a0e17f19d8e1c51George Mount    public interface BindableHolder {
9361630faa88ee4817834d47294a0e17f19d8e1c51George Mount        void addVariable(String variableName, String containingClassName);
9461630faa88ee4817834d47294a0e17f19d8e1c51George Mount    }
953bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar}
96