From c25a1d65ed2c94b65741d81862a7612ae12bdf76 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Tue, 01 Nov 2011 18:19:44 -0400
Subject: [PATCH] Branch renderer. String change. Config section name changes.

---
 src/com/gitblit/client/SyndicatedEntryTableModel.java |    2 
 src/com/gitblit/utils/SyndicationUtils.java           |   41 +++++----
 src/com/gitblit/wicket/GitBlitWebApp.properties       |    2 
 src/com/gitblit/client/BranchRenderer.java            |   78 +++++++++++++++++++
 src/com/gitblit/client/GitblitClient.java             |    4 
 src/com/gitblit/models/FeedModel.java                 |   19 +---
 src/com/gitblit/client/GitblitPanel.java              |   11 +-
 src/com/gitblit/client/FeedsPanel.java                |    6 
 src/com/gitblit/client/GitblitManager.java            |   30 ++++---
 9 files changed, 134 insertions(+), 59 deletions(-)

diff --git a/src/com/gitblit/client/BranchRenderer.java b/src/com/gitblit/client/BranchRenderer.java
new file mode 100644
index 0000000..f9c9f36
--- /dev/null
+++ b/src/com/gitblit/client/BranchRenderer.java
@@ -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;
+	}
+}
\ No newline at end of file
diff --git a/src/com/gitblit/client/FeedsPanel.java b/src/com/gitblit/client/FeedsPanel.java
index e2b8527..c6b464d 100644
--- a/src/com/gitblit/client/FeedsPanel.java
+++ b/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);
diff --git a/src/com/gitblit/client/GitblitClient.java b/src/com/gitblit/client/GitblitClient.java
index a432c13..2a08b85 100644
--- a/src/com/gitblit/client/GitblitClient.java
+++ b/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,
diff --git a/src/com/gitblit/client/GitblitManager.java b/src/com/gitblit/client/GitblitManager.java
index f4ca7c5..22f98eb 100644
--- a/src/com/gitblit/client/GitblitManager.java
+++ b/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();
diff --git a/src/com/gitblit/client/GitblitPanel.java b/src/com/gitblit/client/GitblitPanel.java
index 6c65328..f675b4a 100644
--- a/src/com/gitblit/client/GitblitPanel.java
+++ b/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++) {
diff --git a/src/com/gitblit/client/SyndicatedEntryTableModel.java b/src/com/gitblit/client/SyndicatedEntryTableModel.java
index db62b1a..73783a5 100644
--- a/src/com/gitblit/client/SyndicatedEntryTableModel.java
+++ b/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() {
diff --git a/src/com/gitblit/models/FeedModel.java b/src/com/gitblit/models/FeedModel.java
index bed0a9c..d553585 100644
--- a/src/com/gitblit/models/FeedModel.java
+++ b/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
diff --git a/src/com/gitblit/utils/SyndicationUtils.java b/src/com/gitblit/utils/SyndicationUtils.java
index 6ea5f0e..9aedeb4 100644
--- a/src/com/gitblit/utils/SyndicationUtils.java
+++ b/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();
diff --git a/src/com/gitblit/wicket/GitBlitWebApp.properties b/src/com/gitblit/wicket/GitBlitWebApp.properties
index 6d20a72..96a5bc8 100644
--- a/src/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/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
\ No newline at end of file

--
Gitblit v1.9.1