Brian O'Connor
Committed by Gerrit Code Review

Enhancing OnosJar to build OSGi jars and wars if required.

Also, simplifying onos.bucklet by using the rule

Change-Id: If89633db2d83cbfc56a8e70d2bea665ffaf186ff
...@@ -114,6 +114,7 @@ def osgi_jar( ...@@ -114,6 +114,7 @@ def osgi_jar(
114 api_description = NONE, 114 api_description = NONE,
115 resources = NONE, 115 resources = NONE,
116 resources_root = None, 116 resources_root = None,
117 + tests = None,
117 **kwargs 118 **kwargs
118 ): 119 ):
119 120
...@@ -134,76 +135,42 @@ def osgi_jar( ...@@ -134,76 +135,42 @@ def osgi_jar(
134 resources_root = RESOURCES_ROOT 135 resources_root = RESOURCES_ROOT
135 136
136 if api_title != NONE: 137 if api_title != NONE:
137 - r = 'WEB-INF/classes/apidoc/swagger.json=bin/swagger.json' 138 + r = 'WEB-INF/classes/apidoc/swagger.json=swagger.json'
138 include_resources = include_resources + ',' + r if include_resources != NONE else r 139 include_resources = include_resources + ',' + r if include_resources != NONE else r
139 140
140 - bare_jar_name = name + '-jar'
141 - osgi_jar_name = name + '-osgi'
142 mvn_coords = group_id + ':' + name + ':' + version 141 mvn_coords = group_id + ':' + name + ':' + version
143 142
144 -
145 onos_jar( 143 onos_jar(
146 - name = bare_jar_name, 144 + name = name,
147 - srcs = srcs, 145 + srcs = srcs + glob(['src/main/webapp/**']),
148 deps = deps, 146 deps = deps,
149 - visibility = [], #intentially, not visible 147 + visibility = visibility,
150 resources = resources, 148 resources = resources,
151 resources_root = resources_root, 149 resources_root = resources_root,
150 + bundle_name = name,
151 + group_id = group_id,
152 + bundle_version = version,
153 + bundle_license = license,
154 + bundle_description = description,
155 + import_packages = import_packages,
156 + export_packages = export_packages,
157 + include_resources = include_resources,
158 + dynamicimport_packages = dynamicimport_packages,
152 web_context = web_context, 159 web_context = web_context,
153 api_title = api_title, 160 api_title = api_title,
154 api_version = api_version, 161 api_version = api_version,
155 api_package = api_package, 162 api_package = api_package,
156 api_description = api_description, 163 api_description = api_description,
164 + tests = tests,
165 + maven_coords = mvn_coords,
157 **kwargs 166 **kwargs
158 ) 167 )
159 168
160 - cp = ':'.join(['$(classpath %s)' % c for c in deps]) if deps else '""'
161 -
162 - args = ( '$(location :%s)' % bare_jar_name, #input jar
163 - '$OUT', #output jar
164 - cp, #classpath
165 - name, #bundle name
166 - group_id, #group id
167 - version, #version
168 - license, #license url
169 - "'%s'" % import_packages, #packages to import
170 - "'%s'" % export_packages, #packages to export
171 - include_resources, #custom includes to classpath
172 - web_context, #web context (REST API only)
173 - "'%s'" % dynamicimport_packages, #DynamicImport-Package
174 - description, #description
175 - )
176 -
177 - #TODO stage_jar is a horrendous hack
178 - stage_jar = 'pushd $SRCDIR; mkdir bin; cd bin; jar xf $(location :%s); ls; popd; ' % bare_jar_name
179 - wrap_jar = '$(exe //utils/osgiwrap:osgi-jar) ' + ' '.join(args)
180 - bash = stage_jar + wrap_jar
181 - if debug:
182 - bash = stage_jar + DEBUG_ARG + ' ' + wrap_jar
183 - print bash
184 -
185 - # FIXME: make sure that /swagger.json gets filtered
186 - genrule(
187 - name = osgi_jar_name,
188 - bash = bash,
189 - out = '%s-%s.jar' % (name, version), #FIXME add version to jar file
190 - srcs = glob(['src/main/webapp/**']),
191 - visibility = [], #intentially, not visible
192 - )
193 -
194 - # TODO we really should shade the jar with maven flavor
195 - prebuilt_jar(
196 - name = name,
197 - maven_coords = mvn_coords,
198 - binary_jar = ':' + osgi_jar_name,
199 - visibility = visibility,
200 - )
201 -
202 ### Checkstyle 169 ### Checkstyle
203 checkstyle( 170 checkstyle(
204 name = name + '-checkstyle-files', 171 name = name + '-checkstyle-files',
205 srcs = srcs, 172 srcs = srcs,
206 - jar_target = ':'+ bare_jar_name, 173 + jar_target = ':'+ name,
207 ) 174 )
208 175
209 java_doc( 176 java_doc(
...@@ -219,7 +186,7 @@ def osgi_jar( ...@@ -219,7 +186,7 @@ def osgi_jar(
219 186
220 # TODO add project config for intellij 187 # TODO add project config for intellij
221 # project_config( 188 # project_config(
222 - # src_target = ':' + bare_jar_name, 189 + # src_target = ':' + name,
223 # src_roots = [ 'src/main/java' ], 190 # src_roots = [ 'src/main/java' ],
224 # test_target = ':' + name + '-tests', 191 # test_target = ':' + name + '-tests',
225 # test_roots = [ 'src/test/java' ], 192 # test_roots = [ 'src/test/java' ],
...@@ -247,6 +214,8 @@ def osgi_jar( ...@@ -247,6 +214,8 @@ def osgi_jar(
247 def osgi_jar_with_tests( 214 def osgi_jar_with_tests(
248 name = None, 215 name = None,
249 deps = [], 216 deps = [],
217 + group_id = ONOS_GROUP_ID,
218 + version = ONOS_VERSION,
250 test_srcs = None, 219 test_srcs = None,
251 test_deps = [ '//lib:TEST' ], 220 test_deps = [ '//lib:TEST' ],
252 test_resources = None, 221 test_resources = None,
...@@ -260,7 +229,10 @@ def osgi_jar_with_tests( ...@@ -260,7 +229,10 @@ def osgi_jar_with_tests(
260 229
261 osgi_jar(name = name, 230 osgi_jar(name = name,
262 deps = deps, 231 deps = deps,
232 + group_id = group_id,
233 + version = version,
263 visibility = visibility, 234 visibility = visibility,
235 + tests = [':' + name + '-tests'],
264 **kwargs) 236 **kwargs)
265 237
266 if test_resources and not test_resources_root: 238 if test_resources and not test_resources_root:
...@@ -275,16 +247,18 @@ def osgi_jar_with_tests( ...@@ -275,16 +247,18 @@ def osgi_jar_with_tests(
275 if test_srcs is None: 247 if test_srcs is None:
276 test_srcs = glob([TEST + '/*.java']) 248 test_srcs = glob([TEST + '/*.java'])
277 249
250 + mvn_coords = group_id + ':' + name + ':jar:tests:' + version
251 +
278 java_test( 252 java_test(
279 name = name + '-tests', 253 name = name + '-tests',
280 srcs = test_srcs, 254 srcs = test_srcs,
281 deps = deps + 255 deps = deps +
282 test_deps + 256 test_deps +
283 - [':' + name + '-jar'], 257 + [':' + name + '#non-osgi'],
284 - source_under_test = [':' + name + '-jar'],
285 resources = test_resources, 258 resources = test_resources,
286 resources_root = test_resources_root, 259 resources_root = test_resources_root,
287 - visibility = visibility 260 + maven_coords = mvn_coords,
261 + visibility = visibility,
288 ) 262 )
289 263
290 checkstyle( 264 checkstyle(
...@@ -292,5 +266,3 @@ def osgi_jar_with_tests( ...@@ -292,5 +266,3 @@ def osgi_jar_with_tests(
292 srcs = test_srcs, 266 srcs = test_srcs,
293 jar_target = ':' + name + '-tests', 267 jar_target = ':' + name + '-tests',
294 ) 268 )
295 -
296 - #FIXME need to run checkstyle on test sources
......
1 +# Comment the remote_jar out for local buck development
1 remote_jar ( 2 remote_jar (
2 name = 'buck-api', 3 name = 'buck-api',
3 out = 'buck.jar', 4 out = 'buck.jar',
4 - url = 'https://github.com/bocon13/buck/releases/download/v2016.07.29.01-wip/buck.jar', 5 + url = 'https://github.com/bocon13/buck/releases/download/v2016.09.13.01/buck.jar',
5 - sha1 = 'f89324cb869b74fdcd4db9972233065a93d890a2', 6 + sha1 = 'd5415b4326e5316675532a8cd48001a8456e8c9e',
6 visibility = [], 7 visibility = [],
7 ) 8 )
8 9
10 +# Uncomment the prebuilt_jar and copy buck-api to lib/buck.jar for local buck development
11 +# prebuilt_jar (
12 +# name = 'buck-api',
13 +# binary_jar = 'lib/buck.jar'
14 +# )
15 +
9 COMPILE = [ 16 COMPILE = [
10 '//lib:qdox', 17 '//lib:qdox',
11 - #'//lib:jackson-core', 18 + '//lib:guava',
12 - #'//lib:jackson-databind', 19 + '//lib:bndlib',
13 - #'//lib:jackson-annotations', 20 + '//lib:org.apache.felix.scr.bnd'
14 -]
15 -
16 -RUNTIME = [
17 ] 21 ]
18 22
19 java_library( 23 java_library(
......
...@@ -17,6 +17,10 @@ package org.onosproject.onosjar; ...@@ -17,6 +17,10 @@ package org.onosproject.onosjar;
17 17
18 import com.facebook.buck.jvm.java.CompileToJarStepFactory; 18 import com.facebook.buck.jvm.java.CompileToJarStepFactory;
19 import com.facebook.buck.jvm.java.DefaultJavaLibrary; 19 import com.facebook.buck.jvm.java.DefaultJavaLibrary;
20 +import com.facebook.buck.jvm.java.HasClasspathEntries;
21 +import com.facebook.buck.jvm.java.HasMavenCoordinates;
22 +import com.facebook.buck.jvm.java.JavaLibrary;
23 +import com.facebook.buck.jvm.java.MavenPublishable;
20 import com.facebook.buck.model.BuildTarget; 24 import com.facebook.buck.model.BuildTarget;
21 import com.facebook.buck.rules.AddToRuleKey; 25 import com.facebook.buck.rules.AddToRuleKey;
22 import com.facebook.buck.rules.BuildRule; 26 import com.facebook.buck.rules.BuildRule;
...@@ -24,6 +28,7 @@ import com.facebook.buck.rules.BuildRuleParams; ...@@ -24,6 +28,7 @@ import com.facebook.buck.rules.BuildRuleParams;
24 import com.facebook.buck.rules.SourcePath; 28 import com.facebook.buck.rules.SourcePath;
25 import com.facebook.buck.rules.SourcePathResolver; 29 import com.facebook.buck.rules.SourcePathResolver;
26 import com.google.common.base.Optional; 30 import com.google.common.base.Optional;
31 +import com.google.common.base.Preconditions;
27 import com.google.common.collect.ImmutableList; 32 import com.google.common.collect.ImmutableList;
28 import com.google.common.collect.ImmutableSet; 33 import com.google.common.collect.ImmutableSet;
29 import com.google.common.collect.ImmutableSortedSet; 34 import com.google.common.collect.ImmutableSortedSet;
...@@ -36,7 +41,8 @@ import java.util.regex.Pattern; ...@@ -36,7 +41,8 @@ import java.util.regex.Pattern;
36 * Implementation of a build rule that generates a onosjar.json file for a set 41 * Implementation of a build rule that generates a onosjar.json file for a set
37 * of Java sources. 42 * of Java sources.
38 */ 43 */
39 -public class OnosJar extends DefaultJavaLibrary { 44 +public class OnosJar extends DefaultJavaLibrary
45 + implements MavenPublishable{
40 46
41 @AddToRuleKey 47 @AddToRuleKey
42 final Optional<String> webContext; 48 final Optional<String> webContext;
...@@ -53,6 +59,8 @@ public class OnosJar extends DefaultJavaLibrary { ...@@ -53,6 +59,8 @@ public class OnosJar extends DefaultJavaLibrary {
53 @AddToRuleKey 59 @AddToRuleKey
54 final Optional<String> apiDescription; 60 final Optional<String> apiDescription;
55 61
62 + private final ImmutableSortedSet<HasMavenCoordinates> mavenDeps;
63 +
56 public OnosJar(BuildRuleParams params, 64 public OnosJar(BuildRuleParams params,
57 SourcePathResolver resolver, 65 SourcePathResolver resolver,
58 Set<? extends SourcePath> srcs, 66 Set<? extends SourcePath> srcs,
...@@ -84,5 +92,32 @@ public class OnosJar extends DefaultJavaLibrary { ...@@ -84,5 +92,32 @@ public class OnosJar extends DefaultJavaLibrary {
84 this.apiVersion = apiVersion; 92 this.apiVersion = apiVersion;
85 this.apiPackage = apiPackage; 93 this.apiPackage = apiPackage;
86 this.apiDescription = apiDescription; 94 this.apiDescription = apiDescription;
95 + this.mavenDeps = computeMavenDeps();
96 + }
97 +
98 + private ImmutableSortedSet<HasMavenCoordinates> computeMavenDeps() {
99 + ImmutableSortedSet.Builder<HasMavenCoordinates> mavenDeps = ImmutableSortedSet.naturalOrder();
100 + for (JavaLibrary javaLibrary : getTransitiveClasspathDeps()) {
101 + if (this.equals(javaLibrary)) {
102 + // no need to include ourself
103 + continue;
104 + } else if (HasMavenCoordinates.MAVEN_COORDS_PRESENT_PREDICATE.apply(javaLibrary)) {
105 + mavenDeps.add(javaLibrary);
106 + //FIXME BOC do we always want to exclude all of a maven jar's dependencies? probably.
107 + mavenDeps.addAll(javaLibrary.getTransitiveClasspathDeps());
108 + }
109 + }
110 + return mavenDeps.build();
111 + }
112 +
113 + @Override
114 + public Iterable<HasMavenCoordinates> getMavenDeps() {
115 + return mavenDeps;
116 + }
117 +
118 + @Override
119 + public Iterable<BuildRule> getPackagedDependencies() {
120 + //FIXME this is not supported at the moment
121 + return ImmutableList.of();
87 } 122 }
88 } 123 }
......
...@@ -28,12 +28,14 @@ import com.facebook.buck.rules.BuildableContext; ...@@ -28,12 +28,14 @@ import com.facebook.buck.rules.BuildableContext;
28 import com.facebook.buck.rules.SourcePath; 28 import com.facebook.buck.rules.SourcePath;
29 import com.facebook.buck.rules.SourcePathResolver; 29 import com.facebook.buck.rules.SourcePathResolver;
30 import com.facebook.buck.step.Step; 30 import com.facebook.buck.step.Step;
31 +import com.facebook.buck.step.fs.CopyStep;
31 import com.google.common.base.Optional; 32 import com.google.common.base.Optional;
32 import com.google.common.collect.ImmutableList; 33 import com.google.common.collect.ImmutableList;
33 import com.google.common.collect.ImmutableSet; 34 import com.google.common.collect.ImmutableSet;
34 import com.google.common.collect.ImmutableSortedSet; 35 import com.google.common.collect.ImmutableSortedSet;
35 36
36 import java.nio.file.Path; 37 import java.nio.file.Path;
38 +import java.nio.file.Paths;
37 import java.util.regex.Pattern; 39 import java.util.regex.Pattern;
38 import java.util.stream.Collectors; 40 import java.util.stream.Collectors;
39 41
...@@ -49,6 +51,15 @@ public class OnosJarStepFactory extends JavacToJarStepFactory { ...@@ -49,6 +51,15 @@ public class OnosJarStepFactory extends JavacToJarStepFactory {
49 private final String apiPackage; 51 private final String apiPackage;
50 private final String apiDescription; 52 private final String apiDescription;
51 private final Optional<ImmutableSortedSet<SourcePath>> resources; 53 private final Optional<ImmutableSortedSet<SourcePath>> resources;
54 + private final String groupId;
55 + private final String bundleName;
56 + private final String bundleVersion;
57 + private final String bundleLicense;
58 + private final String bundleDescription;
59 + private final String importPackages;
60 + private final String exportPackages;
61 + private final String includeResources;
62 + private final String dynamicimportPackages;
52 63
53 public OnosJarStepFactory(JavacOptions javacOptions, 64 public OnosJarStepFactory(JavacOptions javacOptions,
54 JavacOptionsAmender amender, 65 JavacOptionsAmender amender,
...@@ -57,8 +68,26 @@ public class OnosJarStepFactory extends JavacToJarStepFactory { ...@@ -57,8 +68,26 @@ public class OnosJarStepFactory extends JavacToJarStepFactory {
57 Optional<String> apiVersion, 68 Optional<String> apiVersion,
58 Optional<String> apiPackage, 69 Optional<String> apiPackage,
59 Optional<String> apiDescription, 70 Optional<String> apiDescription,
60 - Optional<ImmutableSortedSet<SourcePath>> resources) { 71 + Optional<ImmutableSortedSet<SourcePath>> resources,
72 + Optional<String> groupId,
73 + Optional<String> bundleName,
74 + Optional<String> bundleVersion,
75 + Optional<String> bundleLicense,
76 + Optional<String> bundleDescription,
77 + Optional<String> importPackages,
78 + Optional<String> exportPackages,
79 + Optional<String> includeResources,
80 + Optional<String> dynamicimportPackages) {
61 super(javacOptions, amender); 81 super(javacOptions, amender);
82 + this.bundleDescription = processParameter(bundleDescription);
83 + this.importPackages = processParameter(importPackages);
84 + this.exportPackages = processParameter(exportPackages);
85 + this.includeResources = processParameter(includeResources);
86 + this.dynamicimportPackages = processParameter(dynamicimportPackages);
87 + this.groupId = processParameter(groupId);
88 + this.bundleName = processParameter(bundleName);
89 + this.bundleVersion = processParameter(bundleVersion);
90 + this.bundleLicense = processParameter(bundleLicense);
62 this.webContext = processParameter(webContext); 91 this.webContext = processParameter(webContext);
63 this.apiTitle = processParameter(apiTitle); 92 this.apiTitle = processParameter(apiTitle);
64 this.apiVersion = processParameter(apiVersion); 93 this.apiVersion = processParameter(apiVersion);
...@@ -114,6 +143,11 @@ public class OnosJarStepFactory extends JavacToJarStepFactory { ...@@ -114,6 +143,11 @@ public class OnosJarStepFactory extends JavacToJarStepFactory {
114 apiPackage, apiDescription); 143 apiPackage, apiDescription);
115 sourceFilePathBuilder.add(swaggerStep.apiRegistratorPath()); 144 sourceFilePathBuilder.add(swaggerStep.apiRegistratorPath());
116 steps.add(swaggerStep); 145 steps.add(swaggerStep);
146 +
147 +// steps.addAll(sourceFilePaths.stream()
148 +// .filter(sp -> sp.startsWith("src/main/webapp/"))
149 +// .map(sp -> CopyStep.forFile(filesystem, sp, outputDirectory))
150 +// .iterator());
117 } 151 }
118 152
119 createCompileStep(context, 153 createCompileStep(context,
...@@ -132,6 +166,7 @@ public class OnosJarStepFactory extends JavacToJarStepFactory { ...@@ -132,6 +166,7 @@ public class OnosJarStepFactory extends JavacToJarStepFactory {
132 166
133 // post compilation steps 167 // post compilation steps
134 168
169 +
135 // FIXME BOC: add mechanism to inject new Steps 170 // FIXME BOC: add mechanism to inject new Steps
136 //context.additionalStepFactory(JavaStep.class); 171 //context.additionalStepFactory(JavaStep.class);
137 172
...@@ -143,6 +178,28 @@ public class OnosJarStepFactory extends JavacToJarStepFactory { ...@@ -143,6 +178,28 @@ public class OnosJarStepFactory extends JavacToJarStepFactory {
143 manifestFile.orNull(), 178 manifestFile.orNull(),
144 true, 179 true,
145 blacklistBuilder.build())); 180 blacklistBuilder.build()));
181 +
182 + OSGiWrapper osgiStep = new OSGiWrapper(
183 + outputJar, //input jar
184 + outputJar, //Paths.get(outputJar.toString() + ".jar"), //output jar
185 + invokingRule.getBasePath(), // sources dir
186 + outputDirectory, // classes dir
187 + declaredClasspathEntries, // classpath
188 + bundleName, // bundle name
189 + groupId, // groupId
190 + bundleVersion, // bundle version
191 + bundleLicense, // bundle license
192 + importPackages, // import packages
193 + exportPackages, // export packages
194 + includeResources, // include resources
195 + webContext, // web context
196 + dynamicimportPackages, // dynamic import packages
197 + bundleDescription // bundle description
198 + );
199 + steps.add(osgiStep);
200 +
201 + //steps.add(CopyStep.forFile(filesystem, Paths.get(outputJar.toString() + ".jar"), outputJar));
202 +
146 } 203 }
147 204
148 private ImmutableSortedSet<Path> findSwaggerModelDefs(SourcePathResolver resolver, 205 private ImmutableSortedSet<Path> findSwaggerModelDefs(SourcePathResolver resolver,
......
...@@ -102,10 +102,12 @@ public class SwaggerGenerator { ...@@ -102,10 +102,12 @@ public class SwaggerGenerator {
102 } 102 }
103 if (srcs != null) { 103 if (srcs != null) {
104 srcs.forEach(src -> { 104 srcs.forEach(src -> {
105 - try { 105 + if (src.toString().endsWith(".java")) {
106 - builder.addSource(src); 106 + try {
107 - } catch (IOException e) { 107 + builder.addSource(src);
108 - throw new RuntimeException(e); 108 + } catch (IOException e) {
109 + throw new RuntimeException(e);
110 + }
109 } 111 }
110 }); 112 });
111 } 113 }
......