Developer website: Helma Project
Helma pioneered the simple and codeless mapping of application objects to database tables, which has only recently come into vogue with other Web frameworks. In addition, an embedded object-oriented database performs automatic data persistence of unmapped objects.
- Added ability to create HopObject collections programmatically and on the fly, without having to define them in the prototype's type.properties file.
- Prototype mappings can now be defined programmatically as well using the newly added global function definePrototype().
- Added Apache Commons Daemon support, making it possible to run the embedded Jetty server on port 80 for ordinary users on Unix and running Helma as service on Unix and Windows systems.
- Property names in HopObjects are now case sensitive.
- Added support for lazy collection loading, setting collection.lazyloading = true changes HopObject.list() to no longer fetch all contained objects, amongst other aspects.
- HopObject.href() now takes an optional second argument, an object which will be encoded to a query string and added to the generated URL.
- Added a profiler for measuring function runtime and invocation frequency.
- Added generic header manipulation methods getHeader(), addHeader(), setHeader(), removeHeader() to the helma.Mail object.
- Backported improved helma.file module from Helma NG, which takes an options object as argument and allows to specify the default charset to use.
- Changed Object.prototype.dontEnum to be overridable and not read-only.
- Added support for __defineGetter__ and __defineSetter__ to HopObjects.
- Write locks for non-persistable properties on HopObjects are no longer checked.
- A Rendering bug involving case in skin name has disappeared.
- Fixed strictvars mode to produce the appropriate errors.
- Fixed a bug where debug logging level wasn't unset if the debug property was set to false during runtime.
- Network ports are now checked at startup by opening a ServerSocket on the port in question and seeing if it works.
- Fixed a regression where dynamic relations were broken when the parent wasn't explicitely set.
- Replaced encumbered code base of helma.util.Diff with an alternative implementation.
- Fixed a comparison bug in loop macro in HopObject.js.
- Fixed a slowdown when using getDBConnection() and oracle db that was due to running connection tests to often.
- Fixed an error when retrieving HopObjects by accessname on a programmatic collection.
- Fixed a problem where the return value of a HopObject's size() method did not change when removing children of a collection.
- Fixed a problem with limit and offset on normal collections not working properly.
- Adding an object to a grouped collection right after removing an object from that collection, which was in the same group and was added in the same request, now works.
- Changed sessions for requests that do not already have one to be only created when actually needed.
- Fixed a bug that caused helma.Html.isSelected() method to fail when the last argument was an array.
- Added Skin.getMacros() to offer start and end properties, and getName, getHandlerType, getNamedParams, getPositionalParams and hasNestedMacros methods for skin/macro introspection.
- Fixed a problem with persist() and collections using accessName.
- Calling list() method with min and/or max arguments on HopObjects that are transient now works.
- Changed String.URLPATTERN to use a regular expression instead of java.net.URL.