001package org.apache.fulcrum.security.torque.turbine;
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.Role;
025import org.apache.fulcrum.security.model.turbine.entity.TurbinePermission;
026import org.apache.fulcrum.security.torque.om.TorqueTurbinePermissionPeer;
027import org.apache.fulcrum.security.torque.om.TorqueTurbineRolePermission;
028import org.apache.fulcrum.security.torque.om.TorqueTurbineRolePermissionPeer;
029import org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity;
030import org.apache.fulcrum.security.util.DataBackendException;
031import org.apache.fulcrum.security.util.RoleSet;
032import org.apache.torque.TorqueException;
033import org.apache.torque.criteria.Criteria;
034import org.apache.torque.om.SimpleKey;
035/**
036 * This abstract class provides the SecurityInterface to the managers.
037 *
038 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
039 * @version $Id:$
040 */
041public abstract class FulcrumAbstractTurbinePermission extends TorqueAbstractSecurityEntity
042    implements TurbinePermission
043{
044    /** Serial version */
045        private static final long serialVersionUID = -5313324873688923207L;
046
047        /** a cache of role objects */
048    private Set<Role> roleSet = null;
049
050    /**
051     * Forward reference to generated code
052     *
053     * Get a list of association objects, pre-populated with their TorqueTurbineRole
054     * objects.
055     *
056     * @param criteria Criteria to define the selection of records
057     * @param con a database connection
058     * @throws TorqueException  if any database error occurs
059     *
060     * @return a list of Role/Permission relations
061     */
062    protected List<TorqueTurbineRolePermission> getTorqueTurbineRolePermissionsJoinTorqueTurbineRole(Criteria criteria, Connection con)
063        throws TorqueException
064    {
065        criteria.and(TorqueTurbineRolePermissionPeer.PERMISSION_ID, getEntityId() );
066        return TorqueTurbineRolePermissionPeer.doSelectJoinTorqueTurbineRole(criteria, con);
067    }
068
069    /**
070     * @see org.apache.fulcrum.security.model.turbine.entity.TurbinePermission#addRole(org.apache.fulcrum.security.entity.Role)
071     */
072    public void addRole(Role role)
073    {
074        getRoles().add(role);
075    }
076
077    /**
078     * @see org.apache.fulcrum.security.model.turbine.entity.TurbinePermission#getRoles()
079     */
080    public RoleSet getRoles()
081    {
082        if (roleSet == null)
083        {
084            roleSet = new RoleSet();
085        }
086        else if(!(roleSet instanceof RoleSet))
087        {
088            roleSet = new RoleSet(roleSet);
089        }
090
091        return (RoleSet)roleSet;
092    }
093
094    /**
095     * @see org.apache.fulcrum.security.model.turbine.entity.TurbinePermission#getRolesAsSet()
096     */
097    @SuppressWarnings("unchecked")
098        public <T extends Role> Set<T> getRolesAsSet()
099    {
100        return (Set<T>)roleSet;
101    }
102
103    /**
104     * @see org.apache.fulcrum.security.model.turbine.entity.TurbinePermission#removeRole(org.apache.fulcrum.security.entity.Role)
105     */
106    public void removeRole(Role role)
107    {
108        getRoles().remove(role);
109    }
110
111    /**
112     * @see org.apache.fulcrum.security.model.turbine.entity.TurbinePermission#setRoles(org.apache.fulcrum.security.util.RoleSet)
113     */
114    public void setRoles(RoleSet roleSet)
115    {
116        if (roleSet != null)
117        {
118            this.roleSet = roleSet;
119        }
120        else
121        {
122            this.roleSet = new RoleSet();
123        }
124    }
125
126    /**
127     * @see org.apache.fulcrum.security.model.turbine.entity.TurbinePermission#setRolesAsSet(java.util.Set)
128     */
129    public <T extends Role> void setRolesAsSet(Set<T> roles)
130    {
131        setRoles(new RoleSet(roles));
132    }
133
134    /**
135     * @return the database name
136     */
137    public String getDatabaseName()
138    {
139        return TorqueTurbinePermissionPeer.DATABASE_NAME;
140    }
141    
142    /* (non-Javadoc)
143     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
144     */
145    @Override
146    public void retrieveAttachedObjects( Connection con )
147        throws DataBackendException
148    {
149        retrieveAttachedObjects( con, false );
150    }
151
152    /* (non-Javadoc)
153     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection, java.lang.Boolean)
154     */
155    @Override
156    public void retrieveAttachedObjects( Connection con, Boolean lazy )
157        throws DataBackendException
158    {
159        this.roleSet = new RoleSet();
160
161        try {
162            List<TorqueTurbineRolePermission> rolepermissions = getTorqueTurbineRolePermissionsJoinTorqueTurbineRole(new Criteria(), con);
163    
164            for (TorqueTurbineRolePermission ttrp : rolepermissions)
165            {
166                roleSet.add(ttrp.getTorqueTurbineRole());
167            }
168        } catch (TorqueException e ) {
169            throw new DataBackendException( e.getMessage(),e );
170        }
171    }
172
173    /* (non-Javadoc)
174     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#update(java.sql.Connection)
175     */
176    public void update(Connection con) throws TorqueException
177    {
178        if (roleSet != null)
179        {
180            Criteria criteria = new Criteria();
181
182            /* remove old entries */
183            criteria.where(TorqueTurbineRolePermissionPeer.PERMISSION_ID, getEntityId());
184            TorqueTurbineRolePermissionPeer.doDelete(criteria, con);
185
186            for (Role r : roleSet)
187            {
188                TorqueTurbineRolePermission rp = new TorqueTurbineRolePermission();
189                rp.setRoleId((Integer)r.getId());
190                rp.setPermissionId(getEntityId());
191                rp.save(con);
192            }
193        }
194
195        try
196        {
197            save(con);
198        }
199        catch (Exception e)
200        {
201            throw new TorqueException(e);
202        }
203    }
204
205    /* (non-Javadoc)
206     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#delete()
207     */
208    public void delete() throws TorqueException
209    {
210        TorqueTurbinePermissionPeer.doDelete(SimpleKey.keyFor(getEntityId()));
211    }
212}