From e66e89020bbcffe78252828051d28f82b4c650ac Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Tue, 28 Jul 2009 15:06:12 -0700 Subject: [PATCH] Provide SchemFactory by Guice and not GerritServer This makes it easier to replace the dependency, by letting Guice manage the registration of the SchemaFactory. In some cases we were able to reduce our dependency entirely and drop the server object out of the dependency set. Signed-off-by: Shawn O. Pearce --- .../com/google/gerrit/git/ChangeMergeQueue.java | 9 +++++++-- .../java/com/google/gerrit/git/MergeOp.java | 9 ++++++--- .../google/gerrit/git/PushAllProjectsOp.java | 17 +++++++++-------- .../com/google/gerrit/pgm/CreateSchema.java | 13 ++++++++++--- .../google/gerrit/pgm/ReimportPatchSets.java | 14 ++++++++++---- .../gerrit/server/AccountSecurityImpl.java | 8 ++++++-- .../gerrit/server/AccountServiceImpl.java | 5 +++-- .../server/BaseServiceImplementation.java | 12 +++++++----- .../server/BecomeAnyAccountLoginServlet.java | 13 ++++++++----- .../com/google/gerrit/server/CatServlet.java | 11 ++++++++--- .../gerrit/server/ChangeDetailServiceImpl.java | 5 +++-- .../gerrit/server/ChangeListServiceImpl.java | 5 +++-- .../gerrit/server/ChangeManageServiceImpl.java | 7 ++++--- .../gerrit/server/EncryptedContactStore.java | 13 ++++++++----- .../server/EncryptedContactStoreProvider.java | 6 +++++- .../com/google/gerrit/server/GerritCall.java | 9 ++++++--- .../gerrit/server/GerritConfigProvider.java | 4 ++-- .../google/gerrit/server/GerritJsonServlet.java | 13 +++++++++---- .../com/google/gerrit/server/GerritServer.java | 8 +------- .../gerrit/server/GerritServerModule.java | 3 +++ .../gerrit/server/GerritServletConfig.java | 14 ++++++++++---- .../gerrit/server/GroupAdminServiceImpl.java | 5 +++-- .../google/gerrit/server/HostPageServlet.java | 10 ++++++++-- .../google/gerrit/server/OpenIdServiceImpl.java | 10 +++++++--- .../gerrit/server/ProjectAdminServiceImpl.java | 9 ++++++--- .../gerrit/server/SuggestServiceImpl.java | 5 +++-- .../gerrit/server/SystemInfoServiceImpl.java | 11 ++++++----- .../google/gerrit/server/UrlRewriteFilter.java | 9 +++++---- .../server/patch/PatchDetailServiceImpl.java | 8 ++++++-- .../gerrit/server/ssh/AbstractCommand.java | 7 ++++++- .../gerrit/server/ssh/AdminReplicate.java | 2 +- .../gerrit/server/ssh/DatabasePubKeyAuth.java | 14 ++++++++++---- .../gerrit/server/ssh/GerritSshDaemon.java | 9 +++++---- .../gerrit/server/ssh/SshDaemonModule.java | 2 ++ .../gerrit/server/ssh/SshKeyCacheEntry.java | 6 +++--- .../server/ssh/SshKeyCacheEntryFactory.java | 10 +++++----- 36 files changed, 204 insertions(+), 111 deletions(-) diff --git a/src/main/java/com/google/gerrit/git/ChangeMergeQueue.java b/src/main/java/com/google/gerrit/git/ChangeMergeQueue.java index 2e7563787c..2f5b6bf42f 100644 --- a/src/main/java/com/google/gerrit/git/ChangeMergeQueue.java +++ b/src/main/java/com/google/gerrit/git/ChangeMergeQueue.java @@ -16,7 +16,9 @@ package com.google.gerrit.git; import com.google.gerrit.client.reviewdb.Branch; import com.google.gerrit.client.reviewdb.Project; +import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.server.GerritServer; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import org.slf4j.Logger; @@ -34,11 +36,14 @@ public class ChangeMergeQueue implements MergeQueue { new HashMap(); private final GerritServer server; + private final SchemaFactory schema; private final ReplicationQueue replication; @Inject - ChangeMergeQueue(final GerritServer gs, final ReplicationQueue rq) { + ChangeMergeQueue(final GerritServer gs, final SchemaFactory sf, + final ReplicationQueue rq) { server = gs; + schema = sf; replication = rq; } @@ -131,7 +136,7 @@ public class ChangeMergeQueue implements MergeQueue { private void mergeImpl(final Branch.NameKey branch) { try { - new MergeOp(server, replication, branch).merge(); + new MergeOp(server, schema, replication, branch).merge(); } catch (Throwable e) { log.error("Merge attempt for " + branch + " failed", e); } diff --git a/src/main/java/com/google/gerrit/git/MergeOp.java b/src/main/java/com/google/gerrit/git/MergeOp.java index ebf20752c4..1500368fbc 100644 --- a/src/main/java/com/google/gerrit/git/MergeOp.java +++ b/src/main/java/com/google/gerrit/git/MergeOp.java @@ -34,6 +34,7 @@ import com.google.gerrit.server.mail.MergedSender; import com.google.gerrit.server.workflow.CategoryFunction; import com.google.gerrit.server.workflow.FunctionState; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.client.Transaction; import org.slf4j.Logger; @@ -96,6 +97,7 @@ public class MergeOp { private static final FooterKey REVIEWED_ON = new FooterKey("Reviewed-on"); private final GerritServer server; + private final SchemaFactory schemaFactory; private final ReplicationQueue replication; private final PersonIdent myIdent; private final Branch.NameKey destBranch; @@ -111,9 +113,10 @@ public class MergeOp { private CodeReviewCommit mergeTip; private RefUpdate branchUpdate; - public MergeOp(final GerritServer gs, final ReplicationQueue rq, - final Branch.NameKey branch) { + public MergeOp(final GerritServer gs, final SchemaFactory sf, + final ReplicationQueue rq, final Branch.NameKey branch) { server = gs; + schemaFactory = sf; replication = rq; myIdent = server.newGerritPersonIdent(); destBranch = branch; @@ -131,7 +134,7 @@ public class MergeOp { destProject = pe.getProject(); try { - schema = server.getSchemaFactory().open(); + schema = schemaFactory.open(); } catch (OrmException e) { throw new MergeException("Cannot open database", e); } diff --git a/src/main/java/com/google/gerrit/git/PushAllProjectsOp.java b/src/main/java/com/google/gerrit/git/PushAllProjectsOp.java index 3a494e1346..56b6ae04c2 100644 --- a/src/main/java/com/google/gerrit/git/PushAllProjectsOp.java +++ b/src/main/java/com/google/gerrit/git/PushAllProjectsOp.java @@ -18,8 +18,8 @@ import com.google.gerrit.client.reviewdb.Branch; import com.google.gerrit.client.reviewdb.Project; import com.google.gerrit.client.reviewdb.ProjectRight; import com.google.gerrit.client.reviewdb.ReviewDb; -import com.google.gerrit.server.GerritServer; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,17 +30,18 @@ public class PushAllProjectsOp implements Runnable { private static final Logger log = LoggerFactory.getLogger(PushAllProjectsOp.class); - private final GerritServer server; + private final SchemaFactory schema; private final ReplicationQueue replication; private final String urlMatch; - public PushAllProjectsOp(final GerritServer gs, final ReplicationQueue rq) { - this(gs, rq, null); + public PushAllProjectsOp(final SchemaFactory sf, + final ReplicationQueue rq) { + this(sf, rq, null); } - public PushAllProjectsOp(final GerritServer gs, final ReplicationQueue rq, - final String urlMatch) { - this.server = gs; + public PushAllProjectsOp(final SchemaFactory sf, + final ReplicationQueue rq, final String urlMatch) { + this.schema = sf; this.replication = rq; this.urlMatch = urlMatch; } @@ -48,7 +49,7 @@ public class PushAllProjectsOp implements Runnable { public void run() { final HashSet pending = new HashSet(); try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { for (final Project project : db.projects().all()) { if (!ProjectRight.WILD_PROJECT.equals(project.getId())) { diff --git a/src/main/java/com/google/gerrit/pgm/CreateSchema.java b/src/main/java/com/google/gerrit/pgm/CreateSchema.java index 6fe35b02d0..4bd735d254 100644 --- a/src/main/java/com/google/gerrit/pgm/CreateSchema.java +++ b/src/main/java/com/google/gerrit/pgm/CreateSchema.java @@ -14,20 +14,27 @@ package com.google.gerrit.pgm; +import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.server.GerritServer; import com.google.gerrit.server.GerritServerModule; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Guice; +import com.google.inject.Inject; import com.google.inject.Injector; /** * Creates the Gerrit 2 database schema. */ public class CreateSchema extends AbstractProgram { + @Inject + private SchemaFactory schema; + @Override public int run() throws Exception { - final Injector injector = Guice.createInjector(new GerritServerModule()); - final GerritServer gs = injector.getInstance(GerritServer.class); - gs.getSchemaFactory().open().close(); + final Injector injector = Guice.createInjector(new GerritServerModule()); + injector.injectMembers(this); + injector.getInstance(GerritServer.class); + schema.open().close(); System.out.println("Gerrit2 schema initialized"); return 0; } diff --git a/src/main/java/com/google/gerrit/pgm/ReimportPatchSets.java b/src/main/java/com/google/gerrit/pgm/ReimportPatchSets.java index f3e6441d07..c965491bf5 100644 --- a/src/main/java/com/google/gerrit/pgm/ReimportPatchSets.java +++ b/src/main/java/com/google/gerrit/pgm/ReimportPatchSets.java @@ -22,8 +22,9 @@ import com.google.gerrit.git.PatchSetImporter; import com.google.gerrit.server.GerritServer; import com.google.gerrit.server.GerritServerModule; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Guice; -import com.google.inject.Injector; +import com.google.inject.Inject; import org.spearce.jgit.errors.RepositoryNotFoundException; import org.spearce.jgit.lib.ObjectId; @@ -53,10 +54,15 @@ import java.util.ArrayList; * based on the data stored in Git. */ public class ReimportPatchSets extends AbstractProgram { + @Inject + private SchemaFactory schema; + + @Inject + private GerritServer gs; + @Override public int run() throws Exception { - final Injector injector = Guice.createInjector(new GerritServerModule()); - final GerritServer gs = injector.getInstance(GerritServer.class); + Guice.createInjector(new GerritServerModule()).injectMembers(this); final ArrayList todo = new ArrayList(); final BufferedReader br = @@ -67,7 +73,7 @@ public class ReimportPatchSets extends AbstractProgram { } int exitStatus = 0; - final ReviewDb db = gs.getSchemaFactory().open(); + final ReviewDb db = schema.open(); final ProgressMonitor pm = new TextProgressMonitor(); try { pm.start(1); diff --git a/src/main/java/com/google/gerrit/server/AccountSecurityImpl.java b/src/main/java/com/google/gerrit/server/AccountSecurityImpl.java index 80de38d3ff..ba36e89de2 100644 --- a/src/main/java/com/google/gerrit/server/AccountSecurityImpl.java +++ b/src/main/java/com/google/gerrit/server/AccountSecurityImpl.java @@ -37,6 +37,7 @@ import com.google.gwtjsonrpc.server.ValidToken; import com.google.gwtjsonrpc.server.XsrfException; import com.google.gwtorm.client.OrmDuplicateKeyException; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.client.Transaction; import com.google.inject.Inject; @@ -61,11 +62,14 @@ import javax.servlet.http.HttpServletRequest; class AccountSecurityImpl extends BaseServiceImplementation implements AccountSecurity { private final Logger log = LoggerFactory.getLogger(getClass()); + private final GerritServer server; private final ContactStore contactStore; @Inject - AccountSecurityImpl(final GerritServer gs, final ContactStore cs) { - super(gs); + AccountSecurityImpl(final SchemaFactory sf, final GerritServer gs, + final ContactStore cs) { + super(sf); + server = gs; contactStore = cs; } diff --git a/src/main/java/com/google/gerrit/server/AccountServiceImpl.java b/src/main/java/com/google/gerrit/server/AccountServiceImpl.java index a9998ffdb5..6dae0e4773 100644 --- a/src/main/java/com/google/gerrit/server/AccountServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/AccountServiceImpl.java @@ -28,6 +28,7 @@ import com.google.gerrit.client.rpc.NoSuchEntityException; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtjsonrpc.client.VoidResult; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.client.Transaction; import com.google.inject.Inject; @@ -40,8 +41,8 @@ import java.util.Set; class AccountServiceImpl extends BaseServiceImplementation implements AccountService { @Inject - AccountServiceImpl(final GerritServer gs) { - super(gs); + AccountServiceImpl(final SchemaFactory sf) { + super(sf); } public void myAccount(final AsyncCallback callback) { diff --git a/src/main/java/com/google/gerrit/server/BaseServiceImplementation.java b/src/main/java/com/google/gerrit/server/BaseServiceImplementation.java index 8b42e250d0..d5a79a7efc 100644 --- a/src/main/java/com/google/gerrit/server/BaseServiceImplementation.java +++ b/src/main/java/com/google/gerrit/server/BaseServiceImplementation.java @@ -27,15 +27,16 @@ import com.google.gerrit.client.rpc.CorruptEntityException; import com.google.gerrit.client.rpc.NoSuchEntityException; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import java.util.Set; /** Support for services which require a {@link ReviewDb} instance. */ public class BaseServiceImplementation { - protected final GerritServer server; + private final SchemaFactory schema; - protected BaseServiceImplementation(final GerritServer gs) { - server = gs; + protected BaseServiceImplementation(final SchemaFactory sf) { + schema = sf; } /** @@ -51,7 +52,7 @@ public class BaseServiceImplementation { */ protected void run(final AsyncCallback callback, final Action action) { try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); final T r; try { r = action.run(db); @@ -116,7 +117,8 @@ public class BaseServiceImplementation { public static boolean canPerform(final Account.Id who, final ProjectCache.Entry e, final ApprovalCategory.Id actionId, final short requireValue) { - Set groups = Common.getGroupCache().getEffectiveGroups(who); + Set groups = + Common.getGroupCache().getEffectiveGroups(who); return canPerform(groups, e, actionId, requireValue); } diff --git a/src/main/java/com/google/gerrit/server/BecomeAnyAccountLoginServlet.java b/src/main/java/com/google/gerrit/server/BecomeAnyAccountLoginServlet.java index e5477dfb0d..c9961d9c18 100644 --- a/src/main/java/com/google/gerrit/server/BecomeAnyAccountLoginServlet.java +++ b/src/main/java/com/google/gerrit/server/BecomeAnyAccountLoginServlet.java @@ -17,8 +17,8 @@ package com.google.gerrit.server; import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.reviewdb.Account; import com.google.gerrit.client.reviewdb.ReviewDb; -import com.google.gerrit.client.rpc.Common; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -44,10 +44,13 @@ public class BecomeAnyAccountLoginServlet extends HttpServlet { } private final boolean allowed; + private final SchemaFactory schema; private final GerritServer server; @Inject - BecomeAnyAccountLoginServlet(final GerritServer gs) { + BecomeAnyAccountLoginServlet(final SchemaFactory sf, + final GerritServer gs) { + schema = sf; server = gs; allowed = isAllowed(); } @@ -109,7 +112,7 @@ public class BecomeAnyAccountLoginServlet extends HttpServlet { private List bySshUserName(final HttpServletResponse rsp, final String userName) { try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { return db.accounts().bySshUserName(userName).toList(); } finally { @@ -124,7 +127,7 @@ public class BecomeAnyAccountLoginServlet extends HttpServlet { private List byPreferredEmail(final HttpServletResponse rsp, final String email) { try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { return db.accounts().byPreferredEmail(email).toList(); } finally { @@ -145,7 +148,7 @@ public class BecomeAnyAccountLoginServlet extends HttpServlet { return Collections. emptyList(); } try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { final Account account = db.accounts().get(id); return account != null ? Collections. singletonList(account) diff --git a/src/main/java/com/google/gerrit/server/CatServlet.java b/src/main/java/com/google/gerrit/server/CatServlet.java index 6410860db9..e988b6077f 100644 --- a/src/main/java/com/google/gerrit/server/CatServlet.java +++ b/src/main/java/com/google/gerrit/server/CatServlet.java @@ -25,6 +25,7 @@ import com.google.gerrit.client.reviewdb.Project; import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.client.rpc.Common; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -65,12 +66,15 @@ import javax.servlet.http.HttpServletResponse; public class CatServlet extends HttpServlet { private static final MimeType ZIP = new MimeType("application/zip"); private final GerritServer server; + private final SchemaFactory schema; private final SecureRandom rng; private final FileTypeRegistry registry; @Inject - CatServlet(final GerritServer gs, final FileTypeRegistry ftr) { + CatServlet(final GerritServer gs, final SchemaFactory sf, + final FileTypeRegistry ftr) { server = gs; + schema = sf; rng = new SecureRandom(); registry = ftr; } @@ -115,14 +119,15 @@ public class CatServlet extends HttpServlet { } } - final Account.Id me = new GerritCall(server, req, rsp).getAccountId(); + final Account.Id me = + new GerritCall(server, schema, req, rsp).getAccountId(); final Change.Id changeId = patchKey.getParentKey().getParentKey(); final Project project; final Change change; final PatchSet patchSet; final Patch patch; try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { change = db.changes().get(changeId); if (change == null) { diff --git a/src/main/java/com/google/gerrit/server/ChangeDetailServiceImpl.java b/src/main/java/com/google/gerrit/server/ChangeDetailServiceImpl.java index 8fa3a6def4..d7c0ac6d77 100644 --- a/src/main/java/com/google/gerrit/server/ChangeDetailServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/ChangeDetailServiceImpl.java @@ -24,13 +24,14 @@ import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.client.rpc.NoSuchEntityException; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; class ChangeDetailServiceImpl extends BaseServiceImplementation implements ChangeDetailService { @Inject - ChangeDetailServiceImpl(final GerritServer gs) { - super(gs); + ChangeDetailServiceImpl(final SchemaFactory sf) { + super(sf); } public void changeDetail(final Change.Id id, diff --git a/src/main/java/com/google/gerrit/server/ChangeListServiceImpl.java b/src/main/java/com/google/gerrit/server/ChangeListServiceImpl.java index e1f73b147e..e720e9797f 100644 --- a/src/main/java/com/google/gerrit/server/ChangeListServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/ChangeListServiceImpl.java @@ -38,6 +38,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtjsonrpc.client.VoidResult; import com.google.gwtorm.client.OrmException; import com.google.gwtorm.client.ResultSet; +import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.client.Transaction; import com.google.gwtorm.client.impl.ListResultSet; import com.google.inject.Inject; @@ -83,8 +84,8 @@ class ChangeListServiceImpl extends BaseServiceImplementation implements } @Inject - ChangeListServiceImpl(final GerritServer gs) { - super(gs); + ChangeListServiceImpl(final SchemaFactory sf) { + super(sf); } public void allOpenPrev(final String pos, final int pageSize, diff --git a/src/main/java/com/google/gerrit/server/ChangeManageServiceImpl.java b/src/main/java/com/google/gerrit/server/ChangeManageServiceImpl.java index 4d0bdfe847..b50da7e8b8 100644 --- a/src/main/java/com/google/gerrit/server/ChangeManageServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/ChangeManageServiceImpl.java @@ -31,6 +31,7 @@ import com.google.gerrit.server.workflow.FunctionState; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtjsonrpc.client.VoidResult; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.client.Transaction; import com.google.inject.Inject; @@ -41,10 +42,10 @@ import java.util.List; class ChangeManageServiceImpl extends BaseServiceImplementation implements ChangeManageService { private final MergeQueue merger; - + @Inject - ChangeManageServiceImpl(final GerritServer gs, final MergeQueue mq) { - super(gs); + ChangeManageServiceImpl(final SchemaFactory sf, final MergeQueue mq) { + super(sf); merger = mq; } diff --git a/src/main/java/com/google/gerrit/server/EncryptedContactStore.java b/src/main/java/com/google/gerrit/server/EncryptedContactStore.java index aa6a81f6c8..a080c88392 100644 --- a/src/main/java/com/google/gerrit/server/EncryptedContactStore.java +++ b/src/main/java/com/google/gerrit/server/EncryptedContactStore.java @@ -20,6 +20,7 @@ import com.google.gerrit.client.reviewdb.ContactInformation; import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.client.rpc.ContactInformationStoreException; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import org.apache.sshd.common.util.SecurityUtils; import org.bouncycastle.bcpg.ArmoredOutputStream; @@ -59,14 +60,16 @@ class EncryptedContactStore implements ContactStore { private static final TimeZone UTC = TimeZone.getTimeZone("UTC"); private final GerritServer server; + private final SchemaFactory schema; private PGPPublicKey dest; private SecureRandom prng; private URL storeUrl; private String storeAPPSEC; - EncryptedContactStore(final GerritServer gs) + EncryptedContactStore(final GerritServer gs, final SchemaFactory sf) throws ContactInformationStoreException { server = gs; + schema = sf; if (gs.getContactStoreURL() == null) { throw new ContactInformationStoreException(new IllegalStateException( @@ -90,12 +93,12 @@ class EncryptedContactStore implements ContactStore { throw new ContactInformationStoreException(e); } - dest = selectKey(readPubRing(gs)); + dest = selectKey(readPubRing()); } - private PGPPublicKeyRingCollection readPubRing(final GerritServer gs) + private PGPPublicKeyRingCollection readPubRing() throws ContactInformationStoreException { - final File pub = new File(gs.getSitePath(), "contact_information.pub"); + final File pub = new File(server.getSitePath(), "contact_information.pub"); try { InputStream in = new FileInputStream(pub); try { @@ -234,7 +237,7 @@ class EncryptedContactStore implements ContactStore { field(b, "Preferred-Email", account.getPreferredEmail()); try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { for (final AccountExternalId e : db.accountExternalIds().byAccount( account.getId())) { diff --git a/src/main/java/com/google/gerrit/server/EncryptedContactStoreProvider.java b/src/main/java/com/google/gerrit/server/EncryptedContactStoreProvider.java index fb9a799c1c..332f565517 100644 --- a/src/main/java/com/google/gerrit/server/EncryptedContactStoreProvider.java +++ b/src/main/java/com/google/gerrit/server/EncryptedContactStoreProvider.java @@ -16,18 +16,22 @@ package com.google.gerrit.server; import com.google.gerrit.client.reviewdb.Account; import com.google.gerrit.client.reviewdb.ContactInformation; +import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.client.rpc.ContactInformationStoreException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Provider; class EncryptedContactStoreProvider implements Provider { @Inject private GerritServer server; + @Inject + private SchemaFactory schema; @Override public ContactStore get() { try { - return new EncryptedContactStore(server); + return new EncryptedContactStore(server, schema); } catch (final ContactInformationStoreException initError) { return new ContactStore() { @Override diff --git a/src/main/java/com/google/gerrit/server/GerritCall.java b/src/main/java/com/google/gerrit/server/GerritCall.java index 6e4951a7f3..7dfe632901 100644 --- a/src/main/java/com/google/gerrit/server/GerritCall.java +++ b/src/main/java/com/google/gerrit/server/GerritCall.java @@ -24,6 +24,7 @@ import com.google.gwtjsonrpc.server.ActiveCall; import com.google.gwtjsonrpc.server.ValidToken; import com.google.gwtjsonrpc.server.XsrfException; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.client.Transaction; import org.spearce.jgit.util.Base64; @@ -46,13 +47,15 @@ public class GerritCall extends ActiveCall { } private final GerritServer server; + private final SchemaFactory schema; private boolean accountRead; private Account.Id accountId; private boolean rememberAccount; - public GerritCall(final GerritServer gs, final HttpServletRequest i, - final HttpServletResponse o) { + public GerritCall(final GerritServer gs, final SchemaFactory sf, + final HttpServletRequest i, final HttpServletResponse o) { super(i, o); + schema = sf; server = gs; } @@ -158,7 +161,7 @@ public class GerritCall extends ActiveCall { } try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { final String eid = "gerrit:" + user; final List matches = diff --git a/src/main/java/com/google/gerrit/server/GerritConfigProvider.java b/src/main/java/com/google/gerrit/server/GerritConfigProvider.java index 0fee23b748..a49fb6d332 100644 --- a/src/main/java/com/google/gerrit/server/GerritConfigProvider.java +++ b/src/main/java/com/google/gerrit/server/GerritConfigProvider.java @@ -44,9 +44,9 @@ class GerritConfigProvider implements Provider { private GerritSshDaemon sshd; @Inject - GerritConfigProvider(final GerritServer gs) { + GerritConfigProvider(final GerritServer gs, final SchemaFactory sf) { server = gs; - schema = gs.getSchemaFactory(); + schema = sf; } @Inject(optional = true) diff --git a/src/main/java/com/google/gerrit/server/GerritJsonServlet.java b/src/main/java/com/google/gerrit/server/GerritJsonServlet.java index a100ced8d7..14753da836 100644 --- a/src/main/java/com/google/gerrit/server/GerritJsonServlet.java +++ b/src/main/java/com/google/gerrit/server/GerritJsonServlet.java @@ -14,12 +14,14 @@ package com.google.gerrit.server; +import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.client.rpc.NotSignedInException; import com.google.gerrit.client.rpc.SignInRequired; import com.google.gson.GsonBuilder; import com.google.gwtjsonrpc.client.RemoteJsonService; import com.google.gwtjsonrpc.server.JsonServlet; import com.google.gwtjsonrpc.server.SignedToken; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import javax.servlet.http.HttpServletRequest; @@ -35,12 +37,15 @@ public final class GerritJsonServlet extends JsonServlet { return JsonServlet. getCurrentCall(); } - protected GerritServer server; - private RemoteJsonService service; + private final GerritServer server; + private final SchemaFactory schema; + private final RemoteJsonService service; @Inject - GerritJsonServlet(final GerritServer gs, final RemoteJsonService s) { + GerritJsonServlet(final GerritServer gs, final SchemaFactory sf, + final RemoteJsonService s) { server = gs; + schema = sf; service = s; } @@ -52,7 +57,7 @@ public final class GerritJsonServlet extends JsonServlet { @Override protected GerritCall createActiveCall(final HttpServletRequest req, final HttpServletResponse resp) { - return new GerritCall(server, req, resp); + return new GerritCall(server, schema, req, resp); } @Override diff --git a/src/main/java/com/google/gerrit/server/GerritServer.java b/src/main/java/com/google/gerrit/server/GerritServer.java index 34d082289a..b5a8b57d14 100644 --- a/src/main/java/com/google/gerrit/server/GerritServer.java +++ b/src/main/java/com/google/gerrit/server/GerritServer.java @@ -36,7 +36,6 @@ import com.google.gerrit.server.workflow.SubmitFunction; import com.google.gwtjsonrpc.server.SignedToken; import com.google.gwtjsonrpc.server.XsrfException; import com.google.gwtorm.client.OrmException; -import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.client.Transaction; import com.google.gwtorm.jdbc.Database; import com.google.inject.Inject; @@ -297,7 +296,7 @@ public class GerritServer { final Cache dc = cacheMgr.getCache("sshkeys"); final SelfPopulatingCache r; - r = new SelfPopulatingCache(dc, new SshKeyCacheEntryFactory(this)); + r = new SelfPopulatingCache(dc, new SshKeyCacheEntryFactory(db)); cacheMgr.replaceCacheWithDecoratedCache(dc, r); return r; } @@ -708,11 +707,6 @@ public class GerritServer { return gerritConfigFile; } - /** Get the schema factory for this instance. */ - public SchemaFactory getSchemaFactory() { - return db; - } - /** * Get (or open) a repository by name. * diff --git a/src/main/java/com/google/gerrit/server/GerritServerModule.java b/src/main/java/com/google/gerrit/server/GerritServerModule.java index 8fcbf93d14..df7d971966 100644 --- a/src/main/java/com/google/gerrit/server/GerritServerModule.java +++ b/src/main/java/com/google/gerrit/server/GerritServerModule.java @@ -22,6 +22,7 @@ import com.google.gerrit.git.ChangeMergeQueue; import com.google.gerrit.git.MergeQueue; import com.google.gerrit.git.PushReplication; import com.google.gerrit.git.ReplicationQueue; +import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.jdbc.Database; import com.google.inject.AbstractModule; import com.google.inject.Key; @@ -38,6 +39,8 @@ public class GerritServerModule extends AbstractModule { @Override protected void configure() { bind(DS).toProvider(ReviewDbDataSourceProvider.class).in(SINGLETON); + bind(new TypeLiteral>() {}).to( + new TypeLiteral>() {}); bind(new TypeLiteral>() {}).toProvider( ReviewDbProvider.class).in(SINGLETON); diff --git a/src/main/java/com/google/gerrit/server/GerritServletConfig.java b/src/main/java/com/google/gerrit/server/GerritServletConfig.java index 74561025fa..18e24147f6 100644 --- a/src/main/java/com/google/gerrit/server/GerritServletConfig.java +++ b/src/main/java/com/google/gerrit/server/GerritServletConfig.java @@ -28,6 +28,7 @@ import com.google.gerrit.server.ssh.SshServlet; import com.google.gwtexpui.server.CacheControlFilter; import com.google.gwtjsonrpc.client.RemoteJsonService; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.BindingAnnotation; import com.google.inject.ConfigurationException; import com.google.inject.Guice; @@ -35,6 +36,7 @@ import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Module; import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; import com.google.inject.servlet.GuiceServletContextListener; import com.google.inject.servlet.ServletModule; @@ -182,19 +184,23 @@ public class GerritServletConfig extends GuiceServletContextListener { private void startReplication() { final ReplicationQueue rq = injector.getInstance(ReplicationQueue.class); if (rq.isEnabled()) { - final GerritServer gs = injector.getInstance(GerritServer.class); - WorkQueue.schedule(new PushAllProjectsOp(gs, rq), 30, TimeUnit.SECONDS); + final SchemaFactory sf = + injector.getInstance(Key + .get(new TypeLiteral>() {})); + WorkQueue.schedule(new PushAllProjectsOp(sf, rq), 30, TimeUnit.SECONDS); } } private void restartPendingMerges() { final MergeQueue mq = injector.getInstance(MergeQueue.class); - final GerritServer gs = injector.getInstance(GerritServer.class); + final SchemaFactory sf = + injector.getInstance(Key + .get(new TypeLiteral>() {})); WorkQueue.schedule(new Runnable() { public void run() { final HashSet pending = new HashSet(); try { - final ReviewDb c = gs.getSchemaFactory().open(); + final ReviewDb c = sf.open(); try { for (final Change change : c.changes().allSubmitted()) { pending.add(change.getDest()); diff --git a/src/main/java/com/google/gerrit/server/GroupAdminServiceImpl.java b/src/main/java/com/google/gerrit/server/GroupAdminServiceImpl.java index b833fd327a..e9a8003c0e 100644 --- a/src/main/java/com/google/gerrit/server/GroupAdminServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/GroupAdminServiceImpl.java @@ -29,6 +29,7 @@ import com.google.gerrit.client.rpc.NoSuchEntityException; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtjsonrpc.client.VoidResult; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.client.Transaction; import com.google.inject.Inject; @@ -43,8 +44,8 @@ import java.util.Set; class GroupAdminServiceImpl extends BaseServiceImplementation implements GroupAdminService { @Inject - GroupAdminServiceImpl(final GerritServer gs) { - super(gs); + GroupAdminServiceImpl(final SchemaFactory sf) { + super(sf); } public void ownedGroups(final AsyncCallback> callback) { diff --git a/src/main/java/com/google/gerrit/server/HostPageServlet.java b/src/main/java/com/google/gerrit/server/HostPageServlet.java index 24942b0a13..d1d7c16759 100644 --- a/src/main/java/com/google/gerrit/server/HostPageServlet.java +++ b/src/main/java/com/google/gerrit/server/HostPageServlet.java @@ -16,8 +16,10 @@ package com.google.gerrit.server; import com.google.gerrit.client.data.GerritConfig; import com.google.gerrit.client.reviewdb.Account; +import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.client.rpc.Common; import com.google.gwt.user.server.rpc.RPCServletUtils; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -44,6 +46,7 @@ import javax.servlet.http.HttpServletResponse; @Singleton public class HostPageServlet extends HttpServlet { private final GerritServer server; + private final SchemaFactory schema; private final GerritConfig config; private String canonicalUrl; @@ -51,8 +54,10 @@ public class HostPageServlet extends HttpServlet { private Document hostDoc; @Inject - HostPageServlet(final GerritServer gs, final GerritConfig gc) { + HostPageServlet(final GerritServer gs, final SchemaFactory sf, + final GerritConfig gc) { server = gs; + schema = sf; config = gc; } @@ -220,7 +225,8 @@ public class HostPageServlet extends HttpServlet { return; } - final Account.Id me = new GerritCall(server, req, rsp).getAccountId(); + final Account.Id me = + new GerritCall(server, schema, req, rsp).getAccountId(); final Account account = Common.getAccountCache().get(me); final Document peruser = HtmlDomUtil.clone(hostDoc); diff --git a/src/main/java/com/google/gerrit/server/OpenIdServiceImpl.java b/src/main/java/com/google/gerrit/server/OpenIdServiceImpl.java index cacb353989..2505afe316 100644 --- a/src/main/java/com/google/gerrit/server/OpenIdServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/OpenIdServiceImpl.java @@ -32,6 +32,7 @@ import com.google.gwtjsonrpc.server.XsrfException; import com.google.gwtorm.client.KeyUtil; import com.google.gwtorm.client.OrmException; import com.google.gwtorm.client.ResultSet; +import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.client.Transaction; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -95,12 +96,15 @@ class OpenIdServiceImpl implements OpenIdService { } private final GerritServer server; + private final SchemaFactory schema; private final ConsumerManager manager; private final SelfPopulatingCache discoveryCache; @Inject - OpenIdServiceImpl(final GerritServer gs) throws ConsumerException { + OpenIdServiceImpl(final GerritServer gs, final SchemaFactory sf) + throws ConsumerException { server = gs; + schema = sf; manager = new ConsumerManager(); if (useOpenID()) { discoveryCache = @@ -179,7 +183,7 @@ class OpenIdServiceImpl implements OpenIdService { // We might already have this account on file. Look for it. // try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { final ResultSet ae = db.accountExternalIds().byExternal(aReq.getIdentity()); @@ -333,7 +337,7 @@ class OpenIdServiceImpl implements OpenIdService { Account account = null; if (user != null) { try { - final ReviewDb d = server.getSchemaFactory().open(); + final ReviewDb d = schema.open(); try { switch (mode) { case SIGN_IN: diff --git a/src/main/java/com/google/gerrit/server/ProjectAdminServiceImpl.java b/src/main/java/com/google/gerrit/server/ProjectAdminServiceImpl.java index 6cffa4e885..edfdcc77ec 100644 --- a/src/main/java/com/google/gerrit/server/ProjectAdminServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/ProjectAdminServiceImpl.java @@ -34,6 +34,7 @@ import com.google.gerrit.git.ReplicationQueue; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtjsonrpc.client.VoidResult; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import org.slf4j.Logger; @@ -66,12 +67,14 @@ import javax.servlet.http.HttpServletRequest; class ProjectAdminServiceImpl extends BaseServiceImplementation implements ProjectAdminService { private final Logger log = LoggerFactory.getLogger(getClass()); - + private final GerritServer server; private final ReplicationQueue replication; @Inject - ProjectAdminServiceImpl(final GerritServer gs, final ReplicationQueue rq) { - super(gs); + ProjectAdminServiceImpl(final SchemaFactory sf, + final GerritServer gs, final ReplicationQueue rq) { + super(sf); + server = gs; replication = rq; } diff --git a/src/main/java/com/google/gerrit/server/SuggestServiceImpl.java b/src/main/java/com/google/gerrit/server/SuggestServiceImpl.java index af3aee9603..516dfad3e7 100644 --- a/src/main/java/com/google/gerrit/server/SuggestServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/SuggestServiceImpl.java @@ -25,6 +25,7 @@ import com.google.gerrit.client.rpc.Common; import com.google.gerrit.client.ui.SuggestService; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import java.util.ArrayList; @@ -36,8 +37,8 @@ class SuggestServiceImpl extends BaseServiceImplementation implements private static final String MAX_SUFFIX = "\u9fa5"; @Inject - SuggestServiceImpl(final GerritServer gs) { - super(gs); + SuggestServiceImpl(final SchemaFactory sf) { + super(sf); } public void suggestProjectNameKey(final String query, final int limit, diff --git a/src/main/java/com/google/gerrit/server/SystemInfoServiceImpl.java b/src/main/java/com/google/gerrit/server/SystemInfoServiceImpl.java index 60d70c8379..a2f7db2402 100644 --- a/src/main/java/com/google/gerrit/server/SystemInfoServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/SystemInfoServiceImpl.java @@ -22,6 +22,7 @@ import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.server.ssh.GerritSshDaemon; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import com.jcraft.jsch.HostKey; @@ -51,15 +52,15 @@ class SystemInfoServiceImpl implements SystemInfoService { LoggerFactory.getLogger(SystemInfoServiceImpl.class); private static final JSch JSCH = new JSch(); - private final GerritServer server; + private final SchemaFactory schema; private final GerritSshDaemon sshd; private final GerritConfig config; private final List hostKeys; @Inject - SystemInfoServiceImpl(final GerritServer gs, final GerritSshDaemon daemon, - final GerritConfig gc) { - server = gs; + SystemInfoServiceImpl(final SchemaFactory sf, + final GerritSshDaemon daemon, final GerritConfig gc) { + schema = sf; sshd = daemon; config = gc; hostKeys = sortHostKeys(); @@ -77,7 +78,7 @@ class SystemInfoServiceImpl implements SystemInfoService { public void contributorAgreements( final AsyncCallback> callback) { try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { callback.onSuccess(db.contributorAgreements().active().toList()); } finally { diff --git a/src/main/java/com/google/gerrit/server/UrlRewriteFilter.java b/src/main/java/com/google/gerrit/server/UrlRewriteFilter.java index 01ea39eaa7..3716e20a09 100644 --- a/src/main/java/com/google/gerrit/server/UrlRewriteFilter.java +++ b/src/main/java/com/google/gerrit/server/UrlRewriteFilter.java @@ -20,6 +20,7 @@ import com.google.gerrit.client.reviewdb.Change; import com.google.gerrit.client.reviewdb.RevId; import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -69,12 +70,12 @@ public class UrlRewriteFilter implements Filter { staticExtensions.add(".png"); } - private final GerritServer server; + private final SchemaFactory schema; private FilterConfig config; @Inject - UrlRewriteFilter(final GerritServer gs) { - server = gs; + UrlRewriteFilter(final SchemaFactory sf) { + schema = sf; } public void init(final FilterConfig config) { @@ -194,7 +195,7 @@ public class UrlRewriteFilter implements Filter { final String email = cleanEmail(m.group(1)); final List people; try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { people = db.accounts().byPreferredEmail(email).toList(); } finally { diff --git a/src/main/java/com/google/gerrit/server/patch/PatchDetailServiceImpl.java b/src/main/java/com/google/gerrit/server/patch/PatchDetailServiceImpl.java index 70798adace..7388a3fa70 100644 --- a/src/main/java/com/google/gerrit/server/patch/PatchDetailServiceImpl.java +++ b/src/main/java/com/google/gerrit/server/patch/PatchDetailServiceImpl.java @@ -51,6 +51,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwtjsonrpc.client.VoidResult; import com.google.gwtorm.client.OrmException; import com.google.gwtorm.client.OrmRunnable; +import com.google.gwtorm.client.SchemaFactory; import com.google.gwtorm.client.Transaction; import com.google.inject.Inject; @@ -67,11 +68,14 @@ import java.util.Set; public class PatchDetailServiceImpl extends BaseServiceImplementation implements PatchDetailService { private final Logger log = LoggerFactory.getLogger(getClass()); + private final GerritServer server; private final FileTypeRegistry registry; @Inject - PatchDetailServiceImpl(final GerritServer gs, final FileTypeRegistry ftr) { - super(gs); + PatchDetailServiceImpl(final SchemaFactory sf, + final GerritServer gs, final FileTypeRegistry ftr) { + super(sf); + server = gs; registry = ftr; } diff --git a/src/main/java/com/google/gerrit/server/ssh/AbstractCommand.java b/src/main/java/com/google/gerrit/server/ssh/AbstractCommand.java index 74cc6b6d28..5aff93beef 100644 --- a/src/main/java/com/google/gerrit/server/ssh/AbstractCommand.java +++ b/src/main/java/com/google/gerrit/server/ssh/AbstractCommand.java @@ -23,6 +23,7 @@ import com.google.gerrit.client.rpc.Common; import com.google.gerrit.server.BaseServiceImplementation; import com.google.gerrit.server.GerritServer; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import com.google.inject.Inject; import com.google.inject.servlet.RequestScoped; @@ -62,8 +63,12 @@ abstract class AbstractCommand implements Command, SessionAware { protected OutputStream err; protected ExitCallback exit; protected ServerSession session; + @Inject protected GerritServer server; + + @Inject + protected SchemaFactory schema; protected ReviewDb db; private String name; @@ -105,7 +110,7 @@ abstract class AbstractCommand implements Command, SessionAware { protected ReviewDb openReviewDb() throws Failure { if (db == null) { try { - db = getGerritServer().getSchemaFactory().open(); + db = schema.open(); } catch (OrmException e) { throw new Failure(1, "fatal: Gerrit database is offline", e); } diff --git a/src/main/java/com/google/gerrit/server/ssh/AdminReplicate.java b/src/main/java/com/google/gerrit/server/ssh/AdminReplicate.java index fb3a4afefe..a1f849506e 100644 --- a/src/main/java/com/google/gerrit/server/ssh/AdminReplicate.java +++ b/src/main/java/com/google/gerrit/server/ssh/AdminReplicate.java @@ -55,7 +55,7 @@ class AdminReplicate extends AbstractCommand { } if (all) { - WorkQueue.schedule(new PushAllProjectsOp(server, replication, urlMatch), + WorkQueue.schedule(new PushAllProjectsOp(schema, replication, urlMatch), 0, TimeUnit.SECONDS); } else { diff --git a/src/main/java/com/google/gerrit/server/ssh/DatabasePubKeyAuth.java b/src/main/java/com/google/gerrit/server/ssh/DatabasePubKeyAuth.java index f3bed81d92..cd3c4f40e0 100644 --- a/src/main/java/com/google/gerrit/server/ssh/DatabasePubKeyAuth.java +++ b/src/main/java/com/google/gerrit/server/ssh/DatabasePubKeyAuth.java @@ -15,7 +15,11 @@ package com.google.gerrit.server.ssh; import com.google.gerrit.client.reviewdb.AccountSshKey; +import com.google.gerrit.client.reviewdb.ReviewDb; import com.google.gerrit.server.GerritServer; +import com.google.gwtorm.client.SchemaFactory; +import com.google.inject.Inject; +import com.google.inject.Singleton; import net.sf.ehcache.Element; import net.sf.ehcache.constructs.blocking.SelfPopulatingCache; @@ -35,14 +39,16 @@ import java.util.Collections; * address, as listed in their Account entity. Only keys listed under that * account as authorized keys are permitted to access the account. */ +@Singleton class DatabasePubKeyAuth implements PublickeyAuthenticator { private final Logger log = LoggerFactory.getLogger(getClass()); private final SelfPopulatingCache sshKeysCache; - private final GerritServer server; + private final SchemaFactory schema; - DatabasePubKeyAuth(final GerritServer gs) { + @Inject + DatabasePubKeyAuth(final GerritServer gs, final SchemaFactory sf) { sshKeysCache = gs.getSshKeysCache(); - server = gs; + schema = sf; } public boolean hasKey(final String username, final PublicKey inkey, @@ -67,7 +73,7 @@ class DatabasePubKeyAuth implements PublickeyAuthenticator { } if (matched != null) { - matched.updateLastUsed(server); + matched.updateLastUsed(schema); session.setAttribute(SshUtil.CURRENT_ACCOUNT, matched.getAccount()); return true; } diff --git a/src/main/java/com/google/gerrit/server/ssh/GerritSshDaemon.java b/src/main/java/com/google/gerrit/server/ssh/GerritSshDaemon.java index 197983b1ba..f6fca76190 100644 --- a/src/main/java/com/google/gerrit/server/ssh/GerritSshDaemon.java +++ b/src/main/java/com/google/gerrit/server/ssh/GerritSshDaemon.java @@ -49,6 +49,7 @@ import org.apache.sshd.common.signature.SignatureDSA; import org.apache.sshd.common.signature.SignatureRSA; import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.server.CommandFactory; +import org.apache.sshd.server.PublickeyAuthenticator; import org.apache.sshd.server.ServerChannel; import org.apache.sshd.server.SessionFactory; import org.apache.sshd.server.UserAuth; @@ -126,7 +127,7 @@ public class GerritSshDaemon extends SshServer { @Inject public GerritSshDaemon(final GerritServer srv, - final CommandFactory commandFactory) { + final CommandFactory commandFactory, final PublickeyAuthenticator userAuth) { setPort(22/* never used */); final RepositoryConfig cfg = srv.getGerritConfig(); @@ -144,7 +145,7 @@ public class GerritSshDaemon extends SshServer { initSignatures(); initChannels(); initCompression(); - initUserAuth(srv); + initUserAuth(userAuth); setKeyPairProvider(initHostKey(srv)); setCommandFactory(commandFactory); setShellFactory(new NoShell()); @@ -467,10 +468,10 @@ public class GerritSshDaemon extends SshServer { } @SuppressWarnings("unchecked") - private void initUserAuth(final GerritServer srv) { + private void initUserAuth(final PublickeyAuthenticator pubkey) { setUserAuthFactories(Arrays .> asList(new UserAuthPublicKey.Factory())); - setPublickeyAuthenticator(new DatabasePubKeyAuth(srv)); + setPublickeyAuthenticator(pubkey); } private KeyPairProvider initHostKey(final GerritServer srv) { diff --git a/src/main/java/com/google/gerrit/server/ssh/SshDaemonModule.java b/src/main/java/com/google/gerrit/server/ssh/SshDaemonModule.java index c494f490e8..800b2b1331 100644 --- a/src/main/java/com/google/gerrit/server/ssh/SshDaemonModule.java +++ b/src/main/java/com/google/gerrit/server/ssh/SshDaemonModule.java @@ -17,6 +17,7 @@ package com.google.gerrit.server.ssh; import com.google.inject.AbstractModule; import org.apache.sshd.server.CommandFactory; +import org.apache.sshd.server.PublickeyAuthenticator; /** Configures standard dependencies for {@link GerritSshDaemon}. */ public class SshDaemonModule extends AbstractModule { @@ -24,5 +25,6 @@ public class SshDaemonModule extends AbstractModule { protected void configure() { bind(GerritSshDaemon.class); bind(CommandFactory.class).to(GerritCommandFactory.class); + bind(PublickeyAuthenticator.class).to(DatabasePubKeyAuth.class); } } diff --git a/src/main/java/com/google/gerrit/server/ssh/SshKeyCacheEntry.java b/src/main/java/com/google/gerrit/server/ssh/SshKeyCacheEntry.java index 9a2e4f5786..2daf1847c6 100644 --- a/src/main/java/com/google/gerrit/server/ssh/SshKeyCacheEntry.java +++ b/src/main/java/com/google/gerrit/server/ssh/SshKeyCacheEntry.java @@ -17,8 +17,8 @@ package com.google.gerrit.server.ssh; import com.google.gerrit.client.reviewdb.Account; import com.google.gerrit.client.reviewdb.AccountSshKey; import com.google.gerrit.client.reviewdb.ReviewDb; -import com.google.gerrit.server.GerritServer; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,9 +46,9 @@ class SshKeyCacheEntry { return publicKey.equals(inkey); } - void updateLastUsed(final GerritServer server) { + void updateLastUsed(final SchemaFactory schema) { try { - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { final AccountSshKey k = db.accountSshKeys().get(id); if (k != null) { diff --git a/src/main/java/com/google/gerrit/server/ssh/SshKeyCacheEntryFactory.java b/src/main/java/com/google/gerrit/server/ssh/SshKeyCacheEntryFactory.java index 8d86948ac4..bf8428a5d6 100644 --- a/src/main/java/com/google/gerrit/server/ssh/SshKeyCacheEntryFactory.java +++ b/src/main/java/com/google/gerrit/server/ssh/SshKeyCacheEntryFactory.java @@ -17,8 +17,8 @@ package com.google.gerrit.server.ssh; import com.google.gerrit.client.reviewdb.Account; import com.google.gerrit.client.reviewdb.AccountSshKey; import com.google.gerrit.client.reviewdb.ReviewDb; -import com.google.gerrit.server.GerritServer; import com.google.gwtorm.client.OrmException; +import com.google.gwtorm.client.SchemaFactory; import net.sf.ehcache.constructs.blocking.CacheEntryFactory; @@ -32,15 +32,15 @@ import java.util.List; public class SshKeyCacheEntryFactory implements CacheEntryFactory { private final Logger log = LoggerFactory.getLogger(getClass()); - private final GerritServer server; + private final SchemaFactory schema; - public SshKeyCacheEntryFactory(final GerritServer gs) { - server = gs; + public SshKeyCacheEntryFactory(final SchemaFactory sf) { + schema = sf; } public Object createEntry(final Object genericKey) throws Exception { final String username = (String) genericKey; - final ReviewDb db = server.getSchemaFactory().open(); + final ReviewDb db = schema.open(); try { final List matches = db.accounts().bySshUserName(username).toList();