/** * Copyright (C) 2001-2017 by RapidMiner and the contributors * * Complete list of developers available at our web site: * * http://rapidminer.com * * This program is free software: you can redistribute it and/or modify it under the terms of the * GNU Affero 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 * Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License along with this program. * If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.gui.tools.logging; import java.util.LinkedList; import java.util.List; import java.util.Locale; import com.rapidminer.gui.tools.Registry; import com.rapidminer.gui.tools.RegistryEvent; import com.rapidminer.gui.tools.RegistryEvent.RegistryEventType; import com.rapidminer.gui.tools.RegistryListener; /** * Registry for {@link LogModel}s which informs {@link RegistryListener} that {@link LogModel}s * (un)registered. The {@link LogModelRegistry} creates the default model. * * @author Sabrina Kirstein, Marco Boeck * */ public enum LogModelRegistry implements Registry<LogModel> { /** The singleton instance which is created by the JVM */ INSTANCE; /** all registered {@link LogModel}s */ private List<LogModel> registeredLogModels; /** all registered listeners which are notified when a model is added/removed */ private List<RegistryListener<LogModel>> registeredListener; private static final Object LOCK_MODELS = new Object(); private static final Object LOCK_LISTENER = new Object(); private LogModelRegistry() { registeredLogModels = new LinkedList<>(); registeredListener = new LinkedList<>(); } /** * Registers the specified {@link LogModel}. If a model with the same name (case insensitive) * has already been registered, throws an {@link IllegalArgumentException}. * * @param logModel * the model to be registered * @throws IllegalArgumentException * if a model with the same name (ignores case) is already registered */ @Override public void register(LogModel logModel) throws IllegalArgumentException { if (logModel == null) { throw new IllegalArgumentException("logModel must not be null!"); } synchronized (LOCK_MODELS) { for (LogModel model : registeredLogModels) { if (model.getName().toLowerCase(Locale.ENGLISH).equals(logModel.getName().toLowerCase(Locale.ENGLISH))) { throw new IllegalArgumentException("logModel with name '" + logModel.getName() + "' already registered!"); } } registeredLogModels.add(logModel); } // notify listeners of new model notifyListener(logModel, RegistryEventType.REGISTERED); } /** * See {@link Registry#unregister(Object)}. Note that a {@link LogModel} which is not closable * will not be unregistered! * * @throws IllegalArgumentException * if {@link LogModel#isClosable()} returns <code>false</code> */ @Override public void unregister(LogModel logModel) throws IllegalArgumentException { if (logModel == null) { throw new IllegalArgumentException("logModel must not be null!"); } boolean removed; synchronized (LOCK_MODELS) { removed = registeredLogModels.remove(logModel); } // notify listeners of removed model if (removed) { notifyListener(logModel, RegistryEventType.UNREGISTERED); } } @Override public void registerListener(RegistryListener<LogModel> listener) { if (listener == null) { throw new IllegalArgumentException("listener must not be null!"); } registeredListener.add(listener); } @Override public void unregisterListener(RegistryListener<LogModel> listener) { if (listener == null) { throw new IllegalArgumentException("listener must not be null!"); } if (registeredListener.contains(listener)) { registeredListener.remove(listener); } } /** * Returns all registered {@link LogModel}s. * * @return */ @Override public List<LogModel> getRegisteredObjects() { synchronized (LOCK_MODELS) { return new LinkedList<>(registeredLogModels); } } /** * Notifies all listeners of a registered/unregistered event. * * @param logModel * the log model which was registered/unregistered * @param type * the event type */ private void notifyListener(LogModel logModel, RegistryEventType type) { if (logModel == null) { throw new IllegalArgumentException("logModel must not be null!"); } if (type == null) { throw new IllegalArgumentException("type must not be null!"); } synchronized (LOCK_LISTENER) { for (RegistryListener<LogModel> listener : registeredListener) { listener.eventTriggered(new RegistryEvent<>(this, type, logModel)); } } } }