/*
* 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;
import java.io.Serializable;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.eurekastreams.commons.actions.TaskHandlerExecutionStrategy;
import org.eurekastreams.commons.actions.context.ActionContext;
import org.eurekastreams.commons.actions.context.TaskHandlerActionContext;
import org.eurekastreams.commons.date.DayOfWeekStrategy;
import org.eurekastreams.commons.date.GetDateFromDaysAgoStrategy;
import org.eurekastreams.commons.exceptions.ExecutionException;
import org.eurekastreams.commons.logging.LogFactory;
import org.eurekastreams.server.domain.DailyUsageSummary;
import org.eurekastreams.server.persistence.mappers.DomainMapper;
import org.eurekastreams.server.persistence.mappers.requests.PersistenceRequest;
/**
* Execution strategy to generate the daily usage summary for the previous day.
*/
public class GenerateDailyUsageSummaryExecution implements TaskHandlerExecutionStrategy<ActionContext>
{
/**
* Logger.
*/
private Log logger = LogFactory.make();
/**
* strategy to get a date from N days ago.
*/
private GetDateFromDaysAgoStrategy daysAgoDateStrategy;
/**
* Mapper to get a single day's DailyUsageSummary.
*/
private DomainMapper<Date, DailyUsageSummary> getDailyUsageSummaryByDateMapper;
/**
* Mapper to get a day's message count.
*/
private DomainMapper<Date, Long> getDailyMessageCountMapper;
/**
* Mapper to get a day's page view count.
*/
private DomainMapper<Date, Long> getDailyPageViewCountMapper;
/**
* Mapper to get a day's stream contributor count.
*/
private DomainMapper<Date, Long> getDailyStreamContributorCountMapper;
/**
* Mapper to get a day's stream view count.
*/
private DomainMapper<Date, Long> getDailyStreamViewCountMapper;
/**
* Mapper to get a day's stream viewer count.
*/
private DomainMapper<Date, Long> getDailyStreamViewerCountMapper;
/**
* Mapper to get a day's unique visitor count.
*/
private DomainMapper<Date, Long> getDailyUniqueVisitorCountMapper;
/**
* Mapper to insert the DailyUsageSummary entity.
*/
private DomainMapper<PersistenceRequest<DailyUsageSummary>, Boolean> insertMapper;
/**
* Mapper to delete old UsageMetric data.
*/
private DomainMapper<Serializable, Serializable> usageMetricDataCleanupMapper;
/**
* Mapper to get day's average activity response time (for those that had responses).
*/
private DomainMapper<Date, Long> getDailyMessageResponseTimeMapper;
/**
* Strategy to determine if a day is a weekday.
*/
private DayOfWeekStrategy dayOfWeekStrategy;
/**
* Constructor.
*
* @param inDaysAgoDateStrategy
* strategy to get a date from yesterday
* @param inGetDailyUsageSummaryByDateMapper
* Mapper to get a single day's DailyUsageSummary
* @param inGetDailyMessageCountMapper
* Mapper to get a day's message count
* @param inGetDailyPageViewCountMapper
* Mapper to get a day's page view count.
* @param inGetDailyStreamContributorCountMapper
* Mapper to get a day's stream contributor count.
* @param inGetDailyStreamViewCountMapper
* Mapper to get a day's stream view count.
* @param inGetDailyStreamViewerCountMapper
* Mapper to get a day's stream viewer count.
* @param inGetDailyUniqueVisitorCountMapper
* Mapper to get a day's unique visitor count.
* @param inGetDailyMessageResponseTimeMapper
* Mapper to get day's average activity response time (for those that had responses).
* @param inInsertMapper
* mapper to insert DailyUsageSummary
* @param inUsageMetricDataCleanupMapper
* mapper to delete old UsageMetric data
* @param inDayOfWeekStrategy
* dayOfWeekStrategy strategy to determine if a day is a weekday
*/
public GenerateDailyUsageSummaryExecution(final GetDateFromDaysAgoStrategy inDaysAgoDateStrategy,
final DomainMapper<Date, DailyUsageSummary> inGetDailyUsageSummaryByDateMapper,
final DomainMapper<Date, Long> inGetDailyMessageCountMapper,
final DomainMapper<Date, Long> inGetDailyPageViewCountMapper,
final DomainMapper<Date, Long> inGetDailyStreamContributorCountMapper,
final DomainMapper<Date, Long> inGetDailyStreamViewCountMapper,
final DomainMapper<Date, Long> inGetDailyStreamViewerCountMapper,
final DomainMapper<Date, Long> inGetDailyUniqueVisitorCountMapper,
final DomainMapper<Date, Long> inGetDailyMessageResponseTimeMapper,
final DomainMapper<PersistenceRequest<DailyUsageSummary>, Boolean> inInsertMapper,
final DomainMapper<Serializable, Serializable> inUsageMetricDataCleanupMapper,
final DayOfWeekStrategy inDayOfWeekStrategy)
{
daysAgoDateStrategy = inDaysAgoDateStrategy;
getDailyUsageSummaryByDateMapper = inGetDailyUsageSummaryByDateMapper;
getDailyMessageCountMapper = inGetDailyMessageCountMapper;
getDailyPageViewCountMapper = inGetDailyPageViewCountMapper;
getDailyStreamContributorCountMapper = inGetDailyStreamContributorCountMapper;
getDailyStreamViewCountMapper = inGetDailyStreamViewCountMapper;
getDailyStreamViewerCountMapper = inGetDailyStreamViewerCountMapper;
getDailyUniqueVisitorCountMapper = inGetDailyUniqueVisitorCountMapper;
getDailyMessageResponseTimeMapper = inGetDailyMessageResponseTimeMapper;
insertMapper = inInsertMapper;
usageMetricDataCleanupMapper = inUsageMetricDataCleanupMapper;
dayOfWeekStrategy = inDayOfWeekStrategy;
}
/**
* Generate the daily usage summary for the previous day.
*
* @param inActionContext
* the action context
* @return true if data was inserted, false if already existed
* @throws ExecutionException
* when something really, really bad happens
*/
@Override
public Serializable execute(final TaskHandlerActionContext<ActionContext> inActionContext)
throws ExecutionException
{
Date yesterday = daysAgoDateStrategy.execute(1);
// see if we already have data for yesterday
DailyUsageSummary data = getDailyUsageSummaryByDateMapper.execute(yesterday);
if (data != null)
{
logger.info("No need to create daily usage data for " + yesterday + " - already exists.");
return Boolean.FALSE;
}
logger.info("Generating number of unique visitors for " + yesterday);
long uniqueVisitorCount = getDailyUniqueVisitorCountMapper.execute(yesterday);
logger.info("Generating number of page views for " + yesterday);
long pageViewCount = getDailyPageViewCountMapper.execute(yesterday);
logger.info("Generating number of stream views for " + yesterday);
long streamViewCount = getDailyStreamViewCountMapper.execute(yesterday);
logger.info("Generating number of stream viewers for " + yesterday);
long streamViewerCount = getDailyStreamViewerCountMapper.execute(yesterday);
logger.info("Generating number of stream contributors for " + yesterday);
long streamContributorCount = getDailyStreamContributorCountMapper.execute(yesterday);
logger.info("Generating number of messages (activities and comments) for " + yesterday);
long messageCount = getDailyMessageCountMapper.execute(yesterday);
logger.info("Generating average activity comment time (for those with comments on the same day) for "
+ yesterday);
long avgActvityResponeTime = getDailyMessageResponseTimeMapper.execute(yesterday);
boolean isWeekday = dayOfWeekStrategy.isWeekday(yesterday);
data = new DailyUsageSummary(uniqueVisitorCount, pageViewCount, streamViewerCount, streamViewCount,
streamContributorCount, messageCount, avgActvityResponeTime, yesterday, isWeekday);
// store this
logger.info("Inserting daily usage metric data for " + yesterday);
insertMapper.execute(new PersistenceRequest<DailyUsageSummary>(data));
// delete old data
logger.info("Deleting old daily usage metric data");
usageMetricDataCleanupMapper.execute(0);
logger.info("Inserted Daily Summary metrics for " + yesterday);
return Boolean.TRUE;
}
}