diff options
Diffstat (limited to 'gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java')
-rw-r--r-- | gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/SiteProgram.java | 113 |
1 files changed, 28 insertions, 85 deletions
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 489357933e..aae5b48f30 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 @@ -18,10 +18,13 @@ import static com.google.inject.Scopes.SINGLETON; import static com.google.inject.Stage.PRODUCTION; import com.google.gerrit.lifecycle.LifecycleModule; +import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.config.GerritServerConfigModule; import com.google.gerrit.server.config.SitePath; import com.google.gerrit.server.git.LocalDiskRepositoryManager; +import com.google.gerrit.server.schema.DataSourceModule; import com.google.gerrit.server.schema.DataSourceProvider; +import com.google.gerrit.server.schema.DataSourceType; import com.google.gerrit.server.schema.DatabaseModule; import com.google.gerrit.server.schema.SchemaModule; import com.google.gwtorm.server.OrmException; @@ -34,22 +37,13 @@ import com.google.inject.Module; import com.google.inject.name.Names; import com.google.inject.spi.Message; +import org.eclipse.jgit.lib.Config; import org.kohsuke.args4j.Option; import java.io.File; -import java.io.FileFilter; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashSet; import java.util.List; -import java.util.Set; import javax.sql.DataSource; @@ -74,95 +68,44 @@ public abstract class SiteProgram extends AbstractProgram { } } - /** Load extra JARs from {@code lib/} subdirectory of {@link #getSitePath()} */ - protected void loadSiteLib() { - final File libdir = new File(getSitePath(), "lib"); - final File[] list = libdir.listFiles(new FileFilter() { - @Override - public boolean accept(File path) { - if (!path.isFile()) { - return false; - } - return path.getName().endsWith(".jar") // - || path.getName().endsWith(".zip"); - } - }); - if (list != null && 0 < list.length) { - Arrays.sort(list, new Comparator<File>() { - @Override - public int compare(File a, File b) { - return a.getName().compareTo(b.getName()); - } - }); - addToClassLoader(list); - } - } - - private void addToClassLoader(final File[] additionalLocations) { - final ClassLoader cl = getClass().getClassLoader(); - if (!(cl instanceof URLClassLoader)) { - throw noAddURL("Not loaded by URLClassLoader", null); - } - - final URLClassLoader ucl = (URLClassLoader) cl; - final Set<URL> have = new HashSet<URL>(); - have.addAll(Arrays.asList(ucl.getURLs())); - - final Method m; - try { - m = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); - m.setAccessible(true); - } catch (SecurityException e) { - throw noAddURL("Method addURL not available", e); - } catch (NoSuchMethodException e) { - throw noAddURL("Method addURL not available", e); - } - - for (final File path : additionalLocations) { - try { - final URL url = path.toURI().toURL(); - if (have.add(url)) { - m.invoke(cl, url); - } - } catch (MalformedURLException e) { - throw noAddURL("addURL " + path + " failed", e); - } catch (IllegalArgumentException e) { - throw noAddURL("addURL " + path + " failed", e); - } catch (IllegalAccessException e) { - throw noAddURL("addURL " + path + " failed", e); - } catch (InvocationTargetException e) { - throw noAddURL("addURL " + path + " failed", e.getCause()); - } - } - } - - private static UnsupportedOperationException noAddURL(String m, Throwable why) { - final String prefix = "Cannot extend classpath: "; - return new UnsupportedOperationException(prefix + m, why); - } - /** @return provides database connectivity and site path. */ protected Injector createDbInjector(final DataSourceProvider.Context context) { - loadSiteLib(); - final File sitePath = getSitePath(); final List<Module> modules = new ArrayList<Module>(); - modules.add(new AbstractModule() { + + Module sitePathModule = new AbstractModule() { @Override protected void configure() { bind(File.class).annotatedWith(SitePath.class).toInstance(sitePath); } - }); + }; + modules.add(sitePathModule); + modules.add(new LifecycleModule() { @Override protected void configure() { bind(DataSourceProvider.Context.class).toInstance(context); - bind(Key.get(DataSource.class, Names.named("ReviewDb"))).toProvider( - DataSourceProvider.class).in(SINGLETON); - listener().to(DataSourceProvider.class); + bind(Key.get(DataSource.class, Names.named("ReviewDb"))) + .toProvider(SiteLibraryBasedDataSourceProvider.class) + .in(SINGLETON); + listener().to(SiteLibraryBasedDataSourceProvider.class); } }); - modules.add(new GerritServerConfigModule()); + Module configModule = new GerritServerConfigModule(); + modules.add(configModule); + Injector cfgInjector = Guice.createInjector(sitePathModule, configModule); + Config cfg = cfgInjector.getInstance(Key.get(Config.class, GerritServerConfig.class)); + String dbType = cfg.getString("database", null, "type"); + + final DataSourceType dst = Guice.createInjector(new DataSourceModule(), configModule, + sitePathModule).getInstance( + Key.get(DataSourceType.class, Names.named(dbType.toLowerCase()))); + + modules.add(new AbstractModule() { + @Override + protected void configure() { + bind(DataSourceType.class).toInstance(dst); + }}); modules.add(new DatabaseModule()); modules.add(new SchemaModule()); modules.add(new LocalDiskRepositoryManager.Module()); |