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.HashSet;
022import java.util.List;
023import java.util.Set;
024
025import org.apache.fulcrum.security.entity.User;
026import org.apache.fulcrum.security.model.turbine.entity.TurbineUser;
027import org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRole;
028import org.apache.fulcrum.security.torque.om.TorqueTurbineUserGroupRole;
029import org.apache.fulcrum.security.torque.om.TorqueTurbineUserGroupRolePeer;
030import org.apache.fulcrum.security.torque.om.TorqueTurbineUserPeer;
031import org.apache.fulcrum.security.torque.security.turbine.TorqueAbstractTurbineTurbineSecurityEntity;
032import org.apache.fulcrum.security.util.DataBackendException;
033import org.apache.torque.TorqueException;
034import org.apache.torque.criteria.Criteria;
035import org.apache.torque.om.SimpleKey;
036/**
037 * This abstract class provides the SecurityInterface to the managers.
038 * 
039 * An implementing class is required to implement {@link User} at least. Most probably the OM classes allow to implement {@link TurbineUser}, which includes User.
040 *
041 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
042 * @version $Id:$
043 */
044public abstract class FulcrumAbstractTurbineUser extends TorqueAbstractTurbineTurbineSecurityEntity
045{
046    /** Serial version */
047        private static final long serialVersionUID = -7255623655281852566L;
048
049    /**
050     * Forward reference to generated code
051     *
052     * Get a list of association objects, pre-populated with their TorqueTurbineRole
053     * objects.
054     *
055     * @param criteria Criteria to define the selection of records
056     * @param con a database connection
057     * @throws TorqueException  if any database error occurs
058     *
059     * @return a list of User/Group/Role relations
060     */
061    protected List<TorqueTurbineUserGroupRole> getTorqueTurbineUserGroupRolesJoinTorqueTurbineGroup(Criteria criteria, Connection con)
062        throws TorqueException
063    {
064        criteria.and(TorqueTurbineUserGroupRolePeer.USER_ID, getEntityId() );
065        return TorqueTurbineUserGroupRolePeer.doSelectJoinTorqueTurbineGroup(criteria, con);
066    }
067    
068    /* (non-Javadoc)
069     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection)
070     */
071    @Override
072    public void retrieveAttachedObjects( Connection con )
073        throws DataBackendException
074    {
075        retrieveAttachedObjects( con, false );
076    }
077
078    /* (non-Javadoc)
079     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(java.sql.Connection, java.lang.Boolean)
080     */
081    @Override
082    public void retrieveAttachedObjects(Connection con, Boolean lazy) throws DataBackendException
083    {
084        try {
085            if (!lazy) {
086                Set<TurbineUserGroupRole> userGroupRoleSet = new HashSet<TurbineUserGroupRole>();
087                List<TorqueTurbineUserGroupRole> ugrs = getTorqueTurbineUserGroupRolesJoinTorqueTurbineGroup(new Criteria(), con);
088        
089                for (TorqueTurbineUserGroupRole ttugr : ugrs)
090                {
091                    TurbineUserGroupRole ugr = new TurbineUserGroupRole();
092                    ugr.setUser((User) this);
093                    ugr.setRole(ttugr.getTorqueTurbineRole());
094                    ugr.setGroup(ttugr.getTorqueTurbineGroup(con));
095                    userGroupRoleSet.add(ugr);
096                }
097                setUserGroupRoleSet(userGroupRoleSet);
098            }
099       } catch (TorqueException e ) {
100            throw new DataBackendException( e.getMessage(),e );
101       }
102    }
103
104    /* (non-Javadoc)
105     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#update(java.sql.Connection)
106     */
107    @Override
108        public void update(Connection con) throws TorqueException
109    {
110        try
111        {
112                Set<TurbineUserGroupRole> userGroupRoleSet = getUserGroupRoleSet();
113            if (userGroupRoleSet != null)
114            {
115                Criteria criteria = new Criteria();
116    
117                /* remove old entries */
118                criteria.where(TorqueTurbineUserGroupRolePeer.USER_ID, getEntityId());
119                TorqueTurbineUserGroupRolePeer.doDelete(criteria, con);
120    
121                for (TurbineUserGroupRole ugr : userGroupRoleSet)
122                {
123                    TorqueTurbineUserGroupRole ttugr = new TorqueTurbineUserGroupRole();
124                    ttugr.setGroupId((Integer)ugr.getGroup().getId());
125                    ttugr.setUserId((Integer)ugr.getUser().getId());
126                    ttugr.setRoleId((Integer)ugr.getRole().getId());
127                    ttugr.save(con);
128                }
129            }
130            save(con);
131        }
132        catch (Exception e)
133        {
134            throw new TorqueException(e);
135        }
136    }
137
138    
139    /* (non-Javadoc)
140     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#delete()
141     */
142    @Override
143        public void delete() throws TorqueException
144    {
145        TorqueTurbineUserPeer.doDelete(SimpleKey.keyFor(getEntityId()));
146    }
147}