Enforce build with Java 11 for all by default

- Build with JDK11 and language levels (source and target) are now
enforced in .bazelrc, which depends on our own Java toolchain (defined
in tools/build/bazel/BUILD)
- Easymock bumped to v4.0.2 with support for Java 11 (minor API changes)
- The minimum required Bazel version is now 0.27.*

Change-Id: I0bb6dfe7fc1ea134b5a53dd249c369d58259688c
diff --git a/.bazelrc b/.bazelrc
index 64f85c8..266386a 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -1,12 +1,16 @@
-# Build options to use JDK 11
-# build --incompatible_use_jdk11_as_host_javabase
-# build --javabase=@bazel_tools//tools/jdk:remote_jdk11
-# build --host_javabase=@bazel_tools//tools/jdk:remote_jdk11
-# build --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla
-# build --java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla
-
+build --javabase=@bazel_tools//tools/jdk:remote_jdk11
+build --host_javabase=@bazel_tools//tools/jdk:remote_jdk11
+build --java_toolchain=@org_onosproject_onos//tools/build/bazel:default_toolchain
+build --host_java_toolchain=@org_onosproject_onos//tools/build/bazel:default_toolchain
 build --nouse_ijars
 build --experimental_strict_action_env
+
+# io_bazel_rules_go needs this
+build --incompatible_disable_deprecated_attr_params=false
+# intellij-bazel plugin needs this
+build --incompatible_depset_is_not_iterable=false
+build --incompatible_new_actions_api=false
+
 test --test_summary=terse
 test --test_output=errors
 test --test_verbose_timeout_warnings
diff --git a/WORKSPACE b/WORKSPACE
index aeadecc..c03b7d3 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -117,10 +117,18 @@
 # See https://github.com/bazelbuild/rules_go for the up to date setup instructions.
 http_archive(
     name = "io_bazel_rules_go",
-    sha256 = "b7a62250a3a73277ade0ce306d22f122365b513f5402222403e507f2f997d421",
-    url = "https://github.com/bazelbuild/rules_go/releases/download/0.16.3/rules_go-0.16.3.tar.gz",
+    sha256 = "f04d2373bcaf8aa09bccb08a98a57e721306c8f6043a2a0ee610fd6853dcde3d",
+    urls = [
+        "https://github.com/bazelbuild/rules_go/releases/download/0.18.6/rules_go-0.18.6.tar.gz",
+    ],
 )
 
+load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
+
+go_rules_dependencies()
+
+go_register_toolchains()
+
 http_archive(
     name = "com_github_bazelbuild_buildtools",
     sha256 = "e0b5b400cfef17d65886365dc7289cb4ef8dfe07066165607413a271a32aa2a4",
@@ -128,11 +136,6 @@
     url = "https://github.com/bazelbuild/buildtools/archive/db073457c5a56d810e46efc18bb93a4fd7aa7b5e.zip",
 )
 
-load("@io_bazel_rules_go//go:def.bzl", "go_register_toolchains", "go_rules_dependencies")
 load("@com_github_bazelbuild_buildtools//buildifier:deps.bzl", "buildifier_dependencies")
 
-go_rules_dependencies()
-
-go_register_toolchains()
-
 buildifier_dependencies()
diff --git a/core/store/dist/src/test/java/org/onosproject/store/device/impl/GossipDeviceStoreTest.java b/core/store/dist/src/test/java/org/onosproject/store/device/impl/GossipDeviceStoreTest.java
index 8a31446..f565f0a 100644
--- a/core/store/dist/src/test/java/org/onosproject/store/device/impl/GossipDeviceStoreTest.java
+++ b/core/store/dist/src/test/java/org/onosproject/store/device/impl/GossipDeviceStoreTest.java
@@ -390,9 +390,9 @@
         DeviceDescription description =
                 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
                         HW, SW1, SN, CID);
-        Capture<InternalDeviceEvent> message = new Capture<>();
-        Capture<MessageSubject> subject = new Capture<>();
-        Capture<Function<InternalDeviceEvent, byte[]>> encoder = new Capture<>();
+        Capture<InternalDeviceEvent> message = Capture.newInstance();
+        Capture<MessageSubject> subject = Capture.newInstance();
+        Capture<Function<InternalDeviceEvent, byte[]>> encoder = Capture.newInstance();
 
         resetCommunicatorExpectingSingleBroadcast(message, subject, encoder);
         DeviceEvent event = deviceStore.createOrUpdateDevice(PID, DID1, description);
@@ -423,11 +423,11 @@
         DeviceDescription description =
                 new DefaultDeviceDescription(DID1.uri(), SWITCH, MFR,
                         HW, SW1, SN, CID, A2);
-        Capture<ClusterMessage> bcast = new Capture<>();
+        Capture<ClusterMessage> bcast = Capture.newInstance();
 
-        Capture<InternalDeviceEvent> message = new Capture<>();
-        Capture<MessageSubject> subject = new Capture<>();
-        Capture<Function<InternalDeviceEvent, byte[]>> encoder = new Capture<>();
+        Capture<InternalDeviceEvent> message = Capture.newInstance();
+        Capture<MessageSubject> subject = Capture.newInstance();
+        Capture<Function<InternalDeviceEvent, byte[]>> encoder = Capture.newInstance();
 
         resetCommunicatorExpectingSingleBroadcast(message, subject, encoder);
         DeviceEvent event = deviceStore.createOrUpdateDevice(PIDA, DID1, description);
@@ -497,9 +497,9 @@
         putDevice(DID1, SW1);
         assertTrue(deviceStore.isAvailable(DID1));
 
-        Capture<InternalDeviceEvent> message = new Capture<>();
-        Capture<MessageSubject> subject = new Capture<>();
-        Capture<Function<InternalDeviceEvent, byte[]>> encoder = new Capture<>();
+        Capture<InternalDeviceEvent> message = Capture.newInstance();
+        Capture<MessageSubject> subject = Capture.newInstance();
+        Capture<Function<InternalDeviceEvent, byte[]>> encoder = Capture.newInstance();
 
         resetCommunicatorExpectingSingleBroadcast(message, subject, encoder);
         DeviceEvent event = deviceStore.markOffline(DID1);
@@ -525,9 +525,9 @@
                 DefaultPortDescription.builder().withPortNumber(P1).isEnabled(true).build(),
                 DefaultPortDescription.builder().withPortNumber(P2).isEnabled(true).build()
                 );
-        Capture<InternalDeviceEvent> message = new Capture<>();
-        Capture<MessageSubject> subject = new Capture<>();
-        Capture<Function<InternalDeviceEvent, byte[]>> encoder = new Capture<>();
+        Capture<InternalDeviceEvent> message = Capture.newInstance();
+        Capture<MessageSubject> subject = Capture.newInstance();
+        Capture<Function<InternalDeviceEvent, byte[]>> encoder = Capture.newInstance();
 
         resetCommunicatorExpectingSingleBroadcast(message, subject, encoder);
         List<DeviceEvent> events = deviceStore.updatePorts(PID, DID1, pds);
@@ -611,9 +611,9 @@
                 );
         deviceStore.updatePorts(PID, DID1, pds);
 
-        Capture<InternalPortStatusEvent> message = new Capture<>();
-        Capture<MessageSubject> subject = new Capture<>();
-        Capture<Function<InternalPortStatusEvent, byte[]>> encoder = new Capture<>();
+        Capture<InternalPortStatusEvent> message = Capture.newInstance();
+        Capture<MessageSubject> subject = Capture.newInstance();
+        Capture<Function<InternalPortStatusEvent, byte[]>> encoder = Capture.newInstance();
 
         resetCommunicatorExpectingSingleBroadcast(message, subject, encoder);
         final DefaultPortDescription desc = DefaultPortDescription.builder().withPortNumber(P1)
@@ -637,9 +637,9 @@
                 );
         deviceStore.updatePorts(PID, DID1, pds);
 
-        Capture<InternalPortStatusEvent> message = new Capture<>();
-        Capture<MessageSubject> subject = new Capture<>();
-        Capture<Function<InternalPortStatusEvent, byte[]>> encoder = new Capture<>();
+        Capture<InternalPortStatusEvent> message = Capture.newInstance();
+        Capture<MessageSubject> subject = Capture.newInstance();
+        Capture<Function<InternalPortStatusEvent, byte[]>> encoder = Capture.newInstance();
 
         // update port from primary
         resetCommunicatorExpectingSingleBroadcast(message, subject, encoder);
@@ -817,9 +817,9 @@
         assertAnnotationsEquals(deviceStore.getDevice(DID1).annotations(), A1);
         assertAnnotationsEquals(deviceStore.getPort(DID1, P1).annotations(), A2);
 
-        Capture<InternalDeviceEvent> message = new Capture<>();
-        Capture<MessageSubject> subject = new Capture<>();
-        Capture<Function<InternalDeviceEvent, byte[]>> encoder = new Capture<>();
+        Capture<InternalDeviceEvent> message = Capture.newInstance();
+        Capture<MessageSubject> subject = Capture.newInstance();
+        Capture<Function<InternalDeviceEvent, byte[]>> encoder = Capture.newInstance();
 
         resetCommunicatorExpectingSingleBroadcast(message, subject, encoder);
 
diff --git a/lib/deps.json b/lib/deps.json
index 38aed00..b5e26f6 100644
--- a/lib/deps.json
+++ b/lib/deps.json
@@ -151,7 +151,7 @@
     "commons-pool": "mvn:commons-pool:commons-pool:1.6",
     "commons-text": "mvn:org.apache.commons:commons-text:1.3",
     "concurrent-trees": "mvn:com.googlecode.concurrent-trees:concurrent-trees:2.6.1",
-    "easymock": "mvn:org.easymock:easymock:3.6",
+    "easymock": "mvn:org.easymock:easymock:4.0.2",
     "antlr": "mvn:antlr:antlr:2.7.7",
     "ganymed-ssh2": "mvn:ch.ethz.ganymed:ganymed-ssh2:262",
     "gmetric4j": "mvn:info.ganglia.gmetric4j:gmetric4j:1.0.10",
diff --git a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSshdTestSubsystem.java b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSshdTestSubsystem.java
index e10b82e..b8797b8 100644
--- a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSshdTestSubsystem.java
+++ b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfSshdTestSubsystem.java
@@ -16,22 +16,6 @@
 package org.onosproject.netconf.ctl.impl;
 
 
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.EOFException;
-import java.nio.Buffer;
-import java.nio.ByteBuffer;
-import java.util.Collection;
-import java.util.Optional;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import java.util.regex.Pattern;
-
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.util.threads.ThreadUtils;
@@ -45,6 +29,22 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.BufferedReader;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.Optional;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.regex.Pattern;
+
 /**
  * Mocks a NETCONF Device to test the NETCONF Southbound Interface etc.
  *
@@ -464,12 +464,17 @@
 
     @Override
     public void interrupt() {
+        destroy();
+    }
+
+    @Override
+    public void destroy() {
         // if thread has not completed, cancel it
         if ((pendingFuture != null) && (!pendingFuture.isDone())) {
             boolean result = pendingFuture.cancel(true);
             // TODO consider waiting some reasonable (?) amount of time for cancellation
             if (log.isDebugEnabled()) {
-                log.debug("interrupt() - cancel pending future=" + result);
+                log.debug("destroy() - cancel pending future=" + result);
             }
         }
 
@@ -478,8 +483,8 @@
         if ((executors != null) && shutdownExecutor) {
             Collection<Runnable> runners = executors.shutdownNow();
             if (log.isDebugEnabled()) {
-                log.debug("interrupt() - shutdown executor service - runners count=" +
-                        runners.size());
+                log.debug("destroy() - shutdown executor service - runners count=" +
+                                  runners.size());
             }
         }
 
@@ -487,7 +492,7 @@
 
         if (!closed) {
             if (log.isDebugEnabled()) {
-                log.debug("interrupt() - mark as closed");
+                log.debug("destroy() - mark as closed");
             }
 
             closed = true;
diff --git a/tools/build/bazel/BUILD b/tools/build/bazel/BUILD
index d819d63..cf20246 100644
--- a/tools/build/bazel/BUILD
+++ b/tools/build/bazel/BUILD
@@ -1,3 +1,17 @@
+load("@bazel_tools//tools/jdk:default_java_toolchain.bzl", "default_java_toolchain")
+
+# This is where we define the language source and target values passed to javac
+# when building ONOS. This toolchain should be used when invoking bazel build
+# (see onos/.bazelrc)
+default_java_toolchain(
+    name = "default_toolchain",
+    source_version = "11",
+    target_version = "11",
+    visibility = [
+        "//visibility:public",
+    ],
+)
+
 py_binary(
     name = "osgi_feature_bundler",
     srcs = ["osgi_feature_bundler.py"],
diff --git a/tools/build/bazel/bazel_version.bzl b/tools/build/bazel/bazel_version.bzl
index 49434bf..9a0046e 100644
--- a/tools/build/bazel/bazel_version.bzl
+++ b/tools/build/bazel/bazel_version.bzl
@@ -16,12 +16,12 @@
 
 def check_bazel_version():
     if "bazel_version" not in dir(native):
-        fail("\nBazel version is too old; please use 0.23.* official release!\n\n")
+        fail("\nBazel version is too old; please use 0.27.* official release!\n\n")
     elif not native.bazel_version:
-        print("\nBazel is not a release version; please use 0.23.* official release!\n\n")
+        print("\nBazel is not a release version; please use 0.27.* official release!\n\n")
         return
 
     versions = native.bazel_version.split(".")
-    if not int(versions[1]) >= 23:
-        fail("\nBazel version %s is not supported; please use 0.23.* official release!\n\n" %
+    if not int(versions[1]) >= 27:
+        fail("\nBazel version %s is not supported; please use 0.27.* official release!\n\n" %
              native.bazel_version)
diff --git a/tools/build/bazel/generate_workspace.bzl b/tools/build/bazel/generate_workspace.bzl
index c177993..086ebea 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 Wed, 29 May 2019 22:17:30 GMT. Do not edit this file manually. *****
+# ***** This file was auto-generated at Mon, 17 Jun 2019 19:13:01 GMT. Do not edit this file manually. *****
 # ***** Use onos-lib-gen *****
 
 load("//tools/build/bazel:variables.bzl", "ONOS_GROUP_ID", "ONOS_VERSION")
@@ -295,9 +295,9 @@
     if "easymock" not in native.existing_rules():
         java_import_external(
             name = "easymock",
-            jar_sha256 = "0557c9fa845c951bdbe3940b605346a212172c64328277428297ef1fc6308e8f",
+            jar_sha256 = "104370107ef64d115e642cbdc14cea438a8d076f5aee9a9cb7882dc9a8ed4123",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/easymock/easymock/3.6/easymock-3.6.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/easymock/easymock/4.0.2/easymock-4.0.2.jar"],        )
     if "antlr" not in native.existing_rules():
         java_import_external(
             name = "antlr",
@@ -1353,7 +1353,7 @@
 artifact_map["@commons_pool//:commons_pool"] = "mvn:commons-pool:commons-pool:jar:1.6"
 artifact_map["@commons_text//:commons_text"] = "mvn:org.apache.commons:commons-text:jar:1.3"
 artifact_map["@concurrent_trees//:concurrent_trees"] = "mvn:com.googlecode.concurrent-trees:concurrent-trees:jar:2.6.1"
-artifact_map["@easymock//:easymock"] = "mvn:org.easymock:easymock:jar:3.6"
+artifact_map["@easymock//:easymock"] = "mvn:org.easymock:easymock:jar:4.0.2"
 artifact_map["@antlr//:antlr"] = "mvn:antlr:antlr:jar:NON-OSGI:2.7.7"
 artifact_map["@ganymed_ssh2//:ganymed_ssh2"] = "mvn:ch.ethz.ganymed:ganymed-ssh2:jar:NON-OSGI:262"
 artifact_map["@gmetric4j//:gmetric4j"] = "mvn:info.ganglia.gmetric4j:gmetric4j:jar:1.0.10"
diff --git a/tools/build/bazel/osgi_java_library.bzl b/tools/build/bazel/osgi_java_library.bzl
index 3720064..8296fcf 100644
--- a/tools/build/bazel/osgi_java_library.bzl
+++ b/tools/build/bazel/osgi_java_library.bzl
@@ -448,7 +448,7 @@
     if import_packages == None:
         import_packages = "*"
     tests_name = name + "-tests"
-    tests_jar_deps = list(depset(deps + test_deps)) + [name]
+    tests_jar_deps = depset(deps + test_deps).to_list() + [name]
     all_test_deps = tests_jar_deps + [tests_name]
     web_xml = _webapp()
 
diff --git a/tools/dev/bin/onos-gen-bazel-project b/tools/dev/bin/onos-gen-bazel-project
index 0c33da1..355193a 100755
--- a/tools/dev/bin/onos-gen-bazel-project
+++ b/tools/dev/bin/onos-gen-bazel-project
@@ -3,7 +3,7 @@
 
 import subprocess
 
-JAVA_LANGUAGE_LEVEL = 8
+JAVA_LANGUAGE_LEVEL = 11
 
 EXCLUDE_DIRECTORIES = (
     "target",