init: Move optional library download configuration to config file
Shifting our optional library downloads setup into a configuration file gets the URLs and SHA1 strings out of the source code and into a nice clean text format we can more easily update later on. It really was bothering me that this data was hardcoded into our source in random spots throughout init. Change-Id: Ie9493c7607242f58a3045813eb4c0ffa4e9aba51 Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
parent
92cb0d213a
commit
3bccd773c2
@ -23,7 +23,7 @@ import com.google.gerrit.pgm.util.ConsoleUI;
|
||||
import com.google.gerrit.pgm.util.DataSourceProvider;
|
||||
import com.google.gerrit.pgm.util.ErrorLogFile;
|
||||
import com.google.gerrit.pgm.util.IoUtil;
|
||||
import com.google.gerrit.pgm.util.LibraryDownloader;
|
||||
import com.google.gerrit.pgm.util.Libraries;
|
||||
import com.google.gerrit.pgm.util.SiteProgram;
|
||||
import com.google.gerrit.reviewdb.AuthType;
|
||||
import com.google.gerrit.reviewdb.Project;
|
||||
@ -91,6 +91,7 @@ public class Init extends SiteProgram {
|
||||
private boolean isNew;
|
||||
private boolean deleteOnFailure;
|
||||
private ConsoleUI ui;
|
||||
private Libraries libraries;
|
||||
private Injector dbInjector;
|
||||
private Injector sysInjector;
|
||||
|
||||
@ -113,6 +114,7 @@ public class Init extends SiteProgram {
|
||||
public int run() throws Exception {
|
||||
ErrorLogFile.errorOnlyConsole();
|
||||
ui = ConsoleUI.getInstance(batchMode);
|
||||
libraries = new Libraries(ui, getSitePath());
|
||||
initPathLocations();
|
||||
|
||||
if (site_path.exists()) {
|
||||
@ -389,9 +391,7 @@ public class Init extends SiteProgram {
|
||||
private void downloadOptionalLibraries() {
|
||||
// Download and install BouncyCastle if the user wants to use it.
|
||||
//
|
||||
createDownloader().setRequired(false).setName("Bouncy Castle Crypto v144")
|
||||
.setJarUrl("http://www.bouncycastle.org/download/bcprov-jdk16-144.jar")
|
||||
.setSHA1("6327a5f7a3dc45e0fd735adb5d08c5a74c05c20c").download();
|
||||
libraries.bouncyCastle.downloadOptional();
|
||||
loadSiteLib();
|
||||
}
|
||||
|
||||
@ -421,12 +421,7 @@ public class Init extends SiteProgram {
|
||||
|
||||
switch (db_type) {
|
||||
case MYSQL:
|
||||
createDownloader()
|
||||
.setRequired(true)
|
||||
.setName("MySQL Connector/J 5.1.10")
|
||||
.setJarUrl(
|
||||
"http://repo2.maven.org/maven2/mysql/mysql-connector-java/5.1.10/mysql-connector-java-5.1.10.jar")
|
||||
.setSHA1("b83574124f1a00d6f70d56ba64aa52b8e1588e6d").download();
|
||||
libraries.mysqlDriver.downloadRequired();
|
||||
loadSiteLib();
|
||||
break;
|
||||
}
|
||||
@ -999,10 +994,6 @@ public class Init extends SiteProgram {
|
||||
return dbInjector.createChildInjector(modules);
|
||||
}
|
||||
|
||||
private LibraryDownloader createDownloader() {
|
||||
return new LibraryDownloader(ui, getSitePath());
|
||||
}
|
||||
|
||||
private static String version() {
|
||||
return com.google.gerrit.common.Version.getVersion();
|
||||
}
|
||||
|
@ -0,0 +1,107 @@
|
||||
// Copyright (C) 2009 The Android Open Source Project
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package com.google.gerrit.pgm.util;
|
||||
|
||||
import org.eclipse.jgit.errors.ConfigInvalidException;
|
||||
import org.eclipse.jgit.lib.Config;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
/** Standard {@link LibraryDownloader} instances derived from configuration. */
|
||||
public class Libraries {
|
||||
private static final String RESOURCE_FILE =
|
||||
"com/google/gerrit/pgm/libraries.config";
|
||||
|
||||
private final ConsoleUI ui;
|
||||
private final File sitePath;
|
||||
|
||||
public LibraryDownloader bouncyCastle;
|
||||
public LibraryDownloader mysqlDriver;
|
||||
|
||||
public Libraries(final ConsoleUI ui, final File sitePath) {
|
||||
this.ui = ui;
|
||||
this.sitePath = sitePath;
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
final Config cfg = new Config();
|
||||
try {
|
||||
cfg.fromText(read(RESOURCE_FILE));
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e.getMessage(), e);
|
||||
} catch (ConfigInvalidException e) {
|
||||
throw new RuntimeException(e.getMessage(), e);
|
||||
}
|
||||
|
||||
for (final Field f : Libraries.class.getDeclaredFields()) {
|
||||
if ((f.getModifiers() & Modifier.STATIC) == 0
|
||||
&& f.getType() == LibraryDownloader.class) {
|
||||
try {
|
||||
init(f, cfg);
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new IllegalStateException("Cannot initialize " + f.getName());
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new IllegalStateException("Cannot initialize " + f.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void init(final Field field, final Config cfg)
|
||||
throws IllegalArgumentException, IllegalAccessException {
|
||||
final String n = field.getName();
|
||||
final LibraryDownloader dl = new LibraryDownloader(ui, sitePath);
|
||||
dl.setName(get(cfg, n, "name"));
|
||||
dl.setJarUrl(get(cfg, n, "url"));
|
||||
dl.setSHA1(get(cfg, n, "sha1"));
|
||||
field.set(this, dl);
|
||||
}
|
||||
|
||||
private static String get(Config cfg, String name, String key) {
|
||||
String val = cfg.getString("library", name, key);
|
||||
if (val == null || val.isEmpty()) {
|
||||
throw new IllegalStateException("Variable library." + name + "." + key
|
||||
+ " is required within " + RESOURCE_FILE);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
private static String read(final String p) throws IOException {
|
||||
InputStream in = Libraries.class.getClassLoader().getResourceAsStream(p);
|
||||
if (in == null) {
|
||||
throw new FileNotFoundException("Cannot load resource " + p);
|
||||
}
|
||||
final Reader r = new InputStreamReader(in, "UTF-8");
|
||||
try {
|
||||
final StringBuilder buf = new StringBuilder();
|
||||
final char[] tmp = new char[512];
|
||||
int n;
|
||||
while (0 < (n = r.read(tmp))) {
|
||||
buf.append(tmp, 0, n);
|
||||
}
|
||||
return buf.toString();
|
||||
} finally {
|
||||
r.close();
|
||||
}
|
||||
}
|
||||
}
|
@ -46,27 +46,29 @@ public class LibraryDownloader {
|
||||
this.libDirectory = new File(sitePath, "lib");
|
||||
}
|
||||
|
||||
public LibraryDownloader setRequired(final boolean required) {
|
||||
this.required = required;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LibraryDownloader setName(final String name) {
|
||||
public void setName(final String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LibraryDownloader setJarUrl(final String url) {
|
||||
public void setJarUrl(final String url) {
|
||||
this.jarUrl = url;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LibraryDownloader setSHA1(final String sha1) {
|
||||
public void setSHA1(final String sha1) {
|
||||
this.sha1 = sha1;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void download() {
|
||||
public void downloadRequired() {
|
||||
this.required = true;
|
||||
download();
|
||||
}
|
||||
|
||||
public void downloadOptional() {
|
||||
this.required = false;
|
||||
download();
|
||||
}
|
||||
|
||||
private void download() {
|
||||
if (jarUrl == null || !jarUrl.contains("/")) {
|
||||
throw new IllegalStateException("Invalid JarUrl for " + name);
|
||||
}
|
||||
|
@ -0,0 +1,24 @@
|
||||
# Copyright (C) 2009 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
|
||||
[library "bouncyCastle"]
|
||||
name = Bouncy Castle Crypto v144
|
||||
url = http://www.bouncycastle.org/download/bcprov-jdk16-144.jar
|
||||
sha1 = 6327a5f7a3dc45e0fd735adb5d08c5a74c05c20c
|
||||
|
||||
[library "mysqlDriver"]
|
||||
name = MySQL Connector/J 5.1.10
|
||||
url = http://repo2.maven.org/maven2/mysql/mysql-connector-java/5.1.10/mysql-connector-java-5.1.10.jar
|
||||
sha1 = b83574124f1a00d6f70d56ba64aa52b8e1588e6d
|
Loading…
Reference in New Issue
Block a user