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.persistence.data.ResourcePersistenceData; 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.ResourcePreferences.Keys.configuration; import static sk.stuba.fiit.perconik.core.preferences.ResourcePreferences.Keys.persistence; import static sk.stuba.fiit.perconik.core.preferences.plugin.Activator.PLUGIN_ID; import static sk.stuba.fiit.perconik.preferences.AbstractPreferences.Keys.join; /** * Resource preferences. Supports both <i>default</i> * and <i>configuration</i> (actually used and stored) scopes. * * @author Pavol Zbell * @since 1.0 */ public final class ResourcePreferences extends RegistrationWithOptionPreferences<ResourcePersistenceData, String> { static final String qualifier = join(PLUGIN_ID, "resources"); private ResourcePreferences(final Scope scope) { super(scope, qualifier); } /** * Used to aid in default resource 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 resource 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() { ResourcePreferences preferences = ResourcePreferences.getDefault(); preferences.setResourcePersistenceData(preferences.getDefaultRegistrations()); preferences.setResourceConfigurationData(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 ResourcePreferences getDefault() { return new ResourcePreferences(Scope.DEFAULT); } /** * Gets configuration scoped core preferences. */ public static ResourcePreferences getShared() { return new ResourcePreferences(Scope.CONFIGURATION); } @Override Set<ResourcePersistenceData> castRegistrations(final Object object) { Set<ResourcePersistenceData> registrations = Set.class.cast(checkNotNull(object)); for (Object element: registrations) { ResourcePersistenceData.class.cast(checkNotNull(element)); } return registrations; } @Override Map<String, Options> castOptions(final Object object) { Map<String, Options> options = Map.class.cast(checkNotNull(object)); for (Entry<String, Options> entry: options.entrySet()) { String.class.cast(checkNotNull(entry.getKey())); Options.class.cast(checkNotNull(entry.getValue())); } return options; } /** * Sets resource persistence data. * @param data resource persistence data * @throws ClassCastException if {@code data} contain invalid types * @throws NullPointerException if {@code data} contain {@code null} references */ public void setResourcePersistenceData(final Set<ResourcePersistenceData> data) { this.setRegistrations(persistence, data); } /** * Sets resource configuration data. * @param data resource configuration data * @throws ClassCastException if {@code data} contain invalid types * @throws NullPointerException if {@code data} contain {@code null} references */ public void setResourceConfigurationData(final Map<String, Options> data) { this.setOptions(configuration, data); } /** * Gets resource persistence data. * @throws ClassCastException if data contain invalid types * @throws IllegalStateException if data contain {@code null} references */ public Set<ResourcePersistenceData> getResourcePersistenceData() { return this.getRegistrations(persistence); } /** * Gets resource configuration data. * @throws ClassCastException if data contain invalid types * @throws IllegalStateException if data contain {@code null} references */ public Map<String, Options> getResourceConfigurationData() { return this.getOptions(configuration); } @Override Set<ResourcePersistenceData> getDefaultRegistrations() { return ResourcePersistenceData.defaults(); } @Override Map<String, Options> getDefaultOptions() { Map<String, Options> options = newHashMap(); for (ResourcePersistenceData data: this.getDefaultRegistrations()) { this.putDefaultOptionsIfPresent(options, data.getResourceName(), data.getResource()); } return options; } }