diff --git a/etc/ui-config.xml b/etc/ui-config.xml
index eb9c104..1ff474e 100644
--- a/etc/ui-config.xml
+++ b/etc/ui-config.xml
@@ -490,6 +490,8 @@ To create a new account, please enter your information below.
+
+
@@ -549,6 +551,7 @@ will be fully validated. If you have not received your confirmation within a fe
+
@@ -708,6 +711,7 @@ the community's host, or via an invitation e-mail message. Please enter it in th
+
diff --git a/scripts/new_account_2.js b/scripts/new_account_2.js
index c638a1a..d8d1f01 100644
--- a/scripts/new_account_2.js
+++ b/scripts/new_account_2.js
@@ -84,7 +84,7 @@ if (op=="create")
// Create the new user account and set up its initial context.
uc = rinput.engine.createNewAccount(rinput.sourceAddress,dlg.getValue("user"),dlg.getValue("pass1"),
- dlg.getValue("remind"));
+ dlg.getValue("remind"),dlg.getValue("dob"));
// Set up the account's contact info.
ci = uc.getContactInfo();
diff --git a/scripts/profile.js b/scripts/profile.js
index 092053c..7baae58 100644
--- a/scripts/profile.js
+++ b/scripts/profile.js
@@ -8,9 +8,9 @@
//
// The Original Code is the Venice Web Communities System.
//
-// The Initial Developer of the Original Code is Eric J. Bowersox ,
+// The Initial Developer of the Original Code is Eric J. Bowersox ,
// for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
-// Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
+// Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
//
// Contributor(s):
@@ -74,6 +74,7 @@ if ("GET"==rinput.verb)
if (ci.privateEmail)
dlg.setValue("pvt_email",1);
dlg.setValue("url",ci.URL);
+ dlg.setValue("dob",user.dateOfBirth);
dlg.setValue("descr",user.description);
dlg.setValue("photo",ci.photoURL);
dlg.sendMessage("photo","setLinkURL","profile_photo.js.vs?tgt=" + vlib.encodeURL(target));
@@ -175,6 +176,7 @@ if (op=="update")
user.properties = props;
// Save off the user's description and preferences.
+ user.dateOfBirth = dlg.getValue("dob");
user.description = dlg.getValue("descr");
user.locale = dlg.getValue("locale");
user.timeZone = dlg.getValue("tz");
diff --git a/scripts/sysadmin/modify_user.js b/scripts/sysadmin/modify_user.js
index 51b396d..fabcd5e 100644
--- a/scripts/sysadmin/modify_user.js
+++ b/scripts/sysadmin/modify_user.js
@@ -8,9 +8,9 @@
//
// The Original Code is the Venice Web Communities System.
//
-// The Initial Developer of the Original Code is Eric J. Bowersox ,
+// The Initial Developer of the Original Code is Eric J. Bowersox ,
// for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
-// Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
+// Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
//
// Contributor(s):
@@ -115,6 +115,7 @@ if ("GET"==rinput.verb)
if (ci.privateEmail)
dlg.setValue("pvt_email",1);
dlg.setValue("url",ci.URL);
+ dlg.setValue("dob",admuser.dateOfBirth);
dlg.setValue("descr",admuser.description);
dlg.setValue("photo",ci.photoURL);
if (props.displayPostPictures)
@@ -233,6 +234,7 @@ if (op=="update")
admuser.properties = props;
// Save off the user's description and preferences.
+ admuser.dateOfBirth = dlg.getValue("dob");
admuser.description = dlg.getValue("descr");
admuser.locale = dlg.getValue("locale");
admuser.timeZone = dlg.getValue("tz");
diff --git a/setup/database.sql b/setup/database.sql
index b7ab305..a88a462 100644
--- a/setup/database.sql
+++ b/setup/database.sql
@@ -90,6 +90,7 @@ CREATE TABLE users (
lastaccess DATETIME,
passreminder VARCHAR(255) DEFAULT '',
description VARCHAR(255),
+ dob DATE,
UNIQUE INDEX username_x (username)
);
diff --git a/src/com/silverwrist/venice/core/AdminOperations.java b/src/com/silverwrist/venice/core/AdminOperations.java
index e3b7900..971eeca 100644
--- a/src/com/silverwrist/venice/core/AdminOperations.java
+++ b/src/com/silverwrist/venice/core/AdminOperations.java
@@ -24,40 +24,38 @@ import com.silverwrist.venice.security.Role;
public interface AdminOperations
{
- public abstract SecurityInfo getSecurityInfo();
+ public SecurityInfo getSecurityInfo();
- public abstract List getAllowedRoleList();
+ public List getAllowedRoleList();
- public abstract List getAuditRecords(int offset, int count) throws DataException;
+ public List getAuditRecords(int offset, int count) throws DataException;
- public abstract int getAuditRecordCount() throws DataException;
+ public int getAuditRecordCount() throws DataException;
- public abstract AdminUserContext getUserContext(int uid) throws DataException;
+ public AdminUserContext getUserContext(int uid) throws DataException;
- public abstract AdminUserContext getUserContext(String username) throws DataException;
+ public AdminUserContext getUserContext(String username) throws DataException;
- public abstract CommunityContext getCommunityContext(int cid) throws DataException;
+ public CommunityContext getCommunityContext(int cid) throws DataException;
- public abstract CommunityContext getCommunityContext(String alias) throws DataException;
+ public CommunityContext getCommunityContext(String alias) throws DataException;
- public abstract GlobalProperties getProperties();
+ public GlobalProperties getProperties();
- public abstract void setProperties(GlobalProperties props) throws DataException;
+ public void setProperties(GlobalProperties props) throws DataException;
- public abstract AdminUserContext createNewAccount(String username, String password, boolean prehashed,
- String reminder, boolean verify_email, boolean lockout,
- Role base_role, String description, boolean auto_join)
- throws DataException, AccessError;
+ public AdminUserContext createNewAccount(String username, String password, boolean prehashed, String reminder,
+ boolean verify_email, boolean lockout, Role base_role, String description,
+ java.sql.Date dob, boolean auto_join) throws DataException, AccessError;
- public abstract List getIPBanInfo() throws DataException;
+ public List getIPBanInfo() throws DataException;
- public abstract IPBanInfo getIPBanInfo(int id) throws DataException;
+ public IPBanInfo getIPBanInfo(int id) throws DataException;
- public abstract void enableIPBan(int id, boolean enab) throws DataException;
+ public void enableIPBan(int id, boolean enab) throws DataException;
- public abstract void removeIPBan(int id) throws DataException;
+ public void removeIPBan(int id) throws DataException;
- public abstract void addIPBan(String address, String mask, java.util.Date expires, String message)
- throws DataException;
+ public void addIPBan(String address, String mask, java.util.Date expires, String message) throws DataException;
} // end interface AdminOperations
diff --git a/src/com/silverwrist/venice/core/AdminUserContext.java b/src/com/silverwrist/venice/core/AdminUserContext.java
index 88102bd..028ade6 100644
--- a/src/com/silverwrist/venice/core/AdminUserContext.java
+++ b/src/com/silverwrist/venice/core/AdminUserContext.java
@@ -27,54 +27,58 @@ import com.silverwrist.venice.security.Role;
public interface AdminUserContext
{
- public abstract int getUID();
+ public int getUID();
- public abstract String getUserName();
+ public String getUserName();
- public abstract int getContactID();
+ public int getContactID();
- public abstract String getDescription();
+ public String getDescription();
- public abstract void setDescription(String new_descr) throws DataException;
+ public void setDescription(String new_descr) throws DataException;
- public abstract int getBaseLevel();
+ public int getBaseLevel();
- public abstract void setBaseLevel(int new_level) throws DataException;
+ public void setBaseLevel(int new_level) throws DataException;
- public abstract Role getBaseRole();
+ public Role getBaseRole();
- public abstract void setBaseRole(Role new_role) throws DataException;
+ public void setBaseRole(Role new_role) throws DataException;
- public abstract boolean isEmailVerified();
+ public boolean isEmailVerified();
- public abstract void setEmailVerified(boolean flag) throws DataException;
+ public void setEmailVerified(boolean flag) throws DataException;
- public abstract boolean isLockedOut();
+ public boolean isLockedOut();
- public abstract void setLockedOut(boolean flag) throws DataException;
+ public void setLockedOut(boolean flag) throws DataException;
- public abstract ContactInfo getContactInfo() throws DataException;
+ public ContactInfo getContactInfo() throws DataException;
- public abstract void putContactInfo(ContactInfo ci) throws DataException;
+ public void putContactInfo(ContactInfo ci) throws DataException;
- public abstract void setPassword(String password, String reminder) throws DataException;
+ public void setPassword(String password, String reminder) throws DataException;
- public abstract Locale getLocale();
+ public Locale getLocale();
- public abstract void setLocale(Locale locale) throws DataException;
+ public void setLocale(Locale locale) throws DataException;
- public abstract TimeZone getTimeZone();
+ public TimeZone getTimeZone();
- public abstract void setTimeZone(TimeZone timezone) throws DataException;
+ public void setTimeZone(TimeZone timezone) throws DataException;
- public abstract Date getCreationDate();
+ public Date getCreationDate();
- public abstract Date getLastAccessDate();
+ public Date getLastAccessDate();
- public abstract AdminUserProperties getProperties() throws DataException;
+ public AdminUserProperties getProperties() throws DataException;
- public abstract void setProperties(AdminUserProperties props) throws DataException;
+ public void setProperties(AdminUserProperties props) throws DataException;
- public abstract void export(Writer xml) throws IOException, DataException;
+ public void export(Writer xml) throws IOException, DataException;
+
+ public java.sql.Date getDateOfBirth();
+
+ public void setDateOfBirth(java.sql.Date date) throws DataException;
} // end interface AdminUserContext
diff --git a/src/com/silverwrist/venice/core/UserContext.java b/src/com/silverwrist/venice/core/UserContext.java
index 032c157..919b09e 100644
--- a/src/com/silverwrist/venice/core/UserContext.java
+++ b/src/com/silverwrist/venice/core/UserContext.java
@@ -9,9 +9,9 @@
*
* The Original Code is the Venice Web Communities System.
*
- * The Initial Developer of the Original Code is Eric J. Bowersox ,
+ * The Initial Developer of the Original Code is Eric J. Bowersox ,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
- * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
+ * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
@@ -26,106 +26,109 @@ import com.silverwrist.venice.except.EmailException;
public interface UserContext extends SearchMode
{
- public abstract int getUID();
+ public int getUID();
- public abstract String getUserName();
+ public String getUserName();
- public abstract int getContactID();
+ public int getContactID();
- public abstract String getDescription();
+ public String getDescription();
- public abstract boolean isLoggedIn();
+ public boolean isLoggedIn();
- public abstract boolean isEmailVerified();
+ public boolean isEmailVerified();
- public abstract void authenticate(String username, String password)
- throws AccessError, DataException;
+ public void authenticate(String username, String password) throws AccessError, DataException;
- public abstract void confirmEmail(int conf_num) throws AccessError, DataException;
+ public void confirmEmail(int conf_num) throws AccessError, DataException;
- public abstract void resendEmailConfirmation() throws DataException, EmailException;
+ public void resendEmailConfirmation() throws DataException, EmailException;
- public abstract ContactInfo getContactInfo() throws DataException;
+ public ContactInfo getContactInfo() throws DataException;
- public abstract boolean putContactInfo(ContactInfo ci) throws DataException, EmailException;
+ public boolean putContactInfo(ContactInfo ci) throws DataException, EmailException;
- public abstract UserProfile getProfile(String xusername) throws DataException;
+ public UserProfile getProfile(String xusername) throws DataException;
- public abstract UserProfile getProfile(int xuid) throws DataException;
+ public UserProfile getProfile(int xuid) throws DataException;
- public abstract void setPassword(String password, String reminder) throws DataException;
+ public void setPassword(String password, String reminder) throws DataException;
- public abstract void setDescription(String new_descr) throws DataException;
+ public void setDescription(String new_descr) throws DataException;
- public abstract List getMemberCommunities() throws DataException;
+ public List getMemberCommunities() throws DataException;
- public abstract CommunityContext getCommunityContext(int cid) throws DataException;
+ public CommunityContext getCommunityContext(int cid) throws DataException;
- public abstract CommunityContext getCommunityContext(String alias) throws DataException;
+ public CommunityContext getCommunityContext(String alias) throws DataException;
- public abstract List getRootCategoryList() throws DataException;
+ public List getRootCategoryList() throws DataException;
- public abstract CategoryDescriptor getCategoryDescriptor(int catid) throws DataException;
+ public CategoryDescriptor getCategoryDescriptor(int catid) throws DataException;
- public abstract List searchForCommunities(int field, int mode, String term, int offset, int count)
+ public List searchForCommunities(int field, int mode, String term, int offset, int count)
throws DataException;
- public abstract int getSearchCommunityCount(int field, int mode, String term) throws DataException;
+ public int getSearchCommunityCount(int field, int mode, String term) throws DataException;
- public abstract List getCommunitiesInCategory(int catid, int offset, int count) throws DataException;
+ public List getCommunitiesInCategory(int catid, int offset, int count) throws DataException;
- public abstract List getCommunitiesInCategory(CategoryDescriptor cat, int offset, int count)
+ public List getCommunitiesInCategory(CategoryDescriptor cat, int offset, int count)
throws DataException;
- public abstract int getNumCommunitiesInCategory(int catid) throws DataException;
+ public int getNumCommunitiesInCategory(int catid) throws DataException;
- public abstract int getNumCommunitiesInCategory(CategoryDescriptor cat) throws DataException;
+ public int getNumCommunitiesInCategory(CategoryDescriptor cat) throws DataException;
- public abstract List searchForCategories(int mode, String term, int offset, int count) throws DataException;
+ public List searchForCategories(int mode, String term, int offset, int count) throws DataException;
- public abstract int getSearchCategoryCount(int mode, String term) throws DataException;
+ public int getSearchCategoryCount(int mode, String term) throws DataException;
- public abstract CommunityContext createCommunity(String name, String alias, String language, String synopsis,
- String rules, String joinkey, int hide_mode)
+ public CommunityContext createCommunity(String name, String alias, String language, String synopsis,
+ String rules, String joinkey, int hide_mode)
throws DataException, AccessError;
- public abstract boolean canCreateCommunity();
+ public boolean canCreateCommunity();
- public abstract List getSideBoxList() throws DataException;
+ public List getSideBoxList() throws DataException;
- public abstract void addSideBox(int id) throws DataException;
+ public void addSideBox(int id) throws DataException;
- public abstract List getConferenceHotlist() throws DataException;
+ public List getConferenceHotlist() throws DataException;
- public abstract boolean hasAdminAccess();
+ public boolean hasAdminAccess();
- public abstract AdminOperations getAdminInterface() throws AccessError;
+ public AdminOperations getAdminInterface() throws AccessError;
- public abstract Locale getLocale() throws DataException;
+ public Locale getLocale() throws DataException;
- public abstract void setLocale(Locale locale) throws DataException;
+ public void setLocale(Locale locale) throws DataException;
- public abstract TimeZone getTimeZone() throws DataException;
+ public TimeZone getTimeZone() throws DataException;
- public abstract void setTimeZone(TimeZone timezone) throws DataException;
+ public void setTimeZone(TimeZone timezone) throws DataException;
- public abstract String getAuthenticationToken() throws AccessError, DataException;
+ public String getAuthenticationToken() throws AccessError, DataException;
- public abstract boolean authenticateWithToken(String token) throws DataException;
+ public boolean authenticateWithToken(String token) throws DataException;
- public abstract Advertisement selectAd();
+ public Advertisement selectAd();
- public abstract boolean displayPostPictures() throws DataException;
+ public boolean displayPostPictures() throws DataException;
- public abstract UserProperties getProperties() throws DataException;
+ public UserProperties getProperties() throws DataException;
- public abstract void setProperties(UserProperties props) throws DataException;
+ public void setProperties(UserProperties props) throws DataException;
- public abstract boolean canSetUserPhoto() throws DataException;
+ public boolean canSetUserPhoto() throws DataException;
- public abstract List searchPosts(String search_terms, int offset, int count) throws DataException;
+ public List searchPosts(String search_terms, int offset, int count) throws DataException;
- public abstract int getSearchPostCount(String search_terms) throws DataException;
+ public int getSearchPostCount(String search_terms) throws DataException;
+
+ public java.sql.Date getDateOfBirth();
+
+ public void setDateOfBirth(java.sql.Date date) throws DataException;
} // end interface UserContext
diff --git a/src/com/silverwrist/venice/core/VeniceEngine.java b/src/com/silverwrist/venice/core/VeniceEngine.java
index c1baf14..b1fdec1 100644
--- a/src/com/silverwrist/venice/core/VeniceEngine.java
+++ b/src/com/silverwrist/venice/core/VeniceEngine.java
@@ -29,68 +29,65 @@ import com.silverwrist.venice.htmlcheck.HTMLChecker;
public interface VeniceEngine extends SearchMode, ServiceGroup
{
- public abstract void initialize(Document config, String app_root) throws ConfigException, DataException;
+ public void initialize(Document config, String app_root) throws ConfigException, DataException;
- public abstract void shutdown() throws ConfigException;
+ public void shutdown() throws ConfigException;
- public abstract UserContext createUserContext(String remote_addr) throws DataException;
+ public UserContext createUserContext(String remote_addr) throws DataException;
- public abstract String getEmailAddressForUser(String username) throws DataException, AccessError;
+ public String getEmailAddressForUser(String username) throws DataException, AccessError;
- public abstract void sendPasswordReminder(String username)
- throws DataException, AccessError, EmailException;
+ public void sendPasswordReminder(String username) throws DataException, AccessError, EmailException;
- public abstract void completePasswordChange(int uid, int authentication)
- throws DataException, AccessError, EmailException;
+ public void completePasswordChange(int uid, int authentication) throws DataException, AccessError, EmailException;
- public abstract UserContext createNewAccount(String remote_addr, String username, String password,
- String reminder) throws DataException, AccessError;
+ public UserContext createNewAccount(String remote_addr, String username, String password,
+ String reminder, java.sql.Date dob) throws DataException, AccessError;
- public abstract boolean aliasExists(String alias, int exist_cid);
+ public boolean aliasExists(String alias, int exist_cid);
- public abstract boolean isValidCategoryID(int catid);
+ public boolean isValidCategoryID(int catid);
- public abstract List searchForUsers(int field, int mode, String term, int offset, int count)
- throws DataException;
+ public List searchForUsers(int field, int mode, String term, int offset, int count) throws DataException;
- public abstract int getSearchUserCount(int field, int mode, String term) throws DataException;
+ public int getSearchUserCount(int field, int mode, String term) throws DataException;
- public abstract int getStdNumSearchResults();
+ public int getStdNumSearchResults();
- public abstract boolean isEmailAddressBanned(String email);
+ public boolean isEmailAddressBanned(String email);
- public abstract boolean confAliasExists(String alias);
+ public boolean confAliasExists(String alias);
- public abstract HTMLChecker getEscapingChecker();
+ public HTMLChecker getEscapingChecker();
- public abstract int getNumPostsPerPage();
+ public int getNumPostsPerPage();
- public abstract int getNumOldPostsBeforeNew();
+ public int getNumOldPostsBeforeNew();
- public abstract int getMaxNumConferenceMembersDisplay();
+ public int getMaxNumConferenceMembersDisplay();
- public abstract int getMaxNumCommunityMembersDisplay();
+ public int getMaxNumCommunityMembersDisplay();
- public abstract List getMasterSideBoxList();
+ public List getMasterSideBoxList();
- public abstract List getPublishedMessages(boolean all) throws DataException;
+ public List getPublishedMessages(boolean all) throws DataException;
- public abstract int getNumAuditRecordsPerPage();
+ public int getNumAuditRecordsPerPage();
- public abstract Advertisement getAdByID(int id);
+ public Advertisement getAdByID(int id);
- public abstract Advertisement selectAd();
+ public Advertisement selectAd();
- public abstract BinaryData loadImage(int id) throws DataException;
+ public BinaryData loadImage(int id) throws DataException;
- public abstract Dimension getUserPhotoSize();
+ public Dimension getUserPhotoSize();
- public abstract Dimension getCommunityLogoSize();
+ public Dimension getCommunityLogoSize();
- public abstract SecurityInfo getSecurityInfo();
+ public SecurityInfo getSecurityInfo();
- public abstract boolean useCategories();
+ public boolean useCategories();
- public abstract String testIPBan(String ip_address) throws DataException;
+ public String testIPBan(String ip_address) throws DataException;
} // end interface VeniceEngine
diff --git a/src/com/silverwrist/venice/core/impl/AdminOperationsImpl.java b/src/com/silverwrist/venice/core/impl/AdminOperationsImpl.java
index eb608c6..7256ec4 100644
--- a/src/com/silverwrist/venice/core/impl/AdminOperationsImpl.java
+++ b/src/com/silverwrist/venice/core/impl/AdminOperationsImpl.java
@@ -278,7 +278,7 @@ class AdminOperationsImpl implements AdminOperations
public AdminUserContext createNewAccount(String username, String password, boolean prehashed, String reminder,
boolean verify_email, boolean lockout, Role base_role,
- String description, boolean auto_join)
+ String description, java.sql.Date dob, boolean auto_join)
throws DataException, AccessError
{
if (logger.isDebugEnabled())
@@ -289,13 +289,13 @@ class AdminOperationsImpl implements AdminOperations
// Create the user account.
ReturnNewUser rnu = UserContextImpl.createAccount(env,env.getRemoteAddress(),username,password,prehashed,reminder,
- verify_email,lockout,0,base_role,description);
+ verify_email,lockout,0,base_role,description,dob);
if (auto_join)
{ // Need to create a normal user context here for just a minute to autojoin the communities.
UserContextImpl rc = new UserContextImpl(globalsite,env);
rc.loadNewUser("0.0.0.0",rnu.getUserID(),base_role.getLevel(),username,0,rnu.getCreationDate(),
- rnu.getCreationDate());
+ rnu.getCreationDate(),dob);
rc.autoJoinCommunities();
} // end if
diff --git a/src/com/silverwrist/venice/core/impl/AdminUserContextImpl.java b/src/com/silverwrist/venice/core/impl/AdminUserContextImpl.java
index 8a2b817..f2e5c18 100644
--- a/src/com/silverwrist/venice/core/impl/AdminUserContextImpl.java
+++ b/src/com/silverwrist/venice/core/impl/AdminUserContextImpl.java
@@ -54,6 +54,7 @@ class AdminUserContextImpl implements AdminUserContext
private java.util.Date created; // when was this user created? (GMT)
private java.util.Date last_access; // when did we last log in? (GMT)
private String description; // personal description
+ private java.sql.Date m_dob; // date of birth
private Locale my_locale; // my default locale (cached)
private TimeZone my_tz; // my default timezone (cached)
private OptionSet flags = null; // option flags
@@ -75,15 +76,17 @@ class AdminUserContextImpl implements AdminUserContext
this.created = SQLUtil.getFullDateTime(rs,"created");
this.last_access = SQLUtil.getFullDateTime(rs,"lastaccess");
this.description = rs.getString("description");
+ this.m_dob = rs.getDate("dob");
this.my_locale = International.get().createLocale(rs.getString("localeid"));
this.my_tz = TimeZone.getTimeZone(rs.getString("tzid"));
- Statement stmt = null;
+ PreparedStatement stmt = null;
try
{ // get user properties
- stmt = conn.createStatement();
- ResultSet rs2 = stmt.executeQuery("SELECT ndx, data FROM propuser WHERE uid = " + this.uid + ";");
+ stmt = conn.prepareStatement("SELECT ndx, data FROM propuser WHERE uid = ?;");
+ stmt.setInt(1,uid);
+ ResultSet rs2 = stmt.executeQuery();
while (rs2.next())
{ // load the properties...
switch (rs2.getInt(1))
@@ -116,19 +119,18 @@ class AdminUserContextImpl implements AdminUserContext
private final void updateProperties(BitSet delta) throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
try
{ // get a connection and create a statement
conn = env.getConnection();
- stmt = conn.createStatement();
- StringBuffer sql = new StringBuffer();
if (delta.get(UserContextImpl.PROP_FLAGS))
{ // store the flags
- sql.append("UPDATE propuser SET data = '").append(flags.asString()).append("' WHERE uid = ");
- sql.append(uid).append(" AND ndx = ").append(UserContextImpl.PROP_FLAGS).append(';');
- stmt.executeUpdate(sql.toString());
- sql.setLength(0);
+ stmt = conn.prepareStatement("UPDATE propuser SET data = ? WHERE uid = ? AND ndx = ?;");
+ stmt.setString(1,flags.asString());
+ stmt.setInt(2,uid);
+ stmt.setInt(3,UserContextImpl.PROP_FLAGS);
+ stmt.executeUpdate();
} // end if
@@ -211,7 +213,7 @@ class AdminUserContextImpl implements AdminUserContext
public void setDescription(String new_descr) throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
if (new_descr.equals(description))
@@ -220,11 +222,10 @@ class AdminUserContextImpl implements AdminUserContext
try
{ // retrieve a connection from the data pool
conn = env.getConnection();
- stmt = conn.createStatement();
- StringBuffer sql = new StringBuffer("UPDATE users SET description = '");
- sql.append(SQLUtil.encodeString(new_descr)).append("' WHERE uid = ").append(uid).append(';');
- stmt.executeUpdate(sql.toString());
-
+ stmt = conn.prepareStatement("UPDATE users SET description = ? WHERE uid = ?;");
+ stmt.setString(1,new_descr);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
description = new_descr; // change stored information
ar = env.newAudit(AuditRecord.ADMIN_ACCOUNT_CHANGE,"uid=" + uid,"field=description");
@@ -254,7 +255,7 @@ class AdminUserContextImpl implements AdminUserContext
public void setBaseLevel(int new_level) throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
if (level==new_level)
@@ -263,11 +264,10 @@ class AdminUserContextImpl implements AdminUserContext
try
{ // retrieve a connection from the data pool
conn = env.getConnection();
- stmt = conn.createStatement();
- StringBuffer sql = new StringBuffer("UPDATE users SET base_lvl = ");
- sql.append(new_level).append(" WHERE uid = ").append(uid).append(';');
- stmt.executeUpdate(sql.toString());
-
+ stmt = conn.prepareStatement("UPDATE users SET base_lvl = ? WHERE uid = ?;");
+ stmt.setInt(1,new_level);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
level = new_level;
ar = env.newAudit(AuditRecord.ADMIN_SET_SECURITY,"uid=" + uid,"level=" + new_level);
@@ -309,7 +309,7 @@ class AdminUserContextImpl implements AdminUserContext
public void setEmailVerified(boolean flag) throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
if (flag==email_verified)
@@ -318,11 +318,10 @@ class AdminUserContextImpl implements AdminUserContext
try
{ // retrieve a connection from the data pool
conn = env.getConnection();
- stmt = conn.createStatement();
- StringBuffer sql = new StringBuffer("UPDATE users SET verify_email = ");
- sql.append(flag ? '1' : '0').append(" WHERE uid = ").append(uid).append(';');
- stmt.executeUpdate(sql.toString());
-
+ stmt = conn.prepareStatement("UPDATE users SET verify_email = ? WHERE uid = ?;");
+ stmt.setInt(1,flag ? 1 : 0);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
email_verified = flag;
ar = env.newAudit(AuditRecord.ADMIN_ACCOUNT_CHANGE,"uid=" + uid,"field=verify_email");
@@ -352,7 +351,7 @@ class AdminUserContextImpl implements AdminUserContext
public void setLockedOut(boolean flag) throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
if (flag==lockout)
@@ -361,11 +360,10 @@ class AdminUserContextImpl implements AdminUserContext
try
{ // retrieve a connection from the data pool
conn = env.getConnection();
- stmt = conn.createStatement();
- StringBuffer sql = new StringBuffer("UPDATE users SET lockout = ");
- sql.append(flag ? '1' : '0').append(" WHERE uid = ").append(uid).append(';');
- stmt.executeUpdate(sql.toString());
-
+ stmt = conn.prepareStatement("UPDATE users SET lockout = ? WHERE uid = ?;");
+ stmt.setInt(1,flag ? 1 : 0);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
lockout = flag;
ar = env.newAudit(AuditRecord.ADMIN_LOCK_OUT,"uid=" + uid,flag ? "locked" : "unlocked");
@@ -459,18 +457,17 @@ class AdminUserContextImpl implements AdminUserContext
public void setPassword(String password, String reminder) throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
try
{ // retrieve a connection from the data pool
conn = env.getConnection();
- stmt = conn.createStatement();
- String hash_value = Generator.hashPassword(password);
- StringBuffer sql = new StringBuffer("UPDATE users SET passhash = '");
- sql.append(hash_value).append("', passreminder = '").append(SQLUtil.encodeString(reminder));
- sql.append("', access_tries = 0 WHERE uid = ").append(uid).append(';');
- stmt.executeUpdate(sql.toString());
+ stmt = conn.prepareStatement("UPDATE users SET passhash = ?, passreminder = ?, access_tries = 0 WHERE uid = ?;");
+ stmt.setString(1,Generator.hashPassword(password));
+ stmt.setString(2,reminder);
+ stmt.setInt(3,uid);
+ stmt.executeUpdate();
// record an audit record for this user
ar = env.newAudit(AuditRecord.ADMIN_PASSWORD_CHANGE,"uid=" + uid);
@@ -501,20 +498,20 @@ class AdminUserContextImpl implements AdminUserContext
public void setLocale(Locale locale) throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
try
{ // retrieve a connection from the data pool
conn = env.getConnection();
- stmt = conn.createStatement();
// create the update statement
- StringBuffer sql = new StringBuffer("UPDATE userprefs SET localeid = '");
- sql.append(SQLUtil.encodeString(locale.toString())).append("' WHERE uid = ").append(uid).append(';');
+ stmt = conn.prepareStatement("UPDATE userprefs SET localeid = ? WHERE uid = ?;");
+ stmt.setString(1,locale.toString());
+ stmt.setInt(2,uid);
// execute the statement
- stmt.executeUpdate(sql.toString());
+ stmt.executeUpdate();
// replace the locale here
my_locale = locale;
@@ -546,20 +543,20 @@ class AdminUserContextImpl implements AdminUserContext
public void setTimeZone(TimeZone timezone) throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
try
{ // retrieve a connection from the data pool
conn = env.getConnection();
- stmt = conn.createStatement();
// create the update statement
- StringBuffer sql = new StringBuffer("UPDATE userprefs SET tzid = '");
- sql.append(SQLUtil.encodeString(timezone.getID())).append("' WHERE uid = ").append(uid).append(';');
+ stmt = conn.prepareStatement("UPDATE userprefs SET tzid = ? WHERE uid = ?;");
+ stmt.setString(1,timezone.getID());
+ stmt.setInt(2,uid);
// execute the statement
- stmt.executeUpdate(sql.toString());
+ stmt.executeUpdate();
// replace the locale here
my_tz = timezone;
@@ -724,6 +721,7 @@ class AdminUserContextImpl implements AdminUserContext
// get the vCard info and serialize it
BuildVCard bvc = ci.getVCardBuilder();
+ bvc.setBirthday(m_dob);
bvc.setTimeZone(my_tz);
bvc.create().exportXML(xml);
@@ -743,6 +741,48 @@ class AdminUserContextImpl implements AdminUserContext
} // end export
+ public java.sql.Date getDateOfBirth()
+ {
+ return m_dob;
+
+ } // end getDateOfBirth
+
+ public void setDateOfBirth(java.sql.Date date) throws DataException
+ {
+ Connection conn = null;
+ PreparedStatement stmt = null;
+ AuditRecord ar = null;
+
+ if (date.equals(m_dob))
+ return;
+
+ try
+ { // retrieve a connection from the data pool
+ conn = env.getConnection();
+ stmt = conn.prepareStatement("UPDATE users SET dob = ? WHERE uid = ?;");
+ stmt.setDate(1,date);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
+ m_dob = date; // change stored information
+ ar = env.newAudit(AuditRecord.ADMIN_ACCOUNT_CHANGE,"uid=" + uid,"field=dob");
+
+ } // end try
+ catch (SQLException e)
+ { // turn SQLException into data exception
+ logger.error("DB error changing date of birth: " + e.getMessage(),e);
+ throw new DataException("Unable to set user date of birth: " + e.getMessage(),e);
+
+ } // end catch
+ finally
+ { // make sure the connection is released before we go
+ SQLUtil.shutdown(stmt);
+ AuditRecord.store(conn,ar);
+ SQLUtil.shutdown(conn);
+
+ } // end finally
+
+ } // end setDateOfBirth
+
/*--------------------------------------------------------------------------------
* Package-level static operations
*--------------------------------------------------------------------------------
@@ -751,14 +791,15 @@ class AdminUserContextImpl implements AdminUserContext
static AdminUserContext getAdminUserContext(EnvUser env, int uid) throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
try
{ // get a database connection
conn = env.getConnection();
- stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT * FROM users INNER JOIN userprefs "
- + "ON users.uid = userprefs.uid WHERE users.uid = " + uid + ";");
+ stmt = conn.prepareStatement("SELECT * FROM users INNER JOIN userprefs ON users.uid = userprefs.uid "
+ + "WHERE users.uid = ?;");
+ stmt.setInt(1,uid);
+ ResultSet rs = stmt.executeQuery();
if (!(rs.next()))
throw new DataException("The user with UID #" + uid + " was not found.");
if (rs.getBoolean("is_anon"))
@@ -785,15 +826,15 @@ class AdminUserContextImpl implements AdminUserContext
static AdminUserContext getAdminUserContext(EnvUser env, String username) throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
try
{ // get a database connection
conn = env.getConnection();
- stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT * FROM users INNER JOIN userprefs "
- + "ON users.uid = userprefs.uid WHERE users.username = '"
- + SQLUtil.encodeString(username) + "';");
+ stmt = conn.prepareStatement("SELECT * FROM users INNER JOIN userprefs ON users.uid = userprefs.uid "
+ + "WHERE users.username = ?;");
+ stmt.setString(1,username);
+ ResultSet rs = stmt.executeQuery();
if (!(rs.next()))
throw new DataException("The user '" + username + "' was not found.");
if (rs.getBoolean("is_anon"))
diff --git a/src/com/silverwrist/venice/core/impl/UserContextImpl.java b/src/com/silverwrist/venice/core/impl/UserContextImpl.java
index 3a5f4bb..42f2b93 100644
--- a/src/com/silverwrist/venice/core/impl/UserContextImpl.java
+++ b/src/com/silverwrist/venice/core/impl/UserContextImpl.java
@@ -70,7 +70,8 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
private String username; // the user name we're using
private java.util.Date created; // when was this user created? (GMT)
private java.util.Date last_access; // when did we last log in? (GMT)
- private String description; // personal description
+ private String m_description; // personal description
+ private java.sql.Date m_dob; // date of birth
private String my_email = null; // my email address (cached)
private String my_pseud = null; // my pseud (cached)
private String full_name = null; // my full name (cached)
@@ -110,7 +111,8 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
created = SQLUtil.getFullDateTime(rs,"created");
last_access = SQLUtil.getFullDateTime(rs,"lastaccess");
// skip field "passreminder"
- description = rs.getString("description");
+ m_description = rs.getString("description");
+ m_dob = rs.getDate("dob");
// purge any "cached" fields that may be left over
my_email = null;
@@ -222,19 +224,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
if (logger.isDebugEnabled())
logger.debug("autoJoinCommunities (uid " + uid + ", level " + level + ")");
- Statement stmt = null;
+ PreparedStatement stmt = null, stmt2 = null;
try
{ // See which communities we are eligible to autojoin.
- stmt = conn.createStatement();
- StringBuffer sql =
- new StringBuffer("SELECT sigmember.sigid, sigmember.locked FROM users, sigmember, sigs "
- + "WHERE sigmember.uid = users.uid AND sigmember.sigid = sigs.sigid "
- + "AND users.is_anon = 1 AND sigs.join_lvl <= ");
- sql.append(level).append(';');
- if (logger.isDebugEnabled())
- logger.debug("SQL: " + sql.toString());
- ResultSet rs = stmt.executeQuery(sql.toString());
+ stmt = conn.prepareStatement("SELECT sigmember.sigid, sigmember.locked FROM users, sigmember, sigs "
+ + "WHERE sigmember.uid = users.uid AND sigmember.sigid = sigs.sigid "
+ + "AND users.is_anon = 1 AND sigs.join_lvl <= ?;");
+ stmt.setInt(1,level);
+ ResultSet rs = stmt.executeQuery();
// Save the community IDs returned into temporary array lists.
ArrayList tmp_cid = new ArrayList();
@@ -247,41 +245,34 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end while
// Figure out which of those communities we haven't joined yet and set up to autojoin them.
- sql.setLength(0);
+ stmt = conn.prepareStatement("SELECT sigid FROM sigmember WHERE sigid = ? AND uid = ?;");
+ stmt2 = conn.prepareStatement("INSERT INTO sigmember (sigid, uid, granted_lvl, locked) VALUES (?, ?, ?, ?);");
SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class,"Community"));
int new_level = smon.getDefaultRole("Community.NewUser").getLevel();
for (int i=0; i0)
- { // execute the big update
- sql.append(';');
- if (logger.isDebugEnabled())
- logger.debug("SQL: " + sql.toString());
- stmt.executeUpdate(sql.toString());
-
- } // end if
-
} // end try
finally
{ // shut down the statement to conserve resources
SQLUtil.shutdown(stmt);
+ SQLUtil.shutdown(stmt2);
} // end finally
@@ -376,7 +367,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
public String getDescription()
{
- return description;
+ return m_description;
} // end getDescription
@@ -407,15 +398,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
logger.debug("authenticate(): authenticating user \"" + username + "\"...");
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
try
{ // look for a user name matching this user record
conn = globalsite.getConnection(null);
- stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE username = '"
- + SQLUtil.encodeString(username) + "';");
+ stmt = conn.prepareStatement("SELECT * FROM users WHERE username = ?;");
+ stmt.setString(1,username);
+ ResultSet rs = stmt.executeQuery();
if (!(rs.next()))
{ // user not found
@@ -460,11 +451,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
// we're authenticated - load the user data into the context
loadUserData(rs);
+ rs.close();
// update the "last access" time in the database
+ stmt.close();
+ stmt = conn.prepareStatement("UPDATE users SET lastaccess = ? WHERE uid = ?;");
java.util.Date mydate = new java.util.Date();
- stmt.executeUpdate("UPDATE users SET lastaccess = '" + SQLUtil.encodeDate(mydate)
- + "' WHERE uid = " + uid + ";");
+ SQLUtil.setFullDateTime(stmt,1,mydate);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
// update the "last access" time in this object
last_access = mydate;
@@ -516,17 +511,17 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end if
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class));
Role new_role = smon.getDefaultRole("Global.AfterVerify");
try
{ // get a connection and set the user's status to reflect the verification
conn = globalsite.getConnection(null);
- stmt = conn.createStatement();
- StringBuffer sql = new StringBuffer("UPDATE users SET verify_email = 1, base_lvl = ");
- sql.append(new_role.getLevel()).append(" WHERE uid = ").append(uid).append(';');
- stmt.executeUpdate(sql.toString());
+ stmt = conn.prepareStatement("UPDATE users SET verify_email = 1, base_lvl = ? WHERE uid = ?;");
+ stmt.setInt(1,new_role.getLevel());
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
email_verified = true;
level = new_role.getLevel();
@@ -569,22 +564,21 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
getContactInfo(); // forces my_email to be updated
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
try
{ // need to change the user's email confirmation number first
conn = globalsite.getConnection(null);
- stmt = conn.createStatement();
// generate new confirmation number
int new_confirm_num = Generator.get().getNewConfirmationNumber();
// create an SQL statement to reset the user account information, and execute it
- StringBuffer sql = new StringBuffer("UPDATE users SET email_confnum = ");
- sql.append(new_confirm_num).append(" WHERE uid = ").append(uid).append(';');
- stmt.executeUpdate(sql.toString());
-
+ stmt = conn.prepareStatement("UPDATE users SET email_confnum = ? WHERE uid = ?;");
+ stmt.setInt(1,new_confirm_num);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
confirm_num = new_confirm_num; // save changed value
// now send the email confirmation!
@@ -694,14 +688,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class));
Role new_role = smon.getDefaultRole("Global.Unverified");
- Statement stmt = null;
+ PreparedStatement stmt = null;
try
{ // create an SQL statement to reset the user account information, and execute it
- StringBuffer sql = new StringBuffer("UPDATE users SET verify_email = 0, email_confnum = ");
- sql.append(new_confirm_num).append(", base_lvl = ").append(new_role.getLevel());
- sql.append(" WHERE uid = ").append(uid).append(';');
- stmt = conn.createStatement();
- stmt.executeUpdate(sql.toString());
+ stmt = conn.prepareStatement("UPDATE users SET verify_email = 0, email_confnum = ?, base_lvl = ? "
+ + "WHERE uid = ?;");
+ stmt.setInt(1,new_confirm_num);
+ stmt.setInt(2,new_role.getLevel());
+ stmt.setInt(3,uid);
+ stmt.executeUpdate();
} // end try
finally
@@ -816,18 +811,17 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end if
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
try
{ // retrieve a connection from the data pool
conn = globalsite.getConnection(null);
- stmt = conn.createStatement();
- String hash_value = Generator.hashPassword(password);
- StringBuffer sql = new StringBuffer("UPDATE users SET passhash = '");
- sql.append(hash_value).append("', passreminder = '").append(SQLUtil.encodeString(reminder));
- sql.append("' WHERE uid = ").append(uid).append(';');
- stmt.executeUpdate(sql.toString());
+ stmt = conn.prepareStatement("UPDATE users SET passhash = ?, passreminder = ? WHERE uid = ?;");
+ stmt.setString(1,Generator.hashPassword(password));
+ stmt.setString(2,reminder);
+ stmt.setInt(3,uid);
+ stmt.executeUpdate();
// record an audit record for this user
ar = new AuditRecord(AuditRecord.PASSWORD_CHANGE,uid,remote_addr);
@@ -859,17 +853,16 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end if
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
try
{ // retrieve a connection from the data pool
conn = globalsite.getConnection(null);
- stmt = conn.createStatement();
- StringBuffer sql = new StringBuffer("UPDATE users SET description = '");
- sql.append(SQLUtil.encodeString(new_descr)).append("' WHERE uid = ").append(uid).append(';');
- stmt.executeUpdate(sql.toString());
-
- description = new_descr; // change stored information
+ stmt = conn.prepareStatement("UPDATE users SET description = ? WHERE uid = ?;");
+ stmt.setString(1,new_descr);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
+ m_description = new_descr; // change stored information
} // end try
catch (SQLException e)
@@ -1018,17 +1011,17 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
public List getSideBoxList() throws DataException
{
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
ArrayList rc = new ArrayList();
try
{ // retrieve a connection from the data pool
conn = globalsite.getConnection(null);
- stmt = conn.createStatement();
// retrieve the necessary rows from the sideboxes table
- ResultSet rs = stmt.executeQuery("SELECT boxid, sequence FROM sideboxes WHERE uid = " + uid
- + " ORDER BY sequence;");
+ stmt = conn.prepareStatement("SELECT boxid, sequence FROM sideboxes WHERE uid = ? ORDER BY sequence;");
+ stmt.setInt(1,uid);
+ ResultSet rs = stmt.executeQuery();
while (rs.next())
{ // create the implementation objects and return them all
SideBoxDescriptor sbd =
@@ -1063,6 +1056,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
Connection conn = null;
Statement stmt = null;
+ PreparedStatement pstmt = null;
try
{ // retrieve a connection
@@ -1072,25 +1066,29 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
stmt.executeUpdate("LOCK TABLES sideboxes WRITE;");
try
{ // do a quickie query to see if we're already in the sidebox list
- StringBuffer sql = new StringBuffer("SELECT sequence FROM sideboxes WHERE uid = ");
- sql.append(uid).append(" AND boxid = ").append(id).append(';');
- ResultSet rs = stmt.executeQuery(sql.toString());
+ pstmt = conn.prepareStatement("SELECT sequence FROM sideboxes WHERE uid = ? AND boxid = ?;");
+ pstmt.setInt(1,uid);
+ pstmt.setInt(2,id);
+ ResultSet rs = pstmt.executeQuery();
if (rs.next())
return; // already in sidebox list - this is a no-op
// find a sequence number for the new entry
- sql.setLength(0);
- sql.append("SELECT MAX(sequence) FROM sideboxes WHERE uid = ").append(uid).append(';');
- rs = stmt.executeQuery(sql.toString());
+ pstmt.close();
+ pstmt = conn.prepareStatement("SELECT MAX(sequence) FROM sideboxes WHERE uid = ?;");
+ pstmt.setInt(1,uid);
+ rs = pstmt.executeQuery();
if (!(rs.next()))
throw new InternalStateError("bogus query result on addSideBox");
int new_sequence = rs.getInt(1) + 100;
// add the new record
- sql.setLength(0);
- sql.append("INSERT INTO sideboxes (uid, sequence, boxid) VALUES (").append(uid).append(", ");
- sql.append(new_sequence).append(", ").append(id).append(");");
- stmt.executeUpdate(sql.toString());
+ pstmt.close();
+ pstmt = conn.prepareStatement("INSERT INTO sideboxes (uid, sequence, boxid) VALUES (?, ?, ?);");
+ pstmt.setInt(1,uid);
+ pstmt.setInt(2,new_sequence);
+ pstmt.setInt(3,id);
+ pstmt.executeUpdate();
} // end try
finally
@@ -1108,6 +1106,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end catch
finally
{ // make sure we release the connection before we go
+ SQLUtil.shutdown(pstmt);
SQLUtil.shutdown(stmt);
SQLUtil.shutdown(conn);
@@ -1236,15 +1235,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
// Generate a random authentication string and poke it into the database for this user.
String tokenauth = Generator.get().generateRandomAuthString();
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
try
{ // retrieve a connection from the data pool
conn = globalsite.getConnection(null);
- stmt = conn.createStatement();
- StringBuffer sql = new StringBuffer("UPDATE users SET tokenauth = '");
- sql.append(tokenauth).append("' WHERE uid = ").append(uid).append(';');
- stmt.executeUpdate(sql.toString());
+ stmt = conn.prepareStatement("UPDATE users SET tokenauth = ? WHERE uid = ?;");
+ stmt.setString(1,tokenauth);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
} // end try
catch (SQLException e)
@@ -1363,14 +1362,15 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
logger.debug("Authenticating user ID#" + pending_uid);
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
AuditRecord ar = null;
try
{ // look for a user record matching this user ID
conn = globalsite.getConnection(null);
- stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE uid = " + pending_uid + ";");
+ stmt = conn.prepareStatement("SELECT * FROM users WHERE uid = ?;");
+ stmt.setInt(1,pending_uid);
+ ResultSet rs = stmt.executeQuery();
if (!(rs.next()))
{ // user not found
@@ -1412,9 +1412,11 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
loadUserData(rs);
// update the "last access" time in the database
+ stmt = conn.prepareStatement("UPDATE users SET lastaccess = ? WHERE uid = ?;");
java.util.Date mydate = new java.util.Date();
- stmt.executeUpdate("UPDATE users SET lastaccess = '" + SQLUtil.encodeDate(mydate)
- + "' WHERE uid = " + uid + ";");
+ SQLUtil.setFullDateTime(stmt,1,mydate);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
// update the "last access" time in this object
last_access = mydate;
@@ -1514,32 +1516,32 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
ServiceToken conf_token = env.getSCM().getTokenForSymbol(ServiceControl.SVCGRP_COMMUNITY,"Conference");
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
ArrayList rc = new ArrayList();
try
{ // get a database connection
conn = globalsite.getConnection(null);
TopicMessageFoundHelper helper = new TopicMessageFoundHelper(conn);
- stmt = conn.createStatement();
// create the SQL statement
- StringBuffer sql =
- new StringBuffer("SELECT s.sigid, c.confid, t.topicid, t.num, p.postid, p.num, p.creator_uid, "
- + "p.posted, p.linecount, d.data FROM confs c, sigtoconf s, topics t, posts p, "
- + "postdata d, users u, sigmember m, sigftrs f LEFT JOIN confmember x "
- + "ON (c.confid = x.confid AND u.uid = x.uid) WHERE u.uid = ");
- sql.append(uid);
- sql.append(" AND s.sigid = m.sigid AND m.uid = u.uid AND s.sigid = f.sigid AND f.ftr_code = ");
- sql.append(conf_token.getIndex());
- sql.append(" AND c.confid = s.confid AND GREATEST(u.base_lvl,m.granted_lvl,s.granted_lvl,"
- + "IFNULL(x.granted_lvl,0)) >= c.read_lvl AND t.confid = c.confid AND t.topicid = p.topicid "
- + "AND p.scribble_uid IS NULL AND p.postid = d.postid AND MATCH(d.data) AGAINST (");
- sql.append(SQLUtil.encodeStringArg(search_terms)).append(") LIMIT ").append(offset).append(", ");
- sql.append(count+1).append(';');
+ stmt = conn.prepareStatement("SELECT s.sigid, c.confid, t.topicid, t.num, p.postid, p.num, p.creator_uid, "
+ + "p.posted, p.linecount, d.data FROM confs c, sigtoconf s, topics t, posts p, "
+ + "postdata d, users u, sigmember m, sigftrs f LEFT JOIN confmember x "
+ + "ON (c.confid = x.confid AND u.uid = x.uid) WHERE u.uid = ? AND "
+ + "s.sigid = m.sigid AND m.uid = u.uid AND s.sigid = f.sigid AND f.ftr_code = ? "
+ + " AND c.confid = s.confid AND GREATEST(u.base_lvl,m.granted_lvl,s.granted_lvl,"
+ + "IFNULL(x.granted_lvl,0)) >= c.read_lvl AND t.confid = c.confid AND "
+ + "t.topicid = p.topicid AND p.scribble_uid IS NULL AND p.postid = d.postid "
+ + "AND MATCH(d.data) AGAINST (?) LIMIT ?, ?;");
+ stmt.setInt(1,uid);
+ stmt.setInt(2,conf_token.getIndex());
+ stmt.setString(3,search_terms);
+ stmt.setInt(4,offset);
+ stmt.setInt(5,count + 1);
// execute the query and load the results into the return arraylist
- ResultSet rs = stmt.executeQuery(sql.toString());
+ ResultSet rs = stmt.executeQuery();
while (rs.next())
rc.add(new TopicMessageFoundImpl(helper,rs.getInt(1),rs.getInt(2),rs.getInt(3),rs.getInt(4),
rs.getLong(5),rs.getInt(6),rs.getInt(7),
@@ -1575,28 +1577,26 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
ServiceToken conf_token = env.getSCM().getTokenForSymbol(ServiceControl.SVCGRP_COMMUNITY,"Conference");
Connection conn = null;
- Statement stmt = null;
+ PreparedStatement stmt = null;
try
{ // get a database connection
conn = globalsite.getConnection(null);
- stmt = conn.createStatement();
// create the SQL statement
- StringBuffer sql =
- new StringBuffer("SELECT COUNT(*) FROM confs c, sigtoconf s, topics t, posts p, postdata d, "
- + "users u, sigmember m, sigftrs f LEFT JOIN confmember x ON (c.confid = x.confid "
- + "AND u.uid = x.uid) WHERE u.uid = ");
- sql.append(uid);
- sql.append(" AND s.sigid = m.sigid AND m.uid = u.uid AND s.sigid = f.sigid AND f.ftr_code = ");
- sql.append(conf_token.getIndex());
- sql.append(" AND c.confid = s.confid AND GREATEST(u.base_lvl,m.granted_lvl,s.granted_lvl,"
- + "IFNULL(x.granted_lvl,0)) >= c.read_lvl AND t.confid = c.confid AND t.topicid = p.topicid "
- + "AND p.scribble_uid IS NULL AND p.postid = d.postid AND MATCH(d.data) AGAINST (");
- sql.append(SQLUtil.encodeStringArg(search_terms)).append(");");
+ stmt = conn.prepareStatement("SELECT COUNT(*) FROM confs c, sigtoconf s, topics t, posts p, postdata d, "
+ + "users u, sigmember m, sigftrs f LEFT JOIN confmember x ON (c.confid = x.confid "
+ + "AND u.uid = x.uid) WHERE u.uid = ? AND s.sigid = m.sigid AND m.uid = u.uid "
+ + "AND s.sigid = f.sigid AND f.ftr_code = ? AND c.confid = s.confid AND "
+ + "GREATEST(u.base_lvl,m.granted_lvl,s.granted_lvl,IFNULL(x.granted_lvl,0)) "
+ + ">= c.read_lvl AND t.confid = c.confid AND t.topicid = p.topicid AND "
+ + "p.scribble_uid IS NULL AND p.postid = d.postid AND MATCH(d.data) AGAINST (?);");
+ stmt.setInt(1,uid);
+ stmt.setInt(2,conf_token.getIndex());
+ stmt.setString(3,search_terms);
// execute the query and load the results
- ResultSet rs = stmt.executeQuery(sql.toString());
+ ResultSet rs = stmt.executeQuery();
if (!(rs.next()))
throw new InternalStateError("query failure in UserContextImpl.getSearchPostCount!");
return rs.getInt(1);
@@ -1617,6 +1617,49 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end getSearchPostCount
+ public java.sql.Date getDateOfBirth()
+ {
+ return m_dob;
+
+ } // end getDateOfBirth
+
+ public void setDateOfBirth(java.sql.Date date) throws DataException
+ {
+ if (is_anon)
+ { // trying to change Anonymous Honyak's (nonexistent) date of birth?
+ logger.error("cannot change date of birth of anonymous account");
+ throw new DataException("The anonymous account cannot change its date of birth.");
+
+ } // end if
+
+ Connection conn = null;
+ PreparedStatement stmt = null;
+
+ try
+ { // retrieve a connection from the data pool
+ conn = globalsite.getConnection(null);
+ stmt = conn.prepareStatement("UPDATE users SET dob = ? WHERE uid = ?;");
+ stmt.setDate(1,date);
+ stmt.setInt(2,uid);
+ stmt.executeUpdate();
+ m_dob = date; // change stored information
+
+ } // end try
+ catch (SQLException e)
+ { // turn SQLException into data exception
+ logger.error("DB error changing date of birth: " + e.getMessage(),e);
+ throw new DataException("Unable to set user date of birth: " + e.getMessage(),e);
+
+ } // end catch
+ finally
+ { // make sure the connection is released before we go
+ SQLUtil.shutdown(stmt);
+ SQLUtil.shutdown(conn);
+
+ } // end finally
+
+ } // end setDateOfBirth
+
/*--------------------------------------------------------------------------------
* Implementations from interface ServiceProvider
*--------------------------------------------------------------------------------
@@ -1755,7 +1798,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end loadAnonymous
void loadNewUser(String remote_addr, int uid, int level, String username, int confirm_num,
- java.util.Date created, java.util.Date last_access)
+ java.util.Date created, java.util.Date last_access, java.sql.Date dob)
{
if (logger.isDebugEnabled())
logger.debug("loadNewUser() on UserContext: addr " + remote_addr + ", uid " + uid + ", level "
@@ -1769,6 +1812,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
this.confirm_num = confirm_num;
this.created = created;
this.last_access = last_access;
+ m_dob = dob;
} // end loadNewUser
@@ -1803,14 +1847,14 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
static final ReturnNewUser createAccount(EnvEngine env, String remote_addr, String username, String password,
boolean prehashed, String reminder, boolean verify_email, boolean lockout,
- int confirm_num, Role base_role, String description)
+ int confirm_num, Role base_role, String description, java.sql.Date dob)
throws AccessError, DataException
{
- String encode_username = SQLUtil.encodeString(username);
int new_uid; // new user ID - return from this function
java.util.Date created; // date created - return from this function
Connection conn = null;
Statement stmt = null;
+ PreparedStatement pstmt = null;
AuditRecord ar = null;
try
@@ -1822,7 +1866,9 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
try
{ // make sure the user account doesn't already exist
- ResultSet rs = stmt.executeQuery("SELECT uid FROM users WHERE username = '" + encode_username + "';");
+ pstmt = conn.prepareStatement("SELECT uid FROM users WHERE username = ?;");
+ pstmt.setString(1,username);
+ ResultSet rs = pstmt.executeQuery();
if (rs.next())
{ // the user account already exists
logger.warn("username \"" + username + "\" already exists");
@@ -1830,21 +1876,27 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end if
- SQLUtil.shutdown(rs);
+ rs.close();
// Insert a new record for this user
String hash_value = (prehashed ? password : Generator.hashPassword(password));
- StringBuffer sql =
- new StringBuffer("INSERT INTO users (username, passhash, verify_email, lockout, email_confnum, "
- + "base_lvl, created, lastaccess, passreminder, description) VALUES ('");
- sql.append(encode_username).append("', '").append(hash_value).append("', ");
- sql.append(verify_email ? '1' : '0').append(", ").append(lockout ? '1' : '0').append(", ");
- sql.append(confirm_num).append(", ").append(base_role.getLevel()).append(", '");
+ pstmt.close();
+ pstmt = conn.prepareStatement("INSERT INTO users (username, passhash, verify_email, lockout, email_confnum, "
+ + "base_lvl, created, lastaccess, passreminder, description, dob) VALUES "
+ + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
+ pstmt.setString(1,username);
+ pstmt.setString(2,hash_value);
+ pstmt.setInt(3,verify_email ? 1 : 0);
+ pstmt.setInt(4,lockout ? 1 : 0);
+ pstmt.setInt(5,confirm_num);
+ pstmt.setInt(6,base_role.getLevel());
created = new java.util.Date();
- sql.append(SQLUtil.encodeDate(created)).append("', '").append(SQLUtil.encodeDate(created));
- sql.append("', ").append(SQLUtil.encodeStringArg(reminder)).append(", ");
- sql.append(SQLUtil.encodeStringArg(description)).append(");");
- stmt.executeUpdate(sql.toString());
+ SQLUtil.setFullDateTime(pstmt,7,created);
+ SQLUtil.setFullDateTime(pstmt,8,created);
+ pstmt.setString(9,reminder);
+ pstmt.setString(10,description);
+ pstmt.setDate(11,dob);
+ pstmt.executeUpdate();
// what is the new user ID?
rs = stmt.executeQuery("SELECT LAST_INSERT_ID();");
@@ -1858,12 +1910,13 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
new_uid = rs.getInt(1);
if (logger.isDebugEnabled())
logger.debug("...created user \"" + username + "\" with UID " + new_uid);
- SQLUtil.shutdown(rs);
+ rs.close();
// add a UserPrefs record for this user, too
- sql.setLength(0);
- sql.append("INSERT INTO userprefs (uid) VALUES (").append(new_uid).append(");");
- stmt.executeUpdate(sql.toString());
+ pstmt.close();
+ pstmt = conn.prepareStatement("INSERT INTO userprefs (uid) VALUES (?);");
+ pstmt.setInt(1,new_uid);
+ pstmt.executeUpdate();
if (logger.isDebugEnabled())
logger.debug("...created userprefs");
@@ -1871,75 +1924,52 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
// add a properties configuration for this user
rs = stmt.executeQuery("SELECT propuser.ndx, propuser.data FROM propuser, users WHERE "
+ "propuser.uid = users.uid AND users.is_anon = 1;");
- sql.setLength(0);
+ pstmt.close();
+ pstmt = conn.prepareStatement("INSERT INTO propuser (uid, ndx, data) VALUES (?, ?, ?);");
while (rs.next())
{ // set up to insert into the propuser table
- if (sql.length()==0)
- sql.append("INSERT INTO propuser (uid, ndx, data) VALUES ");
- else
- sql.append(", ");
- sql.append("(").append(new_uid).append(", ").append(rs.getInt(1)).append(", '");
- sql.append(SQLUtil.encodeString(rs.getString(2))).append("')");
+ pstmt.setInt(1,new_uid);
+ pstmt.setInt(2,rs.getInt(1));
+ pstmt.setString(3,rs.getString(2));
+ pstmt.executeUpdate();
} // end while
- if (sql.length()>0)
- { // execute the big update
- sql.append(';');
- stmt.executeUpdate(sql.toString());
-
- } // end if
-
if (logger.isDebugEnabled())
logger.debug("...created user properties");
// get the sidebox configuration for this user
rs = stmt.executeQuery("SELECT sideboxes.boxid, sideboxes.sequence FROM sideboxes, "
+ "users WHERE sideboxes.uid = users.uid AND users.is_anon = 1;");
- sql.setLength(0);
+ pstmt.close();
+ pstmt = conn.prepareStatement("INSERT INTO sideboxes (uid, boxid, sequence) VALUES (?, ?, ?);");
while (rs.next())
{ // set up to insert into the sideboxes table
- if (sql.length()==0)
- sql.append("INSERT INTO sideboxes (uid, boxid, sequence) VALUES ");
- else
- sql.append(", ");
- sql.append("(").append(new_uid).append(", ").append(rs.getInt(1)).append(", ");
- sql.append(rs.getInt(2)).append(')');
+ pstmt.setInt(1,new_uid);
+ pstmt.setInt(2,rs.getInt(1));
+ pstmt.setInt(3,rs.getInt(2));
+ pstmt.executeUpdate();
} // end while
- if (sql.length()>0)
- { // execute the big update
- sql.append(';');
- stmt.executeUpdate(sql.toString());
-
- } // end if
-
if (logger.isDebugEnabled())
logger.debug("...loaded default sidebox config");
// get the hotlist configuration for this user
rs = stmt.executeQuery("SELECT confhotlist.sequence, confhotlist.sigid, confhotlist.confid FROM "
+ "confhotlist, users WHERE confhotlist.uid = users.uid AND users.is_anon = 1;");
- sql.setLength(0);
+ pstmt.close();
+ pstmt = conn.prepareStatement("INSERT INTO confhotlist (uid, sequence, sigid, confid) VALUES (?, ?, ?, ?);");
while (rs.next())
{ // set up to insert into the confhotlist table
- if (sql.length()==0)
- sql.append("INSERT INTO confhotlist (uid, sequence, sigid, confid) VALUES ");
- else
- sql.append(", ");
- sql.append('(').append(new_uid).append(", ").append(rs.getInt(1)).append(", ").append(rs.getInt(2));
- sql.append(", ").append(rs.getInt(3)).append(')');
+ pstmt.setInt(1,new_uid);
+ pstmt.setInt(2,rs.getInt(1));
+ pstmt.setInt(3,rs.getInt(2));
+ pstmt.setInt(4,rs.getInt(3));
+ pstmt.executeUpdate();
} // end while
- if (sql.length()>0)
- { // execute the big update
- sql.append(';');
- stmt.executeUpdate(sql.toString());
-
- } // end if
-
if (logger.isDebugEnabled())
logger.debug("...loaded default hotlist config");
@@ -1962,6 +1992,7 @@ class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
} // end catch
finally
{ // make sure the connection is released before we go
+ SQLUtil.shutdown(pstmt);
SQLUtil.shutdown(stmt);
AuditRecord.store(conn,ar);
SQLUtil.shutdown(conn);
diff --git a/src/com/silverwrist/venice/core/impl/VeniceEngineImpl.java b/src/com/silverwrist/venice/core/impl/VeniceEngineImpl.java
index 8e571aa..fba47f3 100644
--- a/src/com/silverwrist/venice/core/impl/VeniceEngineImpl.java
+++ b/src/com/silverwrist/venice/core/impl/VeniceEngineImpl.java
@@ -858,8 +858,8 @@ public class VeniceEngineImpl implements VeniceEngine, ServiceProvider, EngineBa
} // end completePasswordChange
- public UserContext createNewAccount(String remote_addr, String username, String password, String reminder)
- throws DataException, AccessError
+ public UserContext createNewAccount(String remote_addr, String username, String password, String reminder,
+ java.sql.Date dob) throws DataException, AccessError
{
checkInitialized();
SecurityMonitor smon = (SecurityMonitor)(globalsite.queryService(SecurityMonitor.class));
@@ -872,12 +872,12 @@ public class VeniceEngineImpl implements VeniceEngine, ServiceProvider, EngineBa
// Create the user account.
ReturnNewUser rnu = UserContextImpl.createAccount(env,remote_addr,username,password,false,reminder,false,
- false,confirm_num,new_role,null);
+ false,confirm_num,new_role,null,dob);
// create a new context for the user (they're now effectively logged in)
UserContextImpl rc = new UserContextImpl(globalsite,env);
rc.loadNewUser(remote_addr,rnu.getUserID(),new_role.getLevel(),username,confirm_num,rnu.getCreationDate(),
- rnu.getCreationDate());
+ rnu.getCreationDate(),dob);
rc.autoJoinCommunities(); // EJB 4/14/2001
if (logger.isDebugEnabled())
logger.debug("...created new user context");
diff --git a/src/com/silverwrist/venice/ui/RenderDirect.java b/src/com/silverwrist/venice/ui/RenderDirect.java
index 0983efc..69a7332 100644
--- a/src/com/silverwrist/venice/ui/RenderDirect.java
+++ b/src/com/silverwrist/venice/ui/RenderDirect.java
@@ -9,9 +9,9 @@
*
* The Original Code is the Venice Web Communities System.
*
- * The Initial Developer of the Original Code is Eric J. Bowersox ,
+ * The Initial Developer of the Original Code is Eric J. Bowersox ,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
- * Copyright (C) 2001 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
+ * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
@@ -21,6 +21,6 @@ import java.io.IOException;
public interface RenderDirect
{
- public abstract void render(RequestOutput out) throws IOException;
+ public void render(RequestOutput out) throws IOException;
} // end interface RenderDirect
diff --git a/src/com/silverwrist/venice/ui/RequestInput.java b/src/com/silverwrist/venice/ui/RequestInput.java
index 04cef58..ca4e59c 100644
--- a/src/com/silverwrist/venice/ui/RequestInput.java
+++ b/src/com/silverwrist/venice/ui/RequestInput.java
@@ -9,9 +9,9 @@
*
* The Original Code is the Venice Web Communities System.
*
- * The Initial Developer of the Original Code is Eric J. Bowersox ,
+ * The Initial Developer of the Original Code is Eric J. Bowersox ,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
- * Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
+ * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
@@ -48,7 +48,7 @@ public interface RequestInput extends ServiceProvider
* @return A String specifying the real path, or null if the translation cannot
* be performed.
*/
- public abstract String mapPath(String s);
+ public String mapPath(String s);
/**
* Returns the portion of the request URI that indicates the context of the request, i.e. the servlet
@@ -58,7 +58,7 @@ public interface RequestInput extends ServiceProvider
* @return A String specifying the portion of the request URI that indicates the context
* of the request.
*/
- public abstract String getContextPath();
+ public String getContextPath();
/**
* Returns the part of this request's URI that calls the servlet. This includes either the servlet name
@@ -67,7 +67,7 @@ public interface RequestInput extends ServiceProvider
* @return A String containing the name or path of the servlet being called, as specified
* in the request URI.
*/
- public abstract String getServletPath();
+ public String getServletPath();
/**
* Returns any extra path information associated with the URI the client sent when it made this request.
@@ -79,7 +79,7 @@ public interface RequestInput extends ServiceProvider
* but before the query string in the request URI; or null if the URI does not
* have any extra path information.
*/
- public abstract String getPathInfo();
+ public String getPathInfo();
/**
* Returns the query string that is contained in the request URI after the path. This method returns
@@ -88,21 +88,21 @@ public interface RequestInput extends ServiceProvider
* @return A String containing the query string or null if the URI contains
* no query string.
*/
- public abstract String getQueryString();
+ public String getQueryString();
/**
* Returns the name of the HTTP method with which this request was made, for example, GET, POST, or PUT.
*
* @return A String specifying the name of the method with which this request was made.
*/
- public abstract String getVerb();
+ public String getVerb();
/**
* Returns the Internet Protocol (IP) address of the client that sent the request.
*
* @return A String containing the IP address of the client that sent the request.
*/
- public abstract String getSourceAddress();
+ public String getSourceAddress();
/**
* Returns true if the request parameter with the specified name is defined,
@@ -112,7 +112,7 @@ public interface RequestInput extends ServiceProvider
* @param name Parameter name to be checked.
* @return See above.
*/
- public abstract boolean hasParameter(String name);
+ public boolean hasParameter(String name);
/**
* Returns the value of a request parameter as a String, or null if the
@@ -127,7 +127,7 @@ public interface RequestInput extends ServiceProvider
* @return A String representing the single value of the parameter.
* @see #getParameterValues(java.lang.String)
*/
- public abstract String getParameter(String name);
+ public String getParameter(String name);
/**
* Returns the value of a request parameter as a int, or a specified default value if
@@ -140,7 +140,7 @@ public interface RequestInput extends ServiceProvider
* @param default_value The default value to use for the parameter if the specified parameter does not exist.
* @return An int representing the single value of the parameter.
*/
- public abstract int getParameterInt(String name, int default_value);
+ public int getParameterInt(String name, int default_value);
/**
* Returns the value of a request parameter as a short, or a specified default value if
@@ -153,7 +153,7 @@ public interface RequestInput extends ServiceProvider
* @param default_value The default value to use for the parameter if the specified parameter does not exist.
* @return A short representing the single value of the parameter.
*/
- public abstract short getParameterShort(String name, short default_value);
+ public short getParameterShort(String name, short default_value);
/**
* Returns the value of a request parameter as a long, or a specified default value if
@@ -166,7 +166,7 @@ public interface RequestInput extends ServiceProvider
* @param default_value The default value to use for the parameter if the specified parameter does not exist.
* @return A long representing the single value of the parameter.
*/
- public abstract long getParameterLong(String name, long default_value);
+ public long getParameterLong(String name, long default_value);
/**
* Returns an Enumeration of String objects containing the names of the
@@ -177,7 +177,7 @@ public interface RequestInput extends ServiceProvider
* containing the name of a request parameter, or an empty Enumeration if the
* request has no parameters.
*/
- public abstract Enumeration getParameterNames();
+ public Enumeration getParameterNames();
/**
* Returns an array of String objects containing all of the values the given request
@@ -188,7 +188,7 @@ public interface RequestInput extends ServiceProvider
* @return An array of String objects containing the parameter's values.
* @see #getParameter(java.lang.String)
*/
- public abstract String[] getParameterValues(String name);
+ public String[] getParameterValues(String name);
/**
* Returns true if the specified parameter is a file parameter, false if
@@ -197,7 +197,7 @@ public interface RequestInput extends ServiceProvider
* @param name A String containing the name of the parameter to test.
* @return See above.
*/
- public abstract boolean isFileParam(String name);
+ public boolean isFileParam(String name);
/**
* Returns the MIME type of the specified parameter. If the type cannot be determined, the return
@@ -208,7 +208,7 @@ public interface RequestInput extends ServiceProvider
* @param name A String containing the name of the parameter to test.
* @return See above.
*/
- public abstract String getParameterType(String name);
+ public String getParameterType(String name);
/**
* Returns the size in bytes of the specified parameter. If the size cannot be determined, the return
@@ -219,7 +219,7 @@ public interface RequestInput extends ServiceProvider
* @param name A String containing the name of the parameter to test.
* @return See above.
*/
- public abstract int getParameterSize(String name);
+ public int getParameterSize(String name);
/**
* Returns an InputStream reading from the data of the named file parameter. If the
@@ -230,7 +230,7 @@ public interface RequestInput extends ServiceProvider
* @exception com.silverwrist.util.ServletMultipartException If there is a problem retrieving
* the parameter data stream.
*/
- public abstract InputStream getParameterDataStream(String name) throws ServletMultipartException;
+ public InputStream getParameterDataStream(String name) throws ServletMultipartException;
/**
* Returns true if the parameter set reflects the clicking of an image button with a
@@ -239,7 +239,7 @@ public interface RequestInput extends ServiceProvider
* @param name A String containing the name of the image button to test.
* @return See above.
*/
- public abstract boolean isImageButtonClicked(String name);
+ public boolean isImageButtonClicked(String name);
/**
* Returns the application-level attribute with the given name, or null if there is no
@@ -249,7 +249,7 @@ public interface RequestInput extends ServiceProvider
* @return An Object containing the value of the attribute, or null if no
* attribute exists matching the given name.
*/
- public abstract Object getAppAttribute(String name);
+ public Object getAppAttribute(String name);
/**
* Sets the application-level attribute with the given name.
@@ -258,7 +258,7 @@ public interface RequestInput extends ServiceProvider
* @param o The object to be bound as the value of that attribute, or null if the binding
* is to be removed.
*/
- public abstract void setAppAttribute(String name, Object o);
+ public void setAppAttribute(String name, Object o);
/**
* Returns the session-level attribute with the given name, or null if there is no
@@ -268,7 +268,7 @@ public interface RequestInput extends ServiceProvider
* @return An Object containing the value of the attribute, or null if no
* attribute exists matching the given name.
*/
- public abstract Object getSessionAttribute(String name);
+ public Object getSessionAttribute(String name);
/**
* Sets the session-level attribute with the given name.
@@ -277,7 +277,7 @@ public interface RequestInput extends ServiceProvider
* @param o The object to be bound as the value of that attribute, or null if the binding
* is to be removed.
*/
- public abstract void setSessionAttribute(String name, Object o);
+ public void setSessionAttribute(String name, Object o);
/**
* Returns the request-level attribute with the given name, or null if there is no
@@ -287,7 +287,7 @@ public interface RequestInput extends ServiceProvider
* @return An Object containing the value of the attribute, or null if no
* attribute exists matching the given name.
*/
- public abstract Object getRequestAttribute(String name);
+ public Object getRequestAttribute(String name);
/**
* Sets the request-level attribute with the given name.
@@ -296,21 +296,21 @@ public interface RequestInput extends ServiceProvider
* @param o The object to be bound as the value of that attribute, or null if the binding
* is to be removed.
*/
- public abstract void setRequestAttribute(String name, Object o);
+ public void setRequestAttribute(String name, Object o);
/**
* Returns the instance of the Venice engine associated with the application.
*
* @return See above.
*/
- public abstract VeniceEngine getEngine();
+ public VeniceEngine getEngine();
/**
* Returns the instance of the Venice user object associated with the session.
*
* @return See above.
*/
- public abstract UserContext getUser();
+ public UserContext getUser();
/**
* Returns the current servlet location. This is used, for instance, as the context to return to
@@ -318,7 +318,7 @@ public interface RequestInput extends ServiceProvider
*
* @return The current servlet location.
*/
- public abstract String getLocation();
+ public String getLocation();
/**
* Sets the "current" servlet location that is displayed. This is used, for instance,
@@ -326,7 +326,7 @@ public interface RequestInput extends ServiceProvider
*
* @param str The new location to be set.
*/
- public abstract void setLocation(String str);
+ public void setLocation(String str);
/**
* Returns true if the "Log In" link is to be displayed on the outer frame,
@@ -334,7 +334,7 @@ public interface RequestInput extends ServiceProvider
*
* @return See above.
*/
- public abstract boolean getDisplayLogin();
+ public boolean getDisplayLogin();
/**
* Sets whether or not the "Log In" link is to be displayed on the outer frame.
@@ -342,26 +342,26 @@ public interface RequestInput extends ServiceProvider
* @param val true to display the "Log In" link on the outer frame,
* false to omit it.
*/
- public abstract void setDisplayLogin(boolean val);
+ public void setDisplayLogin(boolean val);
- public abstract MenuComponent getMenu(String name);
+ public MenuComponent getMenu(String name);
- public abstract MenuComponent getMenu(String name, Map vars);
+ public MenuComponent getMenu(String name, Map vars);
- public abstract Dialog getDialog(String name);
+ public Dialog getDialog(String name);
- public abstract Content[] getSideBoxes() throws AccessError, DataException;
+ public Content[] getSideBoxes() throws AccessError, DataException;
- public abstract CommunityContext getCommunity();
+ public CommunityContext getCommunity();
- public abstract CommunityContext getCommunity(boolean required, String on_error) throws ErrorBox;
+ public CommunityContext getCommunity(boolean required, String on_error) throws ErrorBox;
- public abstract String getDefaultServletAddress(CommunityContext comm);
+ public String getDefaultServletAddress(CommunityContext comm);
- public abstract void registerCleanup(AutoCleanup ac);
+ public void registerCleanup(AutoCleanup ac);
- public abstract String getConfigProperty(String name);
+ public String getConfigProperty(String name);
- public abstract String getConfigProperty(String name, String default_val);
+ public String getConfigProperty(String name, String default_val);
} // end interface RequestInput
diff --git a/src/com/silverwrist/venice/ui/RequestOutput.java b/src/com/silverwrist/venice/ui/RequestOutput.java
index afd1924..6a7ca88 100644
--- a/src/com/silverwrist/venice/ui/RequestOutput.java
+++ b/src/com/silverwrist/venice/ui/RequestOutput.java
@@ -9,9 +9,9 @@
*
* The Original Code is the Venice Web Communities System.
*
- * The Initial Developer of the Original Code is Eric J. Bowersox ,
+ * The Initial Developer of the Original Code is Eric J. Bowersox ,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
- * Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
+ * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
@@ -24,32 +24,32 @@ import com.silverwrist.venice.util.ServiceProvider;
public interface RequestOutput extends ServiceProvider, LinkTypes
{
- public abstract Writer getWriter() throws IOException;
+ public Writer getWriter() throws IOException;
- public abstract void write(String s) throws IOException;
+ public void write(String s) throws IOException;
- public abstract void writeStackTrace(Throwable t) throws IOException;
+ public void writeStackTrace(Throwable t) throws IOException;
- public abstract void flush() throws IOException;
+ public void flush() throws IOException;
- public abstract void output(Content c) throws IOException, ServletException;
+ public void output(Content c) throws IOException, ServletException;
- public abstract void output(Writer out, Content c) throws IOException, ServletException;
+ public void output(Writer out, Content c) throws IOException, ServletException;
- public abstract void writeFrameHead(Writer out, Content c) throws IOException;
+ public void writeFrameHead(Writer out, Content c) throws IOException;
- public abstract void writeFrameHead(Content c) throws IOException;
+ public void writeFrameHead(Content c) throws IOException;
- public abstract void writeSiteImageTag(Writer out) throws IOException;
+ public void writeSiteImageTag(Writer out) throws IOException;
- public abstract void writeSiteImageTag() throws IOException;
+ public void writeSiteImageTag() throws IOException;
- public abstract void writeVeniceLogo(Writer out) throws IOException;
+ public void writeVeniceLogo(Writer out) throws IOException;
- public abstract void writeVeniceLogo() throws IOException;
+ public void writeVeniceLogo() throws IOException;
- public abstract void writeContentHeader(Writer out, String primary, String secondary) throws IOException;
+ public void writeContentHeader(Writer out, String primary, String secondary) throws IOException;
- public abstract void writeContentHeader(String primary, String secondary) throws IOException;
+ public void writeContentHeader(String primary, String secondary) throws IOException;
} // end interface RequestOutput
diff --git a/src/com/silverwrist/venice/ui/dlg/BaseDialogField.java b/src/com/silverwrist/venice/ui/dlg/BaseDialogField.java
index 5e88015..d32e5c6 100644
--- a/src/com/silverwrist/venice/ui/dlg/BaseDialogField.java
+++ b/src/com/silverwrist/venice/ui/dlg/BaseDialogField.java
@@ -9,9 +9,9 @@
*
* The Original Code is the Venice Web Communities System.
*
- * The Initial Developer of the Original Code is Eric J. Bowersox ,
+ * The Initial Developer of the Original Code is Eric J. Bowersox ,
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
- * Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
+ * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
*
* Contributor(s):
*/
@@ -103,9 +103,9 @@ public abstract class BaseDialogField implements DialogField
out.write(" " + StringUtil.encodeHTML(caption2));
if (!reverse)
out.write(":");
- out.write("");
+ out.write("");
if (required)
- out.write(html.getFontTag("red","content") + "*");
+ out.write(html.getFontTag("red","content") + "*");
} // end renderCaption
@@ -150,17 +150,17 @@ public abstract class BaseDialogField implements DialogField
public void render(RequestOutput out) throws IOException
{
- out.write("
\n
");
+ out.write("
\n
");
if (reverse)
renderField(out);
else
renderCaption(out);
- out.write("
\n
");
+ out.write("
\n
");
if (reverse)
renderCaption(out);
else
renderField(out);
- out.write("
\n
\n");
+ out.write("\n\n");
} // end render
diff --git a/src/com/silverwrist/venice/ui/dlg/DateField.java b/src/com/silverwrist/venice/ui/dlg/DateField.java
new file mode 100644
index 0000000..5a3994f
--- /dev/null
+++ b/src/com/silverwrist/venice/ui/dlg/DateField.java
@@ -0,0 +1,592 @@
+/*
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at .
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
+ * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
+ * language governing rights and limitations under the License.
+ *
+ * The Original Code is the Venice Web Communities System.
+ *
+ * The Initial Developer of the Original Code is Eric J. Bowersox ,
+ * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
+ * Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
+ *
+ * Contributor(s):
+ */
+package com.silverwrist.venice.ui.dlg;
+
+import java.io.IOException;
+import java.text.*;
+import java.util.*;
+import org.apache.log4j.*;
+import org.apache.regexp.*;
+import org.w3c.dom.*;
+import com.silverwrist.util.*;
+import com.silverwrist.venice.except.*;
+import com.silverwrist.venice.ui.*;
+import com.silverwrist.venice.ui.helpers.HTMLRendering;
+import com.silverwrist.venice.util.XMLLoader;
+
+public class DateField implements DialogField
+{
+ /*--------------------------------------------------------------------------------
+ * Static data members
+ *--------------------------------------------------------------------------------
+ */
+
+ public static final String TAGNAME = "date";
+
+ private static Logger logger = Logger.getLogger(DateField.class);
+
+ private static final int FLD_MONTH = 1;
+ private static final int FLD_DAY = 2;
+ private static final int FLD_YEAR = 3;
+
+ private static REProgram YRANGE = null;
+ private static REProgram YPLUS = null;
+ private static REProgram YMINUS = null;
+ private static REProgram YPLUSMINUS = null;
+ private static REProgram YMINUSPLUS = null;
+ private static REProgram YSOLO = null;
+
+ private static Hashtable s_locale_ordering = new Hashtable();
+
+ /*--------------------------------------------------------------------------------
+ * Attributes
+ *--------------------------------------------------------------------------------
+ */
+
+ private String m_name; // field name (parameter name)
+ private String m_caption; // primary caption
+ private String m_caption2; // secondary caption
+ private boolean m_required; // is this field required?
+ private boolean m_enabled; // are we enabled?
+ private int m_year_start; // first year for dropdown
+ private int m_year_stop; // last year for dropdown
+ private java.sql.Date m_value = null; // selected date
+ private int m_ndx_month = -1; // index of selected month
+ private int m_ndx_day = -1; // index of selected day
+ private int m_ndx_year = -1; // index of selected year
+ private boolean m_input_error = false; // input error?
+
+ /*--------------------------------------------------------------------------------
+ * Constructors
+ *--------------------------------------------------------------------------------
+ */
+
+ public DateField(String name, String caption, String caption2, boolean required, boolean enabled, int year_start,
+ int year_stop)
+ {
+ m_name = name;
+ m_caption = caption;
+ m_caption2 = caption2;
+ m_required = required;
+ m_enabled = enabled;
+ m_year_start = year_start;
+ m_year_stop = year_stop;
+
+ } // end constructor
+
+ public DateField(Element elt) throws ConfigException
+ {
+ XMLLoader loader = XMLLoader.get();
+ m_name = loader.configGetAttribute(elt,"name");
+ m_caption = loader.configGetAttribute(elt,"capt");
+ m_caption2 = elt.getAttribute("capt2");
+ DOMElementHelper h = new DOMElementHelper(elt);
+ m_required = h.hasAttribute("required");
+ m_enabled = !(h.hasAttribute("disabled"));
+ String countdir = elt.getAttribute("direction");
+ if (StringUtil.isStringEmpty(countdir))
+ countdir = "down";
+ else if (!(countdir.equalsIgnoreCase("up") || countdir.equalsIgnoreCase("down")))
+ throw new ConfigException(" direction= attribute must be 'up' or 'down'",elt);
+ int y1, y2;
+ String yearspec = elt.getAttribute("years");
+ if (StringUtil.isStringEmpty(yearspec))
+ { // use a 70 year span back from the current year
+ Calendar cal = Calendar.getInstance();
+ y1 = cal.get(Calendar.YEAR);
+ y2 = y1 - 70;
+
+ } // end if
+ else
+ { // now recognize what the field value is
+ do
+ { // attempt to recognize a range
+ RE re = new RE(YRANGE);
+ if (re.match(yearspec))
+ { // got a year range
+ y1 = Integer.parseInt(re.getParen(1));
+ y2 = Integer.parseInt(re.getParen(2));
+ break;
+
+ } // end if
+
+ Calendar cal = Calendar.getInstance();
+ re = new RE(YPLUS);
+ if (re.match(yearspec))
+ { // +number - range from current year forward some years
+ y1 = cal.get(Calendar.YEAR);
+ y2 = y1 + Integer.parseInt(re.getParen(1));
+ break;
+
+ } // end if
+
+ re = new RE(YMINUS);
+ if (re.match(yearspec))
+ { // -number - range from current year backward some years
+ y1 = cal.get(Calendar.YEAR);
+ y2 = y1 - Integer.parseInt(re.getParen(1));
+ break;
+
+ } // end if
+
+ re = new RE(YPLUSMINUS);
+ if (re.match(yearspec))
+ { // +number -number - brackets around the current year
+ int foo = cal.get(Calendar.YEAR);
+ y1 = foo + Integer.parseInt(re.getParen(1));
+ y2 = foo - Integer.parseInt(re.getParen(2));
+ break;
+
+ } // end if
+
+ re = new RE(YMINUSPLUS);
+ if (re.match(yearspec))
+ { // -number +number - brackets around the current year
+ int foo = cal.get(Calendar.YEAR);
+ y1 = foo - Integer.parseInt(re.getParen(1));
+ y2 = foo + Integer.parseInt(re.getParen(2));
+ break;
+
+ } // end if
+
+ re = new RE(YSOLO);
+ if (re.match(yearspec))
+ { // solo number - one end of year spec, current year being the other
+ y1 = cal.get(Calendar.YEAR);
+ y2 = Integer.parseInt(re.getParen(1));
+ break;
+
+ } // end if
+
+ throw new ConfigException(" years= attribute: invalid syntax",elt);
+
+ } while (false); // end do
+
+ } // end else
+
+ if (countdir.equalsIgnoreCase("down"))
+ { // organize for counting downward
+ m_year_start = Math.max(y1,y2);
+ m_year_stop = Math.min(y1,y2);
+
+ } // end if
+ else
+ { // organize for counting upward
+ m_year_start = Math.min(y1,y2);
+ m_year_stop = Math.max(y1,y2);
+
+ } // end else
+
+ } // end constructor
+
+ protected DateField(DateField other)
+ {
+ m_name = other.m_name;
+ m_caption = other.m_caption;
+ m_caption2 = other.m_caption2;
+ m_required = other.m_required;
+ m_enabled = other.m_enabled;
+ m_year_start = other.m_year_start;
+ m_year_stop = other.m_year_stop;
+
+ } // end constructor
+
+ /*--------------------------------------------------------------------------------
+ * Internal operations
+ *--------------------------------------------------------------------------------
+ */
+
+ private static final int[] getDateFieldOrdering(Locale locale)
+ {
+ int[] rc = (int[])(s_locale_ordering.get(locale));
+ if (rc!=null)
+ return rc;
+
+ // We determine the date format by encoding the date September 18, 2003, into "short"
+ // date format, then measuring the relative positions of the digits 9, 8, and 3.
+ // It's severely hackish, but there seems to be no Java API whereby we can directly
+ // get this information.
+ DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT,locale);
+ Calendar cal = fmt.getCalendar();
+ cal.set(Calendar.YEAR,2003);
+ cal.set(Calendar.MONTH,Calendar.SEPTEMBER);
+ cal.set(Calendar.DAY_OF_MONTH,18);
+ String s = fmt.format(cal.getTime());
+ int pday = s.indexOf('8');
+ int pmonth = s.indexOf('9');
+ int pyear = s.indexOf('3');
+ rc = new int[3];
+ if (pday");
+ DateFormatSymbols syms = new DateFormatSymbols(html.getLocale());
+ String[] months = syms.getMonths();
+ for (int i=cal.getMinimum(Calendar.MONTH); i<=cal.getMaximum(Calendar.MONTH); i++)
+ { // write the choices
+ out.write("");
+
+ } // end for
+
+ out.write("\n");
+
+ } // end if
+ else if (which==FLD_DAY)
+ { // render the "day" field
+ out.write("\n");
+
+ } // end if
+ else if (which==FLD_YEAR)
+ { // render the "year" drop down
+ out.write("\n");
+
+ } // end else if
+
+ } // end renderDropDown
+
+ /*--------------------------------------------------------------------------------
+ * Implementations from interface RenderDirect
+ *--------------------------------------------------------------------------------
+ */
+
+ public void render(RequestOutput out) throws IOException
+ {
+ HTMLRendering html = (HTMLRendering)(out.queryService(HTMLRendering.class));
+ Calendar cal = Calendar.getInstance(TimeZone.getDefault(),html.getLocale());
+ if ((m_value!=null) && !m_input_error)
+ { // split date into month, day, and year
+ cal.setTime(m_value);
+ if (m_ndx_month==-1)
+ m_ndx_month = cal.get(Calendar.MONTH);
+ if (m_ndx_day==-1)
+ m_ndx_day = cal.get(Calendar.DAY_OF_MONTH);
+ if (m_ndx_year==-1)
+ m_ndx_year = cal.get(Calendar.YEAR);
+
+ } // end if
+ else // everything is not set
+ m_ndx_month = m_ndx_day = m_ndx_year = -1;
+
+ // write the caption and the basic table framework
+ out.write("