From 19c634873b49dea8b49fc54ca393153f7eb0eb35 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sun, 02 Oct 2011 16:56:34 -0400
Subject: [PATCH] Skeleton Gitblit Client app using the json rpc api.

---
 src/com/gitblit/client/GitblitClient.java     |  103 +++++++++++++++++
 src/com/gitblit/client/GitblitPanel.java      |  112 ++++++++++++++++++
 src/com/gitblit/client/DateCellRenderer.java  |   44 +++++++
 src/com/gitblit/client/RepositoriesModel.java |  101 ++++++++++++++++
 4 files changed, 360 insertions(+), 0 deletions(-)

diff --git a/src/com/gitblit/client/DateCellRenderer.java b/src/com/gitblit/client/DateCellRenderer.java
new file mode 100644
index 0000000..591926b
--- /dev/null
+++ b/src/com/gitblit/client/DateCellRenderer.java
@@ -0,0 +1,44 @@
+/*
+ * 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.Component;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+
+public class DateCellRenderer extends DefaultTableCellRenderer {
+
+	private static final long serialVersionUID = 1L;
+
+	private final String pattern;
+
+	public DateCellRenderer(String pattern) {
+		this.pattern = (pattern == null ? "yyyy-MM-dd HH:mm" : pattern);
+	}
+
+	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
+			boolean hasFocus, int row, int column) {
+		super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+		if (value instanceof Date) {
+			String strDate = new SimpleDateFormat(pattern).format((Date) value);
+			this.setText(strDate);
+		}
+		return this;
+	}
+}
\ No newline at end of file
diff --git a/src/com/gitblit/client/GitblitClient.java b/src/com/gitblit/client/GitblitClient.java
new file mode 100644
index 0000000..d10cede
--- /dev/null
+++ b/src/com/gitblit/client/GitblitClient.java
@@ -0,0 +1,103 @@
+/*
+ * 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.BorderLayout;
+import java.awt.EventQueue;
+import java.awt.Menu;
+import java.awt.MenuBar;
+import java.awt.MenuItem;
+import java.awt.MenuShortcut;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.io.IOException;
+
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+
+import com.gitblit.Constants;
+import com.gitblit.utils.StringUtils;
+
+public class GitblitClient extends JFrame {
+
+	private static final long serialVersionUID = 1L;
+	private JTabbedPane serverTabs;
+
+	private GitblitClient() {
+		super();
+	}
+
+	private void initialize() {
+		setupMenu();
+		setContentPane(getCenterPanel());
+
+		setTitle("Gitblit Client v" + Constants.VERSION + " (" + Constants.VERSION_DATE + ")");
+		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		setSize(800, 600);
+		setLocationRelativeTo(null);
+	}
+
+	private void setupMenu() {
+		MenuBar menuBar = new MenuBar();
+		setMenuBar(menuBar);
+		Menu serversMenu = new Menu("Servers");
+		menuBar.add(serversMenu);
+		MenuItem login = new MenuItem("Login...", new MenuShortcut(KeyEvent.VK_L, false));
+		login.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent event) {
+				String url = JOptionPane.showInputDialog(GitblitClient.this,
+						"Please enter Gitblit server URL", "https://localhost:8443");
+				if (StringUtils.isEmpty(url)) {
+					return;
+				}
+				login(url, "admin", "admin".toCharArray());
+			}
+		});
+		serversMenu.add(login);
+	}
+
+	private JPanel getCenterPanel() {
+		serverTabs = new JTabbedPane(JTabbedPane.TOP);
+		JPanel panel = new JPanel(new BorderLayout());
+		panel.add(serverTabs, BorderLayout.CENTER);
+		return panel;
+	}
+
+	private void login(String url, String account, char[] password) {
+		try {
+			GitblitPanel panel = new GitblitPanel(url, account, password);
+			panel.login();
+			serverTabs.addTab(url.substring(url.indexOf("//") + 2), panel);
+			serverTabs.setSelectedIndex(serverTabs.getTabCount() - 1);
+		} catch (IOException e) {
+			JOptionPane.showMessageDialog(GitblitClient.this, e.getMessage(), "Error",
+					JOptionPane.ERROR_MESSAGE);
+		}
+	}
+
+	public static void main(String[] args) {
+		EventQueue.invokeLater(new Runnable() {
+			public void run() {
+				GitblitClient frame = new GitblitClient();
+				frame.initialize();
+				frame.setVisible(true);
+			}
+		});
+	}
+}
diff --git a/src/com/gitblit/client/GitblitPanel.java b/src/com/gitblit/client/GitblitPanel.java
new file mode 100644
index 0000000..911ec0c
--- /dev/null
+++ b/src/com/gitblit/client/GitblitPanel.java
@@ -0,0 +1,112 @@
+/*
+ * 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.BorderLayout;
+import java.awt.Component;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Map;
+
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableColumnModel;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
+
+import com.gitblit.models.RepositoryModel;
+import com.gitblit.utils.RpcUtils;
+
+public class GitblitPanel extends JPanel {
+
+	private static final long serialVersionUID = 1L;
+
+	String url;
+	String account;
+	char[] password;
+
+	JTabbedPane tabs;
+
+	private JTable repositoriesTable;
+
+	public GitblitPanel(String url, String account, char[] password) {
+		this.url = url;
+		this.account = account;
+		this.password = password;
+
+		tabs = new JTabbedPane(JTabbedPane.TOP);
+		repositoriesTable = new JTable();
+		repositoriesTable.setDefaultRenderer(Date.class, new DateCellRenderer(null));
+
+		tabs.addTab("Repositories", new JScrollPane(repositoriesTable));
+
+		setLayout(new BorderLayout());
+		add(tabs, BorderLayout.CENTER);
+	}
+
+	public void login() throws IOException {
+		refreshRepositoriesTable();
+	}
+
+	private void refreshRepositoriesTable() throws IOException {
+		Map<String, RepositoryModel> repositories = RpcUtils
+				.getRepositories(url, account, password);
+		repositoriesTable.setModel(new RepositoriesModel(repositories));
+
+		packColumns(repositoriesTable, 2);
+	}
+
+	private void packColumns(JTable table, int margin) {
+		for (int c = 0; c < table.getColumnCount(); c++) {
+			packColumn(table, c, 4);
+		}
+	}
+
+	// Sets the preferred width of the visible column specified by vColIndex.
+	// The column will be just wide enough to show the column head and the
+	// widest cell in the column. margin pixels are added to the left and right
+	// (resulting in an additional width of 2*margin pixels).
+	private void packColumn(JTable table, int vColIndex, int margin) {
+		DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel();
+		TableColumn col = colModel.getColumn(vColIndex);
+		int width = 0;
+
+		// Get width of column header
+		TableCellRenderer renderer = col.getHeaderRenderer();
+		if (renderer == null) {
+			renderer = table.getTableHeader().getDefaultRenderer();
+		}
+		Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false,
+				false, 0, 0);
+		width = comp.getPreferredSize().width;
+
+		// Get maximum width of column data
+		for (int r = 0; r < table.getRowCount(); r++) {
+			renderer = table.getCellRenderer(r, vColIndex);
+			comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex),
+					false, false, r, vColIndex);
+			width = Math.max(width, comp.getPreferredSize().width);
+		}
+
+		// Add margin
+		width += 2 * margin;
+
+		// Set the width
+		col.setPreferredWidth(width);
+	}
+}
diff --git a/src/com/gitblit/client/RepositoriesModel.java b/src/com/gitblit/client/RepositoriesModel.java
new file mode 100644
index 0000000..2a439fb
--- /dev/null
+++ b/src/com/gitblit/client/RepositoriesModel.java
@@ -0,0 +1,101 @@
+/*
+ * 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.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.table.AbstractTableModel;
+
+import com.gitblit.models.RepositoryModel;
+
+public class RepositoriesModel extends AbstractTableModel {
+
+	private static final long serialVersionUID = 1L;
+
+	Map<String, RepositoryModel> repositories;
+
+	List<RepositoryModel> list;
+
+	enum Columns {
+		Name, Description, Owner, Last_Change, Size;
+
+		@Override
+		public String toString() {
+			return name().replace('_', ' ');
+		}
+	}
+
+	public RepositoriesModel(Map<String, RepositoryModel> repositories) {
+		this.repositories = repositories;
+		list = new ArrayList<RepositoryModel>(repositories.values());
+		Collections.sort(list);
+	}
+
+	@Override
+	public int getRowCount() {
+		return repositories.size();
+	}
+
+	@Override
+	public int getColumnCount() {
+		return Columns.values().length;
+	}
+
+	@Override
+	public String getColumnName(int column) {
+		Columns col = Columns.values()[column];
+		return col.toString();
+	}
+
+	/**
+	 * Returns <code>Object.class</code> regardless of <code>columnIndex</code>.
+	 * 
+	 * @param columnIndex
+	 *            the column being queried
+	 * @return the Object.class
+	 */
+	public Class<?> getColumnClass(int columnIndex) {
+		Columns col = Columns.values()[columnIndex];
+		switch (col) {
+		case Last_Change:
+			return Date.class;
+		}
+		return String.class;
+	}
+
+	@Override
+	public Object getValueAt(int rowIndex, int columnIndex) {
+		RepositoryModel model = list.get(rowIndex);
+		Columns col = Columns.values()[columnIndex];
+		switch (col) {
+		case Name:
+			return model.name;
+		case Description:
+			return model.description;
+		case Owner:
+			return model.owner;
+		case Last_Change:
+			return model.lastChange;
+		case Size:
+			return model.size;
+		}
+		return null;
+	}
+}

--
Gitblit v1.9.1