de.codesourcery.jasm16.ide.ApplicationConfig.java Source code

Java tutorial

Introduction

Here is the source code for de.codesourcery.jasm16.ide.ApplicationConfig.java

Source

/**
 * Copyright 2012 Tobias Gierke <tobias.gierke@code-sourcery.de>
 *
 * 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 de.codesourcery.jasm16.ide;

import java.awt.Dimension;
import java.awt.Point;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import de.codesourcery.jasm16.ide.ui.utils.SizeAndLocation;
import de.codesourcery.jasm16.utils.Misc;

/**
 * Global IDE configuration.
 * 
 * <p>Currently , the IDE configuration only holds the path
 * to the current's workspace base directory and is stored 
 * as file {@link #FILE_NAME} in the user's home directory.</p>
 *   
 * @author tobias.gierke@code-sourcery.de
 */
public class ApplicationConfig implements IApplicationConfig {

    private static final Logger LOG = Logger.getLogger(ApplicationConfig.class);

    public static final String FILE_NAME = ".jasm_workspace.properties";

    protected static final String KEY_VIEW_COORDINATES_PREFIX = "view.";

    protected static final String KEY_WORKSPACE_DIRECTORY = "workspace.dir";

    private final File configFile;
    private final Map<String, String> configProperties = new HashMap<String, String>();

    public ApplicationConfig(File configFile) throws IOException {
        if (configFile == null) {
            throw new IllegalArgumentException("configFile must not be NULL");
        }
        this.configFile = configFile;
        loadConfig();
    }

    @Override
    public File getWorkspaceDirectory() {
        return getFile(KEY_WORKSPACE_DIRECTORY);
    }

    protected File getFile(String key) {
        return new File(configProperties.get(key));
    }

    protected void loadConfig() throws IOException {
        boolean success = false;
        if (configFile.exists()) {
            LOG.info("loadConfig(): Loading application configuration");
            try {
                final Properties props = loadPropertiesFile(configFile);
                for (String key : props.stringPropertyNames()) {
                    configProperties.put(key, props.getProperty(key));
                }
                success = true;
            } catch (IOException e) {
                LOG.error("loadConfiguration(): Failed to load workspace configuration");
            }
        }

        if (!success) {
            configProperties.clear();
            configProperties.putAll(createDefaultConfiguration());
            saveConfiguration();
        }
    }

    protected Properties loadPropertiesFile(File configFIle) throws IOException {
        final Properties props = new Properties();
        final InputStream in = new FileInputStream(configFile);
        try {
            props.load(in);
            return props;
        } finally {
            IOUtils.closeQuietly(in);
        }
    }

    protected Map<String, String> createDefaultConfiguration() throws IOException {

        final Map<String, String> result = new HashMap<String, String>();

        final File homeDirectory = new File(Misc.getUserHomeDirectory(), "jasm_workspace");
        if (!homeDirectory.exists()) {
            LOG.info("createDefaultConfiguration(): Creating workspace folder " + homeDirectory.getAbsolutePath());
            if (!homeDirectory.mkdirs()) {
                LOG.error("createDefaultConfiguration(): Unable to create workspace directory "
                        + homeDirectory.getAbsolutePath());
                throw new IOException("Unable to create workspace directory " + homeDirectory.getAbsolutePath());
            }
        }
        if (!homeDirectory.isDirectory()) {
            LOG.error("createDefaultConfiguration(): Workspace directory is no directory: "
                    + homeDirectory.getAbsolutePath());
            throw new IOException("Workspace directory is no directory: " + homeDirectory.getAbsolutePath());
        }
        result.put(KEY_WORKSPACE_DIRECTORY, homeDirectory.getAbsolutePath());
        return result;
    }

    @Override
    public void saveConfiguration() throws IOException {

        final Properties props = new Properties();

        LOG.info("saveConfiguration(): Saving application config.");

        for (Map.Entry<String, String> keyValue : configProperties.entrySet()) {
            props.put(keyValue.getKey(), keyValue.getValue());
        }

        final String comments = "jASM16 workspace configuration -- automatically generated, do NOT edit";
        try {
            final FileOutputStream out = new FileOutputStream(configFile);
            try {
                props.store(out, comments);
            } finally {
                IOUtils.closeQuietly(out);
            }
        } catch (IOException e) {
            LOG.fatal(
                    "createDefaultConfiguration(): Failed to save configuration to " + configFile.getAbsolutePath(),
                    e);
            throw e;
        }
    }

    @Override
    public void setWorkspaceDirectory(File dir) throws IOException {
        if (dir == null) {
            throw new IllegalArgumentException("dir must not be NULL");
        }
        Misc.checkFileExistsAndIsDirectory(dir, true);
        this.configProperties.put(KEY_WORKSPACE_DIRECTORY, dir.getAbsolutePath());
        saveConfiguration();
    }

    @Override
    public void storeViewCoordinates(String viewID, SizeAndLocation loc) {
        if (StringUtils.isBlank(viewID)) {
            throw new IllegalArgumentException("viewID must not be blank/null");
        }

        if (loc == null) {
            throw new IllegalArgumentException("loc must not be null");
        }

        final String posKey = KEY_VIEW_COORDINATES_PREFIX + viewID + ".position";
        final String sizeKey = KEY_VIEW_COORDINATES_PREFIX + viewID + ".size";

        final String posValue = loc.getLocation().x + "," + loc.getLocation().y;
        final String sizeValue = loc.getSize().width + "," + loc.getSize().height;
        this.configProperties.put(posKey, posValue);
        this.configProperties.put(sizeKey, sizeValue);
    }

    @Override
    public SizeAndLocation getViewCoordinates(String viewId) {
        final String posKey = KEY_VIEW_COORDINATES_PREFIX + viewId + ".position";
        final String sizeKey = KEY_VIEW_COORDINATES_PREFIX + viewId + ".size";

        final String posValue = this.configProperties.get(posKey);
        final String sizeValue = this.configProperties.get(sizeKey);

        if (StringUtils.isBlank(posValue) || StringUtils.isBlank(sizeValue)) {
            return null;
        }

        String[] parts = posValue.split(",");
        final int x = Integer.parseInt(parts[0]);
        final int y = Integer.parseInt(parts[1]);

        parts = sizeValue.split(",");
        final int width = Integer.parseInt(parts[0]);
        final int height = Integer.parseInt(parts[1]);

        return new SizeAndLocation(new Point(x, y), new Dimension(width, height));
    }

}