001package org.apache.fulcrum.security.torque.dynamic;
002/*
003 * Licensed to the Apache Software Foundation (ASF) under one
004 * or more contributor license agreements.  See the NOTICE file
005 * distributed with this work for additional information
006 * regarding copyright ownership.  The ASF licenses this file
007 * to you under the Apache License, Version 2.0 (the
008 * "License"); you may not use this file except in compliance
009 * with the License.  You may obtain a copy of the License at
010 *
011 *   http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing,
014 * software distributed under the License is distributed on an
015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016 * KIND, either express or implied.  See the License for the
017 * specific language governing permissions and limitations
018 * under the License.
019 */
020import java.sql.Connection;
021import java.util.List;
022import java.util.Set;
023
024import org.apache.fulcrum.security.entity.Group;
025import org.apache.fulcrum.security.entity.Permission;
026import org.apache.fulcrum.security.model.dynamic.entity.DynamicRole;
027import org.apache.fulcrum.security.torque.om.TorqueDynamicGroupRole;
028import org.apache.fulcrum.security.torque.om.TorqueDynamicGroupRolePeer;
029import org.apache.fulcrum.security.torque.om.TorqueDynamicPermissionPeer;
030import org.apache.fulcrum.security.torque.om.TorqueDynamicRolePeer;
031import org.apache.fulcrum.security.torque.om.TorqueDynamicRolePermission;
032import org.apache.fulcrum.security.torque.om.TorqueDynamicRolePermissionPeer;
033import org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity;
034import org.apache.fulcrum.security.util.DataBackendException;
035import org.apache.fulcrum.security.util.GroupSet;
036import org.apache.fulcrum.security.util.PermissionSet;
037import org.apache.torque.TorqueException;
038import org.apache.torque.criteria.Criteria;
039import org.apache.torque.om.SimpleKey;
040/**
041 * This abstract class provides the SecurityInterface to the managers.
042 *
043 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
044 * @version $Id:$
045 */
046public abstract class TorqueAbstractDynamicRole extends TorqueAbstractSecurityEntity
047    implements DynamicRole
048{
049    /** Serial version */
050        private static final long serialVersionUID = 2163956770966574224L;
051
052        /** a cache of group objects */
053    private Set<Group> groupSet = null;
054
055    /** a cache of permission objects */
056    private Set<Permission> permissionSet = null;
057
058    /**
059     * Forward reference to generated code
060     *
061     * Get a list of association objects, pre-populated with their TorqueDynamicPermission
062     * objects.
063     *
064     * @param criteria Criteria to define the selection of records
065     * @param con a database connection
066     * @throws TorqueException  if any database error occurs
067     *
068     * @return a list of Role/Permission relations
069     */
070    protected List<TorqueDynamicRolePermission> getTorqueDynamicRolePermissionsJoinTorqueDynamicPermission(Criteria criteria, Connection con)
071        throws TorqueException
072    {
073        criteria.and(TorqueDynamicRolePermissionPeer.ROLE_ID, getEntityId() );
074        return TorqueDynamicRolePermissionPeer.doSelectJoinTorqueDynamicPermission(criteria, con);
075    }
076
077    /**
078     * Forward reference to generated code
079     *
080     * Get a list of association objects, pre-populated with their TorqueDynamicGroup
081     * objects.
082     *
083     * @param criteria Criteria to define the selection of records
084     * @param con a database connection
085     * @throws TorqueException  if any database error occurs
086     *
087     * @return a list of Group/Role relations
088     */
089    protected List<TorqueDynamicGroupRole> getTorqueDynamicGroupRolesJoinTorqueDynamicGroup(Criteria criteria, Connection con)
090        throws TorqueException
091    {
092        criteria.and(TorqueDynamicGroupRolePeer.ROLE_ID, getEntityId() );
093        return TorqueDynamicGroupRolePeer.doSelectJoinTorqueDynamicGroup(criteria, con);
094    }
095
096    /**
097     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#addGroup(org.apache.fulcrum.security.entity.Group)
098     */
099    public void addGroup(Group group)
100    {
101        getGroups().add(group);
102    }
103
104    /**
105     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#addPermission(org.apache.fulcrum.security.entity.Permission)
106     */
107    public void addPermission(Permission permission)
108    {
109        getPermissions().add(permission);
110    }
111
112    /**
113     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#getGroups()
114     */
115    public GroupSet getGroups()
116    {
117        if (groupSet == null)
118        {
119            groupSet = new GroupSet();
120        }
121        else if(!(groupSet instanceof GroupSet))
122        {
123            groupSet = new GroupSet(groupSet);
124        }
125
126        return (GroupSet)groupSet;
127    }
128
129    /**
130     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#getGroupsAsSet()
131     */
132    @SuppressWarnings("unchecked")
133        public <T extends Group> Set<T> getGroupsAsSet()
134    {
135        return (Set<T>)groupSet;
136    }
137
138    /**
139     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#getPermissions()
140     */
141    public PermissionSet getPermissions()
142    {
143        if (permissionSet == null)
144        {
145            permissionSet = new PermissionSet();
146        }
147        else if(!(permissionSet instanceof PermissionSet))
148        {
149            permissionSet = new PermissionSet(permissionSet);
150        }
151
152        return (PermissionSet)permissionSet;
153    }
154
155    /**
156     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#getPermissionsAsSet()
157     */
158    @SuppressWarnings("unchecked")
159        public <T extends Permission> Set<T> getPermissionsAsSet()
160    {
161        return (Set<T>)permissionSet;
162    }
163
164    /**
165     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#removeGroup(org.apache.fulcrum.security.entity.Group)
166     */
167    public void removeGroup(Group group)
168    {
169        getGroups().remove(group);
170    }
171
172    /**
173     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#removePermission(org.apache.fulcrum.security.entity.Permission)
174     */
175    public void removePermission(Permission permission)
176    {
177        getPermissions().remove(permission);
178    }
179
180    /**
181     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#setGroups(org.apache.fulcrum.security.util.GroupSet)
182     */
183    public void setGroups(GroupSet groups)
184    {
185        if (groups != null)
186        {
187            this.groupSet = groups;
188        }
189        else
190        {
191            this.groupSet = new GroupSet();
192        }
193    }
194
195    /**
196     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#setGroupsAsSet(java.util.Set)
197     */
198    public <T extends Group> void setGroupsAsSet(Set<T> groups)
199    {
200        setGroups(new GroupSet(groups));
201    }
202
203    /**
204     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#setPermissions(org.apache.fulcrum.security.util.PermissionSet)
205     */
206    public void setPermissions(PermissionSet permissionSet)
207    {
208        if (permissionSet != null)
209        {
210            this.permissionSet = permissionSet;
211        }
212        else
213        {
214            this.permissionSet = new PermissionSet();
215        }
216    }
217
218    /**
219     * @see org.apache.fulcrum.security.model.dynamic.entity.DynamicRole#setPermissionsAsSet(java.util.Set)
220     */
221    public <T extends Permission> void setPermissionsAsSet(Set<T> permissions)
222    {
223        setPermissions(new PermissionSet(permissions));
224    }
225
226    /**
227     * @return the database name
228     */
229    public String getDatabaseName()
230    {
231        return TorqueDynamicPermissionPeer.DATABASE_NAME;
232    }
233    
234    @Override
235    public void retrieveAttachedObjects( Connection con )
236        throws DataBackendException
237    {
238        retrieveAttachedObjects( con, false );
239    }
240
241    /**
242     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(Connection, Boolean)
243     */
244    @Override
245    public void retrieveAttachedObjects( Connection con, Boolean lazy )
246        throws DataBackendException
247    {
248        this.permissionSet = new PermissionSet();
249        
250        try {
251            List<TorqueDynamicRolePermission> rolepermissions = getTorqueDynamicRolePermissionsJoinTorqueDynamicPermission(new Criteria(), con);
252    
253            for (TorqueDynamicRolePermission tdrp : rolepermissions)
254            {
255                permissionSet.add(tdrp.getTorqueDynamicPermission());
256            }
257    
258            this.groupSet = new GroupSet();
259    
260            List<TorqueDynamicGroupRole> grouproles = getTorqueDynamicGroupRolesJoinTorqueDynamicGroup(new Criteria(), con);
261    
262            for (TorqueDynamicGroupRole tdgr : grouproles)
263            {
264                groupSet.add(tdgr.getTorqueDynamicGroup());
265            }
266        } catch (TorqueException e ) {
267            throw new DataBackendException( e.getMessage(),e );
268        }
269    }
270
271    /**
272     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#update(java.sql.Connection)
273     */
274    public void update(Connection con) throws TorqueException
275    {
276        if (permissionSet != null)
277        {
278            Criteria criteria = new Criteria();
279
280            /* remove old entries */
281            criteria.where(TorqueDynamicRolePermissionPeer.ROLE_ID, getEntityId());
282            TorqueDynamicRolePermissionPeer.doDelete(criteria, con);
283
284            for (Permission p : permissionSet)
285            {
286                TorqueDynamicRolePermission rp = new TorqueDynamicRolePermission();
287                rp.setPermissionId((Integer)p.getId());
288                rp.setRoleId(getEntityId());
289                rp.save(con);
290            }
291        }
292
293        if (groupSet != null)
294        {
295            Criteria criteria = new Criteria();
296
297            /* remove old entries */
298            criteria.where(TorqueDynamicGroupRolePeer.ROLE_ID, getEntityId());
299            TorqueDynamicGroupRolePeer.doDelete(criteria, con);
300
301            for (Group g : groupSet)
302            {
303                TorqueDynamicGroupRole gr = new TorqueDynamicGroupRole();
304                gr.setGroupId((Integer)g.getId());
305                gr.setRoleId(getEntityId());
306                gr.save(con);
307            }
308        }
309
310        try
311        {
312            save(con);
313        }
314        catch (Exception e)
315        {
316            throw new TorqueException(e);
317        }
318    }
319
320    /**
321     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#delete()
322     */
323    public void delete() throws TorqueException
324    {
325        TorqueDynamicRolePeer.doDelete(SimpleKey.keyFor(getEntityId()));
326    }
327}