From 33cc5a90535fe47acb5c31d9b3ff0fa7b17f3db4 Mon Sep 17 00:00:00 2001 From: Edwin Kempin Date: Thu, 24 Jun 2010 13:58:12 +0200 Subject: [PATCH] Filter the list of open changes by watched projects Users are normally not interested in all projects that are hosted in Gerrit, but only in some of them. If a user is interested in a project he normally adds this project to the watch list, so that he can get e-mail notification if something changes. This change provides a new screen in Gerrit that shows all open changes for only watched projects. For the user this means to have one list that shows all open changes that are relevant for him and that he potentially wants to review. The new screen is available under 'My -> Watched Changes'. Change-Id: I8814d9ce106fdf7ef4312ae7ec3ba670f6678dd2 Signed-off-by: Edwin Kempin --- .../com/google/gerrit/common/PageLinks.java | 4 +- .../gerrit/common/data/ChangeListService.java | 8 +++ .../com/google/gerrit/client/Dispatcher.java | 7 +++ .../java/com/google/gerrit/client/Gerrit.java | 1 + .../google/gerrit/client/GerritConstants.java | 2 + .../gerrit/client/GerritConstants.properties | 2 + .../com/google/gerrit/client/JumpKeys.java | 6 +++ .../changes/AllAbandonedChangesScreen.java | 2 +- .../changes/AllMergedChangesScreen.java | 2 +- .../client/changes/AllOpenChangesScreen.java | 2 +- .../ByProjectAbandonedChangesScreen.java | 2 +- .../changes/ByProjectMergedChangesScreen.java | 2 +- .../changes/ByProjectOpenChangesScreen.java | 2 +- .../client/changes/ChangeConstants.java | 1 + .../client/changes/ChangeConstants.properties | 1 + .../changes/ChangeQueryResultsScreen.java | 2 +- .../changes/MineWatchedOpenChangesScreen.java | 41 ++++++++++++++++ ...Screen.java => PagedSingleListScreen.java} | 4 +- .../com/google/gerrit/httpd/UrlModule.java | 1 + .../httpd/rpc/ChangeListServiceImpl.java | 49 ++++++++++++++++++- .../google/gerrit/server/AnonymousUser.java | 6 +++ .../com/google/gerrit/server/CurrentUser.java | 4 ++ .../google/gerrit/server/IdentifiedUser.java | 25 ++++++++++ .../google/gerrit/server/PeerDaemonUser.java | 6 +++ .../google/gerrit/server/ReplicationUser.java | 6 +++ 25 files changed, 176 insertions(+), 12 deletions(-) create mode 100644 gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/MineWatchedOpenChangesScreen.java rename gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/{AllSingleListScreen.java => PagedSingleListScreen.java} (97%) diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java b/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java index 5a85ef5560..33295bca13 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/PageLinks.java @@ -33,11 +33,13 @@ public class PageLinks { public static final String SETTINGS_NEW_AGREEMENT = "settings,new-agreement"; public static final String REGISTER = "register"; + public static final String TOP = "n,z"; + public static final String MINE = "mine"; public static final String MINE_STARRED = "mine,starred"; public static final String MINE_DRAFTS = "mine,drafts"; + public static final String MINE_WATCHED = "mine,watched," + TOP; - public static final String TOP = "n,z"; public static final String ALL_ABANDONED = "all,abandoned," + TOP; public static final String ALL_MERGED = "all,merged," + TOP; public static final String ALL_OPEN = "all,open," + TOP; diff --git a/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeListService.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeListService.java index 3473373d24..6f6fc09fa5 100644 --- a/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeListService.java +++ b/gerrit-common/src/main/java/com/google/gerrit/common/data/ChangeListService.java @@ -36,6 +36,14 @@ public interface ChangeListService extends RemoteJsonService { void allOpenNext(String pos, int limit, AsyncCallback callback); + @SignInRequired + void myWatchedOpenPrev(String pos, int limit, + AsyncCallback callback); + + @SignInRequired + void myWatchedOpenNext(String pos, int limit, + AsyncCallback callback); + /** Get all open changes more recent than pos, fetching at most limit rows. */ void byProjectOpenPrev(Project.NameKey project, String pos, int limit, AsyncCallback callback); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java index 7db92ad179..de2f084723 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Dispatcher.java @@ -39,6 +39,7 @@ import com.google.gerrit.client.changes.AccountDashboardScreen; import com.google.gerrit.client.changes.AllAbandonedChangesScreen; import com.google.gerrit.client.changes.AllMergedChangesScreen; import com.google.gerrit.client.changes.AllOpenChangesScreen; +import com.google.gerrit.client.changes.MineWatchedOpenChangesScreen; import com.google.gerrit.client.changes.ByProjectAbandonedChangesScreen; import com.google.gerrit.client.changes.ByProjectMergedChangesScreen; import com.google.gerrit.client.changes.ByProjectOpenChangesScreen; @@ -154,6 +155,11 @@ public class Dispatcher { return new MineDraftsScreen(); } else { + String p = "mine,watched,"; + if (token.startsWith(p)) { + return new MineWatchedOpenChangesScreen(skip(p, token)); + } + return new NotFoundScreen(); } } @@ -175,6 +181,7 @@ public class Dispatcher { if (token.startsWith(p)) { return new AllOpenChangesScreen(skip(p, token)); } + return new NotFoundScreen(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java index ff34b1101e..e1b0c15b23 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java @@ -410,6 +410,7 @@ public class Gerrit implements EntryPoint { m = new LinkMenuBar(); addLink(m, C.menuMyChanges(), PageLinks.MINE); addLink(m, C.menuMyDrafts(), PageLinks.MINE_DRAFTS); + addLink(m, C.menuMyWatchedChanges(), PageLinks.MINE_WATCHED); addLink(m, C.menuMyStarredChanges(), PageLinks.MINE_STARRED); menuLeft.add(m, C.menuMine()); menuLeft.selectTab(1); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java index 5b26bcf294..1775e0c409 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.java @@ -48,6 +48,7 @@ public interface GerritConstants extends Constants { String menuMine(); String menuMyChanges(); String menuMyDrafts(); + String menuMyWatchedChanges(); String menuMyStarredChanges(); String menuAdmin(); @@ -76,5 +77,6 @@ public interface GerritConstants extends Constants { String jumpAllMerged(); String jumpMine(); String jumpMineDrafts(); + String jumpMineWatched(); String jumpMineStarred(); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties index 58c9cbe5c9..cc1f3b5fe7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/GerritConstants.properties @@ -32,6 +32,7 @@ menuMine = My menuMyChanges = Changes menuMyDrafts = Drafts menuMyStarredChanges = Starred Changes +menuMyWatchedChanges = Watched Changes menuAdmin = Admin menuPeople = People @@ -58,5 +59,6 @@ sectionJumping = Jumping jumpAllOpen = Go to all open changes jumpAllMerged = Go to all merged changes jumpMine = Go to my dashboard +jumpMineWatched = Go to watched changes jumpMineDrafts = Go to drafts jumpMineStarred = Go to starred changes diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/JumpKeys.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/JumpKeys.java index 6c789bf3f3..df0a618eeb 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/JumpKeys.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/JumpKeys.java @@ -52,6 +52,12 @@ class JumpKeys { Gerrit.display(PageLinks.MINE_DRAFTS); } }); + jumps.add(new KeyCommand(0, 'w', Gerrit.C.jumpMineWatched()) { + @Override + public void onKeyPress(final KeyPressEvent event) { + Gerrit.display(PageLinks.MINE_WATCHED); + } + }); jumps.add(new KeyCommand(0, 's', Gerrit.C.jumpMineStarred()) { @Override public void onKeyPress(final KeyPressEvent event) { diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllAbandonedChangesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllAbandonedChangesScreen.java index 39b6162c8e..af8aa6306d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllAbandonedChangesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllAbandonedChangesScreen.java @@ -18,7 +18,7 @@ import com.google.gerrit.client.Gerrit; import com.google.gerrit.reviewdb.Change; -public class AllAbandonedChangesScreen extends AllSingleListScreen { +public class AllAbandonedChangesScreen extends PagedSingleListScreen { public AllAbandonedChangesScreen(final String positionToken) { super("all,abandoned", positionToken); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllMergedChangesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllMergedChangesScreen.java index 9c4931a35a..f9523371d7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllMergedChangesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllMergedChangesScreen.java @@ -18,7 +18,7 @@ import com.google.gerrit.client.Gerrit; import com.google.gerrit.reviewdb.Change; -public class AllMergedChangesScreen extends AllSingleListScreen { +public class AllMergedChangesScreen extends PagedSingleListScreen { public AllMergedChangesScreen(final String positionToken) { super("all,merged", positionToken); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllOpenChangesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllOpenChangesScreen.java index 94050666b4..45171e1a43 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllOpenChangesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllOpenChangesScreen.java @@ -18,7 +18,7 @@ import com.google.gerrit.client.Gerrit; -public class AllOpenChangesScreen extends AllSingleListScreen { +public class AllOpenChangesScreen extends PagedSingleListScreen { public AllOpenChangesScreen(final String positionToken) { super("all,open", positionToken); } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectAbandonedChangesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectAbandonedChangesScreen.java index 79d00ef9e7..de74452722 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectAbandonedChangesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectAbandonedChangesScreen.java @@ -18,7 +18,7 @@ import com.google.gerrit.reviewdb.Change; import com.google.gerrit.reviewdb.Project; -public class ByProjectAbandonedChangesScreen extends AllSingleListScreen { +public class ByProjectAbandonedChangesScreen extends PagedSingleListScreen { private final Project.NameKey projectKey; public ByProjectAbandonedChangesScreen(final Project.NameKey proj, diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectMergedChangesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectMergedChangesScreen.java index 55caf90501..8a2184019d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectMergedChangesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectMergedChangesScreen.java @@ -18,7 +18,7 @@ import com.google.gerrit.reviewdb.Change; import com.google.gerrit.reviewdb.Project; -public class ByProjectMergedChangesScreen extends AllSingleListScreen { +public class ByProjectMergedChangesScreen extends PagedSingleListScreen { private final Project.NameKey projectKey; public ByProjectMergedChangesScreen(final Project.NameKey proj, diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java index f9525a47c9..b55e86b0f7 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ByProjectOpenChangesScreen.java @@ -17,7 +17,7 @@ package com.google.gerrit.client.changes; import com.google.gerrit.reviewdb.Project; -public class ByProjectOpenChangesScreen extends AllSingleListScreen { +public class ByProjectOpenChangesScreen extends PagedSingleListScreen { private final Project.NameKey projectKey; public ByProjectOpenChangesScreen(final Project.NameKey proj, diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java index 4e34d25f13..b5b4786f0e 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.java @@ -25,6 +25,7 @@ public interface ChangeConstants extends Constants { String changesRecentlyClosed(); String starredHeading(); + String watchedHeading(); String draftsHeading(); String allOpenChanges(); String allAbandonedChanges(); diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties index 7211c9498f..63e06f092f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeConstants.properties @@ -4,6 +4,7 @@ statusLongMerged = Merged statusLongAbandoned = Abandoned starredHeading = Starred Changes +watchedHeading = Open Changes of Watched Projects draftsHeading = Changes with unpublished drafts changesRecentlyClosed = Recently closed allOpenChanges = All open changes diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeQueryResultsScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeQueryResultsScreen.java index 001a06f3dc..ec4a4a52b8 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeQueryResultsScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeQueryResultsScreen.java @@ -24,7 +24,7 @@ import com.google.gwtorm.client.KeyUtil; -public class ChangeQueryResultsScreen extends AllSingleListScreen { +public class ChangeQueryResultsScreen extends PagedSingleListScreen { private final String query; public ChangeQueryResultsScreen(final String encQuery, diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/MineWatchedOpenChangesScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/MineWatchedOpenChangesScreen.java new file mode 100644 index 0000000000..8e31b361da --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/MineWatchedOpenChangesScreen.java @@ -0,0 +1,41 @@ +// Copyright (C) 2010 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.client.changes; + +import com.google.gerrit.client.Gerrit; + +public class MineWatchedOpenChangesScreen extends PagedSingleListScreen { + public MineWatchedOpenChangesScreen(final String positionToken) { + super("mine,watched", positionToken); + setRequiresSignIn(true); + } + + @Override + protected void onInitUI() { + super.onInitUI(); + setWindowTitle(Gerrit.C.menuMyWatchedChanges()); + setPageTitle(Util.C.watchedHeading()); + } + + @Override + protected void loadPrev() { + Util.LIST_SVC.myWatchedOpenPrev(pos, pageSize, loadCallback()); + } + + @Override + protected void loadNext() { + Util.LIST_SVC.myWatchedOpenNext(pos, pageSize, loadCallback()); + } +} diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllSingleListScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PagedSingleListScreen.java similarity index 97% rename from gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllSingleListScreen.java rename to gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PagedSingleListScreen.java index 941d762879..6ca102f33d 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/AllSingleListScreen.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PagedSingleListScreen.java @@ -31,7 +31,7 @@ import com.google.gwtexpui.globalkey.client.KeyCommand; import java.util.List; -public abstract class AllSingleListScreen extends Screen { +public abstract class PagedSingleListScreen extends Screen { protected static final String MIN_SORTKEY = ""; protected static final String MAX_SORTKEY = "z"; @@ -46,7 +46,7 @@ public abstract class AllSingleListScreen extends Screen { protected boolean useLoadPrev; protected String pos; - protected AllSingleListScreen(final String anchorToken, + protected PagedSingleListScreen(final String anchorToken, final String positionToken) { anchorPrefix = anchorToken; useLoadPrev = positionToken.startsWith("p,"); diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java index 0c254043a9..ce350a39cc 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/UrlModule.java @@ -64,6 +64,7 @@ class UrlModule extends ServletModule { serve("/mine").with(screen(PageLinks.MINE)); serve("/open").with(screen(PageLinks.ALL_OPEN)); serve("/settings").with(screen(PageLinks.SETTINGS)); + serve("/watched").with(screen(PageLinks.MINE_WATCHED)); serve("/starred").with(screen(PageLinks.MINE_STARRED)); serveRegex( // diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/ChangeListServiceImpl.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/ChangeListServiceImpl.java index d71a7811c0..56f5a0ff04 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/ChangeListServiceImpl.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/ChangeListServiceImpl.java @@ -36,6 +36,7 @@ import com.google.gerrit.reviewdb.StarredChange; import com.google.gerrit.reviewdb.TrackingId; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.account.AccountInfoCacheFactory; +import com.google.gerrit.server.config.WildProjectName; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -89,16 +90,19 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements private final Provider currentUser; private final ChangeControl.Factory changeControlFactory; private final AccountInfoCacheFactory.Factory accountInfoCacheFactory; + private final Project.NameKey wildProject; @Inject ChangeListServiceImpl(final Provider schema, final Provider currentUser, final ChangeControl.Factory changeControlFactory, - final AccountInfoCacheFactory.Factory accountInfoCacheFactory) { + final AccountInfoCacheFactory.Factory accountInfoCacheFactory, + final @WildProjectName Project.NameKey wildProject) { super(schema, currentUser); this.currentUser = currentUser; this.changeControlFactory = changeControlFactory; this.accountInfoCacheFactory = accountInfoCacheFactory; + this.wildProject = wildProject; } private boolean canRead(final Change c) { @@ -131,6 +135,43 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements }); } + public void myWatchedOpenPrev(final String pos, final int pageSize, + final AsyncCallback callback) { + run(callback, new QueryPrev(pageSize, pos) { + @Override + ResultSet query(ReviewDb db, int slim, String sortKey) + throws OrmException { + return db.changes().allOpenPrev(sortKey, slim); + } + + @Override + protected boolean accept(Change c) { + return isWatched(c); + } + }); + } + + public void myWatchedOpenNext(final String pos, final int pageSize, + final AsyncCallback callback) { + run(callback, new QueryNext(pageSize, pos) { + @Override + ResultSet query(ReviewDb db, int slim, String sortKey) + throws OrmException { + return db.changes().allOpenNext(sortKey, slim); + } + + @Override + protected boolean accept(Change c) { + return isWatched(c); + } + }); + } + + private boolean isWatched(Change c) { + Set watchedProjects = currentUser.get().getWatchedProjects(); + return watchedProjects.contains(c.getProject()) || watchedProjects.contains(wildProject); + } + public void byProjectOpenPrev(final Project.NameKey project, final String pos, final int pageSize, final AsyncCallback callback) { @@ -569,7 +610,7 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements final ResultSet rs = query(db, slim, sortKey); for (final Change c : rs) { results = true; - if (canRead(c)) { + if (canRead(c) && accept(c)) { final ChangeInfo ci = new ChangeInfo(c); ac.want(ci.getOwner()); ci.setStarred(starred.contains(ci.getId())); @@ -589,6 +630,10 @@ public class ChangeListServiceImpl extends BaseServiceImplementation implements return d; } + protected boolean accept(final Change c) { + return true; + } + boolean finish(final ArrayList list) { final boolean atEnd = list.size() <= limit; if (list.size() == slim) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java index a17149743f..ff6f43d610 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/AnonymousUser.java @@ -16,6 +16,7 @@ package com.google.gerrit.server; import com.google.gerrit.reviewdb.AccountGroup; import com.google.gerrit.reviewdb.Change; +import com.google.gerrit.reviewdb.Project.NameKey; import com.google.gerrit.server.config.AuthConfig; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -41,6 +42,11 @@ public class AnonymousUser extends CurrentUser { return Collections.emptySet(); } + @Override + public Set getWatchedProjects() { + return Collections.emptySet(); + } + @Override public String toString() { return "ANONYMOUS"; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java index 17e69c7da3..207d5cc6d4 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/CurrentUser.java @@ -16,6 +16,7 @@ package com.google.gerrit.server; import com.google.gerrit.reviewdb.AccountGroup; import com.google.gerrit.reviewdb.Change; +import com.google.gerrit.reviewdb.Project; import com.google.gerrit.server.config.AuthConfig; import com.google.inject.servlet.RequestScoped; @@ -59,6 +60,9 @@ public abstract class CurrentUser { /** Set of changes starred by this user. */ public abstract Set getStarredChanges(); + /** Set of project that are watched by this user */ + public abstract Set getWatchedProjects(); + /** Is the user a non-interactive user? */ public boolean isBatchUser() { return getEffectiveGroups().contains(authConfig.getBatchUsersGroup()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java index 6900538f38..827191c17b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/IdentifiedUser.java @@ -16,9 +16,12 @@ package com.google.gerrit.server; import com.google.gerrit.reviewdb.Account; import com.google.gerrit.reviewdb.AccountGroup; +import com.google.gerrit.reviewdb.AccountProjectWatch; import com.google.gerrit.reviewdb.Change; +import com.google.gerrit.reviewdb.Project; import com.google.gerrit.reviewdb.ReviewDb; import com.google.gerrit.reviewdb.StarredChange; +import com.google.gerrit.reviewdb.Project.NameKey; import com.google.gerrit.server.account.AccountCache; import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.account.Realm; @@ -138,6 +141,7 @@ public class IdentifiedUser extends CurrentUser { private Set emailAddresses; private Set effectiveGroups; private Set starredChanges; + private Set watchedProjects; private IdentifiedUser(final AccessPath accessPath, final AuthConfig authConfig, final Provider canonicalUrl, @@ -216,6 +220,27 @@ public class IdentifiedUser extends CurrentUser { return starredChanges; } + @Override + public Set getWatchedProjects() { + if (watchedProjects == null) { + if (dbProvider == null) { + throw new OutOfScopeException("Not in request scoped user"); + } + final Set h = new HashSet(); + try { + for (AccountProjectWatch projectWatch : dbProvider.get() + .accountProjectWatches().byAccount(getAccountId())) { + h.add(projectWatch.getProjectNameKey()); + } + } catch (OrmException e) { + log.warn("Cannot query project watches of a user", e); + } + watchedProjects = Collections.unmodifiableSet(h); + } + + return watchedProjects; + } + public PersonIdent newRefLogIdent() { return newRefLogIdent(new Date(), TimeZone.getDefault()); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java index 26e510f9d3..d44643b6ce 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/PeerDaemonUser.java @@ -16,6 +16,7 @@ package com.google.gerrit.server; import com.google.gerrit.reviewdb.AccountGroup; import com.google.gerrit.reviewdb.Change; +import com.google.gerrit.reviewdb.Project.NameKey; import com.google.gerrit.server.config.AuthConfig; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; @@ -57,6 +58,11 @@ public class PeerDaemonUser extends CurrentUser { return Collections.emptySet(); } + @Override + public Set getWatchedProjects() { + return Collections.emptySet(); + } + public SocketAddress getRemoteAddress() { return peer; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/ReplicationUser.java b/gerrit-server/src/main/java/com/google/gerrit/server/ReplicationUser.java index 1b010a6ec7..b21df8a870 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/ReplicationUser.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/ReplicationUser.java @@ -16,6 +16,7 @@ package com.google.gerrit.server; import com.google.gerrit.reviewdb.AccountGroup; import com.google.gerrit.reviewdb.Change; +import com.google.gerrit.reviewdb.Project.NameKey; import com.google.gerrit.server.config.AuthConfig; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; @@ -71,6 +72,11 @@ public class ReplicationUser extends CurrentUser { return Collections.emptySet(); } + @Override + public Set getWatchedProjects() { + return Collections.emptySet(); + } + public boolean isEverythingVisible() { return getEffectiveGroups() == EVERYTHING_VISIBLE; }