blob: 6ba61cf34ce53196243de0c6be8ab33632784410 [file] [log] [blame]
Brian O'Connore8468b52016-07-25 13:42:36 -07001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.onosjar;
17
18import com.facebook.buck.cli.BuckConfig;
19import com.facebook.buck.jvm.java.CalculateAbi;
20import com.facebook.buck.jvm.java.DefaultJavaLibrary;
21import com.facebook.buck.jvm.java.JavaBuckConfig;
Brian O'Connoree674952016-09-13 16:31:45 -070022import com.facebook.buck.jvm.java.JavaLibrary;
Brian O'Connore8468b52016-07-25 13:42:36 -070023import com.facebook.buck.jvm.java.JavaLibraryDescription;
24import com.facebook.buck.jvm.java.JavaOptions;
Brian O'Connoree674952016-09-13 16:31:45 -070025import com.facebook.buck.jvm.java.JavaSourceJar;
Brian O'Connore8468b52016-07-25 13:42:36 -070026import com.facebook.buck.jvm.java.JavacOptions;
27import com.facebook.buck.jvm.java.JavacOptionsAmender;
28import com.facebook.buck.jvm.java.JavacOptionsFactory;
Brian O'Connoree674952016-09-13 16:31:45 -070029import com.facebook.buck.jvm.java.JavacToJarStepFactory;
30import com.facebook.buck.jvm.java.JavadocJar;
31import com.facebook.buck.jvm.java.MavenUberJar;
32import com.facebook.buck.maven.AetherUtil;
Brian O'Connore8468b52016-07-25 13:42:36 -070033import com.facebook.buck.model.BuildTarget;
34import com.facebook.buck.model.Flavor;
Brian O'Connoree674952016-09-13 16:31:45 -070035import com.facebook.buck.model.Flavored;
36import com.facebook.buck.model.ImmutableFlavor;
Brian O'Connor79b70672016-10-20 13:44:52 -070037import com.facebook.buck.model.Pair;
Brian O'Connore8468b52016-07-25 13:42:36 -070038import com.facebook.buck.parser.NoSuchBuildTargetException;
39import com.facebook.buck.rules.BuildRule;
40import com.facebook.buck.rules.BuildRuleParams;
41import com.facebook.buck.rules.BuildRuleResolver;
42import com.facebook.buck.rules.BuildRuleType;
43import com.facebook.buck.rules.BuildRules;
44import com.facebook.buck.rules.BuildTargetSourcePath;
45import com.facebook.buck.rules.Description;
Brian O'Connor3d59f712016-10-05 21:42:36 -070046import com.facebook.buck.rules.SourcePath;
Brian O'Connore8468b52016-07-25 13:42:36 -070047import com.facebook.buck.rules.SourcePathResolver;
48import com.facebook.buck.rules.SourcePaths;
49import com.facebook.buck.rules.TargetGraph;
Brian O'Connoree674952016-09-13 16:31:45 -070050import com.google.common.base.Function;
Brian O'Connore8468b52016-07-25 13:42:36 -070051import com.google.common.base.Optional;
Brian O'Connoree674952016-09-13 16:31:45 -070052import com.google.common.base.Preconditions;
Brian O'Connore8468b52016-07-25 13:42:36 -070053import com.google.common.collect.ImmutableSet;
Brian O'Connor3d59f712016-10-05 21:42:36 -070054import com.google.common.collect.ImmutableSortedMap;
Brian O'Connore8468b52016-07-25 13:42:36 -070055import com.google.common.collect.ImmutableSortedSet;
56import com.google.common.collect.Iterables;
Brian O'Connor79b70672016-10-20 13:44:52 -070057import com.google.common.collect.Lists;
Brian O'Connore8468b52016-07-25 13:42:36 -070058
59import java.nio.file.Path;
Brian O'Connor79b70672016-10-20 13:44:52 -070060import java.util.List;
61import java.util.function.BinaryOperator;
62import java.util.stream.Collectors;
Brian O'Connore8468b52016-07-25 13:42:36 -070063
64import static com.facebook.buck.jvm.common.ResourceValidator.validateResources;
65
66/**
67 * Description for the onos_jar rules.
68 *
69 * Currently, this only does Swagger generation.
70 */
Brian O'Connoree674952016-09-13 16:31:45 -070071public class OnosJarDescription implements Description<OnosJarDescription.Arg>, Flavored {
Brian O'Connore8468b52016-07-25 13:42:36 -070072 public static final BuildRuleType TYPE = BuildRuleType.of("onos_jar");
Brian O'Connoree674952016-09-13 16:31:45 -070073 public static final Flavor NON_OSGI_JAR = ImmutableFlavor.of("non-osgi");
74
75 public static final ImmutableSet<Flavor> SUPPORTED_FLAVORS = ImmutableSet.of(
76 JavaLibrary.SRC_JAR,
77 JavaLibrary.MAVEN_JAR,
78 JavaLibrary.JAVADOC_JAR,
79 NON_OSGI_JAR);
80
Brian O'Connore8468b52016-07-25 13:42:36 -070081 private final JavacOptions defaultJavacOptions;
82 private final JavaOptions defaultJavaOptions;
83
84 public OnosJarDescription(BuckConfig config) {
85 JavaBuckConfig javaConfig = new JavaBuckConfig(config);
86 defaultJavacOptions = javaConfig.getDefaultJavacOptions();
87 defaultJavaOptions = javaConfig.getDefaultJavaOptions();
88 }
89
90 @Override
91 public BuildRuleType getBuildRuleType() {
92 return TYPE;
93 }
94
95 @Override
96 public Arg createUnpopulatedConstructorArg() {
97 return new Arg();
98 }
99
100 @Override
101 public <A extends Arg> BuildRule createBuildRule(TargetGraph targetGraph,
102 BuildRuleParams params,
103 BuildRuleResolver resolver,
104 A args)
105 throws NoSuchBuildTargetException {
106
107
108 SourcePathResolver pathResolver = new SourcePathResolver(resolver);
109 BuildTarget target = params.getBuildTarget();
110
111 // We know that the flavour we're being asked to create is valid, since the check is done when
112 // creating the action graph from the target graph.
113
114 ImmutableSortedSet<Flavor> flavors = target.getFlavors();
115 BuildRuleParams paramsWithMavenFlavor = null;
116
Brian O'Connoree674952016-09-13 16:31:45 -0700117 if (flavors.contains(JavaLibrary.MAVEN_JAR)) {
118 paramsWithMavenFlavor = params;
119
120 // Maven rules will depend upon their vanilla versions, so the latter have to be constructed
121 // without the maven flavor to prevent output-path conflict
122 params = params.copyWithBuildTarget(
123 params.getBuildTarget().withoutFlavors(ImmutableSet.of(JavaLibrary.MAVEN_JAR)));
124 }
125
126 if (flavors.contains(JavaLibrary.SRC_JAR)) {
127 args.mavenCoords = args.mavenCoords.transform(
128 new Function<String, String>() {
129 @Override
130 public String apply(String input) {
131 return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_SOURCES);
132 }
133 });
134
135 if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
136 return new JavaSourceJar(
137 params,
138 pathResolver,
139 args.srcs.get(),
140 args.mavenCoords);
141 } else {
142 return MavenUberJar.SourceJar.create(
143 Preconditions.checkNotNull(paramsWithMavenFlavor),
144 pathResolver,
145 args.srcs.get(),
Brian O'Connor69e37d92016-10-12 15:05:09 -0700146 args.mavenCoords,
147 Optional.absent()); //FIXME
Brian O'Connoree674952016-09-13 16:31:45 -0700148 }
149 }
150
151 if (flavors.contains(JavaLibrary.JAVADOC_JAR)) {
152 args.mavenCoords = args.mavenCoords.transform(
153 new Function<String, String>() {
154 @Override
155 public String apply(String input) {
156 return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_JAVADOC);
157 }
158 });
159
Brian O'Connor3d59f712016-10-05 21:42:36 -0700160 JavadocJar.JavadocArgs.Builder javadocArgs = JavadocJar.JavadocArgs.builder()
161 .addArg("-windowtitle", target.getShortName())
162 .addArg("-link", "http://docs.oracle.com/javase/8/docs/api")
163 .addArg("-tag", "onos.rsModel:a:\"onos model\""); //FIXME from buckconfig + rule
164
165 final ImmutableSortedMap.Builder<SourcePath, Path> javadocFiles = ImmutableSortedMap.naturalOrder();
166 if (args.javadocFiles.isPresent()) {
167 for (SourcePath path : args.javadocFiles.get()) {
168 javadocFiles.put(path,
169 JavadocJar.getDocfileWithPath(pathResolver, path, args.javadocFilesRoot.orNull()));
170 }
171 }
172
173
Brian O'Connoree674952016-09-13 16:31:45 -0700174 if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
175 return new JavadocJar(
176 params,
177 pathResolver,
178 args.srcs.get(),
Brian O'Connor3d59f712016-10-05 21:42:36 -0700179 javadocFiles.build(),
180 javadocArgs.build(),
Brian O'Connoree674952016-09-13 16:31:45 -0700181 args.mavenCoords);
182 } else {
183 return MavenUberJar.MavenJavadocJar.create(
184 Preconditions.checkNotNull(paramsWithMavenFlavor),
185 pathResolver,
186 args.srcs.get(),
Brian O'Connor3d59f712016-10-05 21:42:36 -0700187 javadocFiles.build(),
188 javadocArgs.build(),
Brian O'Connor69e37d92016-10-12 15:05:09 -0700189 args.mavenCoords,
190 Optional.absent()); //FIXME
Brian O'Connoree674952016-09-13 16:31:45 -0700191 }
192 }
193
Brian O'Connore8468b52016-07-25 13:42:36 -0700194 JavacOptions javacOptions = JavacOptionsFactory.create(
195 defaultJavacOptions,
196 params,
197 resolver,
198 pathResolver,
199 args
200 );
201
202 BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR);
203
204 ImmutableSortedSet<BuildRule> exportedDeps = resolver.getAllRules(args.exportedDeps.get());
205
Brian O'Connor79b70672016-10-20 13:44:52 -0700206 // Build the resources string
207 List<String> resourceMappings = Lists.newArrayList();
208
209 if (args.includeResources.isPresent()) {
210 args.includeResources.get().entrySet().forEach(p ->
211 resourceMappings.add(String.format("%s=%s", p.getKey(), p.getValue())));
212 }
213
214 if (args.apiTitle.isPresent()) {
215 resourceMappings.add("WEB-INF/classes/apidoc/swagger.json=swagger.json");
216 }
217
218 Optional<String> includedResourcesString = Optional.of(String.join(",", resourceMappings));
Brian O'Connoree674952016-09-13 16:31:45 -0700219 final DefaultJavaLibrary defaultJavaLibrary;
220 if (!flavors.contains(NON_OSGI_JAR)) {
221 defaultJavaLibrary =
222 resolver.addToIndex(
223 new OnosJar(
224 params.appendExtraDeps(
225 Iterables.concat(
226 BuildRules.getExportedRules(
227 Iterables.concat(
228 params.getDeclaredDeps().get(),
229 exportedDeps,
230 resolver.getAllRules(args.providedDeps.get()))),
231 pathResolver.filterBuildRuleInputs(
232 javacOptions.getInputs(pathResolver)))),
233 pathResolver,
234 args.srcs.get(),
235 validateResources(
236 pathResolver,
237 params.getProjectFilesystem(),
238 args.resources.get()),
239 javacOptions.getGeneratedSourceFolderName(),
240 args.proguardConfig.transform(
241 SourcePaths.toSourcePath(params.getProjectFilesystem())),
242 args.postprocessClassesCommands.get(), // FIXME this should be forbidden
243 exportedDeps,
244 resolver.getAllRules(args.providedDeps.get()),
245 new BuildTargetSourcePath(abiJarTarget),
246 javacOptions.trackClassUsage(),
Brian O'Connore8468b52016-07-25 13:42:36 -0700247 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
Brian O'Connoree674952016-09-13 16:31:45 -0700248 new OnosJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY,
249 args.webContext, args.apiTitle, args.apiVersion,
250 args.apiPackage, args.apiDescription, args.resources,
251 args.groupId, args.bundleName, args.bundleVersion,
252 args.bundleLicense, args.bundleDescription, args.importPackages,
Brian O'Connor79b70672016-10-20 13:44:52 -0700253 args.exportPackages, includedResourcesString, args.dynamicimportPackages),
Brian O'Connoree674952016-09-13 16:31:45 -0700254 args.resourcesRoot,
Brian O'Connor69e37d92016-10-12 15:05:09 -0700255 args.manifestFile,
Brian O'Connoree674952016-09-13 16:31:45 -0700256 args.mavenCoords,
257 args.tests.get(),
258 javacOptions.getClassesToRemoveFromJar(),
259 args.webContext,
260 args.apiTitle,
261 args.apiVersion,
262 args.apiPackage,
Brian O'Connor79b70672016-10-20 13:44:52 -0700263 args.apiDescription,
264 args.includeResources));
Brian O'Connoree674952016-09-13 16:31:45 -0700265 } else {
266 defaultJavaLibrary =
267 resolver.addToIndex(
268 new DefaultJavaLibrary(
269 params.appendExtraDeps(
270 Iterables.concat(
271 BuildRules.getExportedRules(
272 Iterables.concat(
273 params.getDeclaredDeps().get(),
274 exportedDeps,
275 resolver.getAllRules(args.providedDeps.get()))),
276 pathResolver.filterBuildRuleInputs(
277 javacOptions.getInputs(pathResolver)))),
278 pathResolver,
279 args.srcs.get(),
280 validateResources(
281 pathResolver,
282 params.getProjectFilesystem(),
283 args.resources.get()),
284 javacOptions.getGeneratedSourceFolderName(),
285 args.proguardConfig.transform(
286 SourcePaths.toSourcePath(params.getProjectFilesystem())),
287 args.postprocessClassesCommands.get(),
288 exportedDeps,
289 resolver.getAllRules(args.providedDeps.get()),
290 new BuildTargetSourcePath(abiJarTarget),
291 javacOptions.trackClassUsage(),
292 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
293 new JavacToJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY),
294 args.resourcesRoot,
Brian O'Connor69e37d92016-10-12 15:05:09 -0700295 args.manifestFile,
Brian O'Connoree674952016-09-13 16:31:45 -0700296 args.mavenCoords,
297 args.tests.get(),
298 javacOptions.getClassesToRemoveFromJar()));
299 }
Brian O'Connore8468b52016-07-25 13:42:36 -0700300
301 resolver.addToIndex(
302 CalculateAbi.of(
303 abiJarTarget,
304 pathResolver,
305 params,
306 new BuildTargetSourcePath(defaultJavaLibrary.getBuildTarget())));
307
308 return defaultJavaLibrary;
309 }
310
Brian O'Connoree674952016-09-13 16:31:45 -0700311 @Override
312 public boolean hasFlavors(ImmutableSet<Flavor> flavors) {
313 return SUPPORTED_FLAVORS.containsAll(flavors);
314 }
Brian O'Connore8468b52016-07-25 13:42:36 -0700315
316 public static class Arg extends JavaLibraryDescription.Arg {
317 public Optional<String> webContext;
318 public Optional<String> apiTitle;
319 public Optional<String> apiVersion;
320 public Optional<String> apiPackage;
321 public Optional<String> apiDescription;
Brian O'Connoree674952016-09-13 16:31:45 -0700322
323 public Optional<String> groupId;
324 public Optional<String> bundleName;
325 public Optional<String> bundleVersion;
326 public Optional<String> bundleLicense;
327 public Optional<String> bundleDescription;
328
329 public Optional<String> importPackages;
330 public Optional<String> exportPackages;
Brian O'Connor79b70672016-10-20 13:44:52 -0700331 public Optional<ImmutableSortedMap<String, SourcePath>> includeResources;
Brian O'Connoree674952016-09-13 16:31:45 -0700332 public Optional<String> dynamicimportPackages;
Brian O'Connore8468b52016-07-25 13:42:36 -0700333 }
334}