PIG-5387: Test failures on JRE 11

git-svn-id: https://svn.apache.org/repos/asf/pig/trunk@1859620 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/org/apache/pig/impl/plan/Operator.java b/src/org/apache/pig/impl/plan/Operator.java
index c64fec7..2a870a9 100644
--- a/src/org/apache/pig/impl/plan/Operator.java
+++ b/src/org/apache/pig/impl/plan/Operator.java
@@ -18,12 +18,9 @@
 
 package org.apache.pig.impl.plan;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
 import java.io.Serializable;
-import java.lang.StringBuilder;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.pig.impl.plan.OperatorKey;
 
 /**
  * Base class for all types of operators.
@@ -152,7 +149,11 @@
         return getProjectionMap();
     }
 
-    
+    // Added because on Java 11 while serializing the logical plan we hit JDK-8201131
+    private void readObject(ObjectInputStream in) throws ClassNotFoundException, IOException {
+        in.defaultReadObject();
+    }
+
     /**
      * Make any necessary changes to a node based on a change of position in the
      * plan. This allows operators to rewire their projections, etc. when they
diff --git a/test/org/apache/pig/test/TestPigServer.java b/test/org/apache/pig/test/TestPigServer.java
index de5ed47..0f0de75 100644
--- a/test/org/apache/pig/test/TestPigServer.java
+++ b/test/org/apache/pig/test/TestPigServer.java
@@ -33,6 +33,7 @@
 import java.io.OutputStreamWriter;
 import java.io.PrintStream;
 import java.io.PrintWriter;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -141,11 +142,26 @@
     // dynamically add more resources to the system class loader
     private static void registerNewResource(String file) throws Exception {
         URL urlToAdd = new File(file).toURI().toURL();
-        URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
-        Method addMethod = URLClassLoader.class.
-                getDeclaredMethod("addURL", new Class[]{URL.class});
-        addMethod.setAccessible(true);
-        addMethod.invoke(sysLoader, new Object[]{urlToAdd});
+        ClassLoader sysLoader = ClassLoader.getSystemClassLoader();
+        // Find the class loader below bootstrap class loader
+        // It is either the system class loader (first invocation), or the new URLClassLoader added below
+        while (sysLoader.getParent().getParent() != null) {
+            sysLoader = sysLoader.getParent();
+        }
+        // Check if this class loader is instance of URLClassLoader
+        // On Java 8 and before it is, add resources via addURL method
+        // On Java 11 and after it isn't, add a new URLClassLoader with the new resources above it
+        if (sysLoader instanceof URLClassLoader) {
+            Method addMethod = URLClassLoader.class.
+              getDeclaredMethod("addURL", new Class[]{URL.class});
+            addMethod.setAccessible(true);
+            addMethod.invoke(sysLoader, new Object[]{urlToAdd});
+        } else {
+            Field parent = ClassLoader.class.getDeclaredField("parent");
+            parent.setAccessible(true);
+            ClassLoader urlClassLoader = new URLClassLoader(new URL[]{urlToAdd}, ClassLoader.getSystemClassLoader().getParent());
+            parent.set(ClassLoader.getSystemClassLoader(), urlClassLoader);
+        }
     }
 
     /**
diff --git a/test/org/apache/pig/test/TestPigServerLocal.java b/test/org/apache/pig/test/TestPigServerLocal.java
index f50eac3..a3e5969 100644
--- a/test/org/apache/pig/test/TestPigServerLocal.java
+++ b/test/org/apache/pig/test/TestPigServerLocal.java
@@ -29,6 +29,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.StringReader;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -68,17 +69,6 @@
     public void setUp() throws Exception{
         tempDir = Files.createTempDir();
         tempDir.deleteOnExit();
-        registerNewResource(tempDir.getAbsolutePath());
-    }
-
-    // dynamically add more resources to the system class loader
-    private static void registerNewResource(String file) throws Exception {
-        URL urlToAdd = new File(file).toURI().toURL();
-        URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
-        Method addMethod = URLClassLoader.class.
-                getDeclaredMethod("addURL", new Class[]{URL.class});
-        addMethod.setAccessible(true);
-        addMethod.invoke(sysLoader, new Object[]{urlToAdd});
     }
 
     @Test