Java tutorial
/* * Copyright 2014-present Facebook, Inc. * * 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.facebook.buck.jvm.java; import com.facebook.buck.model.BuildTarget; import com.facebook.buck.model.BuildTargets; import com.facebook.buck.model.UnflavoredBuildTarget; import com.facebook.buck.parser.NoSuchBuildTargetException; import com.facebook.buck.rules.AbstractBuildRuleWithResolver; import com.facebook.buck.rules.AbstractDescriptionArg; import com.facebook.buck.rules.AddToRuleKey; import com.facebook.buck.rules.BuildContext; import com.facebook.buck.rules.BuildRule; import com.facebook.buck.rules.BuildRuleParams; import com.facebook.buck.rules.BuildRuleResolver; import com.facebook.buck.rules.BuildableContext; import com.facebook.buck.rules.Description; import com.facebook.buck.rules.SourcePath; import com.facebook.buck.rules.SourcePathResolver; import com.facebook.buck.rules.SourcePathRuleFinder; import com.facebook.buck.rules.TargetGraph; import com.facebook.buck.step.Step; import com.facebook.buck.step.fs.CopyStep; import com.facebook.buck.step.fs.MakeCleanDirectoryStep; import com.facebook.infer.annotation.SuppressFieldNotInitialized; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedSet; import java.nio.file.Path; import java.util.Optional; public class PrebuiltJarDescription implements Description<PrebuiltJarDescription.Arg> { @Override public Arg createUnpopulatedConstructorArg() { return new Arg(); } @Override public <A extends Arg> BuildRule createBuildRule(TargetGraph targetGraph, BuildRuleParams params, BuildRuleResolver resolver, A args) throws NoSuchBuildTargetException { SourcePathRuleFinder ruleFinder = new SourcePathRuleFinder(resolver); if (params.getBuildTarget().getFlavors().contains(CalculateAbi.FLAVOR)) { return CalculateAbi.of(params.getBuildTarget(), ruleFinder, params, args.binaryJar); } SourcePathResolver pathResolver = new SourcePathResolver(ruleFinder); BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR); BuildRule prebuilt = new PrebuiltJar(params, pathResolver, args.binaryJar, abiJarTarget, args.sourceJar, args.gwtJar, args.javadocUrl, args.mavenCoords, args.provided.orElse(false)); UnflavoredBuildTarget prebuiltJarBuildTarget = params.getBuildTarget().checkUnflavored(); BuildTarget flavoredBuildTarget = BuildTargets.createFlavoredBuildTarget(prebuiltJarBuildTarget, JavaLibrary.GWT_MODULE_FLAVOR); BuildRuleParams gwtParams = params.copyWithChanges(flavoredBuildTarget, /* declaredDeps */ Suppliers.ofInstance(ImmutableSortedSet.of(prebuilt)), /* inferredDeps */ Suppliers.ofInstance(ImmutableSortedSet.of())); BuildRule gwtModule = createGwtModule(gwtParams, pathResolver, args); resolver.addToIndex(gwtModule); return prebuilt; } @VisibleForTesting static BuildRule createGwtModule(BuildRuleParams params, SourcePathResolver resolver, Arg arg) { // Because a PrebuiltJar rarely requires any building whatsoever (it could if the source_jar // is a BuildTargetSourcePath), we make the PrebuiltJar a dependency of the GWT module. If this // becomes a performance issue in practice, then we will explore reducing the dependencies of // the GWT module. final SourcePath input; if (arg.gwtJar.isPresent()) { input = arg.gwtJar.get(); } else if (arg.sourceJar.isPresent()) { input = arg.sourceJar.get(); } else { input = arg.binaryJar; } class ExistingOuputs extends AbstractBuildRuleWithResolver { @AddToRuleKey private final SourcePath source; private final Path output; protected ExistingOuputs(BuildRuleParams params, SourcePathResolver resolver, SourcePath source) { super(params, resolver); this.source = source; BuildTarget target = params.getBuildTarget(); this.output = BuildTargets.getGenPath(getProjectFilesystem(), target, String.format("%s/%%s-gwt.jar", target.getShortName())); } @Override public ImmutableList<Step> getBuildSteps(BuildContext context, BuildableContext buildableContext) { buildableContext.recordArtifact(getPathToOutput()); ImmutableList.Builder<Step> steps = ImmutableList.builder(); steps.add(new MakeCleanDirectoryStep(getProjectFilesystem(), output.getParent())); steps.add(CopyStep.forFile(getProjectFilesystem(), getResolver().getAbsolutePath(source), output)); return steps.build(); } @Override public Path getPathToOutput() { return output; } } return new ExistingOuputs(params, resolver, input); } @SuppressFieldNotInitialized public static class Arg extends AbstractDescriptionArg { public SourcePath binaryJar; public Optional<SourcePath> sourceJar; public Optional<SourcePath> gwtJar; public Optional<String> javadocUrl; public Optional<String> mavenCoords; public Optional<Boolean> provided; public ImmutableSortedSet<BuildTarget> deps = ImmutableSortedSet.of(); } }