001 package org.apache.turbine.util.security; 002 003 004 /* 005 * Licensed to the Apache Software Foundation (ASF) under one 006 * or more contributor license agreements. See the NOTICE file 007 * distributed with this work for additional information 008 * regarding copyright ownership. The ASF licenses this file 009 * to you under the Apache License, Version 2.0 (the 010 * "License"); you may not use this file except in compliance 011 * with the License. You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, 016 * software distributed under the License is distributed on an 017 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 018 * KIND, either express or implied. See the License for the 019 * specific language governing permissions and limitations 020 * under the License. 021 */ 022 023 024 import java.util.Collection; 025 import java.util.Iterator; 026 027 import org.apache.commons.lang.StringUtils; 028 import org.apache.turbine.om.security.Permission; 029 030 /** 031 * This class represents a set of Permissions. It makes it easy to 032 * build a UI that would allow someone to add a group of Permissions 033 * to a Role. It enforces that only 034 * Permission objects are allowed in the set and only relevant methods 035 * are available. 036 * 037 * @author <a href="mailto:john.mcnally@clearink.com">John D. McNally</a> 038 * @author <a href="mailto:bmclaugh@algx.net">Brett McLaughlin</a> 039 * @author <a href="mailto:marco@intermeta.de">Marco Knüttel</a> 040 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a> 041 * @version $Id: PermissionSet.java 1073174 2011-02-21 22:18:45Z tv $ 042 */ 043 public class PermissionSet 044 extends SecuritySet<Permission> 045 { 046 /** Serial version */ 047 private static final long serialVersionUID = 7740960537240820226L; 048 049 /** 050 * Constructs an empty PermissionSet 051 */ 052 public PermissionSet() 053 { 054 super(); 055 } 056 057 /** 058 * Constructs a new PermissionSet with specified contents. 059 * 060 * If the given collection contains multiple objects that are 061 * identical WRT equals() method, some objects will be overwritten. 062 * 063 * @param permissions A collection of permissions to be contained in the set. 064 */ 065 public PermissionSet(Collection<Permission> permissions) 066 { 067 super(); 068 add(permissions); 069 } 070 071 /** 072 * Adds a Permission to this PermissionSet. 073 * 074 * @param permission A Permission. 075 * @return True if Permission was added; false if PermissionSet 076 * already contained the Permission. 077 */ 078 public boolean add(Permission permission) 079 { 080 boolean res = contains(permission); 081 nameMap.put(permission.getName(), permission); 082 idMap.put(permission.getIdAsObj(), permission); 083 return res; 084 } 085 086 /** 087 * Adds the Permissions in a Collection to this PermissionSet. 088 * 089 * @param permissions A Collection of Permissions. 090 * @return True if this PermissionSet changed as a result; false 091 * if no change to this PermissionSet occurred (this PermissionSet 092 * already contained all members of the added PermissionSet). 093 */ 094 public boolean add(Collection<Permission> permissions) 095 { 096 boolean res = false; 097 for (Permission p : permissions) 098 { 099 res |= add(p); 100 } 101 return res; 102 } 103 104 /** 105 * Adds the Permissions in another PermissionSet to this 106 * PermissionSet. 107 * 108 * @param permissionSet A PermissionSet. 109 * @return True if this PermissionSet changed as a result; false 110 * if no change to this PermissionSet occurred (this PermissionSet 111 * already contained all members of the added PermissionSet). 112 */ 113 public boolean add(PermissionSet permissionSet) 114 { 115 boolean res = false; 116 for(Permission p : permissionSet) 117 { 118 res |= add(p); 119 } 120 return res; 121 } 122 123 /** 124 * Removes a Permission from this PermissionSet. 125 * 126 * @param permission A Permission. 127 * @return True if this PermissionSet contained the Permission 128 * before it was removed. 129 */ 130 public boolean remove(Permission permission) 131 { 132 boolean res = contains(permission); 133 nameMap.remove(permission.getName()); 134 idMap.remove(permission.getIdAsObj()); 135 return res; 136 } 137 138 /** 139 * Checks whether this PermissionSet contains a Permission. 140 * 141 * @param permission A Permission. 142 * @return True if this PermissionSet contains the Permission, 143 * false otherwise. 144 */ 145 public boolean contains(Permission permission) 146 { 147 return nameMap.containsValue(permission); 148 } 149 150 /** 151 * Returns a Permission with the given name, if it is contained in 152 * this PermissionSet. 153 * 154 * @param permissionName Name of Permission. 155 * @return Permission if argument matched a Permission in this 156 * PermissionSet; null if no match. 157 */ 158 public Permission getPermissionByName(String permissionName) 159 { 160 return (StringUtils.isNotEmpty(permissionName)) 161 ? (Permission) nameMap.get(permissionName) : null; 162 } 163 164 /** 165 * Returns a Permission with the given id, if it is contained in 166 * this PermissionSet. 167 * 168 * @param permissionId Id of the Permission. 169 * @return Permission if argument matched a Permission in this 170 * PermissionSet; null if no match. 171 */ 172 public Permission getPermissionById(int permissionId) 173 { 174 return (permissionId != 0) 175 ? (Permission) idMap.get(new Integer(permissionId)) : null; 176 } 177 178 /** 179 * Returns an Array of Permissions in this PermissionSet. 180 * 181 * @return An Array of Permission Objects. 182 */ 183 public Permission[] getPermissionsArray() 184 { 185 return getSet().toArray(new Permission[0]); 186 } 187 188 /** 189 * Print out a PermissionSet as a String 190 * 191 * @returns The Permission Set as String 192 * 193 */ 194 @Override 195 public String toString() 196 { 197 StringBuffer sb = new StringBuffer(); 198 sb.append("PermissionSet: "); 199 200 for(Iterator<Permission> it = iterator(); it.hasNext();) 201 { 202 Permission p = it.next(); 203 sb.append('['); 204 sb.append(p.getName()); 205 sb.append(" -> "); 206 sb.append(p.getIdAsObj()); 207 sb.append(']'); 208 if (it.hasNext()) 209 { 210 sb.append(", "); 211 } 212 } 213 214 return sb.toString(); 215 } 216 }