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 <edwin.kempin@gmail.com>
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 5a85ef5..33295bc 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 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 3473373..6f6fc09 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 @@ void allOpenNext(String pos, int limit, AsyncCallback<SingleListChangeInfo> callback); + @SignInRequired + void myWatchedOpenPrev(String pos, int limit, + AsyncCallback<SingleListChangeInfo> callback); + + @SignInRequired + void myWatchedOpenNext(String pos, int limit, + AsyncCallback<SingleListChangeInfo> callback); + /** Get all open changes more recent than pos, fetching at most limit rows. */ void byProjectOpenPrev(Project.NameKey project, String pos, int limit, AsyncCallback<SingleListChangeInfo> 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 7db92ad..de2f084 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.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 @@ 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 @@ 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 ff34b11..e1b0c15 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 @@ 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 5b26bcf..1775e0c 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 @@ String menuMine(); String menuMyChanges(); String menuMyDrafts(); + String menuMyWatchedChanges(); String menuMyStarredChanges(); String menuAdmin(); @@ -76,5 +77,6 @@ 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 58c9cbe..cc1f3b5 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 @@ menuMyChanges = Changes menuMyDrafts = Drafts menuMyStarredChanges = Starred Changes +menuMyWatchedChanges = Watched Changes menuAdmin = Admin menuPeople = People @@ -58,5 +59,6 @@ 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 6c789bf..df0a618 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 @@ 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 39b6162..af8aa63 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.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 9c4931a..f952337 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.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 9405066..45171e1 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 @@ -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 79d00ef..de74452 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.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 55caf90..8a21840 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.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 f9525a4..b55e86b 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 @@ 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 4e34d25..b5b4786 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 @@ 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 7211c94..63e06f0 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 @@ 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 001a06f..ec4a4a5 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 @@ -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 0000000..8e31b36 --- /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 941d762..6ca102f 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 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 @@ 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 0c25404..ce350a3 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 @@ 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 d71a781..56f5a0f 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.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 @@ private final Provider<CurrentUser> currentUser; private final ChangeControl.Factory changeControlFactory; private final AccountInfoCacheFactory.Factory accountInfoCacheFactory; + private final Project.NameKey wildProject; @Inject ChangeListServiceImpl(final Provider<ReviewDb> schema, final Provider<CurrentUser> 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 void myWatchedOpenPrev(final String pos, final int pageSize, + final AsyncCallback<SingleListChangeInfo> callback) { + run(callback, new QueryPrev(pageSize, pos) { + @Override + ResultSet<Change> 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<SingleListChangeInfo> callback) { + run(callback, new QueryNext(pageSize, pos) { + @Override + ResultSet<Change> 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<Project.NameKey> 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<SingleListChangeInfo> callback) { @@ -569,7 +610,7 @@ final ResultSet<Change> 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 @@ return d; } + protected boolean accept(final Change c) { + return true; + } + boolean finish(final ArrayList<ChangeInfo> 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 a171497..ff6f43d 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 @@ 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; @@ -42,6 +43,11 @@ } @Override + public Set<NameKey> 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 17e69c7..207d5cc 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 @@ 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 @@ /** Set of changes starred by this user. */ public abstract Set<Change.Id> getStarredChanges(); + /** Set of project that are watched by this user */ + public abstract Set<Project.NameKey> 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 6900538..827191c 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 @@ 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 @@ private Set<String> emailAddresses; private Set<AccountGroup.Id> effectiveGroups; private Set<Change.Id> starredChanges; + private Set<Project.NameKey> watchedProjects; private IdentifiedUser(final AccessPath accessPath, final AuthConfig authConfig, final Provider<String> canonicalUrl, @@ -216,6 +220,27 @@ return starredChanges; } + @Override + public Set<Project.NameKey> getWatchedProjects() { + if (watchedProjects == null) { + if (dbProvider == null) { + throw new OutOfScopeException("Not in request scoped user"); + } + final Set<Project.NameKey> h = new HashSet<Project.NameKey>(); + 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 26e510f..d44643b 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 @@ 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 @@ return Collections.emptySet(); } + @Override + public Set<NameKey> 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 1b010a6..b21df8a 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 @@ 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 @@ return Collections.emptySet(); } + @Override + public Set<NameKey> getWatchedProjects() { + return Collections.emptySet(); + } + public boolean isEverythingVisible() { return getEffectiveGroups() == EVERYTHING_VISIBLE; }