Make query parser and rewriter request scoped

Because these need access to the CurrentUser in order to implement
the is:starred or is:visible operators they need to be request scope
and obtained on demand.

Change-Id: Id9f677744c6201176455b15320b8ce45edd75504
Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
Shawn O. Pearce
2010-07-19 07:15:49 -07:00
parent 6ef732fd3b
commit 516f6d0180
4 changed files with 19 additions and 10 deletions

View File

@@ -89,16 +89,16 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements
private final ChangeControl.Factory changeControlFactory;
private final AccountInfoCacheFactory.Factory accountInfoCacheFactory;
private final ChangeQueryBuilder queryBuilder;
private final ChangeQueryRewriter queryRewriter;
private final Provider<ChangeQueryBuilder> queryBuilder;
private final Provider<ChangeQueryRewriter> queryRewriter;
@Inject
ChangeListServiceImpl(final Provider<ReviewDb> schema,
final Provider<CurrentUser> currentUser,
final ChangeControl.Factory changeControlFactory,
final AccountInfoCacheFactory.Factory accountInfoCacheFactory,
final ChangeQueryBuilder queryBuilder,
final ChangeQueryRewriter queryRewriter) {
final Provider<ChangeQueryBuilder> queryBuilder,
final Provider<ChangeQueryRewriter> queryRewriter) {
super(schema, currentUser);
this.currentUser = currentUser;
this.changeControlFactory = changeControlFactory;
@@ -144,18 +144,19 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements
final int limit, final String key, final Comparator<Change> cmp)
throws OrmException, InvalidQueryException {
try {
final ChangeQueryBuilder builder = queryBuilder.get();
final Predicate<ChangeData> visibleToMe =
queryBuilder.visibleto(currentUser.get());
builder.visibleto(currentUser.get());
Predicate<ChangeData> q = queryBuilder.parse(query);
Predicate<ChangeData> q = builder.parse(query);
q = Predicate.and(q, //
cmp == QUERY_PREV //
? queryBuilder.sortkey_after(key) //
: queryBuilder.sortkey_before(key), //
queryBuilder.limit(limit), //
? builder.sortkey_after(key) //
: builder.sortkey_before(key), //
builder.limit(limit), //
visibleToMe //
);
q = queryRewriter.rewrite(q);
q = queryRewriter.get().rewrite(q);
if (q instanceof ChangeDataSource) {
ChangeDataSource ds = (ChangeDataSource) q;
ArrayList<Change> r = new ArrayList();

View File

@@ -28,6 +28,8 @@ import com.google.gerrit.server.mail.ReplacePatchSetSender;
import com.google.gerrit.server.patch.PublishComments;
import com.google.gerrit.server.project.ChangeControl;
import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.server.query.change.ChangeQueryBuilder;
import com.google.gerrit.server.query.change.ChangeQueryRewriter;
import com.google.inject.servlet.RequestScoped;
/** Bindings for {@link RequestScoped} entities. */
@@ -39,6 +41,8 @@ public class GerritRequestModule extends FactoryModule {
RequestScoped.class);
bind(IdentifiedUser.RequestFactory.class).in(SINGLETON);
bind(AccountResolver.class);
bind(ChangeQueryBuilder.class);
bind(ChangeQueryRewriter.class);
bind(ChangeControl.Factory.class).in(SINGLETON);
bind(GroupControl.Factory.class).in(SINGLETON);

View File

@@ -35,6 +35,7 @@ import com.google.gerrit.server.query.QueryParseException;
import com.google.gwtorm.client.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.servlet.RequestScoped;
import org.eclipse.jgit.lib.AbbreviatedObjectId;
@@ -45,6 +46,7 @@ import java.util.regex.Pattern;
/**
* Parses a query string meant to be applied to change objects.
*/
@RequestScoped
public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
private static final Pattern PAT_LEGACY_ID = Pattern.compile("^[1-9][0-9]*$");
private static final Pattern PAT_CHANGE_ID =

View File

@@ -28,9 +28,11 @@ import com.google.inject.Inject;
import com.google.inject.OutOfScopeException;
import com.google.inject.Provider;
import com.google.inject.name.Named;
import com.google.inject.servlet.RequestScoped;
import java.util.Collection;
@RequestScoped
public class ChangeQueryRewriter extends QueryRewriter<ChangeData> {
private static final QueryRewriter.Definition<ChangeData, ChangeQueryRewriter> mydef =
new QueryRewriter.Definition<ChangeData, ChangeQueryRewriter>(