blob: 74dc56f7efa8b17688b538e5ce766facf88b86c0 [file] [log] [blame]
// Copyright 2011 Google Inc. All Rights Reserved.
package com.google.gerrit.httpd;
import com.google.common.base.CharMatcher;
import com.google.common.collect.ImmutableList;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.extensions.api.changes.Changes;
import com.google.gerrit.extensions.common.ChangeInfo;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Change;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Singleton
class DirectChangeByCommit extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger log =
LoggerFactory.getLogger(DirectChangeByCommit.class);
private final Changes changes;
@Inject
DirectChangeByCommit(Changes changes) {
this.changes = changes;
}
@Override
protected void doGet(final HttpServletRequest req,
final HttpServletResponse rsp) throws IOException {
String query = CharMatcher.is('/').trimTrailingFrom(req.getPathInfo());
List<ChangeInfo> results;
try {
results = changes.query(query).withLimit(2).get();
} catch (RestApiException e) {
log.warn("Cannot process query by URL: /r/" + query, e);
results = ImmutableList.of();
}
String token;
if (results.size() == 1) {
// If exactly one change matches, link to that change.
// TODO Link to a specific patch set, if one matched.
token = PageLinks.toChange(
new Change.Id(results.iterator().next()._number));
} else {
// Otherwise, link to the query page.
token = PageLinks.toChangeQuery(query);
}
UrlModule.toGerrit(token, req, rsp);
}
}