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