Revamp support for building third-party apps via maven

- Publish onos-dependencies (autogenerated from deps.json). With most
  3rd-party dependencies listed as <dependencyManagement> to avoid
  version conflicts, and a minimal set listed as <dependencies> to
  simplify child poms. Similarly, we provide a number of plugins already
  configured as <pluginManagement> to support the whole life-cycle of
  apps (from build, to reporting and release).
- Update Maven plugins to work with JDK 11 (checkstyle, pmd, etc.)
- Publish onos-build-conf (with common checkstyle and pmd confs)
- Removed unused checkstyle code
- Fix OSGi version mismatch in deps.json to consistently depend on
  release 6 (the one supported by Karaf 4)
- Update/simplify archetypes to use onos-dependencies as the parent pom

Change-Id: Ic09b34e13fb49eb3d96df623b53a3617bbf7b7e4
diff --git a/tools/build/bazel/BUILD b/tools/build/bazel/BUILD
index d819d63..26590a7 100644
--- a/tools/build/bazel/BUILD
+++ b/tools/build/bazel/BUILD
@@ -26,6 +26,13 @@
     visibility = ["//visibility:public"],
 )
 
+py_binary(
+    name = "dependencies_pom_generator",
+    srcs = ["dependencies_pom_generator.py"],
+    main = "dependencies_pom_generator.py",
+    visibility = ["//visibility:public"],
+)
+
 java_binary(
     name = "onos_yang_compiler",
     main_class = "org.onosproject.yang.compiler.main.YangCompilerMain",
diff --git a/tools/build/bazel/dependencies_pom_generator.py b/tools/build/bazel/dependencies_pom_generator.py
new file mode 100755
index 0000000..f2df0c2
--- /dev/null
+++ b/tools/build/bazel/dependencies_pom_generator.py
@@ -0,0 +1,124 @@
+#!/usr/bin/env python
+# Copyright 2019-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import argparse
+from datetime import datetime
+from xml.dom import minidom
+
+
+def resolve(mvn_coord):
+    mvn_pieces = mvn_coord.split(":")
+    if mvn_pieces[0] != "mvn":
+        raise ("Invalid Maven coordinate: %s" % mvn_coord)
+    return dict(
+        groupId=mvn_pieces[1],
+        artifactId=mvn_pieces[2],
+        version=mvn_pieces[-1],
+        name=mvn_coord,
+    )
+
+
+def xml_beautify(data):
+    beautified = '\n'.join([
+        l for l in
+        minidom.parseString(data).toprettyxml(indent=' ' * 4).split('\n')
+        if l.strip()])
+    return beautified
+
+
+def generate_pom(out_file, template_file, provided_deps, test_deps, deps, var_dict):
+    deps = {d: resolve(d) for d in deps}
+
+    dep_mgmt_template = """
+    <dependency>
+        <!-- {name} -->
+        <groupId>{groupId}</groupId>
+        <artifactId>{artifactId}</artifactId>
+        <version>{version}</version>
+    </dependency>"""
+
+    dep_template = """
+    <dependency>
+        <!-- {name} -->
+        <groupId>{groupId}</groupId>
+        <artifactId>{artifactId}</artifactId>
+        <scope>{scope}</scope>
+    </dependency>"""
+
+    mgmt_deps = sorted(deps.keys())
+    provided_deps.sort()
+    test_deps.sort()
+
+    with open(template_file, "r") as f:
+        lines = f.readlines()
+
+    new_lines = [
+        "<!-- Automatically generated on %s -->"
+        % datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+    ]
+    for line in lines:
+        if "<!-- DEPS_MGMT -->" in line:
+            new_lines.extend([
+                dep_mgmt_template.format(**deps[x]) for x in mgmt_deps])
+        elif "<!-- DEPS -->" in line:
+            new_lines.extend([
+                dep_template.format(scope='provided', **deps[x])
+                for x in provided_deps])
+            new_lines.extend([
+                dep_template.format(scope='test', **deps[x])
+                for x in test_deps])
+        else:
+            for old, new in var_dict.items():
+                line = line.replace(old, new)
+            new_lines.append(line)
+
+    with open(out_file, 'w') as f:
+        f.write(xml_beautify("\n".join(new_lines)))
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-o', dest='out_file', type=str, action="store",
+                        required=True, help="Path to output file")
+    parser.add_argument('-p', dest='template_file', type=str, action="store",
+                        required=True, help="Path to pom template file")
+    parser.add_argument('-c', dest='provided_deps', metavar='PROVIDED_DEP',
+                        type=str, nargs='+', default=[],
+                        help='Maven coordinates to list with scope provided')
+    parser.add_argument('-t', dest='test_deps', metavar='TEST_DEP', type=str,
+                        nargs='+', default=[],
+                        help='Maven coordinates to list with scope test')
+    parser.add_argument('-d', dest='deps', metavar='DEP', type=str,
+                        nargs='+', default=[],
+                        help='Maven coordinates to list under <dependencyManagement>')
+    parser.add_argument('-v', dest='vars', metavar='VAR=value', type=str,
+                        nargs='+', default=[],
+                        help='Replace all instances of <!-- VAR --> with the given value')
+    args = parser.parse_args()
+
+    processed_vars = {}
+    for var in args.vars:
+        pieces = var.split('=')
+        if len(pieces) != 2:
+            raise ("Invalid var '%s'" % var)
+        processed_vars["<!-- %s -->" % pieces[0]] = pieces[1]
+
+    generate_pom(
+        out_file=args.out_file,
+        template_file=args.template_file,
+        provided_deps=args.provided_deps,
+        test_deps=args.test_deps,
+        deps=args.deps,
+        var_dict=processed_vars
+    )
diff --git a/tools/build/bazel/generate_workspace.bzl b/tools/build/bazel/generate_workspace.bzl
index d7aa801..c12b346 100644
--- a/tools/build/bazel/generate_workspace.bzl
+++ b/tools/build/bazel/generate_workspace.bzl
@@ -1,4 +1,4 @@
-# ***** This file was auto-generated at Mon, 15 Jul 2019 02:38:53 GMT. Do not edit this file manually. *****
+# ***** This file was auto-generated at Thu, 14 Nov 2019 18:59:32 GMT. Do not edit this file manually. *****
 # ***** Use onos-lib-gen *****
 
 load("//tools/build/bazel:variables.bzl", "ONOS_GROUP_ID", "ONOS_VERSION")
@@ -835,9 +835,9 @@
     if "org_osgi_util_promise" not in native.existing_rules():
         java_import_external(
             name = "org_osgi_util_promise",
-            jar_sha256 = "a679e25688e84e1739831e8716a2cc7acbf8348e22f1136d1988e34472e43756",
+            jar_sha256 = "4f85beccd281cc1a4e735bd266a0dd3db11651d3d0dde001e6bfa55dbdfdee83",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.util.promise/1.1.0/org.osgi.util.promise-1.1.0.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.util.promise/1.1.1/org.osgi.util.promise-1.1.1.jar"],        )
     if "org_osgi_service_component" not in native.existing_rules():
         java_import_external(
             name = "org_osgi_service_component",
@@ -916,24 +916,18 @@
             jar_sha256 = "68c5b7885fa9157813e01482ddbdfa1c63bb6743d98fd5dba8ce83904bfcf7f8",
             licenses = ["notice"],
             jar_urls = ["http://repo1.maven.org/maven2/org/apache/servicemix/bundles/org.apache.servicemix.bundles.snmp4j/2.3.4_1/org.apache.servicemix.bundles.snmp4j-2.3.4_1.jar"],        )
-    if "org_osgi_compendium" not in native.existing_rules():
-        java_import_external(
-            name = "org_osgi_compendium",
-            jar_sha256 = "f1ef32cc1530f4e66aac606c24363b627ace4780a7737b045bfb3b908d801bcd",
-            licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.compendium/5.0.0/org.osgi.compendium-5.0.0.jar"],        )
     if "org_osgi_cmpn" not in native.existing_rules():
         java_import_external(
             name = "org_osgi_cmpn",
-            jar_sha256 = "8e6445afe1abb3dcd43c60c8cd6c0f15b052a8f4228812559ba521c5ce91db34",
+            jar_sha256 = "dbe06105a0e3e46bc88425b3d7c682a2d8b6bd055341913b6c37e998c00c9176",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/osgi.cmpn/7.0.0/osgi.cmpn-7.0.0.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/osgi.cmpn/6.0.0/osgi.cmpn-6.0.0.jar"],        )
     if "osgi_core" not in native.existing_rules():
         java_import_external(
             name = "osgi_core",
-            jar_sha256 = "b440c6bff286332afcf5cae067b606962e761c0df00e5fd8a746f0b31265619b",
+            jar_sha256 = "1c1bb435eb34cbf1f743653da38f604d45d53fbc95979053768cd3fc293cb931",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.core/5.0.0/org.osgi.core-5.0.0.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.core/6.0.0/org.osgi.core-6.0.0.jar"],        )
     if "reflectasm" not in native.existing_rules():
         java_import_external(
             name = "reflectasm",
@@ -1449,7 +1443,7 @@
 artifact_map["@objenesis//:objenesis"] = "mvn:org.objenesis:objenesis:jar:2.6"
 artifact_map["@openflowj//:openflowj"] = "mvn:org.onosproject:openflowj:jar:3.2.1.onos"
 artifact_map["@org_osgi_util_function//:org_osgi_util_function"] = "mvn:org.osgi:org.osgi.util.function:jar:1.1.0"
-artifact_map["@org_osgi_util_promise//:org_osgi_util_promise"] = "mvn:org.osgi:org.osgi.util.promise:jar:1.1.0"
+artifact_map["@org_osgi_util_promise//:org_osgi_util_promise"] = "mvn:org.osgi:org.osgi.util.promise:jar:1.1.1"
 artifact_map["@org_osgi_service_component//:org_osgi_service_component"] = "mvn:org.osgi:org.osgi.service.component:jar:1.4.0"
 artifact_map["@org_osgi_service_component_annotations//:org_osgi_service_component_annotations"] = "mvn:org.osgi:org.osgi.service.component.annotations:jar:1.4.0"
 artifact_map["@org_osgi_service_metatype_annotations//:org_osgi_service_metatype_annotations"] = "mvn:org.osgi:org.osgi.service.metatype.annotations:jar:1.4.0"
@@ -1463,9 +1457,8 @@
 artifact_map["@org_apache_karaf_jaas//:org_apache_karaf_jaas"] = "mvn:org.apache.karaf.jaas:org.apache.karaf.jaas.modules:jar:4.2.6"
 artifact_map["@org_apache_karaf_system_core//:org_apache_karaf_system_core"] = "mvn:org.apache.karaf.system:org.apache.karaf.system.core:jar:4.2.6"
 artifact_map["@org_apache_servicemix_bundles_snmp4j//:org_apache_servicemix_bundles_snmp4j"] = "mvn:org.apache.servicemix.bundles:org.apache.servicemix.bundles.snmp4j:jar:2.3.4_1"
-artifact_map["@org_osgi_compendium//:org_osgi_compendium"] = "mvn:org.osgi:org.osgi.compendium:jar:5.0.0"
-artifact_map["@org_osgi_cmpn//:org_osgi_cmpn"] = "mvn:org.osgi:osgi.cmpn:jar:7.0.0"
-artifact_map["@osgi_core//:osgi_core"] = "mvn:org.osgi:org.osgi.core:jar:5.0.0"
+artifact_map["@org_osgi_cmpn//:org_osgi_cmpn"] = "mvn:org.osgi:osgi.cmpn:jar:6.0.0"
+artifact_map["@osgi_core//:osgi_core"] = "mvn:org.osgi:org.osgi.core:jar:6.0.0"
 artifact_map["@reflectasm//:reflectasm"] = "mvn:com.esotericsoftware:reflectasm:jar:1.11.7"
 artifact_map["@remotetea_oncrpc//:remotetea_oncrpc"] = "mvn:org.acplt.remotetea:remotetea-oncrpc:jar:1.1.3"
 artifact_map["@rrd4j//:rrd4j"] = "mvn:org.rrd4j:rrd4j:jar:NON-OSGI:3.1"
diff --git a/tools/build/bazel/pom_file.bzl b/tools/build/bazel/pom_file.bzl
index e3c5689..c291d4c 100644
--- a/tools/build/bazel/pom_file.bzl
+++ b/tools/build/bazel/pom_file.bzl
@@ -14,7 +14,7 @@
 
 load("//tools/build/bazel:generate_workspace.bzl", "maven_coordinates")
 
-def _impl(ctx):
+def _impl_pom_file(ctx):
     arguments = [
         ctx.outputs.pom.path,
         maven_coordinates(ctx.attr.artifact),
@@ -42,6 +42,47 @@
             default = Label("//tools/build/bazel:pom_generator"),
         ),
     },
-    implementation = _impl,
+    implementation = _impl_pom_file,
+    outputs = {"pom": "%{name}.pom"},
+)
+
+def _impl_dependencies_pom(ctx):
+    arguments = [
+        "-o",
+        ctx.outputs.pom.path,
+        "-p",
+        ctx.file.pom_template.path,
+        "-d",
+    ] + [maven_coordinates(d.label) for d in ctx.attr.deps] + [
+        "-c",
+    ] + [maven_coordinates(d.label) for d in ctx.attr.deps_provided] + [
+        "-t",
+    ] + [maven_coordinates(d.label) for d in ctx.attr.deps_test] + [
+        "-v",
+    ] + ctx.attr.vars
+
+    ctx.actions.run(
+        inputs = [ctx.file.pom_template],
+        outputs = [ctx.outputs.pom],
+        progress_message = "Generating dependencies pom for %s" % ctx.attr.name,
+        arguments = arguments,
+        executable = ctx.executable._pom_generator,
+    )
+
+dependencies_pom = rule(
+    attrs = {
+        "pom_template": attr.label(allow_single_file = True),
+        "deps_provided": attr.label_list(),
+        "deps_test": attr.label_list(),
+        "deps": attr.label_list(),
+        "vars": attr.string_list(),
+        "_pom_generator": attr.label(
+            executable = True,
+            cfg = "host",
+            allow_files = True,
+            default = Label("//tools/build/bazel:dependencies_pom_generator"),
+        ),
+    },
+    implementation = _impl_dependencies_pom,
     outputs = {"pom": "%{name}.pom"},
 )
diff --git a/tools/build/bazel/variables.bzl b/tools/build/bazel/variables.bzl
index e6e5333..4e09aa9 100644
--- a/tools/build/bazel/variables.bzl
+++ b/tools/build/bazel/variables.bzl
@@ -4,3 +4,4 @@
 ONOS_ORIGIN = "ONOS Community"
 APP_PREFIX = ONOS_GROUP_ID + "."
 DEFAULT_APP_CATEGORY = "Utility"
+DEFAULT_JAVA_VERSION = "11"