org.eurekastreams.server.action.execution.notification.DeleteOldApplicationAlertsExecution.java Source code

Java tutorial

Introduction

Here is the source code for org.eurekastreams.server.action.execution.notification.DeleteOldApplicationAlertsExecution.java

Source

/*
 * Copyright (c) 2010-2011 Lockheed Martin Corporation
 *
 * Licensed 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.eurekastreams.server.action.execution.notification;

import java.io.Serializable;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import org.apache.commons.logging.Log;
import org.eurekastreams.commons.actions.ExecutionStrategy;
import org.eurekastreams.commons.actions.context.ActionContext;
import org.eurekastreams.commons.logging.LogFactory;
import org.eurekastreams.server.persistence.mappers.DomainMapper;
import org.eurekastreams.server.persistence.mappers.db.DeleteApplicationAlertsByDate;
import org.eurekastreams.server.persistence.mappers.db.GetUserIdsWithUnreadApplicationAlertsByDate;

/**
 * Deletes application that are older (in days) than the configured ageInDays value.
 */
public class DeleteOldApplicationAlertsExecution implements ExecutionStrategy<ActionContext> {
    /**
     * Logger.
     */
    private final Log log = LogFactory.make();

    /**
     * Mapper to delete alerts.
     */
    private final DeleteApplicationAlertsByDate deleteMapper;

    /**
     * Mapper to find user ids with old unread alerts.
     */
    private final GetUserIdsWithUnreadApplicationAlertsByDate unreadMapper;

    /**
     * Mapper to sync database and cache unread alert count.
     */
    private final DomainMapper<Long, Integer> syncMapper;

    /**
     * Age at which alerts can be deleted.
     */
    private final int ageInDays;

    /**
     * Constructor.
     *
     * @param inDeleteMapper
     *            The mapper that performs the application alert deletion from the database.
     * @param inUnreadMapper
     *            The mapper that retrieves the ids of users that have old unread alerts.
     * @param inSyncMapper
     *            The mapper that syncs the unread alert count from the database with the value in cache.
     * @param inAgeInDays
     *            The age in days when an alert is considered "old".
     */
    public DeleteOldApplicationAlertsExecution(final DeleteApplicationAlertsByDate inDeleteMapper,
            final GetUserIdsWithUnreadApplicationAlertsByDate inUnreadMapper,
            final DomainMapper<Long, Integer> inSyncMapper, final int inAgeInDays) {
        deleteMapper = inDeleteMapper;
        ageInDays = inAgeInDays;
        unreadMapper = inUnreadMapper;
        syncMapper = inSyncMapper;
    }

    /**
     * {@inheritDoc} This method calls the database mapper to delete application alerts that are older than ageInDays.
     * Before the delete, a mapper call is made to find which users had old unread alerts then after the actual
     * deletion, the cached count of unread alerts for these users is synced with the database.
     */
    @Override
    public Serializable execute(final ActionContext inActionContext) {
        if (log.isInfoEnabled()) {
            log.info("Deleting application alerts older than " + ageInDays + " days");
        }

        GregorianCalendar calendar = new GregorianCalendar();
        calendar.add(GregorianCalendar.DATE, ageInDays * -1);
        Date oldDate = calendar.getTime();

        List<Long> userIdsToSync = unreadMapper.execute(oldDate);

        deleteMapper.execute(oldDate);

        for (long userId : userIdsToSync) {
            syncMapper.execute(userId);
        }

        return true;
    }
}