RIFE v0.8.2 has been released.

Below are the highlights of this release.

You can also read the full changelog for more details.

Support for Derby and One$DB/DaffodilDB databases

RIFE now fully supports Derby and One$DB/DaffodilDB in the database query builders and in every integrated framework:

Support for Cloudscape has been removed and has been replaced by the Derby support.

[ top ]

Important bugfixes and reduced memory usage

All known bugs have been fixed and many areas of the framework have been profiled in production to reduce memory usage as much as possible. Many thanks go to YourKit for providing our developers with free licenses.

Due to these fixes and improvements, everyone is urged to upgrade to this version.

[ top ]

Support for constrained beans

Besides the constrained properties, RIFE now has constrained beans. These constraints provide meta-data that isn't related to a single property but rather provides information about the entire bean instance. Some of these have been integrated with the database query builders (multi-column unique and default ordering), but others have been added for the benefit of external libraries like RIFE/crud and currently have no concrete interactions inside the core framework (associations and textual identifiers).

Constrained beans are declared is a completely similar manner as constrained properties, for example:

public class Personal extends Validation
{
    private String mFirstname = null;
    private String mLastname = null;
    private String mCity = null;
    
    public Personal()
    {
    }

    protected void activateValidation()
    {
        addConstraint(new ConstrainedBean()
            .unique("firstName", "lastName")
            .defaultOrder("city")
            .defaultOrder("lastName")
            .defaultOrder("firstName"));
    }
    
    public void setFirstname(String firstname) { mFirstname = firstname; }
    public String getFirstname() { return mFirstname; }
    public void setLastname(String lastname) { mLastname = lastname; }
    public String getLastname() { return mLastname; }
    public void setCity(String city) { mCity = city; }
    public String getCity() { return mCity; }
}

This will put a unique constraint on the firstName and lastName columns when you build a CreateTable query from this class like this:

new CreateTable(datasource)
    .table("personal")
    .columns(Personal.class);

Additionally, class-aware Select query builders will automatically order the results by city, lastName and firstName if no other order has been specified:

new Select(datasource, Personal.class)
    .from("personal");

[ top ]

Detection of URL length overflow

There is no standard limit for the maximum length of an URL, but currently the lowest common threshold seems to be 2048 bytes for Internet Explorer (http://support.microsoft.com/kb/q208427/). Since RIFE by default stores the state in the query string, there's a possibility that a query string makes this URL length limit overflow. RIFE now detects such an overflow and uses session state storage for that request only while logging a warning about it. This enhances the reliability of RIFE applications by picking the most REST-aware state storage method that's technically feasible without compromising the application's robustness.

[ top ]

Automatic preservation of serializable properties in the data flow

Before, RIFE's data flow only supported the automatic preservation of bean properties with types that could be mapped directly to String representations and recreated from those (primitives, primitive wrappers, arrays of these, Strings and StringBuilders). RIFE will now also detect properties that are Serializable and automatically serialize/deserialize them to Strings that can be passed along inputs, outputs and exits. Note that this can result in very long URLs, but thanks to the new detection of URL length overflow this will never make your application dysfunctional. You can of course pass these values around through POST requests instead or reduce the URL length by using session state storage.

[ top ]

Addition of database capabilities and compensators

RIFE has always had a layered approach to database interaction and persistence. We firmly believe that you need to know SQL and your target database before being able to make your applications perform as fast as possible. However, there are many basic operations that are totally analogue amongst database back-ends but differ in syntax. This is why we created the database query builders, which allow you to build your queries through a uniform API and rely on the engine to translate the queries into the appropriate syntax for your target database.

However, to collect the results of your queries, many common patterns exist that you shouldn't have to write manually. We collected those in the DbQueryManager, allowing you to be assisted with most of your custom queries. To cater for the regular easy persistence needs, we created the GenericQueryManager on top of the DbQueryManager and extended that into the CmfQueryManager to store rich content easily through the CMF.

In this release we're taking the database layer one step further and are starting to abstract functionalities that each database should have, but that not all of them provide easily. We call these functionalities 'capabilities'. If a database doesn't natively support a capability, it will use a compensator to still provide the requested functionality. RIFE knows for each supported database which capabilities are natively available and which ones need to be compensated for. Currently, the only available capabilities are 'limit' and 'offset' support., but we plan on adding others like 'distinct on'.

Capabilities are only used when you use RIFE's database query builders and execute them through the DbQueryManager (which implies the GenericQueryManager and the CmfQueryManager). However, they automatically kick in when you build a query with capabilities that aren't natively supported. This brings RIFE one step closer to database abstraction for regular query functionalities.

[ top ]

Support for internationalized requests and query strings

Unless you explicitly specify the character set in the content type attribute of an element declaration or set it explicitly in your code, each response will now default to the UTF-8 encoding. RIFE now also expects post requests to be in the UTF-8 encoding and you have to do nothing to your application to make this happen. All <!--V 'SUBMISSION:FORM:submissionName'/--> variables that you use as your form action will now automatically add the accept-charset="UTF-8" attribute to the form tag. All encodings that are used internally have also been updated to handle UTF-8 by default.

Sadly there's no standard for the character set encoding of URLs and it's not possible to reliably pass non-ascii data through the query string. Since RIFE has total control of your data flow, we are however capable to provide a workaround for this. All parameters that RIFE puts in URLs that are intended for itself, are now checked for non-ascii characters. If any of these are present, RIFE will use a custom encoding scheme to guarantee that your data is transferred along correctly. While those parameters will now not be human readable anymore, it allows international applications to be developed without worrying about possible data corruption while still behaving in a standard manner when only ascii values are transferred.

[ top ]

Complete isolation of embedded elements

RIFE now makes sure that any submission will only be handled by its originating element or those within its conceptual context (parent elements or preceeding elements). So if you have several submissions with the same name, it will not be picked up by an embedded element or a sibling element. For this to work, RIFE needs to be able to identify elements in a unique manner and it uses a method that respects server restarts or code maintainance. This means that active users of the web application or bookmarks will still continue to work when the application is maintained over time.

If you have several instances of the same embedded element in one template however, RIFE needs help to be able to differentiate the instances. This is simply done by appending a differentiator string like this:

<!--V 'ELEMENT:.THEELEMENTID:differentiator'/-->

This new submission behaviour might however conflict with some existing code that you have written, or you might want to actually have embedded elements react to a submission of an embedding element. Therefore, you're able to revert back to the previous behaviour by declaring the submission's scope to be 'global' instead of 'local' in your element declaration.

[ top ]

Full changelog

2005-01-05  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * RELEASE 0.8.2

  * Updated examples index page
 
  * Minor fixes for running all database tests.

  * Added X-Develop project files.

  * Workaround for 5.0 compiler bugs.
 
  * Javadocs fixes.

  * Copyright year updates

  * Removed contrained bean constructors in query builders that don't support 
  them (ie. one Select has one now)
  
2005-01-03  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added constructor parameter to DB query builders that makes the builders 
  aware of constrained beans so that they can adapt to ConstrainedBean 
  constraints. Currently, this only has an impact in Select queries for the 
  defaultOrdering constraint.

  * Added support for ValidationContext interfaces.
  Implemented a ValidationContext on top of the generic query manager to 
  check for uniqueness constraints before storing any data.

2005-01-02  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added support for resetGroup to Validation

  * Regression bugfix to correctly handle array type properties that are set 
  through output beans (ie. not serialize them but handle them with multiple 
  parameters instead)

2005-01-01  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Made fillSubmissionBean correctly set properties to the empty value if 
  an empty parameter has been submitted.

  * Updated copyright year

  * Made the PrintTemplate element extensible

  * Bugfix to make site properties propagate to sub-sites

  * API updates for more flexible site structure introspection

2004-12-30  Geert Bevin  <gbevin[remove] at uwyn dot com>

   * Added support for automatic preservation of serializable bean properties
   through outputs / inputs / exits. Need to evaluate how to integrate a
   similar feature with form building.

   * Added detection of URL length overflow with logged warning and automated
   fallback to session state storage.

2004-12-29  Geert Bevin  <gbevin[remove] at uwyn dot com>

   * Implemented RIFE-159 : Implement database capabilities and compensators

2004-12-27  Geert Bevin  <gbevin[remove] at uwyn dot com>

   * Reduced memory using for queries by dynamically putting parameters in a
   HashMap.

   * Preparing implementation of parametrized constraints.

2004-12-27  Geert Bevin  <gbevin[remove] at uwyn dot com>

   * Javadocs additions and code cleanups.

   * Fix to forward to outsides URLs, some headers are now filtered out.

2004-12-24  Geert Bevin  <gbevin[remove] at uwyn dot com>

   * Implemented a reliable way to pass along internationalized text along
   the query string.

   * Defaulted URL encoding to UTF-8 since all encoding defaults in the
   engine use UTF-8 now.

2004-12-23  Geert Bevin  <gbevin[remove] at uwyn dot com>

   * Added correct handling of internationalized parameters.
   
   * Every character encoding now defaults to UTF-8 and this is also used in
   the form building.
   
   * Added support for GQM with another name than the bean name.

   * Workaround for JDK 5.0 compiler bugs.

   * Moved the ValidationError collection to a Set instead of a List to
   ensure that duplicate errors are not listed.

2004-12-22  Geert Bevin  <gbevin[remove] at uwyn dot com>

   * Added support for ConstrainedBean uniques and defaultOrder to the
   database query builders.

   * Upgraded One$DB/DaffodilDB to 3.4.1.

2004-12-21  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Integrated ConstrainedBean in the Constrained interface

  * Added ConstrainedBean tests.

  * Source cleanups.

2004-12-20  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Updated Groovy to 1.0 beta8

  * Added more ConstrainedBean features

2004-12-13  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Some fixes to be nicer on the garbage collector and reduce memory usage.

2004-12-11  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Minor NPE fix

  * Updated debug output a bit

2004-12-10  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Bugfix to fix the fact that element were always checked for auto-reload
  even when the config parameter was set to false.

  * StringUtils.encodeUrl enhancement to reduce memory usage.
  
  * Minor code cleanup in the EngineClassloader to reduce memory usage.

  * Upgraded derby to v10.0.2.1

  * Started the ConstrainedBean implementation.

  * Build file updates.

2004-12-09  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added full support for One$DB/DaffodilDB

2004-12-08  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added further support for DaffodilDB

  * Upgraded to hsqldb 1.7.3

2004-12-07  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added support for 'local' and 'global' submission scope attribute.

  * Added support for FORM:DISPLAY tags that will display the value of bean
  parameter, taking lists and labels into account. This was needed to make it
  possible to easily build confirmation steps after the actual data entry.

2004-12-04  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added consistancy check when elements are added without implementations
  or wrong declarations (ie. forgetting .xml for xml element declarations).

2004-12-03  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Merged submission context and submission target.

  * Added base64 encoding for their values.

  * Fixed a minor bug related to precedence.

  * Implemented RIFE-161 : Submissions of embedded elements should only
  arrive at the element that generated the form

2004-12-01  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Initial implementation of submission target id.

2004-11-27  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Stupid contraint regression bugfix.

2004-11-26  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Updated configuration and build file for Netbeans 4RC1

2004-11-25  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Updated ant build files to not check for cloudscape anymore since derby 
  is now included.

  * Workaround for Orion's weird classloader resource protocol.

  * Upgraded to ASM 2.0 CVS to fix 5.0 debug info problems

  * Implemented RIFE-160 : Reimplement ConstrainedProperty and CmfProperty

2004-11-24  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Redesigned ConstrainedProperty internally to reduce memory usage.

  * Fixed another continuations bug related to different control flow
  generated by javac of jdk 5.0

  * Fixed continuations bug related to different control flow generated by
  javac of jdk 5.0

  * Upgraded ASM to v2.0alpha

2004-11-23  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Upgraded ASM to v1.5.2

  * Added support for One$Db/DaffodilDb to the core database engine, still
  needs to port to other sub-frameworks.

2004-11-22  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added a java to sql type mapping for byte[]

  * Refactored cloudscape to derby

  * Removed support for Cloudscape 5.1 and ported the drivers to
  Cloudscape 10 / Derby

2004-11-19  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added support for subsite properties.

  * Fixed bug that made WhereGroups wrongly return their parent query when
  end() is called.

  * Solved issue RIFE-163: When Rife sees a request for "x", it should check
  to see if a site has a prefix "x/"

2004-11-08  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Implemented initial limit/offset capabilities compensator for McKoi.
  Parametrized limits and offsets aren't supported yet.

  * Regression bugfix in where parameters.

  * Initial implementation of db capabilities compensators

  * Bugfix to not use alpha transparent images with jpeg formats

2004-11-02  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * ImageFormatter fix to handle transparent images.

2004-10-29  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added support for embedded element differentiators.

2004-10-29  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Bugfix to make the XHtml template bean handler play nice with non XHtml
  CMF text content.

2004-10-25  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Bare URL StringUtils patch.

2004-10-24  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Fixed long-standing thread concurrancy bug related to named prepared
  statement parameters.

2004-10-23  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Removed certain methods from DbQueryManager that stand in its way to
  become a true DB abstraction layer.

2004-10-21  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * The ContentQueryManager now only refrains from storing null content on
  properties that are not set to autoRetrieved.

2004-10-20  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Applied JR's bare StringUtils patch.

2004-10-19  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added WhereGroup support to GQM DeleteQuery, RestoreQuery and CountQuery
  
  * Fixed 5.0 compilation error.
 
2004-10-18  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Added support for ResourceFinderGroup

2004-10-15  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Ensured that fetchSize is 1 for executeGetFirst* DbQueryManager methods.

2004-10-12  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * L10N and dateformat fix.

2004-10-11  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Integrated jboyens' BBcode improvements to StringUtils.

2004-10-08  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Minor template factory fix.

2004-10-05  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Made some managers cloneable.

2004-10-04  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Changed GenericQueryManagerDelegate, OrdinalManager and
  ContentQueryManager to not extend DbQueryManager, but use composition
  instead. Otherwise the DbQueryManager get publically exposed and that's
  confusing.

  * Updated groovy.

2004-10-01  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Minor GQM fix to make RestoreQuery and CountQuery implement ReadQuery 
  instead of Query.

  * L10N fix for J2SE 5.0

2004-09-30  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * Dirty hack around an IE bug that incorrectly handles anchors in redirect
  headers.

2004-09-28  Geert Bevin  <gbevin[remove] at uwyn dot com>

  * RELEASE 0.8.1

[ top ]