From 9bdb91ea80119121791271819f2c1fbf07bf5591 Mon Sep 17 00:00:00 2001 From: James Moger Date: Thu, 3 Nov 2011 17:09:35 -0400 Subject: [PATCH] RSS search parameters. Include refs as categories in RSS entries. --- src/com/gitblit/RpcServlet.java | 1 + src/com/gitblit/SyndicationServlet.java | 31 ++++++- src/com/gitblit/utils/SyndicationUtils.java | 81 ++++++++++++++++++- .../gitblit/tests/SyndicationUtilsTest.java | 8 ++ 4 files changed, 119 insertions(+), 2 deletions(-) diff --git a/src/com/gitblit/RpcServlet.java b/src/com/gitblit/RpcServlet.java index c7ff5394..068562e8 100644 --- a/src/com/gitblit/RpcServlet.java +++ b/src/com/gitblit/RpcServlet.java @@ -232,6 +232,7 @@ public class RpcServlet extends JsonServlet { List keys = new ArrayList(); keys.add(Keys.web.siteName); keys.add(Keys.web.mountParameters); + keys.add(Keys.web.syndicationEntries); if (allowManagement) { // keys necessary for repository and/or user management diff --git a/src/com/gitblit/SyndicationServlet.java b/src/com/gitblit/SyndicationServlet.java index 75101799..af0fab71 100644 --- a/src/com/gitblit/SyndicationServlet.java +++ b/src/com/gitblit/SyndicationServlet.java @@ -18,18 +18,22 @@ package com.gitblit; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServlet; +import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.gitblit.models.RefModel; import com.gitblit.models.RepositoryModel; import com.gitblit.models.SyndicatedEntryModel; import com.gitblit.utils.HttpUtils; import com.gitblit.utils.JGitUtils; +import com.gitblit.utils.JGitUtils.SearchType; import com.gitblit.utils.StringUtils; import com.gitblit.utils.SyndicationUtils; @@ -126,6 +130,14 @@ public class SyndicationServlet extends HttpServlet { String repositoryName = url; String objectId = request.getParameter("h"); String l = request.getParameter("l"); + String searchString = request.getParameter("s"); + SearchType searchType = SearchType.COMMIT; + if (!StringUtils.isEmpty(request.getParameter("st"))) { + SearchType type = SearchType.forName(request.getParameter("st")); + if (type != null) { + searchType = type; + } + } int length = GitBlit.getInteger(Keys.web.syndicationEntries, 25); if (StringUtils.isEmpty(objectId)) { objectId = org.eclipse.jgit.lib.Constants.HEAD; @@ -140,7 +152,16 @@ public class SyndicationServlet extends HttpServlet { response.setContentType("application/rss+xml; charset=UTF-8"); Repository repository = GitBlit.self().getRepository(repositoryName); RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName); - List commits = JGitUtils.getRevLog(repository, objectId, 0, length); + List commits; + if (StringUtils.isEmpty(searchString)) { + // standard log/history lookup + commits = JGitUtils.getRevLog(repository, objectId, 0, length); + } else { + // repository search + commits = JGitUtils.searchRevlogs(repository, objectId, searchString, searchType, 0, + length); + } + Map> allRefs = JGitUtils.getAllRefs(repository); List entries = new ArrayList(); boolean mountParameters = GitBlit.getBoolean(Keys.web.mountParameters, true); @@ -165,6 +186,14 @@ public class SyndicationServlet extends HttpServlet { entry.content = commit.getFullMessage(); entry.repository = model.name; entry.branch = objectId; + List refs = allRefs.get(commit.getId()); + if (refs != null && refs.size() > 0) { + List tags = new ArrayList(); + for (RefModel ref : refs) { + tags.add(ref.getName()); + } + entry.tags = tags; + } entries.add(entry); } String feedLink; diff --git a/src/com/gitblit/utils/SyndicationUtils.java b/src/com/gitblit/utils/SyndicationUtils.java index d9d1d848..85d5f8d2 100644 --- a/src/com/gitblit/utils/SyndicationUtils.java +++ b/src/com/gitblit/utils/SyndicationUtils.java @@ -22,11 +22,15 @@ import java.io.OutputStreamWriter; import java.net.URLConnection; import java.text.MessageFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import com.gitblit.Constants; import com.gitblit.GitBlitException; import com.gitblit.models.SyndicatedEntryModel; +import com.gitblit.utils.JGitUtils.SearchType; +import com.sun.syndication.feed.synd.SyndCategory; +import com.sun.syndication.feed.synd.SyndCategoryImpl; import com.sun.syndication.feed.synd.SyndContent; import com.sun.syndication.feed.synd.SyndContentImpl; import com.sun.syndication.feed.synd.SyndEntry; @@ -84,10 +88,21 @@ public class SyndicationUtils { entry.setLink(entryModel.link); entry.setPublishedDate(entryModel.published); + if (entryModel.tags != null && entryModel.tags.size() > 0) { + List tags = new ArrayList(); + for (String tag : entryModel.tags) { + SyndCategoryImpl cat = new SyndCategoryImpl(); + cat.setName(tag); + tags.add(cat); + } + entry.setCategories(tags); + } + SyndContent content = new SyndContentImpl(); content.setType(entryModel.contentType); content.setValue(entryModel.content); entry.setDescription(content); + entries.add(entry); } feed.setEntries(entries); @@ -125,6 +140,63 @@ public class SyndicationUtils { if (!StringUtils.isEmpty(branch)) { parameters.add("h=" + branch); } + return readFeed(url, parameters, repository, branch, username, password); + } + + /** + * Reads a Gitblit RSS search feed. + * + * @param url + * the url of the Gitblit server + * @param repository + * the repository name + * @param fragment + * the search fragment + * @param searchType + * the search type (optional, defaults to COMMIT) + * @param numberOfEntries + * the number of entries to retrieve. if <= 0 the server default + * is used. + * @param username + * @param password + * @return a list of SyndicationModel entries + * @throws {@link IOException} + */ + public static List readSearchFeed(String url, String repository, + String branch, String fragment, SearchType searchType, int numberOfEntries, + String username, char[] password) throws IOException { + // determine parameters + List parameters = new ArrayList(); + parameters.add("s=" + StringUtils.encodeURL(fragment)); + if (numberOfEntries > 0) { + parameters.add("l=" + numberOfEntries); + } + if (!StringUtils.isEmpty(branch)) { + parameters.add("h=" + branch); + } + if (searchType != null) { + parameters.add("st=" + searchType.name()); + } + return readFeed(url, parameters, repository, branch, username, password); + } + + /** + * Reads a Gitblit RSS feed. + * + * @param url + * the url of the Gitblit server + * @param parameters + * the list of RSS parameters + * @param repository + * the repository name + * @param username + * @param password + * @return a list of SyndicationModel entries + * @throws {@link IOException} + */ + private static List readFeed(String url, List parameters, + String repository, String branch, String username, char[] password) throws IOException { + // build url StringBuilder sb = new StringBuilder(); sb.append(MessageFormat.format("{0}" + Constants.SYNDICATION_PATH + "{1}", url, repository)); if (parameters.size() > 0) { @@ -140,7 +212,6 @@ public class SyndicationUtils { } } String feedUrl = sb.toString(); - URLConnection conn = ConnectionUtils.openReadConnection(feedUrl, username, password); InputStream is = conn.getInputStream(); SyndFeedInput input = new SyndFeedInput(); @@ -163,6 +234,14 @@ public class SyndicationUtils { model.link = entry.getLink(); model.content = entry.getDescription().getValue(); model.contentType = entry.getDescription().getType(); + if (entry.getCategories() != null && entry.getCategories().size() > 0) { + List tags = new ArrayList(); + for (Object p : entry.getCategories()) { + SyndCategory cat = (SyndCategory) p; + tags.add(cat.getName()); + } + model.tags = tags; + } entries.add(model); } return entries; diff --git a/tests/com/gitblit/tests/SyndicationUtilsTest.java b/tests/com/gitblit/tests/SyndicationUtilsTest.java index 64b99bdf..98bdd4bf 100644 --- a/tests/com/gitblit/tests/SyndicationUtilsTest.java +++ b/tests/com/gitblit/tests/SyndicationUtilsTest.java @@ -57,4 +57,12 @@ public class SyndicationUtilsTest extends TestCase { assertTrue(feed.size() > 0); assertEquals(5, feed.size()); } + + public void testSearchFeedRead() throws Exception { + List feed = SyndicationUtils.readSearchFeed("https://localhost:8443", + "ticgit.git", null, "documentation", null, 5, "admin", "admin".toCharArray()); + assertTrue(feed != null); + assertTrue(feed.size() > 0); + assertEquals(2, feed.size()); + } } \ No newline at end of file -- 2.39.5