/* * Copyright (c) NASK, NCSC * * This file is part of HoneySpider Network 2.1. * * This is a free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even 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, see <http://www.gnu.org/licenses/>. */ package pl.nask.hsn2.framework.workflow.job; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; /** * This is simple implementation of <code>TasksStatistics</code>. * * This implementation is thread-safe. * * */ public final class DefaultTasksStatistics implements TasksStatistics { private static final long serialVersionUID = -7519026458956122916L; /** * Internal map of running tasks. */ private ConcurrentMap<String, AtomicInteger> started = new ConcurrentHashMap<String, AtomicInteger>(); /** * Internal map of finished tasks. */ private ConcurrentMap<String, AtomicInteger> finished = new ConcurrentHashMap<String, AtomicInteger>(); private AtomicInteger subprocessesStarted = new AtomicInteger(); private AtomicInteger freeTasksBufferCount = new AtomicInteger(); private AtomicInteger waitingTasksRequestsCount = new AtomicInteger(); public DefaultTasksStatistics() { freeTasksBufferCount.set(-1); waitingTasksRequestsCount.set(-1); } @Override public final Map<String, Integer> getStarted() { return getValues(started); } @Override public final Map<String, Integer> getFinished() { return getValues(finished); } @Override public final void taskStarted(String taskName) { inc(taskName, started); } @Override public final void taskCompleted(String taskName) { inc(taskName, finished); } private void inc(String taskName, ConcurrentMap<String, AtomicInteger> src) { AtomicInteger counter = src.putIfAbsent(taskName, new AtomicInteger(1)); if (counter != null) counter.incrementAndGet(); } private Map<String, Integer> getValues(ConcurrentMap<String, AtomicInteger> src) { Map<String, Integer> map = new HashMap<String, Integer>(); for (Map.Entry<String, AtomicInteger> entry : src.entrySet()) { map.put(entry.getKey(), entry.getValue().get()); } return map; } @Override public void subprocessStarted() { subprocessesStarted.incrementAndGet(); } @Override public int getSubprocessesStarted() { return subprocessesStarted.get(); } @Override public int getFreeTaskBufferSpacesCount() { return freeTasksBufferCount.get(); } @Override public int getWaitingTasksRequestCount() { return waitingTasksRequestsCount.get(); } @Override public synchronized void updateSuppressorStats(int freeBufferSpaces, int waitingTasksNumber) { freeTasksBufferCount.set(freeBufferSpaces); waitingTasksRequestsCount.set(waitingTasksNumber); } }