Package org.infoglue.cms.jobs

Source Code of org.infoglue.cms.jobs.SubscriptionsJob

/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
*  Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/
package org.infoglue.cms.jobs;

import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.infoglue.cms.applications.common.VisualFormatter;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentController;
import org.infoglue.cms.controllers.kernel.impl.simple.InfoGluePrincipalControllerProxy;
import org.infoglue.cms.controllers.kernel.impl.simple.InterceptionPointController;
import org.infoglue.cms.controllers.kernel.impl.simple.InterceptorController;
import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeController;
import org.infoglue.cms.controllers.kernel.impl.simple.UserControllerProxy;
import org.infoglue.cms.entities.content.ContentVO;
import org.infoglue.cms.entities.management.InterceptionPointVO;
import org.infoglue.cms.entities.management.InterceptorVO;
import org.infoglue.cms.entities.structure.SiteNodeVO;
import org.infoglue.cms.exception.Bug;
import org.infoglue.cms.exception.ConstraintException;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.interceptors.SubscriptionsInterceptor;
import org.infoglue.cms.security.InfoGluePrincipal;
import org.infoglue.cms.security.interceptors.InfoGlueInterceptor;
import org.infoglue.cms.util.CmsPropertyHandler;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import com.opensymphony.module.propertyset.PropertySet;
import com.opensymphony.module.propertyset.PropertySetManager;

/**
* @author mattias
*
* This jobs searches for expiring contents or sitenodes and clears caches if found.
*/

public class SubscriptionsJob implements Job
{
    private final static Logger logger = Logger.getLogger(SubscriptionsJob.class.getName());
    private final static VisualFormatter vf = new VisualFormatter();
   
    public synchronized void execute(JobExecutionContext context) throws JobExecutionException
    {
      logger.info("*********************************************************************");
      logger.info("* Starting job which sends subscriptions when conditions are met    *");
      logger.info("*********************************************************************");
   
      InfoGluePrincipalControllerProxy.getController().getTestPrincipal();
     
    try
    {
      logger.info("SubscriptionsJob...");
       
      Map args = new HashMap();
        args.put("globalKey", "infoglueSubscriptions");
        PropertySet ps = PropertySetManager.getInstance("jdbc", args);

        int numberOfDays = 30;
       
        cleanPropertySet(ps, numberOfDays);
       
        handleExpirationEvents(ps, numberOfDays);
       
        SubscriptionsInterceptor interceptor = new SubscriptionsInterceptor();
        List<SubscriptionsInterceptor.TransactionQueueVO> processedTransactions = interceptor.processTransactionQueue();

        registerDoneSubscriptionProcessing(ps, numberOfDays, processedTransactions);
       
      logger.info("SubscriptionsJob ended...");
       
    }
    catch(Exception e)
      {
        logger.error("Could not notify subscribers: " + e.getMessage());
      }
    
       logger.info("Refresh-job finished");
    }


  private void registerDoneSubscriptionProcessing(PropertySet ps, int numberOfDays, List<SubscriptionsInterceptor.TransactionQueueVO> processedTransactions)
  {
    Iterator<SubscriptionsInterceptor.TransactionQueueVO> processedTransactionsIterator = processedTransactions.iterator();
    while(processedTransactionsIterator.hasNext())
    {
      SubscriptionsInterceptor.TransactionQueueVO transactionQueueVO = processedTransactionsIterator.next();
      if(transactionQueueVO.getInterceptionPointVO().getName().equalsIgnoreCase("Content.ExpireDateComingUp"))
      {
        String key = "content_" + transactionQueueVO.getTransactionObjectId() + "_" + numberOfDays + "_days_isProcessed";
        logger.info("Setting key so we don't get the same warning again: " + key);
          ps.setString(key, vf.formatDate(new Date(), "yyyy-MM-dd"));
      }
      else if(transactionQueueVO.getInterceptionPointVO().getName().equalsIgnoreCase("SiteNode.ExpireDateComingUp"))
      {
        String key = "siteNode_" + transactionQueueVO.getTransactionObjectId() + "_" + numberOfDays + "_days_isProcessed";
        logger.info("Setting key so we don't get the same warning again: " + key);
          ps.setString(key, vf.formatDate(new Date(), "yyyy-MM-dd"));
      }
    }
  }


  private void handleExpirationEvents(PropertySet ps, int numberOfDays) throws Exception, ConstraintException, SystemException, Bug
  {
    List<SiteNodeVO> upcomingSiteNodes = SiteNodeController.getController().getUpcomingExpiringSiteNodes(numberOfDays);
    Iterator<SiteNodeVO> upcomingSiteNodesIterator = upcomingSiteNodes.iterator();
    while(upcomingSiteNodesIterator.hasNext())
    {
      SiteNodeVO siteNodeVO = upcomingSiteNodesIterator.next();
      logger.info("siteNodeVO:" + siteNodeVO.getName() + " - " + siteNodeVO.getExpireDateTime());
      String key = "siteNode_" + siteNodeVO.getId() + "_" + numberOfDays + "_days_isProcessed";
      logger.info("key:" + key);
      String isProcessed = ps.getString(key);
        if(isProcessed == null || isProcessed.equals(""))
        {
          logger.info("The node " + siteNodeVO.getName() + " has not been processed.");
         
          Map data = new HashMap();
          data.put("siteNodeVO", siteNodeVO);
         
          intercept(data, "SiteNode.ExpireDateComingUp");
        }
    }
   
    List upcomingContents = ContentController.getContentController().getUpcomingExpiringContents(numberOfDays);
    Iterator<ContentVO> upcomingContentIterator = upcomingContents.iterator();
    while(upcomingContentIterator.hasNext())
    {
      ContentVO contentVO = upcomingContentIterator.next();
      logger.info("contentVO:" + contentVO.getName() + " - " + contentVO.getExpireDateTime());
      String key = "content_" + contentVO.getId() + "_" + numberOfDays + "_days_isProcessed";
      logger.info("key:" + key);
      String dateProcessed = ps.getString(key);
        if(dateProcessed == null || dateProcessed.equals(""))
        {
          logger.info("The node " + contentVO.getName() + " has not been processed.");
         
          Map data = new HashMap();
          data.put("contentVO", contentVO);
         
          intercept(data, "Content.ExpireDateComingUp");
        }
    }
  }


  private void cleanPropertySet(PropertySet ps, int numberOfDays)
  {
    Collection keys = ps.getKeys(null);
    Iterator keysIterator = keys.iterator();
    while(keysIterator.hasNext())
    {
      String key = (String)keysIterator.next();
      String value = ps.getString(key);
      logger.info("Found key:" + key + "=" + value);
      Date lastDate = vf.parseDate(value, "yyyy-MM-dd");
      Calendar removeDate = Calendar.getInstance();
      removeDate.add(Calendar.DAY_OF_YEAR, -(numberOfDays+10));
      if(lastDate.before(removeDate.getTime()))
      {
        logger.info("Removing key:" + key);
        ps.remove(key);
      }         
    }
  }
   
   
    protected void intercept(Map hashMap, String InterceptionPointName) throws ConstraintException, SystemException, Bug, Exception
  {
      InfoGluePrincipal principal = UserControllerProxy.getController().getUser(CmsPropertyHandler.getAdministratorUserName());
    InterceptionPointVO interceptionPointVO = InterceptionPointController.getController().getInterceptionPointVOWithName(InterceptionPointName);
     
    if(interceptionPointVO == null)
      throw new SystemException("The InterceptionPoint " + InterceptionPointName + " was not found. The system will not work unless you restore it.");

    List interceptors = InterceptorController.getController().getInterceptorsVOList(interceptionPointVO.getInterceptionPointId());
    Iterator interceptorsIterator = interceptors.iterator();
    while(interceptorsIterator.hasNext())
    {
      InterceptorVO interceptorVO = (InterceptorVO)interceptorsIterator.next();
      logger.info("Adding interceptorVO:" + interceptorVO.getName());
      try
      {
        InfoGlueInterceptor infoGlueInterceptor = (InfoGlueInterceptor)Class.forName(interceptorVO.getClassName()).newInstance();
        infoGlueInterceptor.setInterceptorVO(interceptorVO);
        infoGlueInterceptor.intercept(principal, interceptionPointVO, hashMap, false);
      }
      catch(ClassNotFoundException e)
      {
        logger.warn("The interceptor " + interceptorVO.getClassName() + "was not found: " + e.getMessage(), e);
      }
    }

  }
}
TOP

Related Classes of org.infoglue.cms.jobs.SubscriptionsJob

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.