/* * * Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved. * * This file is part of Entando software. * Entando is a free software; * You can redistribute it and/or modify it * under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2. * * See the file License for the specific language governing permissions * and limitations under the License * * * * Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved. * */ package com.agiletec.plugins.jprssaggregator.aps.system.services.aggregator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Timer; import com.agiletec.aps.system.ApsSystemUtils; import com.agiletec.aps.system.common.AbstractService; import com.agiletec.aps.system.exception.ApsSystemException; import com.agiletec.plugins.jprssaggregator.aps.system.services.aggregator.event.AggregatorItemsChangedEvent; import com.agiletec.plugins.jprssaggregator.aps.system.services.aggregator.event.AggregatorItemsChangedObserver; import org.slf4j.Logger; /** * This Service hendles the notifications for the AggregatorItemsChangedEvent. */ public class RssTimerManager extends AbstractService implements AggregatorItemsChangedObserver { @Override public void init() throws Exception { this.loadMap(); this.startThreads(); ApsSystemUtils.getLogger().debug(this.getClass().getName() + ": initialized. Active tasks: " + this.getTimerTaskMap().size()); } /** * Load the entries stored in the database and creates a new {@link RssTimerTask} for eache one * @throws ApsSystemException */ private void loadMap() throws ApsSystemException { this.setTimerTaskMap(new HashMap<String, RssTimerTask>()); List<ApsAggregatorItem> items = this.getAggregatorManager().getItems(); Iterator<ApsAggregatorItem> it = items.iterator(); while (it.hasNext()) { ApsAggregatorItem item = it.next(); String key = new Integer(item.getCode()).toString(); RssTimerTask timerTask = new RssTimerTask(item, this.getAggregatorManager()); this.getTimerTaskMap().put(key, timerTask); } } @Override public void updateTasks(AggregatorItemsChangedEvent event) { Logger log = ApsSystemUtils.getLogger(); try { if (event.getOperationCode() == AggregatorItemsChangedEvent.INSERT_OPERATION_CODE) { int itemCode = event.getItemCode(); ApsAggregatorItem item = this.getAggregatorManager().getItem(itemCode); RssTimerTask timerTask = new RssTimerTask(item, this.getAggregatorManager()); this.getTimerTaskMap().put(new Integer(itemCode).toString(), timerTask); log.trace("jprssaggregator Created new thread: " + itemCode); this.startThread(new Integer(event.getItemCode()).toString()); } else if (event.getOperationCode() == AggregatorItemsChangedEvent.REMOVE_OPERATION_CODE) { String taskKey = new Integer(event.getItemCode()).toString(); RssTimerTask task = this.getTimerTaskMap().get(taskKey); task.cancel(); this.getTimerTaskMap().remove(taskKey); log.trace("jprssaggregator Removed thread: " + taskKey); } else if (event.getOperationCode() == AggregatorItemsChangedEvent.UPDATE_OPERATION_CODE) { String taskKey = new Integer(event.getItemCode()).toString(); RssTimerTask task = this.getTimerTaskMap().get(taskKey); task.cancel(); this.getTimerTaskMap().remove(taskKey); ApsAggregatorItem item = this.getAggregatorManager().getItem(event.getItemCode()); RssTimerTask timerTask = new RssTimerTask(item, this.getAggregatorManager()); this.getTimerTaskMap().put(new Integer(item.getCode()).toString(), timerTask); log.trace("jprssaggregator Updating thread: " + taskKey); this.startThread(taskKey); } } catch (Throwable t) { ApsSystemUtils.logThrowable(t, this, "updateTasks"); } } @Override public void destroy() { super.destroy(); try { this.getTimer().cancel(); this.getTimer().purge(); this.setTimer(null); Iterator<RssTimerTask> it = this.getTimerTaskMap().values().iterator(); while (it.hasNext()) { RssTimerTask task = it.next(); task.cancel(); } } catch (Throwable t) { ApsSystemUtils.logThrowable(t, this, "destroy"); } } /** * Starts all the tasks */ public void startThreads() { try { this.resetTimer(); Iterator<String> it = this.getTimerTaskMap().keySet().iterator(); while (it.hasNext()) { String taskId = it.next(); this.startThread(taskId); } } catch (Throwable t) { ApsSystemUtils.logThrowable(t, this, "startThreads"); throw new RuntimeException(t); } } /** * Starts a task by the code * @param taskId the code of the task */ private void startThread(String taskId) { ApsSystemUtils.getLogger().trace("jprssaggregator Starting thread: " + taskId); try { RssTimerTask task = (RssTimerTask) this.getTimerTaskMap().get(taskId); ApsAggregatorItem item = task.getItem(); long delay = new Long(item.getDelay()).longValue(); this.getTimer().schedule(task, 0, delay * 1000); } catch (Throwable t) { ApsSystemUtils.logThrowable(t, this, "startThread " + taskId); throw new RuntimeException(t); } } /** * Resets all the tasks */ private void resetTimer() { if (null != getTimer()) { this.getTimer().cancel(); this.getTimer().purge(); this.setTimer(null); } this.setTimer(new Timer()); } public void setAggregatorManager(IAggregatorManager aggregatorManager) { this._aggregatorManager = aggregatorManager; } protected IAggregatorManager getAggregatorManager() { return _aggregatorManager; } public void setTimer(Timer timer) { this._timer = timer; } public Timer getTimer() { return _timer; } public void setTimerTaskMap(Map<String, RssTimerTask> timerTaskMap) { this._timerTaskMap = timerTaskMap; } public Map<String, RssTimerTask> getTimerTaskMap() { return _timerTaskMap; } private Map<String, RssTimerTask> _timerTaskMap; private IAggregatorManager _aggregatorManager; private Timer _timer; }