hr.fer.zemris.vhdllab.platform.preference.DatabasePreferences.java Source code

Java tutorial

Introduction

Here is the source code for hr.fer.zemris.vhdllab.platform.preference.DatabasePreferences.java

Source

/*******************************************************************************
 * See the NOTICE file distributed with this work for additional information
 * regarding copyright ownership.
 * 
 * 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 hr.fer.zemris.vhdllab.platform.preference;

import hr.fer.zemris.vhdllab.entity.PreferencesFile;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.prefs.AbstractPreferences;
import java.util.prefs.BackingStoreException;

import org.apache.commons.lang.UnhandledException;
import org.apache.log4j.Logger;

public class DatabasePreferences extends AbstractPreferences {

    /**
     * Logger for this class
     */
    private static final Logger LOG = Logger.getLogger(DatabasePreferences.class);

    private static PreferencesManager manager;

    private List<String> children;
    private Properties properties;

    public DatabasePreferences(AbstractPreferences parent, String name) {
        super(parent, name);
        this.children = new ArrayList<String>();
    }

    static void setManager(PreferencesManager manager) {
        DatabasePreferences.manager = manager;
    }

    private Properties getProperties() {
        if (properties == null) {
            properties = new Properties();
            PreferencesFile file = getFile();
            if (file != null) {
                try {
                    properties.load(new StringReader(file.getData()));
                } catch (IOException e) {
                    // Should never happen!
                    throw new IllegalStateException(e);
                }
            }
        }
        return properties;
    }

    private PreferencesFile getFile() {
        return manager.getFile(absolutePath());
    }

    @Override
    protected AbstractPreferences childSpi(String name) {
        children.add(name);
        return new DatabasePreferences(this, name);
    }

    @Override
    protected String[] childrenNamesSpi() throws BackingStoreException {
        String[] names = new String[children.size()];
        return children.toArray(names);
    }

    @Override
    protected void flushSpi() throws BackingStoreException {
        Properties props = getProperties();
        if (!props.isEmpty()) {
            StringWriter writer = new StringWriter();
            try {
                props.store(writer, null);
            } catch (IOException e) {
                throw new UnhandledException(e);
            }
            PreferencesFile file = getFile();
            String data = writer.toString();
            if (file == null) {
                file = new PreferencesFile(absolutePath(), data);
            } else {
                file.setData(data);
            }
            manager.setFile(file);
        }
    }

    @Override
    public void flush() throws BackingStoreException {
        super.flush();
        if (this == userRoot()) {
            try {
                manager.saveFiles();
            } catch (RuntimeException e) {
                throw new BackingStoreException(e);
            }
        }
    }

    @Override
    protected String getSpi(String key) {
        return getProperties().getProperty(key);
    }

    @Override
    public String get(String key, String def) {
        String value = super.get(key, null);
        if (value == null) {
            value = def;
            if (value != null) {
                put(key, value);
            }
        }
        if (LOG.isTraceEnabled()) {
            LOG.trace(absolutePath() + "#" + key + "=" + value);
        }
        return value;
    }

    @Override
    public boolean getBoolean(String key, boolean def) {
        String value = get(key, String.valueOf(def));
        if (value.equalsIgnoreCase("true")) {
            return true;
        } else if (value.equalsIgnoreCase("false")) {
            return false;
        } else {
            return def;
        }
    }

    @Override
    public double getDouble(String key, double def) {
        String value = get(key, String.valueOf(def));
        try {
            return Double.parseDouble(value);
        } catch (NumberFormatException e) {
            return def;
        }
    }

    @Override
    public float getFloat(String key, float def) {
        String value = get(key, String.valueOf(def));
        try {
            return Float.parseFloat(value);
        } catch (NumberFormatException e) {
            return def;
        }
    }

    @Override
    public int getInt(String key, int def) {
        String value = get(key, String.valueOf(def));
        try {
            return Integer.parseInt(value);
        } catch (NumberFormatException e) {
            return def;
        }
    }

    @Override
    public long getLong(String key, long def) {
        String value = get(key, String.valueOf(def));
        try {
            return Long.parseLong(value);
        } catch (NumberFormatException e) {
            return def;
        }
    }

    @Override
    protected String[] keysSpi() throws BackingStoreException {
        Set<Object> keySet = getProperties().keySet();
        String[] keys = new String[keySet.size()];
        return keySet.toArray(keys);
    }

    @Override
    protected void putSpi(String key, String value) {
        getProperties().put(key, value);
    }

    @Override
    protected void removeNodeSpi() throws BackingStoreException {
        throw new UnsupportedOperationException("This operation is not supported");
    }

    @Override
    protected void removeSpi(String key) {
        throw new UnsupportedOperationException("This operation is not supported");
    }

    @Override
    protected void syncSpi() throws BackingStoreException {
        throw new UnsupportedOperationException("This operation is not supported");
    }

}