blob: 6d1ee7ef0a9f96ae41436caf3224dfbeac743ce5 [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'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;
56
57import java.nio.file.Path;
58
59import static com.facebook.buck.jvm.common.ResourceValidator.validateResources;
60
61/**
62 * Description for the onos_jar rules.
63 *
64 * Currently, this only does Swagger generation.
65 */
Brian O'Connoree674952016-09-13 16:31:45 -070066public class OnosJarDescription implements Description<OnosJarDescription.Arg>, Flavored {
Brian O'Connore8468b52016-07-25 13:42:36 -070067 public static final BuildRuleType TYPE = BuildRuleType.of("onos_jar");
Brian O'Connoree674952016-09-13 16:31:45 -070068 public static final Flavor NON_OSGI_JAR = ImmutableFlavor.of("non-osgi");
69
70 public static final ImmutableSet<Flavor> SUPPORTED_FLAVORS = ImmutableSet.of(
71 JavaLibrary.SRC_JAR,
72 JavaLibrary.MAVEN_JAR,
73 JavaLibrary.JAVADOC_JAR,
74 NON_OSGI_JAR);
75
Brian O'Connore8468b52016-07-25 13:42:36 -070076 private final JavacOptions defaultJavacOptions;
77 private final JavaOptions defaultJavaOptions;
78
79 public OnosJarDescription(BuckConfig config) {
80 JavaBuckConfig javaConfig = new JavaBuckConfig(config);
81 defaultJavacOptions = javaConfig.getDefaultJavacOptions();
82 defaultJavaOptions = javaConfig.getDefaultJavaOptions();
83 }
84
85 @Override
86 public BuildRuleType getBuildRuleType() {
87 return TYPE;
88 }
89
90 @Override
91 public Arg createUnpopulatedConstructorArg() {
92 return new Arg();
93 }
94
95 @Override
96 public <A extends Arg> BuildRule createBuildRule(TargetGraph targetGraph,
97 BuildRuleParams params,
98 BuildRuleResolver resolver,
99 A args)
100 throws NoSuchBuildTargetException {
101
102
103 SourcePathResolver pathResolver = new SourcePathResolver(resolver);
104 BuildTarget target = params.getBuildTarget();
105
106 // We know that the flavour we're being asked to create is valid, since the check is done when
107 // creating the action graph from the target graph.
108
109 ImmutableSortedSet<Flavor> flavors = target.getFlavors();
110 BuildRuleParams paramsWithMavenFlavor = null;
111
Brian O'Connoree674952016-09-13 16:31:45 -0700112 if (flavors.contains(JavaLibrary.MAVEN_JAR)) {
113 paramsWithMavenFlavor = params;
114
115 // Maven rules will depend upon their vanilla versions, so the latter have to be constructed
116 // without the maven flavor to prevent output-path conflict
117 params = params.copyWithBuildTarget(
118 params.getBuildTarget().withoutFlavors(ImmutableSet.of(JavaLibrary.MAVEN_JAR)));
119 }
120
121 if (flavors.contains(JavaLibrary.SRC_JAR)) {
122 args.mavenCoords = args.mavenCoords.transform(
123 new Function<String, String>() {
124 @Override
125 public String apply(String input) {
126 return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_SOURCES);
127 }
128 });
129
130 if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
131 return new JavaSourceJar(
132 params,
133 pathResolver,
134 args.srcs.get(),
135 args.mavenCoords);
136 } else {
137 return MavenUberJar.SourceJar.create(
138 Preconditions.checkNotNull(paramsWithMavenFlavor),
139 pathResolver,
140 args.srcs.get(),
Brian O'Connor69e37d92016-10-12 15:05:09 -0700141 args.mavenCoords,
142 Optional.absent()); //FIXME
Brian O'Connoree674952016-09-13 16:31:45 -0700143 }
144 }
145
146 if (flavors.contains(JavaLibrary.JAVADOC_JAR)) {
147 args.mavenCoords = args.mavenCoords.transform(
148 new Function<String, String>() {
149 @Override
150 public String apply(String input) {
151 return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_JAVADOC);
152 }
153 });
154
Brian O'Connor3d59f712016-10-05 21:42:36 -0700155 JavadocJar.JavadocArgs.Builder javadocArgs = JavadocJar.JavadocArgs.builder()
156 .addArg("-windowtitle", target.getShortName())
157 .addArg("-link", "http://docs.oracle.com/javase/8/docs/api")
158 .addArg("-tag", "onos.rsModel:a:\"onos model\""); //FIXME from buckconfig + rule
159
160 final ImmutableSortedMap.Builder<SourcePath, Path> javadocFiles = ImmutableSortedMap.naturalOrder();
161 if (args.javadocFiles.isPresent()) {
162 for (SourcePath path : args.javadocFiles.get()) {
163 javadocFiles.put(path,
164 JavadocJar.getDocfileWithPath(pathResolver, path, args.javadocFilesRoot.orNull()));
165 }
166 }
167
168
Brian O'Connoree674952016-09-13 16:31:45 -0700169 if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
170 return new JavadocJar(
171 params,
172 pathResolver,
173 args.srcs.get(),
Brian O'Connor3d59f712016-10-05 21:42:36 -0700174 javadocFiles.build(),
175 javadocArgs.build(),
Brian O'Connoree674952016-09-13 16:31:45 -0700176 args.mavenCoords);
177 } else {
178 return MavenUberJar.MavenJavadocJar.create(
179 Preconditions.checkNotNull(paramsWithMavenFlavor),
180 pathResolver,
181 args.srcs.get(),
Brian O'Connor3d59f712016-10-05 21:42:36 -0700182 javadocFiles.build(),
183 javadocArgs.build(),
Brian O'Connor69e37d92016-10-12 15:05:09 -0700184 args.mavenCoords,
185 Optional.absent()); //FIXME
Brian O'Connoree674952016-09-13 16:31:45 -0700186 }
187 }
188
Brian O'Connore8468b52016-07-25 13:42:36 -0700189 JavacOptions javacOptions = JavacOptionsFactory.create(
190 defaultJavacOptions,
191 params,
192 resolver,
193 pathResolver,
194 args
195 );
196
197 BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR);
198
199 ImmutableSortedSet<BuildRule> exportedDeps = resolver.getAllRules(args.exportedDeps.get());
200
Brian O'Connoree674952016-09-13 16:31:45 -0700201 final DefaultJavaLibrary defaultJavaLibrary;
202 if (!flavors.contains(NON_OSGI_JAR)) {
203 defaultJavaLibrary =
204 resolver.addToIndex(
205 new OnosJar(
206 params.appendExtraDeps(
207 Iterables.concat(
208 BuildRules.getExportedRules(
209 Iterables.concat(
210 params.getDeclaredDeps().get(),
211 exportedDeps,
212 resolver.getAllRules(args.providedDeps.get()))),
213 pathResolver.filterBuildRuleInputs(
214 javacOptions.getInputs(pathResolver)))),
215 pathResolver,
216 args.srcs.get(),
217 validateResources(
218 pathResolver,
219 params.getProjectFilesystem(),
220 args.resources.get()),
221 javacOptions.getGeneratedSourceFolderName(),
222 args.proguardConfig.transform(
223 SourcePaths.toSourcePath(params.getProjectFilesystem())),
224 args.postprocessClassesCommands.get(), // FIXME this should be forbidden
225 exportedDeps,
226 resolver.getAllRules(args.providedDeps.get()),
227 new BuildTargetSourcePath(abiJarTarget),
228 javacOptions.trackClassUsage(),
Brian O'Connore8468b52016-07-25 13:42:36 -0700229 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
Brian O'Connoree674952016-09-13 16:31:45 -0700230 new OnosJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY,
231 args.webContext, args.apiTitle, args.apiVersion,
232 args.apiPackage, args.apiDescription, args.resources,
233 args.groupId, args.bundleName, args.bundleVersion,
234 args.bundleLicense, args.bundleDescription, args.importPackages,
235 args.exportPackages, args.includeResources, args.dynamicimportPackages),
236 args.resourcesRoot,
Brian O'Connor69e37d92016-10-12 15:05:09 -0700237 args.manifestFile,
Brian O'Connoree674952016-09-13 16:31:45 -0700238 args.mavenCoords,
239 args.tests.get(),
240 javacOptions.getClassesToRemoveFromJar(),
241 args.webContext,
242 args.apiTitle,
243 args.apiVersion,
244 args.apiPackage,
245 args.apiDescription));
246 } else {
247 defaultJavaLibrary =
248 resolver.addToIndex(
249 new DefaultJavaLibrary(
250 params.appendExtraDeps(
251 Iterables.concat(
252 BuildRules.getExportedRules(
253 Iterables.concat(
254 params.getDeclaredDeps().get(),
255 exportedDeps,
256 resolver.getAllRules(args.providedDeps.get()))),
257 pathResolver.filterBuildRuleInputs(
258 javacOptions.getInputs(pathResolver)))),
259 pathResolver,
260 args.srcs.get(),
261 validateResources(
262 pathResolver,
263 params.getProjectFilesystem(),
264 args.resources.get()),
265 javacOptions.getGeneratedSourceFolderName(),
266 args.proguardConfig.transform(
267 SourcePaths.toSourcePath(params.getProjectFilesystem())),
268 args.postprocessClassesCommands.get(),
269 exportedDeps,
270 resolver.getAllRules(args.providedDeps.get()),
271 new BuildTargetSourcePath(abiJarTarget),
272 javacOptions.trackClassUsage(),
273 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
274 new JavacToJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY),
275 args.resourcesRoot,
Brian O'Connor69e37d92016-10-12 15:05:09 -0700276 args.manifestFile,
Brian O'Connoree674952016-09-13 16:31:45 -0700277 args.mavenCoords,
278 args.tests.get(),
279 javacOptions.getClassesToRemoveFromJar()));
280 }
Brian O'Connore8468b52016-07-25 13:42:36 -0700281
282 resolver.addToIndex(
283 CalculateAbi.of(
284 abiJarTarget,
285 pathResolver,
286 params,
287 new BuildTargetSourcePath(defaultJavaLibrary.getBuildTarget())));
288
289 return defaultJavaLibrary;
290 }
291
Brian O'Connoree674952016-09-13 16:31:45 -0700292 @Override
293 public boolean hasFlavors(ImmutableSet<Flavor> flavors) {
294 return SUPPORTED_FLAVORS.containsAll(flavors);
295 }
Brian O'Connore8468b52016-07-25 13:42:36 -0700296
297 public static class Arg extends JavaLibraryDescription.Arg {
298 public Optional<String> webContext;
299 public Optional<String> apiTitle;
300 public Optional<String> apiVersion;
301 public Optional<String> apiPackage;
302 public Optional<String> apiDescription;
Brian O'Connoree674952016-09-13 16:31:45 -0700303
304 public Optional<String> groupId;
305 public Optional<String> bundleName;
306 public Optional<String> bundleVersion;
307 public Optional<String> bundleLicense;
308 public Optional<String> bundleDescription;
309
310 public Optional<String> importPackages;
311 public Optional<String> exportPackages;
312 public Optional<String> includeResources;
313 public Optional<String> dynamicimportPackages;
Brian O'Connore8468b52016-07-25 13:42:36 -0700314 }
315}