/*********************************************************************************** * * Copyright (c) 2014 Kamil Baczkowicz * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v1.0 which accompany this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * * Kamil Baczkowicz - initial API and implementation and/or initial documentation * */ package pl.baczkowicz.spy.storage; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Class for storing received messages. */ public class MessageList<T> { final static Logger logger = LoggerFactory.getLogger(MessageList.class); public static final int DEFAULT_MAX_SIZE = 5000; public static final int DEFAULT_MIN_MESSAGES_PER_TOPIC = 10; private final List<T> messages; private final int maxSize; private final String name; private final int preferredSize; public MessageList(final int preferredSize, final int maxSize, final String name) { this.name = name; this.preferredSize = preferredSize; this.maxSize = maxSize; this.messages = Collections.synchronizedList(new ArrayList<T>()); } public void clear() { synchronized (messages) { messages.clear(); } } public T add(final T message) { T removed = null; synchronized (messages) { if (isMaxSize()) { // logger.trace("[{}] Buffer full = {}. Removing message on {}; payload = {}", name, maxSize, message.getTopic(), message.getFormattedPayload()); removed = messages.remove(messages.size() - 1); // logger.trace("[{}] Store update = {}/{}/{}", name, messages.size(), preferredSize, maxSize); } // Store the message messages.add(0, message); if (logger.isTraceEnabled() && !name.contains("stats")) { logger.trace("[{}] Store update = {}/{}/{}/{}", name, messages.size(), preferredSize, maxSize, this); } return removed; } } public T remove(final int index) { T removed = null; synchronized (messages) { removed = messages.remove(index); // logger.trace("[{}] Store update = {}/{}/{}", name, messages.size(), preferredSize, maxSize); } return removed; } public boolean isMaxSize() { synchronized (messages) { return messages.size() >= maxSize; } } public boolean exceedingPreferredSize() { synchronized (messages) { return messages.size() > preferredSize; } } public List<T> getMessages() { return messages; } public int getPreferredSize() { return preferredSize; } public int getMaxSize() { return maxSize; } public String getName() { return name; } }