Release NotesNovember 1, 2009
About UltraLightClient '08 Update 4
Please see the UltraLightClient '08 Update 3 release notes for previous release notes.
To migrate from UltraLightClient '08 Update 3 to UltraLightClient '08 Update 4, please see the migration notes.
UltraLightClient requires the Java Runtime Environment (JRE) 1.4.2 or later on the server and on the client. Some addons (e.g. the application framework) require JRE 1.5 or later on the server-side.
To deploy an UltraLightClient application in a JEE server, the server needs to support either at least the Servlet 2.4 specification or at least the EJB 2.1 specification.
Modules, Parts and Release Structure
The UltraLightClient release includes all components required to successfully develop and deploy UltraLightClient applications. The UltraLightClient modules, parts, packages, and the structure of the current release are described in the following sections.
The UltraLightClient release is split into modules. Each module belongs to exactly one of five categories:
All UltraLightClient classes.
For convenience, contains all other modules (except samples).
The UltraLightClient core.
Always needed, for development and deployment.
Server-side integrations into containers, e.g. Servlet, EJB.
Only needed for server deployment.
Client-side integrations into environments, e.g. Applet, JNLP.
Only needed for client deployment.
Utilities and extensions, e.g. application framework, test framework, QTP integration.
Only needed on demand.
Samples demonstrating the usage of UltraLightClient, e.g. Hello, ULCSet, OnlineShop.
Not needed during development or deployment.
The category and module names are reflected in the directory structure of the release, e.g. environment/applet for the applet module that belongs to the environement category.
A module directory contains subdirectories with the following contents:
Jar files that contain the module classes.
For sample and add-on modules the required libraries.
Only for sample modules: the required resources, e.g. images, property files
Either complete source code or source stubs.
The source stubs are used to enable code completions in IDEs.
Only for sample modules: ready to deploy web application, i.e. war files
Each of these modules can contain up to four parts:
Contains classes to be deployed on the client side.
Runs inside the sandbox.
Contains classes to be deployed on the client side.
Does not run inside the sandbox. The additional permissions required depend on the module.
Contains classes to be deployed on the server side.
Contains all classes needed during development, i.e. the client, trusted, and server parts plus some additional development classes.
The part names are reflected in the filename of the jar files in the lib and src directory of the corresponding module, e.g. ulc-applet-client.jar and ulc-applet-client-src.jar for the classes and source stubs of the applet module that have to be deployed on the client side.
|<ULC_HOME>||UltraLightClient home directory|
|Add-ons to the UltraLightClient base framework|
|base||UltraLightClient base framework|
|all||For convenience, all UltraLightClient classes|
|Server integrations including EJB container integration and Servlet container integration and integration into local container for stand-alone (single JVM) ULC applications.|
|Client environment integration for applet deployment, JNLP deployment, and standalone deployment.|
|license||the jar file with the deployment license key|
|previous_releasenotes||Previous release notes|
|Sample applications with ready to run Tomcat Servlet container|
|build.txt||Contains the build number|
|LicenseAgreement.pdf||The license Agreement|
|UBA-7839||DividerLocation on ULCSplitPane is not set correctly when first setting it as a percentage and then later absolute|
|UBA-7830||All AbstractFormBuilder method names to add a combo box are misspelled|
|UBA-7815||ULCTable / ULCTableTree should do nothing in JTable.configureEnclosingScrollPane()|
|UBA-7813||ULCTableTreeOperator should not create a new JTreeOperator for each operation|
|UBA-7796||Anything.toMap should return LinkedHashMap if the underlying Map is a LinkedHashMap|
|UBA-7790||ULCTableTree.preloadCells() does not work for all columns|
|UBA-7787||IModelAdapterProvider.registerModelAdapter should take a constant value for ModelType instead of and instance of Class|
|UBA-7782||For a field bound to a bean property of type long, the enable/disable logic on Ok button in the Form does not work.|
|UBA-7781||Invoking InputBlocker.removeBlockedSession without invoking InputBlocker.addBlockedSession results in NPE.|
|UBA-7780||Check for row count > 0 before invoking preloadCells ULCTree, ULCList, ULCTable and ULCTableTree|
|UBA-7775||'ULCComboBox.getSelectedIndex' throws a NPE when the model contains a null value|
|UBA-7770||AbstractTestCase.tearDown should not throw an exception|
|UBA-7769||NPE while uploading ULCTree which has root with no children and setRootVisible set to false|
|UBA-7757||invokeULC(UlcEventConstants.SYNCHRONOUS_MODE,...) does not block the UI|
|UBA-7741||New application configuration file does not work for shared library deployment|
|UBA-7563||Should check for fUserParameters == null in UISession .sendStartApplication|
|UBA-7345||DevelopmentRunner with -useGui argument ignores DevelopmentRunner.setSessionProvider()|
|UBA-6935||DevelopmentRunner with -useGui argument ignores setSessionStateListener|
|UBA-952||UINumberDataType never returns Long|
|UBA-7804||ULCDialogOperator.close() does not respect DO_NOTHING_ON_CLOSE DefaultCloseOperation|
|UBA-7791||Setting a null model on a ULCTree throws a NullPointerException|
|UBA-7573||ULCComponent.add/removeNotify() does not work inside ULCTabbedPane and ULCCardPane|
|UBA-7580||Missing column selection event for ULCTableTree with expansion listener|
|UBA-7760||[Mac OS X 10.5.7, JRE 1.5] Installing shortcuts on the dock messed up the dock|
|UBA-7852||ULCTextField getValue() returns null when field is emptied|
|UBA-7824||Use of a custom UIMandatoryInputStyle in UIMandatoryAndEnabler not possible|
|UBA-7818||ULC Installer will not work on Mac OS X Snow Leopard|
|UBA-7814||It should be possible to configure the default comparator|
|UBA-7810||Extend Logger by a 'isLoggable' (or 'isEnabledFor') method|
|UBA-7808||Ugly frame default background color in Applet environment on Mac with Safari|
|UBA-7798||Add a reflection cache for the renderer templates|
|UBA-7776||Improve performance of caching strategy for method lookups||ULC
uses several static caches to look up methods:
* String concatenation (e.g. "color" => "setColor")
* Reflection (e.g. "foo(int)" => Method instance for reflection
The caches are implemented using maps. As the usual HashMaps are not thread safe we synchronized the critical parts.
Other (better?) approaches would be:
* use ConcurrentMap (but requires Java 5)
* use unsychronized maps in ThreadLocals (but requires memory per session instead of per application)
Maybe a way to configure the strategy would be the best solution.
|UBA-7774||ULCTableHeaderOperator should provide API to find a column by String|
|UBA-7773||ULCListOperator should provide an API to get the number if items||Like
it is available for other components:
|UBA-7743||Easy deployment should not rely on file write access on the server||as this cannot be guaranteed for all server environments, e.g. Google App Engine|
|UBA-7740||ErrorDialog should have a better owner||The current error dialog has a null owner. The result is that the error dialog does not belong to any other host window. So when you select another host window and then jump back the the main host window of the ULC application (e.g. the browser, JFrame) then the error dialog is behind the host window and is not visible. This is strange as the error really belong to the main host window of the ULC applicaiton.|
|UBA-7739||Make client jar handling more customizable|
|UBA-7532||Generator in overwrite mode should overwrite everything not just generated classes|
|UBA-7438||Clean up serializable implementation|
|UBA-1120||Failure behavior of ServletConnector should be customizable|
|UBA-641||ULCNumberDataType does not support currency settings|
|UBA-41||ULCNumberValidator too restrictive|
Minor adaptions where made in the form builder API. Combobox and Checkbox in method and class names are replaced by ComboBox and CheckBox. The same replacements have to be done by clients using the API.
Migrating an existing application to ULC 08
To integrate the new features into an existing application you can perform the following steps.
- Application configuration file Copy the files from <ULC_HOME>/base/configuration/ into the root source directory of your project. Open the ULCApplicationConfiguration.xml file and specify the application class name of your application. Provide all the configuration elements that you want to use, as for example the lookAndFeel, carrierStreamProvider or modelAdapterProvider. Add the servlet configuration for the client properties access to your web.xml:
- Libraries The number of libraries you need to cope with is reduced dramatically. You find then in the <ULC_HOME>/all/lib directory. For an overview of the libraries see Section 3.4 in the ULCApplicationDevelopmentGuide.
- Application framework To use the features of the application framework it is neccessary that your application class inherits from com.ulcjava.applicationframework.application.Application. Rename the start() method to startup(). You could also inherit from com.ulcjava.applicationframework.application.SingleFrameApplication and distribute the creation of the GUI into the different createStartup...() methods. Code that must be executed before the GUI is created goes into the initialize() method.
- Easydeployment For the easydeployment feature to be working you must have the application configuration file and the application class must inherit from com.ulcjava.applicationframework.application.Application.
<servlet> <description> delivers the client configuration data </description> <servlet-name>ConfigPropertiesDownloader</servlet-name> <servlet-class> com.ulcjava.container.servlet.server.servlets.ConfigPropertiesDownloader </servlet-class> </servlet> <servlet-mapping> <servlet-name>ConfigPropertiesDownloader</servlet-name> <url-pattern>/clientconfig.properties</url-pattern> </servlet-mapping>
Create a resources package beneath the package of the application class and create the <ApplicationClassName>.properties file.
- Copy the content of the WebContent directory that is in <ULC_HOME>/addon/generators/templates/projecttemplates/server/ to the projects web content directory.
- Remove the PersistenceServletContextListener configuration entry from the web.xml
- Replace the placeholder tokens in the web.xml :
- @projectname@, an arbitrary name of your project.
- @rootpackage@, the root package of your project (for example com.sample.ulc)
- @rootpackagepath@, the root package as path formated (for example com/sample/ulc)
- Rename the appletPage.jsp into @projectname@.jsp.
- Copy the libraries for the servlet environment into the WEB-INF/lib directory. Copy the libraries of your project into the WEB-INF/lib directory, the libraries that are to be downloaded by the client must be (re)named to end with -client.jar.
You can find known problems and limitations in our issue database.
Product and company names herein may be trademarks of their respective owners.