1 53 package com.ivata.groupware.admin.struts; 54 55 import java.io.File ; 56 import java.io.FileNotFoundException ; 57 import java.io.FileOutputStream ; 58 import java.io.FileReader ; 59 import java.io.FileWriter ; 60 import java.io.IOException ; 61 import java.io.InputStream ; 62 import java.io.OutputStream ; 63 import java.sql.Connection ; 64 import java.sql.DriverManager ; 65 import java.sql.ResultSet ; 66 import java.sql.Statement ; 67 import java.util.Map ; 68 69 import javax.servlet.http.HttpServletRequest ; 70 import javax.servlet.http.HttpServletResponse ; 71 import javax.servlet.http.HttpSession ; 72 73 import net.sf.hibernate.Hibernate; 74 import net.sf.hibernate.util.DTDEntityResolver; 75 76 import org.apache.log4j.Logger; 77 import org.apache.struts.Globals; 78 import org.apache.struts.action.ActionErrors; 79 import org.apache.struts.action.ActionForm; 80 import org.apache.struts.action.ActionMapping; 81 import org.apache.struts.action.ActionMessage; 82 import org.dom4j.Document; 83 import org.dom4j.DocumentException; 84 import org.dom4j.Element; 85 import org.dom4j.io.OutputFormat; 86 import org.dom4j.io.SAXReader; 87 import org.dom4j.io.XMLWriter; 88 89 import com.ivata.groupware.admin.security.Security; 90 import com.ivata.groupware.admin.security.server.SecuritySession; 91 import com.ivata.groupware.admin.security.struts.LoginGuestAction; 92 import com.ivata.groupware.admin.setting.Settings; 93 import com.ivata.groupware.container.PicoContainerFactory; 94 import com.ivata.groupware.container.persistence.hibernate.HibernateSetupConstants; 95 import com.ivata.groupware.struts.SetupAction; 96 import com.ivata.mask.MaskFactory; 97 import com.ivata.mask.util.StringHandling; 98 import com.ivata.mask.util.SystemException; 99 import com.ivata.mask.util.ThrowableHandling; 100 import com.ivata.mask.web.struts.MaskAction; 101 import com.ivata.mask.web.struts.MaskAuthenticator; 102 103 111 public class HibernateSetupAction extends LoginGuestAction 112 implements SetupAction { 113 116 private static final Logger logger = 117 Logger.getLogger(HibernateSetupAction.class); 118 125 private static String getHibernateXPath(final String propertyName) { 126 return "/hibernate-configuration/session-factory/property[@name='" 127 + propertyName 128 + "']"; 129 } 130 133 private Map actions; 134 143 public HibernateSetupAction(final Security securityParam, 144 final Settings settingsParam, 145 final MaskFactory maskFactoryParam, 146 final MaskAuthenticator authenticatorParam) { 147 super(securityParam, settingsParam, maskFactoryParam, 148 authenticatorParam); 149 } 150 156 private void checkConnection(final HibernateSetupForm setupForm, 157 final ActionErrors errorMessages) { 158 String databaseDriver = setupForm.getDatabaseDriver(); 159 String databasePassword = setupForm.getDatabasePassword(); 160 String databaseURL = setupForm.getDatabaseURL(); 161 String databaseUserName = setupForm.getDatabaseUserName(); 162 try { 165 Class.forName(databaseDriver); 166 try { 167 Connection connection = DriverManager.getConnection( 168 databaseURL, 169 databaseUserName, 170 databasePassword); 171 Statement statement = connection.createStatement(); 172 ResultSet allSettings = statement.executeQuery( 174 "select name, value, type from setting where " 175 + "person_user is null"); 176 if (!allSettings.next()) { 177 errorMessages.add(null, new ActionMessage( 178 "errors.setup.databaseSettings", 179 databaseURL, 180 databaseUserName)); 181 } 182 } catch (Exception e) { 183 logger.error(e.getClass().getName() 186 + ": connecting to URL '" 187 + setupForm.getDatabaseURL() 188 + "'", 189 e); 190 Throwable cause = ThrowableHandling.getCause(e); 191 errorMessages.add(null, new ActionMessage( 192 "errors.setup.databaseConnection", 193 databaseURL, 194 databaseUserName, 195 cause.getClass().getName(), 196 StringHandling.getNotNull(cause.getMessage()))); 197 } 198 } catch (ClassNotFoundException e) { 199 logger.error(e.getClass().getName() 202 + ": looking for driver '" 203 + setupForm.getDatabaseDriver() 204 + "'", 205 e); 206 errorMessages.add(null, new ActionMessage( 207 "errors.setup.databaseDriver", 208 databaseDriver)); 209 } 210 } 211 220 protected String checkForm(final ActionMapping mappingParam, 221 final ActionForm formParam) { 222 if (!"setupForm".equals(mappingParam.getName())) { 223 return "setupAction"; 224 } 225 return null; 226 } 227 242 private static void copyStartDB(final ActionErrors errorMessages, 243 final File dbFile, 244 final File propertiesFile, 245 final File scriptFile, 246 final File lockFile) { 247 if (logger.isDebugEnabled()) { 248 logger.debug("Creating database."); 249 } 250 251 File dbDirectory = dbFile.getParentFile(); 252 if ((dbDirectory != null) 254 && !dbDirectory.exists()) { 255 if (!dbDirectory.mkdirs()) { 256 logger.error("Could not create directory '" 257 + dbDirectory.getAbsolutePath() 258 + "'."); 259 errorMessages.add(null, new ActionMessage( 260 "errors.setup.databaseDirectory", 261 dbDirectory.getAbsolutePath())); 262 } 263 } 264 if (dbDirectory.exists()) { 266 if (lockFile.exists()) { 268 logger.warn("Removing previous lock file '" 269 + lockFile.getAbsolutePath() 270 + "'."); 271 if(!lockFile.delete()) { 272 logger.error("COULD NOT REMOVE previous lock file '" 273 + lockFile.getAbsolutePath() 274 + "'."); 275 } 276 } 277 278 try { 282 byte[] buffer = new byte[1024]; 283 int bytesRead; 284 InputStream inputStream = Hibernate.class 285 .getResourceAsStream(HibernateSetupConstants.START_DB 286 + HibernateSetupConstants.HSQLDB_PROPERTIES_SUFFIX); 287 if (inputStream == null) { 288 throw new FileNotFoundException ("Could not " 289 + "locate HypersonicSQL properties file '" 290 + HibernateSetupConstants.START_DB 291 + HibernateSetupConstants.HSQLDB_PROPERTIES_SUFFIX 292 + "'"); 293 } 294 295 OutputStream outputStream = new FileOutputStream ( 296 propertiesFile); 297 while ((bytesRead = inputStream.read(buffer, 0, 298 buffer.length)) != -1) { 299 outputStream.write(buffer, 0, bytesRead); 300 } 301 inputStream = Hibernate.class 302 .getResourceAsStream(HibernateSetupConstants.START_DB 303 + HibernateSetupConstants.HSQLDB_SCRIPT_SUFFIX); 304 if (inputStream == null) { 305 throw new FileNotFoundException ("Could not " 306 + "locate HypersonicSQL script file '" 307 + HibernateSetupConstants.START_DB 308 + HibernateSetupConstants.HSQLDB_SCRIPT_SUFFIX 309 + "'"); 310 } 311 outputStream = new FileOutputStream (scriptFile); 312 while ((bytesRead = inputStream.read(buffer, 0, 313 buffer.length)) != -1) { 314 outputStream.write(buffer, 0, bytesRead); 315 } 316 } catch (Exception e) { 317 logger.error("Could not copy database resources.", e); 318 errorMessages.add(null, new ActionMessage( 319 "errors.setup.databaseResources", 320 e.getClass().getName(), 321 e.getMessage())); 322 } 323 } 324 } 325 339 private static boolean copyStartDB( 340 final ActionErrors errorMessages, 341 final String databaseURL, 342 final String confirmOverwriteString) { 343 String dbPath = databaseURL.substring( 344 HibernateSetupConstants.AUTOMATIC_DATABASE_URL_START.length()); 345 File dbFile = new File (dbPath); 346 if (logger.isDebugEnabled()) { 347 logger.debug("Database path is '" 348 + dbPath 349 + "', for URL '" 350 + databaseURL 351 + "'"); 352 } 353 File propertiesFile = new File (dbPath 354 + HibernateSetupConstants.HSQLDB_PROPERTIES_SUFFIX); 355 File scriptFile = new File (dbPath 356 + HibernateSetupConstants.HSQLDB_SCRIPT_SUFFIX); 357 File lockFile = new File (dbPath 358 + HibernateSetupConstants.HSQLDB_LOCK_SUFFIX); 359 boolean databaseExists = (propertiesFile.exists() 362 || scriptFile.exists()); 363 boolean confirmOverwrite = "true".equals(confirmOverwriteString); 364 if ((confirmOverwriteString == null) 367 && databaseExists) { 368 return false; 369 } 370 if ((!databaseExists) 371 || confirmOverwrite) { 372 copyStartDB(errorMessages, dbFile, 373 propertiesFile, scriptFile, lockFile); 374 } 375 return true; 376 } 377 378 390 public String execute(ActionMapping mappingParam, ActionErrors errorsParam, 391 ActionForm formParam, HttpServletRequest requestParam, 392 HttpServletResponse responseParam, HttpSession session) 393 throws SystemException { 394 SecuritySession securitySession = (SecuritySession) 396 session.getAttribute("securitySession"); 397 if (securitySession == null) { 398 super.execute(mappingParam, errorsParam, formParam, requestParam, 399 responseParam, session); 400 securitySession = (SecuritySession) 401 session.getAttribute("securitySession"); 402 } 403 if (formParam == null) { 404 return "setup"; 405 } 406 HibernateSetupForm setupForm = (HibernateSetupForm) formParam; 407 ActionErrors errorMessages = new ActionErrors(); 410 Document document = readHibernateConfig(errorMessages); 411 String uRL = HibernateSetupConstants.AUTOMATIC_DATABASE_MEMORY_URL; 412 if (errorMessages.isEmpty()) { 413 Element element = (Element) 416 document.selectSingleNode(getHibernateXPath( 417 HibernateSetupConstants 418 .HIBERNATE_PROPERTY_DATABASE_URL)); 419 if (element != null) { 420 uRL = element.getTextTrim(); 421 } 422 } 423 if (securitySession.isGuest() 426 && !HibernateSetupConstants.AUTOMATIC_DATABASE_MEMORY_URL 427 .equals(uRL)) { 428 return "setupSecurity"; 429 } 430 if (HibernateSetupConstants.AUTOMATIC_DATABASE_MEMORY_URL.equals(uRL)) { 433 setupForm.setCreateDatabaseAutomatically(true); 434 } else { 435 setupForm.setCreateDatabaseAutomatically(false); 437 setupForm.setDatabaseURL(uRL); 438 Element element = (Element) 439 document.selectSingleNode(getHibernateXPath( 440 HibernateSetupConstants 441 .HIBERNATE_PROPERTY_DATABASE_DIALECT)); 442 setupForm.setDatabaseDialect(element.getTextTrim()); 443 element = (Element) 444 document.selectSingleNode(getHibernateXPath( 445 HibernateSetupConstants 446 .HIBERNATE_PROPERTY_DATABASE_DRIVER)); 447 setupForm.setDatabaseDriver(element.getTextTrim()); 448 element = (Element) 449 document.selectSingleNode(getHibernateXPath( 450 HibernateSetupConstants 451 .HIBERNATE_PROPERTY_DATABASE_PASSWORD)); 452 setupForm.setDatabasePassword(element.getTextTrim()); 453 element = (Element) 454 document.selectSingleNode(getHibernateXPath( 455 HibernateSetupConstants.HIBERNATE_PROPERTY_DATABASE_USER_NAME)); 456 setupForm.setDatabaseUserName(element.getTextTrim()); 457 } 458 return null; 459 } 460 475 public String onConfirm(ActionMapping mappingParam, 476 ActionErrors errorMessages, ActionForm formParam, 477 HttpServletRequest request, HttpServletResponse responseParam, 478 HttpSession session, String defaultForwardParam) 479 throws SystemException { 480 HibernateSetupForm setupForm = (HibernateSetupForm)formParam; 481 if (formParam == null) { 482 return "setup"; 483 } 484 if (setupForm.isCreateDatabaseAutomatically()) { 486 String confirmOverwriteString = 488 request.getParameter("confirmOverwrite"); 489 if (!copyStartDB( 490 errorMessages, setupForm.getDatabaseURL(), 491 confirmOverwriteString)) { 492 return "setupConfirm"; 493 } 494 } 495 496 if (errorMessages.isEmpty()) { 500 checkConnection(setupForm, errorMessages); 501 } 502 Document document = null; 506 if (errorMessages.isEmpty()) { 507 document = readHibernateConfig(errorMessages); 508 } 509 if ((document != null) 511 && errorMessages.isEmpty()) { 512 updateHibernateConfig(document, setupForm, errorMessages); 513 } 514 if ((document != null) 516 && errorMessages.isEmpty()) { 517 writeHibernateConfig(document, errorMessages); 518 } 519 520 if (errorMessages.isEmpty()) { 524 SecuritySession securitySession = (SecuritySession) 526 session.getAttribute("securitySession"); 527 if ((securitySession == null) 528 || !securitySession.isGuest()) { 529 super.execute(mappingParam, errorMessages, formParam, request, 530 responseParam, session); 531 } 532 assert (actions != null); 535 actions.clear(); 536 resetFactoryUpdateSettings(setupForm, (SecuritySession) 537 session.getAttribute("securitySession"), session); 538 } 539 540 if (errorMessages.isEmpty()) { 543 servlet.getServletContext().setAttribute( 548 HibernateSetupConstants.CONFIRM_ATTRIBUTE, 549 Boolean.TRUE); 550 return defaultForwardParam; 551 } 552 553 request.setAttribute(Globals.ERROR_KEY, errorMessages); 555 return null; 556 } 557 564 private Document readHibernateConfig(final ActionErrors errorMessages) { 565 String hibernateConfigPath = 566 servlet.getServletContext().getRealPath( 567 HibernateSetupConstants.HIBERNATE_CONFIG); 568 SAXReader reader = new SAXReader(); 569 Document document = null; 570 try { 572 reader.setEntityResolver(new DTDEntityResolver()); 575 document = reader.read(new FileReader (hibernateConfigPath)); 577 } catch (FileNotFoundException e) { 578 logger.error(e.getClass().getName() 579 + ": reading the hibernate config '" 580 + HibernateSetupConstants.HIBERNATE_CONFIG 581 + "', real path '" 582 + hibernateConfigPath 583 + "'", 584 e); 585 errorMessages.add(null, new ActionMessage( 586 "errors.setup.hibernateConfigRead", 587 e.getClass().getName(), 588 HibernateSetupConstants.HIBERNATE_CONFIG, 589 hibernateConfigPath, 590 e.getMessage())); 591 } catch (DocumentException e) { 592 logger.error(e.getClass().getName() 593 + ": reading the hibernate config '" 594 + HibernateSetupConstants.HIBERNATE_CONFIG 595 + "', real path '" 596 + hibernateConfigPath 597 + "'", 598 e); 599 errorMessages.add(null, new ActionMessage( 600 "errors.setup.hibernateConfigRead", 601 e.getClass().getName(), 602 HibernateSetupConstants.HIBERNATE_CONFIG, 603 hibernateConfigPath, 604 e.getMessage())); 605 } 606 return document; 607 } 608 616 protected void resetFactoryUpdateSettings( 617 final HibernateSetupForm hibernateSetupForm, 618 final SecuritySession securitySession, 619 final HttpSession session) 620 throws SystemException { 621 PicoContainerFactory factory = PicoContainerFactory.getInstance(); 622 factory.reset(); 623 factory.initialize(); 624 } 625 631 public void setActions(Map actionsParam) { 632 this.actions = actionsParam; 633 } 634 642 private void setHibernateProperty(final String propertyName, 643 final String text, final Document document, 644 final ActionErrors errorMessages) { 645 String xPath = getHibernateXPath(propertyName); 647 Element element = (Element) 648 document.selectSingleNode( 649 xPath); 650 if (element == null) { 651 errorMessages.add(null, new ActionMessage( 652 "errors.setup.hibernateConfigElement", 653 HibernateSetupConstants.HIBERNATE_CONFIG, 654 xPath)); 655 } else { 656 element.setText(text); 657 } 658 } 659 668 private void updateHibernateConfig(final Document document, 669 final HibernateSetupForm setupForm, 670 final ActionErrors errorMessages) { 671 setHibernateProperty( 672 HibernateSetupConstants.HIBERNATE_PROPERTY_DATABASE_DRIVER, 673 setupForm.getDatabaseDriver(), 674 document, 675 errorMessages); 676 setHibernateProperty( 677 HibernateSetupConstants.HIBERNATE_PROPERTY_DATABASE_URL, 678 setupForm.getDatabaseURL(), 679 document, 680 errorMessages); 681 setHibernateProperty( 682 HibernateSetupConstants.HIBERNATE_PROPERTY_DATABASE_DIALECT, 683 setupForm.getDatabaseDialect(), 684 document, 685 errorMessages); 686 setHibernateProperty( 687 HibernateSetupConstants.HIBERNATE_PROPERTY_DATABASE_USER_NAME, 688 setupForm.getDatabaseUserName(), 689 document, 690 errorMessages); 691 setHibernateProperty( 692 HibernateSetupConstants.HIBERNATE_PROPERTY_DATABASE_PASSWORD, 693 setupForm.getDatabasePassword(), 694 document, 695 errorMessages); 696 } 697 704 private void writeHibernateConfig(final Document document, 705 final ActionErrors errorMessages) throws SystemException { 706 String hibernateConfigPath = 708 servlet.getServletContext().getRealPath( 709 HibernateSetupConstants.HIBERNATE_CONFIG); 710 PicoContainerFactory.getInstance().setHibernateConfigFileName( 711 hibernateConfigPath); 712 SAXReader reader = new SAXReader(); 713 try { 715 XMLWriter writer = new XMLWriter( 716 new FileWriter (hibernateConfigPath), 717 new OutputFormat(" ", true)); 718 writer.write(document); 719 writer.close(); 720 } catch (IOException e) { 721 logger.error(e.getClass().getName() 722 + ": writing the hibernate config '" 723 + HibernateSetupConstants.HIBERNATE_CONFIG 724 + "', real path '" 725 + hibernateConfigPath 726 + "'", 727 e); 728 errorMessages.add(null, new ActionMessage( 729 "errors.setup.hibernateConfigRead", 730 e.getClass().getName(), 731 HibernateSetupConstants.HIBERNATE_CONFIG, 732 hibernateConfigPath, 733 e.getMessage())); 734 } 735 } 736 } 737 | Popular Tags |