blob: 0c2c21c41bc6ea42c6775f770d9c37d86ffb699f [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
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700446 javacopts = [ "-XepDisableAllChecks" ] if suppress_errorprone else []
447
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:
450 native.java_library(name = name + "-native", srcs = native_srcs, resource_jars = resource_jars,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700451 deps = deps, visibility = visibility, javacopts = javacopts)
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700452 else:
453 native.java_library(name = name + "-native", srcs = native_srcs, resources = native_resources,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700454 deps = deps, visibility = visibility, javacopts = javacopts)
Ray Milkey25747d82018-06-13 14:12:51 -0700455
Ray Milkey32ea35c2018-06-06 15:28:07 -0700456 _bnd(
Ray Milkey25b785a2018-06-12 09:59:14 -0700457 name = name,
458 source = name + "-native",
Ray Milkey32ea35c2018-06-06 15:28:07 -0700459 deps = deps,
460 version = version,
Ray Milkey275af2c2018-06-15 13:05:08 -0700461 group = group,
Ray Milkey32ea35c2018-06-06 15:28:07 -0700462 visibility = visibility,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700463 import_packages = import_packages,
Jian Li4ad86872018-08-05 03:34:35 +0900464 bundle_classpath = bundle_classpath,
Ray Milkey25747d82018-06-13 14:12:51 -0700465 web_context = web_context,
466 web_xml = web_xml,
Ray Milkey6b3775a2018-06-28 11:18:44 -0700467 include_resources = _include_resources_to_string(include_resources),
Ray Milkey32ea35c2018-06-06 15:28:07 -0700468 )
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700469
Thomas Vachuskaac9e5242018-07-19 16:15:39 -0700470 # rule for generating pom file for publishing
471 pom_file(name = name + "-pom", artifact = name, deps = deps, visibility = visibility)
472
473 # rule for building source jar
Thomas Vachuska50ac0982018-07-19 10:17:37 -0700474 if not suppress_javadocs:
475 java_sources(name = name + "-sources", srcs = srcs, visibility = visibility)
476
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700477 # rule for building javadocs
478 if not suppress_javadocs:
Ray Milkey7f46b1f2018-07-24 19:01:58 -0700479 javadoc(name = name + "-javadoc", deps = deps, srcs = srcs, visibility = visibility)
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700480
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700481 if test_srcs != []:
482 native.java_library(
483 name = tests_name,
484 srcs = test_srcs,
485 resources = test_resources,
486 deps = tests_jar_deps,
487 visibility = visibility,
488 )
Ray Milkey7dac7da2017-08-01 16:56:05 -0700489
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700490 generate_test_rules(
491 name = name + "-tests-gen",
492 test_files = test_srcs,
493 exclude_tests = exclude_tests,
Thomas Vachuskaa79bf6e2018-08-07 11:24:40 -0700494 medium_tests = medium_tests,
495 large_tests = large_tests,
496 enormous_tests = enormous_tests,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700497 deps = all_test_deps,
498 )
499
Ray Milkey134d2922018-07-15 15:24:01 -0700500 if not suppress_checkstyle:
501 checkstyle_test(
502 name = name + "_checkstyle_test",
503 srcs = srcs,
504 )
Ray Milkeyb7949e72018-06-19 18:31:02 -0700505
Ray Milkey275af2c2018-06-15 13:05:08 -0700506"""
507 Creates an OSGI jar file from a set of source files.
508
509 Args:
510 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
511 For example apps/mcast/app becomes onos-apps-mcast-app
512 deps: Dependencies of the generated jar file. Expressed as a list of targets
513 import_packages: OSGI import list. Optional, comma separated list, defaults to "*"
Jian Li4ad86872018-08-05 03:34:35 +0900514 bundle_classpath: intended for including dependencies in our bundle, so that our bundle can be deployed standalone
Ray Milkey275af2c2018-06-15 13:05:08 -0700515 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
516 srcs: Source file(s) to compile. Optional list of targets, defaults to src/main/java/**/*.java
517 resources_root: Relative path to the root of the tree of resources for this jar. Optional, defaults to src/main/resources
518 resources: Resources to include in the jar file. Optional list of targets, defaults to all files beneath resources_root
519 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
520 version: Version of the generated jar file. Optional, defaults to the current ONOS version
Ray Milkey134d2922018-07-15 15:24:01 -0700521 suppress_errorprone: If true, don't run ErrorProne tests. Default is false
522 suppress_checkstyle: If true, don't run checkstyle tests. Default is false
Ray Milkey275af2c2018-06-15 13:05:08 -0700523 web_context: Web context for a WAB file if needed. Only needed if the jar file provides a REST API. Optional string
524 api_title: Swagger API title. Optional string, only used if the jar file provides a REST API and has swagger annotations
525 api_version: Swagger API version. Optional string, only used if the jar file provides a REST API and has swagger annotations
526 api_description: Swagger API description. Optional string, only used if the jar file provides a REST API and has swagger annotations
527 api_package: Swagger API package name. Optional string, only used if the jar file provides a REST API and has swagger annotations
528"""
Ray Milkey6b3775a2018-06-28 11:18:44 -0700529
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700530def osgi_jar(
531 name = None,
532 deps = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700533 import_packages = None,
Ray Milkey275af2c2018-06-15 13:05:08 -0700534 group = "org.onosproject",
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700535 srcs = None,
536 resources_root = None,
537 resources = None,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700538 resource_jars = [],
Ray Milkey6b3775a2018-06-28 11:18:44 -0700539 include_resources = {},
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700540 visibility = ["//visibility:public"],
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700541 version = ONOS_VERSION,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700542 suppress_errorprone = False,
Ray Milkey134d2922018-07-15 15:24:01 -0700543 suppress_checkstyle = False,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700544 suppress_javadocs = False,
Ray Milkey25747d82018-06-13 14:12:51 -0700545 web_context = None,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700546 api_title = "",
547 api_version = "",
548 api_description = "",
Jian Li4ad86872018-08-05 03:34:35 +0900549 api_package = "",
550 bundle_classpath = ""):
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700551 if srcs == None:
Ray Milkey32ea35c2018-06-06 15:28:07 -0700552 srcs = _all_java_sources()
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700553 if deps == None:
554 deps = COMPILE
555
556 osgi_jar_with_tests(
557 name = name,
558 deps = deps,
559 test_deps = [],
Ray Milkey275af2c2018-06-15 13:05:08 -0700560 group = group,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700561 srcs = srcs,
562 resources = resources,
563 resources_root = resources_root,
Thomas Vachuskaf8c8cb92018-07-11 17:12:43 -0700564 resource_jars = resource_jars,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700565 test_srcs = [],
566 exclude_tests = [],
567 test_resources = [],
568 visibility = visibility,
Thomas Vachuska5b9ff6a2018-07-13 11:00:50 -0700569 suppress_errorprone = suppress_errorprone,
Ray Milkey134d2922018-07-15 15:24:01 -0700570 suppress_checkstyle = suppress_checkstyle,
Thomas Vachuska0f7d7a42018-07-18 15:23:40 -0700571 suppress_javadocs = suppress_javadocs,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700572 version = version,
Ray Milkey12ae6ca2018-06-11 15:34:30 -0700573 import_packages = import_packages,
Ray Milkey275af2c2018-06-15 13:05:08 -0700574 api_title = api_title,
575 api_version = api_version,
576 api_description = api_description,
577 api_package = api_package,
Ray Milkey25747d82018-06-13 14:12:51 -0700578 web_context = web_context,
Jian Li4ad86872018-08-05 03:34:35 +0900579 bundle_classpath = bundle_classpath,
Ray Milkey0bcdfd12018-05-23 14:07:19 -0700580 )
Carmelo Cascone6a1ae712018-08-10 12:19:47 -0700581
582
583"""
584 Creates an OSGI jar file from a set of protobuf and gRPC libraries.
585
586 Args:
587 name: Name of the rule to generate. Optional, defaults to a name based on the location in the source tree.
588 For example apps/mcast/app becomes onos-apps-mcast-app
589 proto_libs: (required) list of proto_library targets which generated Java classes will be included to this OSGi
590 jar. It is important that all the given targets reference to a single proto source files, for example
591 only the first 2 rules are good:
592
593 proto_library(
594 name = "foo_proto",
595 srcs = ["foo.proto"],
596 )
597
598 proto_library(
599 name = "bar_proto",
600 srcs = ["bar.proto"],
601 )
602
603 # THIS WILL NOT WORK
604 proto_library(
605 name = "foo_and_bar_proto",
606 srcs = ["foo.proto", "bar.proto"],
607 )
608
609 grpc_proto_lib: (optional) proto_library target that contains the schema of a gRPC service. If not passed,
610 the produced jar will NOT have any gRPC stub classes.
611 deps: Dependencies of the generated jar file. Expressed as a list of targets
612 group: Maven group ID for the resulting jar file. Optional, defaults to 'org.onosproject'
613 visibility: Visibility of the produced jar file to other BUILDs. Optional, defaults to public
614 version: Version of the generated jar file. Optional, defaults to the current ONOS version
615"""
616
617def osgi_proto_jar(
618 proto_libs,
619 grpc_proto_lib = None,
620 name = None,
621 deps = [],
622 group = "org.onosproject",
623 visibility = ["//visibility:public"],
624 version = ONOS_VERSION
625 ):
626 if name == None:
627 name = _auto_name()
628 native.java_proto_library(
629 name = name + "-java-proto",
630 deps = proto_libs,
631 )
632 java_sources_alt(
633 name = name + "-proto-srcjar",
634 srcs = [":%s-java-proto" % name],
635 )
636 osgi_srcs = [
637 ":%s-proto-srcjar" % name,
638 ]
639 base_deps = [
640 "@com_google_protobuf//:protobuf_java",
641 ]
642 if grpc_proto_lib != None:
643 grpc_java_lib = name + "-java-grpc"
644 java_grpc_library(
645 name = name + "-java-grpc",
646 srcs = [grpc_proto_lib],
647 deps = [":%s-java-proto" % name],
648 )
649 osgi_srcs.append(
650 ":%s-java-grpc__do_not_reference__srcjar" % name
651 )
652 base_deps.extend([
653 "@com_google_guava_guava//jar",
654 "@io_grpc_grpc_java//core",
655 "@io_grpc_grpc_java//stub",
656 "@io_grpc_grpc_java//protobuf",
657 ])
658 osgi_jar(
659 name = name,
660 srcs = osgi_srcs,
661 deps = base_deps + deps,
662 group = group,
663 visibility = visibility,
664 version = version,
665 suppress_errorprone = True,
666 suppress_checkstyle = True,
667 suppress_javadocs = True,
668 )