]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-2100 ruby on rails webapp : do not load JDBC datasource from JNDI in ruby on...
authorsimonbrandhof <simon.brandhof@gmail.com>
Wed, 13 Apr 2011 10:59:18 +0000 (12:59 +0200)
committersimonbrandhof <simon.brandhof@gmail.com>
Thu, 14 Apr 2011 14:57:16 +0000 (16:57 +0200)
sonar-core/src/main/java/org/sonar/jpa/dialect/Derby.java
sonar-core/src/main/java/org/sonar/jpa/dialect/Dialect.java
sonar-core/src/main/java/org/sonar/jpa/dialect/HsqlDb.java
sonar-core/src/main/java/org/sonar/jpa/dialect/MsSql.java
sonar-core/src/main/java/org/sonar/jpa/dialect/MySql.java
sonar-core/src/main/java/org/sonar/jpa/dialect/Oracle.java
sonar-core/src/main/java/org/sonar/jpa/dialect/PostgreSql.java
sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java
sonar-server/src/main/webapp/WEB-INF/app/models/server.rb
sonar-server/src/main/webapp/WEB-INF/config/database.yml
sonar-server/src/main/webapp/WEB-INF/config/environment.rb

index b0c0ec5614de1c402369bf1e1a78a25f4779d611..7f17ac50a67703b7fedb5bd2a010acbfd88a4d34 100644 (file)
@@ -35,10 +35,6 @@ public class Derby implements Dialect {
     return "derby";
   }
 
-  public String getActiveRecordDialectCode() {
-    return "derby";
-  }
-
   public Class<? extends org.hibernate.dialect.Dialect> getHibernateDialectClass() {
     return DerbyWithDecimalDialect.class;
   }
index 8a265b594303b853ec00b4997c945e38e3e115da..b2537a36096c3993845fcaa19df9d4a9fd14b1e5 100644 (file)
@@ -34,11 +34,6 @@ public interface Dialect {
    */
   Class<? extends org.hibernate.dialect.Dialect> getHibernateDialectClass();
 
-  /**
-   * @return the activerecord dialect to be used
-   */
-  String getActiveRecordDialectCode();
-
   /**
    * Used to autodetect a dialect for a given driver URL
    *
index b8440a7efa3f5fd6eca3a8b4bdbe404e4414e194..e5ffebe4477bef9bcc6c6f1596fe12db8fa3498d 100644 (file)
@@ -31,10 +31,6 @@ public class HsqlDb implements Dialect {
     return "hsqldb";
   }
 
-  public String getActiveRecordDialectCode() {
-    return "hsqldb";
-  }
-
   public Class<? extends org.hibernate.dialect.Dialect> getHibernateDialectClass() {
     return HSQLDialect.class;
   }
index 8e480719c2ae837c1ae5fa3dcaf28f10067cebee..764e8a5732451b0795f155af808a5d7e00b796e3 100644 (file)
@@ -32,10 +32,6 @@ public class MsSql implements Dialect {
     return "mssql";
   }
 
-  public String getActiveRecordDialectCode() {
-    return "sqlserver";
-  }
-
   public Class<? extends org.hibernate.dialect.Dialect> getHibernateDialectClass() {
     return MsSqlDialect.class;
   }
index 694e133579383f086fb858bcd49c6321907a7b38..e062e61aa4f74231968386cfe36a84a377d68070 100644 (file)
@@ -34,10 +34,6 @@ public class MySql implements Dialect {
     return "mysql";
   }
 
-  public String getActiveRecordDialectCode() {
-    return "mysql";
-  }
-
   public Class<? extends org.hibernate.dialect.Dialect> getHibernateDialectClass() {
     return MySqlWithDecimalDialect.class;
   }
index 990e617e1d05e9bb7c408422c3f1bfc22143d0c0..221848bb0a7cb3a3b19c92b23b913c61738d8716 100644 (file)
@@ -34,10 +34,6 @@ public class Oracle implements Dialect {
     return "oracle";
   }
 
-  public String getActiveRecordDialectCode() {
-    return "oracle";
-  }
-
   public Class<? extends org.hibernate.dialect.Dialect> getHibernateDialectClass() {
     return Oracle10gWithDecimalDialect.class;
   }
index b7741722b9da7b5202dc0e77be0c8349782795f3..65f3436ca33ceea4c419d719ba38f02430231720 100644 (file)
@@ -33,10 +33,6 @@ public class PostgreSql implements Dialect {
     return "postgresql";
   }
 
-  public String getActiveRecordDialectCode() {
-    return "postgre";
-  }
-
   public Class<? extends org.hibernate.dialect.Dialect> getHibernateDialectClass() {
     return PostgreSQLWithDecimalDialect.class;
   }
index d0544c0369254318afb89f285d463b8e1e6970ae..5c680ab91bcae67b2c595850114baf854d9d6d55 100644 (file)
@@ -46,11 +46,19 @@ import org.sonar.server.rules.ProfilesConsole;
 import org.sonar.server.rules.RulesConsole;
 import org.sonar.updatecenter.common.Version;
 
+import java.sql.Connection;
+import java.sql.SQLException;
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 
-public final class JRubyFacade implements ServerComponent {
+public final class JRubyFacade {
+
+  private static final JRubyFacade SINGLETON = new JRubyFacade();
+
+  public static JRubyFacade getInstance() {
+    return SINGLETON;
+  }
 
   public FilterResult executeFilter(Filter filter) {
     return getContainer().getComponent(FilterExecutor.class).execute(filter);
@@ -253,6 +261,10 @@ public final class JRubyFacade implements ServerComponent {
     return getContainer().getComponent(Configuration.class).getString(key, null);
   }
 
+  public Connection getConnection() throws SQLException {
+    return getContainer().getComponent(DatabaseConnector.class).getConnection();
+  }
+
   public Object getCoreComponentByClassname(String className) {
     if (className == null) {
       return null;
index 04574290983a7af0100f8cd20f4534dc70ef7aac..b9ce7cbe8dc824fd676d44f499750da84431dd96 100644 (file)
@@ -70,7 +70,7 @@ class Server
     add_property(sonar_info, 'Database Login') {sonar_property('sonar.jdbc.username')}
     add_property(sonar_info, 'Database Driver') {"#{jdbc_metadata.getDriverName()} #{jdbc_metadata.getDriverVersion()}"}
     add_property(sonar_info, 'Database Driver Class') {sonar_property('sonar.jdbc.driverClassName')}
-    add_property(sonar_info, 'Database Dialect (Hibernate/Rails)') {"#{@java_facade.getDialect().getId()} (#{@java_facade.getDialect().getHibernateDialectClass().getName()} / #{@java_facade.getDialect().getActiveRecordDialectCode()})"}
+    add_property(sonar_info, 'Database Dialect (Hibernate)') {"#{@java_facade.getDialect().getId()} (#{@java_facade.getDialect().getHibernateDialectClass().getName()})"}
     add_property(sonar_info, 'Database Validation Query') {sonar_property('sonar.jdbc.validationQuery')}
     add_property(sonar_info, 'Hibernate Default Schema') {sonar_property('sonar.hibernate.default_schema')}
     add_property(sonar_info, 'External User Authentication') {sonar_property(org.sonar.api.CoreProperties.CORE_AUTHENTICATOR_CLASS)}
index fe6f5b75f1e4b2b5eb4e0bb44a49d3fe2b309797..4dd0ad9ca87adf7f039a89a2cd9ec348cbb3ebff 100644 (file)
@@ -1,16 +1,6 @@
-<% java = Java::OrgSonarServerUi::JRubyFacade.new %>
+# JDBC configured is loaded from Sonar
 development:
   adapter: jdbc
-  jndi: <%= java.getConfigurationValue("sonar.jdbc.jndiName") || 'jdbc/sonar' %>
-  pool: 10
-  timeout: 5000
-  dialect: <%= java.getDialect().getActiveRecordDialectCode() %>
-  driver: none
   
 production:
-  adapter: jdbc
-  jndi: <%= java.getConfigurationValue("sonar.jdbc.jndiName") || 'jdbc/sonar' %>
-  pool: 10
-  timeout: 5000
-  dialect: <%= java.getDialect().getActiveRecordDialectCode() %>
-  driver: none
\ No newline at end of file
+  adapter: jdbc
\ No newline at end of file
index 632d8516cf2138ebe135d4f3449793435a404ac3..721bd127307cf1a8d12ac865980728b654f09d6c 100644 (file)
@@ -1,11 +1,5 @@
-# Be sure to restart your server when you modify this file
-
-# Uncomment below to force Rails into production mode when
-# you don't control web/app server and can't set it the proper way
-# ENV['RAILS_ENV'] ||= 'production'
-
 # Specifies gem version of Rails to use when vendor/rails is not present
-RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION
+#RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION
 
 # Bootstrap the Rails environment, frameworks, and default configuration
 require File.join(File.dirname(__FILE__), 'boot')
@@ -21,19 +15,6 @@ Rails::Initializer.run do |config|
   # you must remove the Active Record framework.
   config.frameworks -= [ :action_mailer ]
 
-  # Specify gems that this application depends on. 
-  # They can then be installed with "rake gems:install" on new installations.
-  # You have to specify the :lib option for libraries, where the Gem name (sqlite3-ruby) differs from the file itself (sqlite3)
-  # config.gem "bj"
-  # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
-  # config.gem "sqlite3-ruby", :lib => "sqlite3"
-  # config.gem "aws-s3", :lib => "aws/s3"
-
-  # Only load the plugins named here, in the order given. By default, all plugins 
-  # in vendor/plugins are loaded in alphabetical order.
-  # :all can be used as a placeholder for all plugins not explicitly named
-  # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
-
   # Add additional load paths for your own custom dirs
   # config.load_paths += %W( #{RAILS_ROOT}/extras )
 
@@ -68,8 +49,37 @@ Rails::Initializer.run do |config|
   # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
 end
 
-class ActiveRecord::Migration
 
+module ActiveRecord
+  module ConnectionAdapters
+
+    # Patch to delegate configuration of JDBC datasource to Sonar.
+    # See vendor/gems/activerecord-jdbc-adapter/lib/active_record/connection_adapters/jdbc_adapter.rb
+    class JdbcConnection
+      def initialize(config)
+        @config = config.symbolize_keys!
+        @config[:retry_count] ||= 5
+        @config[:connection_alive_sql] ||= ::Java::OrgSonarServerUi::JRubyFacade.getInstance().getConfigurationValue('sonar.jdbc.validationQuery')
+
+        @jndi_connection = true # used in JndiConnectionPoolCallbacks to close this initial connection
+        
+        @connection_factory = JdbcConnectionFactory.impl do
+          ::Java::OrgSonarServerUi::JRubyFacade.getInstance().getConnection()
+        end
+        @config[:driver] = ::Java::OrgSonarServerUi::JRubyFacade.getInstance().getConfigurationValue('sonar.jdbc.driverClassName')
+
+        connection # force the connection to load
+        set_native_database_types
+        @stmts = {}
+      rescue Exception => e
+        raise "Fail to connect to database: #{e}"
+      end
+    end
+  end
+end
+
+
+class ActiveRecord::Migration
   def self.alter_to_big_primary_key(tablename)
     dialect = ActiveRecord::Base.configurations[ ENV['RAILS_ENV'] ]["dialect"]
     case dialect