Below are the highlights of this release.
You can also read the full changelog for more details.
RIFE now provides a Content Management Framework that is geared towards the process of storing, loading, validating, formatting, transforming, versioning, retrieving and streaming of various content types. Currently the emphasis has been placed on providing features that are needed when putting content data into a back-end repository and getting the data back out. The actual management of the content once it is stored has not yet been implemented in an elaborate manner, but this well be done in a future version (plus the integration and implementation of JSR-170 JCRQL to search for particular content).
These notes will only briefly cover the main features of the CMF, which is quite comprehensive.
The impatient reader may choose to skip down to the example. There you'll find the logic that is needed to store news items. Each news item has validated XHTML content and an optional image that is automatically scaled into two formats during storage and afterwards streamed directly to the browser. You'll see that very little code is needed to provide these functionalities.
All CMF content is stored in repositories that must have unique names. The installation of a content manager creates an initial default repository. If others are needed, they must be created explicitly.
All content is identified by a uniquelocation. The location is formatted like this:repository:path
If
the repository: prefix is omitted, the content will be stored
in the 'default' repository. The path should start with a
slash, which makes it 'absolute'; this is completely analogous to unix
file system paths.
Content is stored through an instance of ContentManager and RIFE includes implementations for the storage in PostgreSQL, MySQL, Oracle, McKoiSQL, HypersonicSQL, Cloudscape and Firebird databases. Below are a few terms and their definitions in the context of the CMF:
ContentManager |
The main interface that handles all high-level content operations (create, get, delete, etc.). All code behind this interface is implementation dependent. RIFE currently provides an implementation that is backed by a database, but it's totally possible to provide alternative implementations on top of WebDAV or JSR-170 for instance. |
ContentStore |
An interface to handle the actual storage of content data. There are multiple content stores available, each responsible for handling certain types of content data. Examples are text data, image data, and raw data. |
ContentDataUser |
When content data is retrieved from a content store, a concrete implementation of this abstract class will be given a handle to the actual content data, valid for a limited period of time. This is important since some content data (such as streamed binary data) is volatile and never fully loaded in memory. |
Attribute |
This provides additional information about how the content data is to be formatted. For example, for images this can be a width or a height, in order to ensure that images are scaled before being stored into the content store. |
Property |
This provides information about the formatted content data as it is actually stored in the content store. Even with no attributes defined, content data can still have properties. For instance, an image still has a width that will be detected and stored for later usage. |
MimeType |
All content is tagged with a mime type that indicates how it
will be further processed. There is one special mime type,
RAW, which causes the content to be stored as-is
without any manipulation. |
Formatter |
This uses a Loader to get a typed representation of the raw content data, then formats it according to any defined attributes, transforms it, obtains the formatted data's properties, and converts it back to raw content. |
Loader |
This makes a best-effort attempt to load raw data into a generic typed object, and collects any associated error messages. A loader will typically delegate the actual loading to external libraries when they are available. Examples of those libraries are the JDK XML parser with XHTML DTDs, Jimi, JAI, ImageJ, ... |
Transformer |
This can transform the generic typed object of content data that has been created by the loader into another object of the same type. For example, to perform image manipulations or compositions. |
The database implementations have the following workflow:
java.lang.String
for text data and java.awt.Image for image
data)ContentDataUser instance with the raw
content data that was retrieved, and make it available to the
callerTo simplify working with content, a
new query manager has been developed, called
ContentQueryManager, which extends
GenericQueryManager. This query manager class works
hand-in-hand with CMF-specific constraints that are provided via the
classes CmfValidation and CmfProperty. The
additional constraints allow you to provide CMF-related metadata for bean
properties while still having access to all regular constraints.
The
most important additional constraint is 'mimeType'. Setting
this constraint directs RIFE to delegate the handling of that property's
data to the CMF instead of storing it as a regular column in a database
table. The property content location (i.e. its full path) is generated
automatically based on the bean class name, the instance's identifier
value (i.e. the primary key used by GenericQueryManager), and the property
name. So for example, if you have an instance of the NewsItem
class whose identifier is 23, then the full path that is
generated for a property named text is
'/newsitem/23/text'. Note that this always specifies the most
recent version of the property, but that older versions are also available
from the content store.
To make it easy to handle file uploads
(which are quite common when uploading content), the
ConstrainedProperty class now has an additional
file() constraint that will automatically create a file
parameter for a submission bean and populate the property with the
uploaded data after a submission.
Before being able to use the CMF
and a ContentQueryManager, you must install both of them, as
in this example:
Datasource ds = Datasources.getRepInstance().getDatasource("datasource");
DatabaseContentFactory.getInstance(ds).install();
new ContentQueryManager(ds, NewsItem.class).install();Here is a short example that demonstrates how to integrate a user-defined compound document called a "news item" with the CMF. A single image associated with the news item will be defined to have two sizes for delivery, "small" and "medium". When it is stored to the CMF, the image is rescaled in accordance with these size constraints, and it can also be automatically converted from other formats (such as PNG). These variants can also be streamed directly to a browser, based on which access path (small or medium) is used.
the DAO java bean NewsItem.java:package com.mypackage.dao;
public class NewsItem extends CmfValidation
{
private int mId = -1;
private String mTitle = null;
private String mText = null;
private byte[] mNewsImage = null;
public NewsItem() { }
protected void activateValidation()
{
addConstraint(new CmfProperty("title")
.notNull(true)
.maxLength(90));
// specify a type for automatic validation
addConstraint(new CmfProperty("text")
.mimeType(MimeType.APPLICATION_XHTML)
.autoRetrieved(true)
.fragment(true)
.notNull(true)
.notEmpty(true));
addConstraint(new CmfProperty("newsImage")
.persistent(false)
.file(true));
// specify types for content delivery and sizes for automatic rescaling
addConstraint(new CmfProperty("imageSmall")
.mimeType(MimeType.IMAGE_JPEG)
.contentAttribute("width", 70)
.editable(false));
addConstraint(new CmfProperty("imageMedium")
.mimeType(MimeType.IMAGE_JPEG)
.contentAttribute("width", 120)
.editable(false));
addConstraint(new CmfProperty("id")
.editable(false)
.saved(false));
}
public void setId(int id) { mId = id; }
public int getId() { return mId; }
public void setTitle(String title) { mTitle = title; }
public String getTitle() { return mTitle; }
public void setText(String text) { mText = text; }
public String getText() { return mText; }
// As always in RIFE, a setter/getter pair defines a property.
// In this case, imageSmall and imageMedium are both "virtual"
// properties, which reference the mNewsImage property, but
// are delivered after transformations, i.e. they are resized
// to the dimensions specified in the above Constraints.
public void setNewsImage(byte[] newsImage) { mNewsImage = newsImage; }
public byte[] getNewsImage() { return mNewsImage; }
public void setImageSmall(byte[] imageSmall) { } // dummy setter
public byte[] getImageSmall() { return mNewsImage; }
public void setImageMedium(byte[] imageMedium) { } // dummy setter
public byte[] getImageMedium() { return mNewsImage; }
}the element declaration add_news.xml: <element implementation="com.mypackage.elements.AddNews"
<submission name="add">
<bean classname="com.mypackage.dao.NewsItem"/>
</submission>
</element>the element implementation AddNews.java: package com.mypackage.elements;
public class AddNews extends Element
{
private Template mTemplate;
public void initialize()
{
mTemplate = getHtmlTemplate("add_news");
}
public void processElement()
{
print(mTemplate);
}
public void doAdd()
{
NewsItem newsitem = (NewsItem)getSubmissionBean(NewsItem.class);
if (!newsitem.validate())
{
generateForm(mTemplate, newsitem);
print(mTemplate);
return;
}
Datasource ds = Datasources.getRepInstance().getDatasource("datasource");
ContentQueryManager manager = new ContentQueryManager(ds, NewsItem.class);
manager.save(newsitem);
mTemplate.setBlock("content", "content_success");
print(mTemplate);
}
}This code takes care of all the logic to store a new news item with two variants of an optional image (small and medium) that are automatically scaled and stored as JPEGs in the CMF together with the article's text. The text will be validated and only valid XHTML Transitional 1.0 will be accepted. Depending upon which image handling libraries are available in the classpath of the application, the image when it is uploaded can be in one of many other formats which can be automatically converted to JPEG before storage into the CMF. Without any external libraries only the JDK standard types are supported: JPEG, GIF and PNG.
To display the news item in a browser, some of the work is
done automatically for you for the text property since it has
the autoRetrieved constraint. This will automatically fetch
the content from the ContentStore and fill it into the bean
as if it were stored in the actual news item table in a dedicated column.
For images, you cannot use this since you have to generate some HTML code
which fetches the images themselves from a dedicated URL (the
src attribute of the image tag).
The CMF
provides an element implementation that streams content data directly to a
browser according to the path info that the element receives. This path
info will be used as the content path when it is retrieved from the
ContentManager. You can for example integrate this element in
your site structure like this:
<element id="SERVE_CONTENT" file="rife/cmf/serve_content.xml" url="/content/*">
<property name="datasource"><config param="datasource"/></property>
</element>The 'datasource' property has to contain
the name of the datasource to use, which in this case is fetched from the
config.
Once this element is in place, you just need a template to display the news item, like this for example:
<div><!--V 'title'/--></div> <div><!--V 'image'--><!--/V--></div> <div><!--V 'content'/--></div>
The following element
implementation will display the news item according the id
that has to be provided as an input:
package com.mypackage.elements;
public class ViewNews extends NewsCommon
{
public void processElement()
{
Template t = getHtmlTemplate("view_news");
int id = getInputInt("id");
Datasource ds = Datasources.getRepInstance().getDatasource("datasource");
ContentQueryManager manager = new ContentQueryManager(ds, NewsItem.class);
NewsItem newsitem = (NewsItem)mNewsItems.restore(id);
if (null == newsitem)
{
return;
}
t.setBean(newsitem);
if (mNewsItems.hasContent(newsitem, "imageMedium")
{
t.setValue("image", mNewsItems.getContentForHtml(newsitem, "imageMedium",
getSite().resolveId(".SERVE_CONTENT")));
}
}
}RIFE now fully supports McKoiSQL, HypersonicSQL, Cloudscape and Firebird in the database query builders and in every integrated framework:
It has previously been possible to use Janino and Groovy for element implementations. These scripting languages have now also been integrated into other scriptable aspects of RIFE.
Template tag filteringInstead of using OGNL for template tag filtering, you can use Janino or Groovy simply by changing the language identifier and the tag name:
<!--V 'GROOVY:name'-->Evaluated to false<!--/V-->
<!--B 'GROOVY:name:[[ true ]]'-->
Evaluated to true
<!--/B-->
<!--V 'JANINO:name'-->Evaluated to false<!--/V-->
<!--B 'JANINO:name:[[ true ]]'-->
Evaluated to true
<!--/B-->Element declaration Elements can be declared in Groovy and Janino like this. Instead of referring to an XML file to integrate them in the site structure, just refer to the script file instead:
using Groovy (you can find more examples in the SVN repository)processor.element(implementation:"com.package.MyElement") {
input(name:"input1")
input(name:"input2")
output(name:"output1")
exit(name:"exit1")
submission(name:"submission1") {
param(name:"param1") {
defaultvalue("default1")
defaultvalue("default2")
}
param(name:"param2")
param(regexp:"paramC(.*)")
file(name:"file1")
}
}using Janino (you can find more examples in the SVN
repository) builder
.setImplementation("com.uwyn.rife.engine.testelements.engine.Simple")
.addInput("input1")
.addInput("input2")
.addOutput("output1")
.addExit("exit1")
.enterSubmission("submission1")
.addParameter("param1", new String[] {"default1", "default2"})
.addParameter("param2")
.addParameterRegexp("paramC(.*)")
.addFile("file1")
.leaveSubmission();Site structure declaration Site structures can be declared in Groovy and Janino like this. Instead of referring to an XML file, just refer to the script file instead:
using Groovy (you can find more examples in the SVN repository)processor.site(fallbackid:"ELEMENT4") {
globalexit(name:"globalexit1", destid:"ELEMENT6")
globalvar(name:"globalvar1") {
defaultvalue("default1")
}
globalvar(name:"globalvar2")
element(id:"ELEMENT4", file:"element4.xml")
element(id:"ELEMENT5", file:"element5.xml")
subsite(id:"SUBSITE", file:"subsite.groovy", urlprefix:"/subsite", inherits:"ELEMENT4")
group(inherits:"ELEMENT5") {
globalvar(name:"globalvar4")
element(id:"ELEMENT6", file:"element6.janino", url:"/test/element6", inherits:"ELEMENT4")
element(file:"element7.groovy", url:"/test/element7")
}
}using Janino (you can find more examples in the SVN
repository) builder
.setFallback("ELEMENT4")
.addGlobalExit("globalexit1","ELEMENT6")
.addGlobalVar("globalvar1", new String[] {"default1"})
.addGlobalVar("globalvar2")
.enterElement("element4.xml")
.setId("ELEMENT4")
.leaveElement()
.enterElement("element5.xml")
.setId("ELEMENT5")
.leaveElement()
.enterSubsite("subsite.groovy")
.setId("SUBSITE")
.setUrlPrefix("/subsite")
.setInherits("ELEMENT4")
.leaveSubsite()
.enterGroup()
.setInherits("ELEMENT5")
.addGlobalVar("globalvar4")
.enterElement("element6.janino")
.setId("ELEMENT6")
.setUrl("/test/element6")
.setInherits("ELEMENT3")
.leaveElement()
.enterElement("element7.groovy")
.setUrl("/test/element7")
.leaveElement()
.leaveGroup();All RIFE core features (including continuations) have been ported to J2SE 5.0 and fully tested.
Since RIFE has been using generic types since the beginning, the APIs are very strongly typed and offer many usability benefits when using them with a generics-capable compiler (such as J2SE 5.0 or Omnicore CodeGuide). In many places the APIs have been designed to take advantage of generics beyond the trivial generification that is offered by many IDEs. The javadocs also contain valuable information since the types of collection items and other class capabilities are displayed everywhere. Aside from the JDK itself, RIFE is probably the largest generics-aware Java project in existence.
The defer() and
forward(String url) element methods permit better integration
of RIFE applications with in-container and external web
applications.
The defer() method will only work if RIFE
is used as a servlet filter (which is its default mode of operation). It
simply interrupts any RIFE processing immediately and makes the servlet
engine continue the processing of the filter chain.
The
forward(String url) method is like the standard servlet
forward method, except that it goes much further. You can provide it with
any URL, both local and remote. It will send a request to that URL and
output its response through the response of the element that executed the
forward.
Conceptually speaking, init parameters were very close to element instance properties, and during the business logic of reusable elements, checks for the presence of both were often needed. Therefore, we have now replaced init parameters with static declaration properties that are overridden by element instance properties.
Most users can simply replace
<initparam> ... </initparam> by
<property> ... </property>, and
everything should continue to function as before.
Concretely, if you declare an element like this:
<element implementation="com.package.MyElement">
<property name="name">default</property>
</element>The 'name' property of that element will
contain the 'default' value if it is not overridden in the
site structure.
Now if you define the element like this in the site structure:
<site>
<element id="THEID" file="myelement.xml" url="/myelement">
<property name="name">overridden</property>
</element>
</site>The 'name' property of that element
instance will contain the 'overridden' value
instead.
The
OrdinalManager class makes it possible to easily manage an
integer ordinal column that is typically used to determine the order of
the rows in a specific table.
The basic version manages the ordinals
for the entire table, but it is also possible to create an
OrdinalManager that uses several independent ranges of
ordinals according to a restricting integer column.
For example,
consider the following 'article' table:
id INT categoryId INT ordinal INT name VARCHAR(30)
with the following rows:
id | categoryId | ordinal | name ----+------------+---------+----------------------- 2 | 1 | 0 | some article 0 | 1 | 1 | another one 3 | 1 | 2 | boom boom 1 | 2 | 0 | this is yet an article 5 | 2 | 1 | an article for you 4 | 3 | 0 | our latest article 6 | 3 | 1 | important one
You can clearly see three
independent ordinal ranges according to the
categoryId column.
The OrdinalManager
allows you to easily change the order of the articles by moving them up
and down. Additional methods are also available to perform a number of
low-level operations. Take a look at the javadocs
for more information.
The
PagedNavigation class provides utility methods to generate
navigation for paged lists.
The generation of the navigation depends on a collection of block and value IDs that should be defined in a template. Following is a table of all the IDs and their purpose:
| ID | Description |
|---|---|
<!--B 'NAV:FIRSTRANGE'--><!--/B--> |
Provides the content that will be used to jump to the first range. This block has to contain an EXIT:QUERY value that will be replaced with the actual URL that will trigger the paging behaviour. |
<!--B 'NAV:FIRSTRANGE:DISABLED'--><!--/B--> |
Provides the content that will be used when jumping to the first range is not appropriate, for instance when the first range is already the current offset. |
<!--B 'NAV:PREVIOUSRANGE'--><!--/B--> |
Provides the content that will be used to jump to the previous range according to the current offset. This block has to contain an EXIT:QUERY value that will be replaced with the actual URL that will trigger the paging behaviour. |
<!--B 'NAV:PREVIOUSRANGE:DISABLED'--><!--/B--> |
Provides the content that will be used when jumping to the previous range is not appropriate, for instance when the first range is the current offset. |
<!--B 'NAV:ABSOLUTERANGE'--><!--/B--> |
Provides the content that will be used to jump directly to each individual range. This block has to contain an EXIT:QUERY value that will be replaced with the actual URL that will trigger the paging behaviour. |
<!--B 'NAV:ABSOLUTERANGE:DISABLED'--><!--/B--> |
Provides the content that will be used when jumping directly to a specific individual range is not appropriate, for instance when that range corresponds to the current offset. |
<!--B 'NAV:NEXTRANGE'--><!--/B--> |
Provides the content that will be used to jump to the next range according to the current offset. This block has to contain an EXIT:QUERY value that will be replaced with the actual URL that will trigger the paging behaviour. |
<!--B 'NAV:NEXTRANGE:DISABLED'--><!--/B--> |
Provides the content that will be used when jumping to the next range is not appropriate, for instance when the last range is the current offset. |
<!--B 'NAV:LASTRANGE'--><!--/B--> |
Provides the content that will be used to the last range. This block has to contain an EXIT:QUERY value that will be replaced with the actual URL that will trigger the paging behaviour. |
<!--B 'NAV:LASTRANGE:DISABLED'--><!--/B--> |
Provides the content that will be used when jumping to the last range is not appropriate, for instance when the last range is already the current offset. |
<!--V 'NAV:RANGECOUNT'/--> |
Will contain the number of ranges that are needed to display all the information that is paged. This value is optional. |
<!--V 'NAV:FIRSTRANGE'/--> |
Will contain the content that allows to jump to the first range. This corresponds to the beginning of the paged data. |
<!--V 'NAV:PREVIOUSRANGE'/--> |
Will contain the content that allows to jump to the previous range according to the current offset. |
<!--V 'NAV:ABSOLUTERANGES'/--> |
Will contain the content that allows to jump directly to each individual range that is available. |
<!--V 'NAV:NEXTRANGE'/--> |
Will contain the content that allows to jump to the next range according to the current offset. |
<!--V 'NAV:LASTRANGE'/--> |
Will contain the content that allows to jump to the last range. This corresponds to the end of the paged data. |
In addition to these template conventions, you must also
provide one exit and one output that will be used to create the links that
will perform the actual paging behaviour of the navigation. By default,
the change_offset exit and the offset output
will be used. It is up to you to create the datalink and flowlink and to
correctly handle the offset value when it changes.
A very basic paged navigation could for example be defined like this:
<!--B 'NAV:FIRSTRANGE'--><a href="[!V 'EXIT:QUERY:change_offset'/]"><<</a><!--/B-->
<!--B 'NAV:FIRSTRANGE:DISABLED'--><<<!--/B-->
<!--B 'NAV:PREVIOUSRANGE'--><a href="[!V 'EXIT:QUERY:change_offset'/]"><</a><!--/B-->
<!--B 'NAV:PREVIOUSRANGE:DISABLED'--><<!--/B-->
<!--B 'NAV:ABSOLUTERANGE'--> <a href="[!V 'EXIT:QUERY:change_offset'/]"><!--V 'ABSOLUTERANGE_TEXT'/--></a> <!--/B-->
<!--B 'NAV:ABSOLUTERANGE:DISABLED'--> <!--V 'ABSOLUTERANGE_TEXT'/--> <!--/B-->
<!--B 'NAV:NEXTRANGE'--><a href="[!V 'EXIT:QUERY:change_offset'/]">></a><!--/B-->
<!--B 'NAV:NEXTRANGE:DISABLED'-->><!--/B-->
<!--B 'NAV:LASTRANGE'--><a href="[!V 'EXIT:QUERY:change_offset'/]">>></a><!--/B-->
<!--B 'NAV:LASTRANGE:DISABLED'-->>><!--/B-->
Pages: <!--V 'NAV:RANGECOUNT'/--> ( <!--V 'NAV:FIRSTRANGE'/-->
<!--V 'NAV:PREVIOUSRANGE'/--> <!--V 'NAV:NEXTRANGE'/-->
<!--V 'NAV:LASTRANGE'/--> | <!--V 'NAV:ABSOLUTERANGES'/--> )This
templating could result in the following output, where all the underlined
parts are clickable and will trigger the change_offset exit
and provide a new corresponding value for the offset
output:
Pages: 9 ( << < > >> | 1 2 3 4 5 6 7 8 9 )The element that displays the list and calls the navigation generation method could for example be like this:
public class List extends Element
{
public final static int LIMIT = 10;
public final static int SPAN = 5;
public void processElement()
{
Template t = getHtmlTemplate("article.list");
DatabaseArticles manager = DatabaseArticlesFactory.getInstance();
int count = manager.countArticles();
if (0 == count) t.setBlock("content", "noarticles");
else
{
int offset = getInputInt("offset", 0);
PagedNavigation.generateNavigation(this, t, count, LIMIT, offset, SPAN);
Collection<Article> articles = manager.listArticles(LIMIT, offset);
for (Article article : articles)
{
t.setBean(article);
t.appendBlock("articles", "article");
}
}
print(t);
}
}Take a look at the javadocs for more information.
The standard JDK java.util.ResourceBundle
class caches all bundles after their first load. While this is good for
performance, it makes the development of localized web applications
cumbersome since a developer has to restart the application after each
change to a properties file. RIFE's
com.uwyn.rife.tools.Localization class provides helper
methods to easily obtain resource bundles and now also includes a
ResourceBundle implementation that will automatically reload
when the content changed. Each time a resource bundle is obtained, the
modification time is checked and when it's newer than a previous version,
it's loaded again. This ensures that all modifications are immediately
reflected. Since all features that use resource bundles in RIFE depend on
this class, this feature is now also active throughout the whole of the
framework. You can set the L10N_RESOURCEBUNDLE_AUTO_RELOAD
configuration parameter to turn the automatic reloading off, in that case
the standard JDK class will be used. By default, reloading resource
bundles will be used.
2004-09-28 Geert Bevin <gbevin[remove] at uwyn dot com>
* RELEASE 0.8.0
* Authentication example fix.
2004-09-27 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added one more header to preventCaching method to ensure that the page
is never stored.
* Added support for automatically reloaded resource bundles and a
L10N_RESOURCEBUNDLE_AUTO_RELOAD config param to activate/disable it. The
default is true.
2004-09-25 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added some more CMF unittests.
2004-09-24 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added better support for repository to ContentQueryManager and
CmfProperty.
* Regression unittests bugfixes.
* Build file fix to correctly run the tests through ant.
2004-09-23 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added support for submission bean retrieval without providing the
submission name.
* Javadocs update.
* Added support for several submissions in one request.
2004-09-22 Geert Bevin <gbevin[remove] at uwyn dot com>
* Javadocs and build file fixes.
* Minor fix to standalone use of StringEncryptor.
2004-09-21 Geert Bevin <gbevin[remove] at uwyn dot com>
* Updated CMF error message reporting to ensure that duplicate errors are
only reported once.
* Added nicer invalid xhtml error reporting.
* Added better integration to obtain the loading errors of for example
invalid xhtml.
2004-09-20 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added raw content stream close check.
* Minor bugfix to allow a global pathinfo element to be used.
2004-09-18 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added some commented properties to make the element declarations clear.
* Added missing file
2004-09-17 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added text/plain support to CMF.
* Bugfix to correctly handle null values of boxed primitives in the bean
fetcher.
* Added support for co-existing regular url elements and pathinfo url
elements at the same base location. Like this a fixed element can be
used as the 'home' element for a certain url and all longer urls
delegated to one that handles the pathinfo. This also allows for
instance to create a CMS system that is overlaid by a fixed url
structure.
2004-09-16 Geert Bevin <gbevin[remove] at uwyn dot com>
* General firebird related fixes
* Added support for configurable CMF table structure.
* Added repository support to the ServeContent element.
* Upgraded ImageroReader.
* Added some CMF repository-related tests.
* Added checking of the repository's existance before storing content.
* Removed DB specific properties from ContentInfo and created the
DatabaseContentInfo extending class specially for that. This that
the contentId property doesn't bubble up until the top api.
* Added initial support for repositories.
2004-09-15 Geert Bevin <gbevin[remove] at uwyn dot com>
* CMF fixes.
2004-09-14 Geert Bevin <gbevin[remove] at uwyn dot com>
* Renamed CMF 'contentDataProperties' to 'properties'.
* Added facility methods for working with properties.
* Conceptually bumped up properties so that they are intended to be provided
manually to store meta data about stored content.
* Upgraded janino.
* Added janino support as filtered tag processor.
* Added support for content data properties and integrated it with
getContentForHtml
2004-09-13 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added some CMF unittests.
* Removed hackish code stripping for javadoc generation since instead of
using the jsr-014 pre-release, we now use j2se 5.0 for javadoc generation;
which works without any problems.
* Worked a bit more on DaffodilDB support, but the DB still has too many
probs to be supported yet.
2004-09-11 Geert Bevin <gbevin[remove] at uwyn dot com>
* Concurrancy bugfixes and speedups for the engine and the template
classloaders.
* Added CMF servecontent hook to allow paths to be filtered when they are
served.
* Fixed CMF bug where multi versions of content weren't deleted correctly.
* CMF raw storage optimization by using as much streams as possible
2004-09-10 Geert Bevin <gbevin[remove] at uwyn dot com>
* Trapped IOException in CMF that happens when a client disconnects during
serving of content.
* Rearranged the Authentication element to correctly handle authentication
templates that embed authenticated elements. Before this resulted in a
stack overflow of method calls.
* Correctly integrated ordinal support in the ContentQueryManager's delete
method.
2004-09-09 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added unittests for CMF delete features.
* Updated idea project
* Initial implementation of content deletion.
2004-09-08 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added content-disposition header when content has a name
* Code cleanup
* Added some utility methods.
* Made validation error generation and marking generation correctly
consider the validated bean subjects when clearing. This allows the
usage of multiple beans on the same template.
* CMF db structure fix
2004-09-07 Geert Bevin <gbevin[remove] at uwyn dot com>
* Permission fixes
* Updated pnuts
* NPE fix
2004-09-07 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added support for 'file' constraint.
* Integrated CMF into the engine and added automatic handling of file
uploads and bean properties.
2004-09-06 Geert Bevin <gbevin[remove] at uwyn dot com>
* Implemented RIFE-148 : It should be possible to group where query parts
* Added support for getting content from the CMF through the combination of
path and name.
* Added support for name in contentinfo
2004-09-04 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added some more unittests.
* Changed data used by useContentData for raw storage to InputStream instead
of byte[]
* Moved com.uwyn.rife.database.exceptions.InnerClassException to
com.uwyn.rife.tools.InnerClassException
* Added javadoc clarification for deepClone method.
* Refactored CMF getContentData to useContentData
* CMF oracle text storage fix
2004-09-03 Geert Bevin <gbevin[remove] at uwyn dot com>
* Additional CMF fixes and support for raw storage.
2004-09-02 Geert Bevin <gbevin[remove] at uwyn dot com>
* Further work on raw data storage in the CMF
2004-09-01 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added raw content storage to CMF.
* Added date config to RifeConfig.
* Added support for adding regular Participants to a BlockingRepository.
* Added check that verifies if participants that are added to a
BlockingRepository are of the correct type.
2004-08-31 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added support for JMagick as image content loader.
* Added support for content emptying.
2004-08-30 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added support for ImageIO and JMagick for image loading in the CMF.
* Minor bugfixes, code cleanups and test fixes.
2004-08-29 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added oracle support to CMF
* Added support for firebird to CMF
2004-08-28 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added CMF support for HsqlDB, Mckoi, MySQL and Cloudscape.
Oracle and Firebird are still unsupported.
2004-08-27 Geert Bevin <gbevin[remove] at uwyn dot com>
* Fixed sql type bug where TIMESTAMP was used in MySQL instead of DATETIME
* CMF source cleanups and unittests additions.
2004-08-26 Geert Bevin <gbevin[remove] at uwyn dot com>
* Javadocs and unittests updates.
2004-08-25 Geert Bevin <gbevin[remove] at uwyn dot com>
* Integrated faster base64 encoder.
* Added CMF tests
* Additional CMF unittests and javadocs
2004-08-24 Geert Bevin <gbevin[remove] at uwyn dot com>
* Source cleanups and javadocs additions
2004-08-23 Geert Bevin <gbevin[remove] at uwyn dot com>
* Source cleanups.
* Added unittests and javadocs.
2004-08-22 Geert Bevin <gbevin[remove] at uwyn dot com>
* Javadocs updates.
2004-08-21 Geert Bevin <gbevin[remove] at uwyn dot com>
* Code cleanups.
* Added javadocs for OrdinalManager.
* Renamed OrdinalManager methods: move -> update and
insert -> obtainInsertOrdinal.
2004-08-20 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added some CMF tests and dao bugfixes.
2004-08-19 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added complete OrdinalManager tests.
* Fixed some OrdinalManager bugs.
* Parted OrdinalManager to all supported databases.
2004-08-18 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added ordinal manager tests for all databases.
* Added PagedNavigation unittests and fixed the implementation a bit.
2004-08-17 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added licenses of all libs.
* Upgraded some libs.
2004-08-16 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added missing files from CMF.
* Updated build files.
* Added some javadocs.
2004-08-14 Geert Bevin <gbevin[remove] at uwyn dot com>
* Integrated the core features of RIFE/CMF.
* This still needs to be fully unittested and ported to the other databases.
* Added support for redirect in ElementSupport
2004-08-12 Geert Bevin <gbevin[remove] at uwyn dot com>
* Null primitives fix
2004-08-11 Geert Bevin <gbevin[remove] at uwyn dot com>
* Fixed some deprecated method calls.
* Added support for ERRORS: decoration of the fallback error area in the validation builder.
* Encoding related bugfix
2004-08-10 Geert Bevin <gbevin[remove] at uwyn dot com>
* Internal query source refactoring.
2004-08-09 Geert Bevin <gbevin[remove] at uwyn dot com>
* Fixed getDefaultLanguage() bug in RifeConfig
* Fixes and refactoring of WaitingImageObserver
2004-08-08 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added support for getEmbedProperties()
* Added uncached element
* Added element declaration conflict tests.
2004-08-07 Geert Bevin <gbevin[remove] at uwyn dot com>
* Test updates
* Added IDEA project files
2004-08-06 Geert Bevin <gbevin[remove] at uwyn dot com>
* Fix for continuations and JDK 1.5
2004-08-05 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added Xalan to make XML template transformation work with java 5.0.
* Updated McKoi SQL for latest CVS additions.
* Updated code for Clover.
* Added some convenience java 5.0 related scripts.
* Javadocs fixes
* Added a hack to have proper Groovy support in template expressions
* Updated a bunch of libs
* Updated Ant
* Updated clover
* Build file updates
* Added support for Cloudscape.
2004-08-04 Geert Bevin <gbevin[remove] at uwyn dot com>
* Javadoc updates
* Build file updates
* Resolved issue RIFE-85: Add support for McKoi SQL.
* McKoi db configuration update
* Added some embedded DBs configuration
* Added preliminary support for Cloudscape.
* Added support for InputStreamUser and ReadUser to correctly use
InputStreams and Readers with databases and resource finders.
* ResourceFinder getResource methods changed to useResource.
* DbQueryManager executeGetFirst*Stream have been replaced by executeUseFirst*Stream.
2004-08-03 Geert Bevin <gbevin[remove] at uwyn dot com>
* Deadlock-related bugfixes
2004-08-02 Geert Bevin <gbevin[remove] at uwyn dot com>
* Regression bugfixes.
* Loosened consistancy checks a bit.
* Added support for setting transaction isolation levels.
* Added preliminary support for DaffodilDB
* Added more detailed declaration consistancy checks, still needs to be
fully unittested.
2004-08-01 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added support for setValue("value", template) in templates
2004-07-31 Geert Bevin <gbevin[remove] at uwyn dot com>
* Deadlock bugfix.
2004-07-28 Geert Bevin <gbevin[remove] at uwyn dot com>
* URL shortening fix.
* Added configurable max visual URL length.
* Gate updates to make it dynamically fetch the Site instance from the Rep
at each request.
* Test fixes and better handling of Config to preferences lists.
2004-07-27 Geert Bevin <gbevin[remove] at uwyn dot com>
* Classloader bugfixes
* Now allowing + in email address.
* Added support for getServerRootUrl
2004-07-25 Geert Bevin <gbevin[remove] at uwyn dot com>
* Engine classloader bugfixes.
* Database connection pool bugfixes.
* Upgraded Firebird JDBC driver.
2004-07-24 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added silencing IOException catch block when the outputstream is closed
and flushed. There's no need for this exception to propagate since it's
due to the fact that the visitor is not connected anymore.
* Updated HttpUnit
2004-07-23 Geert Bevin <gbevin[remove] at uwyn dot com>
* Expression tag processor bugfix.
* Code updates
2004-07-22 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added site structure declaration with Janino.
* Added processor and builder support for Groovy site structures.
* Minor bugfixes in processor error reporting.
* Added Groovy builder support for defining site structures.
* The default ElementInfo and Site ProcessorFactory now is MANUAL.
* ProcessorFactories are now also looked up by filename extension in case
no explicit identifier is provided.
* The 'corexml' identifier has been renamed to 'xml'.
* Improved error reporting in the Xml2Site and Xml2ElementInfo builder a
bit.
2004-07-20 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added full support for Groovy in evaluate expression tags.
* Note that the API has changed both for the templates and the elements.
evaluateOgnlRoleUser -> evaluateExpressionRoleUserTags
evaluateOgnlConfigTags -> evaluateExpressionConfigTags
evaluateOgnlTags -> evaluateExpressionTags
* Added support for Groovy template expressions.
2004-07-19 Geert Bevin <gbevin[remove] at uwyn dot com>
* Database fixes.
* Added support for Janino class body scripts.
* Upgraded a bunch of packages and dependencies.
* Added full Firebird support
2004-07-18 Geert Bevin <gbevin[remove] at uwyn dot com>
* In-progress support for FirebirdSQL.
* Restructured database query unittests.
* Fixed some minor bugs is the database api.
* Made certain exceptions in the engine Response silently discarted since
they are related to clients disconnecting before the end of the reponse
stream.
2004-07-15 Geert Bevin <gbevin[remove] at uwyn dot com>
* Database fixes.
2004-07-14 Geert Bevin <gbevin[remove] at uwyn dot com>
* Fixed some McKoi-related stuff.
* Minor database fixes.
* Minor fixes to HttpUtils and ElementContext forward()
2004-07-12 Geert Bevin <gbevin[remove] at uwyn dot com>
* Removed post/submission check.
* Regression bugfix.
* Redesigned HttpUtils.
* Implemented RIFE-149: Query builders should support subselects better
2004-07-11 Geert Bevin <gbevin[remove] at uwyn dot com>
* Restructured query managers and added full support for HypersonicSQL.
2004-07-09 Geert Bevin <gbevin[remove] at uwyn dot com>
* JDK 5.0 related fixes.
2004-07-08 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added support for SequenceValue queries.
* Started adapting querymanagers to use 'generic' fallback.
* Started adding specialized subselect methods to query builders.
2004-07-07 Geert Bevin <gbevin[remove] at uwyn dot com>
* DB fixes.
* Added HsqlDB support.
* Still need to add drivers to authentication, scheduling and resources.
2004-07-06 Geert Bevin <gbevin[remove] at uwyn dot com>
* Initial McKoi SQL support, still experimental since many McKoi flaw still
need a workaround or to be disabled.
2004-07-04 Geert Bevin <gbevin[remove] at uwyn dot com>
* Updated tests and other files to remove the naming of initparams and
replace it with static properties.
* Removed initparams and replaced them by static properties. The <initparam>
tag has been replaced by the <property> tag.
2004-07-03 Geert Bevin <gbevin[remove] at uwyn dot com>
* Retrieve page updates and forward improvements.
* Workaround for Jetty header bug
2004-07-02 Geert Bevin <gbevin[remove] at uwyn dot com>
* Optimized identified element.
* Forward workaround for Jetty.
2004-07-01 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added LOCAL_FORWARD_PORT configuration parameter to make it possible to
forward to a different port when the URL is local.
2004-06-30 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added support for forward() without relying on the servlet API since it
doesn't take filters into account when doing forward. Implemented it from
scratch through HttpUtils and updated the latter.
2004-06-29 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added support for defer().
2004-06-25 Geert Bevin <gbevin[remove] at uwyn dot com>
* Added redirect support to flowlinks.
2004-06-21 Geert Bevin <gbevin[remove] at uwyn dot com>
* Updated bbcode url generation for URL shortening.
* Defaulted URL encoding to ISO-8859-1
2004-06-17 Geert Bevin <gbevin[remove] at uwyn dot com>
* RELEASE 0.7.2