mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 05:07:41 +00:00
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.
This commit is contained in:
@@ -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
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user