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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user