package sk.stuba.fiit.perconik.elasticsearch.preferences; import java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.Map; import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.ui.preferences.ScopedPreferenceStore; import org.elasticsearch.common.settings.Settings; import sk.stuba.fiit.perconik.eclipse.jface.preference.AbstractPreferenceStoreOptionsReader; import sk.stuba.fiit.perconik.eclipse.jface.preference.PreferenceStoreOptions; import sk.stuba.fiit.perconik.preferences.AbstractPreferences; import sk.stuba.fiit.perconik.utilities.configuration.OptionAccessor; import sk.stuba.fiit.perconik.utilities.configuration.OptionsReader; import static sk.stuba.fiit.perconik.eclipse.jface.preference.PreferenceStores.setDefault; import static sk.stuba.fiit.perconik.elasticsearch.plugin.Activator.PLUGIN_ID; import static sk.stuba.fiit.perconik.utilities.MoreThrowables.initializeCause; import static sk.stuba.fiit.perconik.utilities.configuration.Configurables.defaults; public final class ElasticsearchPreferences extends AbstractPreferences implements ElasticsearchOptions, PreferenceStoreOptions, Serializable { private static final long serialVersionUID = -3684186056051078088L; private static final ElasticsearchPreferences shared = new ElasticsearchPreferences(Scope.CONFIGURATION); private final ScopedPreferenceStore store; private final OptionsReader reader; private ElasticsearchPreferences(final Scope scope) { super(scope, Schema.qualifier); this.store = new ScopedPreferenceStore(scope.context(), PLUGIN_ID); this.reader = new AbstractPreferenceStoreOptionsReader() { @Override protected PreferenceStoreOptions options() { return ElasticsearchPreferences.this; } @Override protected Object fromStringToRaw(final String value) { return value; } }; } public static final class Initializer extends AbstractPreferenceInitializer { public Initializer() {} @Override public void initializeDefaultPreferences() { ElasticsearchPreferences preferences = ElasticsearchPreferences.getDefault(); IPreferenceStore store = preferences.getPreferenceStore(); setDefault(store, defaults(Schema.accessors()), ElasticsearchOptions.Schema.CustomOptionsConverter.INSTANCE); } } /** * Gets default scoped core preferences. */ public static ElasticsearchPreferences getDefault() { return new ElasticsearchPreferences(Scope.DEFAULT); } /** * Gets configuration scoped core preferences. */ public static ElasticsearchPreferences getShared() { return shared; } private static final class SerializationProxy implements Serializable { private static final long serialVersionUID = -8939558618419864707L; private final Scope scope; SerializationProxy(final ElasticsearchPreferences preferences) { this.scope = preferences.scope(); } private Object readResolve() throws InvalidObjectException { try { switch (this.scope) { case CONFIGURATION: return getShared(); case DEFAULT: return getDefault(); case INSTANCE: throw new IllegalStateException("Instance scope not supported"); default: return new IllegalStateException("Unknow scope " + this.scope); } } catch (Exception e) { throw initializeCause(new InvalidObjectException("Unknown deserialization error"), e); } } } @SuppressWarnings({"static-method", "unused"}) private void readObject(final ObjectInputStream in) throws InvalidObjectException { throw new InvalidObjectException("Serialization proxy required"); } private Object writeReplace() { return new SerializationProxy(this); } /** * Throws {@code UnsupportedOperationException}. */ public void fromMap(final Map<String, Object> map) { throw new UnsupportedOperationException(); } /** * Returns a read only snapshot of preferences. */ public Map<String, Object> toMap() { return Schema.toMap(this); } public Settings toSettings() { return Schema.toSettings(this); } @Override public String toString() { return this.toMap().toString(); } /** * Throws {@code UnsupportedOperationException}. */ public Object put(final String key, final Object value) { throw new UnsupportedOperationException(); } /** * Returns preference value for specified key. */ public Object get(final String key) { OptionAccessor<?> accessor = Schema.accessors.get(key); if (accessor == null) { return null; } return accessor.getValue(this.reader); } /** * Returns the backing scoped preference store. */ public ScopedPreferenceStore getPreferenceStore() { return this.store; } }