This is the Changelog for the project Expresso sponsored by JCorporate Ltd. Please note that if a feature is marked experimental, then it's reliability has been not fully established. Only use that feature if you are willing to do some debugging time and code contributions to fix any bugs you may come across.
Expresso
Version: 5.6 Released: December 5, 2004
Continued Updates
Quick Links
API Changes
Schema Changes
New Features
Bugs Fixed
Performance Improvements
Changed Features
Miscellaneous Changes
Package Changes
Changed APIs
The following are important changes that have happened in the framework that may require you to rewrite some of your code to fit the new API
-
DBObjectDef constructor no longer throws DBException: DBObjectDef no-args constructor no longer throws DBException. Recompile
applications that depend on this constructor.
Contributed By: Larry Hamel
-
Deprecated Functions Removed: Many functions that have been deprecated for at least one version have been removed with this version of Expresso.
Contributed By: Mike Traum
Contributed By: Michael Rimov
-
Controller.getLogger() returns Logger: getLogger() returns the non deprecated org.apache.log4j.Logger now instead of Category. Recompile your own code to have changes compatible.
Contributed By: Michael Rimov
Schema Changes
The following are important changes that have happened in Database Schema. You will have to issue alter table statements to your database before this version can be used. Added tables can simply be run with DBCreate
New Tables
| Table Name |
Class Name |
Explanation |
Contributor |
| AUDITLOG |
com.jcorporate.expresso.ext.dbobj.AuditLog |
Used by AuditedSecuredDBObject - an extension of SecuredDBObject that always
writes an audit entry to the AuditLog table tracking who made the change, when, to what
object |
Mike Rimov, et al |
| AUDITLOG_L |
com.jcorporate.expresso.ext.dbobj.AuditLogL |
Provides the lookup values for the AUDITLOG table |
Mike Rimov, et al |
| schema-changes |
com.jcorporate.expresso.services.dbobj.ChangeLog |
A ChangeLog object is used to record changes to other DBObjects. If logging
is enabled, whenever a database change is made (add, update or delete), a ChangeLog
object is written. |
Michael Nash, Raul Davidovich |
Modified Tables
| Table Name |
Class Name |
Changed Field |
New Definition |
Explanation |
Contributor |
New Tables
| Table Name |
Class Name |
Explanation |
Contributor |
| CHANGELOGTWO |
com.jcorporate.expresso.services.dbobj.ChangeLog |
Because of compatibility issues with Changelog, we changed the table name all together It has a new definition with an integer(autoinc) field. |
Larry Hamel |
Modified Tables
| Table Name |
Class Name |
Changed Field |
New Definition |
Explanation |
Contributor |
New Features
The following are new features added to this version:
-
Move password hash to UserInfo interface and its implementers: password hash no longer in User.java facade, but rather in UserInfo.java
interface and its implementers. This allows more flexibility in
handling external authentication.
Contributed By: Larry Hamel
-
Velocity support for view rendering: Velocity can now be used to render the view. See EDG for details.
Contributed By: David Lloyd
-
RunSQL Can Display Table Definitions: Enter the table name in the 'query' section of RunSQL and it will now display the current definition of the underlying database table.
Experimental
Contributed By: Michael Rimov
-
RunSQL Executes Updates: RunSQL can now execute updates methods as well as select. This allows you to issue ALTER TABLE statements straight through the (secured) web interface.
Experimental
Contributed By: Michael Rimov
-
Initial Maven integration: Currently has been tested with the site:generate target and the corresponding compile,
unittest, etc reports. Not yet used for building distributions.
Experimental
Contributed By: Michael Rimov
-
RequestRegistry automatically sets data context and security parameters: All calls to setDataContext() will no longer be necessary in client code.
This info is propagated
using ThreadLocal variables and the "Registry" pattern as described by Martin Fowler. Security
parameters (i.e., requesting UID) are also propagated
to RowSecuredDBObject, but for the sake of backwards compatibility, they are not propagated
to SecuredDBObject.
CheckLogin does this work. However, this functionality is also available in a servlet filter,
RequestRegistryFilter.
If you choose to use RequestRegistryFilter, you could do away with CheckLogin calls
from the controller. We would use RequestRegistryFilter everywhere, but legacy installations have
various URL paths, each of which requires filtering.
Contributed By: Michael Rimov
-
Customizable per-instance UserInfo: There's a new constructor in User that takes a UserInfo parameter. It allows special behavior for certain users.
Contributed By: Michael Rimov
-
New Method: DataObject.setFieldsWithDefaults(): Populates all null fields in the object with default values as specified by the data object's metadata. The behavior mirrors that of DefaultAutoElement.
Contributed By: Michael Rimov.
-
revise login bean CurrentLogin to be overridable: revise login bean CurrentLogin to be overridable, as a 'class handler' in
expresso-config.xml
Contributed By: Larry Hamel
-
Added 'delimiter' attribute to IfMemeberOfGroup tag: If a the 'delimiter' is specified, the 'groupname' will be split on the
delimiter. The user will be search for any of the named groups (a logical OR is
performed).
Contributed By: Mike Traum
-
DataField.isChanged() works after update() and add(): Add method so that DBObject.update() and DBObject.add() can indicate when to
cache the current field value as the 'original' value for purposes of isChanged()
comparison. Previously, isChanged() was working for DBObject.retrieve() only.
Contributed By: Larry Hamel
-
AllowedHtmlPlusURLFilter: AllowedHtmlPlusURLFilter offers the recognition of a limited subset of HTML to
be used within an input field. the subset has been chosen to offer some basic formatting
without risking Cross site scripting (XSS) dangers.
Contributed By: Larry Hamel
-
Struts Validator Integration: Expresso can now use Struts Validator for validating input forms. Rules are
defined in validation.xml and validator-rules.xml. See Validating user input in EDG for
more details
Contributed By: Raul Davidovich
-
new class - com.jcorporate.expresso.core.controller.TilesController: Expresso aware implementation of the org.apache.struts.tiles.Controller
interface. This allows for manipulation of the ControllerResponse for a particular tile
before it is displayed, independantly of the State currently being processed. Developers
should extend this class and code the execute() method.
Contributed By: Malcolm Wise
-
Various JoinedDataObject enhancements/fixes: You can now specify which fields to retrieve from each dataobject in the join.
This list can also include expressions such as SUM(). Added custom WHERE clause facility.
Aliases can be used in the custom WHERE clause and these will be translated when the WHERE
clause is built. Fixed generation of ON clause when joining tables with a compound key.
Provided setConnection() method to facilitate transactioning.
Contributed By: Malcolm Wise
-
Stored Procedure support: Now DBObjectos have built in support for database stored
procedures
Contributed By: Yves Henri Amaizo
Bugs Fixed
The following are bugs fixed in this version:
-
Email validation int SimpleRegistration was possible to bypass: It could be bypassed if the user went to the emailValidate state of the Registration controller. Now,
the emailValidate state will make sure the ValidationController was first called.
Contributed By: Mike Traum
-
Avoid possible NPE in JoinedDataObject: JoinedDataObject was throwing a NPE in searchAndRetrieveList when using a local connection
Contributed By: Malcolm Wise
-
Cactus integration bug fixes: Since struts 1.1 integration, cactus integration has not functionioned. This has been fixed.
Contributed By: Mike Traum
-
XMLController import now works: Import was throwing exceptions for 2 reasons: (a) XMLImportDocument.character
assumed the full contents would be passes in one call and (b) virtual fields we not being
skipped.
Contributed By: Mike Traum
-
DefaultAutoElement.parseBlocks() uses default value of a field if none provided by input.: Instead of calling it an error if there is no parameter value for a field that
has a default value, DefaultAutoElement.parseBlocks() now sets the field to the default
value. This is especially useful for RegisterUser, which insists on values for Industry and
Employees.
Contributed By: Larry Hamel
-
Cron entries with any minute (-1) were not executed at the proper times: Cron entries with -1 for minute should be executed every minute which is valid
for the other settings
Contributed By: Marcus Lindberg, Mike Traum
-
i18n fixes for SimpleLoginController: i18n some strings
Contributed By: Francesco Galli
-
DBConnection.getMetaData() always returned metadata from the first execution: getMetaData() now returns the metadata from the most recent query, as stated
in the javadocs.
Contributed By: katya, Mike Traum
-
Registration approval validation entry not being set to Validated: After clicking on a registration approval link, the Validation entry was not
being set to Validated. Also, an exception was being thrown in the error
logs.
Contributed By: Mike Traum
-
Validation email will now work with SSL: If a ValidationEntry was made from the SSL port, the URL was being generated
with 'http' and the SSL port, causing a failure. Now, 'https' is used if the port is the
SSL port.
Contributed By: Mike Traum
-
Controller should give out copies of schema stack to response, not the real thing!: Controller should give out copies of schema stack to response, not the real
thing! The response is per call, and shouldn't have hooks into controller's static
data.
Contributed By: Larry Hamel
-
RegistrationDBObject.deletedUser() uses custom UID field: when deleting, check registration object map because coder MAY have used
custom UidField name
Contributed By: Larry Hamel
-
DBConnectionPool.getWildCardsList() now returns cloned array: After reports of ConcurrentModificationException, changed method to return
cloned list rather than data member.
Contributed By: Larry Hamel
-
Messages.getString() complains less: If given a stack of schemas in which to try to find a message bundle
translation, Messages.java no longer complains unless it cannot find any translation
anywhere.
Contributed By: Larry Hamel
-
DefaultUserInfo now uses the CacheManager, eliminating problems when changing a username: When changing a username, the old username could not be used in the
registration process. The username was being cached in a Hashtable, but with no syncing for
updates or deletes. This has been removed in favor of the CacheManager.
Contributed By: Mike Traum
-
DBObject.getValuesDefault() now uses param values in cache key: DBObject.getValuesDefault() now uses param values in cache key. Previously,
the cache key was a constant '.validValues' for all param values, so that the first call
set the cache, and all calls thereafter, no matter what params were used, got the same
value. Now, separate calls with different params will cache separately.
Contributed By: Larry Hamel
-
Multipart request handler infinite loop: If a controller has a session scoped bean and a multipart parameter is
submitted and an exception occurs processing the state to which the parameter is submitted,
the controller dispatching gets stuck in an infinite loop. The multipart handler needs to
be cleared from the session bean in all cases.
Contributed By: David Lloyd
-
DefaultUserInfo.add/update should test via User.getUserInfo(): centralize code for testing uniqueness of e-mail address and login name. use
User.getUserInfo() so that tests are routed through proper userInfo
implementation
Contributed By: Larry Hamel
-
Transition.getParamString() fixed to cache for controller boolean: fix param cache which ignored boolean for 'includeControllerParam'. Took
effect when the same transition was used in two places in same view, with differnt
controller needs (e.g., one button param, on getFullUrl() call)
Contributed By: Larry Hamel
-
button param for 'state' wins: make button 'state' param win out over any other 'state' param in request;
this was true of 'controller' param, and now also for 'state'
Contributed By: Larry Hamel
-
Transition.getParameterString(boolean) now obeys boolean: fix getParameterString(boolean) which was not following promise of boolean (to
include controller or not). Important for submit buttons, which may need controller param
to redirect correctly in the case where form tag has different URL.
Contributed By: Larry Hamel
-
DBObject.deleteAll failed with customWhereClause: DBObject.deleteAll failed with customWhereClause because this clause is erased
by searchAndRetrieveList(). Reset clause each time through our (memory safe) 100-at-a-time
loop. Also, getCustomWhereClause already has 'WHERE' prepended, so remove this when
re-appending.
Contributed By: Larry Hamel (for Marcus Lindberg)
-
DefaultAutoElement respects numeric field when user sets field to empty string: DefaultAutoElement respects numeric field when user sets field to empty
string. it is translated into a null, and thereby preserves the isFieldNull() test which is
especially important for a numeric field because getFieldInt() and similar calls will
return 0 for a null field.
Contributed By: Larry Hamel
-
Protect against null final state: Rare null final state could occur. The isFinalState protects against it. Found
trying to go to the component manager when not logged in. The SimpleLoginController trying
to transition to the login screen would bail horribly. A proper transition can now
occur.
Contributed By: David Lloyd
-
When deleting an entry in USERROLES, GROUPNEST was not checked, leading to problems with referential integrity: UserGroup will now check GroupNest before allowing deletion.
Contributed By: Mike Traum
-
When updating registration, SimpleRegistrationController was overwriting fields with other users' information: When a user would update a registration domain object with fields that were
not set to be displayed, data from another user (the first record retrieved by the database
when doing a query with no constraints) was copied into those fields.
Contributed By: Mike Traum
-
Removing JobQueue entry for recurring job now removes the job from the CronTab: When the JobHandler checks the JobQueue for new jobs, it will now also make
sure that the JobQueue entry for current CronTab entries associated with a JobQueue entry
exists. If it does not, the CronTab entry is deleted.
Contributed By: Mike Traum
-
Fixed DBObject Null Test Case: Null Test case was performaing a clear() and an update() with an auto-inc
field. The Update() would then clear the auto-inc field, resulting in bogus test
results.
Contributed By: Michael Rimov
-
Fixed RecordPaginator for MultiDBObject: fix multidbobject support for pagelimit, and fix pagecount.
Contributed By: Larry Hamel (for Matteo Martello)
-
RowSecuredDBObject now rolls back permissions created during transaction: use localconnection, if any, to create permissions. fixes bug where
transactions did not roll back permissions.
Contributed By: Larry Hamel
-
Fixed Change logging issue: Added default values and schema setuf for ChangeLog to work
properly
Contributed By: Raul Davidovich
-
Fixed AuditedSecuredDBObject: Added Initialization items for these objects to work
Contributed By: Raul Davidovich
-
Fixed Multi valued selects and listboxes generation: Multi valued selects and listboxes were generated as simple ones
Contributed By: Raul Davidovich
-
Fixed </td> was not printed when showing input labels: When automatically printing labels the td tag was not closed
Contributed By: Raul Davidovich
-
fixed updateAll and deleteAll: fixed updateAll and deleteAll to manage correctly the cache
Contributed By: Yves Henri Amaizo
-
Trim in the persistance classes was not working right: fixed quoteIfNeeded in JDBCUtil and JDBCDataObject
Contributed By: Yves Henri Amaizo
-
DB Batch was not working right: fixed methods addBatch and updateBatch and added method deleteBatch in
JDBCExecutor
Contributed By: Yves Henri Amaizo
Performance Enhancements
The following performance enhancements that have been coded since the last version:
-
Reduced Clearing of Related Caches: When non-stale values were being put in the cache system, then related caches
were getting cleared, even though they didn't need to be. The new put() methods in the
CacheSystem Interface allows you to drop items in the cache without clearing related
caches.
Contributed By: Michael Rimov
Contributed By: Larry Hamel
Changed Features
The following are feature changes since the last release:
-
Testing source code (unit tests) now found in separate directory: Important: if you compile expresso classes, your compile now needs to
include a new source directory, WEB-INF/test-src/
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
JDK 1.4 now required: JDK 1.4 is now required for execution and compilation.
Contributed By:
-
Servlet 2.3 now required: Servlet 2.3 support is now required.
Contributed By:
-
Updates to the cache size in DBObjLimit will now instantly change the cache size: Previously, the cache size was not changed until server restart when changing
Database Object Page Limits and Cache Settings (DBObjLimit). Now, it will change upon
DBObjLimit.update().
Contributed By: Mike Traum
-
SingleDBUserInfo depreciated: SingleDBUserInfo duplicates the funcitonality of DefaultUserInfo, adding the
ability to hardcode the dbconext of the database table. This is unnecessary because that
functionality is available in DBOTHERMAP.
Contributed By: Mike Traum
-
HtmlFilter does not replace double-quote: HtmlFilter does not replace double-quote now. It is not one the list of XSS
characters for typical text-field usage (see
http://www.cert.org/tech_tips/malicious_code_mitigation.html#4 ), and prevents proper URL
recognition in HtmlPlusURLFilter.
Contributed By: Larry Hamel
-
add setOmitControllerParam for transition param tag: add setOmitControllerParam for transition param tag, to allow shorter URLs in
links
Contributed By: Larry Hamel
-
Debug output of SQL update: Add debug output of SQL updates when its a prepared call.
Contributed By: David Lloyd
-
added method reconfigure() to JdbcPersistanceManager: added method reconfigure() to JdbcPersistanceManager
Contributed By: Yves Henri Amaizo
-
Added class DBTransaction: Added class DBTransaction
Contributed By: Yves Henri Amaizo
-
New JDBC parameters in expresso-config.xml: added transactionNotActive, stringNoTrim, dbCatalogue and dbSchema as JDBC
parameters in expresso-config.xml
Contributed By: Yves Henri Amaizo
Package Updates
The following packages have been updated with this release:
| Package Name |
Updated Version |
|
Cactus
|
1.6.1 |
Version: 5.5.1 Released: April 30, 2004
Updates
Quick Links
New Features
Bugs Fixed
New Features
The following are new features added to this version:
-
More mimeTypeIcons added: Added mimeTypeIcons from the bluecurve and crystal themes. Also changed
MimeTypes to genererate a valid value list from a recursive directory
listing.
Contributed By: Mike Traum
Bugs Fixed
The following are bugs fixed in this version:
-
DBMaint search not shown: Internet Explorer would not show DBMaint's search page. Other browsers
worked.
Contributed By: David Lloyd
-
FieldRangeParser now recognises 'is null' and 'is not null' as valid: 'is null' and 'is not null' are now valid field values for SQL WHERE
clause
Contributed By: Malcolm Wise
-
message bundle: fix Transition.transition() controllerResponse titling during 'clone': in Transition.transition(), use raw title key, without running through msg
bundle string translation, to 'clone' controllerResponse
Contributed By: Larry Hamel
-
message bundle: fix logic to attempt default message bundle if application's msg bundle lacks key: use bundle cache key that allows multiple bundles per locale (e.g.,
application's AND default expresso)
Contributed By: Larry Hamel
Version: 5.5.0 Released: April 27, 2004
Final bugfixes and documentation
Quick Links
API Changes
New Features
Bugs Fixed
Miscellaneous Changes
Changed APIs
The following are important changes that have happened in the framework that may require you to rewrite some of your code to fit the new API
-
EventNotify can sent multiple MIME attachments: 'com.jcorporate.expresso.core.misc.EventNotify' has been modified to allow
sending multiple MIME attachments. Introducing for a special JavaMail 'ByteArrayDataSource'
type to act as a virtual data source and store binary stream content.
Contributed By: Peter Pilgrim
-
ControllerElement has a nested elements method: In order to support JSTL 1.0 the ControllerElement.java has a new
getNestedCount() method
Contributed By: Peter Pilgrim
-
StringUtil has a new method 'getStackTraceAsString()': StringUtil has a new method `getStackTraceAsString()' which takes an
java.lang.Throwable, retrieves the stack trace dump and returns it as
java.lang.String.
Contributed By: Peter Pilgrim
-
StringUtil.java has new join() methods: StringUtil has support to concatenate arrays of java.lang.String
Contributed By: Peter Pilgrim
-
StringUtil.java can wrap a text string: StringUtil has a createWordWrappedString() to allows text broken is to lines
of maximum length; to be word wrapped Word Processor.
Contributed By: Peter Pilgrim
-
DBObject.java has a new method `toDebugString()': DBObject has IDE toDebugString() method that dumps the data object and
associated data fields into perl hash data structure. This method useful to interactive IDE
development where you are allow to inspect and execute arbitary methods on
objects
Contributed By: Peter Pilgrim
-
MimeType convenience method to look up by content type id: MimeType.java has a new static method getMimeTypeFromMimeId(). This method
finds the matching data object that matches the registers content type id.
Contributed By: Peter Pilgrim
-
MediaDBObject now has convenience blob accessors: MediaDBObject.java has convenience method to retrieve information on Blob
data. The methods are 'getBlobFilename()', 'getBlobMimeType()', 'getBlobFileSize()' and
'getBlobFileSizeInt()'.
Contributed By: Peter Pilgrim
New Features
The following are new features added to this version:
-
application status: add link to cache management: Status page now has add link to cache management for each cached object in
status report, using JSTL
Contributed By: Larry Hamel
-
JoinedDataObject now recognises field values 'is null' and 'is not null' for WHERE clause: JoinedDataObject now recognises field values 'is null' and 'is not null' for
WHERE clause
Contributed By: Malcolm Wise
-
HtmlPlusURLFilter: HtmlPlusURLFilter subclassess HtmlFilter, adding an ability to recognize
user-entered text which begins with 'http://' or 'www.', etc., and automatically create an
anchor (<a>) tag from it.
Contributed By: Larry Hamel
Bugs Fixed
The following are bugs fixed in this version:
-
html:base and remoteLayer tag attributes: The base tag in expresso-html.tld had attributes that were incorrect. They now
match Struts' tld and class definition. The remoteLayer tag had an incorrect value
attribute.
Contributed By: David Lloyd
-
Reinstate listing of errors on web page output of DBCreate: This output was going to log file only. Reinstate it on resulting web page, as
was the case from v.4.1 and previous.
Contributed By: Larry Hamel
-
JoinedDataObject case insensitive queries were not checking for DataFieldMetaData.isQuotedTextType(): Amended JoinedDataObject.buildWhereClauseBuffer() to check for fields being
text type when a case insensitive query is requested, as SQL function UPPER is only valid
for text fields.
Contributed By: Malcolm Wise
-
Fixed bug where transition parameters (including the state) were sometimes (unpredictably) not being recognized: ServletControllerRequest.addButtonParams() was modifying a hashtable during
enumeration, which causes unpredictable results. So, the request parameters were sometimes
not loaded properly.
Contributed By: Mike Traum
-
fix mem leak in User.addListener scheme: fix mem leak in User.addListener scheme; the scheme is intended for
class-level, 'static' listeners, but individual instances were getting added to the
listener list. It tended to show up when deleting users--not a commmon
action.
Contributed By: Larry Hamel
Miscellaneous Changes
The following are miscellaneous changes:
-
Added missing translation strings to message bundle for English: To avoid warning messages, added missing translation strings to message bundle
for English
Contributed By: Larry Hamel
-
dbmaint JSPs: move some includes into jsp:includes to reduce size: move some includes into jsp:include to reduce size (compilation on some
compilers > 64K)
Contributed By: Larry Hamel
-
SecurityDBObject tests narrowed: add tests to narrow the cases where db context is overwritten; add
documentation
Contributed By: Larry Hamel
-
Changed listing of Download files to list in descending update date: Download.do was listing download files by the ID. This has been changed to
list them in descending update date order.
Contributed By: Mike Traum
Version: 5.5 RC-1 Released: March 14, 2004
You must recompile your applications on this release.
Quick Links
API Changes
New Features
Bugs Fixed
Performance Improvements
Miscellaneous Changes
Package Changes
Changed APIs
The following are important changes that have happened in the framework that may require you to rewrite some of your code to fit the new API
-
DBObject.setSchema() called automatically; expresso message bundle searched after application's bundle: DBObject.setSchema() for each DBObject is called in ConfigManager at startup.
Previously, developers had to call it within each DBObject's setup(). If they did not call
setSchema(), then during resource bundle lookups for translation strings, the schema would
default to the Expresso schema, so the Expresso bundle would be searched. Consequently,
applications like eforum have a bunch of strings in the Expresso bundle. To accommodate
this legacy expectation, MessageBundle now has the following logic: if a translation string
is not found, and the current schema is not Expresso, then also search for the string in
the Expresso bundle.
Contributed By: Larry Hamel
-
HSQL reverted to no 'cached' tables: Up through version expresso 5.1, HSQL database tables were created just like
other tables. However, looking forward to HSQL updates, a special case was added to create
"cached" HSQL tables sometime after expresso 5.1. (Cached HSQL tables are written to the
.data file in binary format, instead of appearing as plain text in the .script file.) This
'cached' change has been reversed because 1) we have reverted to hsql 1.6.1, 2) text files
are more easily viewed and manipulated 3) the cached files may have been the cause of the
mysterious "already opened by another process" errors. If you already have a DB created by
previous copies, you'll need to delete it and start again.
Contributed By: Larry Hamel
-
stripFilter now strips the character instead of replacing it with a space: stripFilter now strips the character instead of replacing it with a
space
Contributed By: Mike Traum
-
DBException thrown on DBObject (and related) add, update, and search if field value is not valid for the data type: Data type's are now checked when doing an add, update, or search to prevent
sql injection. This is implemented by setting default field masks being set according to
the data type. If a match is not made, DBException will be thrown. Because of this new use
of field masks, care must be taken when setting custom field masks to exclude the
possibility of sql injection.
Contributed By: Mike Traum
New Features
The following are new features added to this version:
-
ServletControllerRequest possible instead of pure Controller Request: You can now implement a state handler as:
runXXXXState(ServletControllerRequest, ControllerResponse); if you desire pure servlet
usage. This avoids that nasty cast issue. Expresso will only search for the servlet
controller request version if it cannot find a state handler using
(ControllerRequest,ControllerResponse) parameters
Contributed By: Michael Rimov
-
Allow Inputs to have multiple default values: Can now set multiple default values for Inputs via
setDefaultValueArray(String[]). Expresso EL options tag modified accordingly. Useful for
pre-setting multiple values in a multi-select select box.
Contributed By: Malcolm Wise
-
added target pretty printing all XML in EDG: xmlpp-edg is name of pretty-print target
Contributed By: David Lloyd
-
added target pretty printing XML: xmlpp is name of pretty-print target; will announce when ready for
prime-time
Contributed By: David Lloyd
-
Respect offset count for pagination on MultiDBObject: Respect offset count for pagination on MultiDBObject, just like DBObject
does
Contributed By: Liuhey
-
DBObject allows 'is null' and 'is not null' as field values for WHERE clause: Changed JDBCUtil.buildWhereClauseBuffer() to allow 'is null' and 'is not null'
as field values for WHERE clause
Contributed By: Malcolm Wise
-
Option to append custom WHERE clause in DBObject: Added optional flag to setCustomWhereClause(). If true, the custom WHERE
clause is appended to the generated one, if false it is used instead. Default is
false.
Contributed By: Malcolm Wise
Bugs Fixed
The following are bugs fixed in this version:
-
Fixed ControllerResponse.getString to search through schemas in the proper order: ControllerResponse.getString searches through a stack of schemas and returns
the first string found. The stack was being searched in reverse order.
Contributed By: Mike Traum
-
When using strong encryption, StringEncryption.encrypt was throwing NoSuchAlgorithmException upon class reloading: On destroy(), the encryption provider was not being removed properly from
Security properly, so it would not init() properly on reload.
Contributed By: Mike Traum
-
fix Schema.getMembers() initialization regarding permissions of the requesting user: fix Schema.getMembers() initialization regarding permissions of the requesting
user. Although SecuredDBObject assumes superuser privileges when the no-argument
constructor is used, its subclass RowSecuredDBObject is less optimistic, assuming that no
privileges should be given. Therefore, when Schema.getMembers() is called during schema
initialization, the requesting user must be set for any such objects.
Contributed By: Larry Hamel
-
fix mem leak in listener scheme: fix mem leak in listener scheme
Contributed By: Larry Hamel
-
Block.clone(): Fixed cloning for Blocks in such a way that JSTL works with cloned
blocks
Contributed By: Michael Rimov
-
DBConnection.supportsTransactions() NPE if connection timed out: getMetaData() would return null and thus the NPE. By returning null on NPE, we
later get a more meaningful error if this occurs.
Contributed By: Michael Rimov
-
AsyncProcessor.getStatus() returning stale object: getStatus() should have been updated from the processor object each time it
was called.
Contributed By: Michael Rimov
-
DBCreate Error on Partial Tables: isAdmin(): Better error if tables only partially exist
Contributed By: Michael Rimov
-
ORO Pattern Matching race conditions: Switched to Read Only flag Pattern Compilation. The following classes were
affected and modified: FieldRangeParser, controller.State, dbobj.DBObject,
dataobject.DefaultDataField, DBobjectDef, core.misc.ConfigPathMapping, servlet.PathHandler,
core.utility.XLateUtil, ext.dbobj.ISOCountryCodes, ext.xml.dbobj.ControllerXSLMap,
ext.xml.dbobj.UserAgent
Contributed By: Mike Traum
Contributed By: Michael Rimov
-
ORO Matcher race condition: Race conditions in ORO matcher. Now synchronized or ThreadLocal
Contributed By: Michael Rimov
-
Range Parser Fix: Now properly accepts fields such as: >100
Contributed By: Michael Rimov
-
html.Text invalid constructor: Style parameter was getting ignored
Contributed By: Michael Rimov
-
sql injection bugs in adding and updating fixed: Non-text data typed fields where open to sql injection when adding or
updating. This is now fixed by setting default field masks being set according to the data
type. If a match is not made, DBException will be thrown. Because of this new use of field
masks, care must be taken when setting custom field masks to exclude the possibility of sql
injection.
Contributed By: Mike Traum
-
sql injection bugs in searching fixed: When building a where clause, the fields will now be validated against field
masks with default masks being set according to the data type. If a match is not made,
DBException will be thrown. Because of this new use of field masks, care must be taken when
setting custom field masks to exclude the possibility of sql injection.
Contributed By: Mike Traum
-
stripFilter now strips the character instead of replacing it with a space: stripFilter now strips the character instead of replacing it with a
space
Contributed By: Mike Traum
-
wildcard searches now work on numeric fields: when searching with a field containing a wildcard, the field was not being
quoted
Contributed By: Mike Traum
-
fix RowSecuredDBObject.deleteAll() in testing permissions: fix bug in testing permissions
Contributed By: Larry Hamel
-
fix custom WHERE clause processing in JDBCDataObject: WHERE clause was omitted from generated SQL if a custom WHERE clause was
specified and append is 'true'
Contributed By: Malcolm Wise
-
fix DBObject.haveAllKeys() test which omitted autoInc fields: fix DBObject.haveAllKeys() test which omitted autoInc fields.
Contributed By: Larry Hamel
-
State.checkMask failed when checking a mask with no error associated: A NullPointerException was thrown. Now, the default error is
given.
Contributed By: Mike Traum
-
State.addRequiredParameter was not working with input containing newlines: The mask attempting to match any input would not match newlines
Contributed By: Mike Traum
-
Fixed error when deleting a component: A NullPointerException was thrown when a component was deleted with the
Component Manager and there were no errors
Contributed By: Mike Traum
-
fix addOrUpdate() which was not testing for having all keys for update: fix addOrUpdate() which was not testing for having all keys for
update
Contributed By: Larry Hamel
-
fix deleteDetails permissions: fix deleteDetails permissions for details which are SecuredDBObjects by
copying requesting user ID from 'parent' object
Contributed By: Larry Hamel
-
Changing Locale related user preferences will now update the Locale instantly: When a user changed their language or country, their Locale would not be
changed until next login (they would still get the old language MessageBundle, etc). This
change will now happen instantly.
Contributed By: Mike Traum
-
error messages were being search for in schemas in reverse order in ErrorMessages tag: The ErrorMessages tag will search for error messages in a stack of schemas,
allowing the user to override default error messages. This stack was being searched in
reverse order.
Contributed By: Mike Traum
-
changing a user's group would not be reflected until next login or 10 minutes: A user's group is cached, and that cache was not being updated when the user's
group was changed
Contributed By: Mike Traum
-
throw more descriptive DBException when using AutoDBObject with hsqldb: AutoDBObject does not support hsqldb, so when it's being used with it, it will
throw a DBException saying so
Contributed By: Mike Traum
-
fixed ErrorMessages to render errors on separate rows: ErrorMessages was rendering errors on one row, all slammed together. Now, it
uses the bundle keys 'errors.item.header' and 'errors.item.footer' to begin and end an
error item
Contributed By: Mike Traum
-
fixed possible NPE in JDBCDataObject: It was possible that a null valued field with a range constraint could throw a
NullPointerException in the quoteIfNeeded() function.
Contributed By: David Lloyd
-
NPE Fix in Log Manager: Fixed NPE that was occuring if no directory was given.
Contributed By: Michael Rimov
-
Fixed DBObject Serialization.: Re-fixed broken serialization for DBObjects.
Contributed By: Michael Rimov
-
CrontabEntry had some problems with some boundary conditions: with hourly (4,-1,-1,-1, -1, -1) , the entry would thow an exception at 11 am
and 11 pm; with weekly and hourly (4,-1,-1,-1,1,-1), the entry would not start at midnight
the next week
Contributed By: Mike Traum
-
reinstate universal transitions after struts 1.1 adjustments: fix external transitions, Transition.transition(), by restoring expresso
feature which existed before struts 1.1 adjustments
Contributed By: Larry Hamel for David Lloyd
-
fix inconsistent use of styleId in the the expresso-html.tld: fix inconsistent use of styleId in the the expresso-html.tld. Some had it
defined and some did not but all were ready to use it due to inheritance from struts. I
fixed the tld and tested them. The layer tags are still inconsistent and I didn't fix them
because doing so would break existing code. They use the id property instead of styleId for
rendering the id.
Contributed By: Larry Hamel for David Lloyd
-
Controller moves Persistent ErrorCollection to response: When doing a redirectRequest, the Controller sets the ErrorCollection as a
PersistentAttribute so that it will carry across the redirect. That is now moved on the
next Controller execution so that it will not persist across multiple states.
Contributed By: Mike Traum, User Max
-
DBObject.deleteAll() should respect to any custom Where clause: deleteAll() should respect to any custom Where clause, instead of ignoring
it
Contributed By: Liuhey
-
make ControllerResponse.getFormCache() live up to promise in javadoc that empty string will be returned if there is no value: instead of returning null
Contributed By: Larry Hamel
-
use newInstance() when creating copy of object in MultiDBObject so that SecureDBObjects get requesting user ID set properly: make Requesting User ID set
Contributed By: Larry Hamel
-
fix deletion of details where detail is SecureDBObject: make sure model DBObject used for deletion has Requesting User ID
set
Contributed By: Larry Hamel
-
Race Conditions in UnOrderedCache: Fixed race conditions in unordered cache.
Contributed By: Michael Rimov
-
Cache Cleaner clearing memory: Cache Cleaner now checks memory availability and removes lowest cache if
running low on memory.
Contributed By: Michael Rimov
-
Race Condition in JobHandler: Fixed pretty old race condition in Job Handler.
Contributed By: Michael Rimov
-
Fixed DefaultAutoElement.createDBObjectBlock: Inputs were not getting properly added to the block.
Contributed By: Michael Rimov
-
ConcurrentModification Exception in UnOrderedCache: Was modifying while iterating. :(
Contributed By: Michael Rimov
Performance Enhancements
The following performance enhancements that have been coded since the last version:
-
Thread Local Pattern Matchers: In places where regular expression pattern matching was being used
extensively, synchronized static instances of the ORO pattern matchers have been replaced
with thread local instancesto reduce synchronization and memory instance
creation.
Contributed By: Michael Rimov
-
Minimum App Memory Tweaked: Cache removal takes place now at 20% available memory instead of 10%. This
reduces GC frequency considerably.
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
No notification of successful job completion via email: Previously, jobs that completed successfully notified their owners by e-mail.
Now, no e-mail notification is made on success. Failure is still notified by e-mail. If you
want notification on success, set the following set up value to "true":
isNotifyOnJobSuccess
Contributed By: Larry Hamel
-
Deprecation Removals: Rewrote some calls to remove references to deprecated methods
Contributed By: Michael Rimov
-
Javadoc Warning Removals: Continued in the quest for removing all Java doc warnings... removed another
50 or so :)
Contributed By: Michael Rimov
-
default validation expiration --> 5 days: default validation expiration --> 5 days (was just 1 day)
Contributed By: Larry Hamel
-
validation failure --> formatted jsp: protect against deleted validation IDs, and show formated JSP upon any
failure
Contributed By: Larry Hamel
-
DBObject.update() will, by default, only update changed fields: DBObject.update() will, by default, only update changed fields
Contributed By: Larry Hamel
-
XMLDBObject now supports DataObject: refactored XMLDBObject and XMLImportDocument to support
DataObjects.
Contributed By: David Lloyd
-
create optimized URL by default in Transition.getURL(): create optimized URL by default
Contributed By: Larry Hamel
-
DBObject.clear() also clears custom where clause: DBObject.clear() also clears custom where clause
Contributed By: Larry Hamel
-
Catch Missing resource exception in controller: if unable to locate bundle then we ignore missing resource exceptions for
ControllerResponse.getString()
Contributed By: Michael Rimov
-
revert to hsqldb v1.6.1: v.1.7 of hsqldb was buggy, and also uses a binary storage format. reverting to
1.6.1, which has been used successfully for over a year in expresso, and stores in
easily-edited text format.
Contributed By: Larry Hamel
-
change order of params in AutoControllerElement: no functional change, but it just bothered me that Response came before
Request, despite all other examples otherwise in controllers.
Contributed By: Larry Hamel
-
MessageBundle.getString: log error rather than throwing: log error msg and return key if bundle string not found, rather than throwing
IllegalArgumentException
Contributed By: Larry Hamel
-
Switched Async Process Servlet to setup table for parameters.: Removed Properties file that it was relying on in previous
versions.
Contributed By: Michael Rimov
Package Updates
The following packages have been updated with this release:
| Package Name |
Updated Version |
|
Hypersonic Database
|
1.6.1 |
|
Jakarta-Tomcat
|
4.1.29 |
Version: 5.3 RC-6 Released: November 28, 2003
Continuing Bugfixes and documentation updates.
Quick Links
New Features
Bugs Fixed
Performance Improvements
Changed Features
Miscellaneous Changes
New Features
The following are new features added to this version:
-
added target for running junit tests via ant: type: ant test
Contributed By: Larry Hamel
-
Make DefaultForm attributes available to JSTL: Add DefaultForm.getAttributes() method
Contributed By: Malcolm Wise
-
added Template Method postLogoutProcessing(): added Template Method postLogoutProcessing()
Contributed By: Larry Hamel
-
added Template Methods pre/postPerform(): added Template Methods to Controller.java
Contributed By: Larry Hamel
-
New DBObject methods: getFieldByte, getFieldBigDecimal, getFieldShort: Added new convenience methods to CVS.
Contributed By: Peter Pilgrim
-
DBMaint Tag with new attribute: definition: DBMaint Tag can be used for Joined DataObjects or AutoDBObjects by setting the
definition attribute
Contributed By: Michael Rimov
-
New DBObject Metadata factory method: Allows you to create metadata derived from DBObjectDef so that you can provide
extended fields
Contributed By: Michael Rimov
-
Crontab Management Controller: Accessible from the Operations Page, this controller allows you to peak into
the cron operations.
Contributed By: Michael Rimov
Bugs Fixed
The following are bugs fixed in this version:
-
case sensitive query: Check for isQuotedTextType() when doing case sensitive searches
Contributed By: Malcolm Wise
-
set limitiation connection properties for all newly created connections: Previously, newly created connections did not have default property set after
the first connection.
Contributed By: Liuhey
-
<> not in allowed range types.: This type of range was not permitted for database fields it has now been
added.
Contributed By: User jteo
-
case sensitive query: Check for isQuotedTextType() when doing case sensitive searches
Contributed By: Malcolm Wise
-
set limitiation connection properties for all newly created connections: Previously, newly created connections did not have default property set after
the first connection.
Contributed By: Liuhey
-
Re-instated case sensitive query code: Case sensitive query processing for DBObject re-added
Contributed By: Malcolm Wise
-
Fixed downloads: Downloads weren't always working properly due to badly set headers by either
Struts or Tomcat. Resetting the connection before transfer fixed this
Contributed By: Michael Rimov
-
JDBCMetaData Javadoc error: Removed @deprecated tag
Contributed By:
-
LE WAR removed bad servlet references in web.xml: Cactus isn't included in LE war file. It now must be enabled before using
Cactus
Contributed By: Larry Hamel
-
Subsequent Searches in DBMaint: Subsequence Searches in DBMaint weren't allowing blank searches.
Contributed By: Michael Rimov
-
MultiDBObject Inner Join Fix: Fixed incorrect inner join and outer join code.
Contributed By: Rudi Maurer
-
Fixed for no key specifications in fields.: Specifically for MultiDBObject
Contributed By: Rudi Maurer
-
Security Fix DBController: Cached Security wans't set up properly if group membership was
changed.
Contributed By: Michael Rimov
-
Security Fix SecuredDBObject: Cached Security listening enhanced.
Contributed By: Michael Rimov
-
Status Controller And non-admins: Status controller wasn't working for non Admin user.
Contributed By: Michael Rimov
-
Joins and Text Fields: Joins won't play well with 'text' fields in many databases. The joins now skip
the field, but be forewared, that may cause inaccurage data.
Contributed By: Michael Rimov
-
JDBCUtil grabbing from wrong data context: When dealing with mapped files, JDBCUtil.formatDateTime was grabbing from the
wrong data context.
Contributed By: Francesco Galli
-
Update changed fields only: Update was not performed unless a retrieve was executed first.
JDBCExecutor.update() now checks DBObject status for 'NEW' and DataField.isValueSet() and
if both true includes the field in the update.
Contributed By: Malcolm Wise
-
Registration Revalidate State Transition Error: Revalidate Transition was pointing to an incorrect state.
Contributed By: WebDesigner JHB
-
DBObject Serialization Fix: DataField metadata wasn't getting restored properly
Contributed By: Michael Rimov
-
FileUtil.getExtension and double '.'s: Files with more than one period weren't returning proper
extensions.
Contributed By: Juris Zubkans
-
FileUtil.getPath invalid forward slashes: FileUtil.getPath() was returning forward slashes that weren't necessary for a
proper path.
Contributed By: Michael Rimov
-
MultiDBObject Outer Join fixes: Fixed in SQL generation for outer joins
Contributed By: Rudi Maurer.
-
JSTL URL encoding: JSTL-based form tag now encodes the post URL with proper session ids if
needed.
Contributed By: Michael Rimov
-
MultiDBObject and ranged fields: Join syntax with ranged fields is fixed
Contributed By: Rudi Maurer
-
Transition.getFullURL() and session ids: getFullURL now encodes the session ids as well IF running inside a
controller/servlet environment.
Contributed By: Michael Rimov
-
Cron Jobs not re-running: Cron jobs were getting set to 'Completed' even if they should be repeating
execution through Cron.
Contributed By: Michael Rimov
-
Field size fix: Max size was getting maxed out at 60 characters instead of field size in
DBMaint
Contributed By: Ken Chow
-
DBMaint and Mappable: Removed partially implemented Mappable code to save confusion for user id vs
user login
Contributed By: Michael Rimov
Performance Enhancements
The following performance enhancements that have been coded since the last version:
-
MultiDBObject FromClause staying put: Kept from clause from being cleared unless clear() is called to increase SQL
generation performance
Contributed By: Rudi Mauer
-
DBController Security Cache Usage: When loading security values, denied values are now getting properly set
too.
Contributed By: Ken Chow
Changed Features
The following are feature changes since the last release:
-
DBObject Status only gets set to 'Updated' only if it has been read from the database.: This was the behavior of DBObjects prior to 5.3 and is more consistent with
status conditions of other persistence libraries
Contributed By: Wei Chen
-
Transition.getUrl(true) no longer requires ControllerResponse: If you map URLs in Transition URL generation, then you don't need a
ControllerResponse set prior to the URL generation. This allows Transition to be used as a
type of URL generator outside of Controllers.
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
Email Validation set to expire after 72 hours rather than 24.: Needed if you ever had site trouble and mail was down for a day. Let people
take a couple of days to complete validation, but not long enough to allow brute force
validation code guessing
Contributed By: Sandra Cann
-
Reworked TOC CSS: Reworked TOC CSS to specify the size of the font in absolute point size so
Mozilla, etc looks a lot nicer.
Contributed By: Michael Rimov
-
Nag about setDataContext changed from warning to info.: Reduced level to keep from spamming logfiles.
Contributed By: Francesco Galli
-
DateTime.getDateString(Calendar) deprecated: Function was generating incorrect values for what javadocs claimed. Use
getDateTimeForDB(Calendar.getTime()) instead.
Contributed By: Michael Rimov
-
Debug Logging in Crontab: More extensive debug logging was added to crontab to assist in monitoring of
execution.
Contributed By: Michael Rimov
Version: 5.3 RC-5 Released: October 10, 2003
Final bugfixes and documentation
Quick Links
API Changes
New Features
Bugs Fixed
Miscellaneous Changes
Changed APIs
The following are important changes that have happened in the framework that may require you to rewrite some of your code to fit the new API
-
ControllerResponse no longer put into session: ControllerResponse no longer put into session within JSPViewHandler because
everywhere else, response is added as attribute within request scope, not session
scope.
Contributed By: Larry Hamel
-
getField() and get() now part of DataObject API: Had to be done to fix virtual fields
Contributed By: Michael Rimov
-
getDataField() now relagated to 'internal use', not getting and setting: Wasn't allowing for proper overriding of data objects.
Contributed By: Michael Rimov
-
DataObject.setFieldValue() changed:
Contributed By:
-
setField() and set() now part of data object API: Also needed to fix inheritence
Contributed By: Michael RImov
New Features
The following are new features added to this version:
-
JSTL Extension Tags: core.services.taglib tags now support some missing integration features with
JSTL
Experimental
Contributed By: Michael Rimov
-
Transition.getMapping(): Allows you to find the Struts mapping that the transition is pointing
to
Experimental
Contributed By: Michael Rimov
Bugs Fixed
The following are bugs fixed in this version:
-
remove unused tag library reference: remove unused tag library reference to struts.tld, which tripped up
Resin
Contributed By: Larry Hamel
-
Expresso Tag Reuse Issues: Fixed some issues with tags not reinitializing
Contributed By: Raul Davidovich
-
Job Handler Infinite Loop: If multiple jobs go off at the same time, then a potential ininite loop could
occur.
Contributed By: Richard Simmonds
-
DBConnectionPool and closing closed resultsets: DBConnectionPool wouldn't nullify closed resultsets if an exception was thrown
during closure, potentially leaving the DBConnectionPool in an inconsistent
state.
Contributed By: Michael Rimov
-
DBObject.deleteAll() failing: DeleteAll was failing with 'resultset closed' error.
Contributed By: Michael Rimov
Contributed By: Gabor Nagypal
-
Missing File tag attributes: Added missing file tag attributes.
Contributed By: Juris Zubkans
-
struts:select and Multivalued Input.: If using the struts-extended select tag with a multivalued Input with blank
values, the tag would throw an exception and the page would not render at all. Now the page
renders with a blank drop-down and a warning message is logged to assist in
debugging
Contributed By: Michael Rimov
-
Virtual Fields Broken: DataObject API was breaking virtual fields in DBMaint
Contributed By: Michael Rimov
-
DBCreate setup exceptions now logged: Setup exceptions were getting displayed but not necessarily
logged
Contributed By: Michael Rimov
-
Encoded button parameters not getting decoded properly: As said. If button_encoding wasn't present then nothing was getting
decoded.
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
New EDG documentation: New chapters on reporting and async processing.
Contributed By: Michael Rimov
-
Javadoc warnings cleaned up: About 150 javadocs warnings were cleaned up from the build
process.
Contributed By: Michael Rimov
Version: 5.3 RC-4 Released: September 27, 2003
Continued bugfixes
Quick Links
API Changes
New Features
Bugs Fixed
Miscellaneous Changes
Changed APIs
The following are important changes that have happened in the framework that may require you to rewrite some of your code to fit the new API
-
New DataObject method: setStatus(String): This was necessary to fix some bugs in DataField so that the status of the
parent data object was set properly.
Contributed By: Michael Rimov
New Features
The following are new features added to this version:
-
HTML Email Sending: Email sending may now use HTML format as well. [Beware now of CSS
issues!]
Contributed By: Eddie Lewis
-
DBMaint and NestableDataObjects: DefaultAutoElement now properly supports nestable data objects when rendering
BLOB view icons.
Contributed By: Michael Rimov
-
JoinedDataObjects, DBMaint, and BLOB fields: You can now update and view BLOB fields for database joins directly in
DBMaint.
Contributed By: Michael Rimov
-
New Simple Report Server: Simple controller to show the updated Reporting API. Includes one sample
report with Expresso.
Contributed By: Michael Rimov
Bugs Fixed
The following are bugs fixed in this version:
-
Explicit Styles failing to map at module level: Passing an explicit style= parameter was broken if the style was defined at
the module level rather than the controller level.
Contributed By: Michael Rimov
-
Specific styles failing at module level defines: Module defined styles wouldn't necessarily map to controller level styles. We
now check both.
Contributed By: Michael Rimov
-
Mail only one success message after job completion: after finishing a job successfully, e-mail just once, not twice
Contributed By: Larry Hamel
-
JoinedDataObject's Status: JoinedDataObjects did not have their status set properly
Contributed By: Michael Rimov
-
DataFields and parent data object status: DataFields not setting parent's status to modified
Contributed By: Michael Rimov
-
ControllerElement.clone should copy all data members: ControllerElement.clone should copy all data members
Contributed By: Larry Hamel
-
DBObject.find() and DBObject.retrieve() modifying self if nothing found.: If nothing was found, then DBObject.find() and DBObject.retrieve() shouldn't
modify themselves. This has been fixed.
Contributed By: Michael Rimov
-
DateTime UI Entry in DBMaint: DateTime entries didn't give enough space to allow them to be properly
entered.
Contributed By: Michael Rimov
-
Fixed broken Duplicate download report: The 'duplicate downloads' report was broken with old field
names.
Contributed By: Michael Rimov
-
DBObject.buildWhereClause() IllegalArgumentException: if getMappedContext() was called before getConnection() then the result was
null. Fixed and now there's a stack trace warning to allow for folks to debug their
setDataContext() statements.
Contributed By: Michael RImov
Miscellaneous Changes
The following are miscellaneous changes:
-
Updated JBoss integration docs.: Updated JBoss integration docs to reflect less steps now needed to get
Expresso to work with JBoss.
Contributed By: Michael Rimov
Version: 5.3 RC-3 Released: September 5th, 2003
One critical database fix
Quick Links
Bugs Fixed
Miscellaneous Changes
Bugs Fixed
The following are bugs fixed in this version:
-
Other DB Fix: getConnection was always returning default connection unless
mapped
Contributed By: Michael Rimov
-
remove unused tag library reference: remove unused tag library reference to struts.tld, which tripped up
Resin
Contributed By: Larry Hamel
Miscellaneous Changes
The following are miscellaneous changes:
-
Updated EDG: Updated EDG chapters, removed old code, start of ECCR description appendix.
New section on creating new database configuration
Contributed By: Michael Rimov
Version: 5.3 RC-2 Released: September 3rd, 2003
Final bugfixes and tweaks before release
Quick Links
API Changes
New Features
Bugs Fixed
Miscellaneous Changes
Changed APIs
The following are important changes that have happened in the framework that may require you to rewrite some of your code to fit the new API
-
OSProcess Exception Changes: OSProcess.getStdIn() and OSProcess.getStdErr() no longer have throws
DBException in their signature. They never thew it anyway.
Contributed By: Michael Rimov
-
ControllerResponse.setRequest is now public: Given that ControllerResponse is now dependent on a constructed
ControllerRequest, we need this so we can set the controller response's request object in
environments outside the standard controller. (Such as unit tests)
Contributed By: Michael Rimov
New Features
The following are new features added to this version:
-
create indices added to DBObjects even after their tables have been created: Previously, if you added an index to the setupFields() of a DBObject which had
already been created, that index was not added by running DBCreate again. Now that index is
created.
Contributed By: Larry Hamel
-
Restrict methods on database joins: Sometimes you don't want users to be able to do an add on a particular join.
It is now defineable in the XML to prevent add or update or search or delete from ever
happening no matter what the other DataObject security settings are
Contributed By: Michael Rimov
Bugs Fixed
The following are bugs fixed in this version:
-
Security fix for JoinedDataObject: isAllowed() wasn't getting called before the methods were executing on the
database
Contributed By: Michael Rimov
-
Security fix for SecuredDBObject: Count and deleteAll should both be passed through security for Search and
Delete permissions respectively before executing.
Contributed By: Michael Rimov
-
Explicit locking for OSProcess Stdin and Stdout.: Potential race conditions existed there.
Contributed By: Michael Rimov
-
Kernel Unit tests: Kernel unit tests were added and several old unit tests were brought up to
date.
Contributed By: Michael Rimov
-
DBObject Limit not going to mapped databases: DBObjLimit wasn't querying the current context, it was always going to default
context.
Contributed By: Michael Rimov
-
Fixed Cron Bug: Hourly crons weren't getting executed at the proper 'minute'
Contributed By: Michael Rimov
-
Fix in Postgres configuration: Fixed Postgresql configuration for BLOB sql types.
Contributed By: Michael Rimov
-
Serialization Bug: DBObjects weren't getting properly serialized
Contributed By: Michael Rimov
-
Null Field Fixes: More fixes to allow for null fields to stay null!
Contributed By: Gabor Nagypal
-
Multi-db fix in Registration: Registration Domains weren't properly setting the database
context.
Contributed By: Michael Rimov
-
Atlantic App Server Compatibility Fix: App server had a bug that would choke on JSPs that had 'struts-logic' in
them... switched to struts_logic
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
More Javadoc Warnings Removed: More javadoc warnings were removed from the code base.
Contributed By: Michael Rimov
-
Updated EDG: Updated Jobs Chapter to provide definition of Job Parameters and Cron
Parameters
Contributed By: Michael Rimov
Version: 5.3 RC-1 Released: August 12, 2003
Struts 1.1 integration, final bugfixes and performance improvements.
Quick Links
API Changes
Schema Changes
New Features
Bugs Fixed
Performance Improvements
Miscellaneous Changes
Package Changes
Changed APIs
The following are important changes that have happened in the framework that may require you to rewrite some of your code to fit the new API
-
DBObject.isEmpty() should test only 'real' fields, not virtual fields.: DBObject.isEmpty() should test only "real" fields, not virtual
fields.
Contributed By: Larry Hamel
-
DBObject.getThisDBObject() is now protected access.: Use DBObject.newInstance() instead
Contributed By: Larry Hamel
-
Struts Configuration Internals: Because of the Struts update to Struts 1.1. Any previous use of struts
internals such as configuration manipulation have changed radically. Consult the Struts
documentation for further details if you have need of these features.
Contributed By: Peter Pilgrim
-
<expresso:ErrorMessages /> for displaying errors in login.jsp: If building your custom login jsps based upon LoginController [or SimpleLogin]
the error messages are returned as keys. Use ErrorMessages to provide localized
information.
Contributed By: Kris Thompson
Schema Changes
The following are important changes that have happened in Database Schema. You will have to issue alter table statements to your database before this version can be used. Added tables can simply be run with DBCreate
New Tables
| Table Name |
Class Name |
Explanation |
Contributor |
Modified Tables
| Table Name |
Class Name |
Changed Field |
New Definition |
Explanation |
Contributor |
| DOWNLOADFILES |
com.jcorporate.expresso.ext.dbobj.DownloadFiles |
[Removed field 'type'] |
none |
Wasn't really needed thanks to MIMETYPES table. |
Michael Rimov |
New Features
The following are new features added to this version:
-
Download Notes: Download File now has a source-forge-like 'view notes' link in the
listings.
Contributed By: Michael Rimov
-
Struts 1.1 Integration: Use all your favorite struts features, without changing your configuration or
controller.
Contributed By: Peter Pilgrim
-
Autodetection of DownloadFile MimeTypes: Based upon the file name, the DownloadFiles table now auto-detects the mime
type for the file.
Contributed By: Michael Rimov
-
InstallLog implementations: new implementations for InstallLog: ControllerInstallLog, ServletInstallLog,
ConsoleInstallLog
Contributed By: Michael Rimov
-
New Function: State.addRequiredParameter(name,error message): Use of this function will cause validation to occur, but unlike
State.addParameter() it will verify the regular expression for non-blank string and add to
the error collection if it is not present.
Contributed By: Michael Rimov
Bugs Fixed
The following are bugs fixed in this version:
-
NextNumberImpl.java multithreading: use ConcurrentReaderHashMap for efficiency, add sync to
initialize
Contributed By: Larry Hamel
-
DBObject.deleteAll should delete details: change deleteAll() to iterate through list, calling delete for each object so
that details (dependent records) will also be deleted -- cascading deletes
Contributed By: Larry Hamel
-
DBObject.deleteDetails should pay attention to empty foreign keys: Delete details should be smart about looking at details. If there is no value
in the foreign key, then do not delete all the records in the detail table!
Contributed By: Larry Hamel
-
App servers not shutting down properly: The CacheCleaner thread was not properly exiting when it was getting
interrupted.
Contributed By: Michael Rimov
-
NPE in DBObject.count: Fixed NPE that would be thrown if the database was down. Now it throws a more
useful exception.
Contributed By: Michael Rimov
-
NPE in DBConnection.disconnect(): Some databases might throw an NPE when checking for transactional
capabilities.
Contributed By: Michael Rimov
-
XML Rendering and ControllerElement attributes.: ControllerElement attributes weren't getting properly escaped for XML
output.
Contributed By: Michael Rimov
-
Transition.setParameters() not copying: Transition.setParameters() was copying the hashtable sent it so that if it was
called over multiple transitions, each transition's parameters would get
overwriteen
Contributed By: Michael Rimov
-
Race Condition in MimeTypes: MimeTypes had a race condition for the shared MimetypesFileTypeMap
object.
Contributed By: Michael Rimov
-
Race condition in DBConnectionPool.getInstance: Possible multiple creations of DBConnectionPool instances fixed.
Contributed By: Michael Rimov
-
Missed FileName field being read only in MediaDBObject: Now set as readonly so that it doesn't appear in DBMaint
Contributed By: Michael Rimov
-
Fixed Registration password fields not getting masked: Registration password and password_verify fields were not getting masked in
the jsp
Contributed By: Michael RImov
-
error tag not picking up session errors: Errortags were not picking up error messages in Session scope.
Contributed By: Michael Rimov
-
MimeType lookup error in DefaultAutoElement: Incorrectly setting the wrong attribute type.
Contributed By: Michael Rimov
-
SimpleLogin: Remove 'access denied' error from session.: If a successful login was achieved, then remove any Globals.ACTION_ERRORS from
the session.
Contributed By: Michael Rimov
-
DBMaintTag incorrect html: DBMaint tag was generating a spurious tr tag that was
unterminated
Contributed By: Michael Rimov
-
NPE in Component Manager: Component manager would NPE if there were no components installed on the
system.
Contributed By: Michael Rimov
-
DBOtherMap wasn't working: Fixed in latest beta.
Contributed By: Michael Rimov
-
Two setDBNames() wasn't working.: setDBName("default") followed by say, setDBName("test") wasn't properly
resetting the myPool properly so dbobjects weren't remapping properly.
Contributed By: Michael Rimov
-
ArrayIndexOutOfBoundsException in JoinedDataObject: Fixed error where get primary alias would throw ArrayIndexOutOfBounds if no
aliases were defined
Contributed By: Michael Rimov
-
Better error handling in JoinedDataObject.init: Provided some better error handling if initialization failed in
JoinedDataObject
Contributed By: Michael Rimov
-
NPE in ConfigManager with null LogDir parameter: LogDir context parameter shouldn't be required. Fixed
Contributed By: Michael Rimov
-
Oracle LOB Support: Standard JDBC API does not function when BLOBs and CLOBs were over 2K. Fixed
using Oracle Extensions.
Contributed By: Mike Traum
-
Schema's don't initialize if one schema doesn't exist.: Fixed error where all schemas may not initialize if one schema class doesn't
exist in classpath.
Contributed By: Michael Rimov
-
Class Cast Exception on some VMs with some classloaders: Some vm's and classloaders will throw an exception if you don't cast an
interface to an Object before using an Object's methods.
Contributed By: Michael Rimov
-
Exception deleting one detail would leave the rest of the detail objects with dangling objects.: If an exception was thrown deleting a detail object then the rest of the
detail objects were skipped. Now the exception is logged and the function attempts to
continue.
Contributed By: Michael Rimov
-
Master/Detail sets and Defineable objects: While in DBMaint, if Master/Detail sets have been created and the master is a
Defineable object, then it wasn't getting set up for the MasterObject.
Contributed By: Michael Rimov
-
JoinedDataObjects and Master/Detail sets: JoinedDataobject was incorrectly returning field listings for master detail
sets.
Contributed By: Michael Rimov
-
JoinedDataObject and add: If auto-inc objects were used in the remote objects, then local objects (left
table) weren't getting the new autoinc field values.
Contributed By: Michael Rimov
-
JoinedDataObject and DistrinctFields: Digesting distrinct fields wasn't getting parsed correctly
Contributed By: Michael Rimov
-
ControllerSecurity cache inconsistency: Controller security cache wasn't getting cleared if the controller security
table got modifiied manually [or if user groups were modified]
Contributed By: Michael Rimov
-
Race condition for creating security: While the results may be the same, multiple database hits might occur when not
necessary.
Contributed By: Michael Rimov
-
Incorrect cache access counts: Sometimes increments were occuring twice per retrieve
Contributed By: Michael Rimov
-
Various minor race conditions in UnorderedCache: Rewrote locking in unordered cache to be strictly correct while still
maintaining high performance through read/write locking.
Contributed By: Michael Rimov
-
DBObjectLimit not resolving dbobject names.: Was displaying the DBObject i18n key instead of the actual localized
string.
Contributed By: Michael Rimov
Performance Enhancements
The following performance enhancements that have been coded since the last version:
-
Improved FileUtils: FileUtils had a lot of 'StringTokenizer' use, when a .lastIndexOf() was just
as easy to run.
Contributed By: Michael Rimov
-
Cached Groups for users: DefaultUserInfo.getGroups() now caches its results with a 10 minute
TTL
Contributed By: Michael Rimov
-
Memory Reduction for MimeTypes autodetection: Switched to SoftReference for MimetypesFileTypeMap to save on
memory.
Contributed By: Michael Rimov
-
DBObject.addToCache() DBObject.retrieveFromCache: Used pre-calculations to improve performance.
Contributed By: Michael Rimov
-
Memory reduction for ISOCountryCodes, ReverseDomainLookups tables: Switched to WeakReference for ISOCountry codes static data
Contributed By: Michael Rimov
-
Improved DBObject.deleteAll() performance: deleteAll now erases the recordset by loading each record into memory and
reusing dbobjects instead of loading the entire recordset.
Contributed By: Michael Rimov
-
Modified Controller Security Caching: In the past, controller security was cached per user id, while controller
security is gauged by group. So the isAllowed() statement has been rewritten to cache by
group name instead of user id. While this may result in more cache hits required for a
user, it should significantly reduce the number of cache items in memory as well as allow
security settings to be shared between users with the same groups. This should result in
significant performance improvements when it comes to scaling up to larger numbers of
concurrent users. [And take much less memory]
Contributed By: Michael Rimov
-
Optimized locking in UnorderedCache: Locking scheme changed from straight synchronization to read/write
locks.
Contributed By: Michael Rimov
-
Increase performance for Maximum size caching: Now using LRU mechanism for caches with maximum sizes. Allows you to keep the
size of the cache down while still making sure the more frequently used items are still in
cache.
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
New MimeType file types: Added auto-detection capabilities for .java, .cpp .h .hpp .pl .py files as
text/plain
Contributed By: Michael Rimov
-
More Javadoc warnings removed: Title says it.
Contributed By: Larry Hamel
-
Update EDG: Updated DBObject chapter, new DBObject types chapter, and updated Security
chapter
Contributed By: Larry Hamel
Contributed By: Michael Rimov
-
TestController not available: TestController Link was now removed. It has been officially unused since
version 4.0.2
Contributed By: Michael Rimov
-
ComponentManager not experimental: Component manager is no longer marked Experimental
Contributed By: Michael Rimov
-
ControllerResponse.getRequest() made public: Since ControllerResponse.setRequest was always set before the controller got
it anyway. No reason why anybody can't navigate from ControllerResponse to
ControllerRequest.
Contributed By: Michael Rimov
-
TableHead tag and Section (508) compliance: TableHead tag now appropriately sets the scope="col" attribute of the header
columns. As mentioned here:
http://www.access-board.gov/sec508/guide/1194.22.htm
Contributed By: Michael Rimov
-
DBMaint tag and Section(508) compliance: DBMaintTag tag now appropriately sets the scope="row" attribute of the first
cell in each row. As mentioned here:
http://www.access-board.gov/sec508/guide/1194.22.htm
Contributed By:
-
Corrected Unit Test Documentation: Sample code now compiles correctly.
Contributed By: Gabor Nagypal
-
JBuilder integration docs: New Jbuilder integration how-to.
Contributed By: Kaiyu Lee
-
Created maximum number of security entries that can be cached.: Maximum of 500 to prevent memory from getting overwhelmed by these cache
entries.
Contributed By: Michael Rimov
Package Updates
The following packages have been updated with this release:
| Package Name |
Updated Version |
|
Struts
|
1.1 |
Version: 5.1 ea-2 Released: July 11, 2003
More bugfixes and performance improvements.
Quick Links
New Features
Bugs Fixed
Performance Improvements
Miscellaneous Changes
New Features
The following are new features added to this version:
-
ErrorCollection available for XML Rendering: XML Servlet now renders the ErrorCollection as an errors
element.
Contributed By: Michael Rimov
Bugs Fixed
The following are bugs fixed in this version:
-
NPE in Dynamic Command: Fixed an NPE in Dynamic command if insecureDBMaint setup value was not
set.
Contributed By: Micahael Rimov
-
DBConnectionPool Fixes: Added time to live for DBConnections so that connections that have been around
for a long time get discarded and recycled.
Contributed By: Larry Hamel
Contributed By: Thierry Clement
-
InfiniteLoop in DBConnectionPool: Forced a specific maximum limit for looping looking for a connection before a
ConnectionPoolException is thrown.
Contributed By: Michael Rimov
-
ArrayIndexOutOfBoundsException in DBObject.count(): There was an exception thrown if DBObject.count() was being called on a
database object that had no key fields.
Contributed By: Michael Rimov
-
MediaDBObject Missing Constructor: Fixed a missing constructor for MediaDBObjects.
Contributed By: Michael Rimov
-
Read-only empty field validation in DBMaint: Fixed an error where readonly empty fields were getting flagged as errors. Of
course items like that are meant for the programmer to fill in automatically before
add()/update()
Contributed By: Michael Rimov
Performance Enhancements
The following performance enhancements that have been coded since the last version:
-
Cache TTL: Most cache items have a custom TTL as defined in the DBObjLimits/Cache
Settings table. This significantly reduces memory overhead in the long term A new thread
walks the cache every minute to discard non-needed items.
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
Updated EDG: Added EDG information for JoinedDataObject, MediaDBObject
Contributed By: Michael Rimov
-
DBMaint Dynamic Command Refactoring: Refactored a few lines of code to allow for better derivation and custom
initialization in DBMaint.
Contributed By: Michael Rimov
-
UI improvements in ComponentManager: Component Manager will now refresh the TOC pane if needed. Now component links
will automatically appear/disappear once component installation/uninstallation is
complete.
Contributed By: Michael Rimov
Version: 5.1 ea-1 Released: June 17, 2003
Componentization Framework public preview. DataObject API public preview. BLOB
capabilities in DBMaint. Refactoring taking place in several areas
Quick Links
API Changes
Schema Changes
New Features
Bugs Fixed
Performance Improvements
Changed Features
Miscellaneous Changes
Package Changes
Changed APIs
The following are important changes that have happened in the framework that may require you to rewrite some of your code to fit the new API
-
New ErrorCollection methods: Now the ErrorCollection has the ability to pass in parameters to your errors.
This allows you to have error messages in the MessageBundle that expect parameters being
passed in.
Contributed By: Kris Thompson
-
Refactored Login Controller into two classes: Much like how the Registration class is now into two classes so is the Login
Controller There is the base class, LoginController, this contains no prompt/process
methods, this is what folks should extend. Then there is the SimpleLoginController, this is
the implementation example and the default login controller
Contributed By: Kris Thompson
-
Removed SecuredDBObject(String) constructor.: It has been deprecated for over 2 versions. It's usage also had several other
problems, and it has thus been removed.
Contributed By: Michael Rimov
-
Removed DBObject.searchAndRetrieve(): Removed methods that have been deprecated for 2 versions. Use
DBObject.searchAndRetrieveLIst() instead for much better performance.
Contributed By: Michael Rimov
-
core.db.TypeMapper: new TypeMapper class to use instead of Schema. All uses ot type mapping should
go through that class instead.
Contributed By: Michael Rimov
-
Removed ConfigManager.getProperty() methods.: ConfigManager.getProperty() has been marked deprecated since Expresso version
4.0. As an ongoing cleanup effort for the code, these methods have been
removed.
Contributed By: Michael Rimov
-
DBObject.myPool is now private: Use .getConnectionPool() instead to get at the mypool instance.
Contributed By: Michael Rimov
-
SecuredDBObject.get/setRequestingUid no longer throws DBException: These methods never did throw DBException, so now their method signature has
been appropriately modified.
Contributed By: Michael Rimov
-
com.jcorporate.expresso.core.logging.LogManager is @deprecated and no longer used: core.logging.LogManager has been replaced by kernel.LogManager which provides
several new features like reloadable logging configurations.
Contributed By: Michael Rimov
Schema Changes
The following are important changes that have happened in Database Schema. You will have to issue alter table statements to your database before this version can be used. Added tables can simply be run with DBCreate
New Tables
| Table Name |
Class Name |
Explanation |
Contributor |
Modified Tables
| Table Name |
Class Name |
Changed Field |
New Definition |
Explanation |
Contributor |
| DBOBJLIMIT |
com.jcorporate.expresso.services.dbobj.DBObjLimit |
TTL |
integer |
Allows for TTL in cache systems to be set when the object is first stored.
Provides memory reduction rather than ever growing cache. |
Michael Rimov |
| ROW_PERMISSIONS |
com.jcorporate.expresso.services.dbobj.RowPermissions |
ROW_KEY |
VARCHAR(180) |
Reduced size of key for InterBase compatibility. |
Larry Hamel |
| USERREGISTER |
com.jcorporate.expresso.ext.dbobj.RegisteredUser |
FirstName |
VARCHAR(30) |
Added LastName and FirstName fields |
Sandra Cann |
| USERREGISTER |
com.jcorporate.expresso.ext.dbobj.RegisteredUser |
LastName |
VARCHAR(80) |
Added LastName and FirstName fields |
Sandra Cann |
New Features
The following are new features added to this version:
-
BLOB capable DBMaint: DBMaint can now handle BLOB datatypes and provide for file upload /download
capabilities with enhanced capabilities for Media DBOBjecects.
Contributed By: Michael Rimov
-
Media DBObjects: Media DBObjects are SecuredDBObject derived classes with addBlobField()
methods that also generate housekeeping fields such as file name, file size, and mime
types.
Contributed By: Michael Rimov
-
Recognize forwards with '.xsl' extension: Recognize forwards with '.xsl' extension, and send the request to the 'xml'
forward (by default, XMLViewHandler) with the xsl path as a parameter. Thus, forwards for
XSL processing can be put in the configuration file in the very same way as JSP
forwards.
Contributed By: Larry Hamel
-
new method on DBObject - public boolean hasErrors(): Allows us to check for DBObject field errors without iterating through all
fields
Contributed By: Malcolm Wise
-
Component build process: Created a new a better way to build components like eforum into expresso
without having to polute the expresso build tree.
Contributed By: Kris Thompson
-
Add support for ANSI joins in MultiDBObject: New methods added - setRightJoin(), setLeftJoin(), setInnerJoin() - to build
the 'FROM' clause using ANSI join syntax making outer joins possible.
Contributed By: Malcolm Wise
-
Various DBObject enhancements: Allow case sensitive searches, added 'IN' and 'NOT IN' to denotesRange(),
allow null parameter for setFieldsToRetrieve() method. This will allow a MultiDBObject to
include a DBObject for join purposes only e.g. when doing a SELECT DISTINCT on a
MultiDBObject and you don't want a particular DBOBjects fields in the result.
Contributed By: Malcolm Wise
-
Only send changed fields in DBObject through to SQL UPDATE statement: Amended DataExecutorInterface.update(), overloaded DBObject.update() and
modified JDBCExecutor.update() to accept a boolean. If 'true', for each DBOBject field,
added check against DataField.isChanged(). The SET clause will only include fields for
which the return value is true. If no fields have changed, the UPDATE will not be done.
DBOBject.update() calls JDBCExecutor.update(DataObject, boolean) with 'false' by default.
The implementation of the DefaultDataField.setValue() method was changed so that it
recognised when a null value was retrieved from the database to enable us to tell if the
field had been changed.
Contributed By: Malcolm Wise
-
ExpressoLinkTransParamTag: To help Expresso work better in a cookieless environment it needed a tag to
display hrefs for Transitions that have parameters associated with them. This tag was also
needed because the struts link tag does not allow for nested tags which made it impossible
to nest the ExpressoTransParmTag within that tag.
Contributed By: Kris Thompson
-
Allow option to append a custom WHERE clause in MultiDBObject: Overloaded setCustomWhereClause(String, boolean). Setting the boolean to true
will cause the custom WHERE clause to be appended to that built using calls to
setForeignKey() and any values in the component DBObjects.
Contributed By: Malcolm Wise
-
Allow ControllerResponse attributes to persist during transitions: Attributes set via ControllerResponse.setAttribute() will now be copied to the
original ControllerResponse object when transitioning between states. These attributes can
now also be accessed in JSP's via extended struts tags (e.g.
property="@attributeValue")
Contributed By: Malcolm Wise
-
User.getPrimaryGroup(), implemented as user preference: User.getPrimaryGroup() is now implemented as a user preference
Contributed By: Larry Hamel
-
ISOValidValues and Internationalisation: Introducing a new ISOValidValue class and completion ValidValue class.
ValidValue has two useful static inner classes for sorting collection of these element by
value and description. ISOValidValue extends the ValidValue class and support canonisation
of the description attribute using a resource bundle. In other words valid values can be
internationalised programmatically.
Contributed By: Peter Pilgrim
-
BAT file for running Junit: Now the process of running Junit is even easier then before, simple run the
bat file runJunit.bat and Junit starts up with all of the correct parameter
values
Contributed By: Kris Thompson
-
ant task for reverse-engineering DBObjects using DBTool: A new task will create DBObject files for each Table found in a
db
Contributed By: Larry Hamel
-
Added user listener test on regobjs: This test is intented to test the UserListener for regobjs to ensure that they
get deleted when a user is deleted.
Contributed By: Kris Thompson
-
Refactor Registration: Pushed up the non-prompt/process methods of Registration into an abstract
class and created a class called SimpleRegistration which holds all of the prompt/process
classes
Contributed By: Kris Thompson
-
Italian Message Bundle: New Italian Translation.
Contributed By: Francesco Galli
-
logging convenience for controllers: add getLogger() to Controller to reduce code duplication in
subclasses
Contributed By: Larry Hamel
-
Removed Deprecations: Several calls to deprecated methods were removed
Contributed By: Michael Rimov
-
New ExLink tag functionality: ExLink tag can now serve as a direct struts replacement with the same
methodology as the other extension tags.
Contributed By: Malcolm Wise
-
New ActionMapping capabilities with Struts.: Modified `perform()' method to add ActionMapping to the
ServletControllerRequest object. Also added check for an instance ServletControllerResponse
so that the action forward can be retrieved from it if it indeed it was set in a controller
state method.
Contributed By: Peter Pilgrim
-
ErrorCollection and ChainedExceptions: ErrorCollection can now add multiple errors based upon Chained Exceptions.
This can allow for easier to read error reporting.
Contributed By: Michael Rimov
-
DBMaint DataObject capable: DBMaint is now based upon DataObjects. This means that anything implementing
the DataObject interface can now be managed through DBMaint.
Contributed By: Michael Rimov
-
Support for GNUJAXP: SaxParserConfigurer now also looks for an installation of
GNUJAXP
Experimental
Contributed By: Michael Rimov
-
i18n at DBObject Metadata level: If passed a Locale, DBObject field names and descriptions can be localized by
calling dbobject.getMetaData().getDescription(Locale l)
Contributed By: Michael Rimov
-
Create Cached Tables for Hypersonic: DBCreate now creates tables with the CREATE CACHED TABLE syntax if the jdbc
driver is Hypersonic.
Contributed By: Michael Rimov
-
DBMaint Smarter with User object.: DBMaint now has a special case for User objects. If the UserInfo
implementation is a DataObject, then the search icon will appear. If not, then it will not
appear. Either way, although the search icon shows searching User object, it diverts to the
underlying DataObject
Contributed By: Michael Rimov
Bugs Fixed
The following are bugs fixed in this version:
-
Fix connection pool which was returning dead connections: Although the connection pool tested whether an existing connection was dead or
not, it was not discarding the dead connections, but rather returning them!
Contributed By: Larry Hamel
-
Input ReadOnly text boxes where being turned into hidden fields: This was a purposeful bug, meaning that someone intended for this adverse
behaivor which is if you you create an Input object and define it to be READ_ONLY the
InputTag would turn that into a hidden field. I fixed that so a readonly input box is
created.
Contributed By: Kris Thompson
-
Controller Security Routing: Fix to add ControllerSecurity routing through workflow
Contributed By: Aime Bazin
-
Exception when Transition has null state.: Fix to prevent exception when Transition has a null state
Contributed By: Aime Bazin
-
'Thread not owner' error in EmailSender: Fixed Thread Not Owner error in EmailSender by calling Thread.sleep() instead
of Thread.wait()
Contributed By: Larry Hamel
-
DBObject.delete(boolean deleteDetails) handles the deleteDetails better, transactionally if possible: DBObject.delete(boolean deleteDetails) handles the deleteDetails better:
transaction is localized within a try/catch/finally, and the commit either happens or not,
depending on auto-commit.
Contributed By: Larry Hamel
-
Email Regular Expression Fixes: Fix regexp for email to permit capital .US (for example) and not permit comma
in address, for example
Contributed By: Larry Hamel
Contributed By: Mike Traum
-
DBTool: Fixed reverse-engineering of DBObject files--fields were not add
properly
Contributed By: Larry Hamel
-
threading issue in DBObject with symptom 'field def not found': Fixed threading problem in DBObject by synchronizing put() to static map of
object definitions in DBObject.initialize()
Contributed By: Larry Hamel
-
Invalid Lookup object for Audit Log: Audit log should have lookup values to AuditLogL.
Contributed By: Gene McCullough
-
Status Controller: Status Controller now correctly displays the Expresso to SQL to Database Type
Mappings
Contributed By: Michael Rimov
-
Fix DBObject.delete() to use key fields, as javadoc advertises: use key fields in WHERE clause, except when object has no key fields and ALL
fields are used to identify object
Contributed By: Larry Hamel
-
Transition.redirectTransition: url needed webapp context: add webapp context string to redirect URL; it was working before only for ROOT
webapp
Contributed By: Larry Hamel
-
Fixed Null Values with DBMaint and Numerics/Bit Types: DBMaint was setting empty strings for DBObject numeric fields and bit types,
which should be null in the underlying database.
Contributed By: Michael Rimov
-
DBObjcet.quoteIfNeeded fix for Bit Types: DBObjects bit type SQL wasn't getting generated properly
Contributed By: Michael Rimov
-
DBObject.getThisObject() wasn't copying attributes: DBObject.getThisObject() wasn't copying the requestor ID nor localconnection
for transaction because of overrides by subclasses. Added "wrapper" method "newInstance()"
to fix.
Contributed By: Larry Hamel
-
Further improved the building of components (eforum) into expresso: I recently changed the build process for eforum my making the expresso build
file be the "master file" file for building but later realized that I could move the code
into the eforum build file and still achive the same goal, which was to build eforum into
the expresso/dist directory
Contributed By: Kris Thompson
-
DBObject.delete(boolean deleteDetails) transactioning: Prevent attempt to change AutoCommit if already in a transaction
Contributed By: Malcolm Wise
-
No Locale for error messages: There was no way to i18n error messages if you used the ErrorMessageBundleTag
because if did not pass in locale info to the Message class which itself did not have the
correct method for handling that. Both classes where modified.
Contributed By: Kris Thompson
-
Default values for SimpleRegistration in default.script: Since the Registration.java class is now abstract the security need to be
moved to the SimpleRegistration.
Contributed By: Kris Thompson
-
Migrated the LoginController to use messages from the MessageBundle: Most of the messages used in the LoginController were hard coded to the
controller, I the messages into the MessageBundle
Contributed By: Kris Thompson
-
changed attribue of TransitionTag called classvalue to be camel cased: The attribute of classvalue should have been classValue.
Contributed By: Kris Thompson
-
changed the bld-expresso-binary target and how it builds the /lib dir: This may seem minor but it leads to a greater problem I am trying to fix with
getting component build files. The bld-expresso-binary target was building the WEB-INF/lib
directory from pulling files from the expresso.lib directory. Since the WEB-INF directory
was populated with the lib files from the expresso.lib directory in the
expresso-complete-prep target it only made since to pull from that directory instead,
otherwise why even create and populate that directory.
Contributed By: Kris Thompson
-
Fixed Bad Mapping Names: DBObject.OriginalDBName wasn't exactly a good name for it.
getMappedDataContext() is the new method of getting where you've been mapped
to.
Contributed By: Michael Rimov
-
Oracle and BatchAdds/updates: Oracle on PreparedStatement.clearParameters() throws NPEs. The errors are
logged for those commands, but otherwise ignored now.
Contributed By: Marcus Lindberg
-
Race Condition in MessagesBundles: Fixed an unlikely to encounter Race Condition in MessagesBundles
Contributed By: Michael Rimov
-
Empty SchemaList and Setup: SchemaLIst ValidValues were never getting cached for an empty schema list
table resulting in constant queries.
Contributed By: Michael Rimov
Performance Enhancements
The following performance enhancements that have been coded since the last version:
-
Delayed DBConnectionPool.getInstance: By delaying the setting. setDataConext() should not be nearly so
expensive.
Contributed By: Michael Rimov
-
Weak References for MessagesBundles: Because MessageBundles can be rather on-again, off-again, we're using
WeakReferences to all them to be GC'ed if not in use by anything.
Contributed By: Michael Rimov
-
DBObject.find(): If all keys are present and no special modifiers such as distinct fields then
find calls retrieve() which is MUCh faster.
Contributed By: Michael Rimov
Changed Features
The following are feature changes since the last release:
-
Only 1 log4j config file: Expresso is now only supporting one log4j configuration file. The default one
it attempts to use is %configDir%/expressoLogging.xml.
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
Improve connection pool implementation: Rework DBConnectionPool impl to remove totalPools data member, in favor of
calculating this via available and inUse collections
Contributed By: Larry Hamel
-
Change field length in RowPermissions.java: Change max length of a primary key. Most databases have a system limit.
InterBase probably has one of the lowest limits, 200 bytes for the index, which is a
combination of all indexed fields, documented at
http://bdn.borland.com/article/0,1410,25245,00.html
Contributed By: Larry Hamel
-
Expresso License added to each source file.: The Expresso Apache-style license is now at the top of every source
file.
Contributed By: Tino Dai
-
CheckLogin.loginViaCookie() does not throw if not active user: just return false--no authentication for user whose cookie corresponds to not
active, plus log warning; this allows a bro