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 browser w/ cookie for NONE (who is inactive) to NOT
throw exception if a regular user then tries the same browser to go to a secure page; user
will just get a login prompt rather than an exception page.
Contributed By: Larry Hamel
-
Javadoc fix for DateTime: Incorrect parameter descriptions for the misc.DateTime utility
class.
Contributed By: Rick Goeltz
-
Moving Strings to public or private constants: Many strings were changed to static String constants.
Contributed By: Larry Hamel
Package Updates
The following packages have been updated with this release:
| Package Name |
Updated Version |
|
Hypersonic Database
|
1.7.1 |
|
Commons-Digester
|
1.5.0 |
|
Commons-Logging
|
1.0.3 |
|
Commons-BeanUtils
|
1.6.1 |
|
Jakarta-Tomcat
|
4.1.24 |
|
ORO [Regular Expression Package]
|
2.0.7 |
|
Cactus
|
1.4.1 |
|
Xalan
|
2.5.1 |
|
Xerces
|
2.4.0 |
Version: 5.0.4 Released: May 6, 2003
Bug Fixes, several application server compatibility issues resolved.
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
-
SecuredDBObject.thisClass changed to private.: This string was originally supposed to be private, but was accidentally marked
'protected'. This consistency error was fixed in this version. It may, however, require you
to add some public static final String thisClass variables to your classes to get everthing
to compile.
Contributed By: Michael Rimov
New Features
The following are new features added to this version:
-
"Derivable MessageBundles": By using an internal stack representation to use with setSchema() for
Controllers, we can now consecutively check message bundles in multiple schemas, thus
allowing folks to only copy over messages they want to override from the base controllers
rather than copying ALL the messages from the base controller. [Note: the base class
controller must call setSchema() for its own schema for this to work
properly]
Contributed By: Michael Rimov
-
Struts Tags and Block ControllerElement: Necessary methods have been added to help Struts Tags play well with
Blocks.
Contributed By: Michael Rimov
-
expresso.home VM System property.: If deployed within a WAR file, you can define an expresso.home system property
(usually by adding -Dexpresso.home=[whatever] to the java command line). When this is set,
Expresso will use this for the %web-app% directory instead of trying to use
getRealPath()
Contributed By: Michael Rimov
-
Registration JSP: Registration JSP has been rewritten using Struts tags and now boasts similar
rendering capabilities to DBMaint. (except for read only fields)
Contributed By: Michael Rimov
-
Field Range Validation Checking: Support for validating field ranges so as to ensure no SQL injection attacks
come through range field entries.
Contributed By: Michael Rimov
-
Resend Email Validation: If Registration Validation is enabled for the default registration domain,
then a 'Resend Email Validation' link now appears for the login screen.
Contributed By: Michael Rimov
Bugs Fixed
The following are bugs fixed in this version:
-
<expresso:Back> tag error: Tag gave wrong URL if there was a query string in the jsp URL.
Contributed By: Michael Rimov
-
FastStringBuffer race condition: Race Condition if you directly used FastStringBuffer
constructors.
Contributed By: Michael Rimov
-
JBoss Logger Compatability: Fixed LogManager initialization so that it doesn't necessarily create any
console appenders if not desired.
Contributed By: Michael Rimov
-
NPE in Controller.unloadStateForm(): Fixed NPE in this function.
Contributed By: Michael Rimov
-
updateBatch() and Autoincrement fields.: Fixed exception that occured when updating batches of DBObjects with autoinc
fields.
Contributed By: Michael Rimov
-
DBMaint and BigDecimal Fields: DBMaint wasn't displaying bigdecimal field values properly.
Contributed By: Michael Rimov
-
ControllerResponse Cannot Be Null: Fixed error in controller exception handler that causes this given error. Now
the proper exception gets shown.
Contributed By: Michael Rimov
-
Weblogic Compatibility fixes: Fixed jsp pages for weblogic use.
Contributed By: Jennifer Chen
-
Fixed NPE in Transition.gettheUrl(true): If mapping lookup failed, then this function will now throw a proper
ControllerException instead of NPE.
Contributed By: Michael Rimov
-
Key field size in DBMaint.search(): Numeric Key field sizes for DBMaint.search were too small.
Contributed By: Michael Rimov
-
Race Conditions in JobHandler: Fixed race conditions that could occur in JobHandler.
Contributed By: Michael Rimov
-
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
-
Security Fix: Disclosure of configuration information.: The 'Test' Servlet had a mapping enabled by default without any security
system in place. It, among other things, discloses the location of the Configuration
File.
Contributed By: Michael Rimov
-
Validation fix for web.xml: Fixed items in web.xml that SunONE Server 7 complained about during war file
validation.
Contributed By: Michael Rimov
-
XML Parser Setting Fix: Fixed error where ConfigManager would try to set the SAXParser to use, but
some app servers (such as SunONE Studio, even with 'security manager' off, won't allow it).
Now Expresso will just issue a log warning when such a Security Exception happens and
continue without explicitly setting the Sax Parser.
Contributed By: Michael Rimov
-
JobHandler not notifying upon Exception: JobHandler was not triggering a 'failure' system event if a Job threw an
exception.
Contributed By: Ken Chow
-
Struts-Extension Tag libraries not acting consistently.: The Struts Tag libraries were not pulling up properties consistent with the
properties strings given to them. This was especially true with the attribute
tags.
Contributed By: Michael Rimov
Contributed By: Mike Traum
-
DBOtherMap: There were numerous areas in DBObject that didn't properly deal with Other Map
capabilities.
Contributed By: Theirry Clement
-
Login.do?next: Login wasn't processing the next parameter properly.
Contributed By: Michael Rimov
-
Helpdesk Ticket #550: DBObject.Field Size Limitation: DBObject.setField(String fieldName, String fieldValue) inappropriately cut off
char and varchar field values when there is a range prefix (e.g '<> ').
Contributed By: Katya Sadovsky
-
Helpdesk Ticket #553: Query support for IN modifier.: DBObject.denotesRange() needs to support the 'IN' range
qualifier.
Contributed By: Katya Sadovsky
-
Helpdesk Ticket #552: >= and <= are not included in the 'denotes range'
function.
Contributed By: Michael Rimov
-
Security Fix With Registration and Admin approval.: Through parameter manipulation, a malicious attacker could gain user account
access privileges if the RegDomain requires Administration approval or if the Administrator
has denied the registration.
Contributed By: Michael Rimov
-
DBMaint Search Form and Ranges: DBMaint does not attempt to restrict input field sizes to allow for field
ranges to be input into the search fields.
Contributed By: Michael Rimov
-
HelpDesk Ticket #555/#545: Incorrect Range Quoting: DBMaint no longer attempts to blindly quote Range modifiers, but instead now
validates for proper quoting.
Contributed By: Michael Rimov
-
HelpDesk Ticket #554: DBObject no longer truncates Field Ranges to 'field length'
Contributed By: Michael Rimov
-
HelpDesk Ticket #495: getRealPath() and Silverstream App Servers: Fixed getRealPath() issue by allowing for expresso.home system property
instead.
Contributed By: Clinton Parham
Contributed By: Michael Rimov
-
NPE with iPlanet Webservers: Modified ControllerRequest.getErrorCollection() so it doesn't throw an NPE if
error collection is null.
Contributed By: Lirian Ostrovica
-
DBMaint Update not properly displaying errors.: IF there was a database validation error while updating a DBObject, then the
error was not getting properly displayed.
Contributed By: Michael Rimov
-
AutoDBObject Parsing and Checkboxes: If a checkbox was not properly set, then the appropriate dbobject false value
wasn't getting set.
Contributed By: Michael Rimov
-
Default Values set in DBMaint Update: DBObject default values were getting set for missing parameters. The solution
was to clear the dbobject before population.
Contributed By: Michael Rimov
-
getFieldBoolean() works for checkbox fields too.:
Contributed By:
Performance Enhancements
The following performance enhancements that have been coded since the last version:
-
Cache Optimization: If an object has zero cache size, then DBObject.addToCache() exits
immediately. This saves network roundtrips in clustered environments.
Contributed By: Michael Rimov
-
Removed unnecessary logging initializations: Several classes used Log.getLogger() with each object instantiation. Not
necessary, and this has been fixed.
Contributed By: Michael Rimov
-
Improved string handling in several Struts-extension tags: Switched implementation to use FastStringBuffer with pooling.
Contributed By: Michael Rimov
-
Switched DBObject.find() to DBObject.retrieve() when possible.: Retrieve caches, so it performs much faster than DBObject.find()
Contributed By: Michael RImov
Miscellaneous Changes
The following are miscellaneous changes:
-
New JBoss Integration Documentation: Shows step by step how to integrate with the latest JBoss Application Server
Version
Contributed By: Ravishankar Bhat
Contributed By: Michael Rimov
-
Updated Tomcat integration documentation: Now covers installing the '.war' distribution with Tomcat 4.1 and Tomcat
4.0
Contributed By: Michael Rimov
-
IDE Integration Docs: New Documentation for Expresso Integration into SunONE Studio and IntelliJ
Idea. Eclipse PDF is also now included in the distribution. (It had been on site for some
time.)
Contributed By: Michael Rimov
-
Updated EDG: Several Pages of new information has been added to various locations in the
EDG.
Contributed By: Kris Thompson
Contributed By: Larry Hamel
Contributed By: Peter Pilgrim
Contributed By: Michael Rimov
-
Migrated from log4j Category to Logger throughout the code.: Log4j.Category has been deprecated for some time, most uses of it have now
been removed.
Contributed By: Michael Rimov
Package Updates
The following packages have been updated with this release:
| Package Name |
Updated Version |
|
Log4j
|
1.2.8 |
|
Commons-Digester
|
1.4 |
|
Commons-BeanUtils
|
1.6.1 |
|
Tiles For Struts
|
November 15, 2002 Build |
Version: 5.0.3 Released: January 19th, 2003
Coninuted Bug Fixes, and performance/stability audit
Quick Links
New Features
Bugs Fixed
Performance Improvements
Miscellaneous Changes
Package Changes
New Features
The following are new features added to this version:
-
JSTL Compatible ControllerResponse: The Input/Output/Block maps can now be retrieved as a java.util.Map so that
JSTL-EL can navigate the ControllerResponse hierarchy. Use things like:
<c:out value='${controllerResponse.namedTransitions["TransitionName"].url}'/>
Contributed By: Michael Rimov
-
JSTL Comatible ControllerElements: Nested ControllerElements can be exposed via a HashMap so that JSTL can look
them up by name.
Contributed By: Michael Rimov
Bugs Fixed
The following are bugs fixed in this version:
-
Batch Updates and Transactions: Prepared Statements for DBConnections weren't getting cleared after a batch
update, sometimes resulting in duplicate key errors when run under a
transaction.
Contributed By: Larry Hamel
Contributed By: Michael Rimov
-
DBObject.equals(): Fixed several issues related to DBObject comparison
Contributed By: Michael Rimov
-
Fixed DBConnection returning empty strings for null: getField(field number) was still returning empty strings instead of
null.
Contributed By: Michael Rimov
-
Fixed Caching Bug with DBObjects: DBObject key fields weren't getting stored necessarily
correctly.
Contributed By: Michael Rimov
-
DBObject.getCustomStringValue(): Error in this function that returned empty strings instead of null
values.
Contributed By: Michael Rimov
-
Race condition in SecuredDBObject.getCharset(): Error in getCharset would force getting the carset from the properties file
each time.
Contributed By: Michael Rimov
-
Nested elements and ElementCollection: setting tag attribute `type="nested"' iterates through all generic controller
elements. effectively calling the method `public Vector
ControllerElement#getNested()
Contributed By: Peter Pilgrim
-
Crontab hours/minutes: Fixed some bugs in CrontabEntry. It did not work with my every x minutes/hours
jobs
Contributed By: Marcus Lindberg
-
Update/Delete with DateTime key: DBObject did not do the datetime formating in the where clause. Update/delete
did not work on my table with a datetime key field.
Contributed By: Marcus Lindberg
-
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
-
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(). [Also fixed concurrently Bug
#524]
Contributed By: Larry Hamel
-
Unable to search on normally read-only fields.: Fixed error where Auto-renderer was not parsing read-only fields which was
important for searching.
Contributed By: Michael Rimov
-
Fixed attribute Cloning in ControllerRequset: Attributes for a ControllerRequest were not getting cloned
properly.
Contributed By: Michael Rimov
-
AttributeTag and Resin: AttributeTag was not getting properly reset in a collection under Resin
container
Contributed By: Dan Kibler
-
SQL Injection vulnerability in SearchKeys: Introducted strict parsing on search key tokenization before sending it to the
database.
Contributed By: Michael Rimov
-
Fixed Floating Point and Postgresql: Floating point wouldn't convert with the current casting system with
Postgresql.
Contributed By: Tsanko Stefanov
-
DBConnectionPool.clean(): Didn't actually close and clean the proper connection.
Contributed By: Pierre A. Damas
Contributed By: Pierre Mergaux
-
Must_Login_First often being read from wrong schema.: In a non-'Expresso' controller, Must_Login_First was looking for messages in
the app's MessagesBunde instead of the Expresso MessagesBunde. Now it first looks in the
app's MessagesBundle first and if a java.lang.IllegalargumentException is thrown, it looks
in the Expresso MessagesBundle instead.`
Contributed By: Michael Rimov
-
Block.setFormMethod: This method incorrectly checked the parameters to be 'true' or 'false' instead
of 'get' or 'post'
Contributed By: Michael Rimov
-
Upload not releasing Streams.: Upload wasn't closing the stream for the temp file so it wasn't getting a
chance to be moved until GC ran.
Contributed By: William Boyd
-
JNDI connection fix: Fix for JNDI configuration for DBConnections to work properly.
Contributed By: Malcolm Wise
Performance Enhancements
The following performance enhancements that have been coded since the last version:
-
Optimized Data Transfer Objects: Changed Data Transfer Objects to be more of a pure hashtable. Decreased
Serialization size by nearly 1/2.
Contributed By: Michael Rimov
-
Updated performance for getCharset() function: getCharset() was (1) not getting synchronized properly, and (2) was wasting
lots of CPU time. Results are now properly cached.
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
Log I/O errors in Upload: I/O errors for file uploads are now logged
Contributed By: Michael Rimov
-
Updated Javadocs: Several Javadoc warnings removed and fleshed out several method
descriptions.
Contributed By: Michael Rimov
-
Updated Logging to RollingFileAppender: RollingFileAppender is much more robust and appropriate as an example for
Expresso users.
Contributed By: Marcus Lindberg
Package Updates
The following packages have been updated with this release:
| Package Name |
Updated Version |
|
Xalan
|
2.4.1 |
|
Xerces
|
2.2.1 |
|
Apache JSTL
|
1.0.2 |
Version: 5.0.2 Released: November 28th, 2002
Additional bug fixes and improvements.
Quick Links
New Features
Bugs Fixed
Miscellaneous Changes
New Features
The following are new features added to this version:
-
Postpone Registration Approval: Allows the administrator to tell the system to keep the validation link for
this user while the Admin waits for other issues before clicking on "accept" or
"deny"
Contributed By: Michael Rimov
Bugs Fixed
The following are bugs fixed in this version:
-
Admin Approval Page: Fixed several issues with the Admin approval page.
Contributed By: Michael Rimov
-
More robust validation: Added the ability to recover from an exception by marking a URL as unvalidated
thus allowing the user to come back and retry the process once the error is
fixed.
Contributed By: Michael Rimov
-
DBObject.saveBinaryField(): Bug in binary field saving that didn't grab the DBConnection
properly.
Contributed By: Karsten Voges
-
Log directory not being created in Linux: The Linux zip client is skipping empty directories, therefore, the build
system is now copying a readme-directory.txt file into the log directory so that the linux
zip programs will correctly extract the expresso binary and complete
distributions.
Contributed By: Michael Rimov
-
ExCheckBoxTag: Currently, the expresso extended html:checkbox tag will not check if you are
using values other than: yes, true, on, y. I've fixed that so that it will work with any
value, as the struts tag does. (I thought I did this before, but must have neglected to
post it).
Contributed By: Mike Traum
-
ExLinkTag: Updated ExLink tag so that it is a true struts replacement.
Contributed By: Malcolm Wise
-
Removed '%' signs in login email.: To help prevent any sort of wild card happening with security, percent signs
are stripped from login names, during registration and login.
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
Admin Approval Validation Time: Validation expiration has been increased for admin approval links to seven
days rather than 24 hours.
Contributed By: Michael Rimov
Version: 5.0.1 Released: October 30, 2002
Bug Fixes and Experimental Features
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
-
Removed SecuredDBObject(DBConnection,String userName): Removed this mainly unused constructor because it conflicted with
DBObject(DBConnection,String dataContext) constructor.
Contributed By: Michael Rimov
-
New DBObject Constructor DBObject(DBConnection connection, String setupTableContext);: This new constructor allows us to use transactions in dbothermap
instances.
Contributed By: Michael Rimov
New Features
The following are new features added to this version:
-
LIMITATION_AFTER Syntax: DBConnectionPool now can support Limitation_after syntax to support
HypersonicDB
Experimental
Contributed By: Shash Chatterjee
-
New Limitation Syntax Support with MultiDBObject: New Limitation Syntax Support for MultiDBObject
Experimental
Contributed By: Shash Chatterjee
-
RecordPaginators and MultiDBObjects: added searchAndRetrieve that works with MultiDBObjects
Experimental
Contributed By: Shash Chatterjee
-
Transition.redirectTransition(): Similar to Transition.transition(), but it redirects the browser to the
Transition's getUrl() instead of using forward(). This allows you to change the URL in the
browser for situations such as CommerceCheckout where you don't want the Refresh button
resubmitting a form.
Experimental
Contributed By: Michael Rimov
-
German Translation: New german translation is now available.
Contributed By: Karsten Voges
Bugs Fixed
The following are bugs fixed in this version:
-
Fix deprecations; improve string constants: Fixed usages of deprecated methods; replaced many 'naked' strings with string
constants
Contributed By: Larry Hamel
-
More Robust Email Sender: Added Retries to help deal with bad connections
Contributed By: Shash Chatterjee
-
NPE fix in Registration: Fixed one NPE. Fixed setting uid from the request object rather than uid as
request parm.
Contributed By: Shash Chatterjee
-
Fixed Delete bug in JobQueue: Remove the extended "delete" method....DBObject's detail support already takes
care of this.This method generated incorrect SQL if the JobQueueEntry had parms with HTML
in it.
Contributed By: Shash Chatterjee
-
Race Condition in DBConnectionPool: Fixed Race Condition in DBConnectionPool that could cause more than
MAX_CONNECTIONS to be created to the underlying database
Contributed By: Michael Rimov
Contributed By: Clinton Parham
-
Transaction and CLOB fields: Fixed bug where prepared statements weren't getting cleared between different
uses of a DBConnection thus affecting transactions.
Contributed By: Michael Rimov
-
DBConnectionPool.clean() and setAvailable(): clean() was setting available to false when it was removing objects from
inUse... it should be set to true instead.
Contributed By: Michael Rimov
-
Fixed transaction errors after update(): Update would clear the localConnection causing problems with local Connections
(transactions) and DBObjects.
Contributed By: Michael Rimov
-
Fixed disappearing crontab entries: equals and compare() were not sufficiently differentiating between jobs in the
cron queue
Contributed By: Marcus Lindberg
-
ControllerUtil and <logic:present>: When checking for the existence of an Output attribute, the body of the tag
would execute regardless of the attribute being present.
Contributed By: Malcom Wise
-
Broken ControllerSecurityMatrix: ControllerSecurityMatrix was missing the initial state parameter
Contributed By: Michael Rimov
-
Fixed error where transactions couldn't be used with otherDBMap setups.: Added the new constructor detailed in API Changes for this
version.
Contributed By: Michael Rimov
-
Workflow error: Fixed error for workaround with StringTokenizer bug.
Contributed By: Aime Bazin, Bazin Software Consulting
-
NPE Fix in Messages.java: Fixed potential NPE that would occur when the user hasn't established a Locale
yet.
Contributed By: Michael Rimov
-
DBMaint pointer error: Fixed DBMaint taglib where it now properly looks up its own ActionMapping to
build the link URL.
Contributed By: Mike Traum
-
Schema.requiredVersion(): Schema.requiredVersion() now functions properly as defined in the spec on the
Opensource mailing list.
Contributed By: Michael Rimov
-
Security Problem with Registration: In the past there was no way to turn OFF self registration. Now Registration
obeys all standard ControllerSecurity laws.
Contributed By: Michael Rimov
-
Usability Problem with Login Controller: In Expresso 5.0, if there was an Access Denied situation, the user was
re-routed to the Login page, but there was no error message generated. This has now been
fixed.
Contributed By: Michael Rimov
-
Transition.transition() not setting Title properly: When calling Transition.transition(), the ControllerResponse's title was not
getting set properly.
Contributed By: Clinton Parham.
-
logic:iterate and nested outputs: The struts extension tag logic:iterate can now iterate Inputs, Outputs, and
Transitions of nested blocks as well
Contributed By: Michael Rimov
-
Fixed broken Reverse Engineering Table Feature: Reverse Engineering database tables is at least now working with
MySQL.
Contributed By: Donald Lobo
-
Fixed Exception when using setFieldsToRetrieve() and retrieve(): Fixed as reported by Malcolm Wise. You can now use setFieldsToRetrieve() with
retrieve() without getting an exception now.
Contributed By: Michael Rimov
-
fixed src-war build: src-war now properly contains all the directory tree for building an expresso
project
Contributed By: Michael Rimov
-
DBTool not exiting while running Hypersonic: Command line programs won't exit because Hypersonic is still running and must
be shut down. Now in your command line program, execute:
ConfigManager.getInstance().destroy() right before exiting and hypersonic (if it is
running) will get shut down cleanly.
Contributed By: Michael Rimov
-
Tiles definition not validating: Fixed error where the tiles definition wasn't validating properly with latest
tiles jar.
Contributed By: Michael Rimov
-
Users with multiple groups not validating first time.: People that should have access to controllers were not getting proper access
the first time they accessed a particular controller.
Contributed By: Michael Rimov
Performance Enhancements
The following performance enhancements that have been coded since the last version:
-
Removed Wasteful new String() operations: Removed several instances where there was new String("constant
string");
Contributed By: Larry Hamel
Miscellaneous Changes
The following are miscellaneous changes:
-
Updated Docs: Several installation and getting started docs have been updated.
Contributed By: Sandra Cann
Contributed By: Peter Pilgrim
Contributed By: Michael Rimov
Contributed By: Malcolm Wise
Contributed By: David Lloyd
Contributed By: Geeta Ramani
-
Removed javadoc warnings: Continued removal of various wasteful javadoc warnings
Contributed By: Michael Rimov
-
EDG is now available in chunked html format: New chunked stylsheets are available and running now.
Contributed By: David Lloyd
Package Updates
The following packages have been updated with this release:
| Package Name |
Updated Version |
|
commons-logging
|
1.0.2 |
|
commons-collections
|
2.1 |
|
log4j
|
1.2.7 |
|
commons-beanutils
|
1.5 |
|
junit
|
3.8.1 |
|
junit-pp [Junit Extensions]
|
3.8.1 |
Version: 5.0 Released: October 11, 2002
Major rewrite of Expresso 4.0 code base. New StringBuffer capabilities.
Significantly improved performance. Tiles use.
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
-
Cache Manager Singleton: Access to CacheManger should now be through CacheManager.getInstance() rather
than directly through the static methods. The static methods have been retained for
backwards compatability but will be removed in version 4.2
Contributed By: Michael Rimov
-
DBConnectionPool getTimeOut returns long.: getTimeOut used to return Date. Now it returns a long value.
Contributed By: Michael Rimov
-
Refactored Registration: Registration Controller and Login Controller are now refactored in several
ways. One is that all state handlers are protected instead of private. Two is that
LoginController has been pruned so that all aspects dealing with Self-registration are
moved to RegistrationController and finally there is a classHandler named "registration"
that allows LoginController to look up the proper Registration Controller to
use.
Contributed By: Michael Rimov
-
DBObject.FieldIterator throws no Exception: DBObject.getFieldIterator and related functions no longer throw a DBException.
The code actually didn't throw one, it was only declared in the method definition,
therefore actual application behavior hasn't changed.
Contributed By: Michael Rimov
-
isAllowed() for controller is now public: This allows programmers to query the security of Controllers for Transitions.
This may cause your code to not compile if you have overridden the isAllowed() function.
Simply change your code to public and you will be able to compile.
Contributed By: Turgay Zengin
-
log4j.Category is now deprecated.: Due to the latest version of log4j naming conventions, log4j Category class is
replaced by org.apache.log4j.Logger
Contributed By: [Log4j Dev Team]
-
misc.DateTime class now throws DBExceptions: This class needed to get the formatting capabilities per database context. To
do this, we had to deal with exceptional cases, and thus the change in Exception
throwing.
Contributed By: Michael Rimov
-
Do not instantiate Schema's Directly now.: To save CPU and memory, use the class
com.jcorporate.expresso.core.dbobj.SchemaFactory.getInstance().getSchema('classname');
instead.
Contributed By: Michael Rimov
-
Removed @deprecated 'Testable' Interface: Interface com.jcorporate.expresso.services.test.Testable had been deprecated
for a couple of versions of expresso. There are no longer any classes using it within
Expresso and it has been removed.
Contributed By: Michael Rimov
-
Modified Controller Response XML: ControllerElement Serialization had been modularized, but it was no longer
deserializing. To get it all to work, the XML output of a ControllerResponse is slightly
different. In particular all nested elements are subelements of ControllerElement rather
than of the parent element.
Contributed By: Michael Rimov
-
No more specific expresso types: Expresso no longer has it's own interal types. We strictly use java.sql data
types internally, and map that to specific database types.
Contributed By: Michael Nash
-
Changed DBObject Constructor: New interface called Request Context. ControllerRequest implements it, the
main point of it is to remove the dependency that dbobjects had on the controller
package
Contributed By: Michael Rimov
-
New usage for CheckLogin: Instead of: new CheckLogin(request,response); use:
CheckLogin.getInstance().checkLogin(request,response); This decreases unneeded object
creation.
Contributed By: Michael Rimov
-
Controller Factory: To reduce object creations, don't call Controller.getInstance() directly.
Instead use: ConfigManager.getControllerFactory().getController(className); So the system
can see if a constructed controller is already cached.
Contributed By: Michael Rimov
-
Changed Regular Expression Engine: Switched from Jakarta RE to ORO. One change is: [:digit:] is not supported by
ORO, use [\d] instead
Contributed By: Mike Traum
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 |
| ISOCOUNTRYCODES |
com.jcorporate.expresso.ext.dbobj.ISOCountryCodes |
ISO Country Codes is a repository of the 2 Digit ISO country codes. It also
serves as a repository for regular expressions to define postal codes for each
country |
Michael Rimov |
| REVERSEDOMAINS |
com.jcorporate.expresso.ext.dbobj.ReverseLookupDomains |
Extends ISO Country codes to assist in reverse domain lookups. Useful for
determining country of origin of a web client or for logfile analysis |
Michael Rimov |
| RESTRICTOVRRIDE |
com.jcorporate.expresso.ext.dbobj.RestrictedOverrides |
Used in connection with the new restricted attribute of the download
servlet. Allows for special overrides for a system that can fail to operate properly.
(DNS Reverse Lookups are not always reliable) |
Michael Rimov |
Modified Tables
| Table Name |
Class Name |
Changed Field |
New Definition |
Explanation |
Contributor |
| DOWNLOADFILES |
com.jcorporate.expresso.ext.dbobj.DownloadFiles |
IsRestricted |
boolean not null |
Used for restricted downloads |
Michael Rimov |
| USERGROUP |
com.jcorporate.expresso.services.dbobj.UserGroup |
[Table Rename] |
ALTER TABLE USERGROUP RENAME TO USERROLES |
UserGroup was a reserved table name for SAPDB. Other than issueing the SQL
Alter staement when migrating there should be no other code changes needed. |
Michael Rimov |
| USERS |
com.jcorporate.expresso.services.dbobj.UserGroup |
[Table Rename] |
ALTER TABLE USERSRENAME TO USERSTABLE |
Users was a reserved table name for SAPDB. Other than issueing the SQL Alter
staement when migrating there should be no other code changes needed. |
Michael Rimov |
| MIMETYPES |
com.jcorporate.expresso.services.MimeTypes |
MimeFileExtensions |
VARCHAR(60) allow nulls. |
MimeTypes was extended to allow for better integration with JAF. If you have
not changed data on this table, it is highly recommended that you drop the table and
re-run DBCreate to have it recreated as many new Mime types have been added as
well. |
Michael Rimov |
| USERREGISTER |
com.jcorporate.expresso.services.MimeTypes |
First Name, Last Name |
VARCHAR(30) no nulls, VARCHAR(80) no nulls respsectively |
For better statistics measurements, the Jcorporate registration table has
been split off into first name and last name. |
Sandra Cann |
New Features
The following are new features added to this version:
-
Row Permissions: As a complement to SecuredDBObject, which offers table-level permissions, a
new way to add row-level security has been added in the form of a new class:
RowSecuredDBObject. By subclassing RowSecuredDBObject, UNIX-like permissions for user,
group, and others can be applied to individual rows.
Experimental
Contributed By: Larry Hamel
-
Component Manager: In the Application page is a new controller to assist in the addition and
removal of various Expresso-based components.
Experimental
Contributed By: Michael Rimov
-
New and Updated JNDI connection capabilities: Expresso now can grab it's database connections through a JNDI-based data
source.
Experimental
Contributed By: Yves Amaizo
-
New Layer Tags: Expresso now has some tags for working with layers within Expresso-based
forms
Experimental
Contributed By: Yves Amaizo
-
Data Transfer Object: To allow for high efficiency over-the-wire tranfer of DBObjects, there is now
the com.jcorporate.expresso.core.dataobjects.DataTransferObject. You can use
DBObject.getTransferObject() to get it and DBObject.getThisDBObj(TransferObject) to rebuild
a DBObject.
Contributed By: Michael Rimov
-
JNDI Compatable Data Connections.: Expresso can now retrieve connections to databases through JNDI lookups. This
is critical for JTA compatability as well as some drivers for, for example, DB-2
databases
Contributed By: Yves Amaizo
-
Low Level PreparedStatement Support: You can now grab a PreparedStatement from a Pooled Connection. As soon as the
pool is released, the prepared statement is closed.
Contributed By: Michael Rimov
-
Low Level java.sql.Connection Support: You can now get a java.sql.Connection object directly from the DBConnection
object. However, there are no guarantees of the state of the pool if you fail to release
the connection properly before you release the DBConnection object..
Contributed By: Eddie Lewis
-
JAF MimeTypes Integration: Expresso now integrates with javax.activation.MimetypesFileMap so that you can
have a much wider file-type autodetection capability.
Contributed By: Michael Rimov
-
BLOB/CLOB Support: Expresso now directly supports BLOB/CLOB datatypes. CLOBS are automatically
loaded into memory when a row is read, BLOBS must be retrieved with their own
getBlobField() function.
Contributed By: Michael Rimov
-
FastStringBufferPool: FastStringBuffer now has a built in pool mechanism that you can utilize with
the FastStringBuffer.getInstance() and myBuffer.release() functions.
Contributed By: Michael Rimov
-
Batch Adds/ Batch Updates: Using com.jcorporate.expresso.core.dataobjects.JDBCExecutor.addBatch and
updateBatch functions you can now batch add a java.util.List of DataObjects of the same
type.
Contributed By: Michael Rimov
-
Date Parsing in DBMaint: Attempts to parse Date and Date/Time fields are now taken in DBMaint. It is
based upon the User's current Locale.
Contributed By: Michael Rimov
-
New Javascript utility class.: Class for helping to encode Javascript functions.
com.jcorporate.expresso.core.misc.JavaScriptUtil
Contributed By: Yves Amaizo
-
New Features to StringUtil: StringUtil now contains functions for generating random strings, as well as
other handy string manipulation functions.
Contributed By: Yves Amaizo
-
New Struts compatible Combobox tag.: Combobox tag is available also with external javascript.
Contributed By: Yves Amaizo
-
TransitionTag now supports CSS Styles: TransitionTag may now have a CSS class applied to it.
Contributed By: Kris Thompson
-
i18n aware Error Tag: Error Collections can have keys to Message Bundles with this tag
Contributed By: Kris Thompson
-
Reuse of FastStringBuffer: FastStringBuffer now has a clear() method that just resets the buffer pointer
for reuse again. This saves on memory allocation.
Contributed By: Michael Rimov
-
Login prompt automation: Added special case to determine when a security error occurs because user is
not yet logged in, and send user directly to login prompt. Upon successful login, user is
redirected to original destination.
Contributed By: Larry Hamel
-
Redirection support: Added general method for redirecting a request, rather than forwarding as is
standard within expresso. This is useful in cases where you want the user to get a
different URL address.
Contributed By: Larry Hamel
-
Universal URL: Added support for an universal URL, so that knowing just the controller and
state params is sufficient; one need not know a controller URL first.
Contributed By: Larry Hamel
-
Floating Point Regular Expression Mask: DBObject now has a public static floating point regular expression mask
available now.
Contributed By: Michael Rimov
-
Radio Struts Extension Tag: We now have an Expresso compatible extension tag for Radio Input
types.
Contributed By: Yves Amaizo
-
Html:Link Struts Extension Tag: We now have an Expresso-aware html:link tag that will work with
Transitions
Contributed By: Yves Amaizo
-
Type-Safe Field Data Types.: Expresso will now double-check that you entered a valid field data type upon
first instantiation of your DBOBject and will throw an Exception pointing to the invalid
data field.
Contributed By: Michael Rimov
-
Automatic Integer Regular Expression Mask: Expresso will now run a double-check of all integer fields through the
DBObject.INT_MASK regular expression. This is automatically called whenever you run
checkField() against the integer field.
Contributed By: Michael Rimov
-
DBObject access in MultiDBObjects: You can now get to the DBObjects aggregated within MultiDBObject
Contributed By: Abhi
-
SetFieldsToRetrieve within Multi-DBObjects: You can now use setFieldsToRetrieve in the embedded Dbobjects within
Multi-DBObjects and now a searchAndRetrieve will only retrieve those
DBObjects.
Contributed By: Abhi
-
Image TransitionTags: Transition Tags can now support images instead of just straight
buttons.
Contributed By: Aime Bazin, Bazin Software Consulting
-
New instant stylesheet switching.: You can define the cssStyleshjeet in setup table and it will affect all pages
that use the expresso:stylesheet tag
Contributed By: Michael RImov
-
Object Pool Framework: The apache commons' Pool project is now included with Expresso.
Contributed By: Michael Rimov
-
Container-Based Authentication Integration: Expresso now will utilize getUser() from the servlet engine to attempt to log
the user in that way. The roles the user receives are still Expresso-based
Experimental
Contributed By: Brian Showalter
-
SSL Integration Capabilities: Expresso now can transition into and out of SSL web pages and still maintain
session state.
Experimental
Contributed By: Max Cooper
Contributed By: Steve Ditlinger
Contributed By: Prakash Malani
Contributed By: Michael Rimov
-
Type-safe Schema Definitions: Instead of calling addDBObject(String) and finding out you did a typo in the
class name, you can now call addDBObject(com.yourdbobj.dbobjname.class) and the compiler
will now catch any typographical errors for you. Has also been doing for addJob(),
addServlet() and addController()
Contributed By: Michael Rimov
-
Typesafe setControllerObject() for Transitions: You can now call setControllerObject() for Transition objects in a way that
the compiler will automatically catch typographical errors. Just call
setTransition(com.yourclass.class) to have the compiler automatically check things. [The
.class at the end of your classname is the important part]
Contributed By: Michael Rimov
-
Struts ActionForm Integration: Using External States, you can now utilize Struts ActionFrorms
Contributed By: Aimee Bazin, Bazin Software Consulting
-
Basic Workflow Capabilities: Using External States you can now use some workflow in your Controller
States
Contributed By: Aimee Bazin, Bazin Software Consulting
-
ActionForm Support in ControllerTestCase: Controller Unit Tests can now utilize ActionForm properties.
Contributed By: Michael Rimov
-
Derived Controllers: Controllers can now derive from other controllers without reflection
breaking.
Contributed By: Michael Rimov
-
Custom Controller Regular Expression Error Messages: In a controller, you can specify a custom error message to be used when a
parameter fails a Regular Expression Mask Check. (Custom for each parameter)
Contributed By: Michael Rimov
-
Jakarta ORO Package: Checked in Jakarta ORO package to replace the Jakarta RE package. This gives
us full Perl 5 regular expression capability
Contributed By: Michael Rimov [Thanks also to the Apache Group]
-
Email Regular Expression Mask: New DBObject.EMAIL_MASK constant that provides a predefined regular expression
for email address validation.
Contributed By: Michael Rimov
-
Postal Code Regular Expression Database: We're starting to collect Regular Expressions for various countries to verify
the country's postal code. Email us a regular expression for your country to have it
included in the database
Experimental
Contributed By: Michael Rimov
-
Tiles For Struts 1.0: Checked in and integrated Tiles framework for struts.
Experimental
Contributed By: Peter Pilgrim
-
Mapped Bean Properties: So it should be possible to write inside a JSP. Example: <bean:write
name='dboject' property='field(EMPLOYEE_ID)' /> where the tag is referencing a DBObject
directly stored a JSP scope.
Experimental
Contributed By: Peter Pilgrim
-
Delayed responses for security violation requests: All delays are piped through a single-locked object. The result is if there's
only one bad request, it delays 2 seconds (default behavior). If there's simultaneous bad
requests, each request has to wait it's turn to suspend 2 seconds and continue. The effect
is that a second bad simultaneous request will suspend about 4 seconds, the third, about 6
seconds, etc. This should also help CPU load because bad requests can't pile up. [A person
can't bombard a server with umpteen simultaneous brute force login requests and bog down
the rest of the system]. Hopefully this will create a certain choke point.
Contributed By: Michael Rimov
-
Polish Language Translation: Started Polish Language Messange Bundles
Contributed By: Gabriel Krupa
-
Chinese Language Support: Chinese Language Support
Experimental
Contributed By: Tong Sun
-
Auditable DBObjects: Create DBObjects derived from AuditablDBObject to have trace history for any
DBObject
Contributed By: Adam Rossi
-
Clean URLs: Worked to allow for clean URLS without lots of URL parameters
Experimental
Contributed By: Michael Nash
-
Javascript in TransitionTag: Added OnClick javascript capabilities to tag.
Contributed By: Jan Moons
Bugs Fixed
The following are bugs fixed in this version:
-
Security Fix for ControllerSecurity: Addendum to previous security fix. There was now a bug that would deny groups
access due to whitespace in the permission string.
Contributed By: Mike Rimov
-
Packaging Error: The WEB-INF/log directory was not getting created by the Expresso complete or
expresso-binary distributions
Contributed By: Geeta Ramani
-
Fixed NPE in DateTime package with null Date Values.: DateTime was getting null field values and then throwing NPE's. New behavior
returns null from DateTime.
Contributed By: Clinton Parham
-
Fixed bug in DefaultUserInfo.find(): find() was returning true even if the user was deleted.
Contributed By: Mike from the forums.
-
Fixed Test Code Failure: There were bugs in TestUser test case.
Contributed By: Michael Rimov
-
Quoting for non-native boolean databases: Fixed quoting error for databases that don't have a native boolean
type.
Contributed By: Mike from the forums.
-
Oracle Date Conversion function error fixed.: Fixed error for converting date functions with Oracle.
Contributed By: Tommy Grovnes
-
Security Fix for ControllerSecurity: Fixed bug where people could gain access to unauthorized states if states are
named similarly.
Contributed By: Michael Rimov
Contributed By: Mike Traum
-
Distribution error fix.: The Xerces version being distributed with Expresso RC1 was causing conflicts
with older versions of Xerces.
Contributed By: Michael Rimov
-
Fixed errors for running Controllers outside of Servlet Environment: Fixed several errors that occurred when running a Controller outside of a
Struts-Servlet environment.
Contributed By: Michael Rimov
-
ErrorTag Fix: Fixed bug in ErrorTag where it would fail if your controller didn't have it's
schema set to Expresso. Now ErrorTag tries to first load the set schema's message and then
tried to load Expresso's if it fails.
Contributed By: Michael Rimov
-
NPE in DBAppender: According to log4j javadocs, line 94 in DBAppender does not take into account
that getThrowableInformation() may return null.
Contributed By: Clinton Parham
-
XSLT fixes: Fixed several errors in the XSLT transformation subsystem.
Contributed By: Werner Loibl
-
getThisDBObj() didn't reuse existing connections.: getThisDBObj() needs to reuse existing connectsions as defined by the parent
object to preserve transactions.
Contributed By: Clinton Parham
-
Struts Extension Taglib and nested Inputs: The struts extension taglibs couldn't find Inputs that had been nested in
Blocks.
Contributed By: Michael Rimov
-
getThisDBObj() now propagates the security and data context.: Items created through the default implementation of getThisDBObj() now have
the same security context and data context as the parent.
Contributed By: Michael Rimov
-
NPE in getThisDBObj(DataTransferObject): Fixed potential classloader problem in
getThisDBObj(DataTransferObject).
Contributed By: Michael Rimov
-
Fixed classloader bug in ConfigManager.: ConfigManager.loadEscapeHandler() wasn't using thread classloaders if it was
available.
Contributed By: Michael Rimov
-
DBTool.deleteTable() had extra semi-colon in the statement.:
Contributed By: [OpenSource] Mailing List
-
Validation Param Fix: Validation for passwords was retrieving parameters for ALL validation
jobs.
Contributed By: Clinton Parham
-
null to 0 integer fields: If a DBObject integer field was null, saved and then retrieved, the new value
would be zero instead of null
Contributed By: Kris Thompson
-
Potential fix for quoting date conversion functions.: JDBCUtil was quoting date conversion functions.
Contributed By: Michael RImov
-
JBuilder 7 Compatability Fixes: JBuilder will not allow Object methods to be invoked from an Interface, and
explicit cast to (Object) is required.
Contributed By: Michael Rimov
-
Continued Optimization of Expresso Schema Initialization: There were a couple of logic errors in the lock variables for Expresso
initialization. These should be fixed now.
Contributed By: Michael Rimov
-
Bug Fixes when no db=default present: Fixed some bugs related to when no default database has been created
yet.
Contributed By: Michael Rimov
-
Fixed Logout Twice Bug: Cookies weren't getting properly set upon a system logout.
Contributed By: Michael Rimov
-
Broken RestrictAccessTag: RestrictAccess wasn't useing CurrentLogin at all.
Contributed By: Michael Rimov
-
Security Fix: DBCreate allowed by all users: DBCreate could be accessed by all users all the time. It now requires users to
be administrators once the initial database is created.
Contributed By: Michael Rimov
-
Postgres 7.2 JDBC Driver compatability: The 7.2 JDBC Driver for Postgresql requires table names to be lower case for
DatabaseMetaData.getColumns. This is JDBC bug #674. A workaround has been applied to
Expresso.
Contributed By: Michael Rimov
-
Fixed concurrancy bugs in Cache: Cache Manager now has read-write locks implemented for it to eliminate some
concurrency issues.
Contributed By: Michael Rimov
-
Database fields now correctly deal with backslash.: Backslashes were not able to be stored in databases even though the standard
way of handling them is to replace \ with \\. This has been complete. Note: I stil cannot
get single and double quotes working yet, however.
Contributed By: Michael Rimov
-
Internal Date representation.: Fixed error where it was impossible to get millisecond timestamps with
Expresso's data interface connection.
Contributed By: Yves Amaizo
-
Fixed Initialize log4j warnings.: Expresso's LogManager now initializes a default root context as defined in a
properties file in the classpath. This allows for plugging in other libraries that use
log4j but are normally initialized before Expresso's configuration system is
read.
Contributed By: Michael Rimov
-
DBConnection Pool Race Condition: Fixed a race condition that would throw
ArrayIndexOutOfBoundsException
Contributed By: Michael Rimov
-
Long inactivity timeouts: If a DBConnectionPool hasn't been used at all for a long time, it performs a
clean before it grabs a connection.
Contributed By: Michael Rimov
-
Floating point search: Fixed error where DBOBjects would search for exact floating point value, which
won't work. Now we search for ABS(value-searchterm) < .[field-precision]1
Contributed By: Michael Rimov
-
Null key fields in DBMaint preserved: Null fields were getting converted to empty strings for key fields which was
giving Oracle conniptions.
Contributed By: Kris Thompson
-
DBMaint.add() would allow adds even upon error.: DBMaint would 'add' even if validation failed.
Contributed By: Michael Rimov
-
Cache error for non-max length caches: Data wasn't getting added to caches with no maximum length.
Contributed By: Michael Rimov
-
Cache Sizes Proper Setting: Cache Sizes weren't getting properly set and thus were causing DBObject
lookups constantly.
Contributed By: Michael Rimov
-
JSPException upon DBMaint.Search: If no records returned, the search page was throwing an
exception.
Contributed By: Michael Rimov
-
DateTime.getDateForDb(): getDateForDb with no parameters was calling the wrong function.
Contributed By: Michael Rimov
-
DBObject.deleteAll() not clearing Cache.: The cache for a dbobject still existed even after a deleteAll() causing data
integrity problems when retrieve() was called after deleteAll()
Contributed By: Michael Rimov
-
getValidValues and localConnections: GetValidValues was using Different DBConnections and thus not respecting
Transactions.
Contributed By: Tsanko Stefanov
Contributed By: Michael Rimov
-
Fixed Bug for emty dates and PreparedStatements: If dates were empty or null, then they needed to be updated as NULL values in
the prepared statements, especially for some databases like Postgres.
Contributed By: Michael Rimov
-
BatchUpdate for non supporting databases: We now query the database metadata to meka sure that the database can support
Batch Updates/Adds, if not, we iterate calling add/update one by one.
Contributed By: Michael Rimov
-
DBMaint fails on second search: Fixed a bug where a second search would cause DBMaint to return incorrect
results.
Contributed By: Luis Martin
-
IterateTag definition didn't have indexId attribute.: The expresso-logic.tld file didn't have any indexId field in it's declaraction
even though all the code to properly use it was in place.
Contributed By: Michael Rimov
-
State Titles not getting set when transition called: In Controller.java, when transitioning to a new state using: transition(String
newState, ControllerRequest req, ControllerResponse res, boolean clear) The res attribute,
title is not set from the newResponse object. When using the "default" style, the output
contains "No Title" even though is was set in the newResponse.
Contributed By: Daryl
-
Valid Values and Transactions.: If Transactions are being used, we should not read from cache for local
connections.
Contributed By: Tsanko Stefanov
-
Fixed potential NPE in ControllerElement.getNested(): Should only have existed since 4.1 ea series.
Contributed By: Michael Rimov
-
Fixed NPE in IfMemberOfGroup:
Contributed By: Shash Chatterjee
-
Fixed Class Cast Exception for DBMaint with JobEntries Search Icon:
Contributed By: Michael Rimov
-
Validation for ChangePassword error: Validation for change password thought it needed registration controller as a
paramter. It didn't.
Contributed By: Clinton Parham
-
AutoDBObject fix: AutoDBObject was broken when there was more than one 'type' of AutoDBObject
instantiated at once.
Contributed By: Aime Bazin, Bazin Software Consulting.
-
DBMaint Crash for ReadOnly Fields: DBMaint was crashing on some read-only field errors.
Contributed By: Yves Amaizo
-
Security Fix - otherDB: Fixed Error where otherDBObjects were not operating properly when used in a
context other than "default"
Contributed By: Michael Rimov
-
Support for boolean fields in DBs w/o native boolean type: Fixed bug in SAX parsing of expresso-config.xml, and persistence of boolean
types.
Contributed By: Larry Hamel
-
Updated ActionForm Support: Fixed several minor bugs in the ActionForm support.
Contributed By: Aime Bazin, Bazin Software Consulting
-
Fixed +/- for integer regular expression: DBObject.INT_MASK was not allowing for plus or minus signs at the beginning of
an integer.
Contributed By: Michael Rimov
-
Login Tag Fix: URL for LoginTag was not getting built properly.
Contributed By: Michael Rimov
-
Quoting around longvarchar's: Fixed bug where dbobject wasn't quoting longvarchars.
Contributed By: Michael Rimov
-
i18n preferences fix: Login name wasn't getting properly grabbed for loading i18n
preferences.
Contributed By: Mike Traum
-
MultiDBObject Token Fix: Fixed MultiDBObject Tokenizing Error
Contributed By: Yves Amaizo
-
Potential NPE in error.jsp: Fixed some potential Null Pointer Exceptions in error.jsp
Contributed By: Michael Rimov
-
i18n taglib locale fix: Locales weren't retrieved properly for i18n-based taglibs
Contributed By: Mike Traum
-
Security Fix - Registration: Any states that require a user to be logged in to access now go through the
normal Expresso framework security system. selfRegister states remain open to
anybody.
Contributed By: Michael Rimov
-
Security Fix - Registration: Through manipulation of parameters an attacker could retrieve/modify/ and add
registration information of another user. This has been fixed.
Contributed By: Michael Rimov
-
Concurrent Modification Exception in DBConnectionPool: Fixed modification problem with DBConnectionPool
Contributed By: Harikumar G
-
Fixed Bug #489 - DateTimeForDB: getDateTimeForDB did not take into account a database context for defining
it's formatting. It should do so now.
Contributed By: Michael Rimov
-
Fixed Bug #500 - CacheManager would still cache even if caching was turned off for a context.: If cache is turned off in configJdbc, then CacheManager will no longer add
items or create any caches.
Contributed By: Michael Rimov
-
Multiple tiles:insert tags: Multiple tiles:insert jsp tags were losing state.
Contributed By: Michael Rimov
-
DBObject.clear() and boolean fields: DBObject.clear() was not properly removing boolean fields.
Contributed By: Michael Rimov
-
String filtering sometimes returned incorrect values.: Certain Boundary conditions would cause incorrect return values for String
filtering
Contributed By: Michael Rimov.
-
Fixed Bug #499 - log4j appenders error.: Fixed error for when Tiles was starting up.
Contributed By: Michael Rimov
-
Fixed Bug #502 - Tables appear no matter which schema chosen.: Redundant OtherDBTables were appearing in DBMaint and
DBSecurityMatrix.
Contributed By: Michael Rimov
-
Fixed Bug #522 - setFieldstoRetrieve() could cause cache inconsistancies.: If setFieldstoRetrievE() has been called, the object itself will no longer be
cached since it is an incompelte record.
Contributed By: Michael Rimov
-
Oracle incompatibility with Genco demo: Renamed 'increment' field to be compatible with Oracle
Contributed By: Shouis Ne
-
DBLog used UserName instead of UID: Logging Jobs would throw Exceptions
Contributed By: Michael Rimov
-
Infinite loop upon initialization: move schema iteration counter up so that failure to initialize expresso does
not lead to infinite loop
Contributed By: Larry Hamel
-
Mismatched Schema Versions now only log warnings: Any mismatched versions in the past were causing that Schema to not start up
at all. Now it only logs a warning if the minor versions are close enough.
Contributed By: Michael Nash.
-
Broken Transition->Transition->Transition: Multiple Calls to Transition.transition() were not resulting in the proper
application output.
Contributed By: Michael Rimov
-
Taglibs now work with SilverStream AppServer: The taglibs sometimes used inappropriate return values that would mess up the
Silverstream App Server.
Contributed By: Clinton Parham
-
Custom where clause now honored appropriately: getMax, delete, and count now honor customWhereClause
Contributed By: Stephen Owens
-
Alternate Charactersets in XML-ViewHandler: XML View Handler now automatically sets the appropriate characterset for
transformed outputs.
Contributed By: Clinton Parham
-
Missing Resources from 3rd Party Jars: Various resource files were missing from the various 3rd party jar files in
CVS and the Expresso release. This was a fault in the build system.
Contributed By: Peter Pilgrim
Contributed By: Michael Rimov
-
Removed encodeURL() in forwarding: encodeURL() in GenericDispatcher was causing problems with App Server. It's
not needed for these two situations
Contributed By: Aime Bazin, Bazin Software Consulting Inc.
Contributed By: Clyde Oldham
-
Proper Struts Controller Factory Instantiation: The ControllerFactory for ExpressoActionServlet wasn't instantiating
controllers itself properly and was returning null
Contributed By: Michael Rimov
-
XML Import Not Working: XML was not working properly
Contributed By: Shash Chatterjee
-
XMLController Schema Error: The Schema Parameter wasn't getting passed properly for
XMLController
Contributed By: Shash Chatterjee
-
Unit Tests: Unit Tests are all now properly passing
Contributed By: Michael Rimov
-
MySQL Boolean Compatability Layer: MySQL couldn't support native boolean datatype. add nativeBoolean="false" to
your jdbc config context entry to correct.
Contributed By: Michael Rimov
-
concurrantModificationException in JobHandler: Fixed a ConcurrantModificationException during startup with
JobHandler
Contributed By: Michael Rimov
-
Download Controller Record Counts: Download Controller was incorrectly reporting the available record
count.
Contributed By: Michael Rimov
-
Default state no longer creates a temp controller: There was some code that was creating a new temp Controller object if no state
was specified in a URL. (A fairly expensive creation) That has been corrected
Contributed By: Michael Rimov
Contributed By: Aime Bazin, Bazin Software Consulting Inc.
-
Fixed null pointer exceptions in shutdown code:
Contributed By: Michael Rimov
-
Oracle Compatability Fix: Fixed Expresso's typechecking when VARCHAR2 is used
Contributed By: Jan Moons
-
Controller Race Condition: Fixed Controller Race Condition for controller creation.
Contributed By: Aime Bazin, Bazin Software Consulting Inc.
-
Sybase Compatability Issue: Fixed table create statements where Sybase required "null" statement if null
is allowed
Contributed By: Michael Nash
-
I18N Switching Bugs: Fixed several small errors and I18N bugs
Contributed By: Clyde Oldham
-
NextNumber/JobHandler Bug: Fixed bug where JobHandler nextnumber wasn't incrementing
Contributed By: Michael Rimov
-
DBObjects Had to have primary key: Fixed issue where DBObjects HAD to have a primary key... not good for data
warehousing applications
Contributed By: Brian Showalter
Contributed By: Michael Nash
-
Startup without DB: Fixed bugs where exceptions were thrown if a default database hadn't been
created yet.
Contributed By: Michael Rimov
-
Incorrect Parser Setting for command line programs: Fixed bug where the config parser wasn't getting set to Xerces upon
non-servlet startup
Contributed By: Michael Rimov
-
Display Date Problems: Fixed display formatting errors for Date datatypes.
Contributed By: Xun Li
Performance Enhancements
The following performance enhancements that have been coded since the last version:
-
Refactored Type Checking to remove String comparisons: DBObject.isQuotedType() has been moved to DBField's metadata where there is
only one comparison at system startup.
Contributed By: Larry Hamel
-
Modified thread handling in DBConnectionPool.: If a DBConnectionPool is full, threads will now only sleep until somebody
releases a connection. rather than the usual sleep time. This is resulting in much better
throughput under a high load.
Contributed By: Michael Rimov
-
FastStringBuffer Pool now used throughout Expresso.: To reduce memory usage/garbage collection times, we now use the
FastStringBuffer pooling mechanism. [Which contains by default 1K buffers, so there's an
unlikely chance that you'll need to reallocate internally]
Contributed By: Michael Rimov
-
Cached SimpleTextFormat objects in core.dataobjects.JDBCUtil: SimpleTextFormat requires substantial cpu time to instantiate. We now cache
them by the most recent 20 locales requested.
Contributed By: Michael Rimov
-
Optimized Performance in struts-based tags.: ControllerUtil was calling Logger.getInstance() with each isntantiation. This
is fixed.
Contributed By: Michael Rimov
-
Default DBObject caching.: All DBObjects now conform to the default Cache setting for Limits table. The
default system caches 50 DBObjects.
Contributed By: Michael Rimov
-
DBObject.getDef(): getDef() is now final and classname is cached to speed
performance.
Contributed By: Michael Rimov
-
Better String Handling in ControllerElements: Improved Memory Allocation during string handling with all the controller
elements, as well as switched to unsynchronized FastStringBuffer
Contributed By: Michael Rimov
-
Wrapped Logging Calls: Wrapped a lot of logging calls in if(priorityEnabled) blocks. This applies for
log.info and log.debug statements.
Contributed By: Michael Rimov
Contributed By: Larry Hamel
-
Optimized String Handling in expresso.ext.taglib package.: Taglibs have been optimized to use FastStringBuffer rather than String
concatenation, as well as reduce the number of writer.println calls.
Contributed By: Michael Rimov
-
Optimized Performance for quote checking: Intead of 5 string.equals, we now simply have one hashset lookup
Contributed By: Larry Hamel
Contributed By: Michael Rimov
-
Ordered and Unordered ControllerElements: ControllerElements are now also stored in a Hashtable to reduce lookup CPU
cycles
Contributed By: Michael Nash
-
Removed myName Strings in ControllerElements: removed new getClass.getName + .blah calls in several common
functions
Contributed By: Michael Nash
-
Refactored CacheManager.checkMemory: Refactored checkMemory to reduce locking time and contention.
Contributed By: Michael Rimov
-
Regular Expression Performance: Since regular expression compile time is the longest part of a regular
expression search, regular expressions are now compiled at controller creation time. The RE
class is what is stored within the Mask HashMap.
Contributed By: Michael Rimov
-
Garbage Collection Under Low Loads: Expresso now forces a garbage collection when the last person logs out of a
system (or the last session expires)
Contributed By: Michael Rimov
Changed Features
The following are feature changes since the last release:
-
Updated French Messages: Updated the French Message Bundle
Contributed By: Yves Amiazo
-
Quieter Builds: Verbose compilation and file deletion has been turned off in the build.xml
files
Contributed By: Peter Pilgrim
Contributed By: Michael Rimov
-
Enter key submits login form: Using Javascript, people may press "enter" in the login form fields to submit
the form.
Contributed By: Michael Rimov
Contributed By: Mitchell Balsam
-
DBMaint UI Changes: DBMaint now displays it's records within a div to allow horizontal scrollbars
for dealing with wide records. (Note, this is known to have some display problems with
Opera for Windows). DBMaint's "Action" buttons are now at the bottom of the search, update,
and add forms for usability assistance.
Contributed By: Michael Rimov
Miscellaneous Changes
The following are miscellaneous changes:
-
Updated Docs: Several installation and getting started docs have been updated.
Contributed By: Sandra Cann
-
Changed Version Number: Because of the quantity of changes in the underlying code, the community has
decided to update the version number to 5.0
Contributed By:
-
Updated Docs: Several installation and getting started docs have been updated.
Contributed By: Sandra Cann
Contributed By: Michael Rimov
Contributed By: Malcolm Wise
Contributed By: Peter Pilgrim
Contributed By: David Lloyd
-
Javadoc Warnings Removed: Continued removal of several javadoc warnings.
Contributed By: Michael Rimov
-
Updated Controller Chapters in EDG: There is now a section on extending controllers in EDG. There have been
several additions to Chapter 5 as well.
Contributed By: Michael Rimov
-
Updated dataObject fields to have asString(), asBigDecimal(), etc.: Updated the dataobject field capabilities.
Contributed By: Michael Rimov
-
DefaultUserInfo can now perform a lookup between uid and username: Can return ValidValues.
Contributed By: Tong Sun
-
Expresso binary includes libs: Expresso binary distribution now includes the required 3rd party lib files as
well.
Contributed By: Michael Rimov
-
JAXP Parser compliance.: Complete reliance on Xerces has been removed, and we can work with Xerces or
Crimson.
Contributed By: Sasvata Chatterjee
-
getDBField renamed to getFieldMetaData(): Renamed the function internally to reduce confusion over DBField's
job.
Contributed By: Michael Rimov
-
Autofield sizes for integer fields has been increased in size.: Text boxes for automatically generated Inputs for DBObject integer fields were
only 2 characters wide. Now if it's a numeric field I make it a minimum of
12.
Contributed By: Michael Rimov
-
New Build System: New single level build.xml, and library files stored in a separate
module.
Contributed By: Michael Rimov
-
Create Logging Directory: If directory for log files doesn't exist at startup, create it.
Contributed By: Larry Hamel
-
Updated Javadocs: Javadocs continued to be updated in many areas including Registration and
Actionform support.
Contributed By: Aime Bazin, Bazin Software Consulting
Contributed By: Michael Rimov
Contributed By: Larry Hamel
-
Source Code Reformatted: Reformated the source code in CVS to fit Sun formatting
standards.
Contributed By: Larry Hamel
-
String Constant Reformatting: Removed "Magic Number" strings and moved them to string
constants.
Contributed By: Larry Hamel
Contributed By: Michael Rimov
-
Updated French Message Bundle: Changed the way various characters are displayed.
Contributed By: Yves Amaizo
-
Updated Expresso Developer's Guide: For the first time since version 4.0, EDG's xml is compiling through docbook
stylesheets into html again.
Contributed By: Larry Hamel
Contributed By: Michael Rimov
-
Download Files now features a dropdown box for selecting the applicable download group.: As per requested by user scann@jcorporate.com
Contributed By: Michael Rimov
-
Throwable Exception Handling: generalize exception handling to include throwables
Contributed By: Larry Hamel
-
MakeDir if log directory doesn't yet exist: As it says
Contributed By: Larry Hamel
-
SecuredDBObject.getUserLogin: Secured DBObject can now return the username of the UID associated with
it.
Contributed By: Tong Sun
-
Refactored createTable: Cleaned up Schema.createTable
Contributed By: Brian Showalter
-
Refactored ListBase: List Base has been refactored to better allow for custom behavior, as well as
provide cleaner code
Contributed By: Stephen Owens
-
Updated Sybase Support: Updated Docs for setting up a connection with a Sybase database
Contributed By: Michael Nash
Contributed By: neuneu2k
-
Updated Doc for XML Viewhandler: Fixed discrepency in EDG describing how to use the XML
Viewhandler
Contributed By: Mike Traum
-
More Unit Tests: Added More Client Side Unit Tests
Contributed By: Michael Rimov
-
Separate Test Suites: Stress Tests have now been moved to their own TestSuite
Contributed By: Michael Rimov
-
Removed Deprecated Setup Values: Removed deprecated Setup values from system: LogLevel and
CacheSync
Contributed By: Michael Rimov
-
Changed CVS Layout: 3rd Party Libraries are built and checked into the optional lib_src module.
You do not have to download the lib_src modules for normal development work with Expresso.
You only need to check it out if you're updating a 3rd party library.
Contributed By: Michael Rimov
-
New How To Documentation: New How-To Documentation For the Expresso Framework
Contributed By: Eddie Lewis
-
Documentation Corrections and Updates: Various corrections to Documentation and clarification based on community
feedback
Contributed By: Sandra Cann
-
Improved Javadocs: Continuing to update and flesh out Javadocs.
Contributed By: Michael Rimov
Contributed By: Peter Pilgrim
Contributed By: Michael Nash
Contributed By: Adam Rossi
-
Removed @Deprecations: Continue to remove deprecation warnings
Contributed By: Michael Rimov
Package Updates
The following packages have been updated with this release:
| Package Name |
Updated Version |
|
Tomcat
|
4.0.6 |
|
Xalan
|
2.4.0 |
|
Commons-Pool
|
1.0.1 |
|
Commons Logging
|
1.0.1 |
|
Commons-Digester
|
1.3 |
|
Common-BeanUtils
|
1.4 |
|
Log4j
|
1.2.6 |
|
Cactus
|
1.4 |
|
Xerces
|
2.0.2 |
|
Commons Collections
|
2.0 |
|
Struts
|
1.02 |
|
Tiles For Struts
|
2002 02 22 |
|
Hypersonic SQL
|
1.61 |