You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@guacamole.apache.org by vn...@apache.org on 2018/04/12 14:05:03 UTC
[1/2] guacamole-client git commit: GUACAMOLE-541: Prioritize classes
defined within extensions over classes inherited from the webapp classpath or
lib directory.
Repository: guacamole-client
Updated Branches:
refs/heads/master 18136d514 -> 8fb62d128
GUACAMOLE-541: Prioritize classes defined within extensions over classes inherited from the webapp classpath or lib directory.
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/f8bd359c
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/f8bd359c
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/f8bd359c
Branch: refs/heads/master
Commit: f8bd359c9ad795e911d779ee93db34cad950a2bb
Parents: 18136d5
Author: Michael Jumper <mj...@apache.org>
Authored: Sat Apr 7 14:41:48 2018 -0700
Committer: Michael Jumper <mj...@apache.org>
Committed: Wed Apr 11 21:33:43 2018 -0700
----------------------------------------------------------------------
.../apache/guacamole/extension/Extension.java | 36 +----
.../extension/ExtensionClassLoader.java | 159 +++++++++++++++++++
2 files changed, 161 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/f8bd359c/guacamole/src/main/java/org/apache/guacamole/extension/Extension.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/Extension.java b/guacamole/src/main/java/org/apache/guacamole/extension/Extension.java
index dc43b8f..9d61abb 100644
--- a/guacamole/src/main/java/org/apache/guacamole/extension/Extension.java
+++ b/guacamole/src/main/java/org/apache/guacamole/extension/Extension.java
@@ -21,12 +21,6 @@ package org.apache.guacamole.extension;
import java.io.File;
import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -387,34 +381,8 @@ public class Extension {
extension.close();
}
- try {
-
- // Create isolated classloader for this extension
- classLoader = AccessController.doPrivileged(new PrivilegedExceptionAction<ClassLoader>() {
-
- @Override
- public ClassLoader run() throws GuacamoleException {
-
- try {
-
- // Classloader must contain only the extension itself
- return new URLClassLoader(new URL[]{file.toURI().toURL()}, parent);
-
- }
- catch (MalformedURLException e) {
- throw new GuacamoleException(e);
- }
-
- }
-
- });
-
- }
-
- // Rethrow any GuacamoleException
- catch (PrivilegedActionException e) {
- throw (GuacamoleException) e.getException();
- }
+ // Create isolated classloader for this extension
+ classLoader = ExtensionClassLoader.getInstance(file, parent);
}
http://git-wip-us.apache.org/repos/asf/guacamole-client/blob/f8bd359c/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionClassLoader.java
----------------------------------------------------------------------
diff --git a/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionClassLoader.java b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionClassLoader.java
new file mode 100644
index 0000000..137dc7d
--- /dev/null
+++ b/guacamole/src/main/java/org/apache/guacamole/extension/ExtensionClassLoader.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+package org.apache.guacamole.extension;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import org.apache.guacamole.GuacamoleException;
+import org.apache.guacamole.GuacamoleServerException;
+
+/**
+ * ClassLoader implementation which prioritizes the classes defined within a
+ * given extension .jar file. Unlike the standard URLClassLoader, classes
+ * within the parent ClassLoader are only used if they are not defined within
+ * the given .jar. If classes are defined in both the parent and the extension
+ * .jar, the versions defined within the extension .jar are used.
+ */
+public class ExtensionClassLoader extends URLClassLoader {
+
+ /**
+ * The ClassLoader to use if class resolution through the extension .jar
+ * fails.
+ */
+ private final ClassLoader parent;
+
+ /**
+ * Returns an instance of ExtensionClassLoader configured to load classes
+ * from the given extension .jar. If a necessary class cannot be found
+ * within the .jar, the given parent ClassLoader is used. Calling this
+ * function multiple times will not affect previously-returned instances of
+ * ExtensionClassLoader.
+ *
+ * @param extension
+ * The extension .jar file from which classes should be loaded.
+ *
+ * @param parent
+ * The ClassLoader to use if class resolution through the extension
+ * .jar fails.
+ *
+ * @return
+ * A ExtensionClassLoader instance which loads classes from the
+ * given extension .jar file.
+ *
+ * @throws GuacamoleException
+ * If the given file is not actually a file, or the contents of the
+ * file cannot be read.
+ */
+ public static ExtensionClassLoader getInstance(final File extension,
+ final ClassLoader parent) throws GuacamoleException {
+
+ try {
+ // Attempt to create classloader which loads classes from the given
+ // .jar file
+ return AccessController.doPrivileged(new PrivilegedExceptionAction<ExtensionClassLoader>() {
+
+ @Override
+ public ExtensionClassLoader run() throws GuacamoleException {
+ return new ExtensionClassLoader(extension, parent);
+ }
+
+ });
+ }
+
+ catch (PrivilegedActionException e) {
+ throw (GuacamoleException) e.getException();
+ }
+
+ }
+
+ /**
+ * Returns a URL which points to the given extension .jar file.
+ *
+ * @param extension
+ * The extension .jar file to generate a URL for.
+ *
+ * @return
+ * A URL which points to the given extension .jar.
+ *
+ * @throws GuacamoleException
+ * If the given file is not actually a file, or the contents of the
+ * file cannot be read.
+ */
+ private static URL getExtensionURL(File extension)
+ throws GuacamoleException {
+
+ // Validate extension file is indeed a file
+ if (!extension.isFile())
+ throw new GuacamoleException(extension + " is not a file.");
+
+ try {
+ return extension.toURI().toURL();
+ }
+ catch (MalformedURLException e) {
+ throw new GuacamoleServerException(e);
+ }
+
+ }
+
+ /**
+ * Creates a new ExtensionClassLoader configured to load classes from the
+ * given extension .jar. If a necessary class cannot be found within the
+ * .jar, the given parent ClassLoader is used. Calling this function
+ * multiple times will not affect previously-returned instances of
+ * ExtensionClassLoader.
+ *
+ * @param extension
+ * The extension .jar file from which classes should be loaded.
+ *
+ * @param parent
+ * The ClassLoader to use if class resolution through the extension
+ * .jar fails.
+ *
+ * @throws GuacamoleException
+ * If the given file is not actually a file, or the contents of the
+ * file cannot be read.
+ */
+ private ExtensionClassLoader(File extension, ClassLoader parent)
+ throws GuacamoleException {
+ super(new URL[]{ getExtensionURL(extension) }, null);
+ this.parent = parent;
+ }
+
+ @Override
+ protected Class<?> findClass(String string) throws ClassNotFoundException {
+
+ // Search only within the given URLs
+ try {
+ return super.findClass(string);
+ }
+
+ // Search parent classloader ONLY if not found within given URLs
+ catch (ClassNotFoundException e) {
+ return parent.loadClass(string);
+ }
+
+ }
+
+}
[2/2] guacamole-client git commit: GUACAMOLE-541: Merge prioritize
extension classes over inherited in webapp.
Posted by vn...@apache.org.
GUACAMOLE-541: Merge prioritize extension classes over inherited in webapp.
Project: http://git-wip-us.apache.org/repos/asf/guacamole-client/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-client/commit/8fb62d12
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-client/tree/8fb62d12
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-client/diff/8fb62d12
Branch: refs/heads/master
Commit: 8fb62d128659b26714c5b38ceab9ce17badf736f
Parents: 18136d5 f8bd359
Author: Nick Couchman <vn...@apache.org>
Authored: Thu Apr 12 10:04:20 2018 -0400
Committer: Nick Couchman <vn...@apache.org>
Committed: Thu Apr 12 10:04:20 2018 -0400
----------------------------------------------------------------------
.../apache/guacamole/extension/Extension.java | 36 +----
.../extension/ExtensionClassLoader.java | 159 +++++++++++++++++++
2 files changed, 161 insertions(+), 34 deletions(-)
----------------------------------------------------------------------