blob: 0014eb84f610931fb2fcb9295eec5ecb01754ebc [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 Milkeyd84f89b2018-08-17 14:54:17 -070086 karaf_commands = ctx.attr.karaf_commands
Ray Milkey3275ae82018-05-29 15:35:36 -070087 cp = ""
Ray Milkey7dac7da2017-08-01 16:56:05 -070088
Ray Milkey3275ae82018-05-29 15:35:36 -070089 inputDependencies = [input_file]
Ray Milkey7dac7da2017-08-01 16:56:05 -070090
Ray Milkey0bcdfd12018-05-23 14:07:19 -070091 # determine the dependencies and build the class path
92 for dep in ctx.attr.deps:
Ray Milkey25b785a2018-06-12 09:59:14 -070093 if java_common.provider in dep:
94 file = dep.files.to_list()[0]
Ray Milkey25b785a2018-06-12 09:59:14 -070095 if cp:
96 cp += ":"
97 cp += file.path
98 inputDependencies = inputDependencies + [file]
Ray Milkey7dac7da2017-08-01 16:56:05 -070099
Ray Milkey25747d82018-06-13 14:12:51 -0700100 web_xml_root_path = ""
101 if len(web_xml) != 0:
102 web_xml_root = web_xml[0].files.to_list()[0]
103 inputDependencies += [web_xml_root]
104 web_xml_root_path = web_xml_root.path.replace("WEB-INF/web.xml", "")
Ray Milkey7dac7da2017-08-01 16:56:05 -0700105
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700106 # call bnd to make the OSGI jar file
107 arguments = [
108 jar,
109 output,
110 cp,
111 name,
112 group,
113 version,
114 license,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700115 import_packages,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700116 exportPackages,
Ray Milkey6b3775a2018-06-28 11:18:44 -0700117 include_resources,
Ray Milkey25747d82018-06-13 14:12:51 -0700118 web_context,
119 web_xml_root_path,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700120 dynamicimportPackages,
Thomas Vachuskae4436942018-08-07 19:27:10 -0700121 "classes",
Jian Li4ad86872018-08-05 03:34:35 +0900122 bundle_classpath,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700123 karaf_commands,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700124 ]
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700125
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700126 ctx.actions.run(
127 inputs = inputDependencies,
128 outputs = [ctx.outputs.osgi_jar],
129 arguments = arguments,
130 progress_message = "Running bnd wrapper on: %s" % ctx.attr.name,
131 executable = ctx.executable._bnd_exe,
132 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700133
Ray Milkey25b785a2018-06-12 09:59:14 -0700134 deps = []
135 if java_common.provider in ctx.attr.source:
136 deps.append(ctx.attr.source[java_common.provider])
137 deps_provider = java_common.merge(deps)
138 return struct(
Ray Milkey15053f02018-06-13 10:00:45 -0700139 providers = [deps_provider],
Ray Milkey25b785a2018-06-12 09:59:14 -0700140 )
141
Ray Milkey275af2c2018-06-15 13:05:08 -0700142"""
143 Rule definition for calling bnd to make an OSGi jar file.
144"""
Ray Milkey32ea35c2018-06-06 15:28:07 -0700145_bnd = rule(
Ray Milkey7dac7da2017-08-01 16:56:05 -0700146 attrs = {
147 "deps": attr.label_list(),
148 "version": attr.string(),
Ray Milkey275af2c2018-06-15 13:05:08 -0700149 "group": attr.string(),
Ray Milkey3275ae82018-05-29 15:35:36 -0700150 "source": attr.label(),
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700151 "import_packages": attr.string(),
Jian Li4ad86872018-08-05 03:34:35 +0900152 "bundle_classpath": attr.string(),
Ray Milkey25747d82018-06-13 14:12:51 -0700153 "web_context": attr.string(),
154 "web_xml": attr.label_list(allow_files = True),
Ray Milkey6b3775a2018-06-28 11:18:44 -0700155 "include_resources": attr.string(),
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700156 "karaf_commands": attr.string(),
Ray Milkey7dac7da2017-08-01 16:56:05 -0700157 "_bnd_exe": attr.label(
158 executable = True,
159 cfg = "host",
160 allow_files = True,
161 default = Label("//utils/osgiwrap:osgi-jar"),
162 ),
163 },
164 fragments = ["java"],
165 outputs = {
166 "osgi_jar": "lib%{name}.jar",
167 },
168 implementation = _bnd_impl,
169)
170
Ray Milkey275af2c2018-06-15 13:05:08 -0700171"""
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700172 Implementation of the rule to generate cfgdef files from java class source
173"""
174
175def _cfgdef_impl(ctx):
176 output_jar = ctx.outputs.cfgdef_jar.path
177
178 # call swagger generator to make the swagger JSON and java files
179 arguments = [
180 output_jar,
181 ctx.files.srcs,
182 ]
183
184 ctx.actions.run(
185 inputs = ctx.files.srcs,
186 outputs = [ctx.outputs.cfgdef_jar],
187 arguments = arguments,
188 progress_message = "Running cfgdef generator on: %s" % ctx.attr.name,
189 executable = ctx.executable._cfgdef_generator_exe,
190 )
191
192"""
193 Rule definition to call cfgdef generator to create the *.cfgdef files from java sources
194"""
195_cfgdef = rule(
196 attrs = {
197 "srcs": attr.label_list(allow_files = True),
198 "_cfgdef_generator_exe": attr.label(
199 executable = True,
200 cfg = "host",
201 allow_files = True,
202 default = Label("//tools/build/cfgdef:cfgdef_generator"),
203 ),
204 "cfgdef_jar": attr.output(),
205 },
206 fragments = ["java"],
207 implementation = _cfgdef_impl,
208)
209
210"""
Ray Milkey275af2c2018-06-15 13:05:08 -0700211 Implementation of the rule to call swagger generator to create the registrator java class source
212"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700213
Ray Milkey275af2c2018-06-15 13:05:08 -0700214def _swagger_java_impl(ctx):
215 api_title = ctx.attr.api_title
216 api_version = ctx.attr.api_version
217 api_description = ctx.attr.api_description
218 api_package = ctx.attr.api_package
219 web_context = ctx.attr.web_context
220
221 output_java = ctx.outputs.swagger_java.path
Ray Milkey6b3775a2018-06-28 11:18:44 -0700222 output_dir = output_java[:output_java.find("generated-sources")]
Ray Milkey275af2c2018-06-15 13:05:08 -0700223
224 package_name = ctx.attr.package_name
225
226 srcs_arg = ""
227 resources_arg = ""
228 input_dependencies = []
229
230 for file in ctx.files.srcs:
231 srcs_arg += file.path + ","
232 input_dependencies.append(file)
233
234 for resource in resources_arg:
235 resources_arg += resource.path + ","
236
237 # call swagger generator to make the swagger JSON and java files
238 arguments = [
239 srcs_arg,
240 resources_arg,
241 "",
242 package_name + "/src/main/resources",
243 output_dir,
244 output_dir,
245 web_context,
246 api_title,
247 api_version,
248 api_package,
249 api_description,
250 ]
251
252 ctx.actions.run(
253 inputs = ctx.files.srcs,
254 outputs = [ctx.outputs.swagger_java],
255 arguments = arguments,
256 progress_message = "Running swagger generator on: %s" % ctx.attr.name,
257 executable = ctx.executable._swagger_generator_exe,
258 )
259
260"""
261Implementation of the rule to call swagger generator for swagger.json file
262"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700263
Ray Milkey275af2c2018-06-15 13:05:08 -0700264def _swagger_json_impl(ctx):
265 api_title = ctx.attr.api_title
266 api_version = ctx.attr.api_version
267 api_description = ctx.attr.api_description
268 api_package = ctx.attr.api_package
269 web_context = ctx.attr.web_context
270
271 output_json = ctx.outputs.swagger_json.path
272 output_dir = output_json[:output_json.find("swagger.json")]
273
274 package_name = ctx.attr.package_name
275
276 srcs_arg = ""
277 resources_arg = ""
278 input_dependencies = []
279
280 for file in ctx.files.srcs:
281 srcs_arg += file.path + ","
282 input_dependencies.append(file)
283
284 for resource in resources_arg:
285 resources_arg += resource.path + ","
286
287 # call swagger generator to make the swagger JSON and java files
288 arguments = [
289 srcs_arg,
290 resources_arg,
291 "",
292 package_name + "/src/main/resources",
293 output_dir,
294 output_dir,
295 web_context,
296 api_title,
297 api_version,
298 api_package,
299 api_description,
300 ]
301
302 ctx.actions.run(
303 inputs = ctx.files.srcs,
304 outputs = [ctx.outputs.swagger_json],
305 arguments = arguments,
306 progress_message = "Running swagger generator on: %s" % ctx.attr.name,
307 executable = ctx.executable._swagger_generator_exe,
308 )
309
310"""
311 Rule definition to call swagger generator to create the registrator java class source
312"""
313_swagger_java = rule(
314 attrs = {
315 "srcs": attr.label_list(allow_files = True),
316 "package_name": attr.string(),
317 "api_title": attr.string(),
318 "api_version": attr.string(),
319 "api_description": attr.string(),
320 "api_package": attr.string(),
321 "web_context": attr.string(),
322 "_swagger_generator_exe": attr.label(
323 executable = True,
324 cfg = "host",
325 allow_files = True,
326 default = Label("//tools/build/buck-plugin:swagger_generator"),
327 ),
328 "swagger_java": attr.output(),
329 },
330 fragments = ["java"],
331 implementation = _swagger_java_impl,
332)
333
334"""
335 Rule definition to call swagger generator to create the swagger JSON
336"""
337_swagger_json = rule(
338 attrs = {
339 "srcs": attr.label_list(allow_files = True),
340 "package_name": attr.string(),
341 "api_title": attr.string(),
342 "api_version": attr.string(),
343 "api_description": attr.string(),
344 "api_package": attr.string(),
345 "web_context": attr.string(),
346 "_swagger_generator_exe": attr.label(
347 executable = True,
348 cfg = "host",
349 allow_files = True,
350 default = Label("//tools/build/buck-plugin:swagger_generator"),
351 ),
352 "swagger_json": attr.output(),
353 },
354 fragments = ["java"],
355 implementation = _swagger_json_impl,
356)
357
358"""
359 Converts a jar file to an OSGI compatible jar file.
360
361 Args:
362 name: name of the rule to create the OSGI jar file - required
363 jar: jar file to convert - required target
364 deps: dependencies needed by the jar file - required list of targets
365 version: Version of the generated jar file. Optional, defaults to the current ONOS version
366 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
367 import_packages: OSGI import list. Optional, comma separated list, defaults to "*"
368 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to private
369"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700370
Ray Milkey25747d82018-06-13 14:12:51 -0700371def wrapped_osgi_jar(
372 name,
373 jar,
374 deps,
375 version = ONOS_VERSION,
Ray Milkey275af2c2018-06-15 13:05:08 -0700376 group = "org.onosproject",
Ray Milkey25747d82018-06-13 14:12:51 -0700377 import_packages = "*",
Ray Milkey25747d82018-06-13 14:12:51 -0700378 visibility = ["//visibility:private"]):
379 _bnd(
380 name = name,
381 source = jar,
382 deps = deps,
383 version = version,
Ray Milkey275af2c2018-06-15 13:05:08 -0700384 group = group,
Ray Milkey25747d82018-06-13 14:12:51 -0700385 visibility = visibility,
386 import_packages = import_packages,
Ray Milkey275af2c2018-06-15 13:05:08 -0700387 web_xml = None,
Ray Milkey25747d82018-06-13 14:12:51 -0700388 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700389
Ray Milkey275af2c2018-06-15 13:05:08 -0700390"""
391 Creates an OSGI jar and test jar file from a set of source and test files.
392 See osgi_jar() for a description of shared parameters.
393 Args:
394 test_srcs: Test source file(s) to compile. Optional list of targets, defaults to src/test/java/**/*.java
395 test_deps: Dependencies for the test jar. Optional list of targets, defaults to a common set of dependencies
396 test_resources: Resources to include in the test jar. Optional list of targets, defaults to src/test/resources/**
397 exclude_tests: Tests that should not be run. Useful for excluding things like test files without any @Test methods.
398 Optional ist of targets, defaults to []
399"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700400
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700401def osgi_jar_with_tests(
402 name = None,
403 deps = None,
404 test_deps = None,
Ray Milkey275af2c2018-06-15 13:05:08 -0700405 group = "org.onosproject",
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700406 srcs = None,
407 resources_root = None,
408 resources = None,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700409 resource_jars = [],
Ray Milkey6b3775a2018-06-28 11:18:44 -0700410 include_resources = {},
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700411 test_srcs = None,
412 exclude_tests = None,
Thomas Vachuskaa79bf6e2018-08-07 11:24:40 -0700413 medium_tests = [],
414 large_tests = [],
415 enormous_tests = [],
416 flaky_tests = [],
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700417 test_resources = None,
418 visibility = ["//visibility:public"],
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700419 version = ONOS_VERSION,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700420 suppress_errorprone = False,
Ray Milkey134d2922018-07-15 15:24:01 -0700421 suppress_checkstyle = False,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700422 suppress_javadocs = False,
Ray Milkey25747d82018-06-13 14:12:51 -0700423 web_context = None,
424 api_title = "",
425 api_version = "",
426 api_description = "",
427 api_package = "",
Jian Li4ad86872018-08-05 03:34:35 +0900428 import_packages = None,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700429 bundle_classpath = "",
430 karaf_command_packages = []):
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700431 if name == None:
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700432 name = _auto_name()
Ray Milkey7dac7da2017-08-01 16:56:05 -0700433 if srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700434 srcs = _all_java_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700435 if resources == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700436 resources = _all_resources(resources_root)
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700437 if test_srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700438 test_srcs = _all_java_test_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700439 if test_resources == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700440 test_resources = _all_test_resources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700441 if exclude_tests == None:
442 exclude_tests = []
Ray Milkey7dac7da2017-08-01 16:56:05 -0700443 if deps == None:
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700444 deps = COMPILE
445 if test_deps == None:
446 test_deps = TEST
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700447 if import_packages == None:
448 import_packages = "*"
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700449 tests_name = name + "-tests"
450 tests_jar_deps = list(depset(deps + test_deps)) + [name]
451 all_test_deps = tests_jar_deps + [tests_name]
Ray Milkey25747d82018-06-13 14:12:51 -0700452 web_xml = _webapp()
Ray Milkey7dac7da2017-08-01 16:56:05 -0700453
Ray Milkey275af2c2018-06-15 13:05:08 -0700454 native_srcs = srcs
455 native_resources = resources
Thomas Vachuska24d4f6d2018-10-19 11:25:04 -0700456
457 # _cfgdef(
458 # name = name + "_cfgdef",
459 # srcs = native_srcs,
460 # visibility = visibility,
461 # )
462 # native_resources.append(name + "_cfgdef_jar")
463
464 if web_context != None and api_title != "" and len(resources) != 0:
Ray Milkey275af2c2018-06-15 13:05:08 -0700465 # generate Swagger files if needed
466 _swagger_java(
467 name = name + "_swagger_java",
468 srcs = srcs + resources,
469 package_name = native.package_name(),
470 api_title = api_title,
471 api_version = api_version,
472 api_description = api_description,
473 web_context = web_context,
474 api_package = api_package,
475 swagger_java = ("src/main/resources/apidoc/generated-sources/" +
Ray Milkey6b3775a2018-06-28 11:18:44 -0700476 api_package.replace(".", "/") +
477 "/ApiDocRegistrator.java").replace("//", "/"),
Ray Milkey275af2c2018-06-15 13:05:08 -0700478 )
479 _swagger_json(
480 name = name + "_swagger_json",
481 srcs = srcs + resources,
482 package_name = native.package_name(),
483 api_title = api_title,
484 api_version = api_version,
485 api_description = api_description,
486 web_context = web_context,
487 api_package = api_package,
488 swagger_json = "src/main/resources/apidoc/swagger.json",
489 )
490 native_resources = []
491 for r in resources:
Ray Milkey6b3775a2018-06-28 11:18:44 -0700492 if not "definitions" in r:
Ray Milkey275af2c2018-06-15 13:05:08 -0700493 native_resources.append(r)
Ray Milkey6b3775a2018-06-28 11:18:44 -0700494 native_srcs = srcs + [name + "_swagger_java"]
495 native_resources.append(name + "_swagger_json")
Ray Milkey275af2c2018-06-15 13:05:08 -0700496
Ray Milkey5063f5b2018-08-15 16:22:30 -0700497 javacopts = ["-XepDisableAllChecks"] if suppress_errorprone else []
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700498
Ray Milkey25747d82018-06-13 14:12:51 -0700499 # compile the Java code
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700500 if len(resource_jars) > 0:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700501 native.java_library(
502 name = name + "-native",
503 srcs = native_srcs,
504 resource_jars = resource_jars,
505 deps = deps,
506 visibility = visibility,
507 javacopts = javacopts,
508 )
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700509 else:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700510 native.java_library(
511 name = name + "-native",
512 srcs = native_srcs,
513 resources = native_resources,
514 deps = deps,
515 visibility = visibility,
516 javacopts = javacopts,
517 )
Ray Milkey25747d82018-06-13 14:12:51 -0700518
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700519 karaf_command_packages_string = ",".join(karaf_command_packages)
Ray Milkey32ea35c2018-06-06 15:28:07 -0700520 _bnd(
Ray Milkey25b785a2018-06-12 09:59:14 -0700521 name = name,
522 source = name + "-native",
Ray Milkey32ea35c2018-06-06 15:28:07 -0700523 deps = deps,
524 version = version,
Ray Milkey275af2c2018-06-15 13:05:08 -0700525 group = group,
Ray Milkey32ea35c2018-06-06 15:28:07 -0700526 visibility = visibility,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700527 import_packages = import_packages,
Jian Li4ad86872018-08-05 03:34:35 +0900528 bundle_classpath = bundle_classpath,
Ray Milkey25747d82018-06-13 14:12:51 -0700529 web_context = web_context,
530 web_xml = web_xml,
Ray Milkey6b3775a2018-06-28 11:18:44 -0700531 include_resources = _include_resources_to_string(include_resources),
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700532 karaf_commands = karaf_command_packages_string,
Ray Milkey32ea35c2018-06-06 15:28:07 -0700533 )
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700534
Thomas Vachuskaac9e5242018-07-19 16:15:39 -0700535 # rule for generating pom file for publishing
536 pom_file(name = name + "-pom", artifact = name, deps = deps, visibility = visibility)
537
538 # rule for building source jar
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700539 if not suppress_javadocs:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700540 java_sources(name = name + "-sources", srcs = srcs, visibility = visibility)
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700541
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700542 # rule for building javadocs
543 if not suppress_javadocs:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700544 javadoc(name = name + "-javadoc", deps = deps, srcs = srcs, visibility = visibility)
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700545
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700546 if test_srcs != []:
547 native.java_library(
548 name = tests_name,
549 srcs = test_srcs,
550 resources = test_resources,
551 deps = tests_jar_deps,
552 visibility = visibility,
553 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700554
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700555 generate_test_rules(
556 name = name + "-tests-gen",
557 test_files = test_srcs,
558 exclude_tests = exclude_tests,
Thomas Vachuskaa79bf6e2018-08-07 11:24:40 -0700559 medium_tests = medium_tests,
560 large_tests = large_tests,
561 enormous_tests = enormous_tests,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700562 deps = all_test_deps,
563 )
564
Ray Milkey134d2922018-07-15 15:24:01 -0700565 if not suppress_checkstyle:
566 checkstyle_test(
567 name = name + "_checkstyle_test",
568 srcs = srcs,
569 )
Ray Milkeyb64fe822018-08-30 09:18:16 -0700570 if test_srcs != []:
571 checkstyle_test(
572 name = name + "_checkstyle_tests_test",
573 srcs = test_srcs,
574 )
Ray Milkeyb7949e72018-06-19 18:31:02 -0700575
Ray Milkey275af2c2018-06-15 13:05:08 -0700576"""
577 Creates an OSGI jar file from a set of source files.
578
579 Args:
580 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
581 For example apps/mcast/app becomes onos-apps-mcast-app
582 deps: Dependencies of the generated jar file. Expressed as a list of targets
583 import_packages: OSGI import list. Optional, comma separated list, defaults to "*"
Jian Li4ad86872018-08-05 03:34:35 +0900584 bundle_classpath: intended for including dependencies in our bundle, so that our bundle can be deployed standalone
Ray Milkey275af2c2018-06-15 13:05:08 -0700585 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
586 srcs: Source file(s) to compile. Optional list of targets, defaults to src/main/java/**/*.java
587 resources_root: Relative path to the root of the tree of resources for this jar. Optional, defaults to src/main/resources
588 resources: Resources to include in the jar file. Optional list of targets, defaults to all files beneath resources_root
589 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
590 version: Version of the generated jar file. Optional, defaults to the current ONOS version
Ray Milkey134d2922018-07-15 15:24:01 -0700591 suppress_errorprone: If true, don't run ErrorProne tests. Default is false
592 suppress_checkstyle: If true, don't run checkstyle tests. Default is false
Ray Milkey275af2c2018-06-15 13:05:08 -0700593 web_context: Web context for a WAB file if needed. Only needed if the jar file provides a REST API. Optional string
594 api_title: Swagger API title. Optional string, only used if the jar file provides a REST API and has swagger annotations
595 api_version: Swagger API version. Optional string, only used if the jar file provides a REST API and has swagger annotations
596 api_description: Swagger API description. Optional string, only used if the jar file provides a REST API and has swagger annotations
597 api_package: Swagger API package name. Optional string, only used if the jar file provides a REST API and has swagger annotations
598"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700599
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700600def osgi_jar(
601 name = None,
602 deps = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700603 import_packages = None,
Ray Milkey275af2c2018-06-15 13:05:08 -0700604 group = "org.onosproject",
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700605 srcs = None,
606 resources_root = None,
607 resources = None,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700608 resource_jars = [],
Ray Milkey6b3775a2018-06-28 11:18:44 -0700609 include_resources = {},
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700610 visibility = ["//visibility:public"],
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700611 version = ONOS_VERSION,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700612 suppress_errorprone = False,
Ray Milkey134d2922018-07-15 15:24:01 -0700613 suppress_checkstyle = False,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700614 suppress_javadocs = False,
Ray Milkey25747d82018-06-13 14:12:51 -0700615 web_context = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700616 api_title = "",
617 api_version = "",
618 api_description = "",
Jian Li4ad86872018-08-05 03:34:35 +0900619 api_package = "",
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700620 bundle_classpath = "",
621 karaf_command_packages = []):
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700622 if srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700623 srcs = _all_java_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700624 if deps == None:
625 deps = COMPILE
626
627 osgi_jar_with_tests(
628 name = name,
629 deps = deps,
630 test_deps = [],
Ray Milkey275af2c2018-06-15 13:05:08 -0700631 group = group,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700632 srcs = srcs,
633 resources = resources,
634 resources_root = resources_root,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700635 resource_jars = resource_jars,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700636 test_srcs = [],
637 exclude_tests = [],
638 test_resources = [],
639 visibility = visibility,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700640 suppress_errorprone = suppress_errorprone,
Ray Milkey134d2922018-07-15 15:24:01 -0700641 suppress_checkstyle = suppress_checkstyle,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700642 suppress_javadocs = suppress_javadocs,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700643 version = version,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700644 import_packages = import_packages,
Ray Milkey275af2c2018-06-15 13:05:08 -0700645 api_title = api_title,
646 api_version = api_version,
647 api_description = api_description,
648 api_package = api_package,
Ray Milkey25747d82018-06-13 14:12:51 -0700649 web_context = web_context,
Jian Li4ad86872018-08-05 03:34:35 +0900650 bundle_classpath = bundle_classpath,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700651 karaf_command_packages = karaf_command_packages,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700652 )
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700653
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700654"""
655 Creates an OSGI jar file from a set of protobuf and gRPC libraries.
656
657 Args:
658 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
659 For example apps/mcast/app becomes onos-apps-mcast-app
660 proto_libs: (required) list of proto_library targets which generated Java classes will be included to this OSGi
661 jar. It is important that all the given targets reference to a single proto source files, for example
662 only the first 2 rules are good:
663
664 proto_library(
665 name = "foo_proto",
666 srcs = ["foo.proto"],
667 )
668
669 proto_library(
670 name = "bar_proto",
671 srcs = ["bar.proto"],
672 )
673
674 # THIS WILL NOT WORK
675 proto_library(
676 name = "foo_and_bar_proto",
677 srcs = ["foo.proto", "bar.proto"],
678 )
679
680 grpc_proto_lib: (optional) proto_library target that contains the schema of a gRPC service. If not passed,
681 the produced jar will NOT have any gRPC stub classes.
682 deps: Dependencies of the generated jar file. Expressed as a list of targets
683 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
684 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
685 version: Version of the generated jar file. Optional, defaults to the current ONOS version
686"""
687
688def osgi_proto_jar(
689 proto_libs,
690 grpc_proto_lib = None,
691 name = None,
692 deps = [],
693 group = "org.onosproject",
694 visibility = ["//visibility:public"],
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700695 version = ONOS_VERSION,
696 karaf_command_packages = []):
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700697 if name == None:
698 name = _auto_name()
699 native.java_proto_library(
700 name = name + "-java-proto",
701 deps = proto_libs,
702 )
703 java_sources_alt(
704 name = name + "-proto-srcjar",
705 srcs = [":%s-java-proto" % name],
706 )
707 osgi_srcs = [
708 ":%s-proto-srcjar" % name,
709 ]
710 base_deps = [
711 "@com_google_protobuf//:protobuf_java",
712 ]
713 if grpc_proto_lib != None:
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700714 java_grpc_library(
715 name = name + "-java-grpc",
716 srcs = [grpc_proto_lib],
717 deps = [":%s-java-proto" % name],
718 )
719 osgi_srcs.append(
Ray Milkey5063f5b2018-08-15 16:22:30 -0700720 ":%s-java-grpc__do_not_reference__srcjar" % name,
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700721 )
722 base_deps.extend([
723 "@com_google_guava_guava//jar",
724 "@io_grpc_grpc_java//core",
725 "@io_grpc_grpc_java//stub",
726 "@io_grpc_grpc_java//protobuf",
727 ])
728 osgi_jar(
729 name = name,
730 srcs = osgi_srcs,
731 deps = base_deps + deps,
732 group = group,
733 visibility = visibility,
734 version = version,
735 suppress_errorprone = True,
736 suppress_checkstyle = True,
737 suppress_javadocs = True,
Ray Milkeyd84f89b2018-08-17 14:54:17 -0700738 karaf_command_packages = karaf_command_packages,
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700739 )