Added support for only updating the fields in a user record that were

modified; modified user repository to support extension.


git-svn-id: https://samskivert.googlecode.com/svn/trunk@716 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
mdb
2002-04-30 00:52:31 +00:00
parent 017328ed9e
commit f2eaccc927
2 changed files with 104 additions and 45 deletions
@@ -1,5 +1,5 @@
// //
// $Id: User.java,v 1.4 2001/11/01 00:07:18 mdb Exp $ // $Id: User.java,v 1.5 2002/04/30 00:52:31 mdb Exp $
// //
// samskivert library - useful routines for java programs // samskivert library - useful routines for java programs
// Copyright (C) 2001 Michael Bayne // Copyright (C) 2001 Michael Bayne
@@ -21,6 +21,7 @@
package com.samskivert.servlet.user; package com.samskivert.servlet.user;
import java.sql.Date; import java.sql.Date;
import com.samskivert.jdbc.jora.FieldMask;
/** /**
* A user object contains information about a registered user in our web * A user object contains information about a registered user in our web
@@ -29,7 +30,7 @@ import java.sql.Date;
* information provided with the request headers. * information provided with the request headers.
* *
* <p><b>Note:</b> Do not modify any of the fields of this object * <p><b>Note:</b> Do not modify any of the fields of this object
* diretly. Use the <code>set</code> methods to make updates. If no set * directly. Use the <code>set</code> methods to make updates. If no set
* methods exist, you shouldn't be modifying that field. * methods exist, you shouldn't be modifying that field.
*/ */
public class User public class User
@@ -63,6 +64,7 @@ public class User
public void setRealName (String realname) public void setRealName (String realname)
{ {
this.realname = realname; this.realname = realname;
_dirty.setModified("realname");
} }
/** /**
@@ -73,6 +75,7 @@ public class User
public void setPassword (String password) public void setPassword (String password)
{ {
this.password = UserUtil.encryptPassword(username, password); this.password = UserUtil.encryptPassword(username, password);
_dirty.setModified("password");
} }
/** /**
@@ -81,6 +84,7 @@ public class User
public void setEmail (String email) public void setEmail (String email)
{ {
this.email = email; this.email = email;
_dirty.setModified("email");
} }
/** /**
@@ -94,4 +98,25 @@ public class User
String epasswd = UserUtil.encryptPassword(username, password); String epasswd = UserUtil.encryptPassword(username, password);
return this.password.equals(epasswd); return this.password.equals(epasswd);
} }
/**
* Called by the repository to find out which fields have been
* modified since the object was loaded.
*/
protected FieldMask getDirtyMask ()
{
return _dirty;
}
/**
* Called by the repository to configure this user record with a field
* mask that it can use to track modified fields.
*/
protected void setDirtyMask (FieldMask dirty)
{
_dirty = dirty;
}
/** Our dirty field mask. */
protected FieldMask _dirty;
} }
@@ -1,5 +1,5 @@
// //
// $Id: UserRepository.java,v 1.19 2001/11/01 00:07:18 mdb Exp $ // $Id: UserRepository.java,v 1.20 2002/04/30 00:52:31 mdb Exp $
// //
// samskivert library - useful routines for java programs // samskivert library - useful routines for java programs
// Copyright (C) 2001 Michael Bayne // Copyright (C) 2001 Michael Bayne
@@ -61,11 +61,22 @@ public class UserRepository extends JORARepository
super(provider, USER_REPOSITORY_IDENT); super(provider, USER_REPOSITORY_IDENT);
} }
/**
* Derived classes that extend the user record with their own
* additional information will want to override this method and return
* their desired {@link User} derivation.
*/
protected Class getUserClass ()
{
return User.class;
}
// documentation inherited
protected void createTables (Session session) protected void createTables (Session session)
{ {
// create our table object // create our table object
_utable = new Table(User.class.getName(), "users", session, _utable = new Table(
"userId"); getUserClass().getName(), "users", session, "userId");
} }
/** /**
@@ -90,6 +101,23 @@ public class UserRepository extends JORARepository
String realname, String email, int siteId) String realname, String email, int siteId)
throws InvalidUsernameException, UserExistsException, throws InvalidUsernameException, UserExistsException,
PersistenceException PersistenceException
{
// create a new user object...
User user = new User();
// ...configure it...
populateUser(user, username, password, realname, email, siteId);
// ...and stick it into the database
return insertUser(user);
}
/**
* Configures the supplied user record with the provided information
* in preparation for inserting the record into the database for the
* first time.
*/
protected void populateUser (User user, String username, String password,
String realname, String email, int siteId)
throws InvalidUsernameException
{ {
// check minimum length // check minimum length
if (username.length() < MINIMUM_USERNAME_LENGTH) { if (username.length() < MINIMUM_USERNAME_LENGTH) {
@@ -101,15 +129,21 @@ public class UserRepository extends JORARepository
throw new InvalidUsernameException("error.invalid_username"); throw new InvalidUsernameException("error.invalid_username");
} }
// create a new user object and stick it into the database
final User user = new User();
user.username = username; user.username = username;
user.password = UserUtil.encryptPassword(username, password); user.password = UserUtil.encryptPassword(username, password);
user.realname = realname; user.realname = realname;
user.email = email; user.email = email;
user.created = new Date(System.currentTimeMillis()); user.created = new Date(System.currentTimeMillis());
user.siteId = siteId; user.siteId = siteId;
}
/**
* Inserts the supplied user record into the user database, assigning
* it a userid in the process, which is returned.
*/
protected int insertUser (final User user)
throws UserExistsException, PersistenceException
{
execute(new Operation () { execute(new Operation () {
public Object invoke (Connection conn, DatabaseLiaison liaison) public Object invoke (Connection conn, DatabaseLiaison liaison)
throws PersistenceException, SQLException throws PersistenceException, SQLException
@@ -140,27 +174,10 @@ public class UserRepository extends JORARepository
* @return the user with the specified user id or null if no user with * @return the user with the specified user id or null if no user with
* that id exists. * that id exists.
*/ */
public User loadUser (final String username) public User loadUser (String username)
throws PersistenceException throws PersistenceException
{ {
return (User)execute(new Operation () { return loadUserWhere("where username = '" + username + "'");
public Object invoke (Connection conn, DatabaseLiaison liaison)
throws PersistenceException, SQLException
{
// look up the user
String query = "where username = '" + username + "'";
Cursor ec = _utable.select(query);
// fetch the user from the cursor
User user = (User)ec.next();
if (user != null) {
// call next() again to cause the cursor to close itself
ec.next();
}
return user;
}
});
} }
/** /**
@@ -169,26 +186,10 @@ public class UserRepository extends JORARepository
* @return the user with the specified user id or null if no user with * @return the user with the specified user id or null if no user with
* that id exists. * that id exists.
*/ */
public User loadUser (final int userId) public User loadUser (int userId)
throws PersistenceException throws PersistenceException
{ {
return (User)execute(new Operation () { return loadUserWhere("where userId = " + userId);
public Object invoke (Connection conn, DatabaseLiaison liaison)
throws PersistenceException, SQLException
{
// look up the user
Cursor ec = _utable.select("where userId = " + userId);
// fetch the user from the cursor
User user = (User)ec.next();
if (user != null) {
// call next() again to cause the cursor to close itself
ec.next();
}
return user;
}
});
} }
/** /**
@@ -214,6 +215,36 @@ public class UserRepository extends JORARepository
if (user != null) { if (user != null) {
// call next() again to cause the cursor to close itself // call next() again to cause the cursor to close itself
ec.next(); ec.next();
// configure the user record with its field mask
user.setDirtyMask(_utable.getFieldMask());
}
return user;
}
});
}
/**
* Loads up a user record that matches the specified where clause.
* Returns null if no record matches.
*/
protected User loadUserWhere (final String whereClause)
throws PersistenceException
{
return (User)execute(new Operation () {
public Object invoke (Connection conn, DatabaseLiaison liaison)
throws PersistenceException, SQLException
{
// look up the user
Cursor ec = _utable.select(whereClause);
// fetch the user from the cursor
User user = (User)ec.next();
if (user != null) {
// call next() again to cause the cursor to close itself
ec.next();
// configure the user record with its field mask
user.setDirtyMask(_utable.getFieldMask());
} }
return user; return user;
@@ -223,6 +254,9 @@ public class UserRepository extends JORARepository
/** /**
* Updates a user that was previously fetched from the repository. * Updates a user that was previously fetched from the repository.
* Only fields that have been modified since it was loaded will be
* written to the database and those fields will subsequently be
* marked clean once again.
*/ */
public void updateUser (final User user) public void updateUser (final User user)
throws PersistenceException throws PersistenceException
@@ -231,7 +265,7 @@ public class UserRepository extends JORARepository
public Object invoke (Connection conn, DatabaseLiaison liaison) public Object invoke (Connection conn, DatabaseLiaison liaison)
throws PersistenceException, SQLException throws PersistenceException, SQLException
{ {
_utable.update(user); _utable.update(user, user.getDirtyMask());
// nothing to return // nothing to return
return null; return null;
} }