James Moger
2011-11-07 ee458f82b8502e238a96e6582e910cb366059ead
Log feature based on Search dialog. Renamed some classes.
2 files renamed
9 files modified
275 ■■■■■ changed files
build.xml 1 ●●●● patch | view | raw | blame | history
src/com/gitblit/SyndicationServlet.java 6 ●●●● patch | view | raw | blame | history
src/com/gitblit/client/FeedEntryTableModel.java 18 ●●●● patch | view | raw | blame | history
src/com/gitblit/client/FeedsPanel.java 52 ●●●● patch | view | raw | blame | history
src/com/gitblit/client/GitblitClient.java 22 ●●●●● patch | view | raw | blame | history
src/com/gitblit/client/MessageRenderer.java 4 ●●●● patch | view | raw | blame | history
src/com/gitblit/client/RepositoriesPanel.java 28 ●●●● patch | view | raw | blame | history
src/com/gitblit/client/SearchDialog.java 106 ●●●●● patch | view | raw | blame | history
src/com/gitblit/models/FeedEntryModel.java 10 ●●●● patch | view | raw | blame | history
src/com/gitblit/utils/SyndicationUtils.java 16 ●●●● patch | view | raw | blame | history
tests/com/gitblit/tests/SyndicationUtilsTest.java 12 ●●●● patch | view | raw | blame | history
build.xml
@@ -455,6 +455,7 @@
            <resource file="${basedir}/resources/feed_16x16.png" />
            <resource file="${basedir}/resources/bullet_feed.png" />
            <resource file="${basedir}/resources/search-icon.png" />
            <resource file="${basedir}/resources/commit_changes_16x16.png" />
            <resource file="${basedir}/resources/blank.png" />
            <resource file="${basedir}/src/com/gitblit/wicket/GitBlitWebApp.properties" />
                
src/com/gitblit/SyndicationServlet.java
@@ -30,7 +30,7 @@
import com.gitblit.models.RefModel;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.SyndicatedEntryModel;
import com.gitblit.models.FeedEntryModel;
import com.gitblit.utils.HttpUtils;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.StringUtils;
@@ -169,7 +169,7 @@
                    offset, length);
        }
        Map<ObjectId, List<RefModel>> allRefs = JGitUtils.getAllRefs(repository);
        List<SyndicatedEntryModel> entries = new ArrayList<SyndicatedEntryModel>();
        List<FeedEntryModel> entries = new ArrayList<FeedEntryModel>();
        boolean mountParameters = GitBlit.getBoolean(Keys.web.mountParameters, true);
        String urlPattern;
@@ -183,7 +183,7 @@
        String gitblitUrl = HttpUtils.getGitblitURL(request);
        // convert RevCommit to SyndicatedEntryModel
        for (RevCommit commit : commits) {
            SyndicatedEntryModel entry = new SyndicatedEntryModel();
            FeedEntryModel entry = new FeedEntryModel();
            entry.title = commit.getShortMessage();
            entry.author = commit.getAuthorIdent().getName();
            entry.link = MessageFormat.format(urlPattern, gitblitUrl,
src/com/gitblit/client/FeedEntryTableModel.java
File was renamed from src/com/gitblit/client/SyndicatedEntryTableModel.java
@@ -22,7 +22,7 @@
import javax.swing.table.AbstractTableModel;
import com.gitblit.models.SyndicatedEntryModel;
import com.gitblit.models.FeedEntryModel;
/**
 * Table model for a list of retrieved feed entries.
@@ -30,11 +30,11 @@
 * @author James Moger
 * 
 */
public class SyndicatedEntryTableModel extends AbstractTableModel {
public class FeedEntryTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 1L;
    List<SyndicatedEntryModel> entries;
    List<FeedEntryModel> entries;
    enum Columns {
        Date, Repository, Branch, Author, Message;
@@ -45,11 +45,11 @@
        }
    }
    public SyndicatedEntryTableModel() {
        this.entries = new ArrayList<SyndicatedEntryModel>();
    public FeedEntryTableModel() {
        this.entries = new ArrayList<FeedEntryModel>();
    }
    public void setEntries(List<SyndicatedEntryModel> entries) {
    public void setEntries(List<FeedEntryModel> entries) {
        this.entries = entries;
        Collections.sort(entries);
    }
@@ -93,14 +93,14 @@
        if (Columns.Date.ordinal() == columnIndex) {
            return Date.class;
        } else if (Columns.Message.ordinal() == columnIndex) {
            return SyndicatedEntryModel.class;
            return FeedEntryModel.class;
        }
        return String.class;
    }
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        SyndicatedEntryModel entry = entries.get(rowIndex);
        FeedEntryModel entry = entries.get(rowIndex);
        Columns col = Columns.values()[columnIndex];
        switch (col) {
        case Date:
@@ -117,7 +117,7 @@
        return null;
    }
    public SyndicatedEntryModel get(int modelRow) {
    public FeedEntryModel get(int modelRow) {
        return entries.get(modelRow);
    }
}
src/com/gitblit/client/FeedsPanel.java
@@ -43,7 +43,7 @@
import javax.swing.table.TableRowSorter;
import com.gitblit.models.FeedModel;
import com.gitblit.models.SyndicatedEntryModel;
import com.gitblit.models.FeedEntryModel;
import com.gitblit.utils.StringUtils;
/**
@@ -61,9 +61,9 @@
    private final String ALL = "*";
    private SyndicatedEntryTableModel tableModel;
    private FeedEntryTableModel tableModel;
    private TableRowSorter<SyndicatedEntryTableModel> defaultSorter;
    private TableRowSorter<FeedEntryTableModel> defaultSorter;
    private HeaderPanel header;
@@ -155,20 +155,20 @@
        controls.add(viewTree);
        NameRenderer nameRenderer = new NameRenderer();
        tableModel = new SyndicatedEntryTableModel();
        tableModel = new FeedEntryTableModel();
        header = new HeaderPanel(Translation.get("gb.activity"), "feed_16x16.png");
        table = Utils.newTable(tableModel, Utils.DATE_FORMAT);
        defaultSorter = new TableRowSorter<SyndicatedEntryTableModel>(tableModel);
        String name = table.getColumnName(SyndicatedEntryTableModel.Columns.Author.ordinal());
        defaultSorter = new TableRowSorter<FeedEntryTableModel>(tableModel);
        String name = table.getColumnName(FeedEntryTableModel.Columns.Author.ordinal());
        table.setRowHeight(nameRenderer.getFont().getSize() + 8);
        table.getColumn(name).setCellRenderer(nameRenderer);
        name = table.getColumnName(SyndicatedEntryTableModel.Columns.Repository.ordinal());
        name = table.getColumnName(FeedEntryTableModel.Columns.Repository.ordinal());
        table.getColumn(name).setCellRenderer(nameRenderer);
        name = table.getColumnName(SyndicatedEntryTableModel.Columns.Branch.ordinal());
        name = table.getColumnName(FeedEntryTableModel.Columns.Branch.ordinal());
        table.getColumn(name).setCellRenderer(new BranchRenderer());
        name = table.getColumnName(SyndicatedEntryTableModel.Columns.Message.ordinal());
        name = table.getColumnName(FeedEntryTableModel.Columns.Message.ordinal());
        table.getColumn(name).setCellRenderer(new MessageRenderer(gitblit));
        table.addMouseListener(new MouseAdapter() {
@@ -283,7 +283,7 @@
        if (page == 0) {
            // determine unique repositories
            Set<String> uniqueRepositories = new HashSet<String>();
            for (SyndicatedEntryModel entry : tableModel.entries) {
            for (FeedEntryModel entry : tableModel.entries) {
                uniqueRepositories.add(entry.repository);
            }
@@ -310,7 +310,7 @@
        // determine unique repositories and authors
        Set<String> uniqueAuthors = new HashSet<String>();
        for (SyndicatedEntryModel entry : tableModel.entries) {
        for (FeedEntryModel entry : tableModel.entries) {
            if (repository.equals(ALL) || entry.repository.equalsIgnoreCase(repository)) {
                uniqueAuthors.add(entry.author);
            }
@@ -325,25 +325,25 @@
        }
    }
    protected SyndicatedEntryModel getSelectedSyndicatedEntry() {
    protected FeedEntryModel getSelectedSyndicatedEntry() {
        int viewRow = table.getSelectedRow();
        int modelRow = table.convertRowIndexToModel(viewRow);
        SyndicatedEntryModel entry = tableModel.get(modelRow);
        FeedEntryModel entry = tableModel.get(modelRow);
        return entry;
    }
    protected void viewCommit() {
        SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
        FeedEntryModel entry = getSelectedSyndicatedEntry();
        Utils.browse(entry.link);
    }
    protected void viewCommitDiff() {
        SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
        FeedEntryModel entry = getSelectedSyndicatedEntry();
        Utils.browse(entry.link.replace("/commit/", "/commitdiff/"));
    }
    protected void viewTree() {
        SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
        FeedEntryModel entry = getSelectedSyndicatedEntry();
        Utils.browse(entry.link.replace("/commit/", "/tree/"));
    }
@@ -366,30 +366,30 @@
            table.setRowSorter(defaultSorter);
            return;
        }
        final int repositoryIndex = SyndicatedEntryTableModel.Columns.Repository.ordinal();
        final int authorIndex = SyndicatedEntryTableModel.Columns.Author.ordinal();
        RowFilter<SyndicatedEntryTableModel, Object> containsFilter;
        final int repositoryIndex = FeedEntryTableModel.Columns.Repository.ordinal();
        final int authorIndex = FeedEntryTableModel.Columns.Author.ordinal();
        RowFilter<FeedEntryTableModel, Object> containsFilter;
        if (repository.equals(ALL)) {
            // author filter
            containsFilter = new RowFilter<SyndicatedEntryTableModel, Object>() {
            containsFilter = new RowFilter<FeedEntryTableModel, Object>() {
                public boolean include(
                        Entry<? extends SyndicatedEntryTableModel, ? extends Object> entry) {
                        Entry<? extends FeedEntryTableModel, ? extends Object> entry) {
                    return entry.getStringValue(authorIndex).equalsIgnoreCase(author);
                }
            };
        } else if (author.equals(ALL)) {
            // repository filter
            containsFilter = new RowFilter<SyndicatedEntryTableModel, Object>() {
            containsFilter = new RowFilter<FeedEntryTableModel, Object>() {
                public boolean include(
                        Entry<? extends SyndicatedEntryTableModel, ? extends Object> entry) {
                        Entry<? extends FeedEntryTableModel, ? extends Object> entry) {
                    return entry.getStringValue(repositoryIndex).equalsIgnoreCase(repository);
                }
            };
        } else {
            // repository-author filter
            containsFilter = new RowFilter<SyndicatedEntryTableModel, Object>() {
            containsFilter = new RowFilter<FeedEntryTableModel, Object>() {
                public boolean include(
                        Entry<? extends SyndicatedEntryTableModel, ? extends Object> entry) {
                        Entry<? extends FeedEntryTableModel, ? extends Object> entry) {
                    boolean authorMatch = entry.getStringValue(authorIndex)
                            .equalsIgnoreCase(author);
                    boolean repositoryMatch = entry.getStringValue(repositoryIndex)
@@ -398,7 +398,7 @@
                }
            };
        }
        TableRowSorter<SyndicatedEntryTableModel> sorter = new TableRowSorter<SyndicatedEntryTableModel>(
        TableRowSorter<FeedEntryTableModel> sorter = new TableRowSorter<FeedEntryTableModel>(
                tableModel);
        sorter.setRowFilter(containsFilter);
        table.setRowSorter(sorter);
src/com/gitblit/client/GitblitClient.java
@@ -36,7 +36,7 @@
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.ServerSettings;
import com.gitblit.models.ServerStatus;
import com.gitblit.models.SyndicatedEntryModel;
import com.gitblit.models.FeedEntryModel;
import com.gitblit.models.UserModel;
import com.gitblit.utils.RpcUtils;
import com.gitblit.utils.StringUtils;
@@ -77,7 +77,7 @@
    private final List<FeedModel> availableFeeds;
    private final List<SyndicatedEntryModel> syndicatedEntries;
    private final List<FeedEntryModel> syndicatedEntries;
    private final Set<String> subscribedRepositories;
@@ -93,7 +93,7 @@
        this.allRepositories = new ArrayList<RepositoryModel>();
        this.federationRegistrations = new ArrayList<FederationModel>();
        this.availableFeeds = new ArrayList<FeedModel>();
        this.syndicatedEntries = new ArrayList<SyndicatedEntryModel>();
        this.syndicatedEntries = new ArrayList<FeedEntryModel>();
        this.subscribedRepositories = new HashSet<String>();
    }
@@ -247,13 +247,13 @@
        return availableFeeds;
    }
    public List<SyndicatedEntryModel> refreshSubscribedFeeds(int page) throws IOException {
        Set<SyndicatedEntryModel> allEntries = new HashSet<SyndicatedEntryModel>();
    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<SyndicatedEntryModel> entries = SyndicationUtils.readFeed(url,
                List<FeedEntryModel> entries = SyndicationUtils.readFeed(url,
                        feed.repository, feed.branch, -1, page, account, password);
                allEntries.addAll(entries);
            }
@@ -297,11 +297,17 @@
        return subscribedRepositories.contains(repository.name.toLowerCase());
    }
    public List<SyndicatedEntryModel> getSyndicatedEntries() {
    public List<FeedEntryModel> getSyndicatedEntries() {
        return syndicatedEntries;
    }
    public List<SyndicatedEntryModel> search(String repository, String branch, String fragment,
    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);
src/com/gitblit/client/MessageRenderer.java
@@ -28,7 +28,7 @@
import javax.swing.border.LineBorder;
import javax.swing.table.TableCellRenderer;
import com.gitblit.models.SyndicatedEntryModel;
import com.gitblit.models.FeedEntryModel;
/**
 * Message renderer displays the short log message and then any refs in a style
@@ -81,7 +81,7 @@
        if (value == null) {
            return this;
        }
        SyndicatedEntryModel entry = (SyndicatedEntryModel) value;
        FeedEntryModel entry = (FeedEntryModel) value;
        if (gitblit == null) {
            // no gitblit client, just display message
src/com/gitblit/client/RepositoriesPanel.java
@@ -134,12 +134,21 @@
            }
        });
        final JButton logRepository = new JButton(Translation.get("gb.log") + "...");
        logRepository.setEnabled(false);
        logRepository.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                RepositoryModel model = getSelectedRepositories().get(0);
                showSearchDialog(false, model);
            }
        });
        final JButton searchRepository = new JButton(Translation.get("gb.search") + "...");
        searchRepository.setEnabled(false);
        searchRepository.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                RepositoryModel model = getSelectedRepositories().get(0);
                searchRepository(model);
                showSearchDialog(true, model);
            }
        });
@@ -173,18 +182,20 @@
                    return;
                }
                boolean singleSelection = table.getSelectedRowCount() == 1;
                boolean selected = table.getSelectedRow() > -1;
                boolean selected = table.getSelectedRow() > -1;
                if (singleSelection) {
                    RepositoryModel repository = getSelectedRepositories().get(0);
                    browseRepository.setEnabled(repository.hasCommits);
                    logRepository.setEnabled(repository.hasCommits);
                    searchRepository.setEnabled(repository.hasCommits);
                    subscribeRepository.setEnabled(repository.hasCommits);
                } else {
                    browseRepository.setEnabled(false);
                    logRepository.setEnabled(false);
                    searchRepository.setEnabled(false);
                    subscribeRepository.setEnabled(false);
                }
                delRepository.setEnabled(selected);
                delRepository.setEnabled(selected);
                if (selected) {
                    int viewRow = table.getSelectedRow();
                    int modelRow = table.convertRowIndexToModel(viewRow);
@@ -233,6 +244,7 @@
        repositoryControls.add(editRepository);
        repositoryControls.add(delRepository);
        repositoryControls.add(subscribeRepository);
        repositoryControls.add(logRepository);
        repositoryControls.add(searchRepository);
        setLayout(new BorderLayout(Utils.MARGIN, Utils.MARGIN));
@@ -467,12 +479,12 @@
        }
    }
    protected void searchRepository(final RepositoryModel repository) {
        SearchDialog searchDialog = new SearchDialog(gitblit);
    private void showSearchDialog(boolean isSearch, final RepositoryModel repository) {
        final SearchDialog dialog = new SearchDialog(gitblit, isSearch);
        if (repository != null) {
            searchDialog.selectRepository(repository);
            dialog.selectRepository(repository);
        }
        searchDialog.setLocationRelativeTo(this);
        searchDialog.setVisible(true);
        dialog.setLocationRelativeTo(this);
        dialog.setVisible(true);
    }
}
src/com/gitblit/client/SearchDialog.java
@@ -44,7 +44,7 @@
import com.gitblit.Constants;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.SyndicatedEntryModel;
import com.gitblit.models.FeedEntryModel;
import com.gitblit.utils.StringUtils;
/**
@@ -58,9 +58,11 @@
    private static final long serialVersionUID = 1L;
    private final boolean isSearch;
    private final GitblitClient gitblit;
    private SyndicatedEntryTableModel tableModel;
    private FeedEntryTableModel tableModel;
    private HeaderPanel header;
@@ -84,13 +86,15 @@
    private JButton next;
    public SearchDialog(GitblitClient gitblit) {
    public SearchDialog(GitblitClient gitblit, boolean isSearch) {
        super();
        this.gitblit = gitblit;
        setTitle(Translation.get("gb.search"));
        setIconImage(new ImageIcon(getClass().getResource("/gitblt-favicon.png")).getImage());
        this.isSearch = isSearch;
        setTitle(Translation.get(isSearch ? "gb.search" : "gb.log"));
        setIconImage(new ImageIcon(getClass().getResource(
                isSearch ? "/gitblt-favicon.png" : "/commit_changes_16x16.png")).getImage());
        initialize();
        setSize(900, 400);
        setSize(900, 550);
    }
    private void initialize() {
@@ -113,7 +117,7 @@
            }
        });
        final JButton search = new JButton(Translation.get("gb.search"));
        final JButton search = new JButton(Translation.get(isSearch ? "gb.search" : "gb.refresh"));
        search.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                search(0);
@@ -150,20 +154,21 @@
        controls.add(viewTree);
        NameRenderer nameRenderer = new NameRenderer();
        tableModel = new SyndicatedEntryTableModel();
        header = new HeaderPanel(Translation.get("gb.search"), "search-icon.png");
        tableModel = new FeedEntryTableModel();
        header = new HeaderPanel(Translation.get(isSearch ? "gb.search" : "gb.log"),
                isSearch ? "search-icon.png" : "commit_changes_16x16.png");
        table = Utils.newTable(tableModel, Utils.DATE_FORMAT);
        String name = table.getColumnName(SyndicatedEntryTableModel.Columns.Author.ordinal());
        String name = table.getColumnName(FeedEntryTableModel.Columns.Author.ordinal());
        table.setRowHeight(nameRenderer.getFont().getSize() + 8);
        table.getColumn(name).setCellRenderer(nameRenderer);
        name = table.getColumnName(SyndicatedEntryTableModel.Columns.Repository.ordinal());
        name = table.getColumnName(FeedEntryTableModel.Columns.Repository.ordinal());
        table.getColumn(name).setCellRenderer(nameRenderer);
        name = table.getColumnName(SyndicatedEntryTableModel.Columns.Branch.ordinal());
        name = table.getColumnName(FeedEntryTableModel.Columns.Branch.ordinal());
        table.getColumn(name).setCellRenderer(new BranchRenderer());
        name = table.getColumnName(SyndicatedEntryTableModel.Columns.Message.ordinal());
        name = table.getColumnName(FeedEntryTableModel.Columns.Message.ordinal());
        table.getColumn(name).setCellRenderer(new MessageRenderer());
        table.addMouseListener(new MouseAdapter() {
@@ -220,7 +225,7 @@
        branchChoices = new DefaultComboBoxModel();
        branchSelector = new JComboBox(branchChoices);
        branchSelector.setRenderer(new BranchRenderer());
        branchSelector.setRenderer(new BranchRenderer());
        searchTypeSelector = new JComboBox(Constants.SearchType.values());
        searchTypeSelector.setSelectedItem(Constants.SearchType.COMMIT);
@@ -240,8 +245,10 @@
        queryPanel.add(repositorySelector);
        queryPanel.add(new JLabel(Translation.get("gb.branch")));
        queryPanel.add(branchSelector);
        queryPanel.add(new JLabel(Translation.get("gb.type")));
        queryPanel.add(searchTypeSelector);
        if (isSearch) {
            queryPanel.add(new JLabel(Translation.get("gb.type")));
            queryPanel.add(searchTypeSelector);
        }
        queryPanel.add(new JLabel(Translation.get("gb.maxHits")));
        queryPanel.add(maxHitsSelector);
@@ -252,9 +259,10 @@
        JPanel northControls = new JPanel(new BorderLayout(Utils.MARGIN, Utils.MARGIN));
        northControls.add(queryPanel, BorderLayout.WEST);
        northControls.add(searchFragment, BorderLayout.CENTER);
        if (isSearch) {
            northControls.add(searchFragment, BorderLayout.CENTER);
        }
        northControls.add(actionsPanel, BorderLayout.EAST);
        JPanel northPanel = new JPanel(new BorderLayout(0, Utils.MARGIN));
        northPanel.add(header, BorderLayout.NORTH);
@@ -275,17 +283,19 @@
        contentPanel.add(controls, BorderLayout.SOUTH);
        setLayout(new BorderLayout());
        add(contentPanel, BorderLayout.CENTER);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent event) {
                searchFragment.requestFocus();
            }
        if (isSearch) {
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowOpened(WindowEvent event) {
                    searchFragment.requestFocus();
                }
            @Override
            public void windowActivated(WindowEvent event) {
                searchFragment.requestFocus();
            }
        });
                @Override
                public void windowActivated(WindowEvent event) {
                    searchFragment.requestFocus();
                }
            });
        }
    }
    public void selectRepository(RepositoryModel repository) {
@@ -311,25 +321,33 @@
                .getSelectedItem().toString() : null;
        final Constants.SearchType searchType = (Constants.SearchType) searchTypeSelector
                .getSelectedItem();
        final String fragment = searchFragment.getText();
        final String fragment = isSearch ? searchFragment.getText() : null;
        final int maxEntryCount = maxHitsSelector.getSelectedIndex() > -1 ? ((Integer) maxHitsSelector
                .getSelectedItem()) : -1;
        if (StringUtils.isEmpty(fragment)) {
        if (isSearch && StringUtils.isEmpty(fragment)) {
            return;
        }
        SwingWorker<List<SyndicatedEntryModel>, Void> worker = new SwingWorker<List<SyndicatedEntryModel>, Void>() {
        SwingWorker<List<FeedEntryModel>, Void> worker = new SwingWorker<List<FeedEntryModel>, Void>() {
            @Override
            protected List<SyndicatedEntryModel> doInBackground() throws IOException {
                return gitblit
                        .search(repository, branch, fragment, searchType, maxEntryCount, page);
            protected List<FeedEntryModel> doInBackground() throws IOException {
                if (isSearch) {
                    return gitblit.search(repository, branch, fragment, searchType, maxEntryCount,
                            page);
                } else {
                    return gitblit.log(repository, branch, maxEntryCount, page);
                }
            }
            @Override
            protected void done() {
                try {
                    List<SyndicatedEntryModel> results = get();
                    updateTable(true, fragment, results);
                    List<FeedEntryModel> results = get();
                    if (isSearch) {
                        updateTable(true, fragment, results);
                    } else {
                        updateTable(true, branch == null ? "" : branch, results);
                    }
                } catch (Throwable t) {
                    Utils.showException(SearchDialog.this, t);
                }
@@ -338,12 +356,12 @@
        worker.execute();
    }
    protected void updateTable(boolean pack, String fragment, List<SyndicatedEntryModel> entries) {
    protected void updateTable(boolean pack, String text, List<FeedEntryModel> entries) {
        tableModel.entries.clear();
        tableModel.entries.addAll(entries);
        tableModel.fireTableDataChanged();
        setTitle(Translation.get("gb.search") + ": " + fragment + " (" + entries.size()
                + (page > 0 ? (", pg " + (page + 1)) : "") + ")");
        setTitle(Translation.get(isSearch ? "gb.search" : "gb.log") + ": " + text + " ("
                + entries.size() + (page > 0 ? (", pg " + (page + 1)) : "") + ")");
        header.setText(getTitle());
        if (pack) {
            Utils.packColumns(table, Utils.MARGIN);
@@ -356,25 +374,25 @@
        prev.setEnabled(page > 0);
    }
    protected SyndicatedEntryModel getSelectedSyndicatedEntry() {
    protected FeedEntryModel getSelectedSyndicatedEntry() {
        int viewRow = table.getSelectedRow();
        int modelRow = table.convertRowIndexToModel(viewRow);
        SyndicatedEntryModel entry = tableModel.get(modelRow);
        FeedEntryModel entry = tableModel.get(modelRow);
        return entry;
    }
    protected void viewCommit() {
        SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
        FeedEntryModel entry = getSelectedSyndicatedEntry();
        Utils.browse(entry.link);
    }
    protected void viewCommitDiff() {
        SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
        FeedEntryModel entry = getSelectedSyndicatedEntry();
        Utils.browse(entry.link.replace("/commit/", "/commitdiff/"));
    }
    protected void viewTree() {
        SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
        FeedEntryModel entry = getSelectedSyndicatedEntry();
        Utils.browse(entry.link.replace("/commit/", "/tree/"));
    }
}
src/com/gitblit/models/FeedEntryModel.java
File was renamed from src/com/gitblit/models/SyndicatedEntryModel.java
@@ -20,11 +20,11 @@
import java.util.List;
/**
 * SyndicationEntryModel represents an entry in a syndication (RSS) feed.
 * FeedEntryModel represents an entry in a syndication (RSS) feed.
 * 
 * @author James Moger
 */
public class SyndicatedEntryModel implements Serializable, Comparable<SyndicatedEntryModel> {
public class FeedEntryModel implements Serializable, Comparable<FeedEntryModel> {
    public String repository;
    public String branch;
@@ -38,11 +38,11 @@
    private static final long serialVersionUID = 1L;
    public SyndicatedEntryModel() {
    public FeedEntryModel() {
    }
    @Override
    public int compareTo(SyndicatedEntryModel o) {
    public int compareTo(FeedEntryModel o) {
        return o.published.compareTo(published);
    }
@@ -53,7 +53,7 @@
    @Override
    public boolean equals(Object o) {
        if (o instanceof SyndicatedEntryModel) {
        if (o instanceof FeedEntryModel) {
            return hashCode() == o.hashCode();
        }
        return false;
src/com/gitblit/utils/SyndicationUtils.java
@@ -26,7 +26,7 @@
import com.gitblit.Constants;
import com.gitblit.GitBlitException;
import com.gitblit.models.SyndicatedEntryModel;
import com.gitblit.models.FeedEntryModel;
import com.sun.syndication.feed.synd.SyndCategory;
import com.sun.syndication.feed.synd.SyndCategoryImpl;
import com.sun.syndication.feed.synd.SyndContent;
@@ -63,7 +63,7 @@
     * @throws FeedException
     */
    public static void toRSS(String hostUrl, String feedLink, String title, String description,
            String repository, List<SyndicatedEntryModel> entryModels, OutputStream os)
            String repository, List<FeedEntryModel> entryModels, OutputStream os)
            throws IOException, FeedException {
        SyndFeed feed = new SyndFeedImpl();
@@ -79,7 +79,7 @@
        feed.setImage(image);
        List<SyndEntry> entries = new ArrayList<SyndEntry>();
        for (SyndicatedEntryModel entryModel : entryModels) {
        for (FeedEntryModel entryModel : entryModels) {
            SyndEntry entry = new SyndEntryImpl();
            entry.setTitle(entryModel.title);
            entry.setAuthor(entryModel.author);
@@ -130,7 +130,7 @@
     * @return a list of SyndicationModel entries
     * @throws {@link IOException}
     */
    public static List<SyndicatedEntryModel> readFeed(String url, String repository, String branch,
    public static List<FeedEntryModel> readFeed(String url, String repository, String branch,
            int numberOfEntries, int page, String username, char[] password) throws IOException {
        // build feed url
        List<String> parameters = new ArrayList<String>();
@@ -167,7 +167,7 @@
     * @return a list of SyndicationModel entries
     * @throws {@link IOException}
     */
    public static List<SyndicatedEntryModel> readSearchFeed(String url, String repository,
    public static List<FeedEntryModel> readSearchFeed(String url, String repository,
            String branch, String fragment, Constants.SearchType searchType, int numberOfEntries,
            int page, String username, char[] password) throws IOException {
        // determine parameters
@@ -202,7 +202,7 @@
     * @return a list of SyndicationModel entries
     * @throws {@link IOException}
     */
    private static List<SyndicatedEntryModel> readFeed(String url, List<String> parameters,
    private static List<FeedEntryModel> readFeed(String url, List<String> parameters,
            String repository, String branch, String username, char[] password) throws IOException {
        // build url
        StringBuilder sb = new StringBuilder();
@@ -230,10 +230,10 @@
            throw new GitBlitException(f);
        }
        is.close();
        List<SyndicatedEntryModel> entries = new ArrayList<SyndicatedEntryModel>();
        List<FeedEntryModel> entries = new ArrayList<FeedEntryModel>();
        for (Object o : feed.getEntries()) {
            SyndEntryImpl entry = (SyndEntryImpl) o;
            SyndicatedEntryModel model = new SyndicatedEntryModel();
            FeedEntryModel model = new FeedEntryModel();
            model.repository = repository;
            model.branch = branch;
            model.title = entry.getTitle();
tests/com/gitblit/tests/SyndicationUtilsTest.java
@@ -25,15 +25,15 @@
import junit.framework.TestCase;
import com.gitblit.Constants.SearchType;
import com.gitblit.models.SyndicatedEntryModel;
import com.gitblit.models.FeedEntryModel;
import com.gitblit.utils.SyndicationUtils;
public class SyndicationUtilsTest extends TestCase {
    public void testSyndication() throws Exception {
        List<SyndicatedEntryModel> entries = new ArrayList<SyndicatedEntryModel>();
        List<FeedEntryModel> entries = new ArrayList<FeedEntryModel>();
        for (int i = 0; i < 10; i++) {
            SyndicatedEntryModel entry = new SyndicatedEntryModel();
            FeedEntryModel entry = new FeedEntryModel();
            entry.title = "Title " + i;
            entry.author = "Author " + i;
            entry.link = "Link " + i;
@@ -61,13 +61,13 @@
    public void testFeedRead() throws Exception {
        Set<String> links = new HashSet<String>();
        for (int i = 0; i < 2; i++) {
            List<SyndicatedEntryModel> feed = SyndicationUtils.readFeed(GitBlitSuite.url,
            List<FeedEntryModel> feed = SyndicationUtils.readFeed(GitBlitSuite.url,
                    "ticgit.git", "master", 5, i, GitBlitSuite.account,
                    GitBlitSuite.password.toCharArray());
            assertTrue(feed != null);
            assertTrue(feed.size() > 0);
            assertEquals(5, feed.size());
            for (SyndicatedEntryModel entry : feed) {
            for (FeedEntryModel entry : feed) {
                links.add(entry.link);
            }
        }
@@ -76,7 +76,7 @@
    }
    public void testSearchFeedRead() throws Exception {
        List<SyndicatedEntryModel> feed = SyndicationUtils.readSearchFeed(GitBlitSuite.url,
        List<FeedEntryModel> feed = SyndicationUtils.readSearchFeed(GitBlitSuite.url,
                "ticgit.git", null, "test", null, 5, 0, GitBlitSuite.account,
                GitBlitSuite.password.toCharArray());
        assertTrue(feed != null);