diff --git a/java/com/google/gerrit/acceptance/InProcessProtocol.java b/java/com/google/gerrit/acceptance/InProcessProtocol.java index de8d10ccf3..94c4635d40 100644 --- a/java/com/google/gerrit/acceptance/InProcessProtocol.java +++ b/java/com/google/gerrit/acceptance/InProcessProtocol.java @@ -246,7 +246,7 @@ class InProcessProtocol extends TestProtocol { try { perm.check(ProjectPermission.RUN_UPLOAD_PACK); } catch (AuthException e) { - throw new ServiceNotAuthorizedException(); + throw new ServiceNotAuthorizedException(e.getMessage(), e); } catch (PermissionBackendException e) { throw new RuntimeException(e); } @@ -318,7 +318,7 @@ class InProcessProtocol extends TestProtocol { .project(req.project) .check(ProjectPermission.RUN_RECEIVE_PACK); } catch (AuthException e) { - throw new ServiceNotAuthorizedException(); + throw new ServiceNotAuthorizedException(e.getMessage(), e); } catch (PermissionBackendException e) { throw new RuntimeException(e); } diff --git a/java/com/google/gerrit/common/errors/InvalidSshKeyException.java b/java/com/google/gerrit/common/errors/InvalidSshKeyException.java index 3398417a98..0e5d80d8ee 100644 --- a/java/com/google/gerrit/common/errors/InvalidSshKeyException.java +++ b/java/com/google/gerrit/common/errors/InvalidSshKeyException.java @@ -23,4 +23,8 @@ public class InvalidSshKeyException extends Exception { public InvalidSshKeyException() { super(MESSAGE); } + + public InvalidSshKeyException(Throwable cause) { + super(MESSAGE, cause); + } } diff --git a/java/com/google/gerrit/extensions/restapi/MethodNotAllowedException.java b/java/com/google/gerrit/extensions/restapi/MethodNotAllowedException.java index 61c6345e4e..235b77f4ec 100644 --- a/java/com/google/gerrit/extensions/restapi/MethodNotAllowedException.java +++ b/java/com/google/gerrit/extensions/restapi/MethodNotAllowedException.java @@ -26,4 +26,12 @@ public class MethodNotAllowedException extends RestApiException { public MethodNotAllowedException(String msg) { super(msg); } + + /** + * @param msg error text for client describing why the method is not allowed. + * @param cause reason for the method not being allowed. + */ + public MethodNotAllowedException(String msg, Throwable cause) { + super(msg, cause); + } } diff --git a/java/com/google/gerrit/extensions/restapi/NotImplementedException.java b/java/com/google/gerrit/extensions/restapi/NotImplementedException.java index 566159d850..d74986a700 100644 --- a/java/com/google/gerrit/extensions/restapi/NotImplementedException.java +++ b/java/com/google/gerrit/extensions/restapi/NotImplementedException.java @@ -25,4 +25,8 @@ public class NotImplementedException extends UnsupportedOperationException { public NotImplementedException(String message) { super(message); } + + public NotImplementedException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java b/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java index e67682878b..fa2288aa84 100644 --- a/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java +++ b/java/com/google/gerrit/extensions/restapi/ResourceNotFoundException.java @@ -34,6 +34,10 @@ public class ResourceNotFoundException extends RestApiException { super("Not found: " + id.get()); } + public ResourceNotFoundException(IdString id, Throwable cause) { + super("Not found: " + id.get(), cause); + } + @SuppressWarnings("unchecked") @Override public ResourceNotFoundException caching(CacheControl c) { diff --git a/java/com/google/gerrit/httpd/HtmlDomUtil.java b/java/com/google/gerrit/httpd/HtmlDomUtil.java index 25ae71cee8..57f2664184 100644 --- a/java/com/google/gerrit/httpd/HtmlDomUtil.java +++ b/java/com/google/gerrit/httpd/HtmlDomUtil.java @@ -131,7 +131,7 @@ public class HtmlDomUtil { try { d = newBuilder().newDocument(); } catch (ParserConfigurationException e) { - throw new IOException("Cannot clone document"); + throw new IOException("Cannot clone document", e); } Node n = d.importNode(doc.getDocumentElement(), true); d.appendChild(n); diff --git a/java/com/google/gerrit/httpd/ProjectOAuthFilter.java b/java/com/google/gerrit/httpd/ProjectOAuthFilter.java index 30ebe6e7cb..4461a52fa1 100644 --- a/java/com/google/gerrit/httpd/ProjectOAuthFilter.java +++ b/java/com/google/gerrit/httpd/ProjectOAuthFilter.java @@ -195,7 +195,7 @@ class ProjectOAuthFilter implements Filter { defaultAuthPlugin = loginProvider.getPluginName(); defaultAuthProvider = loginProvider.getExportName(); } catch (NoSuchElementException e) { - throw new ServletException("No OAuth login provider installed"); + throw new ServletException("No OAuth login provider installed", e); } catch (IllegalArgumentException e) { // multiple providers found => do not pick any } diff --git a/java/com/google/gerrit/httpd/plugins/PluginServletContext.java b/java/com/google/gerrit/httpd/plugins/PluginServletContext.java index 6a8ef328f5..40083e441e 100644 --- a/java/com/google/gerrit/httpd/plugins/PluginServletContext.java +++ b/java/com/google/gerrit/httpd/plugins/PluginServletContext.java @@ -61,9 +61,11 @@ class PluginServletContext { try { handler = API.class.getDeclaredMethod(method.getName(), method.getParameterTypes()); } catch (NoSuchMethodException e) { - throw new NoSuchMethodError( + String msg = String.format( - "%s does not implement %s", PluginServletContext.class, method.toGenericString())); + "%s does not implement %s", PluginServletContext.class, method.toGenericString()); + logger.atSevere().withCause(e).log(msg); + throw new NoSuchMethodError(msg); } return handler.invoke(this, args); } diff --git a/java/com/google/gerrit/httpd/raw/BazelBuild.java b/java/com/google/gerrit/httpd/raw/BazelBuild.java index 430f0b518d..3dd46356f5 100644 --- a/java/com/google/gerrit/httpd/raw/BazelBuild.java +++ b/java/com/google/gerrit/httpd/raw/BazelBuild.java @@ -63,8 +63,9 @@ public class BazelBuild { try { status = rebuild.waitFor(); } catch (InterruptedException e) { - throw new InterruptedIOException( - "interrupted waiting for: " + Joiner.on(' ').join(proc.command())); + String msg = "interrupted waiting for: " + Joiner.on(' ').join(proc.command()); + logger.atSevere().withCause(e).log(msg); + throw new InterruptedIOException(msg); } if (status != 0) { logger.atWarning().log("build failed: %s", new String(out, UTF_8)); diff --git a/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/java/com/google/gerrit/httpd/restapi/RestApiServlet.java index 8000dbe6dc..5f14795113 100644 --- a/java/com/google/gerrit/httpd/restapi/RestApiServlet.java +++ b/java/com/google/gerrit/httpd/restapi/RestApiServlet.java @@ -875,7 +875,7 @@ public class RestApiServlet extends HttpServlet { try { first = json.peek(); } catch (EOFException e) { - throw new BadRequestException("Expected JSON object"); + throw new BadRequestException("Expected JSON object", e); } if (first == JsonToken.STRING) { return parseString(json.nextString(), type); diff --git a/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java b/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java index 6193e458c5..3afb0e2004 100644 --- a/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java +++ b/java/com/google/gerrit/httpd/rpc/project/ProjectAccessFactory.java @@ -268,7 +268,7 @@ class ProjectAccessFactory extends Handler { try { permissionBackend.currentUser().project(projectName).check(permissionToCheck); } catch (AuthException e) { - throw new NoSuchProjectException(projectName); + throw new NoSuchProjectException(projectName, e); } state.checkStatePermitsRead(); return state; diff --git a/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java b/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java index 44c896681c..552e712f6c 100644 --- a/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java +++ b/java/com/google/gerrit/httpd/rpc/project/ProjectAccessHandler.java @@ -194,7 +194,7 @@ public abstract class ProjectAccessHandler extends Handler { return updateProjectConfig(config, md, parentProjectUpdate); } catch (RepositoryNotFoundException notFound) { - throw new NoSuchProjectException(projectName); + throw new NoSuchProjectException(projectName, notFound); } } diff --git a/java/com/google/gerrit/lucene/QueryBuilder.java b/java/com/google/gerrit/lucene/QueryBuilder.java index ce5ba9859a..8dfc12ecf4 100644 --- a/java/com/google/gerrit/lucene/QueryBuilder.java +++ b/java/com/google/gerrit/lucene/QueryBuilder.java @@ -167,7 +167,7 @@ public class QueryBuilder { // subclasses of OperatorPredicate. value = Integer.parseInt(p.getValue()); } catch (NumberFormatException e) { - throw new QueryParseException("not an integer: " + p.getValue()); + throw new QueryParseException("not an integer: " + p.getValue(), e); } return new TermQuery(intTerm(p.getField().getName(), value)); } diff --git a/java/com/google/gerrit/pgm/init/BaseInit.java b/java/com/google/gerrit/pgm/init/BaseInit.java index 8614347a02..234abfdded 100644 --- a/java/com/google/gerrit/pgm/init/BaseInit.java +++ b/java/com/google/gerrit/pgm/init/BaseInit.java @@ -356,7 +356,7 @@ public class BaseInit extends SiteProgram { IoUtil.loadJARs(secureStoreLib); return new SecureStoreInitData(secureStoreLib, secureStores.get(0)); } catch (IOException e) { - throw new InvalidSecureStoreException(String.format("%s is not a valid jar", secureStore)); + throw new InvalidSecureStoreException(String.format("%s is not a valid jar", secureStore), e); } } diff --git a/java/com/google/gerrit/pgm/init/InitHttpd.java b/java/com/google/gerrit/pgm/init/InitHttpd.java index d583ea550d..ada4ac5ddc 100644 --- a/java/com/google/gerrit/pgm/init/InitHttpd.java +++ b/java/com/google/gerrit/pgm/init/InitHttpd.java @@ -169,7 +169,7 @@ class InitHttpd implements InitStep { uri = new URI(s + "://" + uri.getHost() + uri.getPath()); } } catch (URISyntaxException e) { - throw die("invalid httpd.listenUrl"); + throw die("invalid httpd.listenUrl", e); } httpd.set("listenUrl", urlbuf.toString()); gerrit.string("Canonical URL", "canonicalWebUrl", uri.toString()); diff --git a/java/com/google/gerrit/pgm/init/Libraries.java b/java/com/google/gerrit/pgm/init/Libraries.java index c599e99eb8..826a79b2a2 100644 --- a/java/com/google/gerrit/pgm/init/Libraries.java +++ b/java/com/google/gerrit/pgm/init/Libraries.java @@ -71,7 +71,7 @@ class Libraries { try { f.set(this, downloadProvider.get()); } catch (IllegalArgumentException | IllegalAccessException e) { - throw new IllegalStateException("Cannot initialize " + f.getName()); + throw new IllegalStateException("Cannot initialize " + f.getName(), e); } } } @@ -84,7 +84,7 @@ class Libraries { | IllegalAccessException | NoSuchFieldException | SecurityException e) { - throw new IllegalStateException("Cannot configure " + f.getName()); + throw new IllegalStateException("Cannot configure " + f.getName(), e); } } } diff --git a/java/com/google/gerrit/server/ApprovalsUtil.java b/java/com/google/gerrit/server/ApprovalsUtil.java index 3625de6a45..e2b7c6985e 100644 --- a/java/com/google/gerrit/server/ApprovalsUtil.java +++ b/java/com/google/gerrit/server/ApprovalsUtil.java @@ -372,7 +372,7 @@ public class ApprovalsUtil { forChange.check(new LabelPermission.WithValue(name, value)); } catch (AuthException e) { throw new AuthException( - String.format("applying label \"%s\": %d is restricted", name, value)); + String.format("applying label \"%s\": %d is restricted", name, value), e); } } } diff --git a/java/com/google/gerrit/server/account/AccountManager.java b/java/com/google/gerrit/server/account/AccountManager.java index b0dc8a389c..0772bb3ac1 100644 --- a/java/com/google/gerrit/server/account/AccountManager.java +++ b/java/com/google/gerrit/server/account/AccountManager.java @@ -390,7 +390,7 @@ public class AccountManager { try { groupsUpdate.updateGroup(groupUuid, groupUpdate); } catch (NoSuchGroupException e) { - throw new AccountException(String.format("Group %s not found", groupUuid)); + throw new AccountException(String.format("Group %s not found", groupUuid), e); } } diff --git a/java/com/google/gerrit/server/account/externalids/ExternalId.java b/java/com/google/gerrit/server/account/externalids/ExternalId.java index c363b5bf03..9baa7dd60f 100644 --- a/java/com/google/gerrit/server/account/externalids/ExternalId.java +++ b/java/com/google/gerrit/server/account/externalids/ExternalId.java @@ -24,6 +24,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.common.flogger.FluentLogger; import com.google.common.hash.Hashing; import com.google.gerrit.common.Nullable; import com.google.gerrit.extensions.client.AuthType; @@ -43,6 +44,8 @@ import org.eclipse.jgit.lib.ObjectId; @AutoValue public abstract class ExternalId implements Serializable { + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + // If these regular expressions are modified the same modifications should be done to the // corresponding regular expressions in the // com.google.gerrit.client.account.UsernameField class. @@ -391,11 +394,12 @@ public abstract class ExternalId implements Serializable { } return accountId; } catch (IllegalArgumentException e) { - throw invalidConfig( - noteId, + String msg = String.format( "Value %s for '%s.%s.%s' is invalid, expected account ID", - accountIdStr, EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY)); + accountIdStr, EXTERNAL_ID_SECTION, externalIdKeyStr, ACCOUNT_ID_KEY); + logger.atSevere().withCause(e).log(msg); + throw invalidConfig(noteId, msg); } } diff --git a/java/com/google/gerrit/server/args4j/AccountIdHandler.java b/java/com/google/gerrit/server/args4j/AccountIdHandler.java index 2b66334f74..512937ba22 100644 --- a/java/com/google/gerrit/server/args4j/AccountIdHandler.java +++ b/java/com/google/gerrit/server/args4j/AccountIdHandler.java @@ -16,6 +16,7 @@ package com.google.gerrit.server.args4j; import static com.google.gerrit.util.cli.Localizable.localizable; +import com.google.common.flogger.FluentLogger; import com.google.gerrit.extensions.client.AuthType; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.account.AccountException; @@ -37,6 +38,8 @@ import org.kohsuke.args4j.spi.Parameters; import org.kohsuke.args4j.spi.Setter; public class AccountIdHandler extends OptionHandler { + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + private final AccountResolver accountResolver; private final AccountManager accountManager; private final AuthType authType; @@ -82,7 +85,9 @@ public class AccountIdHandler extends OptionHandler { } } } catch (OrmException e) { - throw new CmdLineException(owner, localizable("database is down")); + String msg = "database is down"; + logger.atSevere().withCause(e).log(msg); + throw new CmdLineException(owner, localizable(msg)); } catch (IOException e) { throw new CmdLineException(owner, "Failed to load account", e); } catch (ConfigInvalidException e) { @@ -102,7 +107,9 @@ public class AccountIdHandler extends OptionHandler { req.setSkipAuthentication(true); return accountManager.authenticate(req).getAccountId(); } catch (AccountException e) { - throw new CmdLineException(owner, localizable("user \"%s\" not found"), user); + String msg = "user \"%s\" not found"; + logger.atSevere().withCause(e).log(msg, user); + throw new CmdLineException(owner, localizable(msg), user); } } diff --git a/java/com/google/gerrit/server/args4j/ChangeIdHandler.java b/java/com/google/gerrit/server/args4j/ChangeIdHandler.java index 13832fabb0..eec3eb013b 100644 --- a/java/com/google/gerrit/server/args4j/ChangeIdHandler.java +++ b/java/com/google/gerrit/server/args4j/ChangeIdHandler.java @@ -66,7 +66,7 @@ public class ChangeIdHandler extends OptionHandler { return 1; } } catch (IllegalArgumentException e) { - throw new CmdLineException(owner, localizable("Change-Id is not valid")); + throw new CmdLineException(owner, localizable("Change-Id is not valid: %s"), e.getMessage()); } catch (OrmException e) { throw new CmdLineException(owner, localizable("Database error: %s"), e.getMessage()); } diff --git a/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java b/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java index 84c1d88d2a..4581fe02dc 100644 --- a/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java +++ b/java/com/google/gerrit/server/args4j/PatchSetIdHandler.java @@ -43,7 +43,8 @@ public class PatchSetIdHandler extends OptionHandler { try { id = PatchSet.Id.parse(token); } catch (IllegalArgumentException e) { - throw new CmdLineException(owner, localizable("\"%s\" is not a valid patch set"), token); + throw new CmdLineException( + owner, localizable("\"%s\" is not a valid patch set: %s"), token, e.getMessage()); } setter.addValue(id); diff --git a/java/com/google/gerrit/server/args4j/ProjectHandler.java b/java/com/google/gerrit/server/args4j/ProjectHandler.java index 223b112563..52fadd242d 100644 --- a/java/com/google/gerrit/server/args4j/ProjectHandler.java +++ b/java/com/google/gerrit/server/args4j/ProjectHandler.java @@ -89,7 +89,7 @@ public class ProjectHandler extends OptionHandler { permissionBackend.currentUser().project(nameKey).check(permissionToCheck); } catch (AuthException e) { throw new CmdLineException( - owner, localizable(new NoSuchProjectException(nameKey).getMessage())); + owner, localizable(new NoSuchProjectException(nameKey, e).getMessage())); } catch (PermissionBackendException | IOException e) { logger.atWarning().withCause(e).log("Cannot load project %s", nameWithoutSuffix); throw new CmdLineException( diff --git a/java/com/google/gerrit/server/cache/serialize/IntegerCacheSerializer.java b/java/com/google/gerrit/server/cache/serialize/IntegerCacheSerializer.java index 449445436b..aca9b05b5e 100644 --- a/java/com/google/gerrit/server/cache/serialize/IntegerCacheSerializer.java +++ b/java/com/google/gerrit/server/cache/serialize/IntegerCacheSerializer.java @@ -37,7 +37,7 @@ public enum IntegerCacheSerializer implements CacheSerializer { cout.writeInt32NoTag(requireNonNull(object)); cout.flush(); } catch (IOException e) { - throw new IllegalStateException("Failed to serialize int"); + throw new IllegalStateException("Failed to serialize int", e); } int n = cout.getTotalBytesWritten(); return n == buf.length ? buf : Arrays.copyOfRange(buf, 0, n); @@ -50,7 +50,7 @@ public enum IntegerCacheSerializer implements CacheSerializer { try { ret = cin.readRawVarint32(); } catch (IOException e) { - throw new IllegalArgumentException("Failed to deserialize int"); + throw new IllegalArgumentException("Failed to deserialize int", e); } int n = cin.getTotalBytesRead(); if (n != in.length) { diff --git a/java/com/google/gerrit/server/change/PureRevert.java b/java/com/google/gerrit/server/change/PureRevert.java index ddc9661cc2..766b82f13a 100644 --- a/java/com/google/gerrit/server/change/PureRevert.java +++ b/java/com/google/gerrit/server/change/PureRevert.java @@ -94,7 +94,7 @@ public class PureRevert { try { claimedOriginalCommit = rw.parseCommit(ObjectId.fromString(claimedOriginal)); } catch (InvalidObjectIdException | MissingObjectException e) { - throw new BadRequestException("invalid object ID"); + throw new BadRequestException("invalid object ID", e); } if (claimedOriginalCommit.getParentCount() == 0) { throw new BadRequestException("can't check against initial commit"); diff --git a/java/com/google/gerrit/server/change/WorkInProgressOp.java b/java/com/google/gerrit/server/change/WorkInProgressOp.java index 35b4e6ee86..71cb4c4639 100644 --- a/java/com/google/gerrit/server/change/WorkInProgressOp.java +++ b/java/com/google/gerrit/server/change/WorkInProgressOp.java @@ -83,7 +83,7 @@ public class WorkInProgressOp implements BatchUpdateOp { .project(change.getProject()) .check(ProjectPermission.WRITE_CONFIG); } catch (AuthException exp) { - throw new AuthException("not allowed to toggle work in progress"); + throw new AuthException("not allowed to toggle work in progress", exp); } } diff --git a/java/com/google/gerrit/server/config/ConfigUtil.java b/java/com/google/gerrit/server/config/ConfigUtil.java index f476adf1ec..43c05e0e64 100644 --- a/java/com/google/gerrit/server/config/ConfigUtil.java +++ b/java/com/google/gerrit/server/config/ConfigUtil.java @@ -30,7 +30,6 @@ import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.Config; public class ConfigUtil { - @SuppressWarnings("unchecked") private static T[] allValuesOf(T defaultValue) { try { @@ -182,7 +181,7 @@ public class ConfigUtil { try { return getTimeUnit(s, defaultValue, wantUnit); } catch (IllegalArgumentException notTime) { - throw notTimeUnit(section, subsection, setting, valueString); + throw notTimeUnit(section, subsection, setting, valueString, notTime); } } @@ -250,7 +249,7 @@ public class ConfigUtil { try { return wantUnit.convert(Long.parseLong(digits) * inputMul, inputUnit); } catch (NumberFormatException nfe) { - throw notTimeUnit(valueString); + throw notTimeUnit(valueString, nfe); } } @@ -421,13 +420,21 @@ public class ConfigUtil { } private static IllegalArgumentException notTimeUnit( - final String section, - final String subsection, - final String setting, - final String valueString) { - return new IllegalArgumentException( - "Invalid time unit value: " - + section + String section, String subsection, String setting, String valueString, Throwable why) { + return notTimeUnit( + section + + (subsection != null ? "." + subsection : "") + + "." + + setting + + " = " + + valueString, + why); + } + + private static IllegalArgumentException notTimeUnit( + String section, String subsection, String setting, String valueString) { + return notTimeUnit( + section + (subsection != null ? "." + subsection : "") + "." + setting @@ -439,5 +446,9 @@ public class ConfigUtil { return new IllegalArgumentException("Invalid time unit value: " + val); } + private static IllegalArgumentException notTimeUnit(String val, Throwable why) { + return new IllegalArgumentException("Invalid time unit value: " + val, why); + } + private ConfigUtil() {} } diff --git a/java/com/google/gerrit/server/git/MergeUtil.java b/java/com/google/gerrit/server/git/MergeUtil.java index b6c5f25f64..8922587ca0 100644 --- a/java/com/google/gerrit/server/git/MergeUtil.java +++ b/java/com/google/gerrit/server/git/MergeUtil.java @@ -745,6 +745,7 @@ public class MergeUtil { try { failed(rw, mergeTip, n, getCommitMergeStatus(e.getReason())); } catch (IOException e2) { + logger.atSevere().withCause(e2).log("Failed to set merge failure status for " + n.name()); throw new IntegrationException("Cannot merge " + n.name(), e); } } catch (IOException e) { diff --git a/java/com/google/gerrit/server/git/validators/CommitValidationException.java b/java/com/google/gerrit/server/git/validators/CommitValidationException.java index bffe382d89..aeead6382b 100644 --- a/java/com/google/gerrit/server/git/validators/CommitValidationException.java +++ b/java/com/google/gerrit/server/git/validators/CommitValidationException.java @@ -27,6 +27,11 @@ public class CommitValidationException extends ValidationException { this.messages = ImmutableList.of(message); } + public CommitValidationException(String reason, CommitValidationMessage message, Throwable why) { + super(reason, why); + this.messages = ImmutableList.of(message); + } + public CommitValidationException(String reason, List messages) { super(reason); this.messages = ImmutableList.copyOf(messages); diff --git a/java/com/google/gerrit/server/git/validators/CommitValidators.java b/java/com/google/gerrit/server/git/validators/CommitValidators.java index 7ab2ada0dc..ceb624901d 100644 --- a/java/com/google/gerrit/server/git/validators/CommitValidators.java +++ b/java/com/google/gerrit/server/git/validators/CommitValidators.java @@ -465,7 +465,7 @@ public class CommitValidators { perm.check(RefPermission.MERGE); return Collections.emptyList(); } catch (AuthException e) { - throw new CommitValidationException("you are not allowed to upload merges"); + throw new CommitValidationException("you are not allowed to upload merges", e); } catch (PermissionBackendException e) { logger.atSevere().withCause(e).log("cannot check MERGE"); throw new CommitValidationException("internal auth error"); @@ -562,7 +562,7 @@ public class CommitValidators { perm.check(RefPermission.FORGE_COMMITTER); } catch (AuthException denied) { throw new CommitValidationException( - "not Signed-off-by author/committer/uploader in message footer"); + "not Signed-off-by author/committer/uploader in message footer", denied); } catch (PermissionBackendException e) { logger.atSevere().withCause(e).log("cannot check FORGE_COMMITTER"); throw new CommitValidationException("internal auth error"); @@ -597,7 +597,7 @@ public class CommitValidators { return Collections.emptyList(); } catch (AuthException e) { throw new CommitValidationException( - "invalid author", invalidEmail("author", author, user, urlFormatter)); + "invalid author", invalidEmail("author", author, user, urlFormatter), e); } catch (PermissionBackendException e) { logger.atSevere().withCause(e).log("cannot check FORGE_AUTHOR"); throw new CommitValidationException("internal auth error"); @@ -630,7 +630,7 @@ public class CommitValidators { return Collections.emptyList(); } catch (AuthException e) { throw new CommitValidationException( - "invalid committer", invalidEmail("committer", committer, user, urlFormatter)); + "invalid committer", invalidEmail("committer", committer, user, urlFormatter), e); } catch (PermissionBackendException e) { logger.atSevere().withCause(e).log("cannot check FORGE_COMMITTER"); throw new CommitValidationException("internal auth error"); @@ -669,7 +669,8 @@ public class CommitValidators { "pushing merge commit %s by %s requires '%s' permission", receiveEvent.commit.getId(), gerritIdent.getEmailAddress(), - RefPermission.FORGE_SERVER.name())); + RefPermission.FORGE_SERVER.name()), + denied); } catch (PermissionBackendException e) { logger.atSevere().withCause(e).log("cannot check FORGE_SERVER"); throw new CommitValidationException("internal auth error"); diff --git a/java/com/google/gerrit/server/git/validators/MergeValidationException.java b/java/com/google/gerrit/server/git/validators/MergeValidationException.java index 3624fe03a2..2b7803d636 100644 --- a/java/com/google/gerrit/server/git/validators/MergeValidationException.java +++ b/java/com/google/gerrit/server/git/validators/MergeValidationException.java @@ -28,4 +28,8 @@ public class MergeValidationException extends ValidationException { public MergeValidationException(String msg) { super(msg); } + + public MergeValidationException(String msg, Throwable why) { + super(msg, why); + } } diff --git a/java/com/google/gerrit/server/git/validators/MergeValidators.java b/java/com/google/gerrit/server/git/validators/MergeValidators.java index 0422c51f1b..425ab3fcf7 100644 --- a/java/com/google/gerrit/server/git/validators/MergeValidators.java +++ b/java/com/google/gerrit/server/git/validators/MergeValidators.java @@ -177,7 +177,7 @@ public class MergeValidators { try { permissionBackend.user(caller).check(GlobalPermission.ADMINISTRATE_SERVER); } catch (AuthException e) { - throw new MergeValidationException(SET_BY_ADMIN); + throw new MergeValidationException(SET_BY_ADMIN, e); } catch (PermissionBackendException e) { logger.atWarning().withCause(e).log("Cannot check ADMINISTRATE_SERVER"); throw new MergeValidationException("validation unavailable"); @@ -189,7 +189,7 @@ public class MergeValidators { .project(destProject.getNameKey()) .check(ProjectPermission.WRITE_CONFIG); } catch (AuthException e) { - throw new MergeValidationException(SET_BY_OWNER); + throw new MergeValidationException(SET_BY_OWNER, e); } catch (PermissionBackendException e) { logger.atWarning().withCause(e).log("Cannot check WRITE_CONFIG"); throw new MergeValidationException("validation unavailable"); @@ -230,7 +230,7 @@ public class MergeValidators { } } } catch (ConfigInvalidException | IOException e) { - throw new MergeValidationException(INVALID_CONFIG); + throw new MergeValidationException(INVALID_CONFIG, e); } } } diff --git a/java/com/google/gerrit/server/git/validators/RefOperationValidators.java b/java/com/google/gerrit/server/git/validators/RefOperationValidators.java index acae533b7e..4eb317ced8 100644 --- a/java/com/google/gerrit/server/git/validators/RefOperationValidators.java +++ b/java/com/google/gerrit/server/git/validators/RefOperationValidators.java @@ -131,7 +131,7 @@ public class RefOperationValidators { try { perm.check(GlobalPermission.ACCESS_DATABASE); } catch (AuthException | PermissionBackendException e) { - throw new ValidationException("Not allowed to create user branch."); + throw new ValidationException("Not allowed to create user branch.", e); } if (Account.Id.fromRef(refEvent.command.getRefName()) == null) { throw new ValidationException( @@ -142,7 +142,7 @@ public class RefOperationValidators { try { perm.check(GlobalPermission.ACCESS_DATABASE); } catch (AuthException | PermissionBackendException e) { - throw new ValidationException("Not allowed to delete user branch."); + throw new ValidationException("Not allowed to delete user branch.", e); } } } diff --git a/java/com/google/gerrit/server/mail/send/ChangeEmail.java b/java/com/google/gerrit/server/mail/send/ChangeEmail.java index a1b20afc5c..a3000eb91a 100644 --- a/java/com/google/gerrit/server/mail/send/ChangeEmail.java +++ b/java/com/google/gerrit/server/mail/send/ChangeEmail.java @@ -299,7 +299,7 @@ public abstract class ChangeEmail extends NotificationEmail { args.patchSetUtil.get( changeData.db(), changeData.notes(), new PatchSet.Id(change.getId(), patchSetId)); } catch (OrmException e) { - throw new PatchListNotAvailableException("Failed to get patchSet"); + throw new PatchListNotAvailableException("Failed to get patchSet", e); } } return args.patchListCache.get(change, ps); diff --git a/java/com/google/gerrit/server/notedb/ChangeNotesParser.java b/java/com/google/gerrit/server/notedb/ChangeNotesParser.java index cbb7020207..98cbd02994 100644 --- a/java/com/google/gerrit/server/notedb/ChangeNotesParser.java +++ b/java/com/google/gerrit/server/notedb/ChangeNotesParser.java @@ -926,7 +926,9 @@ class ChangeNotesParser { try { adr = Address.parse(line); } catch (IllegalArgumentException e) { - throw invalidFooter(state.getByEmailFooterKey(), line); + ConfigInvalidException cie = invalidFooter(state.getByEmailFooterKey(), line); + cie.initCause(e); + throw cie; } if (!reviewersByEmail.containsRow(adr)) { reviewersByEmail.put(adr, state, ts); diff --git a/java/com/google/gerrit/server/patch/PatchScriptFactory.java b/java/com/google/gerrit/server/patch/PatchScriptFactory.java index b1e0e3cf68..bfcb3255b0 100644 --- a/java/com/google/gerrit/server/patch/PatchScriptFactory.java +++ b/java/com/google/gerrit/server/patch/PatchScriptFactory.java @@ -206,7 +206,7 @@ public class PatchScriptFactory implements Callable { try { permissionBackend.currentUser().change(notes).database(db).check(ChangePermission.READ); } catch (AuthException e) { - throw new NoSuchChangeException(changeId); + throw new NoSuchChangeException(changeId, e); } } diff --git a/java/com/google/gerrit/server/project/RefUtil.java b/java/com/google/gerrit/server/project/RefUtil.java index 4e08137a1c..a9c964dd51 100644 --- a/java/com/google/gerrit/server/project/RefUtil.java +++ b/java/com/google/gerrit/server/project/RefUtil.java @@ -55,7 +55,7 @@ public class RefUtil { "Cannot resolve \"%s\" in project \"%s\"", baseRevision, projectName.get()); throw new InvalidRevisionException(baseRevision); } catch (RevisionSyntaxException err) { - throw new InvalidRevisionException(baseRevision); + throw new InvalidRevisionException(baseRevision, err); } } @@ -66,7 +66,7 @@ public class RefUtil { try { rw.markStart(rw.parseCommit(revid)); } catch (IncorrectObjectTypeException err) { - throw new InvalidRevisionException(revid.name()); + throw new InvalidRevisionException(revid.name(), err); } RefDatabase refDb = repo.getRefDatabase(); Iterable refs = @@ -86,7 +86,7 @@ public class RefUtil { rw.checkConnectivity(); return rw; } catch (IncorrectObjectTypeException | MissingObjectException err) { - throw new InvalidRevisionException(revid.name()); + throw new InvalidRevisionException(revid.name(), err); } catch (IOException err) { logger.atSevere().withCause(err).log( "Repository \"%s\" may be corrupt; suggest running git fsck", repo.getDirectory()); @@ -128,5 +128,9 @@ public class RefUtil { InvalidRevisionException(@Nullable String invalidRevision) { super(MESSAGE + ": " + invalidRevision); } + + InvalidRevisionException(@Nullable String invalidRevision, Throwable why) { + super(MESSAGE + ": " + invalidRevision, why); + } } } diff --git a/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java b/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java index 148c63352b..feb9ccbe35 100644 --- a/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java +++ b/java/com/google/gerrit/server/query/account/AccountQueryBuilder.java @@ -132,7 +132,9 @@ public class AccountQueryBuilder extends QueryBuilder { .change(changeNotes) .check(ChangePermission.READ); } catch (AuthException e) { - throw error(String.format("change %s not found", change)); + String msg = String.format("change %s not found", change); + logger.atSevere().withCause(e).log(msg); + throw error(msg); } return AccountPredicates.cansee(args, changeNotes); diff --git a/java/com/google/gerrit/server/query/project/ProjectQueryBuilder.java b/java/com/google/gerrit/server/query/project/ProjectQueryBuilder.java index 4923015faa..57db5e7278 100644 --- a/java/com/google/gerrit/server/query/project/ProjectQueryBuilder.java +++ b/java/com/google/gerrit/server/query/project/ProjectQueryBuilder.java @@ -75,7 +75,7 @@ public class ProjectQueryBuilder extends QueryBuilder { try { parsedState = ProjectState.valueOf(state.replace('-', '_').toUpperCase()); } catch (IllegalArgumentException e) { - throw error("state operator must be either 'active' or 'read-only'"); + throw error("state operator must be either 'active' or 'read-only'", e); } if (parsedState == ProjectState.HIDDEN) { throw error("state operator must be either 'active' or 'read-only'"); diff --git a/java/com/google/gerrit/server/restapi/account/Capabilities.java b/java/com/google/gerrit/server/restapi/account/Capabilities.java index 07b12147dc..3d719ff93e 100644 --- a/java/com/google/gerrit/server/restapi/account/Capabilities.java +++ b/java/com/google/gerrit/server/restapi/account/Capabilities.java @@ -75,7 +75,7 @@ public class Capabilities implements ChildCollection { + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + private static final ImmutableMap CHANGE_TYPE = Maps.immutableEnumMap( new ImmutableMap.Builder() @@ -439,6 +442,7 @@ public class GetDiff implements RestReadView { throw new NumberFormatException(); } } catch (NumberFormatException e) { + logger.atFine().withCause(e).log("invalid numeric value"); throw new CmdLineException( owner, localizable("\"%s\" is not a valid value for \"%s\""), diff --git a/java/com/google/gerrit/server/restapi/change/PostReview.java b/java/com/google/gerrit/server/restapi/change/PostReview.java index 845f584578..4867dd290f 100644 --- a/java/com/google/gerrit/server/restapi/change/PostReview.java +++ b/java/com/google/gerrit/server/restapi/change/PostReview.java @@ -497,7 +497,8 @@ public class PostReview throw new AuthException( String.format( "not permitted to modify label \"%s\" on behalf of \"%s\"", - type.getName(), in.onBehalfOf)); + type.getName(), in.onBehalfOf), + e); } } } @@ -515,7 +516,7 @@ public class PostReview .check(ChangePermission.READ); } catch (AuthException e) { throw new UnprocessableEntityException( - String.format("on_behalf_of account %s cannot see change", reviewer.getAccountId())); + String.format("on_behalf_of account %s cannot see change", reviewer.getAccountId()), e); } return new RevisionResource( @@ -558,7 +559,7 @@ public class PostReview perm.check(new LabelPermission.WithValue(lt, val)); } catch (AuthException e) { throw new AuthException( - String.format("Applying label \"%s\": %d is restricted", lt.getName(), val)); + String.format("Applying label \"%s\": %d is restricted", lt.getName(), val), e); } } } diff --git a/java/com/google/gerrit/server/restapi/change/PreviewSubmit.java b/java/com/google/gerrit/server/restapi/change/PreviewSubmit.java index 18e86d1a1f..c0c434c087 100644 --- a/java/com/google/gerrit/server/restapi/change/PreviewSubmit.java +++ b/java/com/google/gerrit/server/restapi/change/PreviewSubmit.java @@ -180,7 +180,7 @@ public class PreviewSubmit implements RestReadView { archiveFormat.putEntry(aos, path, bos.toByteArray()); } } catch (LimitExceededException e) { - throw new NotImplementedException("The bundle is too big to generate at the server"); + throw new NotImplementedException("The bundle is too big to generate at the server", e); } catch (NoSuchProjectException e) { throw new IOException(e); } diff --git a/java/com/google/gerrit/server/restapi/change/PutAssignee.java b/java/com/google/gerrit/server/restapi/change/PutAssignee.java index 7878ce5fe9..d247d5ed75 100644 --- a/java/com/google/gerrit/server/restapi/change/PutAssignee.java +++ b/java/com/google/gerrit/server/restapi/change/PutAssignee.java @@ -100,7 +100,7 @@ public class PutAssignee extends RetryingRestModifyView, DynamicOpti try { out = query(); } catch (QueryRequiresAuthException e) { - throw new AuthException("Must be signed-in to use this operator"); + throw new AuthException("Must be signed-in to use this operator", e); } catch (QueryParseException e) { logger.atFine().withCause(e).log("Reject change query with 400 Bad Request: %s", queries); throw new BadRequestException(e.getMessage(), e); diff --git a/java/com/google/gerrit/server/restapi/change/Rebuild.java b/java/com/google/gerrit/server/restapi/change/Rebuild.java index dc390ccae3..ec17598789 100644 --- a/java/com/google/gerrit/server/restapi/change/Rebuild.java +++ b/java/com/google/gerrit/server/restapi/change/Rebuild.java @@ -103,7 +103,7 @@ public class Rebuild implements RestModifyView { try { rebuilder.rebuild(db.get(), rsrc.getId()); } catch (NoSuchChangeException e) { - throw new ResourceNotFoundException(IdString.fromDecoded(rsrc.getId().toString())); + throw new ResourceNotFoundException(IdString.fromDecoded(rsrc.getId().toString()), e); } } } diff --git a/java/com/google/gerrit/server/restapi/change/Submit.java b/java/com/google/gerrit/server/restapi/change/Submit.java index 7c1011744d..a775c9399f 100644 --- a/java/com/google/gerrit/server/restapi/change/Submit.java +++ b/java/com/google/gerrit/server/restapi/change/Submit.java @@ -218,7 +218,7 @@ public class Submit change = changeNotesFactory.createChecked(db, change.getProject(), change.getId()).getChange(); } catch (NoSuchChangeException e) { - throw new ResourceConflictException("change is deleted"); + throw new ResourceConflictException("change is deleted", e); } } @@ -473,7 +473,7 @@ public class Submit .check(ChangePermission.READ); } catch (AuthException e) { throw new UnprocessableEntityException( - String.format("on_behalf_of account %s cannot see change", submitter.getAccountId())); + String.format("on_behalf_of account %s cannot see change", submitter.getAccountId()), e); } return submitter; } diff --git a/java/com/google/gerrit/server/restapi/config/ConfirmEmail.java b/java/com/google/gerrit/server/restapi/config/ConfirmEmail.java index 5a1592f01f..d16a379005 100644 --- a/java/com/google/gerrit/server/restapi/config/ConfirmEmail.java +++ b/java/com/google/gerrit/server/restapi/config/ConfirmEmail.java @@ -78,7 +78,7 @@ public class ConfirmEmail implements RestModifyView { } throw new UnprocessableEntityException("invalid token"); } catch (EmailTokenVerifier.InvalidTokenException e) { - throw new UnprocessableEntityException("invalid token"); + throw new UnprocessableEntityException("invalid token", e); } catch (AccountException e) { throw new UnprocessableEntityException(e.getMessage()); } diff --git a/java/com/google/gerrit/server/restapi/config/TasksCollection.java b/java/com/google/gerrit/server/restapi/config/TasksCollection.java index dda54a0a62..9a7aa3a3dd 100644 --- a/java/com/google/gerrit/server/restapi/config/TasksCollection.java +++ b/java/com/google/gerrit/server/restapi/config/TasksCollection.java @@ -81,7 +81,7 @@ public class TasksCollection implements ChildCollection task = workQueue.getTask(taskId); diff --git a/java/com/google/gerrit/server/restapi/group/AddMembers.java b/java/com/google/gerrit/server/restapi/group/AddMembers.java index bdf1c74f04..52835180b2 100644 --- a/java/com/google/gerrit/server/restapi/group/AddMembers.java +++ b/java/com/google/gerrit/server/restapi/group/AddMembers.java @@ -138,7 +138,7 @@ public class AddMembers implements RestModifyView { try { addMembers(groupUuid, newMemberIds); } catch (NoSuchGroupException e) { - throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid)); + throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid), e); } return toAccountInfoList(newMemberIds); } @@ -235,7 +235,7 @@ public class AddMembers implements RestModifyView { } throw new IllegalStateException(); } catch (UnprocessableEntityException e) { - throw new ResourceNotFoundException(id); + throw new ResourceNotFoundException(id, e); } } } diff --git a/java/com/google/gerrit/server/restapi/group/AddSubgroups.java b/java/com/google/gerrit/server/restapi/group/AddSubgroups.java index 9782ad3ecf..02c4a290c2 100644 --- a/java/com/google/gerrit/server/restapi/group/AddSubgroups.java +++ b/java/com/google/gerrit/server/restapi/group/AddSubgroups.java @@ -117,7 +117,7 @@ public class AddSubgroups implements RestModifyView { try { addSubgroups(groupUuid, subgroupUuids); } catch (NoSuchGroupException e) { - throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid)); + throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid), e); } return result; } @@ -155,7 +155,7 @@ public class AddSubgroups implements RestModifyView { } throw new IllegalStateException(); } catch (UnprocessableEntityException e) { - throw new ResourceNotFoundException(id); + throw new ResourceNotFoundException(id, e); } } } diff --git a/java/com/google/gerrit/server/restapi/group/CreateGroup.java b/java/com/google/gerrit/server/restapi/group/CreateGroup.java index 05721146b2..4a2375b6bc 100644 --- a/java/com/google/gerrit/server/restapi/group/CreateGroup.java +++ b/java/com/google/gerrit/server/restapi/group/CreateGroup.java @@ -220,7 +220,7 @@ public class CreateGroup return groupsUpdateProvider.get().createGroup(groupCreation, groupUpdateBuilder.build()); } catch (OrmDuplicateKeyException e) { throw new ResourceConflictException( - "group '" + createGroupArgs.getGroupName() + "' already exists"); + "group '" + createGroupArgs.getGroupName() + "' already exists", e); } } } diff --git a/java/com/google/gerrit/server/restapi/group/DeleteMembers.java b/java/com/google/gerrit/server/restapi/group/DeleteMembers.java index d197cb844b..82dc7d9ac7 100644 --- a/java/com/google/gerrit/server/restapi/group/DeleteMembers.java +++ b/java/com/google/gerrit/server/restapi/group/DeleteMembers.java @@ -76,7 +76,7 @@ public class DeleteMembers implements RestModifyView { try { removeGroupMembers(groupUuid, membersToRemove); } catch (NoSuchGroupException e) { - throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid)); + throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid), e); } return Response.none(); diff --git a/java/com/google/gerrit/server/restapi/group/DeleteSubgroups.java b/java/com/google/gerrit/server/restapi/group/DeleteSubgroups.java index c486af402f..307f874a72 100644 --- a/java/com/google/gerrit/server/restapi/group/DeleteSubgroups.java +++ b/java/com/google/gerrit/server/restapi/group/DeleteSubgroups.java @@ -78,7 +78,7 @@ public class DeleteSubgroups implements RestModifyView { try { removeSubgroups(groupUuid, subgroupsToRemove); } catch (NoSuchGroupException e) { - throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid)); + throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid), e); } return Response.none(); diff --git a/java/com/google/gerrit/server/restapi/group/GetOwner.java b/java/com/google/gerrit/server/restapi/group/GetOwner.java index 0906ce6b7f..6a97d01c15 100644 --- a/java/com/google/gerrit/server/restapi/group/GetOwner.java +++ b/java/com/google/gerrit/server/restapi/group/GetOwner.java @@ -48,7 +48,7 @@ public class GetOwner implements RestReadView { GroupControl c = controlFactory.validateFor(group.getOwnerGroupUUID()); return json.format(c.getGroup()); } catch (NoSuchGroupException e) { - throw new ResourceNotFoundException(); + throw new ResourceNotFoundException(group.getOwnerGroupUUID().get(), e); } } } diff --git a/java/com/google/gerrit/server/restapi/group/PutDescription.java b/java/com/google/gerrit/server/restapi/group/PutDescription.java index d407f69d17..9ce180f4c3 100644 --- a/java/com/google/gerrit/server/restapi/group/PutDescription.java +++ b/java/com/google/gerrit/server/restapi/group/PutDescription.java @@ -67,7 +67,7 @@ public class PutDescription implements RestModifyView { try { groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate); } catch (NoSuchGroupException e) { - throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid)); + throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid), e); } catch (OrmDuplicateKeyException e) { - throw new ResourceConflictException("group with name " + newName + " already exists"); + throw new ResourceConflictException("group with name " + newName + " already exists", e); } } } diff --git a/java/com/google/gerrit/server/restapi/group/PutOptions.java b/java/com/google/gerrit/server/restapi/group/PutOptions.java index 29b87d2015..8698ee6da3 100644 --- a/java/com/google/gerrit/server/restapi/group/PutOptions.java +++ b/java/com/google/gerrit/server/restapi/group/PutOptions.java @@ -66,7 +66,7 @@ public class PutOptions implements RestModifyView { try { groupsUpdateProvider.get().updateGroup(groupUuid, groupUpdate); } catch (NoSuchGroupException e) { - throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid)); + throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid), e); } } return json.format(owner); diff --git a/java/com/google/gerrit/server/restapi/project/BranchesCollection.java b/java/com/google/gerrit/server/restapi/project/BranchesCollection.java index 2b7e08960d..5fbb4f8b35 100644 --- a/java/com/google/gerrit/server/restapi/project/BranchesCollection.java +++ b/java/com/google/gerrit/server/restapi/project/BranchesCollection.java @@ -82,9 +82,9 @@ public class BranchesCollection implements ChildCollection { } catch (ConfigInvalidException e) { throw new ResourceConflictException(e.getMessage()); } catch (RepositoryNotFoundException e) { - throw new ResourceNotFoundException(rsrc.getName()); + throw new ResourceNotFoundException(rsrc.getName(), e); } // The following implementation must match the ProjectAccessFactory JSON RPC endpoint. diff --git a/java/com/google/gerrit/server/restapi/project/GetHead.java b/java/com/google/gerrit/server/restapi/project/GetHead.java index bc267c8525..043991fc59 100644 --- a/java/com/google/gerrit/server/restapi/project/GetHead.java +++ b/java/com/google/gerrit/server/restapi/project/GetHead.java @@ -81,13 +81,13 @@ public class GetHead implements RestReadView { .project(rsrc.getNameKey()) .check(ProjectPermission.WRITE_CONFIG); } catch (AuthException ae) { - throw new AuthException("not allowed to see HEAD"); + throw new AuthException("not allowed to see HEAD", ae); } } } throw new ResourceNotFoundException(Constants.HEAD); } catch (RepositoryNotFoundException e) { - throw new ResourceNotFoundException(rsrc.getName()); + throw new ResourceNotFoundException(rsrc.getName(), e); } } } diff --git a/java/com/google/gerrit/server/restapi/project/GetReflog.java b/java/com/google/gerrit/server/restapi/project/GetReflog.java index 4b9a489d81..a690042186 100644 --- a/java/com/google/gerrit/server/restapi/project/GetReflog.java +++ b/java/com/google/gerrit/server/restapi/project/GetReflog.java @@ -103,7 +103,7 @@ public class GetReflog implements RestReadView { } catch (UnsupportedOperationException e) { String msg = "reflog not supported on repo " + rsrc.getNameKey().get(); logger.atSevere().log(msg); - throw new MethodNotAllowedException(msg); + throw new MethodNotAllowedException(msg, e); } if (r == null) { throw new ResourceNotFoundException(rsrc.getRef()); diff --git a/java/com/google/gerrit/server/restapi/project/GetStatistics.java b/java/com/google/gerrit/server/restapi/project/GetStatistics.java index 048c018b9f..a40806227e 100644 --- a/java/com/google/gerrit/server/restapi/project/GetStatistics.java +++ b/java/com/google/gerrit/server/restapi/project/GetStatistics.java @@ -50,7 +50,7 @@ public class GetStatistics implements RestReadView { } catch (GitAPIException | JGitInternalException e) { throw new ResourceConflictException(e.getMessage()); } catch (IOException e) { - throw new ResourceNotFoundException(rsrc.getName()); + throw new ResourceNotFoundException(rsrc.getName(), e); } } } diff --git a/java/com/google/gerrit/server/restapi/project/ListBranches.java b/java/com/google/gerrit/server/restapi/project/ListBranches.java index a0d2528ed0..ae9ef28d2b 100644 --- a/java/com/google/gerrit/server/restapi/project/ListBranches.java +++ b/java/com/google/gerrit/server/restapi/project/ListBranches.java @@ -147,7 +147,7 @@ public class ListBranches implements RestReadView { } return toBranchInfo(rsrc, ImmutableList.of(r)).get(0); } catch (RepositoryNotFoundException noRepo) { - throw new ResourceNotFoundException(); + throw new ResourceNotFoundException(rsrc.getNameKey().get(), noRepo); } } @@ -163,7 +163,7 @@ public class ListBranches implements RestReadView { .exactRef(Constants.HEAD, RefNames.REFS_CONFIG, RefNames.REFS_USERS_DEFAULT) .values()); } catch (RepositoryNotFoundException noGitRepository) { - throw new ResourceNotFoundException(); + throw new ResourceNotFoundException(rsrc.getNameKey().get(), noGitRepository); } return toBranchInfo(rsrc, refs); } diff --git a/java/com/google/gerrit/server/restapi/project/ListDashboards.java b/java/com/google/gerrit/server/restapi/project/ListDashboards.java index 3808a2f798..fd8668ad10 100644 --- a/java/com/google/gerrit/server/restapi/project/ListDashboards.java +++ b/java/com/google/gerrit/server/restapi/project/ListDashboards.java @@ -119,7 +119,7 @@ public class ListDashboards implements RestReadView { } return all; } catch (RepositoryNotFoundException e) { - throw new ResourceNotFoundException(); + throw new ResourceNotFoundException(project, e); } } diff --git a/java/com/google/gerrit/server/restapi/project/ListTags.java b/java/com/google/gerrit/server/restapi/project/ListTags.java index f59e98421c..5fbfcf6f83 100644 --- a/java/com/google/gerrit/server/restapi/project/ListTags.java +++ b/java/com/google/gerrit/server/restapi/project/ListTags.java @@ -217,7 +217,7 @@ public class ListTags implements RestReadView { try { return repoManager.openRepository(project); } catch (RepositoryNotFoundException noGitRepository) { - throw new ResourceNotFoundException(); + throw new ResourceNotFoundException(project.get(), noGitRepository); } } diff --git a/java/com/google/gerrit/server/restapi/project/PutConfig.java b/java/com/google/gerrit/server/restapi/project/PutConfig.java index 76ea0c9125..e0b443b211 100644 --- a/java/com/google/gerrit/server/restapi/project/PutConfig.java +++ b/java/com/google/gerrit/server/restapi/project/PutConfig.java @@ -175,7 +175,7 @@ public class PutConfig implements RestModifyView { uiActions, views); } catch (RepositoryNotFoundException notFound) { - throw new ResourceNotFoundException(projectName.get()); + throw new ResourceNotFoundException(projectName.get(), notFound); } catch (ConfigInvalidException err) { throw new ResourceConflictException("Cannot read project " + projectName, err); } catch (IOException err) { diff --git a/java/com/google/gerrit/server/restapi/project/PutDescription.java b/java/com/google/gerrit/server/restapi/project/PutDescription.java index 039b65bc6d..f3366e5324 100644 --- a/java/com/google/gerrit/server/restapi/project/PutDescription.java +++ b/java/com/google/gerrit/server/restapi/project/PutDescription.java @@ -89,7 +89,7 @@ public class PutDescription implements RestModifyViewnone() : Response.ok(project.getDescription()); } catch (RepositoryNotFoundException notFound) { - throw new ResourceNotFoundException(resource.getName()); + throw new ResourceNotFoundException(resource.getName(), notFound); } catch (ConfigInvalidException e) { throw new ResourceConflictException( String.format("invalid project.config: %s", e.getMessage())); diff --git a/java/com/google/gerrit/server/restapi/project/SetAccess.java b/java/com/google/gerrit/server/restapi/project/SetAccess.java index c9d69a5141..4cefa4bddb 100644 --- a/java/com/google/gerrit/server/restapi/project/SetAccess.java +++ b/java/com/google/gerrit/server/restapi/project/SetAccess.java @@ -134,7 +134,7 @@ public class SetAccess implements RestModifyView { } return ref; } catch (RepositoryNotFoundException e) { - throw new ResourceNotFoundException(rsrc.getName()); + throw new ResourceNotFoundException(rsrc.getName(), e); } } diff --git a/java/com/google/gerrit/server/restapi/project/SetParent.java b/java/com/google/gerrit/server/restapi/project/SetParent.java index 61d5622492..134a74e575 100644 --- a/java/com/google/gerrit/server/restapi/project/SetParent.java +++ b/java/com/google/gerrit/server/restapi/project/SetParent.java @@ -117,7 +117,7 @@ public class SetParent requireNonNull(parent); return parent.get(); } catch (RepositoryNotFoundException notFound) { - throw new ResourceNotFoundException(rsrc.getName()); + throw new ResourceNotFoundException(rsrc.getName(), notFound); } catch (ConfigInvalidException e) { throw new ResourceConflictException( String.format("invalid project.config: %s", e.getMessage())); diff --git a/java/com/google/gerrit/server/rules/StoredValues.java b/java/com/google/gerrit/server/rules/StoredValues.java index 8b9cfe3fdb..ed70629937 100644 --- a/java/com/google/gerrit/server/rules/StoredValues.java +++ b/java/com/google/gerrit/server/rules/StoredValues.java @@ -59,7 +59,8 @@ public final class StoredValues { try { return cd.change(); } catch (OrmException e) { - throw new SystemException("Cannot load change " + cd.getId()); + throw new SystemException( + String.format("Cannot load change %s: %s", cd.getId(), e.getMessage())); } } @@ -104,7 +105,7 @@ public final class StoredValues { try { patchList = plCache.get(plKey, project); } catch (PatchListNotAvailableException e) { - throw new SystemException("Cannot create " + plKey); + throw new SystemException(String.format("Cannot create %s: %s", plKey, e.getMessage())); } return patchList; } diff --git a/java/com/google/gerrit/server/schema/Schema_106.java b/java/com/google/gerrit/server/schema/Schema_106.java index 5bb3669a14..7b6a30a8b2 100644 --- a/java/com/google/gerrit/server/schema/Schema_106.java +++ b/java/com/google/gerrit/server/schema/Schema_106.java @@ -152,7 +152,8 @@ public class Schema_106 extends SchemaVersion { throw new IOException( String.format( "ERROR: Failed to create reflog file for the %s branch in repository %s", - RefNames.REFS_CONFIG, project.get())); + RefNames.REFS_CONFIG, project.get()), + e); } } } diff --git a/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java b/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java index cf3a44e0d8..1ec7ca853a 100644 --- a/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java +++ b/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java @@ -161,7 +161,8 @@ public class RebaseSubmitStrategy extends SubmitStrategy { } catch (MergeConflictException mce) { // Unlike in Cherry-pick case, this should never happen. toMerge.setStatusCode(CommitMergeStatus.REBASE_MERGE_CONFLICT); - throw new IllegalStateException("MergeConflictException on message edit must not happen"); + throw new IllegalStateException( + "MergeConflictException on message edit must not happen", mce); } catch (MergeIdenticalTreeException mie) { // this should not happen toMerge.setStatusCode(SKIPPED_IDENTICAL_TREE); diff --git a/java/com/google/gerrit/server/submit/SubmitStrategyOp.java b/java/com/google/gerrit/server/submit/SubmitStrategyOp.java index 8a4fbfbe5c..303c95666b 100644 --- a/java/com/google/gerrit/server/submit/SubmitStrategyOp.java +++ b/java/com/google/gerrit/server/submit/SubmitStrategyOp.java @@ -590,7 +590,7 @@ abstract class SubmitStrategyOp implements BatchUpdateOp { return args.submoduleOp.composeGitlinksCommit(args.destBranch, commit); } catch (SubmoduleException | IOException e) { throw new IntegrationException( - "cannot update gitlink for the commit at branch: " + args.destBranch); + "cannot update gitlink for the commit at branch: " + args.destBranch, e); } } } diff --git a/java/com/google/gerrit/server/util/SocketUtil.java b/java/com/google/gerrit/server/util/SocketUtil.java index afa2aee683..e617650a63 100644 --- a/java/com/google/gerrit/server/util/SocketUtil.java +++ b/java/com/google/gerrit/server/util/SocketUtil.java @@ -96,7 +96,7 @@ public final class SocketUtil { try { port = Integer.parseInt(portStr); } catch (NumberFormatException e) { - throw new IllegalArgumentException("invalid port: " + desc); + throw new IllegalArgumentException("invalid port: " + desc, e); } } else { port = defaultPort; diff --git a/java/com/google/gerrit/sshd/BaseCommand.java b/java/com/google/gerrit/sshd/BaseCommand.java index 2081967b50..472f1c7218 100644 --- a/java/com/google/gerrit/sshd/BaseCommand.java +++ b/java/com/google/gerrit/sshd/BaseCommand.java @@ -385,6 +385,10 @@ public abstract class BaseCommand implements Command { return new UnloggedFailure(1, "fatal: " + msg); } + protected UnloggedFailure die(String msg, Throwable why) { + return new UnloggedFailure(1, "fatal: " + msg, why); + } + protected UnloggedFailure die(Throwable why) { return new UnloggedFailure(1, "fatal: " + why.getMessage(), why); } diff --git a/java/com/google/gerrit/sshd/ChangeArgumentParser.java b/java/com/google/gerrit/sshd/ChangeArgumentParser.java index 692884ec65..ce3b8a9e3f 100644 --- a/java/com/google/gerrit/sshd/ChangeArgumentParser.java +++ b/java/com/google/gerrit/sshd/ChangeArgumentParser.java @@ -116,7 +116,7 @@ public class ChangeArgumentParser { try { changeResource = changesCollection.parse(cId); } catch (RestApiException e) { - throw new UnloggedFailure(1, "\"" + id + "\" no such change"); + throw new UnloggedFailure(1, "\"" + id + "\" no such change", e); } changes.put(cId, changeResource); } diff --git a/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java b/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java index d89f9e0c2e..e2fbdcb2af 100644 --- a/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java +++ b/java/com/google/gerrit/sshd/SshKeyCreatorImpl.java @@ -34,11 +34,10 @@ public class SshKeyCreatorImpl implements SshKeyCreator { SshUtil.parse(key); return key; } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { - throw new InvalidSshKeyException(); - + throw new InvalidSshKeyException(e); } catch (NoSuchProviderException e) { logger.atSevere().withCause(e).log("Cannot parse SSH key"); - throw new InvalidSshKeyException(); + throw new InvalidSshKeyException(e); } } } diff --git a/java/com/google/gerrit/sshd/SuExec.java b/java/com/google/gerrit/sshd/SuExec.java index 7053a0d5f4..6d0bf2bc3f 100644 --- a/java/com/google/gerrit/sshd/SuExec.java +++ b/java/com/google/gerrit/sshd/SuExec.java @@ -126,9 +126,9 @@ public final class SuExec extends BaseCommand { try { permissionBackend.user(caller).check(GlobalPermission.RUN_AS); } catch (AuthException e) { - throw die("suexec not permitted"); + throw die("suexec not permitted", e); } catch (PermissionBackendException e) { - throw die("suexec not available: " + e); + throw die("suexec not available", e); } } } diff --git a/java/com/google/gerrit/sshd/commands/LsUserRefs.java b/java/com/google/gerrit/sshd/commands/LsUserRefs.java index 856c8a5545..f68e34c9de 100644 --- a/java/com/google/gerrit/sshd/commands/LsUserRefs.java +++ b/java/com/google/gerrit/sshd/commands/LsUserRefs.java @@ -105,9 +105,9 @@ public class LsUserRefs extends SshCommand { throw new Failure(1, "fatal: Error reading refs: '" + projectName, e); } } catch (RepositoryNotFoundException e) { - throw die("'" + projectName + "': not a git archive"); + throw die("'" + projectName + "': not a git archive", e); } catch (IOException | OrmException e) { - throw die("Error opening: '" + projectName); + throw die("Error opening: '" + projectName, e); } } } diff --git a/java/com/google/gerrit/sshd/commands/PatchSetParser.java b/java/com/google/gerrit/sshd/commands/PatchSetParser.java index 8dee69ee02..2dd035c937 100644 --- a/java/com/google/gerrit/sshd/commands/PatchSetParser.java +++ b/java/com/google/gerrit/sshd/commands/PatchSetParser.java @@ -104,7 +104,7 @@ public class PatchSetParser { try { patchSetId = PatchSet.Id.parse(token); } catch (IllegalArgumentException e) { - throw error("\"" + token + "\" is not a valid patch set"); + throw error("\"" + token + "\" is not a valid patch set", e); } ChangeNotes notes = getNotes(projectState, patchSetId.getParentKey()); PatchSet patchSet = psUtil.get(db.get(), notes, patchSetId); @@ -135,7 +135,7 @@ public class PatchSetParser { ChangeNotes notes = changeFinder.findOne(changeId); return notesFactory.create(db.get(), notes.getProjectName(), changeId); } catch (NoSuchChangeException e) { - throw error("\"" + changeId + "\" no such change"); + throw error("\"" + changeId + "\" no such change", e); } } @@ -158,4 +158,8 @@ public class PatchSetParser { public static UnloggedFailure error(String msg) { return new UnloggedFailure(1, msg); } + + public static UnloggedFailure error(String msg, Throwable why) { + return new UnloggedFailure(1, msg, why); + } } diff --git a/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java b/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java index 8b045ec838..cfb47f7d0c 100644 --- a/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java +++ b/java/com/google/gerrit/sshd/commands/PluginInstallCommand.java @@ -70,21 +70,21 @@ final class PluginInstallCommand extends PluginAdminSshCommand { try { data = Files.newInputStream(new File(source).toPath()); } catch (IOException e) { - throw die("cannot read " + source); + throw die("cannot read " + source, e); } } else { try { data = new URL(source).openStream(); } catch (MalformedURLException e) { - throw die("invalid url " + source); + throw die("invalid url " + source, e); } catch (IOException e) { - throw die("cannot read " + source); + throw die("cannot read " + source, e); } } try { loader.installPluginFromStream(name, data); } catch (IOException e) { - throw die("cannot install plugin"); + throw die("cannot install plugin", e); } catch (PluginInstallException e) { e.printStackTrace(stderr); String msg = String.format("Plugin failed to install. Cause: %s", e.getMessage()); diff --git a/java/com/google/gerrit/sshd/commands/Receive.java b/java/com/google/gerrit/sshd/commands/Receive.java index fa0e37b247..53a9ca252b 100644 --- a/java/com/google/gerrit/sshd/commands/Receive.java +++ b/java/com/google/gerrit/sshd/commands/Receive.java @@ -83,7 +83,7 @@ final class Receive extends AbstractGitCommand { .project(project.getNameKey()) .check(ProjectPermission.RUN_RECEIVE_PACK); } catch (AuthException e) { - throw new Failure(1, "fatal: receive-pack not permitted on this server"); + throw new Failure(1, "fatal: receive-pack not permitted on this server", e); } catch (PermissionBackendException e) { throw new Failure(1, "fatal: unable to check permissions " + e); } diff --git a/java/com/google/gerrit/sshd/commands/ReviewCommand.java b/java/com/google/gerrit/sshd/commands/ReviewCommand.java index bc8ef2af28..786048fc03 100644 --- a/java/com/google/gerrit/sshd/commands/ReviewCommand.java +++ b/java/com/google/gerrit/sshd/commands/ReviewCommand.java @@ -322,7 +322,7 @@ public class ReviewCommand extends SshCommand { try { allProjectsState = projectCache.checkedGet(allProjects); } catch (IOException e) { - throw die("missing " + allProjects.get()); + throw die("missing " + allProjects.get(), e); } for (LabelType type : allProjectsState.getLabelTypes().getLabelTypes()) { diff --git a/java/com/google/gerrit/sshd/commands/Upload.java b/java/com/google/gerrit/sshd/commands/Upload.java index 24a6975867..6b5dd7533d 100644 --- a/java/com/google/gerrit/sshd/commands/Upload.java +++ b/java/com/google/gerrit/sshd/commands/Upload.java @@ -55,9 +55,9 @@ final class Upload extends AbstractGitCommand { perm.check(ProjectPermission.RUN_UPLOAD_PACK); } catch (AuthException e) { - throw new Failure(1, "fatal: upload-pack not permitted on this server"); + throw new Failure(1, "fatal: upload-pack not permitted on this server", e); } catch (PermissionBackendException e) { - throw new Failure(1, "fatal: unable to check permissions " + e); + throw new Failure(1, "fatal: unable to check permissions ", e); } final UploadPack up = new UploadPack(repo); diff --git a/tools/BUILD b/tools/BUILD index 961af1e163..b66a1a88b1 100644 --- a/tools/BUILD +++ b/tools/BUILD @@ -83,6 +83,7 @@ java_package_configuration( "-Xep:TypeParameterUnusedInFormals:WARN", "-Xep:URLEqualsHashCode:WARN", "-Xep:UnsynchronizedOverridesSynchronized:WARN", + "-Xep:UnusedException:ERROR", "-Xep:WaitNotInLoop:WARN", ], packages = ["error_prone_packages"],