Completely remove GerritServer.properties

We now load our database settings in hosted development mode from
the $site_path/etc/gerrit.config, just like we would under daemon.
This reduces the number of weird configurations that are supported.

Change-Id: I0a13f16dd74bdb034d05650eadd5e36771109f3e
Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/.gitignore b/.gitignore
index 9f3c4e1..df4eae7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
 /.project
 /.settings/org.maven.ide.eclipse.prefs
-/GerritServer.properties
 /test_site
diff --git a/Documentation/dev-eclipse.txt b/Documentation/dev-eclipse.txt
index 81c5ae6..dab246b 100644
--- a/Documentation/dev-eclipse.txt
+++ b/Documentation/dev-eclipse.txt
@@ -82,9 +82,9 @@
 * Modify the name to be unique.
 
 * Switch to Arguments tab.
-* Edit the -d flag to match the path used during 'init'.  The
-  template launch configuration resolves to ../test_site since
-  that is what the documentation recommends.
+* Edit the `-d` program argument flag to match the path used during
+  'init'.  The template launch configuration resolves to ../test_site
+  since that is what the documentation recommends.
 
 * Switch to Common tab.
 * Change Save as to be Local file.
@@ -93,12 +93,22 @@
 Running Hosted Mode
 ~~~~~~~~~~~~~~~~~~~
 
-* Copy
-  `gerrit-war/src/main/webapp/WEB-INF/extra/GerritServer.properties_example`
-  to
-  `gerrit-parent/GerritServer.properties`.
-* Edit to match your database parameters.
-* Run the `gwtui_any` or `gwtui_mac` launch configuration.
+Duplicate the existing `gwtui_any` (or `gwtui_mac` if on Mac OS X)
+launch configuration:
+
+* Run -> Debug Configurations ...
+* Java Application -> `gwtui_any`
+* Right click, Duplicate
+
+* Modify the name to be unique.
+
+* Switch to Arguments tab.
+* Edit the `-Dgerrit.site_path=` VM argument to match the path
+  used during 'init'.  The template launch configuration resolves
+  to ../test_site since that is what the documentation recommends.
+
+* Switch to Common tab.
+* Change Save as to be Local file.
 
 
 GERRIT
diff --git a/gerrit-pgm/pom.xml b/gerrit-pgm/pom.xml
index ab04ed0..15b966e 100644
--- a/gerrit-pgm/pom.xml
+++ b/gerrit-pgm/pom.xml
@@ -39,11 +39,6 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-dbcp</groupId>
-      <artifactId>commons-dbcp</artifactId>
-    </dependency>
-
-    <dependency>
       <groupId>com.h2database</groupId>
       <artifactId>h2</artifactId>
     </dependency>
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
index add0a93..8c592e6 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.pgm;
 
-import static com.google.gerrit.pgm.util.DataSourceProvider.Context.MULTI_USER;
+import static com.google.gerrit.server.schema.DataSourceProvider.Context.MULTI_USER;
 
 import com.google.gerrit.httpd.HttpCanonicalWebUrlProvider;
 import com.google.gerrit.httpd.WebModule;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Gsql.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Gsql.java
index 0d27391..f7182ae 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Gsql.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Gsql.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.pgm;
 
-import static com.google.gerrit.pgm.util.DataSourceProvider.Context.SINGLE_USER;
+import static com.google.gerrit.server.schema.DataSourceProvider.Context.SINGLE_USER;
 
 import com.google.gerrit.lifecycle.LifecycleManager;
 import com.google.gerrit.pgm.util.RuntimeShutdown;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
index 98456f6..324bef1 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Init.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.pgm;
 
-import static com.google.gerrit.pgm.util.DataSourceProvider.Context.SINGLE_USER;
+import static com.google.gerrit.server.schema.DataSourceProvider.Context.SINGLE_USER;
 import static com.google.inject.Stage.PRODUCTION;
 
 import com.google.gerrit.common.PageLinks;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java
index ff94df1..c3270ab 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/InitDatabase.java
@@ -16,11 +16,11 @@
 
 import static com.google.gerrit.pgm.init.InitUtil.die;
 import static com.google.gerrit.pgm.init.InitUtil.username;
-import static com.google.gerrit.pgm.util.DataSourceProvider.Type.H2;
+import static com.google.gerrit.server.schema.DataSourceProvider.Type.H2;
 
 import com.google.gerrit.pgm.util.ConsoleUI;
-import com.google.gerrit.pgm.util.DataSourceProvider;
 import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.schema.DataSourceProvider;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
index f039f0f..fad5878 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/UpgradeFrom2_0_x.java
@@ -19,8 +19,8 @@
 import static com.google.gerrit.pgm.init.InitUtil.saveSecure;
 
 import com.google.gerrit.pgm.util.ConsoleUI;
-import com.google.gerrit.pgm.util.DataSourceProvider;
 import com.google.gerrit.server.config.SitePaths;
+import com.google.gerrit.server.schema.DataSourceProvider;
 import com.google.gerrit.server.util.SocketUtil;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
index 9d86984..c7cf057 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java
@@ -21,6 +21,7 @@
 import com.google.gerrit.server.config.DatabaseModule;
 import com.google.gerrit.server.config.GerritServerConfigModule;
 import com.google.gerrit.server.config.SitePath;
+import com.google.gerrit.server.schema.DataSourceProvider;
 import com.google.gwtorm.client.OrmException;
 import com.google.inject.AbstractModule;
 import com.google.inject.CreationException;
diff --git a/gerrit-server/pom.xml b/gerrit-server/pom.xml
index a1cbd69..7cc74a8 100644
--- a/gerrit-server/pom.xml
+++ b/gerrit-server/pom.xml
@@ -49,6 +49,11 @@
     </dependency>
 
     <dependency>
+      <groupId>commons-dbcp</groupId>
+      <artifactId>commons-dbcp</artifactId>
+    </dependency>
+
+    <dependency>
       <groupId>commons-net</groupId>
       <artifactId>commons-net</artifactId>
     </dependency>
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/DataSourceProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java
similarity index 99%
rename from gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/DataSourceProvider.java
rename to gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java
index 2be4f24..91d6346 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/DataSourceProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/DataSourceProvider.java
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.google.gerrit.pgm.util;
+package com.google.gerrit.server.schema;
 
 import com.google.gerrit.lifecycle.LifecycleListener;
 import com.google.gerrit.server.config.ConfigUtil;
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java
index 8a0d50b..233d53d 100644
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java
+++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/ReviewDbDataSourceProvider.java
@@ -15,18 +15,10 @@
 package com.google.gerrit.httpd;
 
 import com.google.gerrit.lifecycle.LifecycleListener;
-import com.google.gwtorm.jdbc.SimpleDataSource;
 import com.google.inject.Provider;
 import com.google.inject.ProvisionException;
 import com.google.inject.Singleton;
 
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.sql.SQLException;
-import java.util.Map;
-import java.util.Properties;
-
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 import javax.sql.DataSource;
@@ -61,49 +53,10 @@
     try {
       return (DataSource) new InitialContext().lookup(dsName);
     } catch (NamingException namingErr) {
-      final Properties p = readGerritDataSource();
-      if (p == null) {
-        throw new ProvisionException("Initialization error:\n"
-            + "  * No DataSource " + dsName + "\n"
-            + "  * No -DGerritServer=GerritServer.properties"
-            + " on Java command line", namingErr);
-      }
-
-      try {
-        return new SimpleDataSource(p);
-      } catch (SQLException se) {
-        throw new ProvisionException("Database unavailable", se);
-      }
+      throw new ProvisionException("No DataSource " + dsName, namingErr);
     }
   }
 
-  private static Properties readGerritDataSource() throws ProvisionException {
-    final Properties srvprop = new Properties();
-    String name = System.getProperty("GerritServer");
-    if (name == null) {
-      name = "GerritServer.properties";
-    }
-    try {
-      final InputStream in = new FileInputStream(name);
-      try {
-        srvprop.load(in);
-      } finally {
-        in.close();
-      }
-    } catch (IOException e) {
-      throw new ProvisionException("Cannot read " + name, e);
-    }
-
-    final Properties dbprop = new Properties();
-    for (final Map.Entry<Object, Object> e : srvprop.entrySet()) {
-      final String key = (String) e.getKey();
-      if (key.startsWith("database.")) {
-        dbprop.put(key.substring("database.".length()), e.getValue());
-      }
-    }
-    return dbprop;
-  }
-
   private void closeDataSource(final DataSource ds) {
     try {
       Class<?> type = Class.forName("org.apache.commons.dbcp.BasicDataSource");
diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
index 7a4dac0..8f064c4 100644
--- a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
+++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java
@@ -27,6 +27,7 @@
 import com.google.gerrit.server.config.MasterNodeStartup;
 import com.google.gerrit.server.config.SitePath;
 import com.google.gerrit.server.config.SitePathFromSystemConfigProvider;
+import com.google.gerrit.server.schema.DataSourceProvider;
 import com.google.gerrit.sshd.SshModule;
 import com.google.gerrit.sshd.commands.MasterCommandModule;
 import com.google.inject.AbstractModule;
@@ -57,6 +58,7 @@
   private static final Logger log =
       LoggerFactory.getLogger(WebAppInitializer.class);
 
+  private File sitePath;
   private Injector dbInjector;
   private Injector cfgInjector;
   private Injector sysInjector;
@@ -66,6 +68,11 @@
 
   private synchronized void init() {
     if (manager == null) {
+      final String path = System.getProperty("gerrit.site_path");
+      if (path != null) {
+        sitePath = new File(path);
+      }
+
       try {
         dbInjector = createDbInjector();
       } catch (CreationException ce) {
@@ -115,28 +122,50 @@
 
   private Injector createDbInjector() {
     final List<Module> modules = new ArrayList<Module>();
-    modules.add(new LifecycleModule() {
-      @Override
-      protected void configure() {
-        bind(Key.get(DataSource.class, Names.named("ReviewDb"))).toProvider(
-            ReviewDbDataSourceProvider.class).in(SINGLETON);
-        listener().to(ReviewDbDataSourceProvider.class);
-      }
-    });
+    if (sitePath != null) {
+      modules.add(new LifecycleModule() {
+        @Override
+        protected void configure() {
+          bind(File.class).annotatedWith(SitePath.class).toInstance(sitePath);
+          bind(DataSourceProvider.Context.class).toInstance(
+              DataSourceProvider.Context.MULTI_USER);
+          bind(Key.get(DataSource.class, Names.named("ReviewDb"))).toProvider(
+              DataSourceProvider.class).in(SINGLETON);
+          listener().to(DataSourceProvider.class);
+        }
+      });
+      modules.add(new GerritServerConfigModule());
+
+    } else {
+      modules.add(new LifecycleModule() {
+        @Override
+        protected void configure() {
+          bind(Key.get(DataSource.class, Names.named("ReviewDb"))).toProvider(
+              ReviewDbDataSourceProvider.class).in(SINGLETON);
+          listener().to(ReviewDbDataSourceProvider.class);
+        }
+      });
+    }
     modules.add(new DatabaseModule());
     return Guice.createInjector(PRODUCTION, modules);
   }
 
   private Injector createCfgInjector() {
     final List<Module> modules = new ArrayList<Module>();
-    modules.add(new AbstractModule() {
-      @Override
-      protected void configure() {
-        bind(File.class).annotatedWith(SitePath.class).toProvider(
-            SitePathFromSystemConfigProvider.class).in(SINGLETON);
-      }
-    });
-    modules.add(new GerritServerConfigModule());
+    if (sitePath == null) {
+      // If we didn't get the site path from the system property
+      // we need to get it from the database, as that's our old
+      // method of locating the site path on disk.
+      //
+      modules.add(new AbstractModule() {
+        @Override
+        protected void configure() {
+          bind(File.class).annotatedWith(SitePath.class).toProvider(
+              SitePathFromSystemConfigProvider.class).in(SINGLETON);
+        }
+      });
+      modules.add(new GerritServerConfigModule());
+    }
     modules.add(new AuthConfigModule());
     return dbInjector.createChildInjector(modules);
   }
diff --git a/gerrit-war/src/main/webapp/WEB-INF/extra/GerritServer.properties_example b/gerrit-war/src/main/webapp/WEB-INF/extra/GerritServer.properties_example
deleted file mode 100644
index a3e0d73..0000000
--- a/gerrit-war/src/main/webapp/WEB-INF/extra/GerritServer.properties_example
+++ /dev/null
@@ -1,32 +0,0 @@
-# Any properties starting with "database." will be fed to the JDBC driver,
-# after removing the "database." prefix.
-#
-# The following "special" properties are removed from that set:
-#
-#  database.driver :  Class name of the driver to load.
-#  database.url    :  The connection URL
-#
-
-
-# H2
-# (driver included)
-#
-# database.driver = org.h2.Driver
-# database.url = jdbc:h2:file:ReviewDb
-
-
-# PostgreSQL
-# (driver included)
-#
-# database.driver = org.postgresql.Driver
-# database.url = jdbc:postgresql:reviewdb
-# database.user = gerrit2
-# database.password = supersecretcode
-
-
-# MySQL 5.0
-# curl -O http://repo1.maven.org/maven2/mysql/mysql-connector-java/5.0.8/mysql-connector-java-5.0.8.jar
-#
-# database.classpath = mysql-connector-java-5.0.8.jar
-# database.driver = com.mysql.jdbc.Driver
-# database.url = jdbc:mysql://localhost/reviewdb?user=gerrit2&password=secretcode
diff --git a/tools/gwtui_any.launch b/tools/gwtui_any.launch
index 402f041..34a9ed6 100644
--- a/tools/gwtui_any.launch
+++ b/tools/gwtui_any.launch
@@ -32,5 +32,5 @@
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl /&#10;-war ${resource_loc:/gerrit-gwtui/target}/gwt-hosted-mode&#10;-server com.google.gerrit.gwtdebug.GerritDebugLauncher&#10;com.google.gerrit.GerritGwtUI"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="gerrit-gwtdbug"/>
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.sourcepathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx256M&#10;-DGerritServer=${resource_loc:/gerrit-parent/GerritServer.properties}&#10;-Dcom.google.gerrit.httpd.auth.become=true"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx256M&#10;-Dcom.google.gerrit.httpd.auth.become=true&#10;-Dgerrit.site_path=${resource_loc:/gerrit-parent}/../android_codereview"/>
 </launchConfiguration>
diff --git a/tools/gwtui_mac.launch b/tools/gwtui_mac.launch
index dca7b45..719bf68 100644
--- a/tools/gwtui_mac.launch
+++ b/tools/gwtui_mac.launch
@@ -32,5 +32,5 @@
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-startupUrl /&#10;-war ${resource_loc:/gerrit-gwtui/target}/gwt-hosted-mode&#10;-server com.google.gerrit.gwtdebug.GerritDebugLauncher&#10;com.google.gerrit.GerritGwtUI"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="gerrit-gwtdbug"/>
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.sourcepathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XstartOnFirstThread&#10;-Xmx256M&#10;-DGerritServer=${resource_loc:/gerrit-parent/GerritServer.properties}&#10;-Dcom.google.gerrit.httpd.auth.become=true"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XstartOnFirstThread&#10;-Xmx256M&#10;-Dcom.google.gerrit.httpd.auth.become=true&#10;-Dgerrit.site_path=${resource_loc:/gerrit-parent}/../test_site"/>
 </launchConfiguration>