Use exponential backoff when updating the password or last login time in WebDAV.
[pithos] / src / gr / ebs / gss / server / domain / Permission.java
1 /*\r
2  * Copyright 2007, 2008, 2009 Electronic Business Systems Ltd.\r
3  *\r
4  * This file is part of GSS.\r
5  *\r
6  * GSS is free software: you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation, either version 3 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * GSS is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with GSS.  If not, see <http://www.gnu.org/licenses/>.\r
18  */\r
19 package gr.ebs.gss.server.domain;\r
20 \r
21 import gr.ebs.gss.server.domain.dto.PermissionDTO;\r
22 \r
23 import java.io.Serializable;\r
24 import java.util.Collection;\r
25 \r
26 import javax.persistence.Entity;\r
27 import javax.persistence.GeneratedValue;\r
28 import javax.persistence.Id;\r
29 import javax.persistence.ManyToOne;\r
30 import javax.persistence.Version;\r
31 \r
32 import org.hibernate.annotations.Cache;\r
33 import org.hibernate.annotations.CacheConcurrencyStrategy;\r
34 \r
35 /**\r
36  * Class representing a permission. A permission belongs to a Folder or\r
37  * FileHeader on one side, and a User or GroupDefinition on the other. It is\r
38  * actually a "group of permissions": <code>boolean</code>s represent each\r
39  * individual permission.\r
40  */\r
41 @Entity\r
42 @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)\r
43 public class Permission implements Serializable {\r
44 \r
45         /**\r
46          * Database id. Not to be set by user.\r
47          */\r
48         @Id\r
49         @GeneratedValue\r
50         private Long id;\r
51 \r
52         /**\r
53          * Database record version. Used by hibernate, not to be used by user.\r
54          */\r
55         @SuppressWarnings("unused")\r
56         @Version\r
57         private int version;\r
58 \r
59         /**\r
60          * The user to whom this permission belongs, if it is a user permission.\r
61          * null otherwise\r
62          */\r
63         @ManyToOne\r
64         private User user;\r
65 \r
66         /**\r
67          * The group to which this permission belongs, if it is a group permission.\r
68          * null otherwise\r
69          */\r
70         @ManyToOne\r
71         private Group group;\r
72 \r
73         /**\r
74          * Read permission.\r
75          */\r
76         private boolean read;\r
77 \r
78         /**\r
79          * Write permission.\r
80          */\r
81         private boolean write;\r
82 \r
83         /**\r
84          * Modify ACL permission.\r
85          */\r
86         private boolean modifyACL;\r
87 \r
88         /**\r
89          * Get the user.\r
90          *\r
91          * @return User The user\r
92          */\r
93         public User getUser() {\r
94                 return user;\r
95         }\r
96 \r
97         /**\r
98          * Set the user.\r
99          *\r
100          * @param _user User The user to set\r
101          */\r
102         public void setUser(final User _user) {\r
103                 user = _user;\r
104         }\r
105 \r
106         /**\r
107          * Get the group.\r
108          *\r
109          * @return Group The group\r
110          */\r
111         public Group getGroup() {\r
112                 return group;\r
113         }\r
114 \r
115         /**\r
116          * Set the group.\r
117          *\r
118          * @param _group Group The group to set\r
119          */\r
120         public void setGroup(final Group _group) {\r
121                 group = _group;\r
122         }\r
123 \r
124         /**\r
125          * Get the Read permission.\r
126          *\r
127          * @return boolean The Read permission\r
128          */\r
129         public boolean getRead() {\r
130                 return read;\r
131         }\r
132 \r
133         /**\r
134          * Get the Read permission.\r
135          *\r
136          * @return boolean The Read permission\r
137          */\r
138         public boolean hasRead() {\r
139                 return read;\r
140         }\r
141 \r
142         /**\r
143          * Set the Read permission.\r
144          *\r
145          * @param _read boolean The Read permission.\r
146          */\r
147         public void setRead(final boolean _read) {\r
148                 read = _read;\r
149         }\r
150 \r
151         /**\r
152          * Get the Write permission.\r
153          *\r
154          * @return boolean The Write permission\r
155          */\r
156         public boolean getWrite() {\r
157                 return write;\r
158         }\r
159 \r
160         /**\r
161          * Get the Write permission.\r
162          *\r
163          * @return boolean The Write permission\r
164          */\r
165         public boolean hasWrite() {\r
166                 return write;\r
167         }\r
168 \r
169         /**\r
170          * Set the Write permission.\r
171          *\r
172          * @param newWrite the new write permission\r
173          */\r
174         public void setWrite(final boolean newWrite) {\r
175                 write = newWrite;\r
176         }\r
177 \r
178         /**\r
179          * Get the modify ACL permission.\r
180          *\r
181          * @return boolean The modify ACL permission\r
182          */\r
183         public boolean getModifyACL() {\r
184                 return modifyACL;\r
185         }\r
186 \r
187         /**\r
188          * Get the modify ACL permission.\r
189          *\r
190          * @return boolean The modify ACL permission\r
191          */\r
192         public boolean hasModifyACL() {\r
193                 return modifyACL;\r
194         }\r
195 \r
196         /**\r
197          * Set the modify ACL permission.\r
198          *\r
199          * @param newModifyACL the new modify ACL permission\r
200          */\r
201         public void setModifyACL(final boolean newModifyACL) {\r
202                 modifyACL = newModifyACL;\r
203         }\r
204 \r
205         // ********************** Business Methods ********************** //\r
206 \r
207         /**\r
208          * Merge an initial Permission object with a collection of individual\r
209          * permissions and produce an aggregate Permission object. Aggregate object\r
210          * has a permission if at least one of the individual objects has said\r
211          * permission.\r
212          *\r
213          * @param initialPermission Permission The initial Permission object\r
214          * @param permissions Collection Permissions with which to merge\r
215          * @return Permission Aggregate permission object\r
216          */\r
217         private Permission mergePermissions(final Permission initialPermission, final Collection<Permission> permissions) {\r
218                 if (permissions != null)\r
219                         for (final Permission perm : permissions) {\r
220                                 initialPermission.setRead(initialPermission.hasRead() || perm.hasRead());\r
221                                 initialPermission.setWrite(initialPermission.hasWrite() || perm.hasWrite());\r
222                                 initialPermission.setModifyACL(initialPermission.hasModifyACL() || perm.hasModifyACL());\r
223                         }\r
224                 return initialPermission;\r
225         }\r
226 \r
227         /**\r
228          * Merge with a collection of individual permissions and produce an\r
229          * aggregate Permission object. Aggregate object has a permission if at\r
230          * least one of the individual objects has said permission.\r
231          *\r
232          * @param permissions Collection Permissions with which to merge\r
233          * @return Permission Aggregate permission object\r
234          */\r
235         public Permission mergePermissions(final Collection<Permission> permissions) {\r
236                 return mergePermissions(this, permissions);\r
237         }\r
238 \r
239         /**\r
240          * Return a new Data Transfer Object for this object.\r
241          *\r
242          * @return a new DTO with the same contents as this object\r
243          */\r
244         public PermissionDTO getDTO() {\r
245                 final PermissionDTO p = new PermissionDTO();\r
246                 p.setId(id);\r
247                 if(group != null)\r
248                         p.setGroup(group.getDTO());\r
249                 if(user != null)\r
250                         p.setUser(user.getDTO());\r
251                 p.setRead(read);\r
252                 p.setWrite(write);\r
253                 p.setModifyACL(modifyACL);\r
254                 return p;\r
255         }\r
256 \r
257 }\r