From f9dcf08f31f842ce89bf91ae17f165951fe8ff0c Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Thu, 13 Jan 2011 20:19:06 +0100 Subject: [PATCH] remove lastLogin attribute to improve svn and bzr performance --- .../src/main/java/sonia/scm/user/User.java | 75 +++++++++++++++---- .../src/main/java/sonia/scm/util/Util.java | 66 +++++++++++----- .../sonia/scm/user/xml/XmlUserManager.java | 1 + .../web/security/BasicSecurityContext.java | 12 +-- .../main/webapp/resources/js/sonia.user.js | 4 +- 5 files changed, 114 insertions(+), 44 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/user/User.java b/scm-core/src/main/java/sonia/scm/user/User.java index 8cd188c688..e39059a709 100644 --- a/scm-core/src/main/java/sonia/scm/user/User.java +++ b/scm-core/src/main/java/sonia/scm/user/User.java @@ -131,15 +131,64 @@ public class User * * * @param user + * + * @return */ - public void copyProperties(User user) + public boolean copyProperties(User user) { - user.setAdmin(admin); - user.setDisplayName(displayName); - user.setMail(mail); - user.setName(name); - user.setPassword(password); - user.setType(type); + return copyProperties(user, true); + } + + /** + * Method description + * + * + * @param user + * @param copyPassword + * + * @return + */ + public boolean copyProperties(User user, boolean copyPassword) + { + boolean result = false; + + if (user.isAdmin() != admin) + { + result = true; + user.setAdmin(admin); + } + + if (Util.isNotEquals(user.getDisplayName(), displayName)) + { + result = true; + user.setDisplayName(displayName); + } + + if (Util.isNotEquals(user.getMail(), mail)) + { + result = true; + user.setMail(mail); + } + + if (Util.isNotEquals(user.getName(), name)) + { + result = true; + user.setName(name); + } + + if (copyPassword && Util.isNotEquals(user.getPassword(), password)) + { + result = true; + user.setPassword(password); + } + + if (Util.isNotEquals(user.getType(), type)) + { + result = true; + user.setType(type); + } + + return result; } /** @@ -263,9 +312,9 @@ public class User * * @return */ - public long getLastLogin() + public Long getLastModified() { - return lastLogin; + return lastModified; } /** @@ -378,11 +427,11 @@ public class User * Method description * * - * @param lastLogin + * @param lastModified */ - public void setLastLogin(long lastLogin) + public void setLastModified(long lastModified) { - this.lastLogin = lastLogin; + this.lastModified = lastModified; } /** @@ -444,7 +493,7 @@ public class User /** Field description */ @XmlJavaTypeAdapter(XmlTimestampDateAdapter.class) - private Long lastLogin; + private Long lastModified; /** Field description */ private String mail; diff --git a/scm-core/src/main/java/sonia/scm/util/Util.java b/scm-core/src/main/java/sonia/scm/util/Util.java index d58528bfc5..60a5a58612 100644 --- a/scm-core/src/main/java/sonia/scm/util/Util.java +++ b/scm-core/src/main/java/sonia/scm/util/Util.java @@ -142,6 +142,33 @@ public class Util return parseDate(dateString, null); } + /** + * Method description + * + * + * @param byteValue + * + * @return + */ + public static String toString(byte[] byteValue) + { + StringBuilder buffer = new StringBuilder(); + + for (int i = 0; i < byteValue.length; i++) + { + int x = byteValue[i] & 0xff; + + if (x < 16) + { + buffer.append('0'); + } + + buffer.append(Integer.toString(x, 16)); + } + + return buffer.toString(); + } + //~--- get methods ---------------------------------------------------------- /** @@ -183,6 +210,22 @@ public class Util return (array == null) || (array.length == 0); } + /** + * Method description + * + * + * @param object + * @param other + * + * @return + */ + public static boolean isEquals(Object object, Object other) + { + return (object == null) + ? other == null + : object.equals(other); + } + /** * Method description * @@ -222,32 +265,17 @@ public class Util return (array != null) && (array.length > 0); } - //~--- methods -------------------------------------------------------------- - /** * Method description * * - * @param byteValue + * @param object + * @param other * * @return */ - public static String toString(byte[] byteValue) + public static boolean isNotEquals(Object object, Object other) { - StringBuilder buffer = new StringBuilder(); - - for (int i = 0; i < byteValue.length; i++) - { - int x = byteValue[i] & 0xff; - - if (x < 16) - { - buffer.append('0'); - } - - buffer.append(Integer.toString(x, 16)); - } - - return buffer.toString(); + return !isEquals(object, other); } } diff --git a/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java b/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java index 9851be964f..2ff8301f11 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java +++ b/scm-webapp/src/main/java/sonia/scm/user/xml/XmlUserManager.java @@ -273,6 +273,7 @@ public class XmlUserManager extends AbstractUserManager if (userDB.contains(name)) { AssertUtil.assertIsValid(user); + user.setLastModified(System.currentTimeMillis()); synchronized (XmlUserManager.class) { diff --git a/scm-webapp/src/main/java/sonia/scm/web/security/BasicSecurityContext.java b/scm-webapp/src/main/java/sonia/scm/web/security/BasicSecurityContext.java index d53c04eec7..d78066c35a 100644 --- a/scm-webapp/src/main/java/sonia/scm/web/security/BasicSecurityContext.java +++ b/scm-webapp/src/main/java/sonia/scm/web/security/BasicSecurityContext.java @@ -124,21 +124,13 @@ public class BasicSecurityContext implements WebSecurityContext try { - user.setLastLogin(System.currentTimeMillis()); - User dbUser = userManager.get(username); - if (dbUser != null) + if ((dbUser != null) && dbUser.copyProperties(user, false)) { - - // update properties - dbUser.setDisplayName(user.getDisplayName()); - dbUser.setLastLogin(user.getLastLogin()); - dbUser.setMail(user.getMail()); - dbUser.setType(user.getType()); userManager.modify(dbUser); } - else + else if (dbUser == null) { userManager.create(user); } diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.user.js b/scm-webapp/src/main/webapp/resources/js/sonia.user.js index 7b399ea9ab..c60a7d788b 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.user.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.user.js @@ -59,7 +59,7 @@ Sonia.user.Grid = Ext.extend(Sonia.rest.Grid, { var userStore = new Sonia.rest.JsonStore({ url: restUrl + 'users.json', - fields: [ 'name', 'displayName', 'mail', 'admin', 'creationDate', 'lastLogin', 'type'], + fields: [ 'name', 'displayName', 'mail', 'admin', 'creationDate', 'lastModified', 'type'], sortInfo: { field: 'name' } @@ -77,7 +77,7 @@ Sonia.user.Grid = Ext.extend(Sonia.rest.Grid, { {id: 'mail', header: 'Mail', dataIndex: 'mail', renderer: this.renderMailto, width: 200}, {id: 'admin', header: 'Admin', dataIndex: 'admin', renderer: this.renderCheckbox, width: 50}, {id: 'creationDate', header: 'Creation date', dataIndex: 'creationDate'}, - {id: 'lastLogin', header: 'Last login', dataIndex: 'lastLogin'}, + {id: 'lastLogin', header: 'Last modified', dataIndex: 'lastModified'}, {id: 'type', header: 'Type', dataIndex: 'type', width: 80} ] });