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
This commit is contained in:
		
							parent
							
								
									50c76b3dc7
								
							
						
					
					
						commit
						5c0f841ab7
					
				@ -490,6 +490,8 @@ To create a new account, please enter your information below.
 | 
			
		||||
      <countrylist name="country" capt="Country" required="true"/>
 | 
			
		||||
      <header capt="E-Mail"/>
 | 
			
		||||
      <email name="email" capt="E-mail address" required="true" size="32" maxlength="255"/>
 | 
			
		||||
      <header capt="Other Information"/>
 | 
			
		||||
      <date name="dob" capt="Date of birth" years="-100"/>
 | 
			
		||||
      <header capt="Account Information"/>
 | 
			
		||||
      <veniceid name="user" capt="User name" required="true" size="32" maxlength="64"/>
 | 
			
		||||
      <password name="pass1" capt="Password" required="true" size="32" maxlength="128"/>
 | 
			
		||||
@ -549,6 +551,7 @@ will be fully validated.  If you have not received your confirmation within a fe
 | 
			
		||||
      <checkbox name="pvt_email" capt="Hide E-mail address in profile"/>
 | 
			
		||||
      <text name="url" capt="Home Page" capt2="(URL)" size="32" maxlength="255"/>
 | 
			
		||||
      <header capt="Personal"/>
 | 
			
		||||
      <date name="dob" capt="Date of birth" years="-100"/>
 | 
			
		||||
      <text name="descr" capt="Personal description" size="32" maxlength="255"/>
 | 
			
		||||
      <userphoto name="photo" capt="User Photo" link="profile_photo.js.vs" type="servlet"/>
 | 
			
		||||
      <header capt="User Preferences"/>
 | 
			
		||||
@ -708,6 +711,7 @@ the community's host, or via an invitation e-mail message. Please enter it in th
 | 
			
		||||
      <checkbox name="pvt_email" capt="Hide E-mail address in profile"/>
 | 
			
		||||
      <text name="url" capt="Home Page" capt2="(URL)" size="32" maxlength="255"/>
 | 
			
		||||
      <header capt="Personal"/>
 | 
			
		||||
      <date name="dob" capt="Date of birth" years="-100"/>
 | 
			
		||||
      <text name="descr" capt="Personal description" size="32" maxlength="255"/>
 | 
			
		||||
      <userphoto name="photo" capt="User Photo" link="sysadmin/modify_photo.js.vs" type="servlet"/>
 | 
			
		||||
      <header capt="User Preferences"/>
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
 | 
			
		||||
@ -8,9 +8,9 @@
 | 
			
		||||
// 
 | 
			
		||||
// The Original Code is the Venice Web Communities System.
 | 
			
		||||
// 
 | 
			
		||||
// The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
// The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
			
		||||
// 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");
 | 
			
		||||
 | 
			
		||||
@ -8,9 +8,9 @@
 | 
			
		||||
// 
 | 
			
		||||
// The Original Code is the Venice Web Communities System.
 | 
			
		||||
// 
 | 
			
		||||
// The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
// The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
			
		||||
// 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");
 | 
			
		||||
 | 
			
		||||
@ -90,6 +90,7 @@ CREATE TABLE users (
 | 
			
		||||
    lastaccess DATETIME,
 | 
			
		||||
    passreminder VARCHAR(255) DEFAULT '',
 | 
			
		||||
    description VARCHAR(255),
 | 
			
		||||
    dob DATE,
 | 
			
		||||
    UNIQUE INDEX username_x (username)
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -9,9 +9,9 @@
 | 
			
		||||
 * 
 | 
			
		||||
 * The Original Code is the Venice Web Communities System.
 | 
			
		||||
 * 
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
			
		||||
 * 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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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"))
 | 
			
		||||
 | 
			
		||||
@ -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; i<tmp_cid.size(); i++)
 | 
			
		||||
      { // see if the user is already a member of this community
 | 
			
		||||
	Integer x_cid = (Integer)(tmp_cid.get(i));
 | 
			
		||||
	rs = stmt.executeQuery("SELECT sigid FROM sigmember WHERE sigid = " + x_cid + " AND uid = " + uid
 | 
			
		||||
			       + ";");
 | 
			
		||||
	stmt.setInt(1,x_cid.intValue());
 | 
			
		||||
	stmt.setInt(2,uid);
 | 
			
		||||
	rs = stmt.executeQuery();
 | 
			
		||||
	if (!(rs.next()))
 | 
			
		||||
	{ // tack this information onto the end of our big "INSERT" command
 | 
			
		||||
	  Boolean x_locked = (Boolean)(tmp_locked.get(i));
 | 
			
		||||
	  if (sql.length()==0)
 | 
			
		||||
	    sql.append("INSERT INTO sigmember (sigid, uid, granted_lvl, locked) VALUES ");
 | 
			
		||||
	  else
 | 
			
		||||
	    sql.append(", ");
 | 
			
		||||
	  sql.append("(").append(x_cid).append(", ").append(uid).append(", ").append(new_level).append(", ");
 | 
			
		||||
	  sql.append(x_locked.booleanValue() ? '1' : '0').append(")");
 | 
			
		||||
	  stmt2.setInt(1,x_cid.intValue());
 | 
			
		||||
	  stmt2.setInt(2,uid);
 | 
			
		||||
	  stmt2.setInt(3,new_level);
 | 
			
		||||
	  stmt2.setInt(4,x_locked.booleanValue() ? 1 : 0);
 | 
			
		||||
	  stmt2.executeUpdate();
 | 
			
		||||
				 
 | 
			
		||||
	} // end if
 | 
			
		||||
 | 
			
		||||
      } // end for
 | 
			
		||||
 | 
			
		||||
      if (sql.length()>0)
 | 
			
		||||
      { // 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);
 | 
			
		||||
 | 
			
		||||
@ -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");
 | 
			
		||||
 | 
			
		||||
@ -9,9 +9,9 @@
 | 
			
		||||
 * 
 | 
			
		||||
 * The Original Code is the Venice Web Communities System.
 | 
			
		||||
 * 
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
			
		||||
 * 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
 | 
			
		||||
 | 
			
		||||
@ -9,9 +9,9 @@
 | 
			
		||||
 * 
 | 
			
		||||
 * The Original Code is the Venice Web Communities System.
 | 
			
		||||
 * 
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
			
		||||
 * 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 <CODE>String</CODE> specifying the real path, or <CODE>null</CODE> 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 <CODE>String</CODE> 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 <CODE>String</CODE> 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 <CODE>null</CODE> 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 <CODE>String</CODE> containing the query string or <CODE>null</CODE> 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 <CODE>String</CODE> 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 <CODE>String</CODE> containing the IP address of the client that sent the request.
 | 
			
		||||
   */
 | 
			
		||||
  public abstract String getSourceAddress();
 | 
			
		||||
  public String getSourceAddress();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns <CODE>true</CODE> 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 <CODE>String</CODE>, or <CODE>null</CODE> if the
 | 
			
		||||
@ -127,7 +127,7 @@ public interface RequestInput extends ServiceProvider
 | 
			
		||||
   * @return A <CODE>String</CODE> 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 <CODE>int</CODE>, 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 <CODE>int</CODE> 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 <CODE>short</CODE>, 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 <CODE>short</CODE> 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 <CODE>long</CODE>, 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 <CODE>long</CODE> 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 <CODE>Enumeration</CODE> of <CODE>String</CODE> 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 <CODE>Enumeration</CODE> if the
 | 
			
		||||
   *         request has no parameters.
 | 
			
		||||
   */
 | 
			
		||||
  public abstract Enumeration getParameterNames();
 | 
			
		||||
  public Enumeration getParameterNames();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns an array of <CODE>String</CODE> objects containing all of the values the given request
 | 
			
		||||
@ -188,7 +188,7 @@ public interface RequestInput extends ServiceProvider
 | 
			
		||||
   * @return An array of <CODE>String</CODE> objects containing the parameter's values.
 | 
			
		||||
   * @see #getParameter(java.lang.String)
 | 
			
		||||
   */
 | 
			
		||||
  public abstract String[] getParameterValues(String name);
 | 
			
		||||
  public String[] getParameterValues(String name);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns <CODE>true</CODE> if the specified parameter is a file parameter, <CODE>false</CODE> if
 | 
			
		||||
@ -197,7 +197,7 @@ public interface RequestInput extends ServiceProvider
 | 
			
		||||
   * @param name A <CODE>String</CODE> 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 <CODE>String</CODE> 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 <CODE>String</CODE> containing the name of the parameter to test.
 | 
			
		||||
   * @return See above.
 | 
			
		||||
   */
 | 
			
		||||
  public abstract int getParameterSize(String name);
 | 
			
		||||
  public int getParameterSize(String name);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns an <CODE>InputStream</CODE> 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 <CODE>true</CODE> 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 <CODE>String</CODE> 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 <CODE>null</CODE> if there is no
 | 
			
		||||
@ -249,7 +249,7 @@ public interface RequestInput extends ServiceProvider
 | 
			
		||||
   * @return An <CODE>Object</CODE> containing the value of the attribute, or <CODE>null</CODE> 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 <CODE>null</CODE> 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 <CODE>null</CODE> if there is no
 | 
			
		||||
@ -268,7 +268,7 @@ public interface RequestInput extends ServiceProvider
 | 
			
		||||
   * @return An <CODE>Object</CODE> containing the value of the attribute, or <CODE>null</CODE> 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 <CODE>null</CODE> 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 <CODE>null</CODE> if there is no
 | 
			
		||||
@ -287,7 +287,7 @@ public interface RequestInput extends ServiceProvider
 | 
			
		||||
   * @return An <CODE>Object</CODE> containing the value of the attribute, or <CODE>null</CODE> 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 <CODE>null</CODE> 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 <CODE>true</CODE> 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 <CODE>true</CODE> to display the "Log In" link on the outer frame,
 | 
			
		||||
   *            <CODE>false</CODE> 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
 | 
			
		||||
 | 
			
		||||
@ -9,9 +9,9 @@
 | 
			
		||||
 * 
 | 
			
		||||
 * The Original Code is the Venice Web Communities System.
 | 
			
		||||
 * 
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
			
		||||
 * 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
 | 
			
		||||
 | 
			
		||||
@ -9,9 +9,9 @@
 | 
			
		||||
 * 
 | 
			
		||||
 * The Original Code is the Venice Web Communities System.
 | 
			
		||||
 * 
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
			
		||||
 * 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("</FONT>");
 | 
			
		||||
    out.write("</font>");
 | 
			
		||||
    if (required)
 | 
			
		||||
      out.write(html.getFontTag("red","content") + "*</FONT>");
 | 
			
		||||
      out.write(html.getFontTag("red","content") + "*</font>");
 | 
			
		||||
 | 
			
		||||
  } // end renderCaption
 | 
			
		||||
 | 
			
		||||
@ -150,17 +150,17 @@ public abstract class BaseDialogField implements DialogField
 | 
			
		||||
 | 
			
		||||
  public void render(RequestOutput out) throws IOException
 | 
			
		||||
  {
 | 
			
		||||
    out.write("<TR VALIGN=MIDDLE>\n<TD ALIGN=RIGHT CLASS=\"content\">");
 | 
			
		||||
    out.write("<tr valign=\"middle\">\n<td align=\"right\" class=\"content\">");
 | 
			
		||||
    if (reverse)
 | 
			
		||||
      renderField(out);
 | 
			
		||||
    else
 | 
			
		||||
      renderCaption(out);
 | 
			
		||||
    out.write("</TD>\n<TD ALIGN=LEFT CLASS=\"content\">");
 | 
			
		||||
    out.write("</td>\n<td align=\"left\" class=\"content\">");
 | 
			
		||||
    if (reverse)
 | 
			
		||||
      renderCaption(out);
 | 
			
		||||
    else
 | 
			
		||||
      renderField(out);
 | 
			
		||||
    out.write("</TD>\n</TR>\n");
 | 
			
		||||
    out.write("</td>\n</tr>\n");
 | 
			
		||||
 | 
			
		||||
  } // end render
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										592
									
								
								src/com/silverwrist/venice/ui/dlg/DateField.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										592
									
								
								src/com/silverwrist/venice/ui/dlg/DateField.java
									
									
									
									
									
										Normal file
									
								
							@ -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 <http://www.mozilla.org/MPL/>.
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 <erbo@ricochet.com>,
 | 
			
		||||
 * 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("<date/> 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("<date/> 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<pmonth)
 | 
			
		||||
    { // day before month
 | 
			
		||||
      if (pday<pyear)
 | 
			
		||||
      { // we're definitely DAY first
 | 
			
		||||
	rc[0] = FLD_DAY;
 | 
			
		||||
	if (pmonth<pyear)
 | 
			
		||||
	{ // D-M-Y (Euro standard)
 | 
			
		||||
	  rc[1] = FLD_MONTH;
 | 
			
		||||
	  rc[2] = FLD_YEAR;
 | 
			
		||||
 | 
			
		||||
	} // end if
 | 
			
		||||
	else
 | 
			
		||||
	{ // D-Y-M?  Well, OK...
 | 
			
		||||
	  rc[1] = FLD_YEAR;
 | 
			
		||||
	  rc[2] = FLD_MONTH;
 | 
			
		||||
 | 
			
		||||
	} // end else
 | 
			
		||||
 | 
			
		||||
      } // end if
 | 
			
		||||
      else
 | 
			
		||||
      { // day before month, but after year - Y-D-M? OK...
 | 
			
		||||
	rc[0] = FLD_YEAR;
 | 
			
		||||
	rc[1] = FLD_DAY;
 | 
			
		||||
	rc[2] = FLD_MONTH;
 | 
			
		||||
 | 
			
		||||
      } // end else
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
    else
 | 
			
		||||
    { // month before day
 | 
			
		||||
      if (pmonth<pyear)
 | 
			
		||||
      { // definitely MONTH first...
 | 
			
		||||
	rc[0] = FLD_MONTH;
 | 
			
		||||
	if (pday<pyear)
 | 
			
		||||
	{ // M-D-Y (American standard)
 | 
			
		||||
	  rc[1] = FLD_DAY;
 | 
			
		||||
	  rc[2] = FLD_YEAR;
 | 
			
		||||
 | 
			
		||||
	} // end if
 | 
			
		||||
	else
 | 
			
		||||
	{ // M-Y-D? OK...
 | 
			
		||||
	  rc[1] = FLD_YEAR;
 | 
			
		||||
	  rc[2] = FLD_DAY;
 | 
			
		||||
 | 
			
		||||
	} // end else
 | 
			
		||||
 | 
			
		||||
      } // end if
 | 
			
		||||
      else
 | 
			
		||||
      { // month before day, but after year - Y-M-D (Japanese standard)
 | 
			
		||||
	rc[0] = FLD_YEAR;
 | 
			
		||||
	rc[1] = FLD_MONTH;
 | 
			
		||||
	rc[2] = FLD_DAY;
 | 
			
		||||
 | 
			
		||||
      } // end else
 | 
			
		||||
 | 
			
		||||
    } // end else
 | 
			
		||||
 | 
			
		||||
    s_locale_ordering.put(locale,rc);
 | 
			
		||||
    return rc;
 | 
			
		||||
 | 
			
		||||
  } // end getDateFieldOrdering
 | 
			
		||||
 | 
			
		||||
  private final void renderDropDown(int which, RequestOutput out) throws IOException
 | 
			
		||||
  {
 | 
			
		||||
    HTMLRendering html = (HTMLRendering)(out.queryService(HTMLRendering.class));
 | 
			
		||||
    Calendar cal = Calendar.getInstance(TimeZone.getDefault(),html.getLocale());
 | 
			
		||||
    if (which==FLD_MONTH)
 | 
			
		||||
    { // render the "month" field
 | 
			
		||||
      out.write("<select class=\"content\" name=\"" + m_name + "_month\" size=\"1\"");
 | 
			
		||||
      if (!m_enabled)
 | 
			
		||||
	out.write(" disabled=\"disabled\"");
 | 
			
		||||
      out.write("><option value=\"-1\"");
 | 
			
		||||
      if (m_ndx_month==-1)
 | 
			
		||||
	out.write(" selected=\"selected\"");
 | 
			
		||||
      out.write(">---</option>");
 | 
			
		||||
      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("<option value=\"" + i + "\"");
 | 
			
		||||
	if (m_ndx_month==i)
 | 
			
		||||
	  out.write(" selected=\"selected\"");
 | 
			
		||||
	out.write(">" + StringUtil.encodeHTML(months[i]) + "</option>");
 | 
			
		||||
	
 | 
			
		||||
      } // end for
 | 
			
		||||
 | 
			
		||||
      out.write("</select>\n");
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
    else if (which==FLD_DAY)
 | 
			
		||||
    { // render the "day" field
 | 
			
		||||
      out.write("<select class=\"content\" name=\"" + m_name + "_day\" size=\"1\"");
 | 
			
		||||
      if (!m_enabled)
 | 
			
		||||
	out.write(" disabled=\"disabled\"");
 | 
			
		||||
      out.write("><option value=\"-1\"");
 | 
			
		||||
      if (m_ndx_day==-1)
 | 
			
		||||
	out.write(" selected=\"selected\"");
 | 
			
		||||
      out.write(">---</option>");
 | 
			
		||||
      for (int i=cal.getMinimum(Calendar.DAY_OF_MONTH); i<=cal.getMaximum(Calendar.DAY_OF_MONTH); i++)
 | 
			
		||||
      { // write the day values
 | 
			
		||||
	out.write("<option value=\"" + i + "\"");
 | 
			
		||||
	if (m_ndx_day==i)
 | 
			
		||||
	  out.write(" selected=\"selected\"");
 | 
			
		||||
	out.write(">" + i + "</option>");
 | 
			
		||||
	
 | 
			
		||||
      } // end for
 | 
			
		||||
 | 
			
		||||
      out.write("</select>\n");
 | 
			
		||||
 | 
			
		||||
    } // end if
 | 
			
		||||
    else if (which==FLD_YEAR)
 | 
			
		||||
    { // render the "year" drop down
 | 
			
		||||
      out.write("<select class=\"content\" name=\"" + m_name + "_year\" size=\"1\"");
 | 
			
		||||
      if (!m_enabled)
 | 
			
		||||
	out.write(" disabled=\"disabled\"");
 | 
			
		||||
      out.write("><option value=\"-1\"");
 | 
			
		||||
      if (m_ndx_year==-1)
 | 
			
		||||
	out.write(" selected=\"selected\"");
 | 
			
		||||
      out.write(">---</option>");
 | 
			
		||||
      int step = ((m_year_start>m_year_stop) ? -1 : 1);
 | 
			
		||||
      for (int i=m_year_start; i!=m_year_stop; i+=step)
 | 
			
		||||
      { // write out years
 | 
			
		||||
	out.write("<option value=\"" + i + "\"");
 | 
			
		||||
	if (m_ndx_year==i)
 | 
			
		||||
	  out.write(" selected=\"selected\"");
 | 
			
		||||
	out.write(">" + i + "</option>");
 | 
			
		||||
 | 
			
		||||
      } // end for
 | 
			
		||||
 | 
			
		||||
      // write the last year value
 | 
			
		||||
      out.write("<option value=\"" + m_year_stop + "\"");
 | 
			
		||||
      if (m_ndx_year==m_year_stop)
 | 
			
		||||
	out.write(" selected=\"selected\"");
 | 
			
		||||
      out.write(">" + m_year_stop + "</option></select>\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("<tr valign=\"middle\">\n<td align=\"right\" class=\"content\">");
 | 
			
		||||
    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(":</font>");
 | 
			
		||||
    if (m_required)
 | 
			
		||||
      out.write(html.getFontTag("red","content") + "*</font>");
 | 
			
		||||
    out.write("</td>\n<td align=\"left\" class=\"content\">");
 | 
			
		||||
 | 
			
		||||
    // 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("</td>\n</tr>\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
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -9,9 +9,9 @@
 | 
			
		||||
 * 
 | 
			
		||||
 * The Original Code is the Venice Web Communities System.
 | 
			
		||||
 * 
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
			
		||||
 * 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
 | 
			
		||||
 | 
			
		||||
@ -9,9 +9,9 @@
 | 
			
		||||
 * 
 | 
			
		||||
 * The Original Code is the Venice Web Communities System.
 | 
			
		||||
 * 
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
			
		||||
 * 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("<SELECT CLASS=\"content\" NAME=\"" + getName() + "\" SIZE=1");
 | 
			
		||||
    out.write("<select class=\"content\" name=\"" + getName() + "\" size=\"1\"");
 | 
			
		||||
    if (!isEnabled())
 | 
			
		||||
      out.write(" DISABLED");
 | 
			
		||||
      out.write(" disabled=\"disabled\"");
 | 
			
		||||
    out.write(">\n");
 | 
			
		||||
    Iterator it = choices.iterator();
 | 
			
		||||
    String val = getStringValue();
 | 
			
		||||
@ -85,14 +85,14 @@ public abstract class PickListField extends BaseDialogField
 | 
			
		||||
    { // loop through the list and render the choices
 | 
			
		||||
      Object ch = it.next();
 | 
			
		||||
      String ch_name = getChoiceName(ch);
 | 
			
		||||
      out.write("<OPTION VALUE=\"" + ch_name + "\"");
 | 
			
		||||
      out.write("<option value=\"" + ch_name + "\"");
 | 
			
		||||
      if (ch_name.equals(val))
 | 
			
		||||
	out.write(" SELECTED");
 | 
			
		||||
      out.write(">" + StringUtil.encodeHTML(getChoiceValue(ch)) + "</OPTION>\n");
 | 
			
		||||
	out.write(" selected=\"selected\"");
 | 
			
		||||
      out.write(">" + StringUtil.encodeHTML(getChoiceValue(ch)) + "</option>\n");
 | 
			
		||||
 | 
			
		||||
    } // end while
 | 
			
		||||
 | 
			
		||||
    out.write("</SELECT>\n");  // all done
 | 
			
		||||
    out.write("</select>\n");  // all done
 | 
			
		||||
 | 
			
		||||
  } // end render
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -9,64 +9,70 @@
 | 
			
		||||
 * 
 | 
			
		||||
 * The Original Code is the Venice Web Communities System.
 | 
			
		||||
 * 
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
			
		||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
			
		||||
 * 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
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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("<SORTSTR>" + sort_string + "</SORTSTR>\n");
 | 
			
		||||
    if (!StringUtil.isStringEmpty(url))
 | 
			
		||||
      xml_writer.write("<URL>" + url + "</URL>\n");
 | 
			
		||||
    if (m_bday!=null)
 | 
			
		||||
      xml_writer.write("<BDAY>" + ISO_EXTENDED.format(m_bday) + "</BDAY>\n");
 | 
			
		||||
    xml_writer.write("</vCard>\n");
 | 
			
		||||
 | 
			
		||||
  } // end exportXML
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user