summaryrefslogtreecommitdiff
path: root/gradlePlugin/src/main/java/android/databinding
diff options
context:
space:
mode:
Diffstat (limited to 'gradlePlugin/src/main/java/android/databinding')
-rw-r--r--gradlePlugin/src/main/java/android/databinding/tool/DataBinderPlugin.java421
-rw-r--r--gradlePlugin/src/main/java/android/databinding/tool/DataBindingExportInfoTask.java89
-rw-r--r--gradlePlugin/src/main/java/android/databinding/tool/DataBindingProcessLayoutsTask.java110
3 files changed, 0 insertions, 620 deletions
diff --git a/gradlePlugin/src/main/java/android/databinding/tool/DataBinderPlugin.java b/gradlePlugin/src/main/java/android/databinding/tool/DataBinderPlugin.java
deleted file mode 100644
index 238e360b..00000000
--- a/gradlePlugin/src/main/java/android/databinding/tool/DataBinderPlugin.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * 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 com.android.build.gradle.AppExtension;
-import com.android.build.gradle.BaseExtension;
-import com.android.build.gradle.LibraryExtension;
-import com.android.build.gradle.api.ApplicationVariant;
-import com.android.build.gradle.api.LibraryVariant;
-import com.android.build.gradle.api.TestVariant;
-import com.android.build.gradle.internal.api.ApplicationVariantImpl;
-import com.android.build.gradle.internal.api.LibraryVariantImpl;
-import com.android.build.gradle.internal.api.TestVariantImpl;
-import com.android.build.gradle.internal.core.GradleVariantConfiguration;
-import com.android.build.gradle.internal.variant.ApplicationVariantData;
-import com.android.build.gradle.internal.variant.BaseVariantData;
-import com.android.build.gradle.internal.variant.LibraryVariantData;
-import com.android.build.gradle.internal.variant.TestVariantData;
-import com.android.build.gradle.tasks.ProcessAndroidResources;
-import com.android.builder.model.ApiVersion;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.gradle.api.Action;
-import org.gradle.api.Plugin;
-import org.gradle.api.Project;
-import org.gradle.api.Task;
-import org.gradle.api.logging.LogLevel;
-import org.gradle.api.logging.Logger;
-import org.gradle.api.plugins.ExtraPropertiesExtension;
-import org.gradle.api.tasks.bundling.Jar;
-import org.gradle.api.tasks.compile.AbstractCompile;
-
-import android.databinding.tool.processing.ScopedException;
-import android.databinding.tool.util.L;
-import android.databinding.tool.writer.JavaFileWriter;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Properties;
-
-import javax.tools.Diagnostic;
-import javax.xml.bind.JAXBException;
-
-public class DataBinderPlugin implements Plugin<Project> {
-
- private static final String INVOKED_FROM_IDE_PROPERTY = "android.injected.invoked.from.ide";
- private static final String PRINT_ENCODED_ERRORS_PROPERTY
- = "android.databinding.injected.print.encoded.errors";
- private Logger logger;
- private boolean printEncodedErrors = false;
-
- class GradleFileWriter extends JavaFileWriter {
-
- private final String outputBase;
-
- public GradleFileWriter(String outputBase) {
- this.outputBase = outputBase;
- }
-
- @Override
- public void writeToFile(String canonicalName, String contents) {
- String asPath = canonicalName.replace('.', '/');
- File f = new File(outputBase + "/" + asPath + ".java");
- logD("Asked to write to " + canonicalName + ". outputting to:" +
- f.getAbsolutePath());
- //noinspection ResultOfMethodCallIgnored
- f.getParentFile().mkdirs();
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(f);
- IOUtils.write(contents, fos);
- } catch (IOException e) {
- logE(e, "cannot write file " + f.getAbsolutePath());
- } finally {
- IOUtils.closeQuietly(fos);
- }
- }
- }
-
- private boolean safeGetBooleanProperty(Project project, String property) {
- boolean hasProperty = project.hasProperty(property);
- if (!hasProperty) {
- return false;
- }
- try {
- if (Boolean.parseBoolean(String.valueOf(project.getProperties().get(property)))) {
- return true;
- }
- } catch (Throwable t) {
- L.w("unable to read property %s", project);
- }
- return false;
- }
-
- private boolean resolvePrintEncodedErrors(Project project) {
- return safeGetBooleanProperty(project, INVOKED_FROM_IDE_PROPERTY) ||
- safeGetBooleanProperty(project, PRINT_ENCODED_ERRORS_PROPERTY);
- }
-
- @Override
- public void apply(Project project) {
- if (project == null) {
- return;
- }
- setupLogger(project);
-
- Versions versions = readMyVersion();
- logD("data binding plugin versions are: %s", versions);
- printEncodedErrors = resolvePrintEncodedErrors(project);
- ScopedException.encodeOutput(printEncodedErrors);
- project.getDependencies()
- .add("compile", "com.android.databinding:library:" + versions.getLibraryVersion());
- boolean addAdapters = true;
- if (project.hasProperty("ext")) {
- Object ext = project.getProperties().get("ext");
- if (ext instanceof ExtraPropertiesExtension) {
- ExtraPropertiesExtension propExt = (ExtraPropertiesExtension) ext;
- if (propExt.has("addDataBindingAdapters")) {
- addAdapters = Boolean.valueOf(
- String.valueOf(propExt.get("addDataBindingAdapters")));
- }
- }
- }
- if (addAdapters) {
- project.getDependencies().add("compile",
- "com.android.databinding:adapters:" + versions.getAdaptersVersion());
- }
- project.getDependencies().add("provided",
- "com.android.databinding:compiler:" + versions.getCompilerVersion());
- project.afterEvaluate(new Action<Project>() {
- @Override
- public void execute(Project project) {
- try {
- createXmlProcessor(project);
- } catch (Throwable t) {
- logE(t, "failed to setup data binding");
- }
- }
- });
- }
-
- private void setupLogger(Project project) {
- logger = project.getLogger();
- L.setClient(new L.Client() {
- @Override
- public void printMessage(Diagnostic.Kind kind, String message) {
- if (kind == Diagnostic.Kind.ERROR) {
- logE(null, message);
- } else {
- logD(message);
- }
- }
- });
- }
-
- Versions readMyVersion() {
- try {
- Properties props = new Properties();
- InputStream stream = getClass().getResourceAsStream("/data_binding_build_info.properties");
- try {
- props.load(stream);
- return new Versions(props);
- } finally {
- IOUtils.closeQuietly(stream);
- }
- } catch (IOException exception) {
- logE(exception, "Cannot read data binding version");
- }
- return null;
- }
-
- private void createXmlProcessor(Project project)
- throws NoSuchFieldException, IllegalAccessException {
- L.d("creating xml processor for " + project);
- Object androidExt = project.getExtensions().getByName("android");
- if (!(androidExt instanceof BaseExtension)) {
- return;
- }
- if (androidExt instanceof AppExtension) {
- createXmlProcessorForApp(project, (AppExtension) androidExt);
- } else if (androidExt instanceof LibraryExtension) {
- createXmlProcessorForLibrary(project, (LibraryExtension) androidExt);
- } else {
- logE(new UnsupportedOperationException("cannot understand android ext"),
- "unsupported android extension. What is it? %s", androidExt);
- }
- }
-
- private void createXmlProcessorForLibrary(Project project, LibraryExtension lib)
- throws NoSuchFieldException, IllegalAccessException {
- File sdkDir = lib.getSdkDirectory();
- L.d("create xml processor for " + lib);
- for (TestVariant variant : lib.getTestVariants()) {
- logD("test variant %s. dir name %s", variant, variant.getDirName());
- BaseVariantData variantData = getVariantData(variant);
- attachXmlProcessor(project, variantData, sdkDir, false);//tests extend apk variant
- }
- for (LibraryVariant variant : lib.getLibraryVariants()) {
- logD("library variant %s. dir name %s", variant, variant.getDirName());
- BaseVariantData variantData = getVariantData(variant);
- attachXmlProcessor(project, variantData, sdkDir, true);
- }
- }
-
- private void createXmlProcessorForApp(Project project, AppExtension appExt)
- throws NoSuchFieldException, IllegalAccessException {
- L.d("create xml processor for " + appExt);
- File sdkDir = appExt.getSdkDirectory();
- for (TestVariant testVariant : appExt.getTestVariants()) {
- TestVariantData variantData = getVariantData(testVariant);
- attachXmlProcessor(project, variantData, sdkDir, false);
- }
- for (ApplicationVariant appVariant : appExt.getApplicationVariants()) {
- ApplicationVariantData variantData = getVariantData(appVariant);
- attachXmlProcessor(project, variantData, sdkDir, false);
- }
- }
-
- private LibraryVariantData getVariantData(LibraryVariant variant)
- throws NoSuchFieldException, IllegalAccessException {
- Field field = LibraryVariantImpl.class.getDeclaredField("variantData");
- field.setAccessible(true);
- return (LibraryVariantData) field.get(variant);
- }
-
- private TestVariantData getVariantData(TestVariant variant)
- throws IllegalAccessException, NoSuchFieldException {
- Field field = TestVariantImpl.class.getDeclaredField("variantData");
- field.setAccessible(true);
- return (TestVariantData) field.get(variant);
- }
-
- private ApplicationVariantData getVariantData(ApplicationVariant variant)
- throws IllegalAccessException, NoSuchFieldException {
- Field field = ApplicationVariantImpl.class.getDeclaredField("variantData");
- field.setAccessible(true);
- return (ApplicationVariantData) field.get(variant);
- }
-
- private void attachXmlProcessor(Project project, final BaseVariantData variantData,
- final File sdkDir,
- final Boolean isLibrary) {
- final GradleVariantConfiguration configuration = variantData.getVariantConfiguration();
- final ApiVersion minSdkVersion = configuration.getMinSdkVersion();
- ProcessAndroidResources generateRTask = variantData.generateRClassTask;
- final String packageName = generateRTask.getPackageForR();
- String fullName = configuration.getFullName();
- List<File> resourceFolders = Arrays.asList(variantData.mergeResourcesTask.getOutputDir());
-
- final File codeGenTargetFolder = new File(project.getBuildDir() + "/data-binding-info/" +
- configuration.getDirName());
- String writerOutBase = codeGenTargetFolder.getAbsolutePath();
- JavaFileWriter fileWriter = new GradleFileWriter(writerOutBase);
- final LayoutXmlProcessor xmlProcessor = new LayoutXmlProcessor(packageName, resourceFolders,
- fileWriter, minSdkVersion.getApiLevel(), isLibrary);
- final ProcessAndroidResources processResTask = generateRTask;
- final File xmlOutDir = new File(project.getBuildDir() + "/layout-info/" +
- configuration.getDirName());
- final File generatedClassListOut = isLibrary ? new File(xmlOutDir, "_generated.txt") : null;
- logD("xml output for %s is %s", variantData, xmlOutDir);
- String layoutTaskName = "dataBindingLayouts" + StringUtils
- .capitalize(processResTask.getName());
- String infoClassTaskName = "dataBindingInfoClass" + StringUtils
- .capitalize(processResTask.getName());
-
- final DataBindingProcessLayoutsTask[] processLayoutsTasks
- = new DataBindingProcessLayoutsTask[1];
- project.getTasks().create(layoutTaskName,
- DataBindingProcessLayoutsTask.class,
- new Action<DataBindingProcessLayoutsTask>() {
- @Override
- public void execute(final DataBindingProcessLayoutsTask task) {
- processLayoutsTasks[0] = task;
- task.setXmlProcessor(xmlProcessor);
- task.setSdkDir(sdkDir);
- task.setXmlOutFolder(xmlOutDir);
- task.setMinSdk(minSdkVersion.getApiLevel());
- task.setBlameLogDir(variantData.getScope().getResourceBlameLogDir());
-
- logD("TASK adding dependency on %s for %s", task, processResTask);
- processResTask.dependsOn(task);
- processResTask.getInputs().dir(xmlOutDir);
- for (Object dep : processResTask.getDependsOn()) {
- if (dep == task) {
- continue;
- }
- logD("adding dependency on %s for %s", dep, task);
- task.dependsOn(dep);
- }
- processResTask.doLast(new Action<Task>() {
- @Override
- public void execute(Task unused) {
- try {
- task.writeLayoutXmls();
- } catch (JAXBException e) {
- // gradle sometimes fails to resolve JAXBException.
- // We get stack trace manually to ensure we have the log
- logE(e, "cannot write layout xmls %s",
- ExceptionUtils.getStackTrace(e));
- }
- }
- });
- }
- });
- final DataBindingProcessLayoutsTask processLayoutsTask = processLayoutsTasks[0];
- project.getTasks().create(infoClassTaskName,
- DataBindingExportInfoTask.class,
- new Action<DataBindingExportInfoTask>() {
-
- @Override
- public void execute(DataBindingExportInfoTask task) {
- task.dependsOn(processLayoutsTask);
- task.dependsOn(processResTask);
- task.setXmlProcessor(xmlProcessor);
- task.setSdkDir(sdkDir);
- task.setXmlOutFolder(xmlOutDir);
- task.setExportClassListTo(generatedClassListOut);
- task.setPrintEncodedErrors(printEncodedErrors);
- task.setEnableDebugLogs(logger.isEnabled(LogLevel.DEBUG));
-
- variantData.registerJavaGeneratingTask(task, codeGenTargetFolder);
- }
- });
- String packageJarTaskName = "package" + StringUtils.capitalize(fullName) + "ClassesJar";
- final Task packageTask = project.getTasks().findByName(packageJarTaskName);
- if (packageTask instanceof Jar) {
- String removeGeneratedTaskName = "dataBindingExcludeGeneratedFrom" +
- StringUtils.capitalize(packageTask.getName());
- if (project.getTasks().findByName(removeGeneratedTaskName) == null) {
- final AbstractCompile javaCompileTask = variantData.javacTask;
- Preconditions.checkNotNull(javaCompileTask);
-
- project.getTasks().create(removeGeneratedTaskName,
- DataBindingExcludeGeneratedTask.class,
- new Action<DataBindingExcludeGeneratedTask>() {
- @Override
- public void execute(DataBindingExcludeGeneratedTask task) {
- packageTask.dependsOn(task);
- task.dependsOn(javaCompileTask);
- task.setAppPackage(packageName);
- task.setInfoClassQualifiedName(xmlProcessor.getInfoClassFullName());
- task.setPackageTask((Jar) packageTask);
- task.setLibrary(isLibrary);
- task.setGeneratedClassListFile(generatedClassListOut);
- }
- });
- }
- }
- }
-
- private void logD(String s, Object... args) {
- logger.info(formatLog(s, args));
- }
-
- private void logE(Throwable t, String s, Object... args) {
- logger.error(formatLog(s, args), t);
- }
-
- private String formatLog(String s, Object... args) {
- return "[data binding plugin]: " + String.format(s, args);
- }
-
- private class Versions {
-
- Properties properties;
- String myVersion;
-
- public Versions(Properties properties) {
- this.properties = properties;
- myVersion = properties.getProperty("myVersion");
- if (myVersion == null) {
- throw new IllegalStateException("cannot read data binding plugin version");
- }
- }
-
- public String getCompilerVersion() {
- return properties.getProperty("compiler", myVersion);
- }
-
- public String getAdaptersVersion() {
- return properties.getProperty("adapters", myVersion);
- }
-
- public String getLibraryVersion() {
- return properties.getProperty("library", myVersion);
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("[Data Binding Versions:");
- sb.append(" plugin:").append(myVersion);
- sb.append(" compiler:").append(getCompilerVersion());
- sb.append(" adapters:").append(getAdaptersVersion());
- sb.append(" library:").append(getLibraryVersion());
- return sb.append("]").toString();
- }
- }
-}
diff --git a/gradlePlugin/src/main/java/android/databinding/tool/DataBindingExportInfoTask.java b/gradlePlugin/src/main/java/android/databinding/tool/DataBindingExportInfoTask.java
deleted file mode 100644
index 768fe68a..00000000
--- a/gradlePlugin/src/main/java/android/databinding/tool/DataBindingExportInfoTask.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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 org.gradle.api.DefaultTask;
-import org.gradle.api.tasks.TaskAction;
-
-import android.databinding.tool.processing.Scope;
-
-import java.io.File;
-
-/**
- * Task to pass environment info to javac
- */
-public class DataBindingExportInfoTask extends DefaultTask {
- private LayoutXmlProcessor xmlProcessor;
- private File sdkDir;
- private File xmlOutFolder;
- private File exportClassListTo;
- private boolean printEncodedErrors;
- private boolean enableDebugLogs = false;
- @TaskAction
- public void exportInfo() {
- xmlProcessor.writeInfoClass(sdkDir, xmlOutFolder, exportClassListTo, enableDebugLogs,
- printEncodedErrors);
- Scope.assertNoError();
- }
-
- public LayoutXmlProcessor getXmlProcessor() {
- return xmlProcessor;
- }
-
- public void setXmlProcessor(LayoutXmlProcessor xmlProcessor) {
- this.xmlProcessor = xmlProcessor;
- }
-
- public File getSdkDir() {
- return sdkDir;
- }
-
- public void setSdkDir(File sdkDir) {
- this.sdkDir = sdkDir;
- }
-
- public File getXmlOutFolder() {
- return xmlOutFolder;
- }
-
- public void setXmlOutFolder(File xmlOutFolder) {
- this.xmlOutFolder = xmlOutFolder;
- }
-
- public File getExportClassListTo() {
- return exportClassListTo;
- }
-
- public void setExportClassListTo(File exportClassListTo) {
- this.exportClassListTo = exportClassListTo;
- }
-
- public boolean isPrintEncodedErrors() {
- return printEncodedErrors;
- }
-
- public void setPrintEncodedErrors(boolean printEncodedErrors) {
- this.printEncodedErrors = printEncodedErrors;
- }
-
- public boolean isEnableDebugLogs() {
- return enableDebugLogs;
- }
-
- public void setEnableDebugLogs(boolean enableDebugLogs) {
- this.enableDebugLogs = enableDebugLogs;
- }
-} \ No newline at end of file
diff --git a/gradlePlugin/src/main/java/android/databinding/tool/DataBindingProcessLayoutsTask.java b/gradlePlugin/src/main/java/android/databinding/tool/DataBindingProcessLayoutsTask.java
deleted file mode 100644
index 1e6906bc..00000000
--- a/gradlePlugin/src/main/java/android/databinding/tool/DataBindingProcessLayoutsTask.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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.android.ide.common.blame.MergingLog;
-import com.android.ide.common.blame.SourceFile;
-
-import android.databinding.tool.processing.Scope;
-import android.databinding.tool.util.L;
-
-import org.gradle.api.DefaultTask;
-import org.gradle.api.tasks.TaskAction;
-import org.xml.sax.SAXException;
-import java.io.File;
-import java.io.IOException;
-
-import javax.xml.bind.JAXBException;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.xpath.XPathExpressionException;
-
-/**
- * Task that parses xml files and generated metadata.
- * Will be removed when aapt supports binding tags.
- */
-public class DataBindingProcessLayoutsTask extends DefaultTask {
-
- private LayoutXmlProcessor xmlProcessor;
-
- private File sdkDir;
-
- private File xmlOutFolder;
-
- private int minSdk;
- private File mBlameLogDir;
-
- @TaskAction
- public void processResources()
- throws ParserConfigurationException, SAXException, XPathExpressionException,
- IOException {
- L.d("running process layouts task %s", getName());
- if (mBlameLogDir != null) {
- final MergingLog mergingLog = new MergingLog(mBlameLogDir);
- xmlProcessor.setOriginalFileLookup(new LayoutXmlProcessor.OriginalFileLookup() {
- @Override
- public File getOriginalFileFor(File file) {
- SourceFile input = new SourceFile(file);
- SourceFile original = mergingLog.find(input);
- // merged log api returns the file back if original cannot be found.
- // it is not what we want so we alter the response.
- return original == input ? null : original.getSourceFile();
- }
- });
- }
- xmlProcessor.processResources(minSdk);
- Scope.assertNoError();
- }
-
- public void writeLayoutXmls() throws JAXBException {
- xmlProcessor.writeLayoutInfoFiles(xmlOutFolder);
- }
-
- public LayoutXmlProcessor getXmlProcessor() {
- return xmlProcessor;
- }
-
- public void setXmlProcessor(LayoutXmlProcessor xmlProcessor) {
- this.xmlProcessor = xmlProcessor;
- }
-
- public File getSdkDir() {
- return sdkDir;
- }
-
- public void setSdkDir(File sdkDir) {
- this.sdkDir = sdkDir;
- }
-
- public File getXmlOutFolder() {
- return xmlOutFolder;
- }
-
- public void setXmlOutFolder(File xmlOutFolder) {
- this.xmlOutFolder = xmlOutFolder;
- }
-
- public int getMinSdk() {
- return minSdk;
- }
-
- public void setMinSdk(int minSdk) {
- this.minSdk = minSdk;
- }
-
- public void setBlameLogDir(File blameLogDir) {
- mBlameLogDir = blameLogDir;
- }
-}