James Moger
2011-11-03 9bdb91ea80119121791271819f2c1fbf07bf5591
RSS search parameters. Include refs as categories in RSS entries.
4 files modified
121 ■■■■■ changed files
src/com/gitblit/RpcServlet.java 1 ●●●● patch | view | raw | blame | history
src/com/gitblit/SyndicationServlet.java 31 ●●●●● patch | view | raw | blame | history
src/com/gitblit/utils/SyndicationUtils.java 81 ●●●●● patch | view | raw | blame | history
tests/com/gitblit/tests/SyndicationUtilsTest.java 8 ●●●●● patch | view | raw | blame | history
src/com/gitblit/RpcServlet.java
@@ -232,6 +232,7 @@
                List<String> keys = new ArrayList<String>();
                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
src/com/gitblit/SyndicationServlet.java
@@ -18,18 +18,22 @@
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 @@
        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 @@
        response.setContentType("application/rss+xml; charset=UTF-8");
        Repository repository = GitBlit.self().getRepository(repositoryName);
        RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName);
        List<RevCommit> commits = JGitUtils.getRevLog(repository, objectId, 0, length);
        List<RevCommit> 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<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(repository);
        List<SyndicatedEntryModel> entries = new ArrayList<SyndicatedEntryModel>();
        boolean mountParameters = GitBlit.getBoolean(Keys.web.mountParameters, true);
@@ -165,6 +186,14 @@
            entry.content = commit.getFullMessage();
            entry.repository = model.name;
            entry.branch = objectId;
            List<RefModel> refs = allRefs.get(commit.getId());
            if (refs != null && refs.size() > 0) {
                List<String> tags = new ArrayList<String>();
                for (RefModel ref : refs) {
                    tags.add(ref.getName());
                }
                entry.tags = tags;
            }
            entries.add(entry);
        }
        String feedLink;
src/com/gitblit/utils/SyndicationUtils.java
@@ -22,11 +22,15 @@
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 @@
            entry.setLink(entryModel.link);
            entry.setPublishedDate(entryModel.published);
            if (entryModel.tags != null && entryModel.tags.size() > 0) {
                List<SyndCategory> tags = new ArrayList<SyndCategory>();
                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 @@
        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<SyndicatedEntryModel> readSearchFeed(String url, String repository,
            String branch, String fragment, SearchType searchType, int numberOfEntries,
            String username, char[] password) throws IOException {
        // determine parameters
        List<String> parameters = new ArrayList<String>();
        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<SyndicatedEntryModel> readFeed(String url, List<String> 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 @@
            }
        }
        String feedUrl = sb.toString();
        URLConnection conn = ConnectionUtils.openReadConnection(feedUrl, username, password);
        InputStream is = conn.getInputStream();
        SyndFeedInput input = new SyndFeedInput();
@@ -163,6 +234,14 @@
            model.link = entry.getLink();
            model.content = entry.getDescription().getValue();
            model.contentType = entry.getDescription().getType();
            if (entry.getCategories() != null && entry.getCategories().size() > 0) {
                List<String> tags = new ArrayList<String>();
                for (Object p : entry.getCategories()) {
                    SyndCategory cat = (SyndCategory) p;
                    tags.add(cat.getName());
                }
                model.tags = tags;
            }
            entries.add(model);
        }
        return entries;
tests/com/gitblit/tests/SyndicationUtilsTest.java
@@ -57,4 +57,12 @@
        assertTrue(feed.size() > 0);
        assertEquals(5, feed.size());
    }
    public void testSearchFeedRead() throws Exception {
        List<SyndicatedEntryModel> 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());
    }
}