package org.limewire.setting;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.Executor;
import org.limewire.concurrent.ExecutorsHelper;
import org.limewire.setting.evt.SettingsGroupManagerEvent;
import org.limewire.setting.evt.SettingsGroupManagerListener;
import org.limewire.setting.evt.SettingsGroupManagerEvent.EventType;
/**
* Groups all {@link SettingsGroup} objects in one location to reload, revert to
* a default value, save, or mark as save-able all <code>Settings</code>
* objects at once.
*/
public final class SettingsGroupManager {
/**
* The singleton instance of SettingsHandler.
*/
private static final SettingsGroupManager INSTANCE = new SettingsGroupManager();
/**
* Returns the singleton instance of the SettingsHandler.
*/
public static SettingsGroupManager instance() {
return INSTANCE;
}
/**
* A list of Settings this SettingsHandler is managing.
*/
private final Collection<SettingsGroup> PROPS = Collections.synchronizedList(new ArrayList<SettingsGroup>());
/**
* A list of {@link SettingsGroupManagerListener}s.
*/
private Collection<SettingsGroupManagerListener> listeners;
/**
* The Executor for the Events.
*/
private final Executor executor = ExecutorsHelper.newFixedSizeThreadPool(1, "SettingsHandlerEventDispatcher");
// never instantiate this class.
private SettingsGroupManager() {}
/**
* Registers a {@link SettingsGroupManagerListener}.
*/
public void addSettingsHandlerListener(SettingsGroupManagerListener l) {
if (l == null) {
throw new NullPointerException("SettingsGroupManagerListener is null");
}
synchronized (this) {
if (listeners == null) {
listeners = new ArrayList<SettingsGroupManagerListener>();
}
listeners.add(l);
}
}
/**
* Removes a {@link SettingsGroupManagerListener}.
*/
public void removeSettingsHandlerListener(SettingsGroupManagerListener l) {
if (l == null) {
throw new NullPointerException("SettingsGroupManagerListener is null");
}
synchronized (this) {
if (listeners != null) {
listeners.remove(l);
if (listeners.isEmpty()) {
listeners = null;
}
}
}
}
/**
* Returns all {@link SettingsGroupManagerListener}s or null if there are none.
*/
public SettingsGroupManagerListener[] getSettingsHandlerListeners() {
synchronized (this) {
if (listeners == null) {
return null;
}
return listeners.toArray(new SettingsGroupManagerListener[listeners.size()]);
}
}
/**
* Adds a settings class to the list of factories that
* this handler will act upon.
*/
public void addSettingsGroup(SettingsGroup group) {
PROPS.add(group);
fireSettingsHandlerEvent(EventType.SETTINGS_GROUP_ADDED, group);
}
/**
* Removes a settings class from the list of factories that
* this handler will act upon.
*/
public void removeSettingsGroup(SettingsGroup group) {
if (PROPS.remove(group)) {
fireSettingsHandlerEvent(EventType.SETTINGS_GROUP_REMOVED, group);
}
}
/**
* Returns all {@link SettingsGroup}s that are currently registered.
*/
public SettingsGroup[] getSettingsGroups() {
return PROPS.toArray(new SettingsGroup[PROPS.size()]);
}
/**
* Reload settings from both the property and configuration files.
*/
public void reload() {
synchronized (PROPS) {
for (SettingsGroup group : PROPS) {
group.reload();
}
}
fireSettingsHandlerEvent(EventType.RELOAD, null);
}
/**
* Save property settings to the property file.
*/
public boolean save() {
boolean any = false;
synchronized (PROPS) {
for (SettingsGroup group : PROPS) {
any |= group.save();
}
}
if (any) {
fireSettingsHandlerEvent(EventType.SAVE, null);
}
return any;
}
/**
* Revert all settings to their default value.
*/
public boolean revertToDefault() {
boolean any = false;
synchronized (PROPS) {
for (SettingsGroup group : PROPS) {
any |= group.revertToDefault();
}
}
if (any) {
fireSettingsHandlerEvent(EventType.REVERT_TO_DEFAULT, null);
}
return any;
}
/**
* Mutator for shouldSave.
*/
public void setShouldSave(boolean shouldSave) {
synchronized (PROPS) {
for (SettingsGroup group : PROPS) {
group.setShouldSave(shouldSave);
}
}
fireSettingsHandlerEvent(EventType.SHOULD_SAVE, null);
}
/**
* Fires a SettingsHandlerEvent.
*/
protected void fireSettingsHandlerEvent(EventType type, SettingsGroup group) {
fireSettingsHandlerEvent(new SettingsGroupManagerEvent(type, this, group));
}
/**
* Fires a SettingsHandlerEvent.
*/
protected void fireSettingsHandlerEvent(final SettingsGroupManagerEvent evt) {
if (evt == null) {
throw new NullPointerException("SettingsHandlerEvent is null");
}
final SettingsGroupManagerListener[] listeners = getSettingsHandlerListeners();
if (listeners != null) {
Runnable command = new Runnable() {
public void run() {
for (SettingsGroupManagerListener l : listeners) {
l.handleGroupManagerEvent(evt);
}
}
};
execute(command);
}
}
/**
* Fires a event on the Executor Thread.
*/
protected void execute(Runnable evt) {
executor.execute(evt);
}
}