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 006 package fc.util; 007 008 import fc.util.*; 009 import fc.io.*; 010 import java.io.*; 011 import java.util.*; 012 import java.util.logging.*; 013 014 /** 015 Loads properties from a file. Trims whitespace from 016 property values, in contrast to ({@link java.util.Property} does not trim whitespace from 017 values, so "x = y " will return "y ", which is hard to 018 debug). 019 <p> 020 ThreadSafety: This class <b>is</b> thread safe and can be used by multiple 021 threads concurrently. 022 023 @author hursh jain 024 @version 1.1 5/31/2002 025 */ 026 public class FilePropertyMgr extends PropertyMgr 027 { 028 String myname = getClass().getName(); 029 030 Properties props; 031 File propertyFile; 032 033 public FilePropertyMgr(File propertyFile) 034 throws 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 051 public 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 060 public String set(String name, String value) 061 { 062 Object obj = props.setProperty(name, value); 063 return (String) obj; 064 } 065 066 public void save() throws IOException 067 { 068 String header = "Properties saved on: " + new Date(); 069 props.store( new FileOutputStream(propertyFile), header ); 070 } 071 072 073 /** 074 Returns a description but the exact details of said description 075 are unspecified and subject to change. However, the following 076 may be regarded as typical: 077 <tt> 078 [getClass().getName()] contains the following properties: <br> 079 [List of properties] 080 </tt> 081 **/ 082 public 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 090 public static void main(String[] args) 091 { 092 new Test(); 093 } 094 095 static private class Test 096 { 097 Test() 098 { 099 final String filename = "./FilePropertyMgr_test.txt"; 100 try { 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 } 136 catch (Exception e) { 137 e.printStackTrace(); 138 } 139 } 140 141 } //~end Test 142 143 144 } //~class FilePropertyMgr