blob: 76f5b40bdcd1c392615643e4f7f26958a2fa7b6c [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Foundation
*
* 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 org.onosproject.onosjar;
import com.facebook.buck.cli.BuckConfig;
import com.facebook.buck.jvm.java.CalculateAbi;
import com.facebook.buck.jvm.java.DefaultJavaLibrary;
import com.facebook.buck.jvm.java.JavaBuckConfig;
import com.facebook.buck.jvm.java.JavaLibrary;
import com.facebook.buck.jvm.java.JavaLibraryDescription;
import com.facebook.buck.jvm.java.JavaOptions;
import com.facebook.buck.jvm.java.JavaSourceJar;
import com.facebook.buck.jvm.java.JavacOptions;
import com.facebook.buck.jvm.java.JavacOptionsAmender;
import com.facebook.buck.jvm.java.JavacOptionsFactory;
import com.facebook.buck.jvm.java.JavacToJarStepFactory;
import com.facebook.buck.jvm.java.JavadocJar;
import com.facebook.buck.jvm.java.MavenUberJar;
import com.facebook.buck.maven.AetherUtil;
import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.model.Flavor;
import com.facebook.buck.model.Flavored;
import com.facebook.buck.model.ImmutableFlavor;
import com.facebook.buck.parser.NoSuchBuildTargetException;
import com.facebook.buck.rules.BuildRule;
import com.facebook.buck.rules.BuildRuleParams;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.BuildRuleType;
import com.facebook.buck.rules.BuildRules;
import com.facebook.buck.rules.BuildTargetSourcePath;
import com.facebook.buck.rules.Description;
import com.facebook.buck.rules.SourcePath;
import com.facebook.buck.rules.SourcePathResolver;
import com.facebook.buck.rules.SourcePaths;
import com.facebook.buck.rules.TargetGraph;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import java.nio.file.Path;
import java.util.List;
import static com.facebook.buck.jvm.common.ResourceValidator.validateResources;
/**
* Description for the onos_jar rules.
*
* Currently, this only does Swagger generation.
*/
public class OnosJarDescription implements Description<OnosJarDescription.Arg>, Flavored {
public static final BuildRuleType TYPE = BuildRuleType.of("onos_jar");
public static final Flavor NON_OSGI_JAR = ImmutableFlavor.of("non-osgi");
public static final ImmutableSet<Flavor> SUPPORTED_FLAVORS = ImmutableSet.of(
JavaLibrary.SRC_JAR,
JavaLibrary.MAVEN_JAR,
JavaLibrary.JAVADOC_JAR,
NON_OSGI_JAR);
private final JavacOptions defaultJavacOptions;
private final JavaOptions defaultJavaOptions;
public OnosJarDescription(BuckConfig config) {
JavaBuckConfig javaConfig = new JavaBuckConfig(config);
defaultJavacOptions = javaConfig.getDefaultJavacOptions();
defaultJavaOptions = javaConfig.getDefaultJavaOptions();
}
@Override
public BuildRuleType getBuildRuleType() {
return TYPE;
}
@Override
public Arg createUnpopulatedConstructorArg() {
return new Arg();
}
@Override
public <A extends Arg> BuildRule createBuildRule(TargetGraph targetGraph,
BuildRuleParams params,
BuildRuleResolver resolver,
A args)
throws NoSuchBuildTargetException {
SourcePathResolver pathResolver = new SourcePathResolver(resolver);
BuildTarget target = params.getBuildTarget();
// We know that the flavour we're being asked to create is valid, since the check is done when
// creating the action graph from the target graph.
ImmutableSortedSet<Flavor> flavors = target.getFlavors();
BuildRuleParams paramsWithMavenFlavor = null;
if (flavors.contains(JavaLibrary.MAVEN_JAR)) {
paramsWithMavenFlavor = params;
// Maven rules will depend upon their vanilla versions, so the latter have to be constructed
// without the maven flavor to prevent output-path conflict
params = params.copyWithBuildTarget(
params.getBuildTarget().withoutFlavors(ImmutableSet.of(JavaLibrary.MAVEN_JAR)));
}
if (flavors.contains(JavaLibrary.SRC_JAR)) {
args.mavenCoords = args.mavenCoords.transform(
new Function<String, String>() {
@Override
public String apply(String input) {
return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_SOURCES);
}
});
if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
return new JavaSourceJar(
params,
pathResolver,
args.srcs.get(),
args.mavenCoords);
} else {
return MavenUberJar.SourceJar.create(
Preconditions.checkNotNull(paramsWithMavenFlavor),
pathResolver,
args.srcs.get(),
args.mavenCoords,
Optional.absent()); //FIXME
}
}
if (flavors.contains(JavaLibrary.JAVADOC_JAR)) {
args.mavenCoords = args.mavenCoords.transform(
new Function<String, String>() {
@Override
public String apply(String input) {
return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_JAVADOC);
}
});
JavadocJar.JavadocArgs.Builder javadocArgs = JavadocJar.JavadocArgs.builder()
.addArg("-windowtitle", target.getShortName())
.addArg("-link", "http://docs.oracle.com/javase/8/docs/api")
.addArg("-tag", "onos.rsModel:a:\"onos model\""); //FIXME from buckconfig + rule
final ImmutableSortedMap.Builder<SourcePath, Path> javadocFiles = ImmutableSortedMap.naturalOrder();
if (args.javadocFiles.isPresent()) {
for (SourcePath path : args.javadocFiles.get()) {
javadocFiles.put(path,
JavadocJar.getDocfileWithPath(pathResolver, path, args.javadocFilesRoot.orNull()));
}
}
if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
return new JavadocJar(
params,
pathResolver,
args.srcs.get(),
javadocFiles.build(),
javadocArgs.build(),
args.mavenCoords);
} else {
return MavenUberJar.MavenJavadocJar.create(
Preconditions.checkNotNull(paramsWithMavenFlavor),
pathResolver,
args.srcs.get(),
javadocFiles.build(),
javadocArgs.build(),
args.mavenCoords,
Optional.absent()); //FIXME
}
}
JavacOptions javacOptions = JavacOptionsFactory.create(
defaultJavacOptions,
params,
resolver,
pathResolver,
args
);
BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR);
ImmutableSortedSet<BuildRule> exportedDeps = resolver.getAllRules(args.exportedDeps.get());
// Build the resources string
List<String> resourceMappings = Lists.newArrayList();
if (args.includeResources.isPresent()) {
args.includeResources.get().entrySet().forEach(p ->
resourceMappings.add(String.format("%s=%s", p.getKey(), p.getValue())));
}
if (args.apiTitle.isPresent()) {
resourceMappings.add("WEB-INF/classes/apidoc/swagger.json=swagger.json");
}
Optional<String> includedResourcesString = Optional.of(String.join(",", resourceMappings));
final DefaultJavaLibrary defaultJavaLibrary;
if (!flavors.contains(NON_OSGI_JAR)) {
defaultJavaLibrary =
resolver.addToIndex(
new OnosJar(
params.appendExtraDeps(
Iterables.concat(
BuildRules.getExportedRules(
Iterables.concat(
params.getDeclaredDeps().get(),
exportedDeps,
resolver.getAllRules(args.providedDeps.get()))),
pathResolver.filterBuildRuleInputs(
javacOptions.getInputs(pathResolver)))),
pathResolver,
args.srcs.get(),
validateResources(
pathResolver,
params.getProjectFilesystem(),
args.resources.get()),
javacOptions.getGeneratedSourceFolderName(),
args.proguardConfig.transform(
SourcePaths.toSourcePath(params.getProjectFilesystem())),
args.postprocessClassesCommands.get(), // FIXME this should be forbidden
exportedDeps,
resolver.getAllRules(args.providedDeps.get()),
new BuildTargetSourcePath(abiJarTarget),
javacOptions.trackClassUsage(),
/* additionalClasspathEntries */ ImmutableSet.<Path>of(),
new OnosJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY,
args.webContext, args.apiTitle, args.apiVersion,
args.apiPackage, args.apiDescription, args.resources,
args.groupId, args.bundleName, args.bundleVersion,
args.bundleLicense, args.bundleDescription, args.importPackages,
args.exportPackages, includedResourcesString,
args.dynamicimportPackages, args.privatePackages, args.embeddedDependencies),
args.resourcesRoot,
args.manifestFile,
args.mavenCoords,
args.tests.get(),
javacOptions.getClassesToRemoveFromJar(),
args.webContext,
args.apiTitle,
args.apiVersion,
args.apiPackage,
args.apiDescription,
args.includeResources));
} else {
defaultJavaLibrary =
resolver.addToIndex(
new DefaultJavaLibrary(
params.appendExtraDeps(
Iterables.concat(
BuildRules.getExportedRules(
Iterables.concat(
params.getDeclaredDeps().get(),
exportedDeps,
resolver.getAllRules(args.providedDeps.get()))),
pathResolver.filterBuildRuleInputs(
javacOptions.getInputs(pathResolver)))),
pathResolver,
args.srcs.get(),
validateResources(
pathResolver,
params.getProjectFilesystem(),
args.resources.get()),
javacOptions.getGeneratedSourceFolderName(),
args.proguardConfig.transform(
SourcePaths.toSourcePath(params.getProjectFilesystem())),
args.postprocessClassesCommands.get(),
exportedDeps,
resolver.getAllRules(args.providedDeps.get()),
new BuildTargetSourcePath(abiJarTarget),
javacOptions.trackClassUsage(),
/* additionalClasspathEntries */ ImmutableSet.<Path>of(),
new JavacToJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY),
args.resourcesRoot,
args.manifestFile,
args.mavenCoords,
args.tests.get(),
javacOptions.getClassesToRemoveFromJar()));
}
resolver.addToIndex(
CalculateAbi.of(
abiJarTarget,
pathResolver,
params,
new BuildTargetSourcePath(defaultJavaLibrary.getBuildTarget())));
return defaultJavaLibrary;
}
@Override
public boolean hasFlavors(ImmutableSet<Flavor> flavors) {
return SUPPORTED_FLAVORS.containsAll(flavors);
}
public static class Arg extends JavaLibraryDescription.Arg {
public Optional<String> webContext;
public Optional<String> apiTitle;
public Optional<String> apiVersion;
public Optional<String> apiPackage;
public Optional<String> apiDescription;
public Optional<String> groupId;
public Optional<String> bundleName;
public Optional<String> bundleVersion;
public Optional<String> bundleLicense;
public Optional<String> bundleDescription;
public Optional<String> importPackages;
public Optional<String> privatePackages;
public Optional<String> exportPackages;
public Optional<ImmutableSortedMap<String, SourcePath>> includeResources;
public Optional<String> dynamicimportPackages;
public Optional<String> embeddedDependencies;
}
}