org.jasig.schedassist.impl.reminder.SpringJdbcReminderDaoImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.jasig.schedassist.impl.reminder.SpringJdbcReminderDaoImpl.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.reminder;

import java.util.Date;
import java.util.List;

import javax.sql.DataSource;

import net.fortuna.ical4j.model.component.VEvent;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jasig.schedassist.model.AvailableBlock;
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.beans.factory.annotation.Value;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

/**
 * Spring JDBC implementation of internal {@link ReminderDao} interface.
 * 
 * @author Nicholas Blair
 * @version $Id: SpringJdbcReminderDaoImpl.java $
 */
@Repository
class SpringJdbcReminderDaoImpl implements ReminderDao {

    private SimpleJdbcTemplate simpleJdbcTemplate;
    private DataFieldMaxValueIncrementer reminderIdSequence;
    private Log LOG = LogFactory.getLog(this.getClass());
    private String identifyingAttributeName = "uid";

    /**
     * 
     * @param ds
     */
    @Autowired
    public void setDataSource(DataSource ds) {
        this.simpleJdbcTemplate = new SimpleJdbcTemplate(ds);
    }

    /**
     * @param reminderIdSequence the reminderIdSequence to set
     */
    @Autowired
    public void setReminderIdSequence(@Qualifier("reminders") DataFieldMaxValueIncrementer reminderIdSequence) {
        this.reminderIdSequence = reminderIdSequence;
    }

    /**
     * 
     * @param identifyingAttributeName
     */
    @Value("${users.visibleIdentifierAttributeName:uid}")
    public void setIdentifyingAttributeName(String identifyingAttributeName) {
        this.identifyingAttributeName = identifyingAttributeName;
    }

    /**
     * 
     * @return the attribute used to commonly uniquely identify an account
     */
    public String getIdentifyingAttributeName() {
        return identifyingAttributeName;
    }

    /*
     * (non-Javadoc)
     * @see org.jasig.schedassist.impl.reminder.ReminderDao#createEventReminder(org.jasig.schedassist.model.IScheduleOwner, org.jasig.schedassist.model.ICalendarAccount, org.jasig.schedassist.model.AvailableBlock, net.fortuna.ical4j.model.component.VEvent, java.util.Date)
     */
    @Override
    @Transactional
    public IReminder createEventReminder(IScheduleOwner owner, ICalendarAccount recipient,
            AvailableBlock appointmentBlock, VEvent event, Date sendTime) {
        final String recipientIdentifier = getIdentifyingAttribute(recipient);
        long newReminderId = this.reminderIdSequence.nextLongValue();
        int rows = this.simpleJdbcTemplate.update(
                "insert into reminders (reminder_id,owner_id,recipient,event_start,event_end,send_time) values (?,?,?,?,?,?)",
                newReminderId, owner.getId(), recipientIdentifier, appointmentBlock.getStartTime(),
                appointmentBlock.getEndTime(), sendTime);

        if (rows == 1) {
            ReminderImpl reminder = new ReminderImpl(newReminderId, owner, recipient, sendTime, event);
            return reminder;
        } else {
            LOG.error("failed to store reminder for " + owner + ", " + recipient);
            return null;
        }
    }

    /*
     * (non-Javadoc)
     * @see org.jasig.schedassist.impl.reminder.ReminderDao#deleteEventReminder(org.jasig.schedassist.impl.reminder.IReminder)
     */
    @Override
    @Transactional
    public void deleteEventReminder(IReminder reminder) {
        int rows = this.simpleJdbcTemplate.update("delete from reminders where reminder_id=?",
                reminder.getReminderId());
        if (LOG.isDebugEnabled()) {
            LOG.debug("delete " + reminder + ", rows affected=" + rows);
        }
    }

    /*
     * (non-Javadoc)
     * @see org.jasig.schedassist.impl.reminder.ReminderDao#getPendingReminders()
     */
    @Override
    public List<PersistedReminderImpl> getPendingReminders() {
        Date now = new Date();
        List<PersistedReminderImpl> persisted = this.simpleJdbcTemplate
                .query("select * from reminders where send_time <= ?", new PersistedReminderImplRowMapper(), now);

        return persisted;
    }

    /*
     * (non-Javadoc)
     * @see org.jasig.schedassist.impl.reminder.ReminderDao#getReminders(org.jasig.schedassist.model.IScheduleOwner, org.jasig.schedassist.model.AvailableBlock)
     */
    @Override
    public List<PersistedReminderImpl> getReminders(IScheduleOwner owner, AvailableBlock appointmentBlock) {
        List<PersistedReminderImpl> persisted = this.simpleJdbcTemplate.query(
                "select * from reminders where owner_id=? and event_start=? and event_end=?",
                new PersistedReminderImplRowMapper(), owner.getId(), appointmentBlock.getStartTime(),
                appointmentBlock.getEndTime());

        return persisted;
    }

    /*
     * (non-Javadoc)
     * @see org.jasig.schedassist.impl.reminder.ReminderDao#getReminder(org.jasig.schedassist.model.IScheduleOwner, org.jasig.schedassist.model.ICalendarAccount, org.jasig.schedassist.model.AvailableBlock)
     */
    @Override
    public PersistedReminderImpl getReminder(IScheduleOwner owner, ICalendarAccount recipient,
            AvailableBlock appointmentBlock) {
        final String recipientIdentifier = getIdentifyingAttribute(recipient);
        List<PersistedReminderImpl> persisted = this.simpleJdbcTemplate.query(
                "select * from reminders where owner_id=? and recipient=? and event_start=? and event_end=?",
                new PersistedReminderImplRowMapper(), owner.getId(), recipientIdentifier,
                appointmentBlock.getStartTime(), appointmentBlock.getEndTime());

        PersistedReminderImpl p = DataAccessUtils.singleResult(persisted);
        return p;
    }

    /**
     * 
     * @param account
     * @return the value of {@link #getIdentifyingAttributeName()} for the account
     * @throws IllegalStateException if the account does not have a value for that attribute.
     */
    protected String getIdentifyingAttribute(ICalendarAccount account) {
        final String ownerIdentifier = account.getAttributeValue(identifyingAttributeName);
        if (StringUtils.isBlank(ownerIdentifier)) {
            LOG.error(identifyingAttributeName + " attribute not present for calendarAccount " + account
                    + "; this scenario suggests either a problem with the account, or a deployment configuration problem. Please set the 'users.visibleIdentifierAttributeName' appropriately.");
            throw new IllegalStateException(
                    identifyingAttributeName + " attribute not present for calendarAccount " + account);
        }
        return ownerIdentifier;
    }
}