de.ingrid.portal.scheduler.jobs.AnniversaryFetcherJob.java Source code

Java tutorial

Introduction

Here is the source code for de.ingrid.portal.scheduler.jobs.AnniversaryFetcherJob.java

Source

/*
 * **************************************************-
 * Ingrid Portal Apps
 * ==================================================
 * Copyright (C) 2014 - 2015 wemove digital solutions GmbH
 * ==================================================
 * Licensed under the EUPL, Version 1.1 or  as soon they will be
 * approved by the European Commission - subsequent versions of the
 * EUPL (the "Licence");
 * 
 * You may not use this work except in compliance with the Licence.
 * You may obtain a copy of the Licence at:
 * 
 * http://ec.europa.eu/idabc/eupl5
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the Licence is distributed on an "AS IS" basis,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the Licence for the specific language governing permissions and
 * limitations under the Licence.
 * **************************************************#
 */
package de.ingrid.portal.scheduler.jobs;

import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import de.ingrid.iplug.sns.utils.DetailedTopic;
import de.ingrid.portal.global.Utils;
import de.ingrid.portal.hibernate.HibernateUtil;
import de.ingrid.portal.interfaces.impl.SNSAnniversaryInterfaceImpl;
import de.ingrid.portal.om.IngridAnniversary;
import de.ingrid.utils.IngridHitDetail;
import de.ingrid.utils.udk.UtilsDate;

/**
 * TODO Describe your created type (class, etc.) here.
 * 
 * @author joachim@wemove.com
 */
public class AnniversaryFetcherJob extends IngridMonitorAbstractJob {

    protected final static Logger log = LoggerFactory.getLogger(AnniversaryFetcherJob.class);

    /**
     * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
     */
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();

        startTimer();

        if (log.isDebugEnabled()) {
            log.debug("start job: AnniversaryFetcherJob.");
        }

        int status = 0;
        String statusCode = null;
        try {
            insertIntoDB("de");
            insertIntoDB("en");
            status = STATUS_OK;
            statusCode = STATUS_CODE_NO_ERROR;
        } catch (JobExecutionException e) {
            status = STATUS_ERROR;
            statusCode = STATUS_CODE_ERROR_UNSPECIFIC;
        }
        if (log.isDebugEnabled()) {
            log.debug("finish job: AnniversaryFetcherJob.");
        }
        computeTime(dataMap, stopTimer());
        updateJobData(context, status, statusCode);
        updateJob(context);
    }

    private void insertIntoDB(String lang) throws JobExecutionException {

        Session session = HibernateUtil.currentSession();
        Transaction tx = null;

        try {
            Calendar cal = Calendar.getInstance();
            cal.setTime(new Date());
            int thisYear = cal.get(Calendar.YEAR);
            Date queryDate = cal.getTime();

            Calendar queryDateFrom = Calendar.getInstance();
            queryDateFrom.setTime(queryDate);
            queryDateFrom.set(Calendar.HOUR_OF_DAY, 0);
            queryDateFrom.set(Calendar.MINUTE, 0);
            queryDateFrom.set(Calendar.SECOND, 0);
            queryDateFrom.set(Calendar.MILLISECOND, 0);
            Calendar queryDateTo = Calendar.getInstance();
            queryDateTo.setTime(queryDate);
            queryDateTo.set(Calendar.HOUR_OF_DAY, 23);
            queryDateTo.set(Calendar.MINUTE, 59);
            queryDateTo.set(Calendar.SECOND, 59);
            queryDateTo.set(Calendar.MILLISECOND, 0);
            IngridHitDetail[] details = SNSAnniversaryInterfaceImpl.getInstance().getAnniversaries(queryDate, lang);
            if (details.length > 0) {

                for (int i = 0; i < details.length; i++) {
                    if ((details[i] instanceof DetailedTopic) && details[i].size() > 0) {
                        DetailedTopic detail = (DetailedTopic) details[i];
                        if (log.isDebugEnabled()) {
                            log.debug("Anniversary gefunden! (topic:'" + detail.getTopicID() + "', lang:" + lang
                                    + ")");
                        }
                        // check if theis item already exists
                        tx = session.beginTransaction();
                        List anniversaryList = session.createCriteria(IngridAnniversary.class)
                                .add(Restrictions.eq("topicId", detail.getTopicID()))
                                .add(Restrictions.eq("language", lang)).list();
                        tx.commit();
                        if (anniversaryList.isEmpty()) {
                            IngridAnniversary anni = new IngridAnniversary();
                            anni.setTopicId(detail.getTopicID());
                            anni.setTopicName(detail.getTopicName());
                            String from = detail.getFrom();
                            anni.setDateFrom(from);
                            if (from != null) {
                                // !!! trim, sns date may have white spaces !!! :-(
                                from = from.trim();
                                anni.setDateFrom(from);
                                Date fromDate = UtilsDate.parseDateString(from);
                                cal.setTime(fromDate);
                                if (thisYear == cal.get(Calendar.YEAR)) {
                                    if (log.isDebugEnabled()) {
                                        log.debug("Skip Anniversary for (topic:'" + detail.getTopicID() + "', lang:"
                                                + lang
                                                + ") because the year of the event equals the current year.");
                                    }
                                    break;
                                }
                                anni.setDateFromYear(new Integer(cal.get(Calendar.YEAR)));
                                anni.setDateFromMonth(new Integer(cal.get(Calendar.MONTH) + 1));
                                anni.setDateFromDay(new Integer(cal.get(Calendar.DAY_OF_MONTH)));
                            }
                            String to = detail.getTo();
                            anni.setDateTo(to);
                            if (to != null) {
                                // !!! trim, sns date may have white spaces !!! :-(
                                to = to.trim();
                                anni.setDateTo(to);
                                Date toDate = UtilsDate.parseDateString(to);
                                cal.setTime(toDate);
                                anni.setDateToYear(new Integer(cal.get(Calendar.YEAR)));
                                anni.setDateToMonth(new Integer(cal.get(Calendar.MONTH) + 1));
                                anni.setDateToDay(new Integer(cal.get(Calendar.DAY_OF_MONTH)));
                            }
                            anni.setAdministrativeId(detail.getAdministrativeID());
                            anni.setFetched(new Date());
                            anni.setFetchedFor(queryDate);
                            anni.setLanguage(lang);

                            tx = session.beginTransaction();
                            session.save(anni);
                            tx.commit();
                        }
                    }
                }
            } else {
                if (log.isWarnEnabled()) {
                    log.warn("!!! SNS query: NO Anniversaries found for date = " + queryDate + " !!!");
                }
            }
            // remove old entries
            cal.setTime(new Date());
            cal.add(Calendar.DATE, -7);
            tx = session.beginTransaction();
            List deleteEntries = session.createCriteria(IngridAnniversary.class)
                    .add(Restrictions.lt("fetchedFor", cal.getTime())).list();
            tx.commit();
            Iterator it = deleteEntries.iterator();
            tx = session.beginTransaction();
            while (it.hasNext()) {
                session.delete((IngridAnniversary) it.next());
            }
            tx.commit();

        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            log.error("Error executing quartz job AnniversaryFetcherJob.", e);
            throw new JobExecutionException("Error executing quartz job AnniversaryFetcherJob.", e, false);
        } finally {
            HibernateUtil.closeSession();
        }
    }

}