001package ca.uhn.hl7v2.util;
002
003import java.io.BufferedReader;
004import java.io.FileReader;
005import java.io.IOException;
006import java.util.Enumeration;
007import java.util.HashSet;
008import java.util.Properties;
009import java.util.Set;
010import java.util.StringTokenizer;
011
012import org.slf4j.Logger;
013import org.slf4j.LoggerFactory;
014
015/**
016 * Loads system properties from a file.  This is intended as a convenient way 
017 * of setting multiple system properties. 
018 * @deprecated
019 */
020public class PropertyLoader {
021    
022    private static final Logger log = LoggerFactory.getLogger(PropertyLoader.class);
023    private static Set<String> files = new HashSet<String>();
024    
025    private PropertyLoader() {
026    }
027    
028    /**
029     * Calls <code>loadProperties()</code> if it has not been called before for
030     * the given file.  If the given property file has already been loaded, this
031     * method does nothing.
032     */
033    public static void loadOnce(String propertyFileName) throws IOException {
034        if (!files.contains(propertyFileName)) {
035            loadProperties(propertyFileName);
036            files.add(propertyFileName);
037        }
038    }
039    
040    /**
041     * Reads given "property file" and sets system properties accordingly.  In the property file,
042     * there should be one property per line.  A line should consist of 1) the fully qualified property name,
043     * 2) one or more tabs, and 3) the value (everything after the first group of tabs and before any subsequent
044     * groups will be considered "the value").
045     * Lines in the file are consdidered comments if they begin with "%".
046     */
047    public static void loadProperties(String propertyFileName) throws IOException {
048        
049        //open stream from given property file
050        BufferedReader in = null;
051        in = new BufferedReader(new FileReader(propertyFileName));
052        
053        String line, key, value, delim = "\t";
054        StringTokenizer tok;
055        while ((line = in.readLine()) != null) {
056            //ignore comments
057            if (!line.startsWith("%")) {
058                key = null; value = null;
059                
060                //get property key and value
061                tok = new StringTokenizer(line, delim, false);
062                if (tok.hasMoreTokens()) key = tok.nextToken();
063                if (tok.hasMoreTokens()) value = tok.nextToken();
064                
065                //set property
066                if (key != null && value != null) {
067                    System.setProperty(key, value);
068                    log.debug("Setting system property {} to {}", key, value);
069                }
070            }
071        }
072        in.close();
073    }
074    
075    /** Test harness */
076    public static void main(String args[]) {
077        if (args.length != 1) {
078            System.out.println("Usage: PropertyLoader file");
079            System.exit(1);
080        }
081        
082        try {
083            System.setProperty("ca.uhn.hl7v2.util.status.level", "VERBOSE");
084            System.out.println("Loading properties in file " + args[0]);
085            loadOnce(args[0]);
086            System.out.println("Loading properties in file " + args[0] + " again");
087            loadOnce(args[0]);
088        } catch (Exception e) {
089            e.printStackTrace();
090        }
091        
092        Properties p = System.getProperties();
093        Enumeration<?> en = p.propertyNames();
094        while (en.hasMoreElements()) {
095            String key = (String) en.nextElement();
096            System.out.println("Property: " + key + " Value: " + System.getProperty(key));
097        }
098    }
099}