From da6a2611ed8cb73856ad41a39a322596fdd9ea05 Mon Sep 17 00:00:00 2001 From: de4c9d Date: Fri, 30 Dec 2016 17:09:16 +0100 Subject: update user manager to support instantiation if IUserService with IRuntimeManager as a parameter --- src/main/java/com/gitblit/IUserService.java | 3 +++ src/main/java/com/gitblit/manager/UserManager.java | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gitblit/IUserService.java b/src/main/java/com/gitblit/IUserService.java index 6f3c5423..468f968f 100644 --- a/src/main/java/com/gitblit/IUserService.java +++ b/src/main/java/com/gitblit/IUserService.java @@ -26,6 +26,9 @@ import com.gitblit.models.UserModel; * 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 e88ac93c..ba0cb35e 100644 --- a/src/main/java/com/gitblit/manager/UserManager.java +++ b/src/main/java/com/gitblit/manager/UserManager.java @@ -17,6 +17,8 @@ package com.gitblit.manager; 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 @@ public class UserManager implements IUserManager { // 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); -- cgit v1.2.3 From a6ae27a472af1260ab078edb7199f60086b56a4b Mon Sep 17 00:00:00 2001 From: de4c9d Date: Fri, 30 Dec 2016 18:19:58 +0100 Subject: updated comment --- src/main/java/com/gitblit/manager/UserManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gitblit/manager/UserManager.java b/src/main/java/com/gitblit/manager/UserManager.java index ba0cb35e..2e68e40d 100644 --- a/src/main/java/com/gitblit/manager/UserManager.java +++ b/src/main/java/com/gitblit/manager/UserManager.java @@ -123,7 +123,7 @@ public class UserManager implements IUserManager { service = createUserService(realmFile); } 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 once again with IRuntimeManager constructor. This adds support for subclasses of ConfigUserService and other custom IUserServices try { Constructor constructor = Class.forName(realm).getConstructor(IRuntimeManager.class); service = (IUserService) constructor.newInstance(runtimeManager); -- cgit v1.2.3 From d79f5630c82a0d89ec5b2d3a1f0365bf72668a78 Mon Sep 17 00:00:00 2001 From: Martin Spielmann Date: Fri, 6 Jan 2017 01:09:37 +0100 Subject: extracted method --- src/main/java/com/gitblit/manager/UserManager.java | 29 +++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gitblit/manager/UserManager.java b/src/main/java/com/gitblit/manager/UserManager.java index 2e68e40d..d661c9b4 100644 --- a/src/main/java/com/gitblit/manager/UserManager.java +++ b/src/main/java/com/gitblit/manager/UserManager.java @@ -121,15 +121,10 @@ public class UserManager implements IUserManager { // typical file path configuration File realmFile = runtimeManager.getFileOrFolder(Keys.realm.userService, "${baseFolder}/users.conf"); service = createUserService(realmFile); - } catch (InstantiationException | IllegalAccessException e1) { - logger.error("failed to instantiate user service {}: {}. Trying once again with IRuntimeManager constructor", realm, e1.getMessage()); - //try once again with IRuntimeManager constructor. This adds support for subclasses of ConfigUserService and other custom IUserServices - 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()); - } + } catch (InstantiationException | IllegalAccessException e) { + logger.error("failed to instantiate user service {}: {}. Trying once again with IRuntimeManager constructor", realm, e.getMessage()); + //try once again with IRuntimeManager constructor. This adds support for subclasses of ConfigUserService and other custom IUserServices + service = createIRuntimeManagerAwareUserService(realm); } } setUserService(service); @@ -137,6 +132,22 @@ public class UserManager implements IUserManager { return this; } + /** + * Tries to create an {@link IUserService} with {@link #runtimeManager} as a constructor parameter + * + * @param realm the class name of the {@link IUserService} to be instantiated + * @return the {@link IUserService} or {@code null} if instantiation fails + */ + private IUserService createIRuntimeManagerAwareUserService(String realm) { + try { + Constructor constructor = Class.forName(realm).getConstructor(IRuntimeManager.class); + return (IUserService) constructor.newInstance(runtimeManager); + } catch (NoSuchMethodException | SecurityException | ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + logger.error("failed to instantiate user service {}: {}", realm, e.getMessage()); + return null; + } + } + protected IUserService createUserService(File realmFile) { IUserService service = null; if (realmFile.getName().toLowerCase().endsWith(".conf")) { -- cgit v1.2.3