blob: 407784e32f7889e8c4b4a521183310110cb9f733 [file] [log] [blame]
// Copyright 2011 Google Inc. All Rights Reserved.
package com.google.gerrit.httpd;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryParseException;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gerrit.server.query.change.ChangeDataSource;
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gerrit.server.query.change.ChangeQueryRewriter;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.HashSet;
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 ChangeQueryBuilder.Factory queryBuilder;
private final Provider<ChangeQueryRewriter> queryRewriter;
private final Provider<CurrentUser> currentUser;
@Inject
DirectChangeByCommit(ChangeQueryBuilder.Factory queryBuilder,
Provider<ChangeQueryRewriter> queryRewriter,
Provider<CurrentUser> currentUser) {
this.queryBuilder = queryBuilder;
this.queryRewriter = queryRewriter;
this.currentUser = currentUser;
}
@SuppressWarnings("unchecked")
@Override
protected void doGet(final HttpServletRequest req,
final HttpServletResponse rsp) throws IOException {
String query = req.getPathInfo();
HashSet<Change.Id> ids = new HashSet<Change.Id>();
try {
ChangeQueryBuilder builder = queryBuilder.create(currentUser.get());
Predicate<ChangeData> visibleToMe = builder.is_visible();
Predicate<ChangeData> q = builder.parse(query);
q = Predicate.and(q, builder.sortkey_before("z"), builder.limit(2), visibleToMe);
ChangeQueryRewriter rewriter = queryRewriter.get();
Predicate<ChangeData> s = rewriter.rewrite(q);
if (!(s instanceof ChangeDataSource)) {
s = rewriter.rewrite(Predicate.and(builder.status_open(), q));
}
if (s instanceof ChangeDataSource) {
for (ChangeData d : ((ChangeDataSource) s).read()) {
ids.add(d.getId());
}
}
} catch (QueryParseException e) {
log.warn("Received invalid query by URL: /r/" + query, e);
} catch (OrmException e) {
log.warn("Cannot process query by URL: /r/" + query, e);
}
String token;
if (ids.size() == 1) {
// If exactly one change matches, link to that change.
// TODO Link to a specific patch set, if one matched.
token = PageLinks.toChange(ids.iterator().next());
} else {
// Otherwise, link to the query page.
token = PageLinks.toChangeQuery(query);
}
UrlModule.toGerrit(token, req, rsp);
}
}