mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 13:17: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;
|
package org.apache.guacamole.extension;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import org.apache.guacamole.GuacamoleException;
|
import org.apache.guacamole.GuacamoleException;
|
||||||
import org.apache.guacamole.net.auth.AuthenticatedUser;
|
import org.apache.guacamole.net.auth.AuthenticatedUser;
|
||||||
@@ -66,58 +65,8 @@ public class AuthenticationProviderFacade implements AuthenticationProvider {
|
|||||||
* The AuthenticationProvider subclass to instantiate.
|
* The AuthenticationProvider subclass to instantiate.
|
||||||
*/
|
*/
|
||||||
public AuthenticationProviderFacade(Class<? extends AuthenticationProvider> authProviderClass) {
|
public AuthenticationProviderFacade(Class<? extends AuthenticationProvider> authProviderClass) {
|
||||||
|
authProvider = ProviderFactory.newInstance("authentication provider",
|
||||||
AuthenticationProvider instance = null;
|
authProviderClass);
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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