Release History

Version Date Description
2.3.3-dev in Subversion
2.3.2 2005-10-03
2.3.2-rc2 2005-09-19
2.3.2-rc1 2005-09-11
2.3.1 2004-10-29
Turbine 2.3.1-rc2
Turbine 2.3.1-rc1
Turbine 2.3
Turbine 2.2 (= 2.2-rc2)
Turbine 2.2-rc1
Turbine 2.2-b2
Turbine 2.2b1

Get the RSS feed of the last changes

Release 2.3.3-dev - in Subversion

Type Changes By
add Default ServerData values can now be specified in seade
update Update jar dependencies:

  • commons-collections to 3.2
  • commons-configuration to 1.4
  • commons-dbcp to 1.2.2
  • commons-digester to 1.8
  • commons-lang to 2.3
  • commons-pool to 1.3
  • log4j to 1.2.14
  • velocity to 1.5
fix Fixed a couple of NullPointerExceptions that can occur when Intake is validating multiValued fields. seade
fix Fixed a NullPointerExceptions that can occur when Intake is used to validate a primitive field. Clarified the meaning of Field.isSet() in Javadoc. seade
add Added an extension of LDAPUser n amed ActiveDirectoryUser to simplify the authentication against AD servers. Added some documentation with a configuration example. tv
add Extended Intake to allow validators based on comparisons between fields of the same group. Two example validators are provided, for date ranges and for integer ranges. tv
add Added JSON-RPC Service to support JavaScript to Java AJAX communications using JSON-RPC-Java. For further details see JSON-RPC Service. seade
add Added UI Service as a replacement for the UIManager pull tool (now deprecated in favor of the backwards compatible UITool). For further details see UI Service. seade
update Deprecated the DBSecurityService and its associated classes. It has been replaced by the TorqueSecurityService. tv
remove Remove the ComponentService. This has been deprecated long ago. It has been replaced by the different incarnations of AvalonComponentService. tv
remove Remove long deprecated classes.
  • org.apache.turbine.util.SequencedHashtable
  • org.apache.turbine.util.StringStackBuffer
  • org.apache.turbine.util.FileUtils
  • org.apache.turbine.util.BufferCache
  • org.apache.turbine.util.QuickSort
  • org.apache.turbine.util.Comparable
  • org.apache.turbine.util.Log
  • org.apache.turbine.util.mail.*
  • org.apache.turbine.util.validation.*
  • org.apache.turbine.util.upload.*
  • org.apache.turbine.util.db.*
add Extended HtmlPageAttributes to allow generic < link / > tags in the HTML head section. tv
add Added Thomas's variation on Siegfried's TurbineYaafiComponentService that allows Fulcrum components to be used in Turbine 2.3 in a fulcrum-yaafi container. Fixes TRB-27. Thanks to Thomas Vandahl . seade
add Extended the LocalizationService to provide formatting facilities. tv
add Extended Intake to care for localization and to allow user-defined field types (type "custom"). The Validator interface has been extended so custom validators must be adjusted unless they extend DefaultValidator. tv
update Intake now handles the case where the mapToObject does not map to all fields in the group. Fixes TRB-9. Thanks to Jürgen Hoffmann . seade
fix Intake was not handling empty values correctly. Fixes TRB-9. Thanks to Jürgen Hoffmann . seade
fix A FileItem in a ParameterParser added to TurbineURI or TemplateURI was resulting in a NPE. Fixes TRB-8. Thanks to Gunther Olesch . seade
fix TurbineURI was mishandling the empty String. Fixes TRB-16. Thanks to Jürgen Hoffmann . seade
fix Intake was not loading the correct Default Validators when the rules for a field are empty. Fixes TRB-14. Thanks to Jürgen Hoffmann . seade

Release 2.3.2 - 2005-10-03

Type Changes By
fix Exceptions that occur in Actions once again redirect to the error page. seade

Release 2.3.2-rc2 - 2005-09-19

Type Changes By
fix The skin properties file must be loaded as stream from the filesystem and not using the getScript() method. Fixes TRB-5. Thanks to Thomas Vandahl . henning
update Make sure that the source can still be compiled and tested under JDK 1.3.1. henning

Release 2.3.2-rc1 - 2005-09-11

Type Changes By
fix Rewrote the DataStreamParser to actually parse CSV and TSV datastreams correctly with respect to missing fields, EOL, EOF conditions and quotes. Added a unit test to verify the correct operation. Fixes TTWS67. Thanks to Paul Witherow . henning
update XML-RPC 2.0 contains the MinML parser which is used as default. Remove the code from the XML-RPC service, which references xerces thus removing this implicit dependency. Another SAX compliant parser can still be selected using the parser property of the XML-RPC service. henning
fix Added a change to the Localization facade class which should help Jetspeed 1.x with Localization. Fixes TTWS62. Thanks to Dan Price . henning
update Reworked BaseValueParser and DefaultParameterParser to be more resilient against bad or missing values. Added a number of Unit tests to check for these. henning
fix file upload items should be listed in DefaultParameterParser.keySet(). Fixes TTWS58. Thanks to Edmund Urbani . henning
update All serializable classes have explicit SerialVersionUID fields. henning
fix Make sure that UIManager strips leading and trailing slashes from referenced objects and configured paths. Fixes TTWS16. Thanks to Oliver Eikemeier . henning
update Add a maven goal to generate SQL with Torque. Removed old SQL files from src/sql. Add some documentation on how to build the SQL files. henning
update This release will have JDK 1.4.x as primary build platform. If you intend to build on an older (1.3) JDK, you must uncomment a number of dependency libraries in the project.xml descriptor. henning
update Update jar dependencies:

  • Framework to 4.3 (including api and impl)
  • Beanutils to 1.7.0
  • Collections to 3.1
  • Configuration to 1.1
  • Digester to 1.7
  • Lang to 2.1
  • dom4j to 1.6.1
  • excalibur-component to 2.1
  • excalibur-instrument to ...-api 2.1
  • excalibur-logger to 2.1
  • excalibur-pool to ...-api 2.1
  • javamail to 1.3.3
  • oro to 2.0.8
  • log4j to 1.2.11
  • logkit to avalon-logkit 2.1
  • stratum to 1.0
  • velocity to 1.4
  • village to 2.0
  • xalan to 2.7.0
  • xmlrpc to 2.0
  • hqldb to (testing)
update Get rid of direct File() access in TurbineXSLTService and replace it with URL access through the servlet container. The change also allows to place the repository of XSL files elsewhere. Replace the cache Map() with a LRUMap() to avoid infinite memory growth. Add transform() methods having an additional parameter to forward a parameter set to the XSLT. The parameters can be used in the style sheet . Patches contributed by Thomas Vandahl. henning
update Change UIManager to allow customization of directories and default values. Get rid of File() in UIManager. Allow UIManager to return relative links if configured. Patches contributed by Thomas Vandahl. henning
update Bump javamail to version 1.3.2

Build with commons-email 1.0-RC6.
fix Fix the build process bug that let some of the reports end up in wrong directories. henning
update Make the default encoding for incoming requests configurable. This allows you to post forms from UTF-8 or other encodings into Turbine. henning
update Update DateFormatter to use DateFormatUtils from commons lang. seade
update commons-codec was upgraded to 1.3. seade
update Fix the Intake DateString validator not to throw an NPE whenever a slightest mistake was done in configuring a date field. Make sure that even fields without a formatting rule will parse at least standard date formats. henning
update Intake FileItemFields could not be used when calling IntakeGroup.setProperties(obj) because the field did not look into the right table for retrieving the value object. henning
update The velocity page formatting macros have been updated to generate xhtml compatible html. seade

Release 2.3.1 - 2004-10-29

Type Changes By
update JavaBaseFactory executed a Class.forName() every time it was searching for a named class, which showed up as a very costly API call in our profiling. A synchronized cache has been added to cache previously obtained class instances inside this class. henning

Release Turbine 2.3.1-rc2 -

Type Changes By
update Fix the brown paper bag bug that made RC1 unusable with Velocity. This is an implicit incompatibility between a change in Commons Configuration and an assumption in Turbine that threw a class cast exception in Commons Collections and crashed Velocity. Isn't Java a cool thing?
update Intake rule parser sometimes corrupted rule message text. Fixes TTWS63.

Release Turbine 2.3.1-rc1 -

Type Changes By
update Turbine no longer configures the logging factory for commons-logging explicitly. If you relied on this behaviour, you must add a file to your application as described in the commons logging documentation
update commons-configuration was upgraded to 1.0-rc1. All getVector() method calls on the Configuration interface must be replaced with getList().
update commons-lang was upgraded to 2.0.
update commons-collections was upgraded to 3.0.
update stratum was upgraded to 1.0-b5.
update commons-logging was upgraded to 1.0.4.
update Intake was extended to provide Field values with " escaped as & quot; to provide valid values for HTML form inputs.
update Intake now handles multiValued="true" on type="int" fields correctly. The get/set methods of the underlying object need to deal with an array of ints. The intake processing for other primitive types has also been updated, though not tested to the same extent as int.
update The intake validators were fixed so that fields with required=false rules no longer attempt to execute the remaining rules when no input is provided. A minLength > 0 rule is no longer synonymous with required=true.
update Actions triggered from html input elements with type="button" are now processed correctly (the trailing ".x" and ".y" are removed from the event names).
update Intake was fixed so that fields with required elements with value=false can later be enabled with field.setRequired(true) (i.e. you should do this rather than using the deprecated required-message element).
update Intake was fixed so that DateString will use the "formatn" (where n > = 1) rules to parse the input and then the "format" rule to format it (the "format" rule is also used to parse the date if there are no "formatn" rules or they are not able to parse it). In order to retrieve the correctly formatted DateString value you need to use $ than $ can do this for all values, not just DateString).
update Intake now makes use of the the emptyValue attribute from the field elements when mapping from the group to the object when no value has been set. This makes it possible to clear values in an existing object that is being overwritten with Intake data using group.setProperties(obj)(or you can provide non-null values in your intake.xml file). Make sure you do not inadvertently include the primary key for the object in the intake group without actually sett ing it to the appropriate value (it shouldn't be in the group anyway).
update Fixed the intake DateString flexible rule so that it applies to the format rules and not just to the default locale format.
update DateFormatter now allows for a different date format to be provided via tool.dateTool.formatin
update DirectResponseLayout is provided to allow direct writing to ServletOutputStream when VelocityOnlyLayout is the default. To use it you need to add data.declareDirectResponse();and then data.setLayout("DirectResponseLayout");to your action class. Thanks to Peter Courcoux for the code.
update Upgraded to commons-pool-1.1
update HttpUtils.httpDateFormat had the year set as 'yyyyy', should be 'yyyy' therefore setting expiry dates failed.
update TTWS60: HtmlPageAttributes setBackground sets the incorrect key name.

Release Turbine 2.3 -

Type Changes By
update It is now necessary to use Maven to build Turbine 2.3. The old, ant-based build system is no longer supported and actively removed from the distribution.
update Turbine requires the Maven Torque plugin to build. If you don't use at least Maven 1.0b9, you will have to install it manually before you can recompile the source code.
update The IntakeService has been refactored, introducing two Abstract classes; the DefaultValidator and the NumberValidator. They both contain rules which are applicable to all Validator's and NumbeValidator's respectively. Unnecessary use was being made of (Old) Nu mberValidator which used BigDecimals, cleaned this up implementing concrete classes for all Number Types. Simplified definition of (number & required) rules in Intake.xml.
update The LoginUser action no longer checks to see if the user object is already in the session and returns if it is found. The user will always be there now. If you have a custom LoginUser action that still performs this check, you will need to remove it in order for your login action to work.
update AccessControlList is now an interface and its implementation is in TurbineAccessControlList. This is now configurable and can be replaced by a custom AccessControlList implementation. If older compiled code suddently throws IncompatibleClassChange errors, just recompile and they go away.
update All deprecated java code was removed (incl. support for webmacro, freemarker and castor). Make sure to not get any deprecation warnings before you switch to 2.3!
update The LoggingService was removed. Deprecated everything in the utils.Log class.
update The TurbineResources Service was removed and replaced with commons-configuration.
update The service initialization code has been changed. This is important if you write services yourself. You should supply a constructor which takes no parameters. The usage of a constructor which takes a RunData object is deprecated and might be removed later. If you're using the supplied services, you shouldn't notice any change.
update BaseValueParser.getInteger(String name) now returns null if the key name is not found - the old behaviour was to return new Integer(0). For consiste ncy a similar change was made to getBool() and getBigInteger(). Fixes TTWS38.
update The velocity mail classes (o.a.t.util.velocity package) now throw VelocityEmailException instead of MessagingException if a problem occurs.
update The handling of "," as a separator in template names was tightened and clarified. Many places where you could get away with using "/" as a separator or use a leading "/" for a template name now no longer work. There is a long description on how to use and not to use this in the javadoc for If you want to volunteer for work on Turbine, feel free to whip this into an xdoc and put it into the documentation tree.
update Some classes have been moved into different packages to allow cleanup and clarification of their usage. The old locations are still available but deprecated. Examples are the parser classes from org.apache.turbine.util to org.apache.turbine.util.parser and some of the pull tools from org.apache.turbine.util.pull to
update getSizeMax() in the UploadService interface and implementations changed from int to long to reflect a change that was made in the underlying commons-fileupload component.
update Added ability to specify either the class file or a new TurbineConfiguration.xml file. TurbineConfiguration.xml allows Turbine to pull it's configuration values from multiple locations. Please read the howto for more information.
update Added a Howto describing using Hibernate with Turbine. The actual code is currently not part of the Turbine distribution due to licensing issues, but is very eas y to implement due to Turbine support of Avalon Components.
update Changed TurbineUser so that when either permanent or temporary values are stored, if the required hashtable was missing, then it was created. This happened in conjunction with the PassiveUserManager. Additionally, the setTempStorage(Hashtable newTempStorage) did not actually assign the new Hashtable. Cleaned up some of the code so the parallel permanent and temp data storage methods followed the same patterns. Created a cactus testcase to test TurbineUser.
update Changed scheduler so that if it is NOT enabled, then it doesn't attempt to connect to the database and retrieve jobs. This prevents a spurious no data source error from showing up in the turbine logs on startup. Added a cactus test to test the fix.
update A new pull tool is available in the session scope called $sessionData. This tool can be used to store data that will persist for the duration of the session. This should be used instead of the getTemp() and setTemp() methods in TurbineUser.
update The use of getPerm() and setPerm() methods in Turbine user have been deprecated. See the Extending Turbine User how-to for using additional database columns for storage if you are using the DBSecurityService. You can also switch to the TorqueSecurityService where it is much easier to use additional columns.
update Perm scope pull tools have been deprecated. If you use these type of tools, you need to switch to authorized scope pull tools. These tools are initialized with a user object. Any state information that you were storing in the tools itself, you will now need to store in the user object.
update Turbine used to remove all data fr om the session before executing the login action. This no longer happens. Instead, the session is invalidated before calling to logout action.
update There is a new pull tool that makes it easy to format Date objects into Strings. See for details.
update Backported the Scheduler service from Fulcrum. Other Scheduler related changes include:
update The scheduler can now be enabled/disabled while Turbine is running.
update A new pull tool is available to allow access to the Scheduler service from Velocity templates. See org.apache.turbine.service.scheduler.SchedulerTool for details.
update TurbineException is now thrown instead of Exception.
update Torque generated objects are now used to for accessing the database. You can now add additional fields for the OM objects without modifing the source code. The OM objects are generated from scheduler-schema.xml
update updateJob(job) can be used to add a new job. It will perform the correct action (insert or update) for you. addJob(job) simply calls updateJob(job).
update A new facade class has been created for easier access to the Scheduler Service. It is
update Backported the Crypto Service from Fulcrum.
update With this patch LDAP security services can have users, groups, roles and permissions in the LDAP repository. It also works with users in LDAP and the rest in the D atabase.

Sample configuration files for Openldap can be found here. Fixes TTWS24.
update Implemented the following functions in LDAPUserManager: store(), createAccount() and removeAccount(). Fixes TTWS34.
update added new Logging code which uses commons-logging everywhere.
update added new Configuration code based on commons-configuration. Switched all configuration requests to commons-configuration.
update Configuration values can now be stored in XML, .properties, as well as JNDI Tree.
update Configuration values can be overridden. If you specify JNDI and the .xml, if a value is found in JNDI, then it is used. Useful for overriding environment specific values like mail servers or whether Velocity templates are reloadable.
update added Log4j configuration and startup.
update removed all remaining Torque code.
update VelocityLayout is now the proposed default layout. VelocityECSLayout might go away post-2.3. See Moving to VelocityOnlyLayoutto see what changes need to be made to your application(s).
update TurbineException, TurbineRuntimeException, and TurbineError all extend the corresponding "Nestable" exception type from commons-lang.
update VelocityHtmlMail can now be used in a scheduled job. It has a new constructor accepting a velocity context object.
update Intake change s:
update Backported changes from Fulcrum version
update IntakeException is now thrown from intake methods instead of TurbineException and Exception.
update Multiple XML definition files can be used.
update Logging has been improved to give more information when an error occurs.
update The DTD has been updated and fully documented!
update Intake now uses commons-pool for pooling.
update intake.dtd is now packaged in the turbine.jar file. If your intake.xml file validates against, then the DTD included in the jar file will be used instead of the online version.
update The DTD resolved for intake will now look for intake.dtd on the class path when the DTD in the XMl file is The application functions in the same way. This was done to allow XML editors to use the correct version of the DTD.
update The field object has two new methods to help in creating the HTML input tags for the field. They are getDisplaySize() and getMaxSize(). The display size is set in the xml definition. The max size is pulled from the maxLength rule (if defined).
update The setDefaultValue() method on the Field object is now public. This will allow you to assign a value to a field for display on a form that does come from a mapped object. Before this change, y our only option was to defined the default value in intake.xml.
update All deprecated calls to the old org.apache.turbine.util.Log have been replaced with calls to org.apache.commons.logging.Log.
update A new SessionService has been added. This will allow access to all sessions in the current context if you use Servlet API 2.3 or better.
update The non-secure web server for handling xml-rpc requests will now use the services.XmlRpcService.address setting for the address on which to listen for requests. If the setting is not found in TR.props, it will use the default of This address will cause the server to listen on all addresses of a multi-homed machine.
update Nearly all of the methods of o.a.t.util.StringUtils has been deprecated. You should change your application code to use StringUtils from commons-lang.
update All classed in the org.apache.turbine.util.mail package have been deprecated. You should change your application code to use commons-mail instead.
update Turbine now uses commons-fileupload. The org.apache.turbine.util.upload package has been deprecated.
update The Pull Service got a new scope: authorized tools. These are like Session Tools but only available after the user logged in.
update The Pull Service got a new type of tools: RunDataApplicationTools. These tools get the current RunData object passed at every refresh(). This type obviously makes sense only for non-request scope tools.
update Some services got static facade classes: FactoryService, JspService, RunDataService, SchedulerService.
update Turbine can use the ConfigurationFactory from commons-configuration to load all kinds of configuration types like XML, JNDI or (still) plain properties files.
update A completely new URI handling scheme was added and is now the proposed default method to handle URI representations in Turbine. The older URI handling classes like ContentURI and DynamicURI will go after the 2.3 release.
update A new Security Service is available: TorqueSecurityService. It has the same functionality as the DBSecurityService but allows the usage of arbitrary Torque generated peer classes and objects as security objects.
update The security object get methods from Security Service have been deprecated and replaced by methods which are able to reference Objects by Name and by Primary Key.
update The TurbineDB Service has been deprecated. Use Torque and the Component Service to start Torque.
update It is possible to debug pressure on the PoolService by setting services.PoolService.pool.debug to true in the
update Turbine now has some integration for Avalon Components. It can start Avalon based components with the new AvalonComponentService.
update Added a new TurbineMacros file to the turbine jar, which contains some helper macros for Velocity Templates. Currently there are only some macros to be used with VelocityOnlyLayout to render the page attributes like in VelocityECSLayout based pages.
update The ComponentService (using the stratum lifecycle interfaces) is deprecated. It will be removed a fter the 2.3 release as the stratum package is unmaintained. We use the new AvalonComponentService to initialize Torque.
update ActionEvent and VelocityActionEvent can "ignore" eventSubmit_ < xxx > events if they contain an empty or a zero value. This behaviour is controlled by the "action.eventsubmit.needsvalue" property that defaults to "off", which means no change from the pre-2.3 behaviour. The new behaviour is useful if you have multiple event fields in a form and only one should be selected (e.g. by a client side java script application).
update VelocityService now uses the EventCartridge Code to catch and log invocation errors from templates. This is very useful when debugging pull tools, because you get the actual exception in the log and not only the velocity internal stack trace. You can switch this behaviour off by setting "services.VelocityService.catch.errors" to off or false.
update Intake can now assign "empty" values to fields which are not returned or left out by the browser. This is useful if you want your string fields not to map to null if the user does not enter anything.
update Removed deprecated call to TurbineDB. Fixes TTWS25.
update TRQD10: Extending Turbine User How-to for T2.2
update Intake can not set mapped attributes to null. Fixes TTWS20.
update Changed made to scheduled jobs are now recognized by the scheduler service. Before, it would only recognize changes to the next run time.
update Fixed null pointer exception during initialization of IntakeTool when there are no groups defined in intake.xml
update PrimaryKey not set on TurbineUser after insert. Fixes TTWS41.
update Cookies now work properly. A NullPointerException was being thrown during the call to data.getCookies() if no cookies were present. Also, the path for cookies was being set incorrectly. Both of these issues have been fixed.
update The pull service now really refreshes non-request tool every time a tool is requested.

Release Turbine 2.2 (= 2.2-rc2) -

Type Changes By
update TemplatePageAttributes enhancements. Fixes TTWS1.
update Reference support for DynamicURI. Fixes TTWS5.
update IntakeTool.getGroups() should be public. Fixes TTWS13.

Release Turbine 2.2-rc1 -

Type Changes By
update Enhancements to support Apache XML-RPC versions 1.2 alpha 1 and 2.
update TRQD2: Update to intake-howto to mention remove()

Release Turbine 2.2-b2 -

Type Changes By
update The coupled version of Torque has been removed from Turbine 2.2! Get a full list of changes at the Torque-site.
update the coupled version of torque has been removed.
update Maven is used as build system for Turbine 2.2
update removed antiquated redirect logic.
update You can use log4j properties directly.
update The configuration package has been moved from stratum to commons
update BaseValueParser.setProperty() changed from private to protected
update Fixed IllegalStateException when removing an attribute from an invalid session (patch by David Vandegrift -
update Fixed NumberFormatException in UUIdGenerator.

Release Turbine 2.2b1 -

Type Changes By
update Torque and Fulcrum (the service framework) have been decoupled in preparation for Turbine 3.0. The decoupled versions can be used with Turbine 2.2. We strongly recommend to use the decoupled versions (some of the 'old' services must be used, because they are used internally by Turbine)

If you wrote your own services you should also change them to be Fulcrum services to make them work with Turbine 3.x

update The Service interface was extended to allow integration of Service implementations:


since most Service implementations extend BaseService (which implements a public getName method), this should not be an issue.
update ECS, Freemarker and Webmacroservices/modules are marked deprecated. You should use Velocity instead.
update Castorservice is marked as deprecated. You should use om/peer classes instead!
update The XSLT Service is updated to use Xalan 2.0
update Improved datatype mappings for mysql, oracle, postgresql, sapdb
update adding support for DB2 on AS400 (patch by
update adding support for secure connections in the xmlrpc service.
update Added a configuration parameter to torque, addTimeStamp, that allows the user to generate files wi thout a timestamp. Default is true, timestamps will be generated.
update Criteria.Criterion implements Serializable
update DB implements Serializable
update torque: id-methods sequenceand autoincrementare deprecated. You should use native. torque uses the method provided by your database
update added static strings for ISNULL and ISNOTNULL to Criteria.
update added getDateString() method to format date fields to DB.
update added VelocityDirectLayout/Screen to make it possible to embed servlet/JSP outputs into a Velocity template used within Turbine. (patch by
update added an easy to use localization pull tool.
update Javadocs improvements.
update Documentation improvements.
update fixed error in Mssql unique.vm template (removed a blank line)
update [2301 ] Embedding message parts in HtmlEmail throws NullPointerException.
update bugfix for BigDecimal attributes with default value
update fixed handling of sequences for db2, oracle, postgresql, sapdb
update fixed syntax for create index (postgresql)
update fixed problem for postgres with blob style column in TurbineUser table. (patch by Jerome Veryleyen)
update Corrected method name (setName -> getName).
update fixed Roleset.add(RoleSet) (patch by
update fixed database - defaultIdMethod (torque)
update fixed date formating problem with Oracle.
update fixed problem when ignoreCase was used with ISNULL or ISNOTNULL.
update fixed Option object initialisation in SelectorBox (patch by Kurt Grafius