/* * 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 android.databinding.tool; import com.google.common.base.Preconditions; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.gradle.api.DefaultTask; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.bundling.Jar; import android.databinding.tool.processing.Scope; import android.databinding.tool.util.L; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; /** * Task to exclude generated classes from the Jar task of a library project */ public class DataBindingExcludeGeneratedTask extends DefaultTask { private String appPackage; private String infoClassQualifiedName; @Input private File generatedClassListFile; private boolean isLibrary; private org.gradle.api.tasks.bundling.Jar packageTask; private final String EXCLUDE_PATTERN = "android/databinding/layouts/*.*"; public void setAppPackage(String appPackage) { this.appPackage = appPackage; } public void setInfoClassQualifiedName(String infoClassQualifiedName) { this.infoClassQualifiedName = infoClassQualifiedName; } public void setLibrary(boolean isLibrary) { this.isLibrary = isLibrary; } public void setPackageTask(Jar packageTask) { this.packageTask = packageTask; } public void setGeneratedClassListFile(File generatedClassListFile) { this.generatedClassListFile = generatedClassListFile; } public String getAppPackage() { return appPackage; } public String getInfoClassQualifiedName() { return infoClassQualifiedName; } public File getGeneratedClassListFile() { return generatedClassListFile; } @TaskAction public void excludeGenerated() { L.d("Excluding generated classes from jar. Is library ? %s", isLibrary); String appPkgAsClass = appPackage.replace('.', '/'); String infoClassAsClass = infoClassQualifiedName.replace('.', '/'); exclude(infoClassAsClass + ".class"); exclude(EXCLUDE_PATTERN); if (isLibrary) { exclude(appPkgAsClass + "/BR.*"); List<String> generatedClasses = readGeneratedClasses(); for (String klass : generatedClasses) { exclude(klass.replace('.', '/') + ".class"); } } Scope.assertNoError(); L.d("Excluding generated classes from library jar is done."); } private void exclude(String pattern) { L.d("exclude %s", pattern); packageTask.exclude(pattern); } private List<String> readGeneratedClasses() { Preconditions.checkNotNull(generatedClassListFile, "Data binding exclude generated task" + " is not configured properly"); Preconditions.checkArgument(generatedClassListFile.exists(), "Generated class list does not exist %s", generatedClassListFile.getAbsolutePath()); FileInputStream fis = null; try { fis = new FileInputStream(generatedClassListFile); return IOUtils.readLines(fis); } catch (FileNotFoundException e) { L.e(e, "Unable to read generated class list from %s", generatedClassListFile.getAbsoluteFile()); } catch (IOException e) { L.e(e, "Unexpected exception while reading %s", generatedClassListFile.getAbsoluteFile()); } finally { IOUtils.closeQuietly(fis); } Preconditions.checkState(false, "Could not read data binding generated class list"); return null; } }