From 5c0f841ab732908f10a1608d5162faad26aaaf4a Mon Sep 17 00:00:00 2001 From: "Eric J. Bowersox" Date: Wed, 30 Jun 2004 07:10:05 +0000 Subject: [PATCH] added "date of birth" as a users table field, added appropriate code to core to get and set it, added "date" dialog field and updated registration, profile, and admin modify to use it to change a user's date of birth; added BDAY support to vCards and rigged user import/export to take it into account; cleaned up a few other matters while I was in that particular code --- etc/ui-config.xml | 4 + scripts/new_account_2.js | 2 +- scripts/profile.js | 6 +- scripts/sysadmin/modify_user.js | 6 +- setup/database.sql | 1 + .../venice/core/AdminOperations.java | 38 +- .../venice/core/AdminUserContext.java | 54 +- .../silverwrist/venice/core/UserContext.java | 107 ++-- .../silverwrist/venice/core/VeniceEngine.java | 65 +- .../venice/core/impl/AdminOperationsImpl.java | 6 +- .../core/impl/AdminUserContextImpl.java | 161 +++-- .../venice/core/impl/UserContextImpl.java | 397 ++++++------ .../venice/core/impl/VeniceEngineImpl.java | 8 +- .../silverwrist/venice/ui/RenderDirect.java | 6 +- .../silverwrist/venice/ui/RequestInput.java | 86 +-- .../silverwrist/venice/ui/RequestOutput.java | 32 +- .../venice/ui/dlg/BaseDialogField.java | 14 +- .../silverwrist/venice/ui/dlg/DateField.java | 592 ++++++++++++++++++ .../venice/ui/dlg/DialogElementLoader.java | 4 +- .../venice/ui/dlg/DialogField.java | 28 +- .../venice/ui/dlg/PickListField.java | 16 +- .../venice/ui/helpers/HTMLRendering.java | 54 +- .../venice/ui/helpers/ImportHelper.java | 2 +- .../venice/ui/servlet/RequestImpl.java | 17 +- .../silverwrist/venice/util/BuildVCard.java | 16 +- src/com/silverwrist/venice/util/VCard.java | 59 +- 26 files changed, 1270 insertions(+), 511 deletions(-) create mode 100644 src/com/silverwrist/venice/ui/dlg/DateField.java 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("\n"); + out.write(html.getFontTag(m_enabled ? html.CONTENT_FOREGROUND : html.CONTENT_DISABLED,"content")); + out.write(StringUtil.encodeHTML(m_caption)); + if (!(StringUtil.isStringEmpty(m_caption2))) + out.write(" " + StringUtil.encodeHTML(m_caption2)); + out.write(":"); + if (m_required) + out.write(html.getFontTag("red","content") + "*"); + out.write("\n"); + + // write the drop-down list boxes + int[] order = getDateFieldOrdering(html.getLocale()); + renderDropDown(order[0],out); + out.write(" \n"); + renderDropDown(order[1],out); + out.write(" \n"); + renderDropDown(order[2],out); + + // finish up + out.write("\n\n"); + + } // end render + + /*-------------------------------------------------------------------------------- + * Implementations from interface DialogField + *-------------------------------------------------------------------------------- + */ + + public String getName() + { + return m_name; + + } // end getName + + public Object getValue() + { + return m_value; + + } // end getValue + + public void setValue(Object o) + { + if (o==null) + m_value = null; + else if (o instanceof java.sql.Date) + m_value = (java.sql.Date)(((java.sql.Date)o).clone()); + else if (o instanceof java.util.Date) + m_value = new java.sql.Date(((java.util.Date)o).getTime()); + else if (o instanceof Calendar) + m_value = new java.sql.Date(((Calendar)o).getTimeInMillis()); + else if (o instanceof Number) + m_value = new java.sql.Date(((Number)o).longValue()); + else + throw new IllegalArgumentException("cannot convert argument to java.sql.Date"); + if (logger.isDebugEnabled()) + logger.debug("Set date: " + m_value); + m_ndx_month = m_ndx_day = m_ndx_year = -1; // kill indexes + m_input_error = false; + + } // end setValue + + public void setValueFrom(RequestInput ri) + { + m_ndx_month = ri.getParameterInt(m_name + "_month",-1); + m_ndx_day = ri.getParameterInt(m_name + "_day",-1); + m_ndx_year = ri.getParameterInt(m_name + "_year",-1); + if (logger.isDebugEnabled()) + logger.debug("Raw input: M=" + m_ndx_month + ", D=" + m_ndx_day + ", Y=" + m_ndx_year); + + if ((m_ndx_month==-1) || (m_ndx_day==-1) || (m_ndx_year==-1)) + { // the date is to be treated as "unspecified" + logger.debug("Killing the kittens!"); + m_value = null; + m_ndx_month = m_ndx_day = m_ndx_year = -1; // kill indexes + m_input_error = false; + return; + + } // end if + + HTMLRendering html = (HTMLRendering)(ri.queryService(HTMLRendering.class)); + Calendar cal = Calendar.getInstance(TimeZone.getDefault(),html.getLocale()); + cal.clear(); + cal.setLenient(false); + m_input_error = false; + try + { // set the calendar and create the actual value + cal.set(Calendar.YEAR,m_ndx_year); + cal.set(Calendar.MONTH,m_ndx_month); + cal.set(Calendar.DAY_OF_MONTH,m_ndx_day); + cal.set(Calendar.HOUR,0); + cal.set(Calendar.MINUTE,0); + cal.set(Calendar.SECOND,0); + cal.set(Calendar.MILLISECOND,0); + m_value = new java.sql.Date(cal.getTimeInMillis()); + if (logger.isDebugEnabled()) + logger.debug("Verified date: " + m_value); + + } // end try + catch (IllegalArgumentException e) + { // set error flag and recompute value with relaxed rules + m_input_error = true; + cal.clear(); + cal.setLenient(true); + cal.set(Calendar.YEAR,m_ndx_year); + cal.set(Calendar.MONTH,m_ndx_month); + cal.set(Calendar.DAY_OF_MONTH,m_ndx_day); + cal.set(Calendar.HOUR,0); + cal.set(Calendar.MINUTE,0); + cal.set(Calendar.SECOND,0); + cal.set(Calendar.MILLISECOND,0); + m_value = new java.sql.Date(cal.getTimeInMillis()); + if (logger.isDebugEnabled()) + logger.debug("UN-Verified date: " + m_value); + + } // end catch + + } // end setValueFrom + + public boolean isRequired() + { + return m_required; + + } // end isRequired + + public boolean isFile() + { + return false; + + } // end isFile + + public boolean isHidden() + { + return false; + + } // end isHidden + + public void validate() throws ValidationException + { + if (m_required && (m_value==null)) + throw new ValidationException("The '" + m_caption + "' field is required."); + if (m_input_error) + throw new ValidationException("Invalid date entered in the '" + m_caption + "' field."); + + } // end validate + + public boolean isEnabled() + { + return m_enabled; + + } // end isEnabled + + public void setEnabled(boolean flag) + { + m_enabled = flag; + + } // end setEnabled + + public Object sendMessage(String msg, Object data) + { + return null; + + } // end sendMessage + + public DialogField duplicate() + { + return new DateField(this); + + } // end duplicate + + /*-------------------------------------------------------------------------------- + * Static initializer + *-------------------------------------------------------------------------------- + */ + + static + { + RECompiler compiler = new RECompiler(); + try + { // compile all local regular expressions + YRANGE = compiler.compile("^\\s*(\\d+)\\s*-\\s*(\\d+)\\s*$"); + YPLUS = compiler.compile("^\\s*\\+\\s*(\\d+)\\s*$"); + YMINUS = compiler.compile("^\\s*-\\s*(\\d+)\\s*$"); + YPLUSMINUS = compiler.compile("^\\s*\\+\\s*(\\d+)\\s*-\\s*(\\d+)\\s*$"); + YMINUSPLUS = compiler.compile("^\\s*-\\s*(\\d+)\\s*\\+\\s*(\\d+)\\s*$"); + YSOLO = compiler.compile("^\\s*(\\d+)\\s*$"); + + } // end try + catch (RESyntaxException e) + { // whoops! + logger.fatal("Regexp Syntax Error",e); + + } // end catch + + } // end static initializer + +} // end class DateField diff --git a/src/com/silverwrist/venice/ui/dlg/DialogElementLoader.java b/src/com/silverwrist/venice/ui/dlg/DialogElementLoader.java index ccab356..0866b5b 100644 --- a/src/com/silverwrist/venice/ui/dlg/DialogElementLoader.java +++ b/src/com/silverwrist/venice/ui/dlg/DialogElementLoader.java @@ -31,13 +31,13 @@ public class DialogElementLoader *-------------------------------------------------------------------------------- */ - private static Category logger = Category.getInstance(DialogElementLoader.class); + private static Logger logger = Logger.getLogger(DialogElementLoader.class); private static DialogElementLoader self = null; private static final Class[] init_classes = { CategoryHeader.class, CheckBoxField.class, CommunityLogoField.class, CountryListField.class, - EMailAddressField.class, HiddenField.class, ImageButton.class, IntegerField.class, + DateField.class, EMailAddressField.class, HiddenField.class, ImageButton.class, IntegerField.class, IPAddressField.class, LanguageListField.class, LocaleListField.class, PasswordField.class, RoleListField.class, StaticPickListField.class, TextField.class, TimeZoneListField.class, UserPhotoField.class, VeniceIDField.class diff --git a/src/com/silverwrist/venice/ui/dlg/DialogField.java b/src/com/silverwrist/venice/ui/dlg/DialogField.java index 1e2afaf..978048c 100644 --- a/src/com/silverwrist/venice/ui/dlg/DialogField.java +++ b/src/com/silverwrist/venice/ui/dlg/DialogField.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): */ @@ -23,28 +23,28 @@ import com.silverwrist.venice.ui.RequestInput; public interface DialogField extends RenderDirect { - public abstract String getName(); + public String getName(); - public abstract Object getValue(); + public Object getValue(); - public abstract void setValue(Object o); + public void setValue(Object o); - public abstract void setValueFrom(RequestInput ri); + public void setValueFrom(RequestInput ri); - public abstract boolean isRequired(); + public boolean isRequired(); - public abstract boolean isFile(); + public boolean isFile(); - public abstract boolean isHidden(); + public boolean isHidden(); - public abstract void validate() throws ValidationException; + public void validate() throws ValidationException; - public abstract boolean isEnabled(); + public boolean isEnabled(); - public abstract void setEnabled(boolean flag); + public void setEnabled(boolean flag); - public abstract Object sendMessage(String msg, Object data); + public Object sendMessage(String msg, Object data); - public abstract DialogField duplicate(); + public DialogField duplicate(); } // end interface DialogField diff --git a/src/com/silverwrist/venice/ui/dlg/PickListField.java b/src/com/silverwrist/venice/ui/dlg/PickListField.java index 12d5980..a4fd034 100644 --- a/src/com/silverwrist/venice/ui/dlg/PickListField.java +++ b/src/com/silverwrist/venice/ui/dlg/PickListField.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): */ @@ -75,9 +75,9 @@ public abstract class PickListField extends BaseDialogField protected void renderField(RequestOutput out) throws IOException { - out.write("\n"); // all done + out.write("\n"); // all done } // end render diff --git a/src/com/silverwrist/venice/ui/helpers/HTMLRendering.java b/src/com/silverwrist/venice/ui/helpers/HTMLRendering.java index 6a505fe..ebc95d3 100644 --- a/src/com/silverwrist/venice/ui/helpers/HTMLRendering.java +++ b/src/com/silverwrist/venice/ui/helpers/HTMLRendering.java @@ -9,64 +9,70 @@ * * 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) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. + * Copyright (C) 2002-2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * * Contributor(s): */ package com.silverwrist.venice.ui.helpers; import java.awt.Dimension; +import java.util.Calendar; import java.util.Date; +import java.util.Locale; import java.util.Map; import com.silverwrist.venice.ui.ColorSelectors; import com.silverwrist.venice.ui.LinkTypes; public interface HTMLRendering extends ColorSelectors, LinkTypes { - public abstract String getColor(int selector); + public String getColor(int selector); - public abstract String getColor(String name); + public String getColor(String name); - public abstract boolean useHTMLComments(); + public boolean useHTMLComments(); - public abstract String formatURL(String url, int type); + public String formatURL(String url, int type); - public abstract String formatDate(Date date); + public String formatDate(Date date); - public abstract String getFontTag(int colorsel, int size); + public String getFontTag(int colorsel, int size); - public abstract String getFontTag(String color, int size); + public String getFontTag(String color, int size); - public abstract String getFontTag(int colorsel, String size); + public String getFontTag(int colorsel, String size); - public abstract String getFontTag(String color, String size); + public String getFontTag(String color, String size); - public abstract int convertLinkType(String str); + public int convertLinkType(String str); - public abstract String getStockMessage(String key); + public String getStockMessage(String key); - public abstract String getStockMessage(String key, Map vars); + public String getStockMessage(String key, Map vars); - public abstract String getStaticPath(String s); + public String getStaticPath(String s); - public abstract String getExternalStaticPath(String s); + public String getExternalStaticPath(String s); - public abstract String getImagePath(String s); + public String getImagePath(String s); - public abstract String getButtonVisual(String id); + public String getButtonVisual(String id); - public abstract String getButtonInput(String id); + public String getButtonInput(String id); - public abstract String getUserPhotoTag(String url); + public String getUserPhotoTag(String url); - public abstract String getUserPhotoTag(String url, Dimension size); + public String getUserPhotoTag(String url, Dimension size); - public abstract String getActivityString(Date date); + public String getActivityString(Date date); - public abstract String getCommunityLogoTag(String url); + public String getCommunityLogoTag(String url); - public abstract String expandServletPath(String spath); + public String expandServletPath(String spath); + + public Calendar getCalendar(); + + public Locale getLocale(); } // end interface HTMLRendering diff --git a/src/com/silverwrist/venice/ui/helpers/ImportHelper.java b/src/com/silverwrist/venice/ui/helpers/ImportHelper.java index 2534468..d6263bc 100644 --- a/src/com/silverwrist/venice/ui/helpers/ImportHelper.java +++ b/src/com/silverwrist/venice/ui/helpers/ImportHelper.java @@ -241,7 +241,7 @@ public class ImportHelper try { // create the user context AdminUserContext uc = adm.createNewAccount(username,password,prehashed,reminder,confirm,locked,r, - description,autojoin); + description,vcard.getBirthday(),autojoin); // set up the contact info ContactInfo ci = uc.getContactInfo(); diff --git a/src/com/silverwrist/venice/ui/servlet/RequestImpl.java b/src/com/silverwrist/venice/ui/servlet/RequestImpl.java index 47c72f6..418e2a6 100644 --- a/src/com/silverwrist/venice/ui/servlet/RequestImpl.java +++ b/src/com/silverwrist/venice/ui/servlet/RequestImpl.java @@ -656,7 +656,10 @@ public class RequestImpl implements RequestInput { // read the user's preferred locale try { // get the user default locale - my_locale = session.getUser().getLocale(); + if (session.getUser()!=null) + my_locale = session.getUser().getLocale(); + else + my_locale = Locale.getDefault(); } // end try catch (DataException de) @@ -2248,6 +2251,18 @@ class HTMLRenderingImpl implements HTMLRendering } // end expandServletPath + public Calendar getCalendar() + { + return new GregorianCalendar(req.getTimeZone(),req.getLocale()); + + } // end getCalendar + + public Locale getLocale() + { + return req.getLocale(); + + } // end getLocale + } // end class HTMLRenderingImpl class ScriptSupportImpl implements ScriptSupport diff --git a/src/com/silverwrist/venice/util/BuildVCard.java b/src/com/silverwrist/venice/util/BuildVCard.java index 23e2c17..11fec17 100644 --- a/src/com/silverwrist/venice/util/BuildVCard.java +++ b/src/com/silverwrist/venice/util/BuildVCard.java @@ -45,6 +45,7 @@ public class BuildVCard private String note = null; private String sort_string = null; private String url = null; + private java.sql.Date m_bday = null; /*-------------------------------------------------------------------------------- * Constructor @@ -315,6 +316,18 @@ public class BuildVCard } // end setURL + public final java.sql.Date getBirthday() + { + return m_bday; + + } // end getBirthday + + public final void setBirthday(java.sql.Date d) + { + m_bday = d; + + } // end setBirthday + /*-------------------------------------------------------------------------------- * External operations *-------------------------------------------------------------------------------- @@ -340,13 +353,14 @@ public class BuildVCard note = null; sort_string = null; url = null; + m_bday = null; } // end reset public VCard create() { return new VCard(realFormattedName(),family_name,given_name,middle_name,prefix,suffix,nickname,addresses,phones, - email_addresses,mailer,timezone,title,role,orgname,note,sort_string,url); + email_addresses,mailer,timezone,title,role,orgname,note,sort_string,url,m_bday); } // end create diff --git a/src/com/silverwrist/venice/util/VCard.java b/src/com/silverwrist/venice/util/VCard.java index d4391b2..11cb6b4 100644 --- a/src/com/silverwrist/venice/util/VCard.java +++ b/src/com/silverwrist/venice/util/VCard.java @@ -18,6 +18,7 @@ package com.silverwrist.venice.util; import java.io.*; +import java.text.*; import java.util.*; import org.apache.log4j.*; import org.w3c.dom.*; @@ -33,6 +34,9 @@ public class VCard private static Category logger = Category.getInstance(VCard.class); + private static final DateFormat ISO_EXTENDED = new SimpleDateFormat("yyyy-MM-dd"); + private static final DateFormat ISO_STD = new SimpleDateFormat("yyyyMMdd"); + /*-------------------------------------------------------------------------------- * Attributes *-------------------------------------------------------------------------------- @@ -56,6 +60,7 @@ public class VCard private String note = null; private String sort_string = null; private String url = null; + private java.sql.Date m_bday = null; /*-------------------------------------------------------------------------------- * Constructors @@ -64,7 +69,8 @@ public class VCard VCard(String formatted_name, String family_name, String given_name, String middle_name, String prefix, String suffix, String nickname, Collection addresses, Collection phones, Collection email_addresses, String mailer, - String timezone, String title, String role, String orgname, String note, String sort_string, String url) + String timezone, String title, String role, String orgname, String note, String sort_string, String url, + java.sql.Date bday) { this.formatted_name = formatted_name; this.family_name = family_name; @@ -84,6 +90,7 @@ public class VCard this.note = note; this.sort_string = sort_string; this.url = url; + m_bday = bday; } // end constructor @@ -176,10 +183,11 @@ public class VCard sort_string = readElemText((Element)n); else if (nm.equals("URL")) url = readElemText((Element)n); - else if ( nm.equals("PHOTO") || nm.equals("BDAY") || nm.equals("LABEL") || nm.equals("GEO") - || nm.equals("LOGO") || nm.equals("AGENT") || nm.equals("CATEGORIES") || nm.equals("PRODID") - || nm.equals("REV") || nm.equals("SOUND") || nm.equals("UID") || nm.equals("CLASS") - || nm.equals("KEY")) + else if (nm.equals("BDAY")) + m_bday = readDateValue((Element)n); + else if ( nm.equals("PHOTO") || nm.equals("LABEL") || nm.equals("GEO") || nm.equals("LOGO") + || nm.equals("AGENT") || nm.equals("CATEGORIES") || nm.equals("PRODID") || nm.equals("REV") + || nm.equals("SOUND") || nm.equals("UID") || nm.equals("CLASS") || nm.equals("KEY")) { // a catch-all for elements that we don't support yet logger.warn("vCard <" + nm + "/> element is not yet supported"); @@ -265,6 +273,39 @@ public class VCard } // end readTimeZoneText + private static final java.sql.Date readDateValue(Element elt) throws ValidationException + { + DOMElementHelper h = new DOMElementHelper(elt); + String s = h.getElementText(); + if (s==null) + return null; + s = s.trim(); + + java.util.Date tmp; + try + { // try parsing via extended first + tmp = ISO_EXTENDED.parse(s); + return new java.sql.Date(tmp.getTime()); + + } // end try + catch (ParseException e) + { // do nothing, just fall through and try again + } // end catch + + try + { // now try parsing with standard format + tmp = ISO_STD.parse(s); + return new java.sql.Date(tmp.getTime()); + + } // end try + catch (ParseException e) + { // NOW bail out of here! + throw new ValidationException("date value could not be parsed"); + + } // end catch + + } // end readDateValue + private VCardAddress findAddress(VCardAddress.Predicate pred) { Iterator it = addresses.iterator(); @@ -405,6 +446,12 @@ public class VCard } // end getURL + public final java.sql.Date getBirthday() + { + return m_bday; + + } // end getBirthday + /*-------------------------------------------------------------------------------- * External operations *-------------------------------------------------------------------------------- @@ -650,6 +697,8 @@ public class VCard xml_writer.write("" + sort_string + "\n"); if (!StringUtil.isStringEmpty(url)) xml_writer.write("" + url + "\n"); + if (m_bday!=null) + xml_writer.write("" + ISO_EXTENDED.format(m_bday) + "\n"); xml_writer.write("\n"); } // end exportXML