Use an exponential backoff strategy for retrying rolled back transactions.
[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 /**\r
33  * Class representing a permission. A permission belongs to a Folder or\r
34  * FileHeader on one side, and a User or GroupDefinition on the other. It is\r
35  * actually a "group of permissions": <code>boolean</code>s represent each\r
36  * individual permission.\r
37  */\r
38 @Entity\r
39 public class Permission implements Serializable {\r
40 \r
41         /**\r
42          * Database id. Not to be set by user.\r
43          */\r
44         @Id\r
45         @GeneratedValue\r
46         private Long id;\r
47 \r
48         /**\r
49          * Database record version. Used by hibernate, not to be used by user.\r
50          */\r
51         @SuppressWarnings("unused")\r
52         @Version\r
53         private int version;\r
54 \r
55         /**\r
56          * The user to whom this permission belongs, if it is a user permission.\r
57          * null otherwise\r
58          */\r
59         @ManyToOne\r
60         private User user;\r
61 \r
62         /**\r
63          * The group to which this permission belongs, if it is a group permission.\r
64          * null otherwise\r
65          */\r
66         @ManyToOne\r
67         private Group group;\r
68 \r
69         /**\r
70          * Read permission.\r
71          */\r
72         private boolean read;\r
73 \r
74         /**\r
75          * Write permission.\r
76          */\r
77         private boolean write;\r
78 \r
79         /**\r
80          * Modify ACL permission.\r
81          */\r
82         private boolean modifyACL;\r
83 \r
84         /**\r
85          * Get the user.\r
86          *\r
87          * @return User The user\r
88          */\r
89         public User getUser() {\r
90                 return user;\r
91         }\r
92 \r
93         /**\r
94          * Set the user.\r
95          *\r
96          * @param _user User The user to set\r
97          */\r
98         public void setUser(final User _user) {\r
99                 user = _user;\r
100         }\r
101 \r
102         /**\r
103          * Get the group.\r
104          *\r
105          * @return Group The group\r
106          */\r
107         public Group getGroup() {\r
108                 return group;\r
109         }\r
110 \r
111         /**\r
112          * Set the group.\r
113          *\r
114          * @param _group Group The group to set\r
115          */\r
116         public void setGroup(final Group _group) {\r
117                 group = _group;\r
118         }\r
119 \r
120         /**\r
121          * Get the Read permission.\r
122          *\r
123          * @return boolean The Read permission\r
124          */\r
125         public boolean getRead() {\r
126                 return read;\r
127         }\r
128 \r
129         /**\r
130          * Get the Read permission.\r
131          *\r
132          * @return boolean The Read permission\r
133          */\r
134         public boolean hasRead() {\r
135                 return read;\r
136         }\r
137 \r
138         /**\r
139          * Set the Read permission.\r
140          *\r
141          * @param _read boolean The Read permission.\r
142          */\r
143         public void setRead(final boolean _read) {\r
144                 read = _read;\r
145         }\r
146 \r
147         /**\r
148          * Get the Write permission.\r
149          *\r
150          * @return boolean The Write permission\r
151          */\r
152         public boolean getWrite() {\r
153                 return write;\r
154         }\r
155 \r
156         /**\r
157          * Get the Write permission.\r
158          *\r
159          * @return boolean The Write permission\r
160          */\r
161         public boolean hasWrite() {\r
162                 return write;\r
163         }\r
164 \r
165         /**\r
166          * Set the Write permission.\r
167          *\r
168          * @param newWrite the new write permission\r
169          */\r
170         public void setWrite(final boolean newWrite) {\r
171                 write = newWrite;\r
172         }\r
173 \r
174         /**\r
175          * Get the modify ACL permission.\r
176          *\r
177          * @return boolean The modify ACL permission\r
178          */\r
179         public boolean getModifyACL() {\r
180                 return modifyACL;\r
181         }\r
182 \r
183         /**\r
184          * Get the modify ACL permission.\r
185          *\r
186          * @return boolean The modify ACL permission\r
187          */\r
188         public boolean hasModifyACL() {\r
189                 return modifyACL;\r
190         }\r
191 \r
192         /**\r
193          * Set the modify ACL permission.\r
194          *\r
195          * @param newModifyACL the new modify ACL permission\r
196          */\r
197         public void setModifyACL(final boolean newModifyACL) {\r
198                 modifyACL = newModifyACL;\r
199         }\r
200 \r
201         // ********************** Business Methods ********************** //\r
202 \r
203         /**\r
204          * Merge an initial Permission object with a collection of individual\r
205          * permissions and produce an aggregate Permission object. Aggregate object\r
206          * has a permission if at least one of the individual objects has said\r
207          * permission.\r
208          *\r
209          * @param initialPermission Permission The initial Permission object\r
210          * @param permissions Collection Permissions with which to merge\r
211          * @return Permission Aggregate permission object\r
212          */\r
213         private Permission mergePermissions(final Permission initialPermission, final Collection<Permission> permissions) {\r
214                 if (permissions != null)\r
215                         for (final Permission perm : permissions) {\r
216                                 initialPermission.setRead(initialPermission.hasRead() || perm.hasRead());\r
217                                 initialPermission.setWrite(initialPermission.hasWrite() || perm.hasWrite());\r
218                                 initialPermission.setModifyACL(initialPermission.hasModifyACL() || perm.hasModifyACL());\r
219                         }\r
220                 return initialPermission;\r
221         }\r
222 \r
223         /**\r
224          * Merge with a collection of individual permissions and produce an\r
225          * aggregate Permission object. Aggregate object has a permission if at\r
226          * least one of the individual objects has said permission.\r
227          *\r
228          * @param permissions Collection Permissions with which to merge\r
229          * @return Permission Aggregate permission object\r
230          */\r
231         public Permission mergePermissions(final Collection<Permission> permissions) {\r
232                 return mergePermissions(this, permissions);\r
233         }\r
234 \r
235         /**\r
236          * Return a new Data Transfer Object for this object.\r
237          *\r
238          * @return a new DTO with the same contents as this object\r
239          */\r
240         public PermissionDTO getDTO() {\r
241                 final PermissionDTO p = new PermissionDTO();\r
242                 p.setId(id);\r
243                 if(group != null)\r
244                         p.setGroup(group.getDTO());\r
245                 if(user != null)\r
246                         p.setUser(user.getDTO());\r
247                 p.setRead(read);\r
248                 p.setWrite(write);\r
249                 p.setModifyACL(modifyACL);\r
250                 return p;\r
251         }\r
252 \r
253 }\r