org.jasig.schedassist.impl.owner.ScheduleOwnerAuditor.java Source code

Java tutorial

Introduction

Here is the source code for org.jasig.schedassist.impl.owner.ScheduleOwnerAuditor.java

Source

/**
 * Licensed to Jasig under one or more contributor license
 * agreements. See the NOTICE file distributed with this work
 * for additional information regarding copyright ownership.
 * Jasig 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.
 */

package org.jasig.schedassist.impl.owner;

import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jasig.schedassist.ICalendarAccountDao;
import org.jasig.schedassist.model.ICalendarAccount;
import org.jasig.schedassist.model.IScheduleOwner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

/**
 * Tool for auditing {@link IScheduleOwner} records.
 *  
 * @author Nicholas Blair, nblair@doit.wisc.edu
 * @version $Id: ScheduleOwnerAuditor.java 2400 2010-08-19 18:12:29Z npblair $
 */
public final class ScheduleOwnerAuditor extends SimpleJdbcDaoSupport {

    /**
     * Set a {@link System} property with this name to specify an alternate location for the Spring {@link ApplicationContext} used by {@link #main(String[])}.
     */
    public static final String CONFIG_SYSTEM_PROPERTY = "org.jasig.schedassist.impl.owner.ScheduleOwnerAuditor.CONFIG";
    public static final String CONFIG = System.getProperty(CONFIG_SYSTEM_PROPERTY, "cli-tools.xml");
    private final Log LOG = LogFactory.getLog(this.getClass());
    private OwnerDao ownerDao;
    private ICalendarAccountDao calendarAccountDao;

    private boolean purge = false;

    /**
     * @param ownerDao the ownerDao to set
     */
    @Autowired
    public void setOwnerDao(OwnerDao ownerDao) {
        this.ownerDao = ownerDao;
    }

    /**
     * @param calendarAccountDao the calendarAccountDao to set
     */
    @Autowired
    public void setCalendarAccountDao(@Qualifier("composite") ICalendarAccountDao calendarAccountDao) {
        this.calendarAccountDao = calendarAccountDao;
    }

    /**
     * @param purge the purge to set
     */
    public void setPurge(boolean purge) {
        this.purge = purge;
    }

    /**
     * 
     * @return a {@link List} of all {@link PersistenceScheduleOwner}s in the database
     */
    protected List<PersistenceScheduleOwner> gatherAllScheduleOwnerRecords() {
        List<PersistenceScheduleOwner> ownerRecords = this.getSimpleJdbcTemplate().query("select * from owners",
                new PersistenceScheduleOwnerRowMapper());
        return ownerRecords;
    }

    /**
     * Verify (via the {@link CalendarUserDao}) that a {@link CalendarUser} still
     * exists and is eligible for the specified {@link PersistenceScheduleOwner}.
     * 
     * @param owner
     * @param purge
     */
    protected void auditRecord(final PersistenceScheduleOwner owner) {
        // look for owner by username
        ICalendarAccount byUsername = this.calendarAccountDao.getCalendarAccount(owner.getUsername());
        if (null == byUsername || !byUsername.isEligible()) {
            LOG.debug("no calendar account found for username " + owner.getUsername());
            // check by uniqueId
            ICalendarAccount byUniqueId = this.calendarAccountDao
                    .getCalendarAccountFromUniqueId(owner.getCalendarUniqueId());
            if (null != byUniqueId && byUniqueId.isEligible()) {
                // this means that the customer must have changed their NetID, and our records need an update
                LOG.warn(
                        "found calendarAccount by unique id that has different username from records, owner record: "
                                + owner + ", account: " + byUniqueId);
                int rows = this.getSimpleJdbcTemplate().update(
                        "update owners set username = ? where external_unique_id = ?", byUniqueId.getUsername(),
                        owner.getCalendarUniqueId());
                if (rows == 1) {
                    LOG.warn("successfully updated record for " + byUniqueId);
                } else {
                    LOG.error("failed to update records for " + byUniqueId);
                }
                return;
            }
            LOG.warn("no ICalendarAccount found for record: " + owner);
        } else {
            // user still valid, do nothing
            LOG.info(owner + " still eligible, corresponds to ICalendarAccount: " + byUsername);
            return;
        }

        if (this.purge) {
            // we can't call OwnerDao#locateOwnerByAvailableId because that includes a lookup to the CalendarUserDao, which we know fails
            // make a CalendarUser sufficient enough for use
            ICalendarAccount ineligible = constructCalendarUserForRemoval(owner);

            IScheduleOwner ownerAccount = ownerDao.locateOwner(ineligible);
            ownerDao.removeAccount(ownerAccount);
            LOG.warn("removed record: " + owner);
        }
    }

    /**
     * Construct a {@link ICalendarAccount} sufficient to locate a {@link IScheduleOwner} for removal
     * 
     * @see #auditRecord(PersistenceScheduleOwner)
     * @param owner
     * @return
     */
    private ICalendarAccount constructCalendarUserForRemoval(final PersistenceScheduleOwner owner) {
        DeactivatingCalendarAccount ineligible = new DeactivatingCalendarAccount();
        ineligible.setCalendarUniqueId(owner.getCalendarUniqueId());
        ineligible.setUsername(owner.getUsername());
        return ineligible;
    }

    /**
     * Depends on the presence of a Spring {@link ApplicationContext} at the location
     * on the classpath defined by the {@link #CONFIG_SYSTEM_PROPERTY} System property.
     * 
     * @param args
     */
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(CONFIG);
        ScheduleOwnerAuditor auditor = (ScheduleOwnerAuditor) context.getBean("scheduleOwnerAuditor");
        List<PersistenceScheduleOwner> allOwnerRecords = auditor.gatherAllScheduleOwnerRecords();
        for (PersistenceScheduleOwner owner : allOwnerRecords) {
            auditor.auditRecord(owner);
        }
    }

    /**
     * Internal representation of {@link ICalendarAccount} to be used
     * for deactivated accounts.
     * It only contains the 2 fields we know from the owners table in the database:
     * calendarUniqueId (external_unique_id column) and username (username column).
     *
     * All other methods/fields I return null.
     * 
     * @author Nicholas Blair, nblair@doit.wisc.edu
     * @version $Id: ScheduleOwnerAuditor.java 2400 2010-08-19 18:12:29Z npblair $
     */
    static final class DeactivatingCalendarAccount implements ICalendarAccount {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        private String calendarUniqueId;
        private String username;

        @Override
        public String getAttributeValue(String attributeName) {
            return null;
        }

        @Override
        public Map<String, List<String>> getAttributes() {
            return null;
        }

        @Override
        public String getCalendarLoginId() {
            return null;
        }

        @Override
        public String getCalendarUniqueId() {
            return this.calendarUniqueId;
        }

        @Override
        public String getDisplayName() {
            return null;
        }

        @Override
        public String getEmailAddress() {
            return null;
        }

        @Override
        public String getUsername() {
            return this.username;
        }

        @Override
        public boolean isEligible() {
            return false;
        }

        /**
         * @param calendarUniqueId the calendarUniqueId to set
         */
        public void setCalendarUniqueId(String calendarUniqueId) {
            this.calendarUniqueId = calendarUniqueId;
        }

        /**
         * @param username the username to set
         */
        public void setUsername(String username) {
            this.username = username;
        }

        @Override
        public List<String> getAttributeValues(String attributeName) {
            return null;
        }

        @Override
        public boolean isDelegate() {
            return false;
        }
    }
}