From 27ae9095639bb228a1b7ff86a3ebe4264abf05be Mon Sep 17 00:00:00 2001
From: mschaefers <mschaefers@scoop-gmbh.de>
Date: Thu, 29 Nov 2012 12:33:09 -0500
Subject: [PATCH] feature: when using LdapUserService one can configure Gitblit to fetch all users from ldap that can possibly login. This allows to see newly generated LDAP users instantly in Gitblit. By now an LDAP user had to log in once to appear in GitBlit.

---
 src/com/gitblit/client/GitblitManager.java |   86 +++++++++++++++++++++++++++++++++++-------
 1 files changed, 71 insertions(+), 15 deletions(-)

diff --git a/src/com/gitblit/client/GitblitManager.java b/src/com/gitblit/client/GitblitManager.java
index f4ca7c5..dd0315f 100644
--- a/src/com/gitblit/client/GitblitManager.java
+++ b/src/com/gitblit/client/GitblitManager.java
@@ -25,7 +25,10 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.net.ConnectException;
 import java.text.MessageFormat;
@@ -34,6 +37,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
@@ -73,6 +77,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 +298,30 @@
 	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");
+				GitblitRegistration reg = new GitblitRegistration(server, url, account, password) {
+					private static final long serialVersionUID = 1L;
+
+					protected void cacheFeeds() {
+						writeFeedCache(this);
+					}
+				};
+				String[] feeds = config.getStringList(SERVER, server, FEED);
 				if (feeds != null) {
 					// deserialize the field definitions
 					for (String definition : feeds) {
@@ -318,6 +330,7 @@
 					}
 				}
 				reg.lastLogin = lastLogin;
+				loadFeedCache(reg);
 				registrations.put(reg.name, reg);
 			}
 		} catch (Throwable t) {
@@ -332,20 +345,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 +366,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 +382,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();
@@ -386,6 +399,49 @@
 		return config;
 	}
 
+	private void loadFeedCache(GitblitRegistration reg) {
+		File feedCache = new File(configFile.getParentFile(), StringUtils.getSHA1(reg.toString())
+				+ ".cache");
+		if (!feedCache.exists()) {
+			// no cache for this registration
+			return;
+		}
+		try {
+			BufferedReader reader = new BufferedReader(new FileReader(feedCache));
+			Map<String, Date> cache = new HashMap<String, Date>();
+			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+			String line = null;
+			while ((line = reader.readLine()) != null) {
+				String[] kvp = line.split("=");
+				cache.put(kvp[0], df.parse(kvp[1]));
+			}
+			reader.close();
+			for (FeedModel feed : reg.feeds) {
+				String name = feed.toString();
+				if (cache.containsKey(name)) {
+					feed.currentRefreshDate = cache.get(name);
+				}
+			}
+		} catch (Exception e) {
+			Utils.showException(GitblitManager.this, e);
+		}
+	}
+
+	private void writeFeedCache(GitblitRegistration reg) {
+		try {
+			File feedCache = new File(configFile.getParentFile(), StringUtils.getSHA1(reg
+					.toString()) + ".cache");
+			FileWriter writer = new FileWriter(feedCache);
+			for (FeedModel feed : reg.feeds) {
+				writer.append(MessageFormat.format("{0}={1,date,yyyy-MM-dd'T'HH:mm:ss}\n",
+						feed.toString(), feed.currentRefreshDate));
+			}
+			writer.close();
+		} catch (Exception e) {
+			Utils.showException(GitblitManager.this, e);
+		}
+	}
+
 	public static void main(String[] args) {
 		EventQueue.invokeLater(new Runnable() {
 			public void run() {

--
Gitblit v1.9.1