blob: 3f2776081346abed82a6b35c1632f67ac545b092 [file] [log] [blame]
Brian O'Connore8468b52016-07-25 13:42:36 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Brian O'Connore8468b52016-07-25 13:42:36 -07003 *
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'Connore8468b52016-07-25 13:42:36 -070037import com.facebook.buck.parser.NoSuchBuildTargetException;
38import com.facebook.buck.rules.BuildRule;
39import com.facebook.buck.rules.BuildRuleParams;
40import com.facebook.buck.rules.BuildRuleResolver;
41import com.facebook.buck.rules.BuildRuleType;
42import com.facebook.buck.rules.BuildRules;
43import com.facebook.buck.rules.BuildTargetSourcePath;
44import com.facebook.buck.rules.Description;
Brian O'Connor3d59f712016-10-05 21:42:36 -070045import com.facebook.buck.rules.SourcePath;
Brian O'Connore8468b52016-07-25 13:42:36 -070046import com.facebook.buck.rules.SourcePathResolver;
47import com.facebook.buck.rules.SourcePaths;
48import com.facebook.buck.rules.TargetGraph;
Brian O'Connoree674952016-09-13 16:31:45 -070049import com.google.common.base.Function;
Brian O'Connore8468b52016-07-25 13:42:36 -070050import com.google.common.base.Optional;
Brian O'Connoree674952016-09-13 16:31:45 -070051import com.google.common.base.Preconditions;
Brian O'Connore8468b52016-07-25 13:42:36 -070052import com.google.common.collect.ImmutableSet;
Brian O'Connor3d59f712016-10-05 21:42:36 -070053import com.google.common.collect.ImmutableSortedMap;
Brian O'Connore8468b52016-07-25 13:42:36 -070054import com.google.common.collect.ImmutableSortedSet;
55import com.google.common.collect.Iterables;
Brian O'Connor79b70672016-10-20 13:44:52 -070056import com.google.common.collect.Lists;
Brian O'Connore8468b52016-07-25 13:42:36 -070057
58import java.nio.file.Path;
Brian O'Connor79b70672016-10-20 13:44:52 -070059import java.util.List;
Brian O'Connore8468b52016-07-25 13:42:36 -070060
61import static com.facebook.buck.jvm.common.ResourceValidator.validateResources;
62
63/**
64 * Description for the onos_jar rules.
65 *
66 * Currently, this only does Swagger generation.
67 */
Brian O'Connoree674952016-09-13 16:31:45 -070068public class OnosJarDescription implements Description<OnosJarDescription.Arg>, Flavored {
Brian O'Connore8468b52016-07-25 13:42:36 -070069 public static final BuildRuleType TYPE = BuildRuleType.of("onos_jar");
Brian O'Connoree674952016-09-13 16:31:45 -070070 public static final Flavor NON_OSGI_JAR = ImmutableFlavor.of("non-osgi");
71
72 public static final ImmutableSet<Flavor> SUPPORTED_FLAVORS = ImmutableSet.of(
73 JavaLibrary.SRC_JAR,
74 JavaLibrary.MAVEN_JAR,
75 JavaLibrary.JAVADOC_JAR,
76 NON_OSGI_JAR);
77
Brian O'Connore8468b52016-07-25 13:42:36 -070078 private final JavacOptions defaultJavacOptions;
79 private final JavaOptions defaultJavaOptions;
80
81 public OnosJarDescription(BuckConfig config) {
82 JavaBuckConfig javaConfig = new JavaBuckConfig(config);
83 defaultJavacOptions = javaConfig.getDefaultJavacOptions();
84 defaultJavaOptions = javaConfig.getDefaultJavaOptions();
85 }
86
87 @Override
88 public BuildRuleType getBuildRuleType() {
89 return TYPE;
90 }
91
92 @Override
93 public Arg createUnpopulatedConstructorArg() {
94 return new Arg();
95 }
96
97 @Override
98 public <A extends Arg> BuildRule createBuildRule(TargetGraph targetGraph,
99 BuildRuleParams params,
100 BuildRuleResolver resolver,
101 A args)
102 throws NoSuchBuildTargetException {
103
104
105 SourcePathResolver pathResolver = new SourcePathResolver(resolver);
106 BuildTarget target = params.getBuildTarget();
107
108 // We know that the flavour we're being asked to create is valid, since the check is done when
109 // creating the action graph from the target graph.
110
111 ImmutableSortedSet<Flavor> flavors = target.getFlavors();
112 BuildRuleParams paramsWithMavenFlavor = null;
113
Brian O'Connoree674952016-09-13 16:31:45 -0700114 if (flavors.contains(JavaLibrary.MAVEN_JAR)) {
115 paramsWithMavenFlavor = params;
116
117 // Maven rules will depend upon their vanilla versions, so the latter have to be constructed
118 // without the maven flavor to prevent output-path conflict
119 params = params.copyWithBuildTarget(
120 params.getBuildTarget().withoutFlavors(ImmutableSet.of(JavaLibrary.MAVEN_JAR)));
121 }
122
123 if (flavors.contains(JavaLibrary.SRC_JAR)) {
124 args.mavenCoords = args.mavenCoords.transform(
125 new Function<String, String>() {
126 @Override
127 public String apply(String input) {
128 return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_SOURCES);
129 }
130 });
131
132 if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
133 return new JavaSourceJar(
134 params,
135 pathResolver,
136 args.srcs.get(),
137 args.mavenCoords);
138 } else {
139 return MavenUberJar.SourceJar.create(
140 Preconditions.checkNotNull(paramsWithMavenFlavor),
141 pathResolver,
142 args.srcs.get(),
Brian O'Connor69e37d92016-10-12 15:05:09 -0700143 args.mavenCoords,
144 Optional.absent()); //FIXME
Brian O'Connoree674952016-09-13 16:31:45 -0700145 }
146 }
147
148 if (flavors.contains(JavaLibrary.JAVADOC_JAR)) {
149 args.mavenCoords = args.mavenCoords.transform(
150 new Function<String, String>() {
151 @Override
152 public String apply(String input) {
153 return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_JAVADOC);
154 }
155 });
156
Brian O'Connor3d59f712016-10-05 21:42:36 -0700157 JavadocJar.JavadocArgs.Builder javadocArgs = JavadocJar.JavadocArgs.builder()
158 .addArg("-windowtitle", target.getShortName())
159 .addArg("-link", "http://docs.oracle.com/javase/8/docs/api")
160 .addArg("-tag", "onos.rsModel:a:\"onos model\""); //FIXME from buckconfig + rule
161
162 final ImmutableSortedMap.Builder<SourcePath, Path> javadocFiles = ImmutableSortedMap.naturalOrder();
163 if (args.javadocFiles.isPresent()) {
164 for (SourcePath path : args.javadocFiles.get()) {
165 javadocFiles.put(path,
166 JavadocJar.getDocfileWithPath(pathResolver, path, args.javadocFilesRoot.orNull()));
167 }
168 }
169
170
Brian O'Connoree674952016-09-13 16:31:45 -0700171 if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
172 return new JavadocJar(
173 params,
174 pathResolver,
175 args.srcs.get(),
Brian O'Connor3d59f712016-10-05 21:42:36 -0700176 javadocFiles.build(),
177 javadocArgs.build(),
Brian O'Connoree674952016-09-13 16:31:45 -0700178 args.mavenCoords);
179 } else {
180 return MavenUberJar.MavenJavadocJar.create(
181 Preconditions.checkNotNull(paramsWithMavenFlavor),
182 pathResolver,
183 args.srcs.get(),
Brian O'Connor3d59f712016-10-05 21:42:36 -0700184 javadocFiles.build(),
185 javadocArgs.build(),
Brian O'Connor69e37d92016-10-12 15:05:09 -0700186 args.mavenCoords,
187 Optional.absent()); //FIXME
Brian O'Connoree674952016-09-13 16:31:45 -0700188 }
189 }
190
Brian O'Connore8468b52016-07-25 13:42:36 -0700191 JavacOptions javacOptions = JavacOptionsFactory.create(
192 defaultJavacOptions,
193 params,
194 resolver,
195 pathResolver,
196 args
197 );
198
199 BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR);
200
201 ImmutableSortedSet<BuildRule> exportedDeps = resolver.getAllRules(args.exportedDeps.get());
202
Brian O'Connor79b70672016-10-20 13:44:52 -0700203 // Build the resources string
204 List<String> resourceMappings = Lists.newArrayList();
205
206 if (args.includeResources.isPresent()) {
207 args.includeResources.get().entrySet().forEach(p ->
208 resourceMappings.add(String.format("%s=%s", p.getKey(), p.getValue())));
209 }
210
211 if (args.apiTitle.isPresent()) {
212 resourceMappings.add("WEB-INF/classes/apidoc/swagger.json=swagger.json");
213 }
214
215 Optional<String> includedResourcesString = Optional.of(String.join(",", resourceMappings));
Brian O'Connoree674952016-09-13 16:31:45 -0700216 final DefaultJavaLibrary defaultJavaLibrary;
217 if (!flavors.contains(NON_OSGI_JAR)) {
218 defaultJavaLibrary =
219 resolver.addToIndex(
220 new OnosJar(
221 params.appendExtraDeps(
222 Iterables.concat(
223 BuildRules.getExportedRules(
224 Iterables.concat(
225 params.getDeclaredDeps().get(),
226 exportedDeps,
227 resolver.getAllRules(args.providedDeps.get()))),
228 pathResolver.filterBuildRuleInputs(
229 javacOptions.getInputs(pathResolver)))),
230 pathResolver,
231 args.srcs.get(),
232 validateResources(
233 pathResolver,
234 params.getProjectFilesystem(),
235 args.resources.get()),
236 javacOptions.getGeneratedSourceFolderName(),
237 args.proguardConfig.transform(
238 SourcePaths.toSourcePath(params.getProjectFilesystem())),
239 args.postprocessClassesCommands.get(), // FIXME this should be forbidden
240 exportedDeps,
241 resolver.getAllRules(args.providedDeps.get()),
242 new BuildTargetSourcePath(abiJarTarget),
243 javacOptions.trackClassUsage(),
Brian O'Connore8468b52016-07-25 13:42:36 -0700244 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
Brian O'Connoree674952016-09-13 16:31:45 -0700245 new OnosJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY,
246 args.webContext, args.apiTitle, args.apiVersion,
247 args.apiPackage, args.apiDescription, args.resources,
248 args.groupId, args.bundleName, args.bundleVersion,
249 args.bundleLicense, args.bundleDescription, args.importPackages,
Bharat saraswala899a212017-02-28 13:19:57 +0530250 args.exportPackages, includedResourcesString,
Jian Li91b47392018-02-19 02:15:41 +0900251 args.dynamicimportPackages, args.privatePackages, args.embeddedDependencies, args.bundleClasspath),
Brian O'Connoree674952016-09-13 16:31:45 -0700252 args.resourcesRoot,
Brian O'Connor69e37d92016-10-12 15:05:09 -0700253 args.manifestFile,
Brian O'Connoree674952016-09-13 16:31:45 -0700254 args.mavenCoords,
255 args.tests.get(),
256 javacOptions.getClassesToRemoveFromJar(),
257 args.webContext,
258 args.apiTitle,
259 args.apiVersion,
260 args.apiPackage,
Brian O'Connor79b70672016-10-20 13:44:52 -0700261 args.apiDescription,
262 args.includeResources));
Brian O'Connoree674952016-09-13 16:31:45 -0700263 } else {
264 defaultJavaLibrary =
265 resolver.addToIndex(
266 new DefaultJavaLibrary(
267 params.appendExtraDeps(
268 Iterables.concat(
269 BuildRules.getExportedRules(
270 Iterables.concat(
271 params.getDeclaredDeps().get(),
272 exportedDeps,
273 resolver.getAllRules(args.providedDeps.get()))),
274 pathResolver.filterBuildRuleInputs(
275 javacOptions.getInputs(pathResolver)))),
276 pathResolver,
277 args.srcs.get(),
278 validateResources(
279 pathResolver,
280 params.getProjectFilesystem(),
281 args.resources.get()),
282 javacOptions.getGeneratedSourceFolderName(),
283 args.proguardConfig.transform(
284 SourcePaths.toSourcePath(params.getProjectFilesystem())),
285 args.postprocessClassesCommands.get(),
286 exportedDeps,
287 resolver.getAllRules(args.providedDeps.get()),
288 new BuildTargetSourcePath(abiJarTarget),
289 javacOptions.trackClassUsage(),
290 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
291 new JavacToJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY),
292 args.resourcesRoot,
Brian O'Connor69e37d92016-10-12 15:05:09 -0700293 args.manifestFile,
Brian O'Connoree674952016-09-13 16:31:45 -0700294 args.mavenCoords,
295 args.tests.get(),
296 javacOptions.getClassesToRemoveFromJar()));
297 }
Brian O'Connore8468b52016-07-25 13:42:36 -0700298
299 resolver.addToIndex(
300 CalculateAbi.of(
301 abiJarTarget,
302 pathResolver,
303 params,
304 new BuildTargetSourcePath(defaultJavaLibrary.getBuildTarget())));
305
306 return defaultJavaLibrary;
307 }
308
Brian O'Connoree674952016-09-13 16:31:45 -0700309 @Override
310 public boolean hasFlavors(ImmutableSet<Flavor> flavors) {
311 return SUPPORTED_FLAVORS.containsAll(flavors);
312 }
Brian O'Connore8468b52016-07-25 13:42:36 -0700313
314 public static class Arg extends JavaLibraryDescription.Arg {
315 public Optional<String> webContext;
316 public Optional<String> apiTitle;
317 public Optional<String> apiVersion;
318 public Optional<String> apiPackage;
319 public Optional<String> apiDescription;
Brian O'Connoree674952016-09-13 16:31:45 -0700320
321 public Optional<String> groupId;
322 public Optional<String> bundleName;
323 public Optional<String> bundleVersion;
324 public Optional<String> bundleLicense;
325 public Optional<String> bundleDescription;
326
327 public Optional<String> importPackages;
Bharat saraswala899a212017-02-28 13:19:57 +0530328 public Optional<String> privatePackages;
Brian O'Connoree674952016-09-13 16:31:45 -0700329 public Optional<String> exportPackages;
Brian O'Connor79b70672016-10-20 13:44:52 -0700330 public Optional<ImmutableSortedMap<String, SourcePath>> includeResources;
Brian O'Connoree674952016-09-13 16:31:45 -0700331 public Optional<String> dynamicimportPackages;
Viswanath KSP3568df72017-05-11 13:52:25 +0530332 public Optional<String> embeddedDependencies;
Jian Li91b47392018-02-19 02:15:41 +0900333 public Optional<String> bundleClasspath;
Brian O'Connore8468b52016-07-25 13:42:36 -0700334 }
335}