From e19d3da3cdb4e3d0524e3a3ffc6a2cfa8876e927 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 16 Nov 2011 22:33:18 -0500 Subject: [PATCH] Metric object now implements comparable. Adjust gravatar css. --- src/com/gitblit/client/GitblitClient.java | 202 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 191 insertions(+), 11 deletions(-) diff --git a/src/com/gitblit/client/GitblitClient.java b/src/com/gitblit/client/GitblitClient.java index 66675b1..c027537 100644 --- a/src/com/gitblit/client/GitblitClient.java +++ b/src/com/gitblit/client/GitblitClient.java @@ -19,18 +19,28 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import com.gitblit.Constants; 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.FeedEntryModel; +import com.gitblit.models.FeedModel; import com.gitblit.models.RepositoryModel; import com.gitblit.models.ServerSettings; import com.gitblit.models.ServerStatus; 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 @@ -43,12 +53,16 @@ private static final long serialVersionUID = 1L; + private static final Date NEVER = new Date(0); + + protected final GitblitRegistration reg; + public final String url; public final String account; private final char[] password; - + private volatile boolean allowManagement; private volatile boolean allowAdministration; @@ -61,52 +75,98 @@ private final List<FederationModel> federationRegistrations; + private final List<FeedModel> availableFeeds; + + private final List<FeedEntryModel> syndicatedEntries; + + private final Set<String> subscribedRepositories; + 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.availableFeeds = new ArrayList<FeedModel>(); + this.syndicatedEntries = new ArrayList<FeedEntryModel>(); + this.subscribedRepositories = new HashSet<String>(); } public void login() throws IOException { + refreshSettings(); + refreshAvailableFeeds(); refreshRepositories(); + refreshSubscribedFeeds(0); try { + // credentials may not have administrator access + // or server may have disabled rpc management refreshUsers(); 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 { - settings = RpcUtils.getSettings(url, account, password); - 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(); } - } public boolean allowManagement() { return allowManagement; } - + public boolean allowAdministration() { return allowAdministration; } public boolean isOwner(RepositoryModel model) { return account != null && account.equalsIgnoreCase(model.owner); + } + + public String getURL(String action, String repository, String objectId) { + boolean mounted = settings.get(Keys.web.mountParameters).getBoolean(true); + StringBuilder sb = new StringBuilder(); + sb.append(url); + sb.append('/'); + sb.append(action); + sb.append('/'); + if (mounted) { + // mounted url/action/repository/objectId + sb.append(StringUtils.encodeURL(repository)); + if (!StringUtils.isEmpty(objectId)) { + sb.append('/'); + sb.append(objectId); + } + return sb.toString(); + } else { + // parameterized url/action/&r=repository&h=objectId + sb.append("?r="); + sb.append(repository); + if (!StringUtils.isEmpty(objectId)) { + sb.append("&h="); + sb.append(objectId); + } + return sb.toString(); + } } public ServerSettings getSettings() { @@ -127,6 +187,7 @@ allRepositories.clear(); allRepositories.addAll(repositories.values()); Collections.sort(allRepositories); + markSubscribedFeeds(); return allRepositories; } @@ -135,6 +196,121 @@ allUsers.clear(); allUsers.addAll(users); return allUsers; + } + + public ServerSettings refreshSettings() throws IOException { + settings = RpcUtils.getSettings(url, account, password); + return settings; + } + + public ServerStatus refreshStatus() throws IOException { + status = RpcUtils.getStatus(url, account, password); + return status; + } + + public List<String> getBranches(String repository) { + List<FeedModel> feeds = getAvailableFeeds(repository); + List<String> branches = new ArrayList<String>(); + for (FeedModel feed : feeds) { + branches.add(feed.branch); + } + Collections.sort(branches); + return branches; + } + + public List<FeedModel> getAvailableFeeds() { + return availableFeeds; + } + + public List<FeedModel> getAvailableFeeds(RepositoryModel repository) { + return getAvailableFeeds(repository.name); + } + + public List<FeedModel> getAvailableFeeds(String repository) { + List<FeedModel> repositoryFeeds = new ArrayList<FeedModel>(); + if (repository == null) { + return repositoryFeeds; + } + for (FeedModel feed : availableFeeds) { + if (feed.repository.equalsIgnoreCase(repository)) { + repositoryFeeds.add(feed); + } + } + return repositoryFeeds; + } + + public List<FeedModel> refreshAvailableFeeds() throws IOException { + List<FeedModel> feeds = RpcUtils.getBranchFeeds(url, account, password); + availableFeeds.clear(); + availableFeeds.addAll(feeds); + markSubscribedFeeds(); + return availableFeeds; + } + + public List<FeedEntryModel> refreshSubscribedFeeds(int page) throws IOException { + Set<FeedEntryModel> allEntries = new HashSet<FeedEntryModel>(); + if (reg.feeds.size() > 0) { + for (FeedModel feed : reg.feeds) { + feed.lastRefreshDate = feed.currentRefreshDate; + feed.currentRefreshDate = new Date(); + List<FeedEntryModel> entries = SyndicationUtils.readFeed(url, + feed.repository, feed.branch, -1, page, account, password); + allEntries.addAll(entries); + } + } + reg.cacheFeeds(); + syndicatedEntries.clear(); + syndicatedEntries.addAll(allEntries); + Collections.sort(syndicatedEntries); + return syndicatedEntries; + } + + public void updateSubscribedFeeds(List<FeedModel> list) { + reg.updateSubscribedFeeds(list); + markSubscribedFeeds(); + } + + private void markSubscribedFeeds() { + subscribedRepositories.clear(); + for (FeedModel feed : availableFeeds) { + // mark feed in the available list as subscribed + feed.subscribed = reg.feeds.contains(feed); + if (feed.subscribed) { + subscribedRepositories.add(feed.repository.toLowerCase()); + } + } + } + + public Date getLastFeedRefresh(String repository, String branch) { + FeedModel feed = new FeedModel(); + feed.repository = repository; + feed.branch = branch; + if (reg.feeds.contains(feed)) { + int idx = reg.feeds.indexOf(feed); + feed = reg.feeds.get(idx); + return feed.lastRefreshDate; + } + return NEVER; + } + + public boolean isSubscribed(RepositoryModel repository) { + return subscribedRepositories.contains(repository.name.toLowerCase()); + } + + public List<FeedEntryModel> getSyndicatedEntries() { + return syndicatedEntries; + } + + public List<FeedEntryModel> log(String repository, String branch, int numberOfEntries, + int page) throws IOException { + return SyndicationUtils.readFeed(url, repository, branch, numberOfEntries, page, account, + password); + } + + public List<FeedEntryModel> search(String repository, String branch, String fragment, + Constants.SearchType type, int numberOfEntries, int page) throws IOException { + return SyndicationUtils.readSearchFeed(url, repository, branch, fragment, type, + numberOfEntries, page, account, password); } public List<FederationModel> refreshFederationRegistrations() throws IOException { @@ -212,4 +388,8 @@ public boolean deleteUser(UserModel user) throws IOException { return RpcUtils.deleteUser(user, url, account, password); } + + public boolean updateSettings(Map<String, String> newSettings) throws IOException { + return RpcUtils.updateSettings(newSettings, url, account, password); + } } -- Gitblit v1.9.1