001// Copyright (c) 2001 Hursh Jain (http://www.mollypages.org) 
002// The Molly framework is freely distributable under the terms of an
003// MIT-style license. For details, see the molly pages web site at:
004// http://www.mollypages.org/. Use, modify, have fun !
005
006package fc.util;
007
008import fc.util.*;
009import fc.io.*;
010import java.io.*;
011import java.util.*;
012import java.util.logging.*;
013
014/** 
015Loads properties from a file. Trims whitespace from
016property values, in contrast to ({@link java.util.Property} does not trim whitespace from
017values, so "x = y " will return "y ", which is hard to
018debug).
019<p>
020ThreadSafety: This class <b>is</b> thread safe and can be used by multiple 
021threads concurrently.
022
023@author hursh jain 
024@version 1.1 5/31/2002
025*/
026public class FilePropertyMgr extends PropertyMgr
027{
028String myname = getClass().getName();
029
030Properties  props;
031File    propertyFile;
032
033public FilePropertyMgr(File propertyFile) 
034throws IOException
035  {
036  props = new Properties();
037  this.propertyFile = propertyFile;
038  try {
039    props.load(new BufferedInputStream(
040          new FileInputStream(propertyFile)));
041    log.info(myname, "; Loaded properties from file: ", propertyFile);
042    log.bug(IOUtil.propertiesToString(props));
043    }
044  catch (IOException e) { 
045    log.error("Cannot open file: ", propertyFile.getAbsolutePath());
046    log.error("*** PropertyMgr will not be available ***", e);
047    throw e;
048    }
049  }
050  
051public String get(String name)
052  {
053  final String prop = props.getProperty(name);
054  if (prop != null) {
055    return prop.trim();   
056    }
057  return prop;
058  }
059
060public String set(String name, String value)
061  {
062  Object obj = props.setProperty(name, value);
063  return (String) obj;
064  }
065
066public void save() throws IOException
067  {
068  String header = "Properties saved on: " + new Date();
069  props.store( new FileOutputStream(propertyFile),  header );
070  }
071
072
073/**
074Returns a description but the exact details of said description
075are unspecified and subject to change. However, the following
076may be regarded as typical:
077<tt>
078[getClass().getName()] contains the following properties: <br>
079[List of properties]
080</tt>
081**/
082public String toString()
083  {
084  String temp = myname + "; contains the following properties: " + IOUtil.LINE_SEP;
085  temp += IOUtil.propertiesToString(props);
086  temp += "------------------------";
087  return temp;
088  }
089
090public static void main(String[] args)
091  {
092  new Test();
093  }
094
095static private class Test 
096{
097Test() 
098{
099final String filename = "./FilePropertyMgr_test.txt";
100try {
101
102  class FooFilePropertyMgr extends FilePropertyMgr 
103    { 
104    public FooFilePropertyMgr(String filename) throws Exception {
105      super(new File(filename));
106      }
107    
108    protected void handleError(String msg) {
109      System.out.println("Error: " + msg);
110      }
111    }
112    
113  FilePropertyMgr fp = new FooFilePropertyMgr(filename);
114  System.out.println("got required property 'foo' = " + fp.getRequired("foo"));
115  System.out.println("got required property 'abc' = " + fp.getRequired("abc"));
116  System.out.println("got required property 'x.y' = " + fp.getRequired("x.y"));
117  System.out.println("got required property 'num' = " + fp.getRequiredInt("num"));
118  System.out.println("got required property 'bool' = " + fp.getRequiredBoolean("bool"));
119
120  System.out.println("got property 'num2' = " + fp.getInt("num2", 123));
121  System.out.println("got property 'bool2' = " + fp.getBoolean("bool2", false));
122
123  System.out.println("Getting bad format properties...");
124  System.out.println("got required property 'num3' = " + fp.getRequiredInt("num3"));
125  System.out.println("got required property 'bool3' = " + fp.getRequiredBoolean("bool3"));
126  System.out.println("got property 'num3' = " + fp.getInt("num3", 123));
127  System.out.println("got property 'bool3' = " + fp.getBoolean("bool3", false));
128
129  System.out.println("now calling the FilePropertyMgr.toString()");
130  System.out.println(fp.toString());
131  
132  System.out.println("The following should exit the test");
133  fp = new FilePropertyMgr(new File(filename));
134  System.out.println("got property 'test.don'texist' = " + fp.getRequired("test.don'texist"));
135  } 
136catch (Exception e) {
137  e.printStackTrace();
138  } 
139}
140
141} //~end Test
142
143
144}           //~class FilePropertyMgr