001/*
002 * Copyright (c) 2005 Einar Pehrson <einar@pehrson.nu>.
003 *
004 * This file is part of
005 * CleanSheets - a spreadsheet application for the Java platform.
006 *
007 * CleanSheets is free software; you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as published by
009 * the Free Software Foundation; either version 2 of the License, or
010 * (at your option) any later version.
011 *
012 * CleanSheets is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
015 * GNU General Public License for more details.
016 *
017 * You should have received a copy of the GNU General Public License
018 * along with CleanSheets; if not, write to the Free Software
019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
020 */
021package csheets.io;
022
023import java.io.File;
024import java.io.FileInputStream;
025import java.io.FileOutputStream;
026import java.io.IOException;
027import java.io.InputStream;
028import java.io.OutputStream;
029import java.util.Properties;
030
031/**
032 * An extension of properties, predetermined to be saved in a specified file.
033 * If the file exists, any properties therein are loaded.
034 * @author Einar Pehrson
035 */
036public class NamedProperties extends Properties {
037
038        /** The serialVersionUID of the NamedProperties.java */
039        private static final long serialVersionUID = 5734781797863986818L;
040
041        /** The file in which the properties are and should be stored */
042        private File file;
043
044        /**
045         * Creates the named properties.
046         * @param file the file in which the properties are and should be stored
047         * @throws IOException if the file could not be read from
048         */
049        public NamedProperties(File file) throws IOException {
050                this(file, null);
051        }
052
053        /**
054         * Creates the named properties.
055         * @param defaults the properties to use as defaults
056         * @param file the file in which the properties are and should be stored
057         * @throws IOException if the file could not be read from
058         */
059        public NamedProperties(File file, Properties defaults) {
060                super(defaults);
061
062                if (file.exists()) {
063                        // Loads properties from file
064                        InputStream stream = null;
065                        try {
066                                stream = new FileInputStream(file);
067                                loadFromXML(stream);
068                        } catch (IOException e) {
069                        } finally {
070                                try {
071                                        if (stream != null)
072                                                stream.close();
073                                } catch (IOException e) {}
074                        }
075                }
076                this.file = file;
077        }
078
079        /**
080         * Invokes store() using the file that belongs to the properties.
081         * @param comment a description of the property list, or null if no comment is desired. 
082         * @throws IOException if the file could not be written to
083         */
084        public void store(String comment) throws IOException {
085                OutputStream stream = null;
086                try {
087                        stream = new FileOutputStream(file);
088                        super.store(stream, comment);
089                } finally {
090                        try {
091                                if (stream != null)
092                                        stream.close();
093                        } catch (IOException e) {}
094                }
095        }
096
097        /**
098         * Invokes storeToXML() using the file that belongs to the properties.
099         * @param comment a description of the property list, or null if no comment is desired. 
100         * @throws IOException if the file could not be written to
101         */
102        public void storeToXML(String comment) throws IOException {
103                OutputStream stream = null;
104                try {
105                        stream = new FileOutputStream(file);
106                        super.storeToXML(stream, comment);
107                } finally {
108                        try {
109                                if (stream != null)
110                                        stream.close();
111                        } catch (IOException e) {}
112                }
113        }
114}