| /******************************************************************************* |
| * Copyright (c) 2001, 2005 IBM Corporation. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.equinox.useradmin; |
| |
| import java.util.*; |
| |
| /** |
| * The base interface for Role objects managed by the {@link UserAdmin} |
| * service. |
| * <p> |
| * This interface exposes the characteristics shared by all Roles: a name, |
| * a type, and a set of properties. |
| * <p> |
| * Properties represent public information about the Role that can be read by |
| * anyone. Specific {@link UserAdminPermission}s are required to |
| * change a Role's properties. |
| * <p> |
| * Role properties are Dictionary objects. Changes to |
| * these objects are propagated to the {@link UserAdmin} service and |
| * made persistent. |
| * <p> |
| * Every UserAdmin contains a set of predefined roles that are always present |
| * and cannot be removed. All predefined roles are of type <tt>ROLE</tt>. |
| * This version of the <tt>org.osgi.service.useradmin</tt> package defines a |
| * single predefined role named "user.anyone", which is inherited |
| * by any other role. Other predefined roles may be added in the future. |
| */ |
| |
| public class Role implements org.osgi.service.useradmin.Role { |
| |
| protected String name; |
| protected UserAdminHashtable properties; |
| protected Vector impliedRoles; |
| protected UserAdmin useradmin; |
| protected static final String anyoneString = "user.anyone"; //$NON-NLS-1$ |
| protected boolean exists = true; |
| |
| protected Role(String name, UserAdmin useradmin) { |
| this.name = name; |
| this.properties = new UserAdminHashtable(this, useradmin, UserAdminHashtable.PROPERTIES); |
| this.useradmin = useradmin; |
| |
| // This is used only to track which Groups this role is directly a member of. |
| // This info is needed so when we delete a Role, we know which groups to remove |
| // it from. |
| impliedRoles = new Vector(); |
| } |
| |
| /** |
| * Returns the name of this role. |
| * |
| * @return The role's name. |
| */ |
| |
| public String getName() { |
| useradmin.checkAlive(); |
| return (name); |
| } |
| |
| /** |
| * Returns the type of this role. |
| * |
| * @return The role's type. |
| */ |
| public int getType() { |
| useradmin.checkAlive(); |
| return (org.osgi.service.useradmin.Role.ROLE); |
| } |
| |
| /** |
| * Returns a Dictionary of the (public) properties of this Role. Any changes |
| * to the returned Dictionary will change the properties of this Role. This |
| * will cause a UserAdminEvent of type {@link UserAdminEvent#ROLE_CHANGED} |
| * to be broadcast to any UserAdminListeners. |
| * <p> |
| * Only objects of type <tt>String</tt> may be used as property keys, and |
| * only objects of type <tt>String</tt> or <tt>byte[]</tt> |
| * may be used as property values. |
| * Any other types will cause an exception of type |
| * <tt>IllegalArgumentException</tt> to be raised. |
| * <p> |
| * In order to add, change, or remove a property in the returned Dictionary, |
| * a {@link UserAdminPermission} named after the property name (or |
| * a prefix of it) with action <code>changeProperty</code> is required. |
| * |
| * @return Dictionary containing the properties of this Role. |
| */ |
| public Dictionary getProperties() { |
| useradmin.checkAlive(); |
| return (properties); |
| } |
| |
| protected void addImpliedRole(Group group) { |
| impliedRoles.addElement(group); |
| } |
| |
| protected void removeImpliedRole(Group group) { |
| if (exists) //this prevents a loop when destroy is called |
| { |
| impliedRoles.removeElement(group); |
| } |
| } |
| |
| //we are being deleted so delete ourselves from all of the groups |
| protected synchronized void destroy() { |
| exists = false; |
| Enumeration e = impliedRoles.elements(); |
| while (e.hasMoreElements()) { |
| Group group = (Group) e.nextElement(); |
| if (group.exists) //so we don't try to remove any groups twice from storage |
| { |
| group.removeMember(this); |
| } |
| } |
| properties = null; |
| impliedRoles = null; |
| } |
| |
| protected boolean isImpliedBy(Role role, Vector checkLoop) { //Roles do not imply themselves |
| //The user.anyone role is always implied |
| if (checkLoop.contains(name)) { |
| //we have a circular dependency |
| return (false); |
| } |
| checkLoop.addElement(name); |
| return (name.equals(Role.anyoneString)); |
| } |
| |
| } |