001: /*
002: * CoadunationLib: The coaduntion implementation library.
003: * Copyright (C) 2007 Rift IT Contracting
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
018: *
019: * ConfigurationRoleHandler.java
020: */
021:
022: // package path
023: package com.rift.coad.lib.security.role;
024:
025: // java import
026: import java.util.Map;
027: import java.util.HashMap;
028: import java.util.HashSet;
029: import java.util.Set;
030: import java.util.StringTokenizer;
031:
032: // coadunation imports
033: import com.rift.coad.lib.configuration.ConfigurationFactory;
034: import com.rift.coad.lib.configuration.Configuration;
035: import com.rift.coad.lib.security.RoleManager;
036: import com.rift.coad.lib.security.Role;
037: import com.rift.coad.lib.security.RoleHandler;
038: import com.rift.coad.lib.security.SecurityException;
039:
040: /**
041: * This class is responsible for implementing the traditional configuration
042: * based role handler.
043: *
044: * @author brett
045: */
046: public class ConfigurationRoleHandler implements RoleHandler {
047:
048: // the classes constant static variables
049: private static final String PRINCIPALS = "principals";
050: private static final String ROLES = "roles";
051:
052: // private member variables
053: private Set principals = new HashSet();
054:
055: /**
056: * Creates a new instance of ConfigurationRoleHandler
057: */
058: public ConfigurationRoleHandler() {
059: }
060:
061: /**
062: * This method returns the roles managed by this class.
063: *
064: * @return The map containing the roles
065: *
066: * @exception SecurityException
067: */
068: public Map getRoles() throws SecurityException {
069: try {
070: Map roles = new HashMap();
071: Configuration config = ConfigurationFactory.getInstance()
072: .getConfig(RoleManager.class);
073: StringTokenizer principalList = new StringTokenizer(config
074: .getString(PRINCIPALS), ",");
075: while (principalList.hasMoreTokens()) {
076: principals.add(principalList.nextToken().trim());
077: }
078: StringTokenizer roleList = new StringTokenizer(config
079: .getString(ROLES), ",");
080: while (roleList.hasMoreTokens()) {
081: String role = (String) roleList.nextToken().trim();
082: roles.put(role, loadRole(config, role));
083: }
084: return roles;
085: } catch (Exception ex) {
086: throw new SecurityException(
087: "Failed to load the role information : "
088: + ex.getMessage(), ex);
089: }
090: }
091:
092: /**
093: * This method will load the required role into memory.
094: *
095: * @return The role to load into memory.
096: * @param config The configuration class.
097: * @param role The string identifying the role.
098: * @exception SecurityException
099: */
100: private Role loadRole(Configuration config, String role)
101: throws SecurityException {
102: try {
103: StringTokenizer stringTokenizer = new StringTokenizer(
104: config.getString(role), ",");
105: Set roleSet = new HashSet();
106: while (stringTokenizer.hasMoreTokens()) {
107: String principal = (String) stringTokenizer.nextToken();
108: if (principals.contains(principal) == false) {
109: throw new SecurityException("Invalid principal : "
110: + principal);
111: }
112: roleSet.add(principal);
113: }
114: return new Role(role, roleSet);
115: } catch (Exception ex) {
116: throw new SecurityException("The list of roles : "
117: + ex.getMessage(), ex);
118: }
119: }
120: }
|