blob: bd68a30bf059a18897640001bc3bc25f5dd2e29f [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
Ray Milkey6b3775a2018-06-28 11:18:44 -0700413 if web_context != None and api_title != "" and len(resources) != 0:
Ray Milkey275af2c2018-06-15 13:05:08 -0700414 # generate Swagger files if needed
415 _swagger_java(
416 name = name + "_swagger_java",
417 srcs = srcs + resources,
418 package_name = native.package_name(),
419 api_title = api_title,
420 api_version = api_version,
421 api_description = api_description,
422 web_context = web_context,
423 api_package = api_package,
424 swagger_java = ("src/main/resources/apidoc/generated-sources/" +
Ray Milkey6b3775a2018-06-28 11:18:44 -0700425 api_package.replace(".", "/") +
426 "/ApiDocRegistrator.java").replace("//", "/"),
Ray Milkey275af2c2018-06-15 13:05:08 -0700427 )
428 _swagger_json(
429 name = name + "_swagger_json",
430 srcs = srcs + resources,
431 package_name = native.package_name(),
432 api_title = api_title,
433 api_version = api_version,
434 api_description = api_description,
435 web_context = web_context,
436 api_package = api_package,
437 swagger_json = "src/main/resources/apidoc/swagger.json",
438 )
439 native_resources = []
440 for r in resources:
Ray Milkey6b3775a2018-06-28 11:18:44 -0700441 if not "definitions" in r:
Ray Milkey275af2c2018-06-15 13:05:08 -0700442 native_resources.append(r)
Ray Milkey6b3775a2018-06-28 11:18:44 -0700443 native_srcs = srcs + [name + "_swagger_java"]
444 native_resources.append(name + "_swagger_json")
Ray Milkey275af2c2018-06-15 13:05:08 -0700445
Ray Milkey5063f5b2018-08-15 16:22:30 -0700446 javacopts = ["-XepDisableAllChecks"] if suppress_errorprone else []
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700447
Ray Milkey25747d82018-06-13 14:12:51 -0700448 # compile the Java code
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700449 if len(resource_jars) > 0:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700450 native.java_library(
451 name = name + "-native",
452 srcs = native_srcs,
453 resource_jars = resource_jars,
454 deps = deps,
455 visibility = visibility,
456 javacopts = javacopts,
457 )
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700458 else:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700459 native.java_library(
460 name = name + "-native",
461 srcs = native_srcs,
462 resources = native_resources,
463 deps = deps,
464 visibility = visibility,
465 javacopts = javacopts,
466 )
Ray Milkey25747d82018-06-13 14:12:51 -0700467
Ray Milkey32ea35c2018-06-06 15:28:07 -0700468 _bnd(
Ray Milkey25b785a2018-06-12 09:59:14 -0700469 name = name,
470 source = name + "-native",
Ray Milkey32ea35c2018-06-06 15:28:07 -0700471 deps = deps,
472 version = version,
Ray Milkey275af2c2018-06-15 13:05:08 -0700473 group = group,
Ray Milkey32ea35c2018-06-06 15:28:07 -0700474 visibility = visibility,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700475 import_packages = import_packages,
Jian Li4ad86872018-08-05 03:34:35 +0900476 bundle_classpath = bundle_classpath,
Ray Milkey25747d82018-06-13 14:12:51 -0700477 web_context = web_context,
478 web_xml = web_xml,
Ray Milkey6b3775a2018-06-28 11:18:44 -0700479 include_resources = _include_resources_to_string(include_resources),
Ray Milkey32ea35c2018-06-06 15:28:07 -0700480 )
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700481
Thomas Vachuskaac9e5242018-07-19 16:15:39 -0700482 # rule for generating pom file for publishing
483 pom_file(name = name + "-pom", artifact = name, deps = deps, visibility = visibility)
484
485 # rule for building source jar
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700486 if not suppress_javadocs:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700487 java_sources(name = name + "-sources", srcs = srcs, visibility = visibility)
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700488
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700489 # rule for building javadocs
490 if not suppress_javadocs:
Ray Milkey5063f5b2018-08-15 16:22:30 -0700491 javadoc(name = name + "-javadoc", deps = deps, srcs = srcs, visibility = visibility)
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700492
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700493 if test_srcs != []:
494 native.java_library(
495 name = tests_name,
496 srcs = test_srcs,
497 resources = test_resources,
498 deps = tests_jar_deps,
499 visibility = visibility,
500 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700501
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700502 generate_test_rules(
503 name = name + "-tests-gen",
504 test_files = test_srcs,
505 exclude_tests = exclude_tests,
Thomas Vachuskaa79bf6e2018-08-07 11:24:40 -0700506 medium_tests = medium_tests,
507 large_tests = large_tests,
508 enormous_tests = enormous_tests,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700509 deps = all_test_deps,
510 )
511
Ray Milkey134d2922018-07-15 15:24:01 -0700512 if not suppress_checkstyle:
513 checkstyle_test(
514 name = name + "_checkstyle_test",
515 srcs = srcs,
516 )
Ray Milkeyb64fe822018-08-30 09:18:16 -0700517 if test_srcs != []:
518 checkstyle_test(
519 name = name + "_checkstyle_tests_test",
520 srcs = test_srcs,
521 )
Ray Milkeyb7949e72018-06-19 18:31:02 -0700522
Ray Milkey275af2c2018-06-15 13:05:08 -0700523"""
524 Creates an OSGI jar file from a set of source files.
525
526 Args:
527 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
528 For example apps/mcast/app becomes onos-apps-mcast-app
529 deps: Dependencies of the generated jar file. Expressed as a list of targets
530 import_packages: OSGI import list. Optional, comma separated list, defaults to "*"
Jian Li4ad86872018-08-05 03:34:35 +0900531 bundle_classpath: intended for including dependencies in our bundle, so that our bundle can be deployed standalone
Ray Milkey275af2c2018-06-15 13:05:08 -0700532 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
533 srcs: Source file(s) to compile. Optional list of targets, defaults to src/main/java/**/*.java
534 resources_root: Relative path to the root of the tree of resources for this jar. Optional, defaults to src/main/resources
535 resources: Resources to include in the jar file. Optional list of targets, defaults to all files beneath resources_root
536 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
537 version: Version of the generated jar file. Optional, defaults to the current ONOS version
Ray Milkey134d2922018-07-15 15:24:01 -0700538 suppress_errorprone: If true, don't run ErrorProne tests. Default is false
539 suppress_checkstyle: If true, don't run checkstyle tests. Default is false
Ray Milkey275af2c2018-06-15 13:05:08 -0700540 web_context: Web context for a WAB file if needed. Only needed if the jar file provides a REST API. Optional string
541 api_title: Swagger API title. Optional string, only used if the jar file provides a REST API and has swagger annotations
542 api_version: Swagger API version. Optional string, only used if the jar file provides a REST API and has swagger annotations
543 api_description: Swagger API description. Optional string, only used if the jar file provides a REST API and has swagger annotations
544 api_package: Swagger API package name. Optional string, only used if the jar file provides a REST API and has swagger annotations
545"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700546
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700547def osgi_jar(
548 name = None,
549 deps = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700550 import_packages = None,
Ray Milkey275af2c2018-06-15 13:05:08 -0700551 group = "org.onosproject",
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700552 srcs = None,
553 resources_root = None,
554 resources = None,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700555 resource_jars = [],
Ray Milkey6b3775a2018-06-28 11:18:44 -0700556 include_resources = {},
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700557 visibility = ["//visibility:public"],
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700558 version = ONOS_VERSION,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700559 suppress_errorprone = False,
Ray Milkey134d2922018-07-15 15:24:01 -0700560 suppress_checkstyle = False,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700561 suppress_javadocs = False,
Ray Milkey25747d82018-06-13 14:12:51 -0700562 web_context = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700563 api_title = "",
564 api_version = "",
565 api_description = "",
Jian Li4ad86872018-08-05 03:34:35 +0900566 api_package = "",
567 bundle_classpath = ""):
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700568 if srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700569 srcs = _all_java_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700570 if deps == None:
571 deps = COMPILE
572
573 osgi_jar_with_tests(
574 name = name,
575 deps = deps,
576 test_deps = [],
Ray Milkey275af2c2018-06-15 13:05:08 -0700577 group = group,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700578 srcs = srcs,
579 resources = resources,
580 resources_root = resources_root,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700581 resource_jars = resource_jars,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700582 test_srcs = [],
583 exclude_tests = [],
584 test_resources = [],
585 visibility = visibility,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700586 suppress_errorprone = suppress_errorprone,
Ray Milkey134d2922018-07-15 15:24:01 -0700587 suppress_checkstyle = suppress_checkstyle,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700588 suppress_javadocs = suppress_javadocs,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700589 version = version,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700590 import_packages = import_packages,
Ray Milkey275af2c2018-06-15 13:05:08 -0700591 api_title = api_title,
592 api_version = api_version,
593 api_description = api_description,
594 api_package = api_package,
Ray Milkey25747d82018-06-13 14:12:51 -0700595 web_context = web_context,
Jian Li4ad86872018-08-05 03:34:35 +0900596 bundle_classpath = bundle_classpath,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700597 )
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700598
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700599"""
600 Creates an OSGI jar file from a set of protobuf and gRPC libraries.
601
602 Args:
603 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
604 For example apps/mcast/app becomes onos-apps-mcast-app
605 proto_libs: (required) list of proto_library targets which generated Java classes will be included to this OSGi
606 jar. It is important that all the given targets reference to a single proto source files, for example
607 only the first 2 rules are good:
608
609 proto_library(
610 name = "foo_proto",
611 srcs = ["foo.proto"],
612 )
613
614 proto_library(
615 name = "bar_proto",
616 srcs = ["bar.proto"],
617 )
618
619 # THIS WILL NOT WORK
620 proto_library(
621 name = "foo_and_bar_proto",
622 srcs = ["foo.proto", "bar.proto"],
623 )
624
625 grpc_proto_lib: (optional) proto_library target that contains the schema of a gRPC service. If not passed,
626 the produced jar will NOT have any gRPC stub classes.
627 deps: Dependencies of the generated jar file. Expressed as a list of targets
628 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
629 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
630 version: Version of the generated jar file. Optional, defaults to the current ONOS version
631"""
632
633def osgi_proto_jar(
634 proto_libs,
635 grpc_proto_lib = None,
636 name = None,
637 deps = [],
638 group = "org.onosproject",
639 visibility = ["//visibility:public"],
Ray Milkey5063f5b2018-08-15 16:22:30 -0700640 version = ONOS_VERSION):
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700641 if name == None:
642 name = _auto_name()
643 native.java_proto_library(
644 name = name + "-java-proto",
645 deps = proto_libs,
646 )
647 java_sources_alt(
648 name = name + "-proto-srcjar",
649 srcs = [":%s-java-proto" % name],
650 )
651 osgi_srcs = [
652 ":%s-proto-srcjar" % name,
653 ]
654 base_deps = [
655 "@com_google_protobuf//:protobuf_java",
656 ]
657 if grpc_proto_lib != None:
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700658 java_grpc_library(
659 name = name + "-java-grpc",
660 srcs = [grpc_proto_lib],
661 deps = [":%s-java-proto" % name],
662 )
663 osgi_srcs.append(
Ray Milkey5063f5b2018-08-15 16:22:30 -0700664 ":%s-java-grpc__do_not_reference__srcjar" % name,
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700665 )
666 base_deps.extend([
667 "@com_google_guava_guava//jar",
668 "@io_grpc_grpc_java//core",
669 "@io_grpc_grpc_java//stub",
670 "@io_grpc_grpc_java//protobuf",
671 ])
672 osgi_jar(
673 name = name,
674 srcs = osgi_srcs,
675 deps = base_deps + deps,
676 group = group,
677 visibility = visibility,
678 version = version,
679 suppress_errorprone = True,
680 suppress_checkstyle = True,
681 suppress_javadocs = True,
682 )