blob: 1d58510f8c78f7bd2cc5f7d29b113ad9a7911302 [file] [log] [blame]
Ray Milkey3275ae82018-05-29 15:35:36 -07001"""
2 Copyright 2018-present Open Networking Foundation
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"""
16
Ray Milkey7dac7da2017-08-01 16:56:05 -070017load("//tools/build/bazel:generate_workspace.bzl", "COMPILE", "TEST")
18load("//tools/build/bazel:variables.bzl", "ONOS_VERSION")
19load("//tools/build/bazel:generate_test_rules.bzl", "generate_test_rules")
Ray Milkeyb7949e72018-06-19 18:31:02 -070020load("//tools/build/bazel:checkstyle.bzl", "checkstyle_test")
Thomas Vachuskaac9e5242018-07-19 16:15:39 -070021load("//tools/build/bazel:pom_file.bzl", "pom_file")
Thomas Vachuska50ac0982018-07-19 10:17:37 -070022load("//tools/build/bazel:java_sources.bzl", "java_sources")
Carmelo Cascone6a1ae712018-08-10 12:19:47 -070023load("//tools/build/bazel:java_sources.bzl", "java_sources_alt")
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -070024load("//tools/build/bazel:javadoc.bzl", "javadoc")
Carmelo Cascone6a1ae712018-08-10 12:19:47 -070025load("@io_grpc_grpc_java//:java_grpc_library.bzl", "java_grpc_library")
26
27def _auto_name():
28 return "onos-" + native.package_name().replace("/", "-")
Ray Milkey7dac7da2017-08-01 16:56:05 -070029
Ray Milkey32ea35c2018-06-06 15:28:07 -070030def _all_java_sources():
Ray Milkey0bcdfd12018-05-23 14:07:19 -070031 return native.glob(["src/main/java/**/*.java"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070032
Ray Milkey32ea35c2018-06-06 15:28:07 -070033def _all_java_test_sources():
Ray Milkey0bcdfd12018-05-23 14:07:19 -070034 return native.glob(["src/test/java/**/*.java"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070035
Ray Milkey32ea35c2018-06-06 15:28:07 -070036def _all_test_resources():
Ray Milkey0bcdfd12018-05-23 14:07:19 -070037 return native.glob(["src/test/resources/**"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070038
Ray Milkey32ea35c2018-06-06 15:28:07 -070039def _all_resources(resources_root):
Ray Milkey0bcdfd12018-05-23 14:07:19 -070040 if resources_root == None:
41 return native.glob(["src/main/resources/**"])
42 else:
43 return native.glob([resources_root + "**"])
Ray Milkey7dac7da2017-08-01 16:56:05 -070044
Ray Milkey25747d82018-06-13 14:12:51 -070045def _webapp():
Ray Milkey6b3775a2018-06-28 11:18:44 -070046 return native.glob(["src/main/webapp/WEB-INF/web.xml"])
47
48def _include_resources_to_string(include_resources):
49 result = ""
50 for (path, filename) in include_resources.items():
51 result += (path + "=" + filename)
52 return result
Ray Milkey25747d82018-06-13 14:12:51 -070053
Ray Milkey275af2c2018-06-15 13:05:08 -070054"""
55 Implementation of the rule to call bnd to make an OSGI jar file
56"""
Ray Milkey6b3775a2018-06-28 11:18:44 -070057
Ray Milkey7dac7da2017-08-01 16:56:05 -070058def _bnd_impl(ctx):
Ray Milkey3275ae82018-05-29 15:35:36 -070059 if (len(ctx.files.source) == 1):
60 input_file = ctx.files.source[0]
61 else:
62 # this is a list of inputs. The one we want is the last one
63 # in the list that isn't a source jar
64 for file in reversed(ctx.files.source):
65 if ("-src" in file.path):
66 continue
67 else:
68 input_file = file
69 break
70
71 jar = input_file.path
Ray Milkey0bcdfd12018-05-23 14:07:19 -070072 output = ctx.outputs.osgi_jar.path
Thomas Vachuska8e022a92018-07-10 14:47:38 -070073 name = ctx.attr.name
Ray Milkey275af2c2018-06-15 13:05:08 -070074 group = ctx.attr.group
Ray Milkey0bcdfd12018-05-23 14:07:19 -070075 version = ctx.attr.version
76 license = ""
Ray Milkey12ae6ca2018-06-11 15:34:30 -070077 import_packages = ctx.attr.import_packages
Jian Li4ad86872018-08-05 03:34:35 +090078 bundle_classpath = ctx.attr.bundle_classpath
Ray Milkey0bcdfd12018-05-23 14:07:19 -070079 exportPackages = "*"
Ray Milkey6b3775a2018-06-28 11:18:44 -070080 include_resources = ctx.attr.include_resources
Ray Milkey25747d82018-06-13 14:12:51 -070081 web_context = ctx.attr.web_context
82 if web_context == None or web_context == "":
83 web_context = "NONE"
84 web_xml = ctx.attr.web_xml
Ray Milkey0bcdfd12018-05-23 14:07:19 -070085 dynamicimportPackages = ""
Ray Milkey3275ae82018-05-29 15:35:36 -070086 cp = ""
Ray Milkey7dac7da2017-08-01 16:56:05 -070087
Ray Milkey3275ae82018-05-29 15:35:36 -070088 inputDependencies = [input_file]
Ray Milkey7dac7da2017-08-01 16:56:05 -070089
Ray Milkey0bcdfd12018-05-23 14:07:19 -070090 # determine the dependencies and build the class path
91 for dep in ctx.attr.deps:
Ray Milkey25b785a2018-06-12 09:59:14 -070092 if java_common.provider in dep:
93 file = dep.files.to_list()[0]
Ray Milkey25b785a2018-06-12 09:59:14 -070094 if cp:
95 cp += ":"
96 cp += file.path
97 inputDependencies = inputDependencies + [file]
Ray Milkey7dac7da2017-08-01 16:56:05 -070098
Ray Milkey25747d82018-06-13 14:12:51 -070099 web_xml_root_path = ""
100 if len(web_xml) != 0:
101 web_xml_root = web_xml[0].files.to_list()[0]
102 inputDependencies += [web_xml_root]
103 web_xml_root_path = web_xml_root.path.replace("WEB-INF/web.xml", "")
Ray Milkey7dac7da2017-08-01 16:56:05 -0700104
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700105 # call bnd to make the OSGI jar file
106 arguments = [
107 jar,
108 output,
109 cp,
110 name,
111 group,
112 version,
113 license,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700114 import_packages,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700115 exportPackages,
Ray Milkey6b3775a2018-06-28 11:18:44 -0700116 include_resources,
Ray Milkey25747d82018-06-13 14:12:51 -0700117 web_context,
118 web_xml_root_path,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700119 dynamicimportPackages,
Thomas Vachuskae4436942018-08-07 19:27:10 -0700120 "classes",
Jian Li4ad86872018-08-05 03:34:35 +0900121 bundle_classpath,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700122 ]
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700123
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700124 ctx.actions.run(
125 inputs = inputDependencies,
126 outputs = [ctx.outputs.osgi_jar],
127 arguments = arguments,
128 progress_message = "Running bnd wrapper on: %s" % ctx.attr.name,
129 executable = ctx.executable._bnd_exe,
130 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700131
Ray Milkey25b785a2018-06-12 09:59:14 -0700132 deps = []
133 if java_common.provider in ctx.attr.source:
134 deps.append(ctx.attr.source[java_common.provider])
135 deps_provider = java_common.merge(deps)
136 return struct(
Ray Milkey15053f02018-06-13 10:00:45 -0700137 providers = [deps_provider],
Ray Milkey25b785a2018-06-12 09:59:14 -0700138 )
139
Ray Milkey275af2c2018-06-15 13:05:08 -0700140"""
141 Rule definition for calling bnd to make an OSGi jar file.
142"""
Ray Milkey32ea35c2018-06-06 15:28:07 -0700143_bnd = rule(
Ray Milkey7dac7da2017-08-01 16:56:05 -0700144 attrs = {
145 "deps": attr.label_list(),
146 "version": attr.string(),
Ray Milkey275af2c2018-06-15 13:05:08 -0700147 "group": attr.string(),
Ray Milkey3275ae82018-05-29 15:35:36 -0700148 "source": attr.label(),
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700149 "import_packages": attr.string(),
Jian Li4ad86872018-08-05 03:34:35 +0900150 "bundle_classpath": attr.string(),
Ray Milkey25747d82018-06-13 14:12:51 -0700151 "web_context": attr.string(),
152 "web_xml": attr.label_list(allow_files = True),
Ray Milkey6b3775a2018-06-28 11:18:44 -0700153 "include_resources": attr.string(),
Ray Milkey7dac7da2017-08-01 16:56:05 -0700154 "_bnd_exe": attr.label(
155 executable = True,
156 cfg = "host",
157 allow_files = True,
158 default = Label("//utils/osgiwrap:osgi-jar"),
159 ),
160 },
161 fragments = ["java"],
162 outputs = {
163 "osgi_jar": "lib%{name}.jar",
164 },
165 implementation = _bnd_impl,
166)
167
Ray Milkey275af2c2018-06-15 13:05:08 -0700168"""
169 Implementation of the rule to call swagger generator to create the registrator java class source
170"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700171
Ray Milkey275af2c2018-06-15 13:05:08 -0700172def _swagger_java_impl(ctx):
173 api_title = ctx.attr.api_title
174 api_version = ctx.attr.api_version
175 api_description = ctx.attr.api_description
176 api_package = ctx.attr.api_package
177 web_context = ctx.attr.web_context
178
179 output_java = ctx.outputs.swagger_java.path
Ray Milkey6b3775a2018-06-28 11:18:44 -0700180 output_dir = output_java[:output_java.find("generated-sources")]
Ray Milkey275af2c2018-06-15 13:05:08 -0700181
182 package_name = ctx.attr.package_name
183
184 srcs_arg = ""
185 resources_arg = ""
186 input_dependencies = []
187
188 for file in ctx.files.srcs:
189 srcs_arg += file.path + ","
190 input_dependencies.append(file)
191
192 for resource in resources_arg:
193 resources_arg += resource.path + ","
194
195 # call swagger generator to make the swagger JSON and java files
196 arguments = [
197 srcs_arg,
198 resources_arg,
199 "",
200 package_name + "/src/main/resources",
201 output_dir,
202 output_dir,
203 web_context,
204 api_title,
205 api_version,
206 api_package,
207 api_description,
208 ]
209
210 ctx.actions.run(
211 inputs = ctx.files.srcs,
212 outputs = [ctx.outputs.swagger_java],
213 arguments = arguments,
214 progress_message = "Running swagger generator on: %s" % ctx.attr.name,
215 executable = ctx.executable._swagger_generator_exe,
216 )
217
218"""
219Implementation of the rule to call swagger generator for swagger.json file
220"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700221
Ray Milkey275af2c2018-06-15 13:05:08 -0700222def _swagger_json_impl(ctx):
223 api_title = ctx.attr.api_title
224 api_version = ctx.attr.api_version
225 api_description = ctx.attr.api_description
226 api_package = ctx.attr.api_package
227 web_context = ctx.attr.web_context
228
229 output_json = ctx.outputs.swagger_json.path
230 output_dir = output_json[:output_json.find("swagger.json")]
231
232 package_name = ctx.attr.package_name
233
234 srcs_arg = ""
235 resources_arg = ""
236 input_dependencies = []
237
238 for file in ctx.files.srcs:
239 srcs_arg += file.path + ","
240 input_dependencies.append(file)
241
242 for resource in resources_arg:
243 resources_arg += resource.path + ","
244
245 # call swagger generator to make the swagger JSON and java files
246 arguments = [
247 srcs_arg,
248 resources_arg,
249 "",
250 package_name + "/src/main/resources",
251 output_dir,
252 output_dir,
253 web_context,
254 api_title,
255 api_version,
256 api_package,
257 api_description,
258 ]
259
260 ctx.actions.run(
261 inputs = ctx.files.srcs,
262 outputs = [ctx.outputs.swagger_json],
263 arguments = arguments,
264 progress_message = "Running swagger generator on: %s" % ctx.attr.name,
265 executable = ctx.executable._swagger_generator_exe,
266 )
267
268"""
269 Rule definition to call swagger generator to create the registrator java class source
270"""
271_swagger_java = rule(
272 attrs = {
273 "srcs": attr.label_list(allow_files = True),
274 "package_name": attr.string(),
275 "api_title": attr.string(),
276 "api_version": attr.string(),
277 "api_description": attr.string(),
278 "api_package": attr.string(),
279 "web_context": attr.string(),
280 "_swagger_generator_exe": attr.label(
281 executable = True,
282 cfg = "host",
283 allow_files = True,
284 default = Label("//tools/build/buck-plugin:swagger_generator"),
285 ),
286 "swagger_java": attr.output(),
287 },
288 fragments = ["java"],
289 implementation = _swagger_java_impl,
290)
291
292"""
293 Rule definition to call swagger generator to create the swagger JSON
294"""
295_swagger_json = rule(
296 attrs = {
297 "srcs": attr.label_list(allow_files = True),
298 "package_name": attr.string(),
299 "api_title": attr.string(),
300 "api_version": attr.string(),
301 "api_description": attr.string(),
302 "api_package": attr.string(),
303 "web_context": attr.string(),
304 "_swagger_generator_exe": attr.label(
305 executable = True,
306 cfg = "host",
307 allow_files = True,
308 default = Label("//tools/build/buck-plugin:swagger_generator"),
309 ),
310 "swagger_json": attr.output(),
311 },
312 fragments = ["java"],
313 implementation = _swagger_json_impl,
314)
315
316"""
317 Converts a jar file to an OSGI compatible jar file.
318
319 Args:
320 name: name of the rule to create the OSGI jar file - required
321 jar: jar file to convert - required target
322 deps: dependencies needed by the jar file - required list of targets
323 version: Version of the generated jar file. Optional, defaults to the current ONOS version
324 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
325 import_packages: OSGI import list. Optional, comma separated list, defaults to "*"
326 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to private
327"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700328
Ray Milkey25747d82018-06-13 14:12:51 -0700329def wrapped_osgi_jar(
330 name,
331 jar,
332 deps,
333 version = ONOS_VERSION,
Ray Milkey275af2c2018-06-15 13:05:08 -0700334 group = "org.onosproject",
Ray Milkey25747d82018-06-13 14:12:51 -0700335 import_packages = "*",
Ray Milkey25747d82018-06-13 14:12:51 -0700336 visibility = ["//visibility:private"]):
337 _bnd(
338 name = name,
339 source = jar,
340 deps = deps,
341 version = version,
Ray Milkey275af2c2018-06-15 13:05:08 -0700342 group = group,
Ray Milkey25747d82018-06-13 14:12:51 -0700343 visibility = visibility,
344 import_packages = import_packages,
Ray Milkey275af2c2018-06-15 13:05:08 -0700345 web_xml = None,
Ray Milkey25747d82018-06-13 14:12:51 -0700346 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700347
Ray Milkey275af2c2018-06-15 13:05:08 -0700348"""
349 Creates an OSGI jar and test jar file from a set of source and test files.
350 See osgi_jar() for a description of shared parameters.
351 Args:
352 test_srcs: Test source file(s) to compile. Optional list of targets, defaults to src/test/java/**/*.java
353 test_deps: Dependencies for the test jar. Optional list of targets, defaults to a common set of dependencies
354 test_resources: Resources to include in the test jar. Optional list of targets, defaults to src/test/resources/**
355 exclude_tests: Tests that should not be run. Useful for excluding things like test files without any @Test methods.
356 Optional ist of targets, defaults to []
357"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700358
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700359def osgi_jar_with_tests(
360 name = None,
361 deps = None,
362 test_deps = None,
Ray Milkey275af2c2018-06-15 13:05:08 -0700363 group = "org.onosproject",
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700364 srcs = None,
365 resources_root = None,
366 resources = None,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700367 resource_jars = [],
Ray Milkey6b3775a2018-06-28 11:18:44 -0700368 include_resources = {},
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700369 test_srcs = None,
370 exclude_tests = None,
Thomas Vachuskaa79bf6e2018-08-07 11:24:40 -0700371 medium_tests = [],
372 large_tests = [],
373 enormous_tests = [],
374 flaky_tests = [],
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700375 test_resources = None,
376 visibility = ["//visibility:public"],
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700377 version = ONOS_VERSION,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700378 suppress_errorprone = False,
Ray Milkey134d2922018-07-15 15:24:01 -0700379 suppress_checkstyle = False,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700380 suppress_javadocs = False,
Ray Milkey25747d82018-06-13 14:12:51 -0700381 web_context = None,
382 api_title = "",
383 api_version = "",
384 api_description = "",
385 api_package = "",
Jian Li4ad86872018-08-05 03:34:35 +0900386 import_packages = None,
387 bundle_classpath = ""):
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700388 if name == None:
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700389 name = _auto_name()
Ray Milkey7dac7da2017-08-01 16:56:05 -0700390 if srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700391 srcs = _all_java_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700392 if resources == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700393 resources = _all_resources(resources_root)
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700394 if test_srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700395 test_srcs = _all_java_test_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700396 if test_resources == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700397 test_resources = _all_test_resources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700398 if exclude_tests == None:
399 exclude_tests = []
Ray Milkey7dac7da2017-08-01 16:56:05 -0700400 if deps == None:
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700401 deps = COMPILE
402 if test_deps == None:
403 test_deps = TEST
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700404 if import_packages == None:
405 import_packages = "*"
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700406 tests_name = name + "-tests"
407 tests_jar_deps = list(depset(deps + test_deps)) + [name]
408 all_test_deps = tests_jar_deps + [tests_name]
Ray Milkey25747d82018-06-13 14:12:51 -0700409 web_xml = _webapp()
Ray Milkey7dac7da2017-08-01 16:56:05 -0700410
Ray Milkey275af2c2018-06-15 13:05:08 -0700411 native_srcs = srcs
412 native_resources = resources
Andrea Campanellaf390eeb2019-01-17 16:05:03 +0100413
414 if web_context != None and api_title != "":
Ray Milkey275af2c2018-06-15 13:05:08 -0700415 # generate Swagger files if needed
416 _swagger_java(
417 name = name + "_swagger_java",
418 srcs = srcs + resources,
419 package_name = native.package_name(),
420 api_title = api_title,
421 api_version = api_version,
422 api_description = api_description,
423 web_context = web_context,
424 api_package = api_package,
425 swagger_java = ("src/main/resources/apidoc/generated-sources/" +
Ray Milkey6b3775a2018-06-28 11:18:44 -0700426 api_package.replace(".", "/") +
427 "/ApiDocRegistrator.java").replace("//", "/"),
Ray Milkey275af2c2018-06-15 13:05:08 -0700428 )
429 _swagger_json(
430 name = name + "_swagger_json",
431 srcs = srcs + resources,
432 package_name = native.package_name(),
433 api_title = api_title,
434 api_version = api_version,
435 api_description = api_description,
436 web_context = web_context,
437 api_package = api_package,
438 swagger_json = "src/main/resources/apidoc/swagger.json",
439 )
440 native_resources = []
441 for r in resources:
Ray Milkey6b3775a2018-06-28 11:18:44 -0700442 if not "definitions" in r:
Ray Milkey275af2c2018-06-15 13:05:08 -0700443 native_resources.append(r)
Ray Milkey6b3775a2018-06-28 11:18:44 -0700444 native_srcs = srcs + [name + "_swagger_java"]
445 native_resources.append(name + "_swagger_json")
Ray Milkey275af2c2018-06-15 13:05:08 -0700446
Ray Milkey5063f5b2018-08-15 16:22:30 -0700447 javacopts = ["-XepDisableAllChecks"] if suppress_errorprone else []
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700448
Ray Milkey25747d82018-06-13 14:12:51 -0700449 # compile the Java code
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700450 if len(resource_jars) > 0:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700451 native.java_library(
452 name = name + "-native",
453 srcs = native_srcs,
454 resource_jars = resource_jars,
455 deps = deps,
456 visibility = visibility,
457 javacopts = javacopts,
458 )
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700459 else:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700460 native.java_library(
461 name = name + "-native",
462 srcs = native_srcs,
463 resources = native_resources,
464 deps = deps,
465 visibility = visibility,
466 javacopts = javacopts,
467 )
Ray Milkey25747d82018-06-13 14:12:51 -0700468
Ray Milkey32ea35c2018-06-06 15:28:07 -0700469 _bnd(
Ray Milkey25b785a2018-06-12 09:59:14 -0700470 name = name,
471 source = name + "-native",
Ray Milkey32ea35c2018-06-06 15:28:07 -0700472 deps = deps,
473 version = version,
Ray Milkey275af2c2018-06-15 13:05:08 -0700474 group = group,
Ray Milkey32ea35c2018-06-06 15:28:07 -0700475 visibility = visibility,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700476 import_packages = import_packages,
Jian Li4ad86872018-08-05 03:34:35 +0900477 bundle_classpath = bundle_classpath,
Ray Milkey25747d82018-06-13 14:12:51 -0700478 web_context = web_context,
479 web_xml = web_xml,
Ray Milkey6b3775a2018-06-28 11:18:44 -0700480 include_resources = _include_resources_to_string(include_resources),
Ray Milkey32ea35c2018-06-06 15:28:07 -0700481 )
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700482
Thomas Vachuskaac9e5242018-07-19 16:15:39 -0700483 # rule for generating pom file for publishing
484 pom_file(name = name + "-pom", artifact = name, deps = deps, visibility = visibility)
485
486 # rule for building source jar
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700487 if not suppress_javadocs:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700488 java_sources(name = name + "-sources", srcs = srcs, visibility = visibility)
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700489
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700490 # rule for building javadocs
491 if not suppress_javadocs:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700492 javadoc(name = name + "-javadoc", deps = deps, srcs = srcs, visibility = visibility)
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700493
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700494 if test_srcs != []:
495 native.java_library(
496 name = tests_name,
497 srcs = test_srcs,
498 resources = test_resources,
499 deps = tests_jar_deps,
500 visibility = visibility,
501 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700502
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700503 generate_test_rules(
504 name = name + "-tests-gen",
505 test_files = test_srcs,
506 exclude_tests = exclude_tests,
Thomas Vachuskaa79bf6e2018-08-07 11:24:40 -0700507 medium_tests = medium_tests,
508 large_tests = large_tests,
509 enormous_tests = enormous_tests,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700510 deps = all_test_deps,
511 )
512
Ray Milkey134d2922018-07-15 15:24:01 -0700513 if not suppress_checkstyle:
514 checkstyle_test(
515 name = name + "_checkstyle_test",
516 srcs = srcs,
517 )
Ray Milkeyb7949e72018-06-19 18:31:02 -0700518
Ray Milkey275af2c2018-06-15 13:05:08 -0700519"""
520 Creates an OSGI jar file from a set of source files.
521
522 Args:
523 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
524 For example apps/mcast/app becomes onos-apps-mcast-app
525 deps: Dependencies of the generated jar file. Expressed as a list of targets
526 import_packages: OSGI import list. Optional, comma separated list, defaults to "*"
Jian Li4ad86872018-08-05 03:34:35 +0900527 bundle_classpath: intended for including dependencies in our bundle, so that our bundle can be deployed standalone
Ray Milkey275af2c2018-06-15 13:05:08 -0700528 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
529 srcs: Source file(s) to compile. Optional list of targets, defaults to src/main/java/**/*.java
530 resources_root: Relative path to the root of the tree of resources for this jar. Optional, defaults to src/main/resources
531 resources: Resources to include in the jar file. Optional list of targets, defaults to all files beneath resources_root
532 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
533 version: Version of the generated jar file. Optional, defaults to the current ONOS version
Ray Milkey134d2922018-07-15 15:24:01 -0700534 suppress_errorprone: If true, don't run ErrorProne tests. Default is false
535 suppress_checkstyle: If true, don't run checkstyle tests. Default is false
Ray Milkey275af2c2018-06-15 13:05:08 -0700536 web_context: Web context for a WAB file if needed. Only needed if the jar file provides a REST API. Optional string
537 api_title: Swagger API title. Optional string, only used if the jar file provides a REST API and has swagger annotations
538 api_version: Swagger API version. Optional string, only used if the jar file provides a REST API and has swagger annotations
539 api_description: Swagger API description. Optional string, only used if the jar file provides a REST API and has swagger annotations
540 api_package: Swagger API package name. Optional string, only used if the jar file provides a REST API and has swagger annotations
541"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700542
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700543def osgi_jar(
544 name = None,
545 deps = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700546 import_packages = None,
Ray Milkey275af2c2018-06-15 13:05:08 -0700547 group = "org.onosproject",
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700548 srcs = None,
549 resources_root = None,
550 resources = None,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700551 resource_jars = [],
Ray Milkey6b3775a2018-06-28 11:18:44 -0700552 include_resources = {},
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700553 visibility = ["//visibility:public"],
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700554 version = ONOS_VERSION,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700555 suppress_errorprone = False,
Ray Milkey134d2922018-07-15 15:24:01 -0700556 suppress_checkstyle = False,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700557 suppress_javadocs = False,
Ray Milkey25747d82018-06-13 14:12:51 -0700558 web_context = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700559 api_title = "",
560 api_version = "",
561 api_description = "",
Jian Li4ad86872018-08-05 03:34:35 +0900562 api_package = "",
563 bundle_classpath = ""):
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700564 if srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700565 srcs = _all_java_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700566 if deps == None:
567 deps = COMPILE
568
569 osgi_jar_with_tests(
570 name = name,
571 deps = deps,
572 test_deps = [],
Ray Milkey275af2c2018-06-15 13:05:08 -0700573 group = group,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700574 srcs = srcs,
575 resources = resources,
576 resources_root = resources_root,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700577 resource_jars = resource_jars,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700578 test_srcs = [],
579 exclude_tests = [],
580 test_resources = [],
581 visibility = visibility,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700582 suppress_errorprone = suppress_errorprone,
Ray Milkey134d2922018-07-15 15:24:01 -0700583 suppress_checkstyle = suppress_checkstyle,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700584 suppress_javadocs = suppress_javadocs,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700585 version = version,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700586 import_packages = import_packages,
Ray Milkey275af2c2018-06-15 13:05:08 -0700587 api_title = api_title,
588 api_version = api_version,
589 api_description = api_description,
590 api_package = api_package,
Ray Milkey25747d82018-06-13 14:12:51 -0700591 web_context = web_context,
Jian Li4ad86872018-08-05 03:34:35 +0900592 bundle_classpath = bundle_classpath,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700593 )
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700594
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700595"""
596 Creates an OSGI jar file from a set of protobuf and gRPC libraries.
597
598 Args:
599 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
600 For example apps/mcast/app becomes onos-apps-mcast-app
601 proto_libs: (required) list of proto_library targets which generated Java classes will be included to this OSGi
602 jar. It is important that all the given targets reference to a single proto source files, for example
603 only the first 2 rules are good:
604
605 proto_library(
606 name = "foo_proto",
607 srcs = ["foo.proto"],
608 )
609
610 proto_library(
611 name = "bar_proto",
612 srcs = ["bar.proto"],
613 )
614
615 # THIS WILL NOT WORK
616 proto_library(
617 name = "foo_and_bar_proto",
618 srcs = ["foo.proto", "bar.proto"],
619 )
620
621 grpc_proto_lib: (optional) proto_library target that contains the schema of a gRPC service. If not passed,
622 the produced jar will NOT have any gRPC stub classes.
623 deps: Dependencies of the generated jar file. Expressed as a list of targets
624 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
625 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
626 version: Version of the generated jar file. Optional, defaults to the current ONOS version
627"""
628
629def osgi_proto_jar(
630 proto_libs,
631 grpc_proto_lib = None,
632 name = None,
633 deps = [],
634 group = "org.onosproject",
635 visibility = ["//visibility:public"],
Ray Milkey5063f5b2018-08-15 16:22:30 -0700636 version = ONOS_VERSION):
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700637 if name == None:
638 name = _auto_name()
639 native.java_proto_library(
640 name = name + "-java-proto",
641 deps = proto_libs,
642 )
643 java_sources_alt(
644 name = name + "-proto-srcjar",
645 srcs = [":%s-java-proto" % name],
646 )
647 osgi_srcs = [
648 ":%s-proto-srcjar" % name,
649 ]
650 base_deps = [
651 "@com_google_protobuf//:protobuf_java",
652 ]
653 if grpc_proto_lib != None:
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700654 java_grpc_library(
655 name = name + "-java-grpc",
656 srcs = [grpc_proto_lib],
657 deps = [":%s-java-proto" % name],
658 )
659 osgi_srcs.append(
Ray Milkey5063f5b2018-08-15 16:22:30 -0700660 ":%s-java-grpc__do_not_reference__srcjar" % name,
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700661 )
662 base_deps.extend([
663 "@com_google_guava_guava//jar",
664 "@io_grpc_grpc_java//core",
665 "@io_grpc_grpc_java//stub",
666 "@io_grpc_grpc_java//protobuf",
667 ])
668 osgi_jar(
669 name = name,
670 srcs = osgi_srcs,
671 deps = base_deps + deps,
672 group = group,
673 visibility = visibility,
674 version = version,
675 suppress_errorprone = True,
676 suppress_checkstyle = True,
677 suppress_javadocs = True,
678 )