com.data2semantics.yasgui.client.settings.Settings.java Source code

Java tutorial

Introduction

Here is the source code for com.data2semantics.yasgui.client.settings.Settings.java

Source

package com.data2semantics.yasgui.client.settings;

/*
 * #%L
 * YASGUI
 * %%
 * Copyright (C) 2013 Laurens Rietveld
 * %%
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * #L%
 */

import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;

import com.data2semantics.yasgui.client.helpers.JsMethods;
import com.data2semantics.yasgui.client.helpers.JsonHelper;
import com.data2semantics.yasgui.client.helpers.LocalStorageHelper;
import com.data2semantics.yasgui.shared.SettingKeys;
import com.data2semantics.yasgui.shared.exceptions.SettingsException;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.Window;

public class Settings extends JsonHelper {
    private ArrayList<TabSettings> tabArray = new ArrayList<TabSettings>();
    private Defaults defaults;

    /**
     * DEFAULTS
     */
    public static int DEFAULT_SELECTED_TAB = 0;

    public Settings() {
    }

    public Settings(String jsonString) throws IOException {
        this.addToSettings(jsonString);
    }

    public void addToSettings(String jsonString) throws IOException {
        JSONValue jsonVal = JSONParser.parseStrict(jsonString);
        if (jsonVal != null) {
            JSONObject jsonObject = jsonVal.isObject();
            if (jsonObject != null) {
                addToSettings(jsonObject);
            } else {
                throw new IOException("Unable to convert json value to json object");
            }
        } else {
            throw new IOException("Unable to parse json settings string");
        }
    }

    public void addToSettings(JSONObject jsonObject) {
        Set<String> keys = jsonObject.keySet();
        for (String key : keys) {
            if (key.equals(SettingKeys.TAB_SETTINGS)) {
                JSONArray jsonArray = jsonObject.get(key).isArray();
                for (int i = 0; i < jsonArray.size(); i++) {
                    //Add as TabSettings to tab arraylist
                    tabArray.add(new TabSettings(this, jsonArray.get(i).isObject()));
                }
            } else if (key.equals(SettingKeys.DEFAULTS)) {
                if (defaults == null) {
                    defaults = new Defaults(jsonObject.get(key).isObject());
                } else {
                    defaults.update(jsonObject.get(key).isObject());
                }

            } else {
                put(key, jsonObject.get(key));
            }
        }
    }

    public void initDefaultTab() {
        this.setSelectedTabNumber(DEFAULT_SELECTED_TAB);
        addTabSettings(new TabSettings(this, defaults));
    }

    public boolean inSingleEndpointMode() {
        boolean singleEndpointMode = false;
        if (containsKey(SettingKeys.SINGLE_ENDPOINT_MODE)) {
            singleEndpointMode = get(SettingKeys.SINGLE_ENDPOINT_MODE).isBoolean().booleanValue();
        }
        return singleEndpointMode;
    }

    public void setSelectedTabNumber(int selectedTabNumber) {
        put(SettingKeys.SELECTED_TAB_NUMBER, new JSONNumber(selectedTabNumber));
    }

    public void addTabSettings(TabSettings tabSettings) {
        tabArray.add(tabSettings);
    }

    public ArrayList<TabSettings> getTabArray() {
        return tabArray;
    }

    public JSONArray getTabArrayAsJson() {
        JSONArray jsonArray = new JSONArray();
        for (int i = 0; i < tabArray.size(); i++) {
            jsonArray.set(i, (JSONObject) tabArray.get(i));
        }
        return jsonArray;
    }

    public int getSelectedTabNumber() {
        int selectedTab = (int) get(SettingKeys.SELECTED_TAB_NUMBER).isNumber().doubleValue();
        if (selectedTab >= tabArray.size()) {
            //Something is wrong, tab does not exist. take last tab
            selectedTab = tabArray.size() - 1;
        }
        return selectedTab;
    }

    public void removeTabSettings(int index) {
        tabArray.remove(index);
    }

    public TabSettings getSelectedTabSettings() throws SettingsException {
        if (getSelectedTabNumber() >= 0) {
            return tabArray.get(getSelectedTabNumber());
        } else {
            return new TabSettings(this, getDefaults());
        }
    }

    public Defaults getDefaults() {
        return defaults;
    }

    public String getGoogleAnalyticsId() {
        String id = getString(SettingKeys.GOOGLE_ANALYTICS_ID);
        return id;
    }

    public boolean useGoogleAnalytics() {
        String analyticsId = getGoogleAnalyticsId();
        return (analyticsId != null && analyticsId.length() > 0 && getTrackingConsent());
    }

    public void setTrackingConsent(boolean consent) {
        put(SettingKeys.TRACKING_CONSENT, JSONBoolean.getInstance(consent));
    }

    public boolean getTrackingConsent() {
        boolean consent = true;
        if (containsKey(SettingKeys.TRACKING_CONSENT)) {
            consent = get(SettingKeys.TRACKING_CONSENT).isBoolean().booleanValue();
        }
        return consent;
    }

    public void setTrackingQueryConsent(boolean consent) {
        put(SettingKeys.TRACKING_QUERIES_CONSENT, JSONBoolean.getInstance(consent));
    }

    public boolean getTrackingQueryConsent() {
        boolean consent = true;
        if (containsKey(SettingKeys.TRACKING_QUERIES_CONSENT)) {
            consent = get(SettingKeys.TRACKING_QUERIES_CONSENT).isBoolean().booleanValue();
        }
        return consent;
    }

    public boolean cookieConsentAnswered() {
        return (containsKey(SettingKeys.TRACKING_CONSENT) && containsKey(SettingKeys.TRACKING_QUERIES_CONSENT));
    }

    public boolean useBitly() {
        boolean useBitly = false;
        if (containsKey(SettingKeys.USE_BITLY) && get(SettingKeys.USE_BITLY).isBoolean() != null) {
            useBitly = get(SettingKeys.USE_BITLY).isBoolean().booleanValue();
        }
        return useBitly;
    }

    public boolean isDbSet() {
        boolean dbSet = false;
        if (containsKey(SettingKeys.DB_SET) && get(SettingKeys.DB_SET).isBoolean() != null) {
            dbSet = get(SettingKeys.DB_SET).isBoolean().booleanValue();
        }
        return dbSet;
    }

    /**
     * Returns JSON representation of this object
     */
    public String toString() {
        put(SettingKeys.TAB_SETTINGS, getTabArrayAsJson());
        put(SettingKeys.DEFAULTS, defaults);
        return super.toString();
    }

    public String getBrowserTitle() {
        String title = "YASGUI";//default value
        if (containsKey(SettingKeys.BROWSER_TITLE)) {
            title = get(SettingKeys.BROWSER_TITLE).isString().stringValue();
        }
        return title;
    }

    public void setBrowserTitle(String title) {
        put(SettingKeys.BROWSER_TITLE, new JSONString(title));
    }

    public static Settings retrieveSettings() throws IOException {
        Settings settings = new Settings();
        String defaultSettings = JsMethods.getDefaultSettings();
        if (defaultSettings == null || defaultSettings.length() == 0) {
            throw new IOException("Failed to load default settings from javascript.");
        }

        //First create settings object with the proper default values
        //need default values when creating settings objects, as not all values might be filled in our cache and stuff
        settings.addToSettings(defaultSettings);

        settings = addUrlArgToSettings(settings);

        String settingsString = LocalStorageHelper.getSettingsStringFromCookie();
        if (settingsString != null && settingsString.length() > 0) {
            settings.addToSettings(settingsString);

            //add installation + url settings again. The settings retrieved from cookie might have stale default values
            settings.addToSettings(defaultSettings);
            settings = addUrlArgToSettings(settings);
        } else {
            //no options in cache. we already have default values and settings object
            //now initialize a tab with default values
            settings.initDefaultTab();
        }
        return settings;
    }

    /**
     * If we have settings passed as argument (e.g. in an iframe setting, add these to settings object)
     * @param settings
     * @return
     * @throws IOException
     */
    private static Settings addUrlArgToSettings(Settings settings) throws IOException {
        //If we have settings passed as argument (e.g. in an iframe setting, add these to settings object)
        String jsonSettings = Window.Location.getParameter(SettingKeys.JSON_SETTINGS_ARGUMENT);
        if (jsonSettings != null && jsonSettings.length() > 0) {
            settings.addToSettings(jsonSettings);
        }
        return settings;
    }
}