package sk.stuba.fiit.perconik.activity.preferences;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableList.Builder;
import com.gratex.perconik.uaca.preferences.UacaPreferences;
import sk.stuba.fiit.perconik.activity.listeners.ActivityListener.LoggingOptions;
import sk.stuba.fiit.perconik.activity.listeners.ActivityListener.PersistenceOptions;
import sk.stuba.fiit.perconik.activity.listeners.ActivityListener.ProbingOptions;
import sk.stuba.fiit.perconik.activity.plugin.Activator;
import sk.stuba.fiit.perconik.elasticsearch.preferences.ElasticsearchPreferences;
import sk.stuba.fiit.perconik.preferences.AbstractObjectPreferences;
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 sk.stuba.fiit.perconik.activity.plugin.Activator.PLUGIN_ID;
import static sk.stuba.fiit.perconik.activity.preferences.ActivityPreferences.Keys.listenerDefaultOptions;
import static sk.stuba.fiit.perconik.core.plugin.Activator.classResolver;
import static sk.stuba.fiit.perconik.preferences.AbstractPreferences.Keys.join;
import static sk.stuba.fiit.perconik.utilities.MorePreconditions.checkNotNullAsState;
import static sk.stuba.fiit.perconik.utilities.configuration.Configurables.compound;
import static sk.stuba.fiit.perconik.utilities.configuration.Configurables.defaults;
/**
* Activity preferences. Supports both <i>default</i>
* and <i>configuration</i> (actually used and stored) scopes.
*
* @author Pavol Zbell
* @since 1.0
*/
public final class ActivityPreferences extends AbstractObjectPreferences {
static final String qualifier = join(PLUGIN_ID, "preferences");
private ActivityPreferences(final Scope scope) {
super(scope, qualifier, classResolver());
}
/**
* Used to aid in default activity 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 activity 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() {
ActivityPreferences preferences = ActivityPreferences.getDefault();
preferences.setListenerDefaultOptions(defaultOptions());
}
}
public static final class Keys extends AbstractPreferences.Keys {
public static final String listenerDefaultOptions = join(qualifier, "listeners", "defaultOptions");
}
/**
* Gets default scoped core preferences.
*/
public static ActivityPreferences getDefault() {
return new ActivityPreferences(Scope.DEFAULT);
}
/**
* Gets configuration scoped core preferences.
*/
public static ActivityPreferences getShared() {
return new ActivityPreferences(Scope.CONFIGURATION);
}
static Options defaultOptions() {
Builder<Options> builder = ImmutableList.builder();
builder.add(defaults(ProbingOptions.Schema.class));
builder.add(defaults(PersistenceOptions.Schema.class));
builder.add(defaults(LoggingOptions.Schema.class));
builder.add(ElasticsearchPreferences.getShared());
builder.add(UacaPreferences.getShared());
return compound(builder.build());
}
private static void reportFailure(final Throwable failure) {
Activator.defaultInstance().getConsole().error(failure, toString(failure));
}
/**
* Sets default activity listener options.
* @param options default activity listener options
* @throws ClassCastException if options type is invalid
* @throws NullPointerException if options is {@code null}
*/
public void setListenerDefaultOptions(final Options options) {
try {
this.putObject(listenerDefaultOptions, checkNotNull(options));
} catch (RuntimeException e) {
reportFailure(e);
}
}
/**
* Gets default activity listener options.
* @throws ClassCastException if options type is invalid
* @throws IllegalStateException if options is {@code null}
*/
public Options getListenerDefaultOptions() {
if (this.scope() == Scope.DEFAULT) {
return checkNotNullAsState(defaultOptions());
}
try {
return Options.class.cast(checkNotNullAsState(this.getObject(listenerDefaultOptions)));
} catch (RuntimeException e) {
reportFailure(e);
Options options = checkNotNullAsState(defaultOptions());
this.setListenerDefaultOptions(options);
try {
this.synchronize();
} catch (RuntimeException x) {
reportFailure(x);
}
return options;
}
}
}