org.cs3.prolog.connector.internal.preferences.PreferenceConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for org.cs3.prolog.connector.internal.preferences.PreferenceConfiguration.java

Source

/*****************************************************************************
 * This file is part of the Prolog Development Tool (PDT)
 * 
 * Author: Andreas Becker
 * WWW: http://sewiki.iai.uni-bonn.de/research/pdt/start
 * Mail: pdt@lists.iai.uni-bonn.de
 * Copyright (C): 2013, CS Dept. III, University of Bonn
 * 
 * All rights reserved. This program is  made available under the terms
 * of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 ****************************************************************************/

package org.cs3.prolog.connector.internal.preferences;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import org.cs3.prolog.common.PDTConstants;
import org.cs3.prolog.common.Util;
import org.cs3.prolog.common.logging.Debug;
import org.cs3.prolog.connector.PrologRuntime;
import org.cs3.prolog.connector.ui.PrologRuntimeUI;
import org.cs3.prolog.connector.ui.PrologRuntimeUIPlugin;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceStore;

public class PreferenceConfiguration {

    private static PreferenceConfiguration instance;

    public static PreferenceConfiguration getInstance() {
        if (instance == null) {
            instance = new PreferenceConfiguration();
        }
        return instance;
    }

    private PreferenceConfiguration() {
        configurations = new ArrayList<String>();
        loadConfigurations();
    }

    public static final String PREF_CONFIGURATIONS = "pif.configurations";

    private static final String DEFAULT_CONFIGURATION_PREFIX = "pif.configuration.default.";

    private final List<String> defaultConfigurations = Arrays.<String>asList(
            new String[] { PrologRuntimeUI.CONFIGURATION_SWI, PrologRuntimeUI.CONFIGURATION_SWI_LOGTALK,
                    PrologRuntimeUI.CONFIGURATION_YAP, PrologRuntimeUI.CONFIGURATION_YAP_LOGTALK });
    private ArrayList<String> configurations;

    public static void initializeDefaultPreferences(IPreferenceStore store) {
        store.setDefault(PREF_CONFIGURATIONS,
                PrologRuntimeUI.CONFIGURATION_SWI + ";" + PrologRuntimeUI.CONFIGURATION_SWI_LOGTALK + ";"
                        + PrologRuntimeUI.CONFIGURATION_YAP + ";" + PrologRuntimeUI.CONFIGURATION_YAP_LOGTALK);

        store.setDefault(DEFAULT_CONFIGURATION_PREFIX + PrologRuntimeUI.CONFIGURATION_SWI,
                PrologRuntimeUI.CONFIGURATION_SWI);
        store.setDefault(DEFAULT_CONFIGURATION_PREFIX + PrologRuntimeUI.CONFIGURATION_SWI_LOGTALK,
                PrologRuntimeUI.CONFIGURATION_SWI_LOGTALK);
        store.setDefault(DEFAULT_CONFIGURATION_PREFIX + PrologRuntimeUI.CONFIGURATION_YAP,
                PrologRuntimeUI.CONFIGURATION_YAP);
        store.setDefault(DEFAULT_CONFIGURATION_PREFIX + PrologRuntimeUI.CONFIGURATION_YAP_LOGTALK,
                PrologRuntimeUI.CONFIGURATION_YAP_LOGTALK);
    }

    private HashMap<String, PreferenceStore> stores = new HashMap<String, PreferenceStore>();

    public PreferenceStore getPreferenceStore(String configuration) {
        if (configuration == null) {
            return null;
        }
        synchronized (configurations) {
            if (!configurations.contains(configuration)) {
                return null;
            }
        }
        PreferenceStore store = stores.get(configuration);
        if (store == null) {
            store = createStore(configuration);
            stores.put(configuration, store);
        }
        return store;
    }

    private PreferenceStore createStore(String configuration) {
        PreferenceStore store = new PreferenceStore(getConfigurationFileName(configuration));
        String defaultConfiguration = getDefaultConfiguration(configuration);
        if (defaultConfiguration.equals(PrologRuntimeUI.CONFIGURATION_SWI)) {
            initWithSWIPreferences(store);
        } else if (defaultConfiguration.equals(PrologRuntimeUI.CONFIGURATION_SWI_LOGTALK)) {
            initWithSWILogtalkPreferences(store);
        } else if (defaultConfiguration.equals(PrologRuntimeUI.CONFIGURATION_YAP)) {
            initWithYAPPreferences(store);
        } else if (defaultConfiguration.equals(PrologRuntimeUI.CONFIGURATION_YAP_LOGTALK)) {
            initWithYAPLogtalkPreferences(store);
        } else {
            Debug.error("Invalid default configuration " + defaultConfiguration + " of " + configuration);
        }
        try {
            store.load();
        } catch (IOException e) {
        }
        return store;
    }

    private String getConfigurationFileName(String configuration) {
        return PrologRuntimeUIPlugin.getDefault().getStateLocation().append(configuration).toString();
    }

    public String getDefaultConfiguration(String configuration) {
        return PrologRuntimeUIPlugin.getDefault().getPreferenceStore()
                .getString(DEFAULT_CONFIGURATION_PREFIX + configuration);
    }

    public List<String> getConfigurations() {
        List<String> result;
        synchronized (configurations) {
            result = new ArrayList<String>(configurations);
        }
        return result;
    }

    public List<String> getDefaultConfigurations() {
        return new ArrayList<String>(defaultConfigurations);
    }

    public boolean addConfiguration(String configuration, String defaultConfiguration) {
        if (!defaultConfigurations.contains(defaultConfiguration) || configuration == null
                || configuration.contains(";")) {
            return false;
        }
        synchronized (configurations) {
            if (configurations.contains(configuration)) {
                return false;
            } else {
                configurations.add(configuration);
            }
            saveConfigurations();
        }
        PrologRuntimeUIPlugin.getDefault().getPreferenceStore()
                .setValue(DEFAULT_CONFIGURATION_PREFIX + configuration, defaultConfiguration);
        return true;
    }

    public boolean deleteConfiguration(String configuration) {
        if (defaultConfigurations.contains(configuration)) {
            return false;
        }
        synchronized (configurations) {
            if (!configurations.contains(configuration)) {
                return false;
            }
            configurations.remove(configuration);
            stores.remove(configuration);
        }
        saveConfigurations();
        try {
            new File(getConfigurationFileName(configuration)).delete();
        } catch (Exception e) {
        }
        return true;
    }

    private void loadConfigurations() {
        synchronized (configurations) {
            for (String configurationId : PrologRuntimeUIPlugin.getDefault().getPreferenceStore()
                    .getString(PREF_CONFIGURATIONS).split(";")) {
                configurations.add(configurationId);
            }
        }
    }

    private void saveConfigurations() {
        StringBuffer buf = new StringBuffer();
        boolean first = true;
        synchronized (configurations) {
            for (String configuration : configurations) {
                if (!first) {
                    buf.append(';');
                } else {
                    first = false;
                }
                buf.append(configuration);
            }
        }
        PrologRuntimeUIPlugin.getDefault().getPreferenceStore().setValue(PREF_CONFIGURATIONS, buf.toString());
    }

    private static void initPreferences(IPreferenceStore store) {
        store.setDefault(PrologRuntime.PREF_INVOCATION, Util.getInvocationCommand());
        store.setDefault(PrologRuntime.PREF_COMMAND_LINE_ARGUMENTS, "");
        store.setDefault(PrologRuntime.PREF_ADDITIONAL_STARTUP, "");
        store.setDefault(PrologRuntime.PREF_ENVIRONMENT, Util.guessEnvironmentVariables());

        store.setDefault(PrologRuntime.PREF_HOST, "localhost");

        store.setDefault(PrologRuntime.PREF_TIMEOUT, 15000);
        store.setDefault(PrologRuntime.PREF_PORT, 9944);
        store.setDefault(PrologRuntime.PREF_HIDE_PLWIN, true);

        store.setDefault(PrologRuntime.PREF_SERVER_LOGDIR,
                PrologRuntimeUIPlugin.getDefault().getStateLocation().toOSString());
    }

    public static void initWithSWIPreferences(IPreferenceStore store) {
        initPreferences(store);
        store.setDefault(PrologRuntime.PREF_EXECUTABLE, Util.getExecutablePreference(PDTConstants.DIALECT_SWI));
    }

    public static void initWithSWILogtalkPreferences(IPreferenceStore store) {
        initWithSWIPreferences(store);

        store.setDefault(PrologRuntime.PREF_ADDITIONAL_STARTUP, Util.getLogtalkStartupFile());
        store.setDefault(PrologRuntime.PREF_ENVIRONMENT, Util.getLogtalkEnvironmentVariables());
    }

    public static void initWithYAPPreferences(IPreferenceStore store) {
        initPreferences(store);
        store.setDefault(PrologRuntime.PREF_EXECUTABLE, Util.getExecutablePreference(PDTConstants.DIALECT_YAP));
    }

    public static void initWithYAPLogtalkPreferences(IPreferenceStore store) {
        initWithYAPPreferences(store);

        store.setDefault(PrologRuntime.PREF_ADDITIONAL_STARTUP, Util.getLogtalkStartupFile());
        store.setDefault(PrologRuntime.PREF_ENVIRONMENT, Util.getLogtalkEnvironmentVariables());
    }

}