James Moger
2011-11-01 c25a1d65ed2c94b65741d81862a7612ae12bdf76
Branch renderer. String change. Config section name changes.
1 files added
8 files modified
193 ■■■■■ changed files
src/com/gitblit/client/BranchRenderer.java 78 ●●●●● patch | view | raw | blame | history
src/com/gitblit/client/FeedsPanel.java 6 ●●●● patch | view | raw | blame | history
src/com/gitblit/client/GitblitClient.java 4 ●●●● patch | view | raw | blame | history
src/com/gitblit/client/GitblitManager.java 30 ●●●● patch | view | raw | blame | history
src/com/gitblit/client/GitblitPanel.java 11 ●●●● patch | view | raw | blame | history
src/com/gitblit/client/SyndicatedEntryTableModel.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/models/FeedModel.java 19 ●●●●● patch | view | raw | blame | history
src/com/gitblit/utils/SyndicationUtils.java 41 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/GitBlitWebApp.properties 2 ●●● patch | view | raw | blame | history
src/com/gitblit/client/BranchRenderer.java
New file
@@ -0,0 +1,78 @@
/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.client;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.io.Serializable;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.table.TableCellRenderer;
/**
 * Branch renderer displays refs/heads and refs/remotes in a style like the
 * site.
 *
 * @author James Moger
 *
 */
public class BranchRenderer extends JPanel implements TableCellRenderer, Serializable {
    private static final long serialVersionUID = 1L;
    private static final String R_HEADS = "refs/heads/";
    private static final String R_REMOTES = "refs/remotes/";
    private JLabel branchLabel;
    public BranchRenderer() {
        super(new FlowLayout(FlowLayout.CENTER, 0, 1));
        branchLabel = new JLabel();
        branchLabel.setOpaque(true);
        add(branchLabel);
    }
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {
        if (isSelected)
            setBackground(table.getSelectionBackground());
        else
            setBackground(table.getBackground());
        String name = value.toString();
        Color bg = getBackground();
        Border border = null;
        if (name.startsWith(R_HEADS)) {
            bg = Color.decode("#CCFFCC");
            name = name.substring(R_HEADS.length());
            border = new LineBorder(Color.decode("#00CC33"), 1, true);
        } else if (name.startsWith(R_REMOTES)) {
            bg = Color.decode("#CAC2F5");
            name = name.substring(R_REMOTES.length());
            border = new LineBorder(Color.decode("#6C6CBF"), 1, true);
        }
        branchLabel.setText(" " + name + " ");
        branchLabel.setBackground(bg);
        branchLabel.setBorder(border);
        return this;
    }
}
src/com/gitblit/client/FeedsPanel.java
@@ -109,7 +109,7 @@
        NameRenderer nameRenderer = new NameRenderer();
        tableModel = new SyndicatedEntryTableModel();
        header = new HeaderPanel(Translation.get("gb.recentActivity"), "feed_16x16.png");
        header = new HeaderPanel(Translation.get("gb.timeline"), "feed_16x16.png");
        table = Utils.newTable(tableModel, Utils.DATE_FORMAT);
        String name = table.getColumnName(SyndicatedEntryTableModel.Columns.Author.ordinal());
        table.setRowHeight(nameRenderer.getFont().getSize() + 8);
@@ -118,7 +118,7 @@
        table.getColumn(name).setCellRenderer(nameRenderer);
        name = table.getColumnName(SyndicatedEntryTableModel.Columns.Branch.ordinal());
        table.getColumn(name).setCellRenderer(nameRenderer);
        table.getColumn(name).setCellRenderer(new BranchRenderer());
        table.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
@@ -179,7 +179,7 @@
        tableModel.entries.clear();
        tableModel.entries.addAll(gitblit.getSyndicatedEntries());
        tableModel.fireTableDataChanged();
        header.setText(Translation.get("gb.recentActivity") + " ("
        header.setText(Translation.get("gb.timeline") + " ("
                + gitblit.getSyndicatedEntries().size() + ")");
        if (pack) {
            Utils.packColumns(table, Utils.MARGIN);
src/com/gitblit/client/GitblitClient.java
@@ -215,7 +215,7 @@
            for (FeedModel feed : reg.feeds) {
                feed.lastRefresh = new Date();
                List<SyndicatedEntryModel> entries = SyndicationUtils.readFeed(url,
                        feed.repository, feed.branch, feed.maxRetrieval, account, password);
                        feed.repository, feed.branch, -1, account, password);
                allEntries.addAll(entries);
            }
        }
@@ -290,7 +290,7 @@
    public boolean createRepository(RepositoryModel repository, List<String> permittedUsers)
            throws IOException {
        boolean success = true;
        success &= RpcUtils.createRepository(repository, url, account, password);
        success &= RpcUtils.createRepository(repository, url, account, password);
        if (permittedUsers.size() > 0) {
            // if new repository has named members, set them
            success &= RpcUtils.setRepositoryMembers(repository, permittedUsers, url, account,
src/com/gitblit/client/GitblitManager.java
@@ -73,6 +73,8 @@
public class GitblitManager extends JFrame implements RegistrationsDialog.RegistrationListener {
    private static final long serialVersionUID = 1L;
    private static final String SERVER = "server";
    private static final String FEED = "feed";
    private final SimpleDateFormat dateFormat;
    private JTabbedPane serverTabs;
    private File configFile = new File(System.getProperty("user.home"), ".gitblit/config");
@@ -292,24 +294,24 @@
    private void loadRegistrations() {
        try {
            StoredConfig config = getConfig();
            Set<String> servers = config.getSubsections("servers");
            Set<String> servers = config.getSubsections(SERVER);
            for (String server : servers) {
                Date lastLogin = new Date(0);
                String date = config.getString("servers", server, "lastLogin");
                String date = config.getString(SERVER, server, "lastLogin");
                if (!StringUtils.isEmpty(date)) {
                    lastLogin = dateFormat.parse(date);
                }
                String url = config.getString("servers", server, "url");
                String account = config.getString("servers", server, "account");
                String url = config.getString(SERVER, server, "url");
                String account = config.getString(SERVER, server, "account");
                char[] password;
                String pw = config.getString("servers", server, "password");
                String pw = config.getString(SERVER, server, "password");
                if (StringUtils.isEmpty(pw)) {
                    password = new char[0];
                } else {
                    password = new String(Base64.decode(pw)).toCharArray();
                }
                GitblitRegistration reg = new GitblitRegistration(server, url, account, password);
                String[] feeds = config.getStringList("servers", server, "feeds");
                String[] feeds = config.getStringList(SERVER, server, FEED);
                if (feeds != null) {
                    // deserialize the field definitions
                    for (String definition : feeds) {
@@ -332,20 +334,20 @@
            if (!StringUtils.isEmpty(name) && !name.equals(reg.name)) {
                // delete old registration
                registrations.remove(name);
                config.unsetSection("servers", name);
                config.unsetSection(SERVER, name);
            }
            // update registration
            config.setString("servers", reg.name, "url", reg.url);
            config.setString("servers", reg.name, "account", reg.account);
            config.setString(SERVER, reg.name, "url", reg.url);
            config.setString(SERVER, reg.name, "account", reg.account);
            if (reg.savePassword) {
                config.setString("servers", reg.name, "password",
                config.setString(SERVER, reg.name, "password",
                        Base64.encodeBytes(new String(reg.password).getBytes("UTF-8")));
            } else {
                config.setString("servers", reg.name, "password", "");
                config.setString(SERVER, reg.name, "password", "");
            }
            if (reg.lastLogin != null) {
                config.setString("servers", reg.name, "lastLogin", dateFormat.format(reg.lastLogin));
                config.setString(SERVER, reg.name, "lastLogin", dateFormat.format(reg.lastLogin));
            }
            // serialize the feed definitions
            List<String> definitions = new ArrayList<String>();
@@ -353,7 +355,7 @@
                definitions.add(feed.toString());
            }
            if (definitions.size() > 0) {
                config.setStringList("servers", reg.name, "feeds", definitions);
                config.setStringList(SERVER, reg.name, FEED, definitions);
            }
            config.save();
            return true;
@@ -369,7 +371,7 @@
        try {
            StoredConfig config = getConfig();
            for (GitblitRegistration reg : list) {
                config.unsetSection("servers", reg.name);
                config.unsetSection(SERVER, reg.name);
                registrations.remove(reg.name);
            }
            config.save();
src/com/gitblit/client/GitblitPanel.java
@@ -30,8 +30,7 @@
import com.gitblit.models.FeedModel;
/**
 * GitblitPanel performs the login, all business logic, and contains all widgets
 * to represent the state of a repository for the given account credentials.
 * GitblitPanel is a container for the repository, users, settings, etc panels.
 * 
 * @author James Moger
 * 
@@ -62,15 +61,15 @@
        tabs = new JTabbedPane(JTabbedPane.BOTTOM);
        tabs.addTab(Translation.get("gb.repositories"), createRepositoriesPanel());
        tabs.addTab(Translation.get("gb.recentActivity"), createFeedsPanel());
        tabs.addTab(Translation.get("gb.timeline"), createFeedsPanel());
        tabs.addTab(Translation.get("gb.users"), createUsersPanel());
        tabs.addTab(Translation.get("gb.settings"), createSettingsPanel());
        tabs.addTab(Translation.get("gb.status"), createStatusPanel());
        tabs.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                tabs.getSelectedComponent().requestFocus();
                tabs.getSelectedComponent().requestFocus();
            }
        });
        });
        setLayout(new BorderLayout());
        add(tabs, BorderLayout.CENTER);
@@ -145,7 +144,7 @@
            settingsPanel.updateTable(true);
            statusPanel.updateTable(false);
        } else {
            // remove the settings tab
            // remove the settings and status tab
            String[] titles = { Translation.get("gb.settings"), Translation.get("gb.status") };
            for (String title : titles) {
                for (int i = 0; i < tabs.getTabCount(); i++) {
src/com/gitblit/client/SyndicatedEntryTableModel.java
@@ -37,7 +37,7 @@
    List<SyndicatedEntryModel> entries;
    enum Columns {
        Date, Repository, Branch, Author, Message;
        Date, Repository,Author, Message, Branch;
        @Override
        public String toString() {
src/com/gitblit/models/FeedModel.java
@@ -16,9 +16,6 @@
package com.gitblit.models;
import java.io.Serializable;
import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.gitblit.utils.StringUtils;
@@ -32,7 +29,6 @@
    public String repository;
    public String branch;
    public int maxRetrieval;
    public Date lastRefresh;
    public boolean subscribed;
@@ -41,29 +37,26 @@
    public FeedModel() {
        this("");
        subscribed = false;
    }
    public FeedModel(String definition) {
        maxRetrieval = -1;
        subscribed = true;
        lastRefresh = new Date(0);
        String[] fields = definition.split(":");
        repository = fields[0];
        if (fields.length > 1) {
            branch = fields[1];
            maxRetrieval = Integer.parseInt(fields[2]);
            try {
                lastRefresh = new SimpleDateFormat("yyyyMMddHHmmss").parse(fields[3]);
            } catch (ParseException e) {
            }
            subscribed = true;
        }
    }
    @Override
    public String toString() {
        return MessageFormat.format("{0}:{1}:{2,number,0}:{3,date,yyyyMMddHHmmss}", repository,
                branch, maxRetrieval, lastRefresh);
        if (StringUtils.isEmpty(branch)) {
            return repository;
        }
        return repository + ":" + branch;
    }
    @Override
src/com/gitblit/utils/SyndicationUtils.java
@@ -117,27 +117,30 @@
     */
    public static List<SyndicatedEntryModel> readFeed(String url, String repository, String branch,
            int numberOfEntries, String username, char[] password) throws IOException {
        String feedUrl;
        if (StringUtils.isEmpty(branch)) {
            // no branch specified
            if (numberOfEntries > 0) {
                // fixed number of entries
                feedUrl = MessageFormat.format("{0}/feed/{1}?l={2,number,0}", url, repository);
            } else {
                // server default number of entries
                feedUrl = MessageFormat.format("{0}/feed/{1}", url, repository);
            }
        } else {
            // branch specified
            if (numberOfEntries > 0) {
                // fixed number of entries
                feedUrl = MessageFormat.format("{0}/feed/{1}?h={2}&l={3,number,0}", url,
                        repository, branch, numberOfEntries);
            } else {
                // server default number of entries
                feedUrl = MessageFormat.format("{0}/feed/{1}?h={2}", url, repository, branch);
        // build feed url
        List<String> parameters = new ArrayList<String>();
        if (numberOfEntries > 0) {
            parameters.add("l=" + numberOfEntries);
        }
        if (!StringUtils.isEmpty(branch)) {
            parameters.add("h=" + branch);
        }
        StringBuilder sb = new StringBuilder();
        sb.append(MessageFormat.format("{0}/feed/{1}", url, repository));
        if (parameters.size() > 0) {
            boolean first = true;
            for (String parameter : parameters) {
                if (first) {
                    sb.append('?');
                    first = false;
                } else {
                    sb.append('&');
                }
                sb.append(parameter);
            }
        }
        String feedUrl = sb.toString();
        URLConnection conn = ConnectionUtils.openReadConnection(feedUrl, username, password);
        InputStream is = conn.getInputStream();
        SyndFeedInput input = new SyndFeedInput();
src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -177,6 +177,6 @@
gb.version = version
gb.releaseDate = release date
gb.date = date
gb.recentActivity = recent activity
gb.timeline = timeline
gb.subscribe = subscribe
gb.branch = branch