1b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar/* 2b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * Copyright (C) 2015 The Android Open Source Project 3b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * 4b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 5b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * you may not use this file except in compliance with the License. 6b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * You may obtain a copy of the License at 7b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * 8b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 9b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * 10b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * Unless required by applicable law or agreed to in writing, software 11b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 12b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * See the License for the specific language governing permissions and 14b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * limitations under the License. 15b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar */ 16b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 17b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarpackage android.databinding.tool; 18b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 19b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport com.google.common.base.Preconditions; 20b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 21b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport org.apache.commons.io.FileUtils; 22b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport org.apache.commons.io.IOUtils; 23b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport org.gradle.api.DefaultTask; 24b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport org.gradle.api.tasks.Input; 25b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport org.gradle.api.tasks.TaskAction; 26b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport org.gradle.api.tasks.bundling.Jar; 27b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 2808119ea342cb47910ca80ff646d746f00e4663ceYigit Boyarimport android.databinding.tool.processing.Scope; 29b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport android.databinding.tool.util.L; 30b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 31b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport java.io.File; 32b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport java.io.FileInputStream; 33b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport java.io.FileNotFoundException; 34b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport java.io.IOException; 35b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport java.util.List; 36b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 37b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar/** 38b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar * Task to exclude generated classes from the Jar task of a library project 39b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar */ 40b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarpublic class DataBindingExcludeGeneratedTask extends DefaultTask { 41b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar private String appPackage; 42b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar private String infoClassQualifiedName; 43b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar @Input 44b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar private File generatedClassListFile; 45b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar private boolean isLibrary; 46b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 47b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar private org.gradle.api.tasks.bundling.Jar packageTask; 48b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar private final String EXCLUDE_PATTERN = "android/databinding/layouts/*.*"; 49b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 50b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public void setAppPackage(String appPackage) { 51b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar this.appPackage = appPackage; 52b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 53b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 54b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public void setInfoClassQualifiedName(String infoClassQualifiedName) { 55b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar this.infoClassQualifiedName = infoClassQualifiedName; 56b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 57b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 58b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public void setLibrary(boolean isLibrary) { 59b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar this.isLibrary = isLibrary; 60b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 61b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 62b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public void setPackageTask(Jar packageTask) { 63b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar this.packageTask = packageTask; 64b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 65b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 66b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public void setGeneratedClassListFile(File generatedClassListFile) { 67b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar this.generatedClassListFile = generatedClassListFile; 68b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 69b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 70b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public String getAppPackage() { 71b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar return appPackage; 72b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 73b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 74b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public String getInfoClassQualifiedName() { 75b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar return infoClassQualifiedName; 76b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 77b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 78b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public File getGeneratedClassListFile() { 79b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar return generatedClassListFile; 80b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 81b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 82b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar @TaskAction 83b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public void excludeGenerated() { 84b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar L.d("Excluding generated classes from jar. Is library ? %s", isLibrary); 85b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar String appPkgAsClass = appPackage.replace('.', '/'); 86b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar String infoClassAsClass = infoClassQualifiedName.replace('.', '/'); 87b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar exclude(infoClassAsClass + ".class"); 88b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar exclude(EXCLUDE_PATTERN); 89b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar if (isLibrary) { 90b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar exclude(appPkgAsClass + "/BR.*"); 91bdc7aa8269502b3fc3ce73c124e4f1b2092502c9George Mount exclude("android/databinding/DynamicUtil.class"); 92b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar List<String> generatedClasses = readGeneratedClasses(); 93b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar for (String klass : generatedClasses) { 94b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar exclude(klass.replace('.', '/') + ".class"); 95b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 96b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 9708119ea342cb47910ca80ff646d746f00e4663ceYigit Boyar Scope.assertNoError(); 98b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar L.d("Excluding generated classes from library jar is done."); 99b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 100b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 101b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar private void exclude(String pattern) { 102b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar L.d("exclude %s", pattern); 103b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar packageTask.exclude(pattern); 104b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 105b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 106b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar private List<String> readGeneratedClasses() { 107b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar Preconditions.checkNotNull(generatedClassListFile, "Data binding exclude generated task" 108b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar + " is not configured properly"); 109b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar Preconditions.checkArgument(generatedClassListFile.exists(), 110b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar "Generated class list does not exist %s", generatedClassListFile.getAbsolutePath()); 111b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar FileInputStream fis = null; 112b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar try { 113b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar fis = new FileInputStream(generatedClassListFile); 114b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar return IOUtils.readLines(fis); 115b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } catch (FileNotFoundException e) { 116b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar L.e(e, "Unable to read generated class list from %s", 117b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar generatedClassListFile.getAbsoluteFile()); 118b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } catch (IOException e) { 119b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar L.e(e, "Unexpected exception while reading %s", 120b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar generatedClassListFile.getAbsoluteFile()); 121b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } finally { 122b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar IOUtils.closeQuietly(fis); 123b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 124b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar Preconditions.checkState(false, "Could not read data binding generated class list"); 125b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar return null; 126b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 127b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar} 128