package sk.stuba.fiit.perconik.core.preferences;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import sk.stuba.fiit.perconik.core.Listener;
import sk.stuba.fiit.perconik.core.persistence.data.ListenerPersistenceData;
import sk.stuba.fiit.perconik.preferences.AbstractPreferences;
import sk.stuba.fiit.perconik.utilities.configuration.Options;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Maps.newHashMap;
import static sk.stuba.fiit.perconik.core.preferences.ListenerPreferences.Keys.configuration;
import static sk.stuba.fiit.perconik.core.preferences.ListenerPreferences.Keys.persistence;
import static sk.stuba.fiit.perconik.core.preferences.plugin.Activator.PLUGIN_ID;
import static sk.stuba.fiit.perconik.preferences.AbstractPreferences.Keys.join;
/**
* Listener preferences. Supports both <i>default</i>
* and <i>configuration</i> (actually used and stored) scopes.
*
* @author Pavol Zbell
* @since 1.0
*/
public final class ListenerPreferences extends RegistrationWithOptionPreferences<ListenerPersistenceData, Class<? extends Listener>> {
static final String qualifier = join(PLUGIN_ID, "listeners");
private ListenerPreferences(final Scope scope) {
super(scope, qualifier);
}
/**
* Used to aid in default listener preferences initialization.
*
* <p><b>Warning:</b> Users should not explicitly instantiate this class.
*
* @author Pavol Zbell
* @since 1.0
*/
public static final class Initializer extends AbstractPreferences.Initializer {
/**
* The constructor.
*/
public Initializer() {}
/**
* Called by the preference initializer to
* initialize default listener preferences.
*
* <p><b>Warning:</b> Clients should not call this method.
* It will be called automatically by the preference initializer
* when the appropriate default preference node is accessed.
*/
@Override
public void initializeDefaultPreferences() {
ListenerPreferences preferences = ListenerPreferences.getDefault();
preferences.setListenerPersistenceData(preferences.getDefaultRegistrations());
preferences.setListenerConfigurationData(preferences.getDefaultOptions());
}
}
public static final class Keys extends AbstractPreferences.Keys {
public static final String persistence = join(qualifier, "persistence");
public static final String configuration = join(qualifier, "configuration");
}
/**
* Gets default scoped core preferences.
*/
public static ListenerPreferences getDefault() {
return new ListenerPreferences(Scope.DEFAULT);
}
/**
* Gets configuration scoped core preferences.
*/
public static ListenerPreferences getShared() {
return new ListenerPreferences(Scope.CONFIGURATION);
}
@Override
Set<ListenerPersistenceData> castRegistrations(final Object object) {
Set<ListenerPersistenceData> registrations = Set.class.cast(checkNotNull(object));
for (Object element: registrations) {
ListenerPersistenceData.class.cast(checkNotNull(element));
}
return registrations;
}
@Override
Map<Class<? extends Listener>, Options> castOptions(final Object object) {
Map<Class<? extends Listener>, Options> options = Map.class.cast(checkNotNull(object));
for (Entry<Class<? extends Listener>, Options> entry: options.entrySet()) {
Class.class.cast(checkNotNull(entry.getKey())).asSubclass(Listener.class);
Options.class.cast(checkNotNull(entry.getValue()));
}
return options;
}
/**
* Sets listener persistence data.
* @param data listener persistence data
* @throws ClassCastException if {@code data} contain invalid types
* @throws NullPointerException if {@code data} contain {@code null} references
*/
public void setListenerPersistenceData(final Set<ListenerPersistenceData> data) {
this.setRegistrations(persistence, data);
}
/**
* Sets listener configuration data.
* @param data listener configuration data
* @throws ClassCastException if {@code data} contain invalid types
* @throws NullPointerException if {@code data} contain {@code null} references
*/
public void setListenerConfigurationData(final Map<Class<? extends Listener>, Options> data) {
this.setOptions(configuration, data);
}
/**
* Gets listener persistence data.
* @throws ClassCastException if data contain invalid types
* @throws IllegalStateException if data contain {@code null} references
*/
public Set<ListenerPersistenceData> getListenerPersistenceData() {
return this.getRegistrations(persistence);
}
/**
* Gets listener configuration data.
* @throws ClassCastException if data contain invalid types
* @throws IllegalStateException if data contain {@code null} references
*/
public Map<Class<? extends Listener>, Options> getListenerConfigurationData() {
return this.getOptions(configuration);
}
@Override
Set<ListenerPersistenceData> getDefaultRegistrations() {
return ListenerPersistenceData.defaults();
}
@Override
Map<Class<? extends Listener>, Options> getDefaultOptions() {
Map<Class<? extends Listener>, Options> options = newHashMap();
for (ListenerPersistenceData data: this.getDefaultRegistrations()) {
this.putDefaultOptionsIfPresent(options, data.getListenerClass(), data.getListener());
}
return options;
}
}