From f6cbed8bf3fd630f1d02832240e93fa89dd118e3 Mon Sep 17 00:00:00 2001
From: Pierre-yves Baloche <p-y.baloche@novia-systems.fr>
Date: Fri, 06 Mar 2015 11:39:39 -0500
Subject: [PATCH] Setting up a checksum on user and team instances to lower connection delay

---
 src/main/java/com/gitblit/auth/AuthenticationProvider.java |   81 +++++++++++++++++++++++++++++++++-------
 1 files changed, 66 insertions(+), 15 deletions(-)

diff --git a/src/main/java/com/gitblit/auth/AuthenticationProvider.java b/src/main/java/com/gitblit/auth/AuthenticationProvider.java
index 29051df..6205fd7 100644
--- a/src/main/java/com/gitblit/auth/AuthenticationProvider.java
+++ b/src/main/java/com/gitblit/auth/AuthenticationProvider.java
@@ -15,7 +15,13 @@
  */
 package com.gitblit.auth;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -77,25 +83,70 @@
 		}
 	}
 
+	/**
+	 * Utility method to calculate the checksum of an object.
+	 * @param sourceObject The object from which to establish the checksum.
+	 * @return The checksum
+	 * @throws IOException
+	 * @throws NoSuchAlgorithmException
+	 */
+	private BigInteger checksum(Object sourceObject) throws IOException, NoSuchAlgorithmException {
+
+	    if (sourceObject == null) {
+	      return BigInteger.ZERO;   
+	    }
+
+	    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+	    ObjectOutputStream oos = new ObjectOutputStream(baos);
+	    oos.writeObject(sourceObject);
+	    oos.close();
+
+	    MessageDigest m = MessageDigest.getInstance("SHA1");
+	    m.update(baos.toByteArray());
+
+	    return new BigInteger(1, m.digest());
+	}
+	
 	protected void updateUser(UserModel userModel) {
-		// TODO implement user model change detection
-		// account for new user and revised user
-
-		// username
-		// displayname
-		// email address
-		// cookie
-
-		userManager.updateUserModel(userModel);
+		final UserModel userLocalDB = userManager.getUserModel(userModel.getName());
+		try {
+			// Establish the checksum of the current version of the user
+			final BigInteger userCurrentCheck = checksum(userModel);
+			// Establish the checksum of the stored version of the user
+			final BigInteger userLocalDBcheck = checksum(userLocalDB);
+			// Compare the checksums
+			if (!userCurrentCheck.equals(userLocalDBcheck))
+			{
+				// If mismatch, save the new instance.
+				userManager.updateUserModel(userModel);
+			}
+		} catch (NoSuchAlgorithmException | IOException e) {
+			// Trace any potential error.
+			if (logger.isErrorEnabled()) {
+				logger.error(e.getMessage());
+			}
+		}
 	}
 
 	protected void updateTeam(TeamModel teamModel) {
-		// TODO implement team model change detection
-		// account for new team and revised team
-
-		// memberships
-
-		userManager.updateTeamModel(teamModel);
+		final TeamModel teamLocalDB = userManager.getTeamModel(teamModel.name);
+		try {
+			// Establish the checksum of the current version of the team
+			final BigInteger teamCurrentCheck = checksum(teamModel);
+			// Establish the checksum of the stored version of the team
+			final BigInteger teamLocalDBcheck = checksum(teamLocalDB);
+			// Compare the checksums
+			if (!teamCurrentCheck.equals(teamLocalDBcheck))
+			{
+				// If mismatch, save the new instance.
+				userManager.updateTeamModel(teamModel);
+			}
+		} catch (NoSuchAlgorithmException | IOException e) {
+			// Trace any potential error.
+			if (logger.isErrorEnabled()) {
+				logger.error(e.getMessage());
+			}
+		}
 	}
 
 	public abstract void setup();

--
Gitblit v1.9.1