001 package toolbus; 002 003 import java.io.File; 004 import java.io.FileInputStream; 005 import java.io.FileNotFoundException; 006 import java.io.IOException; 007 import java.util.Map; 008 import java.util.HashMap; 009 import java.util.Iterator; 010 import java.util.Properties; 011 import java.util.regex.Matcher; 012 import java.util.regex.Pattern; 013 014 public class PropertyManager{ 015 private final Properties properties; 016 private String propertyFileName = null; 017 private final Map<String, String> defines; 018 private final Map<String, String> toolClasspaths; 019 private String includes = ""; 020 private String tbscript = null; 021 private int port; 022 private boolean withConsole = false; 023 024 public PropertyManager(String[] args){ 025 port = -1; 026 027 defines = new HashMap<String, String>(); 028 toolClasspaths = new HashMap<String, String>(); 029 030 properties = new Properties(System.getProperties()); 031 032 handleComandLineArguments(args); 033 034 FileInputStream fis = null; 035 try{ 036 fis = new FileInputStream(getPropertyFile()); 037 properties.load(fis); 038 }catch(FileNotFoundException fnfio){ 039 // Ignore this. 040 }catch(IOException ioex){ 041 System.err.println("Cannot open configuration file; using built-in settings."); 042 }finally{ 043 if(fis != null){ 044 try{ 045 fis.close(); 046 }catch(IOException ioex){ 047 System.err.println("Unable to close properties file stream."+ioex.getMessage()); 048 } 049 } 050 } 051 052 Iterator<String> definesIterator = defines.keySet().iterator(); 053 while(definesIterator.hasNext()){ 054 String key = definesIterator.next(); 055 056 set(key, defines.get(key)); 057 } 058 Iterator<String> toolClasspathsIterator = toolClasspaths.keySet().iterator(); 059 while(definesIterator.hasNext()){ 060 String key = toolClasspathsIterator.next(); 061 062 set(key, defines.get(key)); 063 } 064 if(includes != ""){ 065 set("include.path", includes); 066 } 067 if(tbscript != null){ 068 set("script.path", tbscript); 069 } 070 } 071 072 private void handleComandLineArguments(String args[]){ 073 Pattern pdefine = Pattern.compile("-D(.*)=(.*)"); 074 Pattern pinclude = Pattern.compile("-I(.*)"); 075 Pattern pscript = Pattern.compile("-S(.*)"); 076 Pattern pport = Pattern.compile("-P(.*)"); 077 Pattern toolClassPath = Pattern.compile("-TC(.*)=(.*)"); 078 079 for(int i = 0; i < args.length; i++){ 080 String arg = args[i]; 081 if(arg.equals("-properties") && i + 1 < args.length){ 082 propertyFileName = args[++i]; 083 }else if(arg.equals("--with-console")){ 084 withConsole = true; 085 }else if(arg.equals("-output") && i + 1 < args.length){ 086 set("gentifs.output", args[++i]); 087 }else{ 088 Matcher mdefine = pdefine.matcher(arg); 089 if(mdefine.matches()){ 090 String name = mdefine.group(1); 091 String val = "\"" + mdefine.group(2) + "\""; 092 //System.err.println("define: name = " + name + ", " + " val = " + val); 093 defines.put(name, val); 094 }else{ 095 Matcher idefine = pinclude.matcher(arg); 096 if(idefine.matches()){ 097 String name = idefine.group(1); 098 //System.err.println("include: name = " + name); 099 includes = (includes == "") ? name : includes + ", " + name; 100 }else{ 101 Matcher sdefine = pscript.matcher(arg); 102 if (sdefine.matches()) { 103 String name = sdefine.group(1); 104 //System.err.println("tbscript: name = " + name); 105 if (tbscript != null) { 106 System.err.println("tbscript: already defined (" + tbscript + ")"); 107 } 108 tbscript = name; 109 }else{ 110 Matcher portDefine = pport.matcher(arg); 111 if(portDefine.matches()){ 112 String portNumber = portDefine.group(1); 113 port = Integer.parseInt(portNumber); 114 }else{ 115 Matcher toolClassPathMatcher = toolClassPath.matcher(arg); 116 if(toolClassPathMatcher.matches()){ 117 String toolClasspathName = toolClassPathMatcher.group(1); 118 String classpath = toolClassPathMatcher.group(2); 119 120 toolClasspaths.put(toolClasspathName, classpath); 121 } 122 } 123 } 124 } 125 } 126 } 127 } 128 } 129 130 /** 131 * Get the name of the property file to be used 132 */ 133 private String getPropertyFile() throws FileNotFoundException{ 134 if(propertyFileName != null){ 135 return propertyFileName; 136 } 137 String user = System.getProperty("user.name"); 138 139 String hostname = ToolBus.getHostName(); 140 141 String[] prefix = new String[]{user + "@" + hostname + "-", user + "-", ""}; 142 for(int i = 0; i < prefix.length; i++){ 143 String fname = prefix[i] + "toolbus.props"; 144 File f = new File(fname); 145 if(f.exists()){ 146 return fname; 147 } 148 } 149 150 throw new FileNotFoundException("Property file"); 151 } 152 153 public String get(String p){ 154 return properties.getProperty(p); 155 } 156 157 public String get(String p, String def){ 158 return properties.getProperty(p, def); 159 } 160 161 public void set(String key, String val){ 162 properties.setProperty(key, val); 163 } 164 165 public int getUserSpecifiedPort(){ 166 return port; 167 } 168 169 public boolean withConsole(){ 170 return withConsole; 171 } 172 }