1 23 24 package org.continuent.sequoia.controller.core; 25 26 import java.io.File ; 27 import java.io.FileReader ; 28 import java.net.InetAddress ; 29 import java.net.URL ; 30 import java.net.URLDecoder ; 31 import java.net.UnknownHostException ; 32 import java.util.Hashtable ; 33 34 import javax.management.ObjectName ; 35 36 import org.apache.commons.cli.CommandLine; 37 import org.apache.commons.cli.CommandLineParser; 38 import org.apache.commons.cli.GnuParser; 39 import org.apache.commons.cli.HelpFormatter; 40 import org.apache.commons.cli.Option; 41 import org.apache.commons.cli.OptionGroup; 42 import org.apache.commons.cli.Options; 43 import org.apache.commons.cli.ParseException; 44 import org.continuent.sequoia.common.authentication.PasswordAuthenticator; 45 import org.continuent.sequoia.common.i18n.Translate; 46 import org.continuent.sequoia.common.jmx.JmxConstants; 47 import org.continuent.sequoia.common.log.Trace; 48 import org.continuent.sequoia.common.net.SSLConfiguration; 49 import org.continuent.sequoia.common.xml.ControllerXmlTags; 50 import org.continuent.sequoia.controller.jmx.MBeanServerManager; 51 import org.continuent.sequoia.controller.jmx.RmiConnector; 52 import org.continuent.sequoia.controller.monitoring.datacollector.DataCollector; 53 import org.continuent.sequoia.controller.xml.ControllerParser; 54 55 65 public class ControllerConfiguration extends Hashtable 66 { 67 private static final long serialVersionUID = -3766086549425915891L; 68 69 72 73 74 public static final String XML_FILE = "xmlFile"; 75 76 77 public static final String ADD_DRIVER_ENABLE = "addDriverEnable"; 78 79 80 static Trace logger = Trace 81 .getLogger(Controller.class 82 .getName()); 83 static Trace endUserLogger = Trace 84 .getLogger("org.continuent.sequoia.enduser"); 85 86 private Controller controller = null; 87 88 93 public ControllerConfiguration(String [] args) 94 { 95 System.setProperty("org.xml.sax.driver", 96 "org.apache.crimson.parser.XMLReaderImpl"); 97 98 URL defaultControllerXmlFile = ControllerConfiguration.class 99 .getResource("/" + ControllerConstants.DEFAULT_CONFIG_FILE); 100 if (defaultControllerXmlFile == null) 101 logger 102 .warn("Unable to find default controller.xml configuration file in CLASSPATH."); 103 else 104 { 105 String file = URLDecoder.decode(defaultControllerXmlFile.getFile()); 106 this.put(XML_FILE, file); 107 } 108 this.put(ControllerXmlTags.ATT_CONTROLLER_IP, 109 ControllerConstants.DEFAULT_IP); 110 this.put(ControllerXmlTags.ATT_CONTROLLER_PORT, String 111 .valueOf(ControllerConstants.DEFAULT_PORT)); 112 this.put(ControllerXmlTags.ATT_BACKLOG_SIZE, String 113 .valueOf(ControllerConstants.DEFAULT_BACKLOG_SIZE)); 114 115 Options options = createOptions(); 117 118 CommandLineParser parser = new GnuParser(); 120 CommandLine commandLine = null; 121 try 122 { 123 commandLine = parser.parse(options, args); 124 } 125 catch (ParseException e) 126 { 127 String msg = Translate.get("controller.configure.commandline.error"); 128 logger.fatal(msg, e); 129 endUserLogger.fatal(msg, e); 130 printUsage(options); 131 Runtime.getRuntime().exit(1); 132 } 133 134 int n = commandLine.getArgs().length; 136 for (int i = 0; i < n; i++) 137 { 138 String msg = Translate.get("controller.configure.unknown.option", 139 commandLine.getArgs()[i]); 140 logger.fatal(msg); 141 endUserLogger.fatal(msg); 142 printUsage(options); 143 Runtime.getRuntime().exit(1); 144 } 145 if (commandLine.hasOption('h')) 147 { 148 if (commandLine.getOptions().length > 1) 149 { 150 String msg = Translate.get("controller.configure.commandline.error"); 151 logger.fatal(msg); 152 endUserLogger.fatal(msg); 153 } 154 printUsage(options); 155 Runtime.getRuntime().exit(1); 156 } 157 158 if (commandLine.hasOption('v')) 160 { 161 if (commandLine.getOptions().length > 1) 162 { 163 String msg = Translate.get("controller.configure.commandline.error"); 164 logger.fatal(msg); 165 endUserLogger.fatal(msg); 166 printUsage(options); 167 } 168 else 169 System.out.println(Controller.getVersion()); 170 Runtime.getRuntime().exit(1); 171 } 172 173 if (commandLine.hasOption('j')) 175 { 176 String s = commandLine.getOptionValue('j'); 177 if (s != null) 178 { 179 this.put(ControllerXmlTags.ATT_JMX_ADAPTOR_PORT, s); 180 } 181 } 182 183 if (commandLine.hasOption('i')) 185 { 186 String ipAddress = commandLine.getOptionValue('i'); 187 if (ipAddress != null) 188 this.put(ControllerXmlTags.ATT_CONTROLLER_IP, ipAddress); 189 } 190 191 if (commandLine.hasOption('p')) 193 { 194 String port = commandLine.getOptionValue('p'); 195 if (port != null) 196 this.put(ControllerXmlTags.ATT_CONTROLLER_PORT, port); 197 } 198 199 if (commandLine.hasOption('f')) 201 { 202 this.remove(XML_FILE); 204 String filePath = commandLine.getOptionValue('f'); 205 File f = new File (filePath); 206 logger.debug(f.getAbsolutePath()); 207 if (f.exists() == false || f.isFile() == false) 208 logger 209 .warn(Translate.get("controller.configure.optional.file.invalid")); 210 else 211 this.put(XML_FILE, filePath); 212 } 213 } 214 215 224 public void setUpByXml(String filename) throws Exception 225 { 226 logger.info(Translate.get("controller.configure.loading.file", filename)); 227 FileReader fileReader = null; 228 try 229 { 230 fileReader = new FileReader (filename); 231 ControllerParser cparser = new ControllerParser(this); 232 cparser.readXML(fileReader, true); 233 fileReader.close(); 234 } 235 catch (Exception e) 236 { 237 logger.warn(Translate.get("controller.configure.xml.file.error", e), e); 238 throw e; 239 } 240 finally 241 { 242 if (fileReader != null) 243 fileReader.close(); 244 } 245 } 246 247 255 private Controller setup() throws Exception 256 { 257 String xml = (String ) this.get(XML_FILE); 258 259 String controllerName = (String ) this 260 .get(ControllerXmlTags.ATT_CONTROLLER_NAME); 261 265 String ipAddress = (String ) this.get(ControllerXmlTags.ATT_CONTROLLER_IP); 266 int portNumber = Integer.parseInt((String ) this 267 .get(ControllerXmlTags.ATT_CONTROLLER_PORT)); 268 int backlog = Integer.parseInt((String ) this 269 .get(ControllerXmlTags.ATT_BACKLOG_SIZE)); 270 boolean allowDriver = "true" 272 .equalsIgnoreCase((String ) get(ControllerXmlTags.ATT_ALLOW_ADDITIONAL_DRIVER)); 273 274 controller = new Controller(controllerName, ipAddress, portNumber, backlog, 275 allowDriver); 276 controller.setConfiguration(this); 277 org.continuent.sequoia.controller.management.Controller managedController = new org.continuent.sequoia.controller.management.Controller( 278 controller); 279 ObjectName name = JmxConstants.getControllerObjectName(); 280 MBeanServerManager.registerMBean(managedController, name); 281 controller.setNotificationBroadcasterSupport(managedController 282 .getBroadcaster()); 283 284 if (xml != null) 285 { 286 try 287 { 288 setUpByXml(xml); 289 } 290 catch (Exception e) 291 { 292 logger.error(Translate.get( 293 "controller.configure.load.file.failed.minimum.configuration", 294 new String []{xml, e.getMessage()}), e); 295 } 296 } 297 else 298 setUpJmx(null); 299 300 return this.controller; 301 } 302 303 311 public Controller getController() throws Exception 312 { 313 if (controller == null) 314 setup(); 315 return this.controller; 316 } 317 318 323 public void setUpJmx(SSLConfiguration ssl) 324 { 325 logger.info(Translate.get("jmx.configure.enabled")); 326 try 328 { 329 new DataCollector(controller); 330 String hostIP = (String ) get(ControllerXmlTags.ATT_JMX_ADAPTOR_IP); 331 if (hostIP == null) 332 hostIP = controller.getIPAddress(); 333 int port = Integer.parseInt((String ) this 334 .get(ControllerXmlTags.ATT_JMX_ADAPTOR_PORT)); 335 336 logger.info(Translate.get("controller.configure.start.jmx", hostIP + ":" 337 + port)); 338 339 PasswordAuthenticator authenticator = null; 340 if (this.containsKey(ControllerXmlTags.ATT_JMX_CONNECTOR_USERNAME)) 341 { 342 String username = (String ) get(ControllerXmlTags.ATT_JMX_CONNECTOR_USERNAME); 343 String password = (String ) get(ControllerXmlTags.ATT_JMX_CONNECTOR_PASSWORD); 344 authenticator = new PasswordAuthenticator(username, password); 345 } 346 RmiConnector rmi = new RmiConnector(controller.getControllerName(), 347 hostIP, port, authenticator, ssl); 348 rmi.start(); 349 controller.setRmiConnector(rmi); 350 351 logger.debug(Translate.get("controller.configure.jmx.started")); 352 } 353 catch (Exception e) 354 { 355 logger.error(Translate.get("controller.configure.jmx.fail.start", e), e); 356 } 357 } 358 359 367 public void setUpVirtualDatabase(String filePath, String virtualName, 368 int autoLoad) 369 { 370 try 371 { 372 controller.loadXmlConfiguration(filePath, virtualName, autoLoad); 373 if (logger.isDebugEnabled()) 374 logger.debug(Translate.get("controller.configure.file.autoload", 375 new String []{filePath, "" + autoLoad})); 376 377 } 378 catch (Exception e) 379 { 380 logger.error(Translate.get("controller.configure.load.file.failed", 381 new String []{filePath, e.getMessage()}), e); 382 } 383 } 384 385 390 private static void printUsage(Options options) 391 { 392 String header = Translate.get("controller.commandline.header", ControllerConstants.PRODUCT_NAME); 393 header += System.getProperty("line.separator"); 394 header += Translate.get("controller.commandline.options"); 395 String footer = Translate.get("controller.commandline.footer"); 396 397 (new HelpFormatter()).printHelp(80, "controller(.sh|.bat) [options]", 398 header, options, footer); 399 } 400 401 407 private static Options createOptions() 408 { 409 Options options = new Options(); 410 OptionGroup group = new OptionGroup(); 411 412 group.addOption(new Option("h", "help", false, Translate 414 .get("controller.commandline.option.help"))); 415 group.addOption(new Option("v", "version", false, Translate 416 .get("controller.commandline.option.version"))); 417 options.addOptionGroup(group); 418 419 options.addOption(new Option("j", "jmx", true, Translate.get( 421 "controller.commandline.option.jmx", "" 422 + JmxConstants.DEFAULT_JMX_RMI_PORT))); 423 424 String defaultIp = "127.0.0.1"; 426 try 427 { 428 defaultIp = InetAddress.getLocalHost().getHostAddress(); 429 } 430 catch (UnknownHostException e) 431 { 432 433 } 434 options.addOption(new Option("i", "ip", true, Translate.get( 435 "controller.commandline.option.ip", "" + defaultIp))); 436 437 options.addOption(new Option("p", "port", true, Translate.get( 439 "controller.commandline.option.port", "" 440 + ControllerConstants.DEFAULT_PORT))); 441 442 options.addOption(new Option("f", "file", true, Translate 444 .get("controller.commandline.option.file"))); 445 446 return options; 447 } 448 449 } | Popular Tags |