/******************************************************************************* * Copyright (c) 2009, 2010 Progress Software Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ package org.fusesource.tools.messaging; import java.util.ArrayList; import java.util.List; import org.fusesource.tools.messaging.core.IListener; import org.fusesource.tools.messaging.core.IMessageChangeListener; import org.fusesource.tools.messaging.core.IMessagesManager; import org.fusesource.tools.messaging.preference.BasePreferenceHandler; import org.fusesource.tools.messaging.preference.PreferenceChangedListener; import org.fusesource.tools.messaging.preference.PreferenceEvent; /** * Default Implementation of IMessagesManager */ public class DefaultMessagesManager implements IMessagesManager, PreferenceChangedListener { private final List<MessageEvent> receivedMsgs; private final List<IMessageChangeListener> subscribers = new ArrayList<IMessageChangeListener>(); private int historyCount = IConstants.DEFAULT_MESSAGES_HISTORY_COUNT; public DefaultMessagesManager(IListener listener) { receivedMsgs = new ArrayList<MessageEvent>(); initHistoryCount(); addPreferenceChangeListener(); } private void addPreferenceChangeListener() { BasePreferenceHandler.getInstance().addPreferenceChangedListener(this); } private void initHistoryCount() { try { historyCount = new Integer(BasePreferenceHandler.getInstance().getPreferenceValue( IConstants.MESSAGES_HISTORY_COUNT)).intValue(); } catch (NumberFormatException e) { e.printStackTrace(); } } public void messageEvent(MessageEvent me) { addNewMessage(me); } public synchronized void addNewMessage(MessageEvent me) { if (receivedMsgs.size() == historyCount) { removeMessage(receivedMsgs.get(0)); } receivedMsgs.add(me); fireEvents(me, IMessageChangeListener.MESSAGE_ADDED); } public synchronized void clearAllMessages() { List<MessageEvent> msgList = new ArrayList<MessageEvent>(receivedMsgs); receivedMsgs.clear(); fireClearAllEvent(msgList); } public synchronized void removeMessage(MessageEvent me) { receivedMsgs.remove(me); fireEvents(me, IMessageChangeListener.MESSAGE_REMOVED); } public synchronized int getMessagesCount(int flag) { int count = 0; for (MessageEvent message : receivedMsgs) { if (hasFlag(message, flag)) { count++; } } return count; } public int getTotalMessagesCount() { return receivedMsgs.size(); } public List<MessageEvent> getMessages() { return receivedMsgs; } public void fireEvents(MessageEvent me, int eventKind) { List<IMessageChangeListener> changeListeners = getListeners(); for (IMessageChangeListener subscriber : changeListeners) { subscriber.messageChangeEvent(me, eventKind); } } private void fireClearAllEvent(List<MessageEvent> msgList) { List<IMessageChangeListener> changeListeners = getListeners(); for (IMessageChangeListener messageChangeListener : changeListeners) { messageChangeListener.messagesClearedEvent(msgList); } } private List<IMessageChangeListener> getListeners() { List<IMessageChangeListener> changeListeners; synchronized (subscribers) { changeListeners = new ArrayList<IMessageChangeListener>(subscribers); } return changeListeners; } public void addMessageChangeListener(IMessageChangeListener newMsgListener) { synchronized (subscribers) { subscribers.add(newMsgListener); } } public void removeMessageChangeListener(IMessageChangeListener newMsgListener) { synchronized (subscribers) { subscribers.remove(newMsgListener); } } public boolean hasFlag(MessageEvent me, int checkFlag) { return (me.getFlag() == checkFlag) ? true : false; } public synchronized void resetFlag(MessageEvent me, int newFlag) { me.setFlag(newFlag); fireEvents(me, newFlag); } public void valueChanged(PreferenceEvent event) { if (IConstants.MESSAGES_HISTORY_COUNT.equals(event.getKey())) { initHistoryCount(); updateMessagesList(); } } private synchronized void updateMessagesList() { if (receivedMsgs.size() > historyCount) { int toRemove = receivedMsgs.size() - historyCount; List<MessageEvent> tobeRemovedMsgs = new ArrayList<MessageEvent>(receivedMsgs.subList(0, toRemove)); for (MessageEvent messageEvent : tobeRemovedMsgs) { removeMessage(messageEvent); } } } }