TorqueAbstractDynamicUser.java

package org.apache.fulcrum.security.torque.dynamic;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
import java.sql.Connection;
import java.util.List;
import java.util.Set;

import org.apache.fulcrum.security.entity.Group;
import org.apache.fulcrum.security.entity.User;
import org.apache.fulcrum.security.model.dynamic.entity.DynamicUser;
import org.apache.fulcrum.security.torque.om.TorqueDynamicUserDelegates;
import org.apache.fulcrum.security.torque.om.TorqueDynamicUserDelegatesPeer;
import org.apache.fulcrum.security.torque.om.TorqueDynamicUserGroup;
import org.apache.fulcrum.security.torque.om.TorqueDynamicUserGroupPeer;
import org.apache.fulcrum.security.torque.om.TorqueDynamicUserPeer;
import org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity;
import org.apache.fulcrum.security.util.DataBackendException;
import org.apache.fulcrum.security.util.GroupSet;
import org.apache.fulcrum.security.util.UserSet;
import org.apache.torque.TorqueException;
import org.apache.torque.criteria.Criteria;
import org.apache.torque.om.SimpleKey;

/**
 * This abstract class provides the SecurityInterface to the managers.
 *
 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
 * @version $Id:$
 */
public abstract class TorqueAbstractDynamicUser extends TorqueAbstractSecurityEntity implements DynamicUser {
    /** Serial version */
    private static final long serialVersionUID = -7307211992287876455L;

    /** a cache of group objects */
    private Set<Group> groupSet = null;

    /** a cache of delegator (user) objects */
    private Set<User> delegators = null;

    /** a cache of delegatee(user) objects */
    private Set<User> delegatees = null;

    /**
     * Forward reference to generated code
     *
     * Get a list of association objects, pre-populated with their
     * TorqueDynamicGroup objects.
     *
     * @param criteria Criteria to define the selection of records
     * @param con      a database connection
     * @throws TorqueException if any database error occurs
     *
     * @return a list of User/Group relations
     */
    protected List<TorqueDynamicUserGroup> getTorqueDynamicUserGroupsJoinTorqueDynamicGroup(Criteria criteria,
            Connection con) throws TorqueException {
        criteria.and(TorqueDynamicUserGroupPeer.USER_ID, getEntityId());
        return TorqueDynamicUserGroupPeer.doSelectJoinTorqueDynamicGroup(criteria, con);
    }

    /**
     * Forward reference to generated code
     *
     * Get a list of delegator association objects, pre-populated with their
     * TorqueDynamicUserDelegates objects.
     *
     * @param criteria Criteria to define the selection of records
     * @param con      a database connection
     * @throws TorqueException if any database error occurs
     *
     * @return a list of User/Delegator relations
     */
    protected List<TorqueDynamicUserDelegates> getTorqueDynamicUserDelegatessRelatedByDelegateeUserIdJoinTorqueDynamicUserRelatedByDelegatorUserId(
            Criteria criteria, Connection con) throws TorqueException {
        criteria.and(TorqueDynamicUserDelegatesPeer.DELEGATEE_USER_ID, getEntityId());
        return TorqueDynamicUserDelegatesPeer.doSelectJoinTorqueDynamicUserRelatedByDelegatorUserId(criteria, con);
    }

    /**
     * Forward reference to generated code
     *
     * Get a list of delegatee association objects, pre-populated with their
     * TorqueDynamicUserDelegates objects.
     *
     * @param criteria Criteria to define the selection of records
     * @param con      a database connection
     * @throws TorqueException if any database error occurs
     *
     * @return a list of User/Delegator relations
     */
    protected List<TorqueDynamicUserDelegates> getTorqueDynamicUserDelegatessRelatedByDelegatorUserIdJoinTorqueDynamicUserRelatedByDelegateeUserId(
            Criteria criteria, Connection con) throws TorqueException {
        criteria.and(TorqueDynamicUserDelegatesPeer.DELEGATOR_USER_ID, getEntityId());
        return TorqueDynamicUserDelegatesPeer.doSelectJoinTorqueDynamicUserRelatedByDelegateeUserId(criteria, con);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.apache.fulcrum.security.model.basic.entity.BasicUser#addGroup(org.apache.
     * fulcrum.security.entity.Group)
     */
    public void addGroup(Group group) {
        getGroups().add(group);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.apache.fulcrum.security.model.basic.entity.BasicUser#getGroups()
     */
    public GroupSet getGroups() {
        if (groupSet == null) {
            groupSet = new GroupSet();
        } else if (!(groupSet instanceof GroupSet)) {
            groupSet = new GroupSet(groupSet);
        }

        return (GroupSet) groupSet;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.apache.fulcrum.security.model.basic.entity.BasicUser#getGroupsAsSet()
     */
    @SuppressWarnings("unchecked")
    public <T extends Group> Set<T> getGroupsAsSet() {
        return (Set<T>) groupSet;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.apache.fulcrum.security.model.basic.entity.BasicUser#removeGroup(org.
     * apache.fulcrum.security.entity.Group)
     */
    public void removeGroup(Group group) {
        getGroups().remove(group);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.apache.fulcrum.security.model.basic.entity.BasicUser#setGroups(org.apache
     * .fulcrum.security.util.GroupSet)
     */
    public void setGroups(GroupSet groups) {
        if (groups != null) {
            this.groupSet = groups;
        } else {
            this.groupSet = new GroupSet();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.apache.fulcrum.security.model.basic.entity.BasicUser#setGroupsAsSet(java.
     * util.Set)
     */
    public <T extends Group> void setGroupsAsSet(Set<T> groups) {
        setGroups(new GroupSet(groups));
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.apache.fulcrum.security.model.dynamic.entity.DynamicUser#getDelegatees()
     */
    @SuppressWarnings("unchecked")
    public <T extends User> Set<T> getDelegatees() {
        if (delegatees == null) {
            delegatees = new UserSet<T>();
        }

        return (Set<T>) delegatees;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.apache.fulcrum.security.model.dynamic.entity.DynamicUser#getDelegators()
     */
    @SuppressWarnings("unchecked")
    public <T extends User> Set<T> getDelegators() {
        if (delegators == null) {
            delegators = new UserSet<T>();
        }

        return (Set<T>) delegators;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.apache.fulcrum.security.model.dynamic.entity.DynamicUser#setDelegatees(
     * java.util.Set)
     */
    public <T extends User> void setDelegatees(Set<T> delegatees) {
        if (delegatees != null) {
            this.delegatees = new UserSet<T>(delegatees);
        } else {
            this.delegatees = new UserSet<T>();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.apache.fulcrum.security.model.dynamic.entity.DynamicUser#setDelegators(
     * java.util.Set)
     */
    public <T extends User> void setDelegators(Set<T> delegates) {
        if (delegators != null) {
            this.delegators = new UserSet<T>(delegates);
        } else {
            this.delegators = new UserSet<T>();
        }
    }

    /**
     * @return the database name
     */
    public String getDatabaseName() {
        return TorqueDynamicUserPeer.DATABASE_NAME;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#
     * retrieveAttachedObjects(java.sql.Connection)
     */
    @Override
    public void retrieveAttachedObjects(Connection con) throws DataBackendException {
        retrieveAttachedObjects(con, false);
    }

    /**
     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#retrieveAttachedObjects(Connection,
     *      Boolean)
     */
    @Override
    public void retrieveAttachedObjects(Connection con, Boolean lazy) throws DataBackendException {
        
        this.groupSet = new GroupSet();

        try {
            
            List<TorqueDynamicUserGroup> usergroups = getTorqueDynamicUserGroupsJoinTorqueDynamicGroup(new Criteria(), con);
    
            for (TorqueDynamicUserGroup tdug : usergroups) {
                groupSet.add(tdug.getTorqueDynamicGroup());
            }
    
            this.delegators = new UserSet<User>();
    
            List<TorqueDynamicUserDelegates> delegatorlist = getTorqueDynamicUserDelegatessRelatedByDelegateeUserIdJoinTorqueDynamicUserRelatedByDelegatorUserId(
                    new Criteria(), con);
    
            for (TorqueDynamicUserDelegates tdud : delegatorlist) {
                delegators.add(tdud.getTorqueDynamicUserRelatedByDelegatorUserId());
            }
    
            this.delegatees = new UserSet<User>();
    
            List<TorqueDynamicUserDelegates> delegateelist = getTorqueDynamicUserDelegatessRelatedByDelegatorUserIdJoinTorqueDynamicUserRelatedByDelegateeUserId(
                    new Criteria(), con);
    
            for (TorqueDynamicUserDelegates tdud : delegateelist) {
                delegatees.add(tdud.getTorqueDynamicUserRelatedByDelegateeUserId());
            }
            
        } catch (TorqueException e ) {
            throw new DataBackendException( e.getMessage(),e );
        }
    }

    /**
     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#update(java.sql.Connection)
     */
    public void update(Connection con) throws TorqueException {
        if (groupSet != null) {
            Criteria criteria = new Criteria();

            /* remove old entries */
            criteria.where(TorqueDynamicUserGroupPeer.USER_ID, getEntityId());
            TorqueDynamicUserGroupPeer.doDelete(criteria, con);

            for (Group g : groupSet) {
                TorqueDynamicUserGroup ug = new TorqueDynamicUserGroup();
                ug.setUserId(getEntityId());
                ug.setGroupId((Integer) g.getId());
                ug.save(con);
            }
        }

        if (delegators != null) {
            Criteria criteria = new Criteria();

            /* remove old entries */
            criteria.where(TorqueDynamicUserDelegatesPeer.DELEGATEE_USER_ID, getEntityId());
            TorqueDynamicUserDelegatesPeer.doDelete(criteria, con);

            for (User u : delegators) {
                TorqueDynamicUserDelegates ud = new TorqueDynamicUserDelegates();
                ud.setDelegateeUserId(getEntityId());
                ud.setDelegatorUserId((Integer) u.getId());
                ud.save(con);
            }
        }

        if (delegatees != null) {
            Criteria criteria = new Criteria();

            /* remove old entries */
            criteria.where(TorqueDynamicUserDelegatesPeer.DELEGATOR_USER_ID, getEntityId());
            TorqueDynamicUserDelegatesPeer.doDelete(criteria, con);

            for (User u : delegatees) {
                TorqueDynamicUserDelegates ud = new TorqueDynamicUserDelegates();
                ud.setDelegatorUserId(getEntityId());
                ud.setDelegateeUserId((Integer) u.getId());
                ud.save(con);
            }
        }

        try {
            save(con);
        } catch (Exception e) {
            throw new TorqueException(e);
        }
    }

    /**
     * @see org.apache.fulcrum.security.torque.security.TorqueAbstractSecurityEntity#delete()
     */
    public void delete() throws TorqueException {
        TorqueDynamicUserPeer.doDelete(SimpleKey.keyFor(getEntityId()));
    }
}