View Javadoc
1   package org.apache.fulcrum.security.torque.turbine;
2   /*
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   */
20  import java.sql.Connection;
21  import java.util.HashSet;
22  import java.util.List;
23  import java.util.Set;
24  
25  import org.apache.fulcrum.security.entity.Permission;
26  import org.apache.fulcrum.security.model.turbine.entity.TurbineRole;
27  import org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRole;
28  import org.apache.fulcrum.security.torque.om.TurbineRolePeer;
29  import org.apache.fulcrum.security.torque.om.TurbineRolePermission;
30  import org.apache.fulcrum.security.torque.om.TurbineRolePermissionPeer;
31  import org.apache.fulcrum.security.torque.om.TurbineUserGroupRolePeer;
32  import org.apache.fulcrum.security.torque.peer.TurbineRolePermissionPeerMapper;
33  import org.apache.fulcrum.security.torque.peer.TurbineUserGroupRoleModelPeerMapper;
34  import org.apache.fulcrum.security.torque.security.turbine.TorqueAbstractTurbineTurbineSecurityEntity;
35  import org.apache.fulcrum.security.util.DataBackendException;
36  import org.apache.fulcrum.security.util.PermissionSet;
37  import org.apache.torque.TorqueException;
38  import org.apache.torque.criteria.Criteria;
39  import org.apache.torque.om.SimpleKey;
40  import org.apache.torque.util.Transaction;
41  /**
42   * This abstract class provides the SecurityInterface to the managers.
43   *
44   * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
45   * @version $Id:$
46   */
47  public abstract class DefaultAbstractTurbineRole extends TorqueAbstractTurbineTurbineSecurityEntity
48      implements TurbineRole
49  {
50      /** Serial version */
51  	private static final long serialVersionUID = -1782236723198646728L;
52  
53  	/** a cache of permission objects */
54      private Set<Permission> permissionSet = null;
55  
56      /**
57       * Forward reference to generated code
58       *
59       * Get a list of association objects, pre-populated with their TurbinePermission
60       * objects.
61       *
62       * @param criteria Criteria to define the selection of records
63       * @param con a database connection
64       * @throws TorqueException  if any database error occurs
65       *
66       * @return a list of Role/Permission relations
67       */
68      protected <T extends TurbineRolePermissionPeerMapper> List<T> getTurbineRolePermissionsJoinTurbinePermission(Criteria criteria, Connection con)
69          throws TorqueException
70      {
71          criteria.and(TurbineRolePermissionPeer.ROLE_ID, getEntityId() );
72          return (List<T>) TurbineRolePermissionPeer.doSelectJoinTurbinePermission(criteria, con);
73      }
74  
75      /**
76       * Forward reference to generated code
77       *
78       * Get a list of association objects, pre-populated with their TurbineGroup
79       * objects.
80       *
81       * @param criteria Criteria to define the selection of records
82       * @param con a database connection
83       * @throws TorqueException  if any database error occurs
84       *
85       * @return a list of User/Group/Role relations
86       */
87      protected <T extends TurbineUserGroupRoleModelPeerMapper> List<T> getTurbineUserGroupRolesJoinTurbineGroup(Criteria criteria, Connection con)
88              throws TorqueException, DataBackendException
89      {
90          criteria.and(TurbineUserGroupRolePeer.ROLE_ID, getEntityId() );
91          return (List<T>) TurbineUserGroupRolePeer.doSelectJoinTurbineGroup(criteria, con);
92      }
93  
94      /**
95       * @see org.apache.fulcrum.security.model.turbine.entity.TurbineRole#addPermission(org.apache.fulcrum.security.entity.Permission)
96       */
97      @Override
98  	public void addPermission(Permission permission)
99      {
100         getPermissions().add(permission);
101     }
102 
103     /**
104      * @see org.apache.fulcrum.security.model.turbine.entity.TurbineRole#getPermissions()
105      */
106     @Override
107 	public PermissionSet getPermissions()
108     {
109         if (permissionSet == null)
110         {
111             permissionSet = new PermissionSet();
112         }
113         else if(!(permissionSet instanceof PermissionSet))
114         {
115             permissionSet = new PermissionSet(permissionSet);
116         }
117 
118         return (PermissionSet)permissionSet;
119     }
120 
121     /**
122      * @see org.apache.fulcrum.security.model.turbine.entity.TurbineRole#getPermissionsAsSet()
123      */
124     @Override
125 	@SuppressWarnings("unchecked")
126 	public <T extends Permission> Set<T> getPermissionsAsSet()
127     {
128         return (Set<T>)permissionSet;
129     }
130 
131     /**
132      * @see org.apache.fulcrum.security.model.turbine.entity.TurbineRole#removePermission(org.apache.fulcrum.security.entity.Permission)
133      */
134     @Override
135 	public void removePermission(Permission permission)
136     {
137         getPermissions().remove(permission);
138     }
139 
140     /**
141      * @see org.apache.fulcrum.security.model.turbine.entity.TurbineRole#setPermissions(org.apache.fulcrum.security.util.PermissionSet)
142      */
143     @Override
144 	public void setPermissions(PermissionSet permissionSet)
145     {
146         if (permissionSet != null)
147         {
148             this.permissionSet = permissionSet;
149         }
150         else
151         {
152             this.permissionSet = new PermissionSet();
153         }
154     }
155 
156     /**
157      * @see org.apache.fulcrum.security.model.turbine.entity.TurbineRole#setPermissionsAsSet(java.util.Set)
158      */
159     @Override
160 	public <T extends Permission> void setPermissionsAsSet(Set<T> permissions)
161     {
162         setPermissions(new PermissionSet(permissions));
163     }
164     
165     @Override
166     public void retrieveAttachedObjects( Connection con )
167         throws DataBackendException
168     {
169         retrieveAttachedObjects( con, false );
170     }
171 
172     
173     /* (non-Javadoc)
174      * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection, java.lang.Boolean)
175      */
176     @Override
177     public void retrieveAttachedObjects( Connection con, Boolean lazy )
178         throws DataBackendException
179     {
180         this.permissionSet = new PermissionSet();
181 
182         try {
183             List<TurbineRolePermissionPeerMapper> rolepermissions = getTurbineRolePermissionsJoinTurbinePermission(new Criteria(), con);
184     
185             for (TurbineRolePermissionPeerMapper ttrp : rolepermissions)
186             {
187                 permissionSet.add(ttrp.getTurbinePermission());
188             }
189     
190             if (!lazy) {
191                 Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
192         
193                 List<TurbineUserGroupRoleModelPeerMapper> ugrs = getTurbineUserGroupRolesJoinTurbineGroup(new Criteria(), con);
194         
195                 for (TurbineUserGroupRoleModelPeerMapper ttugr : ugrs)
196                 {
197                     TurbineUserGroupRolee/om/TurbineUserGroupRole.html#TurbineUserGroupRole">TurbineUserGroupRole ugr = new TurbineUserGroupRole();
198                     ugr.setRole(this);
199                     ugr.setGroup(ttugr.getTurbineGroup());
200                     ugr.setUser(ttugr.getTurbineUser(con));
201                     userGroupRoleSet.add(ugr);
202                 }
203         
204                 setUserGroupRoleSet(userGroupRoleSet);
205             
206             }
207         } catch (TorqueException e ) {
208             throw new DataBackendException( e.getMessage(),e );
209         }
210     }
211     
212     /* (non-Javadoc)
213      * @see org.apache.fulcrum.security.torque.security.turbine.TorqueAbstractTurbineTurbineSecurityEntity#getUserGroupRoleSet()
214      */
215     @Override
216     public <T extends TurbineUserGroupRole> Set<T> getUserGroupRoleSet() throws DataBackendException
217     {
218         if (super.getUserGroupRoleSet() == null || super.getUserGroupRoleSet().isEmpty()) {
219             Connection con = null;
220             try
221             {
222                 con = Transaction.begin();
223                
224                 retrieveAttachedObjects( con, false ); // not configurable, we set it
225     
226                 Transaction.commit(con);
227                 con = null;
228             }
229             catch (TorqueException e)
230             {
231                 throw new DataBackendException("Error retrieving group information", e);
232             }
233             finally
234             {
235                 if (con != null)
236                 {
237                     Transaction.safeRollback(con);
238                 }
239             }
240         }
241         
242         return super.getUserGroupRoleSet();
243     }
244     
245     
246     /* (non-Javadoc)
247      * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#update(java.sql.Connection)
248      */
249     @Override
250 	public void update(Connection con) throws TorqueException
251     {
252         if (permissionSet != null && !permissionSet.isEmpty())
253         {
254             Criteria criteria = new Criteria();
255 
256             /* remove old entries */
257             criteria.where(TurbineRolePermissionPeer.ROLE_ID, getEntityId());
258             TurbineRolePermissionPeer.doDelete(criteria, con);
259 
260             for (Permission p : permissionSet)
261             {
262                 TurbineRolePermissione/om/TurbineRolePermission.html#TurbineRolePermission">TurbineRolePermission rp = new TurbineRolePermission();
263                 rp.setPermissionId((Integer)p.getId());
264                 rp.setRoleId(getEntityId());
265                 rp.save(con);
266             }
267         }
268 
269         // role permission change does not require reassignment of user-group-roles? commented for now   
270 //        try
271 //        {
272 //            Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
273 //            if (userGroupRoleSet != null && !userGroupRoleSet.isEmpty())
274 //            {
275 //                Criteria criteria = new Criteria();
276 //
277 //                criteria.where(TurbineUserGroupRolePeer.ROLE_ID, getEntityId());
278 //                TurbineUserGroupRolePeer.doDelete(criteria, con);
279 //
280 //                for (TurbineUserGroupRole ugr : userGroupRoleSet)
281 //                {
282 //                    org.apache.fulcrum.security.torque.om.TurbineUserGroupRole ttugr = new org.apache.fulcrum.security.torque.om.TurbineUserGroupRole();
283 //                    ttugr.setGroupId((Integer)ugr.getGroup().getId());
284 //                    ttugr.setUserId((Integer)ugr.getUser().getId());
285 //                    ttugr.setRoleId((Integer)ugr.getRole().getId());
286 //                    ttugr.save(con);
287 //                }
288 //            }
289 //            save(con);
290 //        }
291 //        catch (Exception e)
292 //        {
293 //            throw new TorqueException(e);
294 //        }
295     }
296 
297     /**
298      * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#delete()
299      */
300     @Override
301 	public void delete() throws TorqueException
302     {
303         TurbineRolePeer.doDelete(SimpleKey.keyFor(getEntityId()));
304     }
305 }