001: /*
002: * JOSSO: Java Open Single Sign-On
003: *
004: * Copyright 2004-2008, Atricore, Inc.
005: *
006: * This is free software; you can redistribute it and/or modify it
007: * under the terms of the GNU Lesser General Public License as
008: * published by the Free Software Foundation; either version 2.1 of
009: * the License, or (at your option) any later version.
010: *
011: * This software is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this software; if not, write to the Free
018: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
019: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
020: */
021: package org.josso.gateway.identity.service;
022:
023: import org.apache.commons.logging.Log;
024: import org.apache.commons.logging.LogFactory;
025:
026: import java.security.Principal;
027: import java.util.*;
028:
029: /**
030: * An implementation of BaseRole that manages a collection of Principal
031: * objects based on their hashCode() and equals() methods.
032: * This class is not thread safe.
033: * @author <a href="mailto:sgonzalez@josso.org">Sebastian Gonzalez Oyuela</a>
034: * @version $Id: BaseRoleImpl.java 508 2008-02-18 13:32:29Z sgonzalez $
035: */
036:
037: public class BaseRoleImpl implements BaseRole {
038:
039: private static final Log logger = LogFactory
040: .getLog(BaseRoleImpl.class);
041:
042: private String _name;
043: private HashMap members;
044:
045: public BaseRoleImpl(String name) {
046: this ();
047: _name = name;
048: }
049:
050: public BaseRoleImpl() {
051: members = new HashMap(3);
052: }
053:
054: /**
055: * Adds the specified member to the group.
056: *
057: * @param user the principal to add to this group.
058: * @return true if the member was successfully added,
059: * false if the principal was already a member.
060: */
061: public boolean addMember(Principal user) {
062: boolean isMember = members.containsKey(user);
063: if (isMember == false)
064: members.put(user, user);
065: return isMember == false;
066: }
067:
068: /**
069: * Returns true if the passed principal is a member of the group.
070: * This method does a recursive search, so if a principal belongs to a
071: * group which is a member of this group, true is returned.
072: * <p/>
073: * A special check is made to see if the member is an instance of
074: * org.jboss.security.AnybodyPrincipal or org.jboss.security.NobodyPrincipal
075: * since these classes do not hash to meaningful values.
076: *
077: * @param member the principal whose membership is to be checked.
078: * @return true if the principal is a member of this group,
079: * false otherwise.
080: */
081: public boolean isMember(Principal member) {
082: // logger.debug("Begin, isMember");
083:
084: // First see if there is a key with the member name
085: boolean isMember = members.containsKey(member);
086: if (isMember == false) { // Check any Groups for membership
087: Collection values = members.values();
088: Iterator iter = values.iterator();
089: while (isMember == false && iter.hasNext()) {
090: Object next = iter.next();
091: if (next instanceof BaseRole) {
092: BaseRole role = (BaseRole) next;
093: isMember = role.isMember(member);
094: }
095: }
096: }
097:
098: // logger.debug("End, isMember, return=" + isMember);
099: return isMember;
100: }
101:
102: /**
103: * Returns an enumeration of the members in the group.
104: * The returned objects can be instances of either Principal
105: * or Group (which is a subinterface of Principal).
106: *
107: * @return an enumeration of the group members.
108: */
109: public Enumeration members() {
110: return Collections.enumeration(members.values());
111: }
112:
113: /**
114: * Removes the specified member from the group.
115: *
116: * @param user the principal to remove from this group.
117: * @return true if the principal was removed, or
118: * false if the principal was not a member.
119: */
120: public boolean removeMember(Principal user) {
121: Object prev = members.remove(user);
122: return prev != null;
123: }
124:
125: public String getName() {
126: return _name;
127: }
128:
129: public void setName(String name) {
130: _name = name;
131: }
132:
133: public String toString() {
134: StringBuffer tmp = new StringBuffer(getName());
135: tmp.append("(members:");
136: Iterator iter = members.keySet().iterator();
137: while (iter.hasNext()) {
138: tmp.append(iter.next());
139: tmp.append(',');
140: }
141: tmp.setCharAt(tmp.length() - 1, ')');
142: return tmp.toString();
143: }
144:
145: /**
146: * Compare this BaseRole's name against another BaseRole
147: *
148: * @return true if name equals another.getName();
149: */
150: public boolean equals(Object another) {
151: if (!(another instanceof BaseRole))
152: return false;
153: String anotherName = ((BaseRole) another).getName();
154: boolean equals = false;
155: if (_name == null)
156: equals = anotherName == null;
157: else
158: equals = _name.equals(anotherName);
159: return equals;
160: }
161:
162: public int hashCode() {
163: return (_name == null ? 0 : _name.hashCode());
164: }
165:
166: }
|