blob: 3955a9946b3eab3443cf119bc997369dec51fe4e [file] [log] [blame]
// Copyright 2018 The Bazel Authors. All rights reserved.
//
// 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.google.devtools.build.android;
import android.databinding.AndroidDataBinding;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Streams;
import com.google.devtools.build.android.AndroidResourceProcessor.AaptConfigOptions;
import com.google.devtools.build.android.Converters.PathConverter;
import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionDocumentationCategory;
import com.google.devtools.common.options.OptionEffectTag;
import com.google.devtools.common.options.OptionsBase;
import com.google.devtools.common.options.OptionsParser;
import com.google.devtools.common.options.ShellQuotedParamsFilePreProcessor;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/** Generates databinding base classes for an Android target. */
public final class GenerateDatabindingBaseClassesAction {
/** Options for GenerateDatabindingBaseClassesAction. */
public static final class Options extends OptionsBase {
@Option(
name = "layoutInfoFiles",
defaultValue = "null",
converter = PathConverter.class,
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Path to layout-info.zip file produced by databinding processor")
public Path layoutInfoFile;
@Option(
name = "package",
defaultValue = "null",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Package name of the android target")
public String packageName;
@Option(
name = "classInfoOut",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
defaultValue = "null",
converter = PathConverter.class,
category = "output",
help = "Path to write classInfo.zip file")
public Path classInfoOut;
@Option(
name = "sourceOut",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
defaultValue = "null",
converter = PathConverter.class,
category = "output",
help = "Path to write databinding base classes to be used in Java compilation")
public Path sourceOut;
@Option(
name = "dependencyClassInfoList",
defaultValue = "null",
converter = PathConverter.class,
allowMultiple = true,
category = "input",
documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
effectTags = {OptionEffectTag.UNKNOWN},
help = "List of dependency class info zip files")
public List<Path> dependencyClassInfoList;
}
static final Logger logger =
Logger.getLogger(GenerateDatabindingBaseClassesAction.class.getName());
public static void main(String[] args) throws Exception {
final OptionsParser optionsParser =
OptionsParser.builder()
.allowResidue(true)
.optionsClasses(
Options.class, AaptConfigOptions.class, ResourceProcessorCommonOptions.class)
.argsPreProcessor(new ShellQuotedParamsFilePreProcessor(FileSystems.getDefault()))
.build();
optionsParser.parseAndExitUponError(args);
final Options options = optionsParser.getOptions(Options.class);
final AaptConfigOptions aaptConfigOptions = optionsParser.getOptions(AaptConfigOptions.class);
if (options.layoutInfoFile == null) {
throw new IllegalArgumentException("--layoutInfoFiles is required");
}
if (options.packageName == null) {
throw new IllegalArgumentException("--packageName is required");
}
if (options.classInfoOut == null) {
throw new IllegalArgumentException("--classInfoOut is required");
}
if (options.sourceOut == null) {
throw new IllegalArgumentException("--sourceOut is required");
}
final List<Path> dependencyClassInfoList =
options.dependencyClassInfoList == null
? ImmutableList.of()
: options.dependencyClassInfoList;
final ImmutableList.Builder<String> dbArgsBuilder =
ImmutableList.<String>builder()
.add("GEN_BASE_CLASSES")
.add("-layoutInfoFiles")
.add(options.layoutInfoFile.toString())
.add("-package", options.packageName)
.add("-classInfoOut")
.add(options.classInfoOut.toString())
.add("-sourceOut")
.add(options.sourceOut.toString())
.add("-zipSourceOutput")
.add("true")
.add("-useAndroidX")
.add(Boolean.toString(aaptConfigOptions.useDataBindingAndroidX));
dependencyClassInfoList.forEach(
classInfo -> dbArgsBuilder.add("-dependencyClassInfoList").add(classInfo.toString()));
try {
AndroidDataBinding.main(
Streams.mapWithIndex(
dbArgsBuilder.build().stream(), (arg, index) -> index == 0 ? arg : arg + " ")
.toArray(String[]::new));
} catch (RuntimeException e) {
logger.log(Level.SEVERE, "Unexpected", e);
throw e;
}
}
private GenerateDatabindingBaseClassesAction() {}
}