tarlog.encoder.tool.eclipse.preferences.PropertiesStore.java Source code

Java tutorial

Introduction

Here is the source code for tarlog.encoder.tool.eclipse.preferences.PropertiesStore.java

Source

/*******************************************************************************
 *     Copyright 2009 Michael Elman (http://tarlogonjava.blogspot.com)
 *
 *     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 tarlog.encoder.tool.eclipse.preferences;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.jface.preference.IPreferenceStore;

import tarlog.encoder.tool.api.AbstractEncoder;
import tarlog.ui.swt.ddialog.api.fields.InputDirectoryField;
import tarlog.ui.swt.ddialog.api.fields.InputField;
import tarlog.ui.swt.ddialog.api.fields.InputFileField;
import tarlog.ui.swt.ddialog.api.fields.InputListField;
import tarlog.ui.swt.ddialog.api.fields.InputTextField;
import tarlog.ui.swt.ddialog.api.fields.Validator;
import tarlog.ui.swt.ddialog.api.fields.InputListField.InputType;

public class PropertiesStore {

    private List<EncodersGroup> store = new ArrayList<EncodersGroup>();

    public PropertiesStore(IPreferenceStore preferenceStore, boolean isDefault) throws MalformedURLException {
        int groupsAmount = isDefault ? preferenceStore.getDefaultInt(PropertiesStore.class.getName())
                : preferenceStore.getInt(PropertiesStore.class.getName());
        for (int i = 0; i < groupsAmount; ++i) {
            store.add(new EncodersGroup(i, preferenceStore, isDefault));
        }
    }

    void moveUp(EncodersGroup group) {
        int indexOf = store.indexOf(group);
        if (indexOf > 0) {
            Collections.swap(store, indexOf, indexOf - 1);
        }
    }

    void remove(EncodersGroup group) {
        store.remove(group);

    }

    boolean canMoveUp(EncodersGroup group) {
        int indexOf = store.indexOf(group);
        return (indexOf > 0);
    }

    void moveDown(EncodersGroup group) {
        int indexOf = store.indexOf(group);
        int size = store.size();
        if (indexOf < size - 1) {
            Collections.swap(store, indexOf, indexOf + 1);
        }
    }

    boolean canMoveDown(EncodersGroup group) {
        int indexOf = store.indexOf(group);
        int size = store.size();
        return (indexOf < size - 1);
    }

    /**
     * <p>
     * Returns copy of store
     * <p>
     * Performs shallow copy
     */
    public EncodersGroup[] getStore() {
        return store.toArray(new EncodersGroup[store.size()]);
    }

    public void store(IPreferenceStore preferenceStore) {
        preferenceStore.setValue(PropertiesStore.class.getName(), store.size());
        for (int i = 0; i < store.size(); ++i) {
            store.get(i).store(i, preferenceStore);
        }
    }

    public void newGroup(String groupName) {
        EncodersGroup encodersGroup = new EncodersGroup();
        encodersGroup.setGroupName(groupName);
        store.add(encodersGroup);

    }

    public Object getGroup(String groupName) {
        for (EncodersGroup group : store) {
            if (group.getGroupName().equals(groupName)) {
                return group;
            }
        }
        return null;
    }

    /**
     * 
     */
    public static class EncodersGroup {

        private String groupName;
        private boolean enabled = true;
        private List<EncoderDef> list = new ArrayList<EncoderDef>();

        private EncodersGroup() {

        }

        public EncodersGroup(int i, IPreferenceStore preferenceStore, boolean isDefault)
                throws MalformedURLException {
            String groupStr = getClass().getName() + "." + String.valueOf(i) + ".group";
            groupName = isDefault ? preferenceStore.getDefaultString(groupStr)
                    : preferenceStore.getString(groupStr);
            String enabledStr = getClass().getName() + "." + String.valueOf(i) + ".enabled";
            if (preferenceStore.contains(enabledStr)) {
                enabled = isDefault ? preferenceStore.getDefaultBoolean(enabledStr)
                        : preferenceStore.getBoolean(enabledStr);
            } else {
                enabled = true;
            }
            String encodersStr = getClass().getName() + "." + String.valueOf(i) + ".encoders";
            int encodersAmount = isDefault ? preferenceStore.getDefaultInt(encodersStr)
                    : preferenceStore.getInt(encodersStr);
            for (int j = 0; j < encodersAmount; ++j) {
                list.add(new EncoderDef(i, j, preferenceStore, isDefault));
            }
        }

        public void moveUp(EncoderDef encoderDef) {
            int indexOf = list.indexOf(encoderDef);
            if (indexOf > 0) {
                Collections.swap(list, indexOf, indexOf - 1);
            }
        }

        public boolean canMoveUp(EncoderDef def) {
            int indexOf = list.indexOf(def);
            return (indexOf > 0);
        }

        public void moveDown(EncoderDef encoderDef) {
            int indexOf = list.indexOf(encoderDef);
            int size = list.size();
            if (indexOf < size - 1) {
                Collections.swap(list, indexOf, indexOf + 1);
            }
        }

        public boolean canMoveDown(EncoderDef def) {
            int indexOf = list.indexOf(def);
            int size = list.size();
            return (indexOf < size - 1);
        }

        public void store(int i, IPreferenceStore preferenceStore) {
            preferenceStore.setValue(getClass().getName() + "." + String.valueOf(i) + ".group", groupName);
            preferenceStore.setValue(getClass().getName() + "." + String.valueOf(i) + ".enabled", enabled);
            preferenceStore.setValue(getClass().getName() + "." + String.valueOf(i) + ".encoders", list.size());
            for (int j = 0; j < list.size(); ++j) {
                list.get(j).store(i, j, preferenceStore);
            }
        }

        public void remove(EncoderDef encoderDef) {
            list.remove(encoderDef);
        }

        public void setGroupName(String groupName) {
            this.groupName = groupName;
        }

        public String getGroupName() {
            return groupName;
        }

        public void setList(List<EncoderDef> list) {
            this.list = list;
        }

        public List<EncoderDef> getList() {
            return list;
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }

        public boolean isEnabled() {
            return enabled;
        }
    }

    /**
     * 
     */
    public static class EncoderDef implements Validator {

        @InputField(name = "Name", required = true)
        @InputTextField(validateNotEmpty = true, validationPattern = InputTextField.WORD_PATTERN, validationMessage = "Encoder name must be a word")
        String name;

        private boolean enabled = true;

        @InputField(name = "Class name", required = true)
        @InputTextField(validateNotEmpty = true)
        String className;

        @InputField(name = "Encoding Method")
        String encodingMethod;

        @InputField(name = "Classpath")
        @InputFileField(buttonText = "Add jar", filterExtensions = { "*.jar", "*.*" }, relative = true)
        @InputDirectoryField(buttonText = "Add class folder")
        @InputListField(inputType = { InputType.UP, InputType.DOWN })
        String[] classPath;

        EncoderDef() {

        }

        private EncoderDef(int i, int j, IPreferenceStore preferenceStore, boolean isDefault)
                throws MalformedURLException {
            String prefix = getClass().getName() + "." + String.valueOf(i) + "." + String.valueOf(j) + ".";
            name = isDefault ? preferenceStore.getDefaultString(prefix + "name")
                    : preferenceStore.getString(prefix + "name");
            if (preferenceStore.contains(prefix + "enabled")) {
                enabled = isDefault ? preferenceStore.getDefaultBoolean(prefix + "enabled")
                        : preferenceStore.getBoolean(prefix + "enabled");
            } else {
                enabled = true;
            }

            if (preferenceStore.contains(prefix + "encodingMethod")) {
                encodingMethod = isDefault ? preferenceStore.getDefaultString(prefix + "encodingMethod")
                        : preferenceStore.getString(prefix + "encodingMethod");
            } else {
                encodingMethod = null;
            }

            className = isDefault ? preferenceStore.getDefaultString(prefix + "className")
                    : preferenceStore.getString(prefix + "className");
            int classPathLength = isDefault ? preferenceStore.getDefaultInt(prefix + "classPath")
                    : preferenceStore.getInt(prefix + "classPath");
            classPath = new String[classPathLength];
            for (int k = 0; k < classPathLength; ++k) {
                classPath[k] = isDefault
                        ? preferenceStore.getDefaultString(prefix + "classPath." + String.valueOf(k))
                        : preferenceStore.getString(prefix + "classPath." + String.valueOf(k));
            }
        }

        private void store(int i, int j, IPreferenceStore preferenceStore) {
            String prefix = getClass().getName() + "." + String.valueOf(i) + "." + String.valueOf(j) + ".";
            preferenceStore.setValue(prefix + "name", name);
            preferenceStore.setValue(prefix + "className", className);
            preferenceStore.setValue(prefix + "enabled", enabled);
            if (encodingMethod != null) {
                preferenceStore.setValue(prefix + "encodingMethod", encodingMethod);
            }
            if (classPath != null) {
                preferenceStore.setValue(prefix + "classPath", classPath.length);
                for (int k = 0; k < classPath.length; ++k) {
                    preferenceStore.setValue(prefix + "classPath." + String.valueOf(k), classPath[k].toString());
                }
            } else {
                preferenceStore.setValue(prefix + "classPath", 0);
            }
        }

        public String isValid() {
            try {
                Class<?> encoderClass = getEncoderClass();
                if (!AbstractEncoder.class.isAssignableFrom(encoderClass)) {
                    return "The encoder class must be instance of AbstractEncoder";
                }
            } catch (ClassNotFoundException e) {
                return "Class not found";
            } catch (MalformedURLException e) {
                return e.getMessage();
            }
            return null;
        }

        public Class<?> getEncoderClass() throws ClassNotFoundException, MalformedURLException {
            ClassLoader classLoader = getClass().getClassLoader();
            if (classPath != null) {
                URL[] urls = new URL[classPath.length];
                for (int i = 0; i < classPath.length; ++i) {
                    urls[i] = new File(classPath[i]).toURI().toURL();
                }
                classLoader = new URLClassLoader(urls, getClass().getClassLoader());
            }
            return classLoader.loadClass(className);
        }

        public void setEnabled(boolean enabled) {
            this.enabled = enabled;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public String getName() {
            return name;
        }

        public String getEncodingMethod() {
            return encodingMethod;
        }
    }

}