Repository: incubator-guacamole-client
Updated Branches:
  refs/heads/master d808f7fbb -> 153996b72


GUACAMOLE-364: factor out common provider class instantiation support

This will allow the same error and debug logging to be used both
for the AuthenticationProviderFacade and a new ListenerFacade.


Project: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/commit/287ab56f
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/tree/287ab56f
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/diff/287ab56f

Branch: refs/heads/master
Commit: 287ab56f0f793190522e9d173f3fbd61c9155919
Parents: a5ebc07
Author: Carl Harris <cehar...@vt.edu>
Authored: Wed Aug 16 06:52:10 2017 -0400
Committer: Carl Harris <cehar...@vt.edu>
Committed: Wed Aug 16 06:52:49 2017 -0400

----------------------------------------------------------------------
 .../extension/AuthenticationProviderFacade.java |  55 +---------
 .../guacamole/extension/ProviderFactory.java    | 102 +++++++++++++++++++
 2 files changed, 104 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/287ab56f/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java
----------------------------------------------------------------------
diff --git 
a/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java
 
b/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java
index e1ed5ff..cb65909 100644
--- 
a/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java
+++ 
b/guacamole/src/main/java/org/apache/guacamole/extension/AuthenticationProviderFacade.java
@@ -19,7 +19,6 @@
 
 package org.apache.guacamole.extension;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.UUID;
 import org.apache.guacamole.GuacamoleException;
 import org.apache.guacamole.net.auth.AuthenticatedUser;
@@ -66,58 +65,8 @@ public class AuthenticationProviderFacade implements 
AuthenticationProvider {
      *     The AuthenticationProvider subclass to instantiate.
      */
     public AuthenticationProviderFacade(Class<? extends 
AuthenticationProvider> authProviderClass) {
-
-        AuthenticationProvider instance = null;
-        
-        try {
-            // Attempt to instantiate the authentication provider
-            instance = authProviderClass.getConstructor().newInstance();
-        }
-        catch (NoSuchMethodException e) {
-            logger.error("The authentication extension in use is not properly 
defined. "
-                       + "Please contact the developers of the extension or, 
if you "
-                       + "are the developer, turn on debug-level logging.");
-            logger.debug("AuthenticationProvider is missing a default 
constructor.", e);
-        }
-        catch (SecurityException e) {
-            logger.error("The Java security mananager is preventing 
authentication extensions "
-                       + "from being loaded. Please check the configuration of 
Java or your "
-                       + "servlet container.");
-            logger.debug("Creation of AuthenticationProvider disallowed by 
security manager.", e);
-        }
-        catch (InstantiationException e) {
-            logger.error("The authentication extension in use is not properly 
defined. "
-                       + "Please contact the developers of the extension or, 
if you "
-                       + "are the developer, turn on debug-level logging.");
-            logger.debug("AuthenticationProvider cannot be instantiated.", e);
-        }
-        catch (IllegalAccessException e) {
-            logger.error("The authentication extension in use is not properly 
defined. "
-                       + "Please contact the developers of the extension or, 
if you "
-                       + "are the developer, turn on debug-level logging.");
-            logger.debug("Default constructor of AuthenticationProvider is not 
public.", e);
-        }
-        catch (IllegalArgumentException e) {
-            logger.error("The authentication extension in use is not properly 
defined. "
-                       + "Please contact the developers of the extension or, 
if you "
-                       + "are the developer, turn on debug-level logging.");
-            logger.debug("Default constructor of AuthenticationProvider cannot 
accept zero arguments.", e);
-        } 
-        catch (InvocationTargetException e) {
-
-            // Obtain causing error - create relatively-informative stub error 
if cause is unknown
-            Throwable cause = e.getCause();
-            if (cause == null)
-                cause = new GuacamoleException("Error encountered during 
initialization.");
-            
-            logger.error("Authentication extension failed to start: {}", 
cause.getMessage());
-            logger.debug("AuthenticationProvider instantiation failed.", e);
-
-        }
-       
-        // Associate instance, if any
-        authProvider = instance;
-
+        authProvider = ProviderFactory.newInstance("authentication provider",
+            authProviderClass);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-client/blob/287ab56f/guacamole/src/main/java/org/apache/guacamole/extension/ProviderFactory.java
----------------------------------------------------------------------
diff --git 
a/guacamole/src/main/java/org/apache/guacamole/extension/ProviderFactory.java 
b/guacamole/src/main/java/org/apache/guacamole/extension/ProviderFactory.java
new file mode 100644
index 0000000..0620b4d
--- /dev/null
+++ 
b/guacamole/src/main/java/org/apache/guacamole/extension/ProviderFactory.java
@@ -0,0 +1,102 @@
+/*
+ * 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 org.apache.guacamole.GuacamoleException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * Static factory method for creating provider instances and logging 
unexpected outcomes
+ * with sufficient detail to allow user/developer debugging.
+ */
+class ProviderFactory {
+
+    private static final Logger logger = 
LoggerFactory.getLogger(ProviderFactory.class);
+
+    /**
+     * Creates an instance of the specified provider class using the no-arg 
constructor.
+     *
+     * @param typeName
+     *      The provider type name used for log messages (e.g. "authentication 
provider")
+     * @param providerClass
+     *      The provider class to instantiate
+     * @param <T>
+     *      The provider type
+     * @return
+     *      A provider instance or null if no instance was created due to error
+     */
+    static <T> T newInstance(String typeName, Class<? extends T> 
providerClass) {
+        T instance = null;
+
+        try {
+            // Attempt to instantiate the provider
+            instance = providerClass.getConstructor().newInstance();
+        }
+        catch (NoSuchMethodException e) {
+            logger.error("The {} extension in use is not properly defined. "
+                    + "Please contact the developers of the extension or, if 
you "
+                    + "are the developer, turn on debug-level logging.", 
typeName);
+            logger.debug("{} is missing a default constructor.",
+                    providerClass.getName(), e);
+        }
+        catch (SecurityException e) {
+            logger.error("The Java security manager is preventing extensions "
+                    + "from being loaded. Please check the configuration of 
Java or your "
+                    + "servlet container.");
+            logger.debug("Creation of {} disallowed by security manager.",
+                    providerClass.getName(), e);
+        }
+        catch (InstantiationException e) {
+            logger.error("The {} extension in use is not properly defined. "
+                    + "Please contact the developers of the extension or, if 
you "
+                    + "are the developer, turn on debug-level logging.", 
typeName);
+            logger.debug("{} cannot be instantiated.", 
providerClass.getName(), e);
+        }
+        catch (IllegalAccessException e) {
+            logger.error("The {} extension in use is not properly defined. "
+                    + "Please contact the developers of the extension or, if 
you "
+                    + "are the developer, turn on debug-level logging.");
+            logger.debug("Default constructor of {} is not public.", typeName, 
e);
+        }
+        catch (IllegalArgumentException e) {
+            logger.error("The {} extension in use is not properly defined. "
+                    + "Please contact the developers of the extension or, if 
you "
+                    + "are the developer, turn on debug-level logging.", 
typeName);
+            logger.debug("Default constructor of {} cannot accept zero 
arguments.",
+                    providerClass.getName(), e);
+        }
+        catch (InvocationTargetException e) {
+            // Obtain causing error - create relatively-informative stub error 
if cause is unknown
+            Throwable cause = e.getCause();
+            if (cause == null)
+                cause = new GuacamoleException("Error encountered during 
initialization.");
+
+            logger.error("{} extension failed to start: {}", typeName, 
cause.getMessage());
+            logger.debug("{} instantiation failed.", providerClass.getName(), 
e);
+        }
+
+        return instance;
+    }
+
+}

Reply via email to