blob: 83e68f892d7cf0e20cd4389f2df0a50fd20c1df6 [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(),
141 args.mavenCoords);
142 }
143 }
144
145 if (flavors.contains(JavaLibrary.JAVADOC_JAR)) {
146 args.mavenCoords = args.mavenCoords.transform(
147 new Function<String, String>() {
148 @Override
149 public String apply(String input) {
150 return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_JAVADOC);
151 }
152 });
153
Brian O'Connor3d59f712016-10-05 21:42:36 -0700154 JavadocJar.JavadocArgs.Builder javadocArgs = JavadocJar.JavadocArgs.builder()
155 .addArg("-windowtitle", target.getShortName())
156 .addArg("-link", "http://docs.oracle.com/javase/8/docs/api")
157 .addArg("-tag", "onos.rsModel:a:\"onos model\""); //FIXME from buckconfig + rule
158
159 final ImmutableSortedMap.Builder<SourcePath, Path> javadocFiles = ImmutableSortedMap.naturalOrder();
160 if (args.javadocFiles.isPresent()) {
161 for (SourcePath path : args.javadocFiles.get()) {
162 javadocFiles.put(path,
163 JavadocJar.getDocfileWithPath(pathResolver, path, args.javadocFilesRoot.orNull()));
164 }
165 }
166
167
Brian O'Connoree674952016-09-13 16:31:45 -0700168 if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
169 return new JavadocJar(
170 params,
171 pathResolver,
172 args.srcs.get(),
Brian O'Connor3d59f712016-10-05 21:42:36 -0700173 javadocFiles.build(),
174 javadocArgs.build(),
Brian O'Connoree674952016-09-13 16:31:45 -0700175 args.mavenCoords);
176 } else {
177 return MavenUberJar.MavenJavadocJar.create(
178 Preconditions.checkNotNull(paramsWithMavenFlavor),
179 pathResolver,
180 args.srcs.get(),
Brian O'Connor3d59f712016-10-05 21:42:36 -0700181 javadocFiles.build(),
182 javadocArgs.build(),
Brian O'Connoree674952016-09-13 16:31:45 -0700183 args.mavenCoords);
184 }
185 }
186
Brian O'Connore8468b52016-07-25 13:42:36 -0700187 JavacOptions javacOptions = JavacOptionsFactory.create(
188 defaultJavacOptions,
189 params,
190 resolver,
191 pathResolver,
192 args
193 );
194
195 BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR);
196
197 ImmutableSortedSet<BuildRule> exportedDeps = resolver.getAllRules(args.exportedDeps.get());
198
Brian O'Connoree674952016-09-13 16:31:45 -0700199 final DefaultJavaLibrary defaultJavaLibrary;
200 if (!flavors.contains(NON_OSGI_JAR)) {
201 defaultJavaLibrary =
202 resolver.addToIndex(
203 new OnosJar(
204 params.appendExtraDeps(
205 Iterables.concat(
206 BuildRules.getExportedRules(
207 Iterables.concat(
208 params.getDeclaredDeps().get(),
209 exportedDeps,
210 resolver.getAllRules(args.providedDeps.get()))),
211 pathResolver.filterBuildRuleInputs(
212 javacOptions.getInputs(pathResolver)))),
213 pathResolver,
214 args.srcs.get(),
215 validateResources(
216 pathResolver,
217 params.getProjectFilesystem(),
218 args.resources.get()),
219 javacOptions.getGeneratedSourceFolderName(),
220 args.proguardConfig.transform(
221 SourcePaths.toSourcePath(params.getProjectFilesystem())),
222 args.postprocessClassesCommands.get(), // FIXME this should be forbidden
223 exportedDeps,
224 resolver.getAllRules(args.providedDeps.get()),
225 new BuildTargetSourcePath(abiJarTarget),
226 javacOptions.trackClassUsage(),
Brian O'Connore8468b52016-07-25 13:42:36 -0700227 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
Brian O'Connoree674952016-09-13 16:31:45 -0700228 new OnosJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY,
229 args.webContext, args.apiTitle, args.apiVersion,
230 args.apiPackage, args.apiDescription, args.resources,
231 args.groupId, args.bundleName, args.bundleVersion,
232 args.bundleLicense, args.bundleDescription, args.importPackages,
233 args.exportPackages, args.includeResources, args.dynamicimportPackages),
234 args.resourcesRoot,
235 args.mavenCoords,
236 args.tests.get(),
237 javacOptions.getClassesToRemoveFromJar(),
238 args.webContext,
239 args.apiTitle,
240 args.apiVersion,
241 args.apiPackage,
242 args.apiDescription));
243 } else {
244 defaultJavaLibrary =
245 resolver.addToIndex(
246 new DefaultJavaLibrary(
247 params.appendExtraDeps(
248 Iterables.concat(
249 BuildRules.getExportedRules(
250 Iterables.concat(
251 params.getDeclaredDeps().get(),
252 exportedDeps,
253 resolver.getAllRules(args.providedDeps.get()))),
254 pathResolver.filterBuildRuleInputs(
255 javacOptions.getInputs(pathResolver)))),
256 pathResolver,
257 args.srcs.get(),
258 validateResources(
259 pathResolver,
260 params.getProjectFilesystem(),
261 args.resources.get()),
262 javacOptions.getGeneratedSourceFolderName(),
263 args.proguardConfig.transform(
264 SourcePaths.toSourcePath(params.getProjectFilesystem())),
265 args.postprocessClassesCommands.get(),
266 exportedDeps,
267 resolver.getAllRules(args.providedDeps.get()),
268 new BuildTargetSourcePath(abiJarTarget),
269 javacOptions.trackClassUsage(),
270 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
271 new JavacToJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY),
272 args.resourcesRoot,
273 args.mavenCoords,
274 args.tests.get(),
275 javacOptions.getClassesToRemoveFromJar()));
276 }
Brian O'Connore8468b52016-07-25 13:42:36 -0700277
278 resolver.addToIndex(
279 CalculateAbi.of(
280 abiJarTarget,
281 pathResolver,
282 params,
283 new BuildTargetSourcePath(defaultJavaLibrary.getBuildTarget())));
284
285 return defaultJavaLibrary;
286 }
287
Brian O'Connoree674952016-09-13 16:31:45 -0700288 @Override
289 public boolean hasFlavors(ImmutableSet<Flavor> flavors) {
290 return SUPPORTED_FLAVORS.containsAll(flavors);
291 }
Brian O'Connore8468b52016-07-25 13:42:36 -0700292
293 public static class Arg extends JavaLibraryDescription.Arg {
294 public Optional<String> webContext;
295 public Optional<String> apiTitle;
296 public Optional<String> apiVersion;
297 public Optional<String> apiPackage;
298 public Optional<String> apiDescription;
Brian O'Connoree674952016-09-13 16:31:45 -0700299
300 public Optional<String> groupId;
301 public Optional<String> bundleName;
302 public Optional<String> bundleVersion;
303 public Optional<String> bundleLicense;
304 public Optional<String> bundleDescription;
305
306 public Optional<String> importPackages;
307 public Optional<String> exportPackages;
308 public Optional<String> includeResources;
309 public Optional<String> dynamicimportPackages;
Brian O'Connore8468b52016-07-25 13:42:36 -0700310 }
311}