1 package org.apache.turbine.util.security;
2
3
4 /*
5 * Licensed to the Apache Software Foundation (ASF) under one
6 * or more contributor license agreements. See the NOTICE file
7 * distributed with this work for additional information
8 * regarding copyright ownership. The ASF licenses this file
9 * to you under the Apache License, Version 2.0 (the
10 * "License"); you may not use this file except in compliance
11 * with the License. You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing,
16 * software distributed under the License is distributed on an
17 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18 * KIND, either express or implied. See the License for the
19 * specific language governing permissions and limitations
20 * under the License.
21 */
22
23
24 import java.util.Collection;
25 import java.util.Iterator;
26
27 import org.apache.commons.lang.StringUtils;
28 import org.apache.turbine.om.security.Permission;
29
30 /**
31 * This class represents a set of Permissions. It makes it easy to
32 * build a UI that would allow someone to add a group of Permissions
33 * to a Role. It enforces that only
34 * Permission objects are allowed in the set and only relevant methods
35 * are available.
36 *
37 * @author <a href="mailto:john.mcnally@clearink.com">John D. McNally</a>
38 * @author <a href="mailto:bmclaugh@algx.net">Brett McLaughlin</a>
39 * @author <a href="mailto:marco@intermeta.de">Marco Knüttel</a>
40 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
41 * @version $Id: PermissionSet.java 1073174 2011-02-21 22:18:45Z tv $
42 */
43 public class PermissionSet
44 extends SecuritySet<Permission>
45 {
46 /** Serial version */
47 private static final long serialVersionUID = 7740960537240820226L;
48
49 /**
50 * Constructs an empty PermissionSet
51 */
52 public PermissionSet()
53 {
54 super();
55 }
56
57 /**
58 * Constructs a new PermissionSet with specified contents.
59 *
60 * If the given collection contains multiple objects that are
61 * identical WRT equals() method, some objects will be overwritten.
62 *
63 * @param permissions A collection of permissions to be contained in the set.
64 */
65 public PermissionSet(Collection<Permission> permissions)
66 {
67 super();
68 add(permissions);
69 }
70
71 /**
72 * Adds a Permission to this PermissionSet.
73 *
74 * @param permission A Permission.
75 * @return True if Permission was added; false if PermissionSet
76 * already contained the Permission.
77 */
78 public boolean add(Permission permission)
79 {
80 boolean res = contains(permission);
81 nameMap.put(permission.getName(), permission);
82 idMap.put(permission.getIdAsObj(), permission);
83 return res;
84 }
85
86 /**
87 * Adds the Permissions in a Collection to this PermissionSet.
88 *
89 * @param permissions A Collection of Permissions.
90 * @return True if this PermissionSet changed as a result; false
91 * if no change to this PermissionSet occurred (this PermissionSet
92 * already contained all members of the added PermissionSet).
93 */
94 public boolean add(Collection<Permission> permissions)
95 {
96 boolean res = false;
97 for (Permission p : permissions)
98 {
99 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 }