com.hp.alm.ali.idea.cfg.AliConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for com.hp.alm.ali.idea.cfg.AliConfiguration.java

Source

/*
 * Copyright 2013 Hewlett-Packard Development Company, L.P
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.hp.alm.ali.idea.cfg;

import com.hp.alm.ali.idea.entity.EntityQuery;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import org.apache.commons.codec.binary.Base64;
import org.jdom.Element;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

@State(name = "AliConfiguration", storages = { @Storage(id = "default", file = "$APP_CONFIG$/HpAliPlugin.xml") })
public class AliConfiguration implements PersistentStateComponent<Element> {

    public static final String PROPERTY_LOCATION = "location";
    public static final String PROPERTY_DOMAIN = "domain";
    public static final String PROPERTY_PROJECT = "project";
    public static final String PROPERTY_USERNAME = "username";
    public static final String PROPERTY_PASSWORD = "password";
    public static final String PROPERTY_STORE_PASSWORD = "store-password";
    public static final String PROPERTY_STATUS_TRANSITION = "status-transition";
    public static final String PROPERTY_SPELL_CHECKER = "spell-checker";
    public static final String PROPERTY_DEV_MOTIVE_ANNOTATION = "dev-motive-annotation";

    public String ALM_LOCATION = "";
    public String ALM_DOMAIN = "";
    public String ALM_PROJECT = "";
    public String ALM_USERNAME = "";
    public String ALM_PASSWORD = "";
    public boolean STORE_PASSWORD = true;

    public boolean spellChecker = true;
    public boolean devMotiveAnnotation = true;

    // poor man's workflow
    public String STATUS_TRANSITION;

    private List<ConfigurationListener> listeners = new LinkedList<ConfigurationListener>();
    private Map<String, List<EntityQuery>> filters;

    public AliConfiguration() {
        filters = new HashMap<String, List<EntityQuery>>();
        STATUS_TRANSITION = Transitions.DEFAULT_STATUS_TRANSITION;
    }

    public synchronized Element getState() {
        Element element = new Element(getClass().getSimpleName());
        addProperty(element, PROPERTY_LOCATION, ALM_LOCATION);
        addProperty(element, PROPERTY_DOMAIN, ALM_DOMAIN);
        addProperty(element, PROPERTY_PROJECT, ALM_PROJECT);
        addProperty(element, PROPERTY_USERNAME, ALM_USERNAME);
        if (STORE_PASSWORD) {
            addProperty(element, PROPERTY_PASSWORD, new String(new Base64().encode(ALM_PASSWORD.getBytes())));
        }
        addProperty(element, PROPERTY_STORE_PASSWORD, STORE_PASSWORD);
        element.addContent(getStoredFilters());
        addProperty(element, PROPERTY_STATUS_TRANSITION, STATUS_TRANSITION);
        addProperty(element, PROPERTY_SPELL_CHECKER, String.valueOf(spellChecker));
        addProperty(element, PROPERTY_DEV_MOTIVE_ANNOTATION, String.valueOf(devMotiveAnnotation));
        return element;
    }

    private Element getStoredFilters() {
        Element target = new Element("stored");
        for (String entityName : filters.keySet()) {
            Element element = new Element(entityName);
            List<EntityQuery> list = filters.get(entityName);
            for (EntityQuery filter : list) {
                Element query = filter.toElement("query");
                element.addContent(query);
            }
            target.addContent(element);
        }
        return target;
    }

    public synchronized void loadState(Element element) {
        ALM_LOCATION = getProperty(element, PROPERTY_LOCATION);
        ALM_DOMAIN = getProperty(element, PROPERTY_DOMAIN);
        ALM_PROJECT = getProperty(element, PROPERTY_PROJECT);
        ALM_USERNAME = getProperty(element, PROPERTY_USERNAME);
        ALM_PASSWORD = new String(new Base64().decode(getProperty(element, PROPERTY_PASSWORD).getBytes()));
        STORE_PASSWORD = Boolean.valueOf(getProperty(element, PROPERTY_STORE_PASSWORD));
        STATUS_TRANSITION = getProperty(element, PROPERTY_STATUS_TRANSITION);
        spellChecker = Boolean.valueOf(getProperty(element, PROPERTY_SPELL_CHECKER, "true"));
        devMotiveAnnotation = Boolean.valueOf(getProperty(element, PROPERTY_DEV_MOTIVE_ANNOTATION, "true"));

        Element stored = element.getChild("stored");
        if (stored != null) {
            loadStoredFilters(stored);
        }
    }

    private void loadStoredFilters(Element element) {
        for (Element child : (List<Element>) element.getChildren()) {
            String entityName = child.getName();
            List<EntityQuery> list = new LinkedList<EntityQuery>();
            filters.put(entityName, list);
            for (Element filter : (List<Element>) child.getChildren("query")) {
                EntityQuery entityFilter = new EntityQuery(entityName);
                entityFilter.fromElement(filter);
                list.add(entityFilter);
            }
        }
    }

    public synchronized List<EntityQuery> getStoredFilters(String entityName) {
        List<EntityQuery> queries = filters.get(entityName);
        if (queries == null) {
            queries = new LinkedList<EntityQuery>();
            filters.put(entityName, queries);
        }
        return new LinkedList<EntityQuery>(queries);
    }

    public synchronized void storeFilter(String entityType, EntityQuery filter) {
        dropFilter(entityType, filter.getName());
        filters.get(entityType).add(filter);
    }

    public synchronized void dropFilter(String entityType, String filterName) {
        // make sure that filters are initialized for this type
        getStoredFilters(entityType);

        List<EntityQuery> stored = filters.get(entityType);
        for (EntityQuery f : stored) {
            if (f.getName().equals(filterName)) {
                stored.remove(f);
                return;
            }
        }
    }

    public String getLocation() {
        return ALM_LOCATION;
    }

    public String getDomain() {
        return ALM_DOMAIN;
    }

    public String getProject() {
        return ALM_PROJECT;
    }

    public String getUsername() {
        return ALM_USERNAME;
    }

    public String getPassword() {
        return ALM_PASSWORD;
    }

    protected String getProperty(Element element, String name, String defaultValue) {
        Element child = element.getChild(name);
        if (child != null) {
            return child.getText();
        } else {
            return defaultValue;
        }
    }

    protected String getProperty(Element element, String name) {
        return getProperty(element, name, "");
    }

    protected void addProperty(Element element, String name, Object value) {
        Element property = new Element(name);
        property.setText(value.toString());
        element.addContent(property);
    }

    public void addListener(ConfigurationListener listener) {
        synchronized (listeners) {
            listeners.add(listener);
        }
    }

    public void removeListener(ConfigurationListener listener) {
        synchronized (listeners) {
            listeners.remove(listener);
        }
    }

    public void fireChanged() {
        synchronized (listeners) {
            for (ConfigurationListener listener : listeners) {
                listener.onChanged();
            }
        }
    }
}