1 22 23 package org.continuent.sequoia.controller.xml; 24 25 import java.io.BufferedReader ; 26 import java.io.File ; 27 import java.io.FileReader ; 28 import java.io.IOException ; 29 import java.io.InputStream ; 30 import java.io.StringReader ; 31 import java.net.InetAddress ; 32 import java.net.URL ; 33 import java.net.URLDecoder ; 34 import java.util.ArrayList ; 35 36 import org.continuent.sequoia.common.i18n.Translate; 37 import org.continuent.sequoia.common.log.Trace; 38 import org.continuent.sequoia.common.net.SSLConfiguration; 39 import org.continuent.sequoia.common.xml.ControllerXmlTags; 40 import org.continuent.sequoia.common.xml.XmlValidator; 41 import org.continuent.sequoia.controller.core.Controller; 42 import org.continuent.sequoia.controller.core.ControllerConfiguration; 43 import org.continuent.sequoia.controller.core.ControllerConstants; 44 import org.continuent.sequoia.controller.core.ReportManager; 45 import org.xml.sax.Attributes ; 46 import org.xml.sax.InputSource ; 47 import org.xml.sax.SAXException ; 48 import org.xml.sax.SAXParseException ; 49 import org.xml.sax.XMLReader ; 50 import org.xml.sax.helpers.DefaultHandler ; 51 import org.xml.sax.helpers.XMLReaderFactory ; 52 53 61 public class ControllerParser extends DefaultHandler 62 { 63 64 static Trace logger = Trace 65 .getLogger(ControllerParser.class 66 .getName()); 67 static Trace endUserLogger = Trace 68 .getLogger("org.continuent.sequoia.enduser"); 69 70 71 private XMLReader parser; 72 73 74 private ControllerConfiguration config; 75 private Controller controller; 76 private SSLConfiguration ssl; 77 private String controllerIP; 78 private ReportManager reportManager; 79 80 88 public ControllerParser(ControllerConfiguration configure) throws Exception 89 { 90 this.config = configure; 91 this.controller = configure.getController(); 92 93 parser = XMLReaderFactory.createXMLReader(); 95 96 parser.setFeature("http://xml.org/sax/features/validation", true); 98 99 parser.setErrorHandler(this); 101 102 parser.setContentHandler(this); 104 105 parser.setEntityResolver(this); 107 } 108 109 116 public void readXML(String xml) throws IOException , SAXException 117 { 118 if (xml != null) 119 { 120 InputSource input = new InputSource (new StringReader (xml)); 121 parser.parse(input); 122 } 123 else 124 throw new IOException ("Input was null in input source."); 125 } 126 127 135 public void readXML(String xml, boolean validateBeforeParsing) 136 throws IOException , SAXException 137 { 138 if (validateBeforeParsing) 139 { 140 XmlValidator validator = new XmlValidator( 141 ControllerConstants.SEQUOIA_CONTROLLER_DTD_FILE, xml.toString()); 142 if (logger.isDebugEnabled()) 143 { 144 if (validator.isDtdValid()) 145 logger.debug(Translate.get("controller.xml.dtd.validated")); 146 if (validator.isXmlValid()) 147 logger.debug(Translate.get("controller.xml.document.validated")); 148 } 149 150 if (validator.getWarnings().size() > 0) 151 { 152 ArrayList warnings = validator.getWarnings(); 153 for (int i = 0; i < warnings.size(); i++) 154 logger.warn(Translate.get("virtualdatabase.xml.parsing.warning", 155 warnings.get(i))); 156 } 157 158 if (!validator.isDtdValid()) 159 logger.error(Translate.get("controller.xml.dtd.not.validated")); 160 if (!validator.isXmlValid()) 161 logger.error(Translate.get("controller.xml.document.not.validated")); 162 163 ArrayList errors = validator.getExceptions(); 164 for (int i = 0; i < errors.size(); i++) 165 logger.error(((Exception ) errors.get(i)).getMessage()); 166 167 if (!validator.isValid()) 168 throw new SAXException (Translate 169 .get("controller.xml.document.not.valid")); 170 } 171 readXML(xml); 172 } 173 174 182 public void readXML(FileReader fileReader, boolean validateBeforeParsing) 183 throws IOException , SAXException 184 { 185 if (fileReader != null) 186 { 187 188 BufferedReader in = new BufferedReader (fileReader); 190 StringBuffer xml = new StringBuffer (); 191 String line; 192 do 193 { 194 line = in.readLine(); 195 if (line != null) 196 xml.append(line); 197 } 198 while (line != null); 199 200 readXML(xml.toString(), validateBeforeParsing); 201 } 202 else 203 { 204 throw new IOException ("Input was null in input source."); 205 } 206 } 207 208 215 public void fatalError(SAXParseException e) throws SAXException 216 { 217 String msg = Translate.get("controller.xml.parsing.fatal", new String []{ 218 e.getPublicId(), String.valueOf(e.getLineNumber()), 219 String.valueOf(e.getColumnNumber()), e.getMessage()}); 220 logger.error(msg); 221 endUserLogger.fatal(msg); 222 throw e; 223 } 224 225 232 public void error(SAXParseException e) throws SAXException 233 { 234 logger.error(Translate.get("controller.xml.parsing.error", new String []{ 235 e.getPublicId(), String.valueOf(e.getLineNumber()), 236 String.valueOf(e.getColumnNumber()), e.getMessage()})); 237 throw e; 238 } 239 240 248 public InputSource resolveEntity(String publicId, String systemId) 249 throws SAXException 250 { 251 logger.debug(Translate.get("controller.xml.dtd.using", 252 ControllerConstants.SEQUOIA_CONTROLLER_DTD_FILE)); 253 InputStream stream = ControllerParser.class.getResourceAsStream("/" 254 + ControllerConstants.SEQUOIA_CONTROLLER_DTD_FILE); 255 if (stream == null) 256 { 257 throw new SAXException (Translate.get( 258 "controller.xml.dtd.not.found", 259 ControllerConstants.PRODUCT_NAME, 260 ControllerConstants.SEQUOIA_CONTROLLER_DTD_FILE)); 261 } 262 263 return new InputSource (stream); 264 } 265 266 271 public void startDocument() throws SAXException 272 { 273 logger.debug(Translate.get("controller.xml.parsing.document")); 274 } 275 276 281 public void endDocument() throws SAXException 282 { 283 logger.info(Translate.get("controller.xml.done")); 284 } 285 286 295 public void startElement(String uri, String localName, String name, 296 Attributes atts) throws SAXException 297 { 298 logger.debug(Translate.get("controller.xml.parsing.start", name)); 299 if (name.equalsIgnoreCase(ControllerXmlTags.ELT_CONTROLLER)) 300 configureController(atts); 301 else if (name.equalsIgnoreCase(ControllerXmlTags.ELT_REPORT)) 302 configureReport(atts); 303 else if (name.equalsIgnoreCase(ControllerXmlTags.ELT_JMX)) 304 configureRmiJmxAdaptor(atts); 305 else if (name.equalsIgnoreCase(ControllerXmlTags.ELT_SSL)) 306 configureSSL(atts); 307 else if (name.equalsIgnoreCase(ControllerXmlTags.ELT_VIRTUAL_DATABASE)) 308 configureVirtualDatabase(atts); 309 } 310 311 319 public void endElement(String uri, String localName, String name) 320 throws SAXException 321 { 322 if (name.equalsIgnoreCase(ControllerXmlTags.ELT_JMX)) 324 { 325 config.setUpJmx(ssl); 326 ssl = null; 327 } 328 329 if (name.equalsIgnoreCase(ControllerXmlTags.ELT_CONTROLLER)) 330 { 331 if (ssl != null) 332 { 333 controller.setSslConfiguration(ssl); 335 } 336 337 if (reportManager == null) 339 { 340 reportManager = new ReportManager(controller); 341 reportManager.setSettings(null); 342 controller.setReport(reportManager); 343 } 344 } 345 logger.debug(Translate.get("controller.xml.parsing.end", name)); 346 } 347 348 354 private void configureController(Attributes atts) throws SAXException 355 { 356 try 358 { 359 String controllerPort = atts 360 .getValue(ControllerXmlTags.ATT_CONTROLLER_PORT); 361 if (controllerPort == null) 362 config.put(ControllerXmlTags.ATT_CONTROLLER_PORT, String 363 .valueOf(ControllerConstants.DEFAULT_PORT)); 364 else 365 config.put(ControllerXmlTags.ATT_CONTROLLER_PORT, controllerPort); 366 config.getController().setJdbcPortNumber( 367 Integer.parseInt((String ) config 368 .get(ControllerXmlTags.ATT_CONTROLLER_PORT))); 369 370 controllerIP = atts.getValue(ControllerXmlTags.ATT_CONTROLLER_IP); 371 if (controllerIP == null) 372 { 373 try 374 { 375 383 String localIP = InetAddress.getLocalHost().getHostAddress(); 384 config.put(ControllerXmlTags.ATT_CONTROLLER_IP, localIP); 385 } 386 catch (RuntimeException e1) 387 { 388 logger 389 .warn("Unable to obtain IP address of controller, setting default address: " 390 + ControllerConstants.DEFAULT_IP); 391 config.put(ControllerXmlTags.ATT_CONTROLLER_IP, 392 ControllerConstants.DEFAULT_IP); 393 } 394 } 395 else 396 config.put(ControllerXmlTags.ATT_CONTROLLER_IP, controllerIP); 397 config.getController().setIPAddress( 398 (String ) config.get(ControllerXmlTags.ATT_CONTROLLER_IP)); 399 400 String name = atts.getValue(ControllerXmlTags.ATT_CONTROLLER_NAME); 401 config.getController().setControllerName(name); 403 config.put(ControllerXmlTags.ATT_CONTROLLER_NAME, config.getController() 404 .getControllerName()); 405 406 String controllerBacklog = atts 407 .getValue(ControllerXmlTags.ATT_BACKLOG_SIZE); 408 if (controllerBacklog == null) 409 config.put(ControllerXmlTags.ATT_BACKLOG_SIZE, String 410 .valueOf(ControllerConstants.DEFAULT_BACKLOG_SIZE)); 411 else 412 config.put(ControllerXmlTags.ATT_BACKLOG_SIZE, controllerBacklog); 413 config.getController().setBacklogSize( 414 Integer.parseInt((String ) config 415 .get(ControllerXmlTags.ATT_BACKLOG_SIZE))); 416 417 config.put(ControllerXmlTags.ATT_ALLOW_ADDITIONAL_DRIVER, atts 418 .getValue(ControllerXmlTags.ATT_ALLOW_ADDITIONAL_DRIVER)); 419 } 420 catch (Exception e) 421 { 422 logger.warn("Error while configuring controller", e); 423 throw new SAXException (e.getMessage()); 424 } 425 } 426 427 432 private void configureReport(Attributes atts) 433 { 434 config.put(ControllerXmlTags.ATT_REPORT_ENABLED, "true"); 435 config.put(ControllerXmlTags.ATT_REPORT_HIDE_SENSITIVE_DATA, atts 436 .getValue(ControllerXmlTags.ATT_REPORT_HIDE_SENSITIVE_DATA)); 437 config.put(ControllerXmlTags.ATT_REPORT_GENERATE_ON_SHUTDOWN, atts 438 .getValue(ControllerXmlTags.ATT_REPORT_GENERATE_ON_SHUTDOWN)); 439 config.put(ControllerXmlTags.ATT_REPORT_GENERATE_ON_FATAL, atts 440 .getValue(ControllerXmlTags.ATT_REPORT_GENERATE_ON_FATAL)); 441 config.put(ControllerXmlTags.ATT_REPORT_DELETE_ON_SHUTDOWN, atts 442 .getValue(ControllerXmlTags.ATT_REPORT_DELETE_ON_SHUTDOWN)); 443 String reportLocation = atts 444 .getValue(ControllerXmlTags.ATT_REPORT_REPORT_LOCATION); 445 446 if ((reportLocation == null) || reportLocation.equals("")) 447 { 448 reportLocation = System.getProperty("sequoia.log"); 449 if (reportLocation == null) 450 reportLocation = "."; 451 } 452 config.put(ControllerXmlTags.ATT_REPORT_REPORT_LOCATION, reportLocation); 453 454 config.put(ControllerXmlTags.ATT_REPORT_ENABLE_FILE_LOGGING, atts 455 .getValue(ControllerXmlTags.ATT_REPORT_ENABLE_FILE_LOGGING)); 456 reportManager = new ReportManager(controller); 457 reportManager.setSettings(config); 458 controller.setReport(reportManager); 459 } 460 461 466 private void configureRmiJmxAdaptor(Attributes atts) 467 { 468 config.put(ControllerXmlTags.ATT_JMX_ADAPTOR_IP, atts 469 .getValue(ControllerXmlTags.ATT_JMX_ADAPTOR_IP)); 470 config.put(ControllerXmlTags.ATT_JMX_ADAPTOR_PORT, atts 471 .getValue(ControllerXmlTags.ATT_JMX_ADAPTOR_PORT)); 472 473 String username = atts 474 .getValue(ControllerXmlTags.ATT_JMX_CONNECTOR_USERNAME); 475 String password = atts 476 .getValue(ControllerXmlTags.ATT_JMX_CONNECTOR_PASSWORD); 477 if (username != null) 478 config.put(ControllerXmlTags.ATT_JMX_CONNECTOR_USERNAME, username); 479 if (password != null) 480 config.put(ControllerXmlTags.ATT_JMX_CONNECTOR_PASSWORD, password); 481 } 482 483 488 private void configureSSL(Attributes atts) 489 { 490 ssl = new SSLConfiguration(); 491 String keyStore = atts.getValue(ControllerXmlTags.ATT_SSL_KEYSTORE); 492 String keyStorePassword = atts 493 .getValue(ControllerXmlTags.ATT_SSL_KEYSTORE_PASSWORD); 494 String keyStoreKeyPassword = atts 495 .getValue(ControllerXmlTags.ATT_SSL_KEYSTORE_KEYPASSWORD); 496 String trustStore = atts.getValue(ControllerXmlTags.ATT_SSL_TRUSTSTORE); 497 String trustStorePassword = atts 498 .getValue(ControllerXmlTags.ATT_SSL_TRUSTSTORE_PASSWORD); 499 ssl.setKeyStore(new File (keyStore)); 500 501 if (keyStoreKeyPassword == null) 503 keyStoreKeyPassword = keyStorePassword; 504 if (trustStore == null) 505 trustStore = keyStore; 506 if (trustStorePassword == null) 507 trustStorePassword = keyStorePassword; 508 509 ssl.setKeyStorePassword(keyStorePassword); 510 ssl.setKeyStoreKeyPassword(keyStoreKeyPassword); 511 ssl.setClientAuthenticationRequired("true".equals(atts 512 .getValue(ControllerXmlTags.ATT_SSL_NEED_CLIENT_AUTH))); 513 ssl.setTrustStore(new File (trustStore)); 514 ssl.setTrustStorePassword(trustStorePassword); 515 } 516 517 523 private void configureVirtualDatabase(Attributes atts) throws SAXException 524 { 525 String virtualName = atts 526 .getValue(ControllerXmlTags.ATT_VIRTUAL_DATABASE_NAME); 527 String file = atts.getValue(ControllerXmlTags.ATT_VIRTUAL_DATABASE_FILE); 528 529 if (file.indexOf(File.separator) == -1) 532 { 533 try 534 { 535 URL url = this.getClass().getResource("/" + file); 536 file = url.getFile(); 537 logger.info(Translate.get("controller.configure.using", file)); 538 } 539 catch (Exception e) 540 { 541 throw new SAXException (Translate.get( 542 "controller.configure.file.not.found", file)); 543 } 544 } 545 546 file = URLDecoder.decode(file); 547 548 File checkExist = new File (file); 549 if (checkExist.exists() == false) 550 throw new SAXException (Translate.get( 551 "controller.configure.file.not.found", file)); 552 553 int autoLoad = -1; 554 String autoLoadString = atts 555 .getValue(ControllerXmlTags.ATT_VIRTUAL_DATABASE_AUTO_ENABLE); 556 557 if (autoLoadString.equalsIgnoreCase(ControllerXmlTags.VAL_true)) 558 autoLoad = ControllerConstants.AUTO_ENABLE_TRUE; 559 else 560 autoLoad = ControllerConstants.AUTO_ENABLE_FALSE; 561 562 logger.info(Translate.get("controller.configure.setup", new String []{ 563 virtualName, String.valueOf(autoLoad)})); 564 config.setUpVirtualDatabase(file, virtualName, autoLoad); 565 } 566 567 } | Popular Tags |