1 21 22 package org.opensubsystems.core.persist.db; 23 24 import java.sql.Connection ; 25 import java.sql.SQLException ; 26 import java.util.Properties ; 27 import java.util.logging.Logger ; 28 29 import javax.transaction.SystemException ; 30 31 import org.opensubsystems.core.error.OSSConfigException; 32 import org.opensubsystems.core.error.OSSDatabaseAccessException; 33 import org.opensubsystems.core.error.OSSException; 34 import org.opensubsystems.core.persist.db.connectionpool.DBCPDatabaseConnectionFactoryImpl; 35 import org.opensubsystems.core.persist.db.connectionpool.J2EEDatabaseConnectionFactoryImpl; 36 import org.opensubsystems.core.util.ClassFactory; 37 import org.opensubsystems.core.util.Config; 38 import org.opensubsystems.core.util.GlobalConstants; 39 import org.opensubsystems.core.util.J2EEUtils; 40 import org.opensubsystems.core.util.Log; 41 42 56 public abstract class DatabaseConnectionFactoryImpl implements DatabaseConnectionFactory 57 { 58 60 64 public static final String DATABASE_DRIVER = "oss.datasource.driver"; 65 66 70 public static final String DATABASE_URL = "oss.datasource.url"; 71 72 76 public static final String DATABASE_USER = "oss.datasource.user"; 77 78 82 public static final String DATABASE_PASSWORD = "oss.datasource.password"; 83 84 88 public static final String DATABASE_ADMIN_USER = "oss.datasource.adminuser"; 89 90 94 public static final String DATABASE_ADMIN_PASSWORD = "oss.datasource.adminpassword"; 95 96 102 public static final String DATABASE_USE_ADMIN_DATAROURCE 103 = "oss.datasource.admindatasource"; 104 105 107 111 public static final boolean DATABASE_USE_ADMIN_DATAROURCE_DEFAULT = false; 112 113 116 private static final String DBCF_IMPL_LOCK = "DBCF_IMPL_LOCK"; 117 118 122 public static final String SPY_DRIVER_IDENTIFICATION = "p6spy"; 123 124 127 public static final String SPY_CONFIG_FILE_NAME = "spy.properties"; 128 129 133 public static final String SPY_REALDRIVER = "realdriver"; 134 135 141 public static final String ADMIN_DATASOURCE_NAME = "OSSADMDS"; 142 143 145 148 private static Logger s_logger = Log.getInstance(DatabaseConnectionFactoryImpl.class); 149 150 153 private static DatabaseConnectionFactory s_defaultInstance = null; 154 155 162 protected DatabaseTransactionFactoryImpl m_transactionFactory = null; 163 164 166 171 protected int m_iRequestedConnectionCount; 172 173 180 protected String m_strDatabaseDriver = null; 181 182 186 protected String m_strRealDatabaseDriver = null; 187 188 192 protected String m_strDatabaseURL = null; 193 194 198 protected String m_strDatabaseUser = null; 199 200 204 protected String m_strDatabasePassword = null; 205 206 212 protected String m_strDatabaseAdminUser = null; 213 214 220 protected String m_strDatabaseAdminPassword = null; 221 222 229 protected boolean m_bUseAdminDataSource = false; 230 231 233 236 public DatabaseConnectionFactoryImpl( 237 ) 238 { 239 this(null); 240 } 241 242 248 public DatabaseConnectionFactoryImpl( 249 DatabaseTransactionFactoryImpl transactionFactory 250 ) 251 { 252 super(); 253 254 m_iRequestedConnectionCount = 0; 258 m_transactionFactory = transactionFactory; 259 } 260 261 274 public DatabaseConnectionFactoryImpl( 275 String strDriver, 276 String strURL, 277 String strUser, 278 String strPassword, 279 DatabaseTransactionFactoryImpl transactionFactory 280 ) throws OSSConfigException, 281 OSSDatabaseAccessException 282 { 283 super(); 284 285 initializeDriver(strDriver); 287 288 setDatabaseDriver(strDriver); 290 setDatabaseURL(strURL); 291 setDatabaseUser(strUser); 292 setDatabasePassword(strPassword); 293 294 m_iRequestedConnectionCount = 0; 295 m_transactionFactory = transactionFactory; 296 } 297 298 300 309 public static DatabaseConnectionFactory getInstance( 310 ) throws OSSException 311 { 312 if (s_defaultInstance == null) 313 { 314 synchronized (DBCF_IMPL_LOCK) 318 { 319 if (s_defaultInstance == null) 320 { 321 DatabaseConnectionFactory connectionFactory; 322 DatabaseTransactionFactory transactionFactory; 323 324 transactionFactory = DatabaseTransactionFactoryImpl.getInstance(); 325 326 Class defaultConnectionFactoryImpl = DBCPDatabaseConnectionFactoryImpl.class; 329 330 if (J2EEUtils.getJ2EEServerType() != J2EEUtils.J2EE_SERVER_NO) 334 { 335 defaultConnectionFactoryImpl = J2EEDatabaseConnectionFactoryImpl.class; 336 } 337 338 connectionFactory = (DatabaseConnectionFactory)ClassFactory.getInstance( 339 ).createInstance(DatabaseConnectionFactory.class, 340 defaultConnectionFactoryImpl); 341 if ((connectionFactory instanceof DatabaseConnectionFactoryImpl) 342 && (transactionFactory instanceof DatabaseTransactionFactoryImpl)) 343 { 344 ((DatabaseConnectionFactoryImpl)connectionFactory).setTransactionFactory( 347 (DatabaseTransactionFactoryImpl)transactionFactory); 348 } 349 350 setInstance(connectionFactory); 351 } 352 } 353 } 354 355 return s_defaultInstance; 356 } 357 358 366 public static void setInstance( 367 DatabaseConnectionFactory dcfDefaultConnectionFactory 368 ) 369 { 370 if (GlobalConstants.ERROR_CHECKING) 371 { 372 assert dcfDefaultConnectionFactory != null 373 : "Default database connection factory instance cannot be null"; 374 } 375 376 synchronized (DBCF_IMPL_LOCK) 377 { 378 s_defaultInstance = dcfDefaultConnectionFactory; 379 s_logger.fine("Default database connection factory is " 380 + s_defaultInstance.getClass().getName()); 381 } 382 } 383 384 389 390 393 public final Connection requestConnection( 394 boolean bAutoCommit 395 ) throws OSSDatabaseAccessException 396 { 397 Connection con; 398 399 if (m_transactionFactory == null) 400 { 401 s_logger.finest("Requesting connection without transaction factory."); 404 con = requestNonTransactionalConnection(bAutoCommit); 405 } 406 else 407 { 408 con = m_transactionFactory.requestTransactionalConnection(bAutoCommit, 411 null, null, null, this); 412 } 413 414 return con; 415 } 416 417 420 public final Connection requestConnection( 421 boolean bAutoCommit, 422 String strUser, 423 String strPassword 424 ) throws OSSDatabaseAccessException 425 { 426 Connection con; 427 428 if (m_transactionFactory == null) 429 { 430 s_logger.finest("Requesting connection without transaction factory."); 433 con = requestNonTransactionalConnection(bAutoCommit, strUser, strPassword); 434 } 435 else 436 { 437 con = m_transactionFactory.requestTransactionalConnection(bAutoCommit, 440 null, strUser, strPassword, this); 441 } 442 443 return con; 444 } 445 446 449 public final Connection requestConnection( 450 boolean bAutoCommit, 451 String strDataSourceName 452 ) throws OSSDatabaseAccessException 453 { 454 Connection con; 455 456 if (m_transactionFactory == null) 457 { 458 s_logger.finest("Requesting connection without transaction factory."); 461 con = requestNonTransactionalConnection(bAutoCommit, strDataSourceName); 462 } 463 else 464 { 465 con = m_transactionFactory.requestTransactionalConnection(bAutoCommit, 468 strDataSourceName, null, null, this); 469 } 470 471 return con; 472 } 473 474 477 public final Connection requestConnection( 478 boolean bAutoCommit, 479 String strDataSourceName, 480 String strUser, 481 String strPassword 482 ) throws OSSDatabaseAccessException 483 { 484 Connection con; 485 486 if (m_transactionFactory == null) 487 { 488 s_logger.finest("Requesting connection without transaction factory."); 491 con = requestNonTransactionalConnection(bAutoCommit, strDataSourceName, 492 strUser, strPassword); 493 } 494 else 495 { 496 con = m_transactionFactory.requestTransactionalConnection(bAutoCommit, 499 strDataSourceName, strUser, strPassword, 500 this); 501 } 502 503 return con; 504 } 505 506 509 public final void returnConnection( 510 Connection cntDBConnection 511 ) 512 { 513 if (m_transactionFactory == null) 514 { 515 s_logger.finest("Returning connection without transaction factory."); 518 returnNonTransactionalConnection(cntDBConnection); 519 } 520 else 521 { 522 m_transactionFactory.returnTransactionalConnection(cntDBConnection, this); 526 } 527 } 528 529 531 537 public void setTransactionFactory( 538 DatabaseTransactionFactoryImpl transactionFactory 539 ) 540 { 541 if (GlobalConstants.ERROR_CHECKING) 542 { 543 assert m_transactionFactory == null 544 : "Transaction factory can be set only if it is not set."; 545 } 546 547 m_transactionFactory = transactionFactory; 548 } 549 550 553 public String getDatabaseDriver( 554 ) 555 { 556 return m_strDatabaseDriver; 557 } 558 559 562 public void setDatabaseDriver( 563 String strDatabaseDriver 564 ) 565 { 566 if (GlobalConstants.ERROR_CHECKING) 567 { 568 assert m_strDatabaseDriver == null 571 : "Database driver cannot be changed once set"; 572 } 573 574 m_strDatabaseDriver = strDatabaseDriver; 575 } 576 577 580 public String getDatabasePassword( 581 ) 582 { 583 return m_strDatabasePassword; 584 } 585 586 589 public void setDatabasePassword( 590 String strDatabasePassword 591 ) 592 { 593 if (GlobalConstants.ERROR_CHECKING) 594 { 595 assert m_strDatabasePassword == null 598 : "Database password cannot be changed once set"; 599 } 600 601 m_strDatabasePassword = strDatabasePassword; 602 } 603 604 607 public String getDatabaseURL( 608 ) 609 { 610 return m_strDatabaseURL; 611 } 612 613 616 public void setDatabaseURL( 617 String strDatabaseURL 618 ) 619 { 620 if (GlobalConstants.ERROR_CHECKING) 621 { 622 assert m_strDatabaseURL == null 625 : "Database URL cannot be changed once set"; 626 } 627 628 m_strDatabaseURL = strDatabaseURL; 629 } 630 631 634 public String getDatabaseUser( 635 ) 636 { 637 return m_strDatabaseUser; 638 } 639 640 643 public void setDatabaseUser( 644 String strDatabaseUser 645 ) 646 { 647 if (GlobalConstants.ERROR_CHECKING) 648 { 649 assert m_strDatabaseUser == null 652 : "Database user cannot be changed once set"; 653 } 654 655 m_strDatabaseUser = strDatabaseUser; 656 } 657 658 661 public String getDatabaseAdminUser( 662 ) 663 { 664 return m_strDatabaseAdminUser; 665 } 666 667 670 public void setDatabaseAdminUser( 671 String strDatabaseUser 672 ) 673 { 674 if (GlobalConstants.ERROR_CHECKING) 675 { 676 assert m_strDatabaseAdminUser == null 679 : "Database admin user cannot be changed once set"; 680 } 681 682 m_strDatabaseAdminUser = strDatabaseUser; 683 } 684 685 688 public String getDatabaseAdminPassword( 689 ) 690 { 691 return m_strDatabaseAdminPassword; 692 } 693 694 697 public void setDatabaseAdminPassword( 698 String strDatabasePassword 699 ) 700 { 701 if (GlobalConstants.ERROR_CHECKING) 702 { 703 assert m_strDatabaseAdminPassword == null 706 : "Database admin password cannot be changed once set"; 707 } 708 709 m_strDatabaseAdminPassword = strDatabasePassword; 710 } 711 712 715 public boolean getUseAdminDataSource( 716 ) 717 { 718 return m_bUseAdminDataSource; 719 } 720 721 724 public void setUseAdminDataSource( 725 boolean bUseAdminDataSource 726 ) 727 { 728 m_bUseAdminDataSource = bUseAdminDataSource; 729 } 730 731 734 public void loadDefaultDatabaseProperties( 735 ) throws OSSConfigException, 736 OSSDatabaseAccessException 737 { 738 Properties prpSettings; 739 String strDatabaseDriver; 740 String strDatabaseURL; 741 String strDatabaseUser; 742 String strDatabasePassword; 743 String strDatabaseAdminUser; 744 String strDatabaseAdminPassword; 745 boolean bUseAdminDataSource; 746 747 prpSettings = Config.getInstance().getPropertiesSafely(); 748 749 strDatabaseDriver = Config.getStringProperty(prpSettings, 750 DATABASE_DRIVER, 751 "JDBC driver class name"); 752 strDatabaseURL = Config.getStringProperty(prpSettings, 753 DATABASE_URL, 754 "Database URL"); 755 strDatabaseUser = Config.getStringProperty(prpSettings, 756 DATABASE_USER, 757 "User name of database user"); 758 strDatabasePassword = Config.getStringProperty(prpSettings, 760 DATABASE_PASSWORD, 761 "Password of database user", 762 true); 763 strDatabaseAdminUser = Config.getStringProperty( 764 prpSettings, 765 DATABASE_ADMIN_USER, 766 "User name of administrator database user"); 767 strDatabaseAdminPassword = Config.getStringProperty(prpSettings, 769 DATABASE_ADMIN_PASSWORD, 770 "Password of administrator database user", 771 true); 772 bUseAdminDataSource = Config.getBooleanProperty( 773 prpSettings, 774 DATABASE_USE_ADMIN_DATAROURCE, 775 DATABASE_USE_ADMIN_DATAROURCE_DEFAULT, 776 "Flag specifying if to use separate" 777 + " administrator data source"); 778 779 initializeDriver(strDatabaseDriver); 781 782 setDatabaseDriver(strDatabaseDriver); 784 setDatabaseURL(strDatabaseURL); 785 setDatabaseUser(strDatabaseUser); 786 setDatabasePassword(strDatabasePassword); 787 setDatabaseAdminUser(strDatabaseAdminUser); 788 setDatabaseAdminPassword(strDatabaseAdminPassword); 789 setUseAdminDataSource(bUseAdminDataSource); 790 } 791 792 799 public int getTotalRequestedConnectionCount( 800 ) 801 { 802 return m_iRequestedConnectionCount; 803 } 804 805 811 public String getRealDatabaseDriver( 812 ) 813 { 814 return m_strRealDatabaseDriver; 815 } 816 817 819 826 protected void initializeDriver( 827 String strDatabaseDriver 828 ) throws OSSConfigException, 829 OSSDatabaseAccessException 830 { 831 try 833 { 834 Class.forName(strDatabaseDriver).newInstance(); 835 } 836 catch (ClassNotFoundException cnfExc) 837 { 838 throw new OSSDatabaseAccessException("Cannot load JDBC driver " 840 + strDatabaseDriver, 841 cnfExc); 842 } 843 catch (IllegalAccessException iaeExc) 844 { 845 throw new OSSDatabaseAccessException("Cannot access JDBC driver " 847 + strDatabaseDriver, 848 iaeExc); 849 } 850 catch (InstantiationException ieExc) 851 { 852 throw new OSSDatabaseAccessException("Cannot instantiate JDBC driver " 854 + strDatabaseDriver, 855 ieExc); 856 } 857 858 if (strDatabaseDriver.indexOf(SPY_DRIVER_IDENTIFICATION) != -1) 860 { 861 Config spyConfig = new Config(SPY_CONFIG_FILE_NAME); 863 864 m_strRealDatabaseDriver = Config.getStringProperty(spyConfig, 865 SPY_REALDRIVER, 866 "Real JDBC driver class name"); 867 } 868 else 869 { 870 m_strRealDatabaseDriver = strDatabaseDriver; 871 } 872 } 873 874 894 protected void initializeConnection( 895 Connection cntDBConnection, 896 boolean bAutoCommit 897 ) throws SQLException  898 { 899 try 900 { 901 if ((m_transactionFactory != null) 902 && (m_transactionFactory.isTransactionInProgress())) 903 { 904 if ((m_transactionFactory != null) 906 && (m_transactionFactory.isTransactionMonitored())) 907 { 908 s_logger.finest("Setting autocommit to false. Requested autocommit" 909 + bAutoCommit + " and transaction is in progress."); 910 } 911 cntDBConnection.setAutoCommit(false); 912 } 913 else 914 { 915 if ((m_transactionFactory != null) 917 && (m_transactionFactory.isTransactionMonitored())) 918 { 919 s_logger.finest("Setting autocommit to requested autocommit " 920 + bAutoCommit + " since no transaction is in progress."); 921 } 922 cntDBConnection.setAutoCommit(bAutoCommit); 923 } 924 } 925 catch (SystemException sExc) 926 { 927 throw new SQLException ("Error while getting transaction status."); 928 } 929 catch (OSSException ossExc) 930 { 931 throw new SQLException ("Error while getting transaction status."); 932 } 933 934 } 935 936 955 protected abstract Connection requestNonTransactionalConnection( 956 boolean bAutoCommit 957 ) throws OSSDatabaseAccessException; 958 959 981 protected abstract Connection requestNonTransactionalConnection( 982 boolean bAutoCommit, 983 String strUser, 984 String strPassword 985 ) throws OSSDatabaseAccessException; 986 987 1008 protected abstract Connection requestNonTransactionalConnection( 1009 boolean bAutoCommit, 1010 String strDataSourceName 1011 ) throws OSSDatabaseAccessException; 1012 1013 1036 protected abstract Connection requestNonTransactionalConnection( 1037 boolean bAutoCommit, 1038 String strDataSourceName, 1039 String strUser, 1040 String strPassword 1041 ) throws OSSDatabaseAccessException; 1042 1043 1053 public abstract void returnNonTransactionalConnection( 1054 Connection cntDBConnection 1055 ); 1056} 1057
| Popular Tags
|