001: /*
002: * FileProperties.java July 2003
003: *
004: * Copyright (C) 2003, Niall Gallagher <niallg@users.sf.net>
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013: * GNU Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General
016: * Public License along with this library; if not, write to the
017: * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
018: * Boston, MA 02111-1307 USA
019: */
020:
021: package simple.util;
022:
023: import simple.util.PropertyParser;
024: import java.io.FileInputStream;
025: import java.util.Properties;
026: import java.io.IOException;
027: import java.io.InputStream;
028: import java.io.File;
029:
030: /**
031: * The <code>FileProperties</code> object is used as a convienience
032: * class that is used to create a <code>Properties</code> object
033: * from a file path. This will automatically load the Java property
034: * file once instantiated. This is used so that the creation and
035: * use of a <code>java.util.Properties</code> file is much cleaner.
036: *
037: * @author Niall Gallagher
038: */
039: public class FileProperties extends Properties {
040:
041: /**
042: * Used to load the properties from the specified file.
043: */
044: private PropertyParser parser;
045:
046: /**
047: * Constructor for the <code>FileProperties</code> object. The
048: * constructor will use the specified file as the contents of
049: * its properties. The file name should be absolute, and in an
050: * OS specific format. For example "C:\data.properties" on a
051: * Windows filesystem, and "/pub/bin/data.properties" on UNIX.
052: *
053: * @param source this is the file that contains the properties
054: *
055: * @exception IOException if the properties can not be loaded
056: */
057: public FileProperties(String source) throws IOException {
058: this (new FileInputStream(source));
059: }
060:
061: /**
062: * Constructor for the <code>FileProperties</code> object. The
063: * constructor will use the specified base path to load the
064: * named properties file from. The file name given should be
065: * relative to the issued base path. This is a convinience
066: * method that enables the Java properties file to be loaded
067: * without the need to specify an OS specific file path.
068: *
069: * @param base this is the directory to loade the file from
070: * @param source this is the file that contains the properties
071: *
072: * @exception IOException if the properties can not be loaded
073: */
074: public FileProperties(File base, String source) throws IOException {
075: this (new File(base, source));
076: }
077:
078: /**
079: * Constructor for the <code>FileProperties</code> object. The
080: * constructor will use the specified file as the contents of
081: * its properties. The file name should be absolute, and in an
082: * OS specific format. For example "C:\data.properties" on a
083: * Windows filesystem, and "/pub/bin/data.properties" on UNIX.
084: *
085: * @param source this is the file that contains the properties
086: *
087: * @exception IOException if the properties can not be loaded
088: */
089: public FileProperties(File source) throws IOException {
090: this (new FileInputStream(source));
091: }
092:
093: /**
094: * Constructor for the <code>FileProperties</code> object. The
095: * constructor will use the given <code>InputStream</code> to
096: * load Java properties for this instance. This is used by the
097: * other constructor methods to keep the object simple.
098: *
099: * @param source this is the file that contains the properties
100: *
101: * @exception IOException if the properties can not be loaded
102: */
103: private FileProperties(InputStream source) throws IOException {
104: this .parser = new PropertyParser(this );
105: this .load(source);
106: }
107:
108: /**
109: * This overloads the <code>Properties.load</code> so that XML
110: * properties can be loaded as well as standard properties.
111: * Once this method is invoked the stream is examined to see
112: * if the properties format is in XML. If the file is a valid
113: * XML file then the properties are loaded int he XML format.
114: * Otherwise they are loaded using the traditional format.
115: *
116: * @param source the stream that contains the properties
117: */
118: public synchronized void load(InputStream source)
119: throws IOException {
120: try {
121: parser.load(source);
122: } catch (Exception e) {
123: throw new PropertyException(e);
124: }
125: }
126: }
|