update user manager to support instantiation if IUserService with IRuntimeManager as a parameter
diff --git a/src/main/java/com/gitblit/IUserService.java b/src/main/java/com/gitblit/IUserService.java index 6f3c542..468f968 100644 --- a/src/main/java/com/gitblit/IUserService.java +++ b/src/main/java/com/gitblit/IUserService.java
@@ -26,6 +26,9 @@ * Implementations of IUserService control all aspects of UserModel objects and * user authentication. * + * Plugins implementing this interface (which are instantiated during {@link com.gitblit.manager.UserManager#start()}) can provide + * a default constructor or might also use {@link IRuntimeManager} as a constructor argument which will be passed automatically then. + * * @author James Moger * */
diff --git a/src/main/java/com/gitblit/manager/UserManager.java b/src/main/java/com/gitblit/manager/UserManager.java index e88ac93..ba0cb35 100644 --- a/src/main/java/com/gitblit/manager/UserManager.java +++ b/src/main/java/com/gitblit/manager/UserManager.java
@@ -17,6 +17,8 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; @@ -119,8 +121,15 @@ // typical file path configuration File realmFile = runtimeManager.getFileOrFolder(Keys.realm.userService, "${baseFolder}/users.conf"); service = createUserService(realmFile); - } catch (InstantiationException | IllegalAccessException e) { - logger.error("failed to instantiate user service {}: {}", realm, e.getMessage()); + } catch (InstantiationException | IllegalAccessException e1) { + logger.error("failed to instantiate user service {}: {}. Trying once again with IRuntimeManager constructor", realm, e1.getMessage()); + //try once again with file constructor. this adds support for subclasses of ConfigUserService + try { + Constructor<?> constructor = Class.forName(realm).getConstructor(IRuntimeManager.class); + service = (IUserService) constructor.newInstance(runtimeManager); + } catch (NoSuchMethodException | SecurityException | ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e2) { + logger.error("failed to instantiate user service {}: {}", realm, e2.getMessage()); + } } } setUserService(service);