You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by Mark Thomas <ma...@apache.org> on 2018/10/01 19:08:58 UTC
Re: Proposed patch for o.a.c.users.MemoryUserDatabase
On 27/09/18 16:57, Christopher Schultz wrote:
> All,
>
> I have a proposed patch to MemoryUserDatabase that changes the
> behavior when a triggered-reload fails. Recently, markt added code to
> allow database reloads, but if there is an error reloading the
> database, the database is emptied and perhaps an administrator can no
> longer make e.g. calls to the manager.
>
> This patch makes an open-failure into a no-op: the user database will
> not be changed unless there is a successful load from the file.
Seems reasonable to me.
> This patch changes the way that data is loaded by the Digester.
> Instead of modifying the role/group/user maps directly, the data are
> loaded into new maps and then all maps are updated atomically.
>
> This patch removes a bunch of code from this class, and I have a unit
> test (not attached) which demonstrates that (a) it works and (b)
> thread-safety is maintained.
Woot for less code ;)
Mark
>
> Thanks,
> -chris
>
> For review:
>
> ### Eclipse Workspace Patch 1.0
> #P tomcat-trunk
> Index: java/org/apache/catalina/users/MemoryUserDatabase.java
> ===================================================================
> --- java/org/apache/catalina/users/MemoryUserDatabase.java (revision
> 1842017)
> +++ java/org/apache/catalina/users/MemoryUserDatabase.java (working copy)
> @@ -31,6 +31,7 @@
> import java.util.concurrent.ConcurrentHashMap;
> import java.util.concurrent.locks.Lock;
> import java.util.concurrent.locks.ReentrantReadWriteLock;
> +import java.util.regex.Pattern;
>
> import org.apache.catalina.Globals;
> import org.apache.catalina.Group;
> @@ -39,11 +40,10 @@
> import org.apache.catalina.UserDatabase;
> import org.apache.juli.logging.Log;
> import org.apache.juli.logging.LogFactory;
> -import org.apache.tomcat.util.digester.AbstractObjectCreationFactory;
> +import org.apache.tomcat.util.digester.CallParamRule;
> import org.apache.tomcat.util.digester.Digester;
> import org.apache.tomcat.util.file.ConfigFileLoader;
> import org.apache.tomcat.util.res.StringManager;
> -import org.xml.sax.Attributes;
>
> /**
> * Concrete implementation of {@link UserDatabase} that loads all
> defined users,
> @@ -107,7 +107,7 @@
> /**
> * The set of {@link Group}s defined in this database, keyed by
> group name.
> */
> - protected final Map<String, Group> groups = new
> ConcurrentHashMap<>();
> + protected Map<String, Group> groups = new ConcurrentHashMap<>();
>
> /**
> * The unique global identifier of this user database.
> @@ -140,12 +140,12 @@
> /**
> * The set of {@link Role}s defined in this database, keyed by
> role name.
> */
> - protected final Map<String, Role> roles = new ConcurrentHashMap<>();
> + protected Map<String, Role> roles = new ConcurrentHashMap<>();
>
> /**
> * The set of {@link User}s defined in this database, keyed by
> user name.
> */
> - protected final Map<String, User> users = new ConcurrentHashMap<>();
> + protected Map<String, User> users = new ConcurrentHashMap<>();
>
> private final ReentrantReadWriteLock dbLock = new
> ReentrantReadWriteLock();
> private final Lock readLock = dbLock.readLock();
> @@ -415,54 +415,139 @@
> */
> @Override
> public void open() throws Exception {
> + String pathName = getPathname();
> + URI uri = ConfigFileLoader.getURI(pathName);
> + URL url = uri.toURL();
> + URLConnection uConn = url.openConnection();
>
> - writeLock.lock();
> - try {
> - // Erase any previous groups and users
> - users.clear();
> - groups.clear();
> - roles.clear();
> + try (InputStream is = uConn.getInputStream()) {
> + this.lastModified = uConn.getLastModified();
>
> - String pathName = getPathname();
> - URI uri = ConfigFileLoader.getURI(pathName);
> - URL url = uri.toURL();
> - URLConnection uConn = url.openConnection();
> + // Construct a digester to read the XML input file
> + Digester digester = new Digester();
> + try {
> + digester.setFeature(
> +
> "http://apache.org/xml/features/allow-java-encodings", true);
> + } catch (Exception e) {
> +
> log.warn(sm.getString("memoryUserDatabase.xmlFeatureEncoding"), e);
> + }
>
> - try (InputStream is = uConn.getInputStream()) {
> - this.lastModified = uConn.getLastModified();
> + Bundle bundle = new Bundle();
> + digester.push(bundle);
> + digester.addCallMethod("tomcat-users/role", "addRole", 2);
> + digester.addRule("tomcat-users/role", new
> CallParamRule(0, "rolename"));
> + digester.addRule("tomcat-users/role", new
> CallParamRule(1, "description"));
> + digester.addCallMethod("tomcat-users/group", "addGroup", 3);
> + digester.addRule("tomcat-users/group", new
> CallParamRule(0, "groupname"));
> + digester.addRule("tomcat-users/group", new
> CallParamRule(1, "description"));
> + digester.addRule("tomcat-users/group", new
> CallParamRule(2, "roles"));
> + digester.addCallMethod("tomcat-users/user", "addUser", 5);
> + digester.addRule("tomcat-users/user", new
> CallParamRule(0, "username"));
> + digester.addRule("tomcat-users/user", new
> CallParamRule(1, "fullname"));
> + digester.addRule("tomcat-users/user", new
> CallParamRule(2, "password"));
> + digester.addRule("tomcat-users/user", new
> CallParamRule(3, "roles"));
> + digester.addRule("tomcat-users/user", new
> CallParamRule(4, "groups"));
>
> - // Construct a digester to read the XML input file
> - Digester digester = new Digester();
> - try {
> - digester.setFeature(
> -
> "http://apache.org/xml/features/allow-java-encodings", true);
> - } catch (Exception e) {
> -
> log.warn(sm.getString("memoryUserDatabase.xmlFeatureEncoding"), e);
> + // Parse the XML input to load this database
> + digester.parse(is);
> +
> + // Update all maps simultaneously
> + writeLock.lock();
> + try {
> + roles = bundle.getRoles();
> + groups = bundle.getGroups();
> + users = bundle.getUsers();
> + } finally {
> + writeLock.unlock();
> + }
> + } catch (IOException ioe) {
> + log.error(sm.getString("memoryUserDatabase.fileNotFound",
> pathName));
> + }
> + }
> +
> + private static final Pattern CSV = Pattern.compile("\\s*,\\s*");
> + /**
> + * A wrapper around the role/group/user maps managed by the
> MemoryUserDatabase,
> + * used for loading the database
> + */
> + public class Bundle {
> + ConcurrentHashMap<String,User> users = new ConcurrentHashMap<>();
> + ConcurrentHashMap<String,Group> groups = new
> ConcurrentHashMap<>();
> + ConcurrentHashMap<String,Role> roles = new ConcurrentHashMap<>();
> +
> + public void addRole(Role role) {
> + roles.put(role.getName(), role);
> + }
> +
> + public void addRole(String name, String description) {
> + addRole(new MemoryRole(MemoryUserDatabase.this, name,
> description));
> + }
> +
> + public void addGroup(Group group) {
> + groups.put(group.getName(), group);
> + }
> +
> + public void addGroup(String name, String description, String
> roles) {
> + Group group = new MemoryGroup(MemoryUserDatabase.this,
> name, description);
> +
> + if(null != roles) {
> + for(String roleName : CSV.split(roles)) {
> + Role role = getRole(roleName);
> + if(null == role) {
> + role = new
> MemoryRole(MemoryUserDatabase.this, roleName, null);
> + addRole(role);
> + }
> + group.addRole(role);
> + }
> + }
> +
> + addGroup(group);
> + }
> +
> + public void addUser(String name, String fullname, String
> password, String roles, String groups) {
> + User user = new MemoryUser(MemoryUserDatabase.this, name,
> password, fullname);
> +
> + if (groups != null) {
> + for(String groupName : CSV.split(groups)) {
> + Group group = getGroup(groupName);
> + if(null == group) {
> + group = new
> MemoryGroup(MemoryUserDatabase.this, groupName, null);
> + addGroup(group);
> + }
> +
> + user.addGroup(group);
> }
> - digester.addFactoryCreate("tomcat-users/group",
> - new MemoryGroupCreationFactory(this), true);
> - digester.addFactoryCreate("tomcat-users/role",
> - new MemoryRoleCreationFactory(this), true);
> - digester.addFactoryCreate("tomcat-users/user",
> - new MemoryUserCreationFactory(this), true);
> + }
> +
> + if (roles != null) {
> + for(String roleName : CSV.split(roles)) {
> + Role role = getRole(roleName);
> + if(null == role) {
> + role = new
> MemoryRole(MemoryUserDatabase.this, roleName, null);
> + addRole(role);
> + }
>
> - // Parse the XML input to load this database
> - digester.parse(is);
> - } catch (IOException ioe) {
> -
> log.error(sm.getString("memoryUserDatabase.fileNotFound", pathName));
> + user.addRole(role);
> + }
> }
> - } catch (Exception e) {
> - // Fail safe on error
> - users.clear();
> - groups.clear();
> - roles.clear();
>
> - throw e;
> - } finally {
> - writeLock.unlock();
> + addUser(user);
> }
> - }
> +
> + public void addUser(User user) {
> + users.put(user.getName(), user);
> + }
> +
> + public Role getRole(String name) {
> + return roles.get(name);
> + }
> + public Group getGroup(String name) { return groups.get(name); }
> + public User getUser(String name) { return users.get(name); }
>
> + public Map<String,User> getUsers() { return users; }
> + public Map<String,Group> getGroups() { return groups; }
> + public Map<String,Role> getRoles() { return roles; }
> + }
>
> /**
> * Remove the specified {@link Group} from this user database.
> @@ -706,145 +791,3 @@
> return sb.toString();
> }
> }
> -
> -
> -/**
> - * Digester object creation factory for group instances.
> - */
> -class MemoryGroupCreationFactory extends AbstractObjectCreationFactory {
> -
> - public MemoryGroupCreationFactory(MemoryUserDatabase database) {
> - this.database = database;
> - }
> -
> -
> - @Override
> - public Object createObject(Attributes attributes) {
> - String groupname = attributes.getValue("groupname");
> - if (groupname == null) {
> - groupname = attributes.getValue("name");
> - }
> - String description = attributes.getValue("description");
> - String roles = attributes.getValue("roles");
> - Group group = database.createGroup(groupname, description);
> - if (roles != null) {
> - while (roles.length() > 0) {
> - String rolename = null;
> - int comma = roles.indexOf(',');
> - if (comma >= 0) {
> - rolename = roles.substring(0, comma).trim();
> - roles = roles.substring(comma + 1);
> - } else {
> - rolename = roles.trim();
> - roles = "";
> - }
> - if (rolename.length() > 0) {
> - Role role = database.findRole(rolename);
> - if (role == null) {
> - role = database.createRole(rolename, null);
> - }
> - group.addRole(role);
> - }
> - }
> - }
> - return group;
> - }
> -
> - private final MemoryUserDatabase database;
> -}
> -
> -
> -/**
> - * Digester object creation factory for role instances.
> - */
> -class MemoryRoleCreationFactory extends AbstractObjectCreationFactory {
> -
> - public MemoryRoleCreationFactory(MemoryUserDatabase database) {
> - this.database = database;
> - }
> -
> -
> - @Override
> - public Object createObject(Attributes attributes) {
> - String rolename = attributes.getValue("rolename");
> - if (rolename == null) {
> - rolename = attributes.getValue("name");
> - }
> - String description = attributes.getValue("description");
> - Role role = database.createRole(rolename, description);
> - return role;
> - }
> -
> - private final MemoryUserDatabase database;
> -}
> -
> -
> -/**
> - * Digester object creation factory for user instances.
> - */
> -class MemoryUserCreationFactory extends AbstractObjectCreationFactory {
> -
> - public MemoryUserCreationFactory(MemoryUserDatabase database) {
> - this.database = database;
> - }
> -
> -
> - @Override
> - public Object createObject(Attributes attributes) {
> - String username = attributes.getValue("username");
> - if (username == null) {
> - username = attributes.getValue("name");
> - }
> - String password = attributes.getValue("password");
> - String fullName = attributes.getValue("fullName");
> - if (fullName == null) {
> - fullName = attributes.getValue("fullname");
> - }
> - String groups = attributes.getValue("groups");
> - String roles = attributes.getValue("roles");
> - User user = database.createUser(username, password, fullName);
> - if (groups != null) {
> - while (groups.length() > 0) {
> - String groupname = null;
> - int comma = groups.indexOf(',');
> - if (comma >= 0) {
> - groupname = groups.substring(0, comma).trim();
> - groups = groups.substring(comma + 1);
> - } else {
> - groupname = groups.trim();
> - groups = "";
> - }
> - if (groupname.length() > 0) {
> - Group group = database.findGroup(groupname);
> - if (group == null) {
> - group = database.createGroup(groupname, null);
> - }
> - user.addGroup(group);
> - }
> - }
> - }
> - if (roles != null) {
> - while (roles.length() > 0) {
> - String rolename = null;
> - int comma = roles.indexOf(',');
> - if (comma >= 0) {
> - rolename = roles.substring(0, comma).trim();
> - roles = roles.substring(comma + 1);
> - } else {
> - rolename = roles.trim();
> - roles = "";
> - }
> - if (rolename.length() > 0) {
> - Role role = database.findRole(rolename);
> - if (role == null) {
> - role = database.createRole(rolename, null);
> - }
> - user.addRole(role);
> - }
> - }
> - }
> - return user;
> - }
> -
> - private final MemoryUserDatabase database;
> -}
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Re: Proposed patch for o.a.c.users.MemoryUserDatabase
Posted by Igal Sapir <is...@apache.org>.
On 10/1/2018 12:08 PM, Mark Thomas wrote:
> On 27/09/18 16:57, Christopher Schultz wrote:
>> All,
>>
>> I have a proposed patch to MemoryUserDatabase that changes the
>> behavior when a triggered-reload fails. Recently, markt added code to
>> allow database reloads, but if there is an error reloading the
>> database, the database is emptied and perhaps an administrator can no
>> longer make e.g. calls to the manager.
>>
>> This patch makes an open-failure into a no-op: the user database will
>> not be changed unless there is a successful load from the file.
> Seems reasonable to me.
>
>> This patch changes the way that data is loaded by the Digester.
>> Instead of modifying the role/group/user maps directly, the data are
>> loaded into new maps and then all maps are updated atomically.
>>
>> This patch removes a bunch of code from this class, and I have a unit
>> test (not attached) which demonstrates that (a) it works and (b)
>> thread-safety is maintained.
> Woot for less code ;)
+1
Igal
> Mark
>
>
>> Thanks,
>> -chris
>>
>> For review:
>>
>> ### Eclipse Workspace Patch 1.0
>> #P tomcat-trunk
>> Index: java/org/apache/catalina/users/MemoryUserDatabase.java
>> ===================================================================
>> --- java/org/apache/catalina/users/MemoryUserDatabase.java (revision
>> 1842017)
>> +++ java/org/apache/catalina/users/MemoryUserDatabase.java (working copy)
>> @@ -31,6 +31,7 @@
>> import java.util.concurrent.ConcurrentHashMap;
>> import java.util.concurrent.locks.Lock;
>> import java.util.concurrent.locks.ReentrantReadWriteLock;
>> +import java.util.regex.Pattern;
>>
>> import org.apache.catalina.Globals;
>> import org.apache.catalina.Group;
>> @@ -39,11 +40,10 @@
>> import org.apache.catalina.UserDatabase;
>> import org.apache.juli.logging.Log;
>> import org.apache.juli.logging.LogFactory;
>> -import org.apache.tomcat.util.digester.AbstractObjectCreationFactory;
>> +import org.apache.tomcat.util.digester.CallParamRule;
>> import org.apache.tomcat.util.digester.Digester;
>> import org.apache.tomcat.util.file.ConfigFileLoader;
>> import org.apache.tomcat.util.res.StringManager;
>> -import org.xml.sax.Attributes;
>>
>> /**
>> * Concrete implementation of {@link UserDatabase} that loads all
>> defined users,
>> @@ -107,7 +107,7 @@
>> /**
>> * The set of {@link Group}s defined in this database, keyed by
>> group name.
>> */
>> - protected final Map<String, Group> groups = new
>> ConcurrentHashMap<>();
>> + protected Map<String, Group> groups = new ConcurrentHashMap<>();
>>
>> /**
>> * The unique global identifier of this user database.
>> @@ -140,12 +140,12 @@
>> /**
>> * The set of {@link Role}s defined in this database, keyed by
>> role name.
>> */
>> - protected final Map<String, Role> roles = new ConcurrentHashMap<>();
>> + protected Map<String, Role> roles = new ConcurrentHashMap<>();
>>
>> /**
>> * The set of {@link User}s defined in this database, keyed by
>> user name.
>> */
>> - protected final Map<String, User> users = new ConcurrentHashMap<>();
>> + protected Map<String, User> users = new ConcurrentHashMap<>();
>>
>> private final ReentrantReadWriteLock dbLock = new
>> ReentrantReadWriteLock();
>> private final Lock readLock = dbLock.readLock();
>> @@ -415,54 +415,139 @@
>> */
>> @Override
>> public void open() throws Exception {
>> + String pathName = getPathname();
>> + URI uri = ConfigFileLoader.getURI(pathName);
>> + URL url = uri.toURL();
>> + URLConnection uConn = url.openConnection();
>>
>> - writeLock.lock();
>> - try {
>> - // Erase any previous groups and users
>> - users.clear();
>> - groups.clear();
>> - roles.clear();
>> + try (InputStream is = uConn.getInputStream()) {
>> + this.lastModified = uConn.getLastModified();
>>
>> - String pathName = getPathname();
>> - URI uri = ConfigFileLoader.getURI(pathName);
>> - URL url = uri.toURL();
>> - URLConnection uConn = url.openConnection();
>> + // Construct a digester to read the XML input file
>> + Digester digester = new Digester();
>> + try {
>> + digester.setFeature(
>> +
>> "http://apache.org/xml/features/allow-java-encodings", true);
>> + } catch (Exception e) {
>> +
>> log.warn(sm.getString("memoryUserDatabase.xmlFeatureEncoding"), e);
>> + }
>>
>> - try (InputStream is = uConn.getInputStream()) {
>> - this.lastModified = uConn.getLastModified();
>> + Bundle bundle = new Bundle();
>> + digester.push(bundle);
>> + digester.addCallMethod("tomcat-users/role", "addRole", 2);
>> + digester.addRule("tomcat-users/role", new
>> CallParamRule(0, "rolename"));
>> + digester.addRule("tomcat-users/role", new
>> CallParamRule(1, "description"));
>> + digester.addCallMethod("tomcat-users/group", "addGroup", 3);
>> + digester.addRule("tomcat-users/group", new
>> CallParamRule(0, "groupname"));
>> + digester.addRule("tomcat-users/group", new
>> CallParamRule(1, "description"));
>> + digester.addRule("tomcat-users/group", new
>> CallParamRule(2, "roles"));
>> + digester.addCallMethod("tomcat-users/user", "addUser", 5);
>> + digester.addRule("tomcat-users/user", new
>> CallParamRule(0, "username"));
>> + digester.addRule("tomcat-users/user", new
>> CallParamRule(1, "fullname"));
>> + digester.addRule("tomcat-users/user", new
>> CallParamRule(2, "password"));
>> + digester.addRule("tomcat-users/user", new
>> CallParamRule(3, "roles"));
>> + digester.addRule("tomcat-users/user", new
>> CallParamRule(4, "groups"));
>>
>> - // Construct a digester to read the XML input file
>> - Digester digester = new Digester();
>> - try {
>> - digester.setFeature(
>> -
>> "http://apache.org/xml/features/allow-java-encodings", true);
>> - } catch (Exception e) {
>> -
>> log.warn(sm.getString("memoryUserDatabase.xmlFeatureEncoding"), e);
>> + // Parse the XML input to load this database
>> + digester.parse(is);
>> +
>> + // Update all maps simultaneously
>> + writeLock.lock();
>> + try {
>> + roles = bundle.getRoles();
>> + groups = bundle.getGroups();
>> + users = bundle.getUsers();
>> + } finally {
>> + writeLock.unlock();
>> + }
>> + } catch (IOException ioe) {
>> + log.error(sm.getString("memoryUserDatabase.fileNotFound",
>> pathName));
>> + }
>> + }
>> +
>> + private static final Pattern CSV = Pattern.compile("\\s*,\\s*");
>> + /**
>> + * A wrapper around the role/group/user maps managed by the
>> MemoryUserDatabase,
>> + * used for loading the database
>> + */
>> + public class Bundle {
>> + ConcurrentHashMap<String,User> users = new ConcurrentHashMap<>();
>> + ConcurrentHashMap<String,Group> groups = new
>> ConcurrentHashMap<>();
>> + ConcurrentHashMap<String,Role> roles = new ConcurrentHashMap<>();
>> +
>> + public void addRole(Role role) {
>> + roles.put(role.getName(), role);
>> + }
>> +
>> + public void addRole(String name, String description) {
>> + addRole(new MemoryRole(MemoryUserDatabase.this, name,
>> description));
>> + }
>> +
>> + public void addGroup(Group group) {
>> + groups.put(group.getName(), group);
>> + }
>> +
>> + public void addGroup(String name, String description, String
>> roles) {
>> + Group group = new MemoryGroup(MemoryUserDatabase.this,
>> name, description);
>> +
>> + if(null != roles) {
>> + for(String roleName : CSV.split(roles)) {
>> + Role role = getRole(roleName);
>> + if(null == role) {
>> + role = new
>> MemoryRole(MemoryUserDatabase.this, roleName, null);
>> + addRole(role);
>> + }
>> + group.addRole(role);
>> + }
>> + }
>> +
>> + addGroup(group);
>> + }
>> +
>> + public void addUser(String name, String fullname, String
>> password, String roles, String groups) {
>> + User user = new MemoryUser(MemoryUserDatabase.this, name,
>> password, fullname);
>> +
>> + if (groups != null) {
>> + for(String groupName : CSV.split(groups)) {
>> + Group group = getGroup(groupName);
>> + if(null == group) {
>> + group = new
>> MemoryGroup(MemoryUserDatabase.this, groupName, null);
>> + addGroup(group);
>> + }
>> +
>> + user.addGroup(group);
>> }
>> - digester.addFactoryCreate("tomcat-users/group",
>> - new MemoryGroupCreationFactory(this), true);
>> - digester.addFactoryCreate("tomcat-users/role",
>> - new MemoryRoleCreationFactory(this), true);
>> - digester.addFactoryCreate("tomcat-users/user",
>> - new MemoryUserCreationFactory(this), true);
>> + }
>> +
>> + if (roles != null) {
>> + for(String roleName : CSV.split(roles)) {
>> + Role role = getRole(roleName);
>> + if(null == role) {
>> + role = new
>> MemoryRole(MemoryUserDatabase.this, roleName, null);
>> + addRole(role);
>> + }
>>
>> - // Parse the XML input to load this database
>> - digester.parse(is);
>> - } catch (IOException ioe) {
>> -
>> log.error(sm.getString("memoryUserDatabase.fileNotFound", pathName));
>> + user.addRole(role);
>> + }
>> }
>> - } catch (Exception e) {
>> - // Fail safe on error
>> - users.clear();
>> - groups.clear();
>> - roles.clear();
>>
>> - throw e;
>> - } finally {
>> - writeLock.unlock();
>> + addUser(user);
>> }
>> - }
>> +
>> + public void addUser(User user) {
>> + users.put(user.getName(), user);
>> + }
>> +
>> + public Role getRole(String name) {
>> + return roles.get(name);
>> + }
>> + public Group getGroup(String name) { return groups.get(name); }
>> + public User getUser(String name) { return users.get(name); }
>>
>> + public Map<String,User> getUsers() { return users; }
>> + public Map<String,Group> getGroups() { return groups; }
>> + public Map<String,Role> getRoles() { return roles; }
>> + }
>>
>> /**
>> * Remove the specified {@link Group} from this user database.
>> @@ -706,145 +791,3 @@
>> return sb.toString();
>> }
>> }
>> -
>> -
>> -/**
>> - * Digester object creation factory for group instances.
>> - */
>> -class MemoryGroupCreationFactory extends AbstractObjectCreationFactory {
>> -
>> - public MemoryGroupCreationFactory(MemoryUserDatabase database) {
>> - this.database = database;
>> - }
>> -
>> -
>> - @Override
>> - public Object createObject(Attributes attributes) {
>> - String groupname = attributes.getValue("groupname");
>> - if (groupname == null) {
>> - groupname = attributes.getValue("name");
>> - }
>> - String description = attributes.getValue("description");
>> - String roles = attributes.getValue("roles");
>> - Group group = database.createGroup(groupname, description);
>> - if (roles != null) {
>> - while (roles.length() > 0) {
>> - String rolename = null;
>> - int comma = roles.indexOf(',');
>> - if (comma >= 0) {
>> - rolename = roles.substring(0, comma).trim();
>> - roles = roles.substring(comma + 1);
>> - } else {
>> - rolename = roles.trim();
>> - roles = "";
>> - }
>> - if (rolename.length() > 0) {
>> - Role role = database.findRole(rolename);
>> - if (role == null) {
>> - role = database.createRole(rolename, null);
>> - }
>> - group.addRole(role);
>> - }
>> - }
>> - }
>> - return group;
>> - }
>> -
>> - private final MemoryUserDatabase database;
>> -}
>> -
>> -
>> -/**
>> - * Digester object creation factory for role instances.
>> - */
>> -class MemoryRoleCreationFactory extends AbstractObjectCreationFactory {
>> -
>> - public MemoryRoleCreationFactory(MemoryUserDatabase database) {
>> - this.database = database;
>> - }
>> -
>> -
>> - @Override
>> - public Object createObject(Attributes attributes) {
>> - String rolename = attributes.getValue("rolename");
>> - if (rolename == null) {
>> - rolename = attributes.getValue("name");
>> - }
>> - String description = attributes.getValue("description");
>> - Role role = database.createRole(rolename, description);
>> - return role;
>> - }
>> -
>> - private final MemoryUserDatabase database;
>> -}
>> -
>> -
>> -/**
>> - * Digester object creation factory for user instances.
>> - */
>> -class MemoryUserCreationFactory extends AbstractObjectCreationFactory {
>> -
>> - public MemoryUserCreationFactory(MemoryUserDatabase database) {
>> - this.database = database;
>> - }
>> -
>> -
>> - @Override
>> - public Object createObject(Attributes attributes) {
>> - String username = attributes.getValue("username");
>> - if (username == null) {
>> - username = attributes.getValue("name");
>> - }
>> - String password = attributes.getValue("password");
>> - String fullName = attributes.getValue("fullName");
>> - if (fullName == null) {
>> - fullName = attributes.getValue("fullname");
>> - }
>> - String groups = attributes.getValue("groups");
>> - String roles = attributes.getValue("roles");
>> - User user = database.createUser(username, password, fullName);
>> - if (groups != null) {
>> - while (groups.length() > 0) {
>> - String groupname = null;
>> - int comma = groups.indexOf(',');
>> - if (comma >= 0) {
>> - groupname = groups.substring(0, comma).trim();
>> - groups = groups.substring(comma + 1);
>> - } else {
>> - groupname = groups.trim();
>> - groups = "";
>> - }
>> - if (groupname.length() > 0) {
>> - Group group = database.findGroup(groupname);
>> - if (group == null) {
>> - group = database.createGroup(groupname, null);
>> - }
>> - user.addGroup(group);
>> - }
>> - }
>> - }
>> - if (roles != null) {
>> - while (roles.length() > 0) {
>> - String rolename = null;
>> - int comma = roles.indexOf(',');
>> - if (comma >= 0) {
>> - rolename = roles.substring(0, comma).trim();
>> - roles = roles.substring(comma + 1);
>> - } else {
>> - rolename = roles.trim();
>> - roles = "";
>> - }
>> - if (rolename.length() > 0) {
>> - Role role = database.findRole(rolename);
>> - if (role == null) {
>> - role = database.createRole(rolename, null);
>> - }
>> - user.addRole(role);
>> - }
>> - }
>> - }
>> - return user;
>> - }
>> -
>> - private final MemoryUserDatabase database;
>> -}
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
>> For additional commands, e-mail: dev-help@tomcat.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org