Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d2181b4 authored by Yigit Boyar's avatar Yigit Boyar
Browse files

Allow chef to be created from bundle

Change-Id: If5b00a98684803cdd46547b9a94c961fe0bbf4e3
parent e5741e49
Loading
Loading
Loading
Loading
+56 −32
Original line number Diff line number Diff line
@@ -21,13 +21,18 @@ import com.android.databinding.store.ResourceBundle;
import com.android.databinding.util.L;
import com.android.databinding.writer.DataBinderWriter;
import com.android.databinding.writer.FileWriter;
import com.android.databinding.writer.FileWriterImpl;

import org.apache.commons.io.IOUtils;
import org.xml.sax.SAXException;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
@@ -39,28 +44,62 @@ import javax.xml.xpath.XPathExpressionException;
 * Different build systems can initiate a version of this to handle their work
 */
public class CompilerChef {
    private FileWriter mFileWriter = new FileWriterImpl();
    public static final String RESOURCE_BUNDLE_FILE_NAME = "binder_bundle.dat";
    private FileWriter mFileWriter;
    private LayoutFileParser mLayoutFileParser;
    private ResourceBundle mResourceBundle;
    private DataBinder mDataBinder;
    
    private File mOutputBaseDir;
    private String mAppPackage;
    private List<File> mResourceFolders;

    public void setupForParsing(String appPkg, List<File> resourceFolders,
            File codegenTargetFolder) {
        mOutputBaseDir = codegenTargetFolder;
        mResourceFolders = resourceFolders;
        mAppPackage = appPkg;
    private CompilerChef() {

    }

    public void processResources()
    public static CompilerChef createChef(String appPkg, List<File> resourceFolders,
            FileWriter fileWriter) {
        CompilerChef chef = new CompilerChef();
        chef.mAppPackage = appPkg;
        chef.mResourceFolders = resourceFolders;
        chef.mFileWriter = fileWriter;
        return chef;
    }

    public static CompilerChef createChef(InputStream inputStream, FileWriter fileWriter)
            throws IOException, ClassNotFoundException {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(inputStream);
            return createChef((ResourceBundle) ois.readObject(), fileWriter);
        } finally {
            IOUtils.closeQuietly(ois);
        }
    }

    public static CompilerChef createChef(ResourceBundle resourceBundle, FileWriter fileWriter) {
        CompilerChef chef = new CompilerChef();
        chef.mResourceBundle = resourceBundle;
        chef.mFileWriter = fileWriter;
        chef.mAppPackage = resourceBundle.getAppPackage();
        return chef;
    }

    public void exportResourceBundle(OutputStream outputStream) {
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(outputStream);
            oos.writeObject(mResourceBundle);
        } catch (IOException e) {
            IOUtils.closeQuietly(oos);
        }
    }

    public boolean processResources()
            throws ParserConfigurationException, SAXException, XPathExpressionException,
            IOException {
        if (mResourceBundle != null) {
            return; // already processed
            return false; // already processed
        }
        mResourceBundle = new ResourceBundle();
        mResourceBundle.setAppPackage(mAppPackage);
@@ -79,6 +118,7 @@ public class CompilerChef {
            }
        }
        mResourceBundle.validateMultiResLayouts();
        return true;
    }
    
    public void ensureDataBinder() {
@@ -94,40 +134,24 @@ public class CompilerChef {
        return mResourceBundle != null && mResourceBundle.getLayoutBundles().size() > 0;
    }

    public void writeDbrFile(File folder) {
    public void writeDbrFile() {
        ensureDataBinder();
        final String pkg = "com.android.databinding.library";
        DataBinderWriter dbr = new DataBinderWriter(pkg, mResourceBundle.getAppPackage(),
                "GeneratedDataBinderRenderer", mDataBinder.getLayoutBinders());
        if (folder == null) {
            folder = new File(mOutputBaseDir.getAbsolutePath() + "/" + pkg.replace('.','/'));
        }
        folder.mkdirs();
        if (dbr.getLayoutBinders().size() > 0) {
            mFileWriter.writeToFile(new File(folder, dbr.getClassName() + ".java"), dbr.write());
            mFileWriter.writeToFile(dbr.getPkg() + "." + dbr.getClassName(), dbr.write());
        }
    }
    
    public void setOutputBaseDir(File baseDir) {
        mOutputBaseDir = baseDir;
    }

    public void writeViewBinderInterfaces(File folder) {
    public void writeViewBinderInterfaces() {
        ensureDataBinder();
        if (folder == null) {
            folder = new File(mOutputBaseDir.getAbsolutePath() + "/" + mResourceBundle.getAppPackage().replace(
                    '.', '/') + "/generated");
        }
        mDataBinder.writerBinderInterfaces(folder);
        mDataBinder.writerBinderInterfaces();
    }
    
    public void writeViewBinders(File folder) {
    public void writeViewBinders() {
        ensureDataBinder();
        if (folder == null) {
            folder = new File(mOutputBaseDir.getAbsolutePath() + "/" + mResourceBundle.getAppPackage().replace(
                    '.', '/') + "/generated");
        }
        mDataBinder.writeBinders(folder);
        mDataBinder.writeBinders();
    }

    private final Predicate<File> fileExists = new Predicate<File>() {
+5 −7
Original line number Diff line number Diff line
@@ -48,24 +48,22 @@ public class DataBinder {
        return mLayoutBinders;
    }
    
    public void writerBinderInterfaces(File outputDir) {
        outputDir.mkdirs();
    public void writerBinderInterfaces() {
        Set<String> writtenFiles = new HashSet<>();
        for (LayoutBinder layoutBinder : mLayoutBinders) {
            String interfaceName = layoutBinder.getInterfaceName();
            if (writtenFiles.contains(interfaceName)) {
                continue;
            }
            mFileWriter.writeToFile(new File(outputDir, interfaceName + ".java"),
            mFileWriter.writeToFile(layoutBinder.getPackage() + "." + layoutBinder.getInterfaceName(),
                    layoutBinder.writeViewBinderInterface());
        }
    }
    
    public void writeBinders(File outputDir) {
        L.d("writing binders to %s", outputDir.getAbsoluteFile());
    public void writeBinders() {
        for (LayoutBinder layoutBinder : mLayoutBinders) {
            L.d("binder: %s %s %s", layoutBinder.getId(), layoutBinder.getClassName(), layoutBinder.getInterfaceName());
            mFileWriter.writeToFile(new File(outputDir, layoutBinder.getClassName() + ".java"), layoutBinder.writeViewBinder());
            mFileWriter.writeToFile(layoutBinder.getPackage() + "." + layoutBinder.getClassName(),
                    layoutBinder.writeViewBinder());
        }
    }

+5 −4
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import com.android.databinding.util.L;
import com.android.databinding.util.ParserHelper;

import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -31,7 +32,7 @@ import java.util.Set;
/**
 * This is a serializable class that can keep the result of parsing layout files.
 */
public class ResourceBundle {
public class ResourceBundle implements Serializable {

    private String mAppPackage;

@@ -182,7 +183,7 @@ public class ResourceBundle {
        }
    }

    public static class LayoutFileBundle {
    public static class LayoutFileBundle implements Serializable {
        private int mLayoutId;
        private String mFileName;
        private String mConfigName;
@@ -258,7 +259,7 @@ public class ResourceBundle {
        }
    }

    public static class BindingTargetBundle {
    public static class BindingTargetBundle implements Serializable {

        private String mId;
        private String mFullClassName;
@@ -313,7 +314,7 @@ public class ResourceBundle {
            return mInterfaceType;
        }

        public static class BindingBundle {
        public static class BindingBundle implements Serializable {

            private String mName;
            private String mExpr;
+1 −1
Original line number Diff line number Diff line
@@ -16,5 +16,5 @@ package com.android.databinding.writer;
import java.io.File;

public interface FileWriter {
    public void writeToFile(File file , String contents);
    public void writeToFile(String canonicalName, String contents);
}
+0 −33
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 The Android Open Source Project
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *      http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.databinding.writer;

import com.android.databinding.util.L;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;

public class FileWriterImpl implements FileWriter {

    @Override
    public void writeToFile(File file, String contents) {

        try {
            FileUtils.writeStringToFile(file, contents);
        } catch (IOException e) {
            L.e(e, "cannot write to %s", file.getAbsolutePath());
        }
    }
}
Loading