Browse Source

Merge pull request #1171 from pingunaut/usermanager-file-instantiation

Update UserManager to support construction of IUserServices with IRuntimeManager as a constructor parameter
tags/r1.9.0
James Moger 7 years ago
parent
commit
5541f37ea9

+ 3
- 0
src/main/java/com/gitblit/IUserService.java View File

@@ -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
*
*/

+ 22
- 2
src/main/java/com/gitblit/manager/UserManager.java View File

@@ -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,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 e) {
logger.error("failed to instantiate user service {}: {}", realm, e.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);
@@ -128,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")) {

Loading…
Cancel
Save