From ac7f1753d3f742e0af8dd5e142b4eac9d9d2fbba Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Fri, 28 Oct 2011 21:41:31 -0400 Subject: [PATCH] Preserve feed selections when not saving passwords --- src/com/gitblit/client/GitblitClient.java | 154 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 146 insertions(+), 8 deletions(-) diff --git a/src/com/gitblit/client/GitblitClient.java b/src/com/gitblit/client/GitblitClient.java index d3a92b0..ccde45a 100644 --- a/src/com/gitblit/client/GitblitClient.java +++ b/src/com/gitblit/client/GitblitClient.java @@ -19,18 +19,25 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import com.gitblit.GitBlitException.ForbiddenException; +import com.gitblit.GitBlitException.NotAllowedException; import com.gitblit.GitBlitException.UnauthorizedException; +import com.gitblit.GitBlitException.UnknownRequestException; import com.gitblit.Keys; import com.gitblit.models.FederationModel; import com.gitblit.models.RepositoryModel; import com.gitblit.models.ServerSettings; import com.gitblit.models.ServerStatus; +import com.gitblit.models.SyndicatedEntryModel; import com.gitblit.models.UserModel; import com.gitblit.utils.RpcUtils; +import com.gitblit.utils.StringUtils; +import com.gitblit.utils.SyndicationUtils; /** * GitblitClient is a object that retrieves data from a Gitblit server, caches @@ -42,6 +49,8 @@ public class GitblitClient implements Serializable { private static final long serialVersionUID = 1L; + + protected final GitblitRegistration reg; public final String url; @@ -61,38 +70,57 @@ private final List<FederationModel> federationRegistrations; + private final List<SyndicatedEntryModel> syndicatedEntries; + private ServerStatus status; - public GitblitClient(String url, String account, char[] password) { - this.url = url; - this.account = account; - this.password = password; + public GitblitClient(GitblitRegistration reg) { + this.reg = reg; + this.url = reg.url; + this.account = reg.account; + this.password = reg.password; this.allUsers = new ArrayList<UserModel>(); this.allRepositories = new ArrayList<RepositoryModel>(); this.federationRegistrations = new ArrayList<FederationModel>(); + this.syndicatedEntries = new ArrayList<SyndicatedEntryModel>(); } public void login() throws IOException { refreshRepositories(); try { + // RSS feeds may be disabled by server + refreshSubscribedFeeds(); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + // credentials may not have administrator access + // or server may have disabled rpc management refreshUsers(); + refreshSettings(); allowManagement = true; } catch (UnauthorizedException e) { } catch (ForbiddenException e) { + } catch (NotAllowedException e) { + } catch (UnknownRequestException e) { } catch (IOException e) { - System.err.println(e.getMessage()); + e.printStackTrace(); } try { - refreshSettings(); - status = RpcUtils.getStatus(url, account, password); + // credentials may not have administrator access + // or server may have disabled rpc administration + refreshStatus(); allowAdministration = true; } catch (UnauthorizedException e) { } catch (ForbiddenException e) { + } catch (NotAllowedException e) { + } catch (UnknownRequestException e) { } catch (IOException e) { - System.err.println(e.getMessage()); + e.printStackTrace(); } } @@ -127,6 +155,7 @@ allRepositories.clear(); allRepositories.addAll(repositories.values()); Collections.sort(allRepositories); + updateSubscribedStates(); return allRepositories; } @@ -142,6 +171,115 @@ return settings; } + public ServerStatus refreshStatus() throws IOException { + status = RpcUtils.getStatus(url, account, password); + return status; + } + + public List<SyndicatedEntryModel> refreshSubscribedFeeds() throws IOException { + Set<SyndicatedEntryModel> allFeeds = new HashSet<SyndicatedEntryModel>(); + if (reg.feeds != null && reg.feeds.size() > 0) { + for (String feed : reg.feeds) { + String[] values = feed.split(":"); + String repository = values[0]; + String branch = null; + if (values.length > 1) { + branch = values[1]; + } + List<SyndicatedEntryModel> list = SyndicationUtils.readFeed(url, repository, + branch, -1, account, password); + allFeeds.addAll(list); + } + } + syndicatedEntries.clear(); + syndicatedEntries.addAll(allFeeds); + Collections.sort(syndicatedEntries); + return syndicatedEntries; + } + + private void updateSubscribedStates() { + if (reg.feeds != null) { + Set<String> subscribedRepositories = new HashSet<String>(); + for (String feed : reg.feeds) { + if (feed.indexOf(':') > -1) { + // strip branch + subscribedRepositories.add(feed.substring(0, feed.indexOf(':')).toLowerCase()); + } else { + // default branch + subscribedRepositories.add(feed.toLowerCase()); + } + } + // set subscribed flag + for (RepositoryModel repository : allRepositories) { + repository.subscribed = subscribedRepositories.contains(repository.name + .toLowerCase()); + } + } + } + + public List<SyndicatedEntryModel> getSyndicatedEntries() { + return syndicatedEntries; + } + + public boolean isSubscribed(RepositoryModel repository, String branch) { + if (reg.feeds != null && reg.feeds.size() > 0) { + for (String feed : reg.feeds) { + String[] values = feed.split(":"); + String repositoryName = values[0]; + if (repository.name.equalsIgnoreCase(repositoryName)) { + return true; + } + // TODO check branch subscriptions + String branchName = null; + if (values.length > 1) { + branchName = values[1]; + } + } + } + return false; + } + + public boolean subscribe(RepositoryModel repository, String branch) { + String feed = repository.name; + if (!StringUtils.isEmpty(branch)) { + feed += ":" + branch; + } + if (reg.feeds == null) { + reg.feeds = new ArrayList<String>(); + } + reg.feeds.add(feed); + updateSubscribedStates(); + return true; + } + + public boolean unsubscribe(RepositoryModel repository, String branch) { + String feed = repository.name; + if (!StringUtils.isEmpty(branch)) { + feed += ":" + branch; + } + reg.feeds.remove(feed); + if (syndicatedEntries.size() > 0) { + List<SyndicatedEntryModel> toRemove = new ArrayList<SyndicatedEntryModel>(); + for (SyndicatedEntryModel model : syndicatedEntries) { + if (model.repository.equalsIgnoreCase(repository.name)) { + boolean emptyUnsubscribeBranch = StringUtils.isEmpty(branch); + boolean emptyFromBranch = StringUtils.isEmpty(model.branch); + if (emptyUnsubscribeBranch && emptyFromBranch) { + // default branch, remove + toRemove.add(model); + } else if (!emptyUnsubscribeBranch && !emptyFromBranch) { + if (model.branch.equals(branch)) { + // specific branch, remove + toRemove.add(model); + } + } + } + } + } + updateSubscribedStates(); + return true; + } + public List<FederationModel> refreshFederationRegistrations() throws IOException { List<FederationModel> list = RpcUtils.getFederationRegistrations(url, account, password); federationRegistrations.clear(); -- Gitblit v1.9.1