Get the book!

April 30 2009

Summary of Changes

  • ui

    • revised ui to not allow display of duplicate view for same instance; instead just focus on existing view that's in ui
    • list view's titlebar "active area" for right-clicking list commands is now wider (a layout fix)
    • disabled substance application of a colorization factor
  • libs

    • updated swingx lib to version 0.9.7
    • updated h2 jar file (20090410)
    • updated embedded groovy libs to v1.6
    • updated hibernate to v3.3.1 and spring to v2.5.6
    • updated jasperreports (v3.0 -> v3.5); updated iText (-> v2.1.5)
    • removed jfreereport support/dependencies from jmatter
  • calendar

    • fixed/revised algorithm in calendar for positioning overlapping events
  • persistence

    • slightly improved hbmmaker hibernate map generation to specify good defaults for choiceeo type columns
  • authorization

    • ensuring that time and duration of events in calendar can be changed only if timespan field is not restricted
  • development

    • adding substance skin switching as menu in app frame
  • localization

    • i was not localizing list commands
  • deployment

    • revised template jnlp file to specify j2se v1.6+
  • bugs

    • fixed possible npe in eocommand 'returnsaview' check (minor)
    • fixed some edt violations
    • various other bug fixes (see subversion log for complete details)

Again, thank you to the various subscribers on the mailing list who have provided feedback, reported bugs, and posted fixes


April 5 2009

Summary of Changes

  • deployment-related

    • can now deploy app either as webstart app or as java applet (same target "jws-dist" will produce both a web page (index.html) that can be used to launch app as a webstart app and a web page (applet.html) for deploying app as an applet
    • webstart app is now configured to work with jnlp downloadservlet (war file bundles the necessary dependency)
    • a new ant target is available for producing a pack200-enabled webstart distribution.
  • ui-related

    • look and feel
    • substance (v5.1) is now the standard look and feel
    • edt bugfixes
    • ensured that ui respects swing.defaultlaft setting (to override look and feel if desired)
    • date picker and calendar minimonth view now use swingx jxmonthview
    • made dateeditor popup placement aware of screen edges (so it doesn't gets clipped by screen bounds)
    • css4swing
    • css bug fix: selector of type {component}.{cssclassname} now works
    • css implementation now supports gradients and rgba color specification
    • tweaked login panel look
    • various tweaks to default/template stylesheet
    • css styles "logged out" jdesktoppane with background image (centered)
    • added ability to set a different/custom delay time on msgpnl in enhdesktoppane
    • wrote a new type of stringeditor that translates a list of comma separated values in a single string into a multiple choice selector
    • integrated a contribution from michadraelian on mailing list: the ability to disable double-click -> default action on a type
    • trying to use mostly swingx containers so can be background-paintable: exploited by css implementation
    • added ability to specify/customize main tab caption in formview (per type)
    • added the notion of a type's default focus field
  • api

    • color coding can be done now per instance. useful in calendar context to, for example, distinguish various events by state
    • added utility method: isinwebstartmode on application
    • added support for per-instance metaproperty 'readOnly' on atomic types
    • added a basic money atomic type along with ability to persist and display/edit, along with a simple example in sympster.Symposium
  • persistence-related

    • fixed an issue with blob types and oracle
    • revised imgeo persistence strategy to encode image as png (not ideal but better than before) instead of image serialization which is extremely inefficient (100:1 ratio in blob size)
    • slight enhancement to hbmmaker: composite list table name specification is now explicit: uses full concatenated field name for better namespacing
  • fixes

    • fixed issue with logic testing whether two timespans overlap
    • fixed DateTime to support custom formatter and to allow for null/empty value
    • various bug fixes
  • libraries updated:

    • h2 jar (new version 20090403)
    • miglayout (updated to v3.7)
    • swingx (updated to v 0.96)
    • removed skinlf.jar
    • antlr runtime (used by css4swing) (updated to v3.1.1)
    • stringtemplate (design time) (upped to v3.2)
    • jexplose
  • other

    • continued updates/fixes/refinement of json-based object marshalling

a big thank you to the various members of the jmatter mailing list who have reported issues, contributed fixes, and enhancements to this release!

Oct 2 2008

Summary of Changes

  • Addressed memory leaks. app memory consumption should no longer grow with prolonged activity.
  • started working on AppBuilder: a jmatter application for constructing / generating jmatter applications

  • Supporting list reordering in the ui for relationallists marked @IdxFld(ordered=true)

  • Added an annotation attribute on relational lists @IdxFld(ownsChildren=true) which treats the relation as cascade=delete-orphan and disabled list item association from ui widget

  • Updated h2 database jar file to latest version (v20080926)

  • Removed hsqldb jar from repository

  • Minor ui layout improvements

  • Fixed a validation issue with a many-to-one association field
  • Made datetimeeditor fire change notification on focuslost
  • Integrated itemlistener on choiceradioeditor per michadraelian suggestion on mailing list
  • Various other bug fixes

Sept 2 2008

Summary of Changes


  1. No longer using jibx for marshalling xml. Any marshalling, such as the classbar template, or codes lists, are now described using JSON. Side effect: class-list.xml is now class-list.json

  2. The principal layout manager for the swing view mechanism is now MigLayout (replacing JGoodies Forms). The side effect is that JMatter now works both with left-to-right and right-to-left languages. As an example, the Sympster demo app has been localized for Hebrew. Try it out (launch the app with user.language=he).

Localization & Internationalization

  1. JMatter now works with non-latin character sets. Resource bundles can be input in utf-8 and translated to required iso-8859-1 via native2ascii tool (transparently through ant build file).

  2. Adding support for looking up localized field labels in a type hierarchy; e.g. in jmatter/app can specify keys such as AbstractComplexEobject.createdOn

  3. Automatically adding to uidefaults a resource bundle base name 'app/uidefaults'; see jmatter/resources/app/uidefaults_??.properties which will automatically be added to localize strings such as minimize, restore, maximize, etc.. (re: mailing list discussion thread w/kittipat)


  1. Added support for association qualification/constraints to to-many associations

  2. DateEO retrofitted to support/allow null value

  3. Improvement to base implementation of equals/hashcode

  4. Synchronizing access to list items across AbstractListEO type hierarchy

  5. Enhanced json-based marshalling; supporting the notion of a dereferencer for 'byref' marshalled objects

Database Access

  1. Integration with vjdbc to proxy database calls via http/tomcat (see file vjdbc/readme)

August 11 2008

Summary of Changes

  • improved authorization: ensuring that restricted commands for a session are not exposed to the ui; specifically issues with association views exposing 'new' command now fixed (issues reported by crownus on mailing list)
  • several localization-related improvements (thanks michalg for bringing these to my attention)


  • @Persist is replaced with JPA's @Entity; added support for @Table(name) annotation as well; also added (non-jpa) initial support for natural (instead of surrogate) primary keys
  • beginning integration of liquibase into jmatter to support migrations; added a number of ant targets pertaining to generating a changelog, diffing hibernate with db to produce a changelog, and executing a migration


  • added window button bar to user interface
  • improved simple calendar view layout manager to draw overlapping events side by side instead of on top of one another
  • added "maxlength" limit on textfield for fields with colsize spefications (per michalg request)


  • bug fixes


  • updated hibernate libs from v3.2.5 to v3.2.6
  • updated h2 database driver to version 20080714
  • updated jasperreports jar file from v2.04 to v3.0

Jun 27 2008

For a full list of svn log comments for this release, issue the following command against the jmatter svn repository:

    svn log -r {2008-04-10}:{2008-06-27} > svnlog


Main Changes

  • can now enable per-field custom [atomic] renderer/editor specification via file
  • added two new variant editors for boolean types
  • support for easy custom uis/layouts using abeille form designer (this replaces previous autolayout mechanism based on abeille; it didn't work very well; docs and examples to follow)
  • increased sophistication of json-based marshalling solution; can now marshal associations by reference (with the assumption that referenced item is accessible from database); and can specify a nested marshalling specification
  • improvements to validation on atomic types; validation errors, required fields now highlighted with custom background color
  • improvement to floateo (can set format on a per-field basis via annotation, like can for date fields);
  • improvement to implementation of floateditor;

  • integrated contribution from guizhong chen: an alternative/stable implementation of omniview/jtreeview for a model object

  • fixed bug in authorization system introduced in april release
  • defining optional spot for an app ( to programmatically initialize authorization on startup (first time)


  • improvement to algorithm for deriving concrete type maps; now recursing through superclasses (not just one level)
  • Field.readOnly is now a bound property; atomicview now supports dynamically changing field.readonly property;

model objects

  • renamed loggedevent property from 'type' to 'eventtype' so as not to potentially mask/clash with superclass property with same name
  • added command 'viewingooglemaps' to usaddress

bug fixes:

  • no longer restoring window bounds if was maximized
  • fixed issue whereby sometimes initial width of the classbar view (after login) would be incorrect; appear to clip some of the text/icons
  • fixed bug introduced when enhanced authorization with filters by not checking condition where a filter is not even defined
  • fixed a java 5 bug with action.mnemonic having to be the integer value of the upper case version of the character in question (file->exit by mnemonic now works)
  • fixed issue with disabled navigation keys on jmatter jlistviews in java5
  • ensuring that read-only views are not a part of the focus traversal
  • association views now abide by read-only setting/specification
  • fixed issue with restoring object state after a refresh
  • (deployment-related) fixed an issue with application loading in the context of a webstart-deployed appbrowser
  • fixed issue with validation of uri if blank
  • improved/corrected impl of hashcode() on base abstract complexeobject

minor, ui-related

  • revising fancylabel background painting to use a vertical gradient; used in calendaring; looks nicer
  • added a radioubuttongroup view for choiceeo's
  • improvements to float (numeric) editor
  • revising preferred/default appframe size to 1024x768
  • revised slightly appframe design to use a cardpanel for loggedin and loggedout states
  • Can now customize format for DateTime types, in addition to TimeEO and DateEO


  • lazy loading disabled icons in nullcomplexeobject (contribution: mikeH)
  • memory leak reduction work; mostly detaching commandadapter when view is detached

third-party libs

  • updated h2 jar to v20080621
  • updated smc (state machine compiler) to latest version (5.0.2)
  • updated formsrt.jar (abeille runtime)

Apr 9 2008



  • adding support for filtering lists as part of authorization policy; based on hibernate's query filtering support; using convention of defining typeFilter() method returning a string defining the condition for filtering; can be parameterized by variable 'currentUser' representing the primary key of the currently logged in user (no filtering done for admin role)

  • added support for a service object in the app (see example in contactmgr sample application) to expose commands in a toolbar

  • adding command.enabled transient property support

  • added ability to override naturalname for a type just like one can now for pluralname

  • added a little flexibility into json marshalling implementation: can specify a list of immediate child association fields to include in serialization (default is to not traverse associations)

ui enhancements

  • enhanced outlookfolderview's listviews to allow reordering of items in classbar
  • added visual hint for dnd drop in classbar
  • added ability to lock/unlock dnd editability of classbar from the ui

  • improved focus traversal behavior of associationview2 w.r.t. switching modes to an editable association

  • since msgpnl autodismisses after a few seconds, added a "messages" list view that can be referenced if necessary (can be opened from desktop context menu)

  • improved layout of calendar view - now fills vertically properly; also update row height on view resize; also supporting dblclick->defaultaction on caleventview; finally tweaked event span visual resizing to snap to row, though still needs work

  • usability enhancement: added shift-click gesture for dragging windows (internalframes)

  • minor: specifying custom icon for logout action

  • streamlined the icon resolution logic; also revised implementation so that default type icon is instance plural icon if there's one, otherwise falling back to instance icon

bug fixes

  • ensuring that authorization-restricted commands are not exposed in visual command interface

  • fixed issue with initial positioning of login dialog

  • appframe now properly adds 'unload app' cmd in file menu only in the context of an appbrowser-loaded application

  • fixed a timespan bug in setting startdate and enddate individually

  • adjusting logout/quit sequence of events to ensure that things happen in proper order; are serialized properly. i.e. saveuserdesktop happens off edt, and that appsession.setuser(null) takes place only after logout steps have finished

  • fixed a bug whereby upon login, hibernate would unnecessarily issue update statements to database to synchronize metadata enhancement: defining explicit typecommand so that static methods can optionally receive a reference to the type instance upon which the command was invoked

  • ensuring that editing of aggregates in the context of a parent form results in editing in place (no new window)

  • added basic implementation of method parseValue() for atomic type TimeSpan

  • improved pushstate/popstate implementation to extend to child aggregates. i.e. if a child aggregate has a custom set of states, and push into edit mode, when restore, the child aggregate state will properly restore to its former state instead of just to read state

  • improved implementation of setstartstate to properly recurse to children and use possibly child's designated start state

  • removed extraneous 'new' command on lists, added json import command on lists

  • trapping possible exception in attempting to display a map view (e.g. failing to resolve lat/lon for an address)

Mar 20 2008


  1. apple: fixing a number of macosx-specific issues; added macappbundle target to produce appbundles.

  2. calendaring: added ability to adjust event duration by dragging bottom border of caleventview

  3. reporting: adding jasperreports libraries to jmatter. enhancing sympster with a jasperreports example: producing a basic sessions schedule for a given symposium

  4. fixed some memory leaks. fixing memory leak in css4swing

  5. revising distro build file to include appbrowser specifically (inadvertantly omitted AppBrowser in previous distribution)

  6. adding animatingcardlayout project code to jmatter; making customreadview use flip animation (see sympster session custom view)

  7. retrofitted association editor to support association constraint specified either as a query constraint or supplied as a list of valid options. further specifying sympster session as belonging to a specific symposium instance; applying a list-based association constraint on session location (must be among list of rooms session.symposium.venue.rooms)

  8. major review of entire jmatter manual. new revision of manual with many edits, reorganization, and some new chapters.

Feb 21 2008

JMatter 2008-02-21 release notes

New Features:

  1. support for autologin: configuring an application so that no authentication is required.

    see documentation, ch12

  2. alternative deployment model: first release of the jmatter application browser.

    see documentation, ch17

  3. ability to contribute instances to visual command interface index.

    see documentation, ch19

  4. refactoring: separated model metadata and locale metadata into two parts: framework-specific entries, (which now live in resources/app) and application-specific entries.

  5. revised demo-app build files to compile with target jvm -1.5 (thanks to Corey Puffalt for catching this)

  6. updated default postgres jdbc driver to v8.3, updated mysql jdbc driver to v5.0.8, updated groovy binary to version 1.5.4

  7. revised image type database mapping for mysql. varbinary maps to tinyblob which is too small and longvarbinary does not work, so falling back to blob type.

  8. added two new chapters to the jmatter manual: on authentication and authorization, and on deployment using the application browser

Feb 11 2008

JMatter 2008-02-11 release notes

This release is a patch release that fixes these issues discovered in last week's release:

  1. a rendering issue with the login panel
  2. issue with persisting BigDecimalEO's
  3. a bug in minimizing a maximized internal frame (reported by alexcrown (thx))
  4. a classloader issue that manifested itself with a webstart-deployed app

Feb 4 2008

JMatter 2008-02 release notes

This release contains many small improvements and bug fixes. Below we list the main enhancements to JMatter in the Feb 2008 release (since the previous release from Aug 2007), in chronological order.

  1. JMatter Wizards Enhancements

    JMatter Wizards is a subframework within JMatter that removes the need to write the UI relating to a software wizard.

    This release introduces a number of additional ways to create wizards that further simplify matters. Examples are provided as part of the ContactMgr demo application; see the class PersonContact.

    JMatter now has a groovy builder for wizards. If you're familiar with some of the groovy language's other builders (swingbuilder, graphicsbuilder), then you probably already appreciate this feature.

    Written and Contributed by: Andres Almiray

  2. Introductory support for Geographical Maps

    Initially inspired by Andres' blog on adding google maps to JMatter apps, JMatter now provides basic integration with the swingx-ws project from

    This integration allows you to use geographical maps as a new means of viewing objects. Objects are displayed as markers on the map in question. The map is both zoomable and pannable, thanks to swingx-ws.

    For an example, run the ContactMgr sample application, open a contact, and right-click their physical address, and finally invoke the command: "View On Map" which will display the address in question on a map.

    A generic mechanism is provided for exposing types on a map. Part of this mechanism includes implementing the interface "MappableEO" in which an object formally exposes its lat/lon geographic position. The simplest way to integrate this feature with your types is to extend the base class: AbstractComplexMappableEObject which will automatically lend the command "View on Map" both on instances and on lists of the type in question.

  3. css4swing now supports complex selectors. i.e. selectors that imply matching a specific containment hierarchy. e.g.: #aboutPnl JTextArea will target all swing jtextareas (and their subclasses) that are descendants of the component with the identifier "aboutPnl". direct child relationship (>) is likewise supported.

  4. JMatter now supports a new atomic type: BigDecimalEO, backed by a Java BigDecimal, for arbitrary-precision decimal numbers.

    Written and Contributed by: Christian Gruber

  5. Added feature whereby type commands (static commands) can be given an application-level keyboard shortcut (accelerator); see example in ContactMgr where wizard can be invoked with the shortcut "control z"

  6. Added basic support for constrained associations. An example usage was added to the Sympster demo application. The model was extended such that a City type was added, as well as a Symposium City field. Also venue's now have a city field.

    When selecting a venu for a Symposium, the association now lists only venue options that match the symposium's city.

    To illustrate how this works, here's the implementation from Sympster:

    public Venue getVenue() { return venue; } public void setVenue(Venue venue) { Venue oldVenue = this.venue; this.venue = venue; firePropertyChange("venue", oldVenue, this.venue); } public QuerySpecification venueOptions() { if (venue == null || city == null) return null; Field cityField = venue.field("city"); FieldPath fp = new FieldPath(cityField.fullPath()); Inequality equals = new IdentityInequality(cityField).new Equals(); return new QuerySpecification(fp, equals, getCity()); }

    so by exposing a method with the right name "${associationname}Options()" the framework will use the returned query specification to construct the proper query to show the valid association options.

  7. Support for starting a JMatter project from an existing Database Schema

    Support for generating the JMatter source code and accompanying hibernate mapping files from an existing database schema.

    See section 16.1 of the JMatter manual: Reverse Engineering an Existing Schema for complete details.

    Written and Contributed by: Jim Slack

  8. List Commands

    JMatter now supports list commands. This feature is fully documented in the JMatter manual. See chapter 11 on commands and types of commands.

    List commands provides the means for improving the usability of a software application by making it easy to expose an instance command on an entire list of instances of a given type (or writing a custom command implementation for lists of a specified type).

    For example, if a type "Product" has a command "AugmentPriceByPercentage", the command can now easily be exposed on all lists of type Product, removing the tedium of having to perform multiple gestures on each of a number of instances in the user interface. The command can be invoked once and applied to all instances in the list (search results included).

  9. Visual Command Interface

    Over the past year, a new type of interface to a desktop has emerged. On macosx, many users are now using a visual command interface by the name of "QuickSilver." On linux a similar such feature is "Gnome Do." JMatter now sports the same sort of visual command interface.

    It is fully documented in the JMatter manual in Chapter 17 "The power user".

  10. Command icons

    JMatter now supports the ability to specify icons for commands through a new Cmd annotation attribute.

    Here's a simple ficticious example:

    @Cmd(iconref="money") public void AugmentPrice(CommandInfo cmdInfo) ...

    In the above command we specify a reference to an icon name. In your resources/images folder place a corresponding money32.png and money16.png (or gif), and you're done. Now throughout your application buttons and menu items containing the command to invoke will now be decorated with the specified icon.

    JMatter itself was updated to include many basic command icons out of the box for commands such as "find", "browse", "edit", "delete", etc..

  11. Preview implementation of the JMatter Application Browser

    We're in the process of developing an alternative deployment mechanism for JMatter applications. JMatter will soon be available as a standalone downloadable application with a standard multiplatform installer. The application will act as an application browser, allowing end users to dynamically load remote applications in a manner analogous to the way that a web browser downloads and runs remote web applications.

    There are several major benefits to this new deployment mechanism:

    • users will not have to install jmatter applications any longer, only the browser;
    • developers will be able to update their applications' at any time, without requiring clients to make any changes on their end;
    • application downloads will be relatively tiny: in the order of 50KB-500KB.

    The fundamental changes necessary to support this feature are already in the february release, though this feature is not yet complete.

    To try out this feature, follow these instructions:

    1. let's use sympster again as the example app
    2. revise' h2 database settings to specify a database with a fully qualified path:

      hibernate.connection.url=jdbc:h2:file:db/h2db becomes: hibernate.connection.url=jdbc:h2:file:///home/eitan/tmp/db/h2db (for example)

    3. revise sympster's build.xml "jar" target to exclude the jmatter base code

      i.e. this:

      becomes this:

    4. jar up sympster: ant clean jar you should end up with jws-dist/Sympster.jar at about 76KB

      also if the db doesn't exist yet, schema-export it

    5. go to the jmatter directory: Sympster$ cd ../../jmatter and invoke: ant run

    you'll be prompted for an app url. this was the url on my box:


    and click on 'Load App'. the application is url-classloaded. try this with an http-loaded jar file.


For a complete list of changes in this Feb 2008 release, invoke this command against subversion: svn log --revision {2007-08-09}:HEAD

August 09 2007 Release

  • class-list.xml default location moved from src/com/u2d/class-list.xml to src/class-list.xml, for consistency with other xml config files
  • updated default stylesheet styles.css (in project resources/ directory)
  • this release is the first implementation of jmatter that contains an implementation of authorization. by default, when a jmatter application starts up, the initial roles "Default" and "Admin" will be created, along with two users: admin/admin and johndoe/johndoe (a member of the default role). you'll also notice a new command on types: manage restrictions for type, whereby [as an administrator] you will be able to manage permissioning on both fields and commands. for an example on how to set permissioning programmatically, see
  • the login dialog was reimplemented as a JPanel (was a jinternalframe) and looks a little nicer
  • default icons for lists are now enhanced, customized as a composition of an icon representing a list, and one representing the list item type
  • the bundled css4swing jar has seen enhancements, with support for border-radius and opacity properties (css3) on swingx components.
  • also, not entirely related to jmatter, css4swing does a much better job now at dynamically restyling a ui (this feature is not used in jmatter) than before
  • added a new @Fld annotation attribute: colname() to override the field's corresponding database column name. this resolves an issue specific to mysql and the fact that the word 'sensitive' is reserved.
  • fixed some reported minor issues with the generated jnlp file for deployment to java web start
  • removed look and feel menu from application menubar. this didn't work well. will likely replace in the future with a list of alternate css-driven themes
  • updated h2 database jar file
  • updated swingx jar file
  • added a new ant target "seed-database" which can be used after a schema export to create base users and roles without launching the application
  • fixed a bug with "open in new tab/replace existing view" windowing navigation options (obtained when holding down shift while invoking a command) that manifested itself in java 6
  • defined the new keyboard shortcut ctrl-/ for opening focused comopnents context menu as an alternative to using the mouse
  • commands can now return a JComponent, which jmatter will wrap in a jinternalframe and display
  • there's now a second, much simpler way to use calendaring within your application without having to implement any interfaces. if a type has a field of type TimeSpan and if it extends CalEvent, the type command "Browse In Calendar" will automatically be exposed on the type in question.
  • added some integration with the abeille forms designer (see to allow for the customization of a form's layout. this feature relies on conventions. see description of this feature in more detail at:
  • applications now sport that standard about dialog, invoked via the menubar (help->about); likewise you can now easily link to your application's documentation through a url (specified in applicationContext.xml) and invoked via help->contents
  • class bar's functionality is now also exposed alternately through the menubar
  • updated jgoodies forms jar to version 1.1.0
  • added a new demo-app named "Self" that illustrates another way to plug in custom swing views into jmatter
  • fixed a bug where a read only association field could be dissociated
  • there's now an alternative set of build files written in gant (groovy-ant) though the default build file remains build.xml
  • calendar cell resolution can now be controlled using the scrollwheel, while holding down the ctrl key

June 13 2007 Release

I will be compiling the list of changes that have taken place in the framework within the next few weeks, and will be updating the manual to go with it.

This release includes css4swing which I find to be very nice, though there is a noticeable performance hit on the ui. Optimization of css4swing or perhaps turning off css inheritance can help this.

The subversion change log, then the mailing list, are good sources of information on what has changed recently.

April 2007

  1. Formally added field metadata property "hidden". Prior to this release the only way to set a field hidden was by programmatically calling field.setHidden(true). Now, can mark field hidden either as an annotation on field getter: @Fld(hidden=true) or using the new field string array static member "hidden": public static String[] hidden = {"secret", "secret2"};

  2. CSS: The JMatter swing gui is now css-enabled. The JMatter UI is now styled by the global stylesheet which you'll find in resources/styles.css. See the new chapter (14) in the manual for further details.

  3. The jmatter manual is now available in print (> 200 pages) from See for the link (or just search the web site for 'jmatter').

  4. Calendaring (Thanks to Mike Kienenberger) Mike Kienenberger contributed an enhancement to calendaring that allows you to customize the day view and week view bounds. i.e. from time, to time can now be customized and are no longer fixed to 7am-7pm), and start and end day of week can be changed as well.

    Eitan has made a major overhaul of the calendaring ui code. The views are now much more robust and strictly reflect their model objects. That is, making any changes to a CalEvent (time, date, other information, deleting or adding a calevent, is immediately reflected in any open calendar views.

    Another major enhancement to the calendar views: they now include a query panel for filtering calendar events through an ad-hoc query. This feature has been available on list views for a long while and is now available on calendar views. e.g. If you're looking at a calendar of talks for javaone, you can easily filter out from the view any talks not in a specific track.

  5. Localization (Thanks for Marco Meschieri) Marco Meschieri has contributed code that completely localizes all text used by jmatter applications. If you're updating an existing JMatter application, make sure to update you file. You'll also find a new for support of Italian, again thanks to Marco.

  6. Revised window resizing logic to never shrink the view (i.e. only resize if resulting window size is larger than existing window size)

  7. Fixed trac issue #122: enforce readOnly on association fields.

As always thanks to members of the community who've contributed answers on the mailing list, feedback, and bug reports.


Feb 27 2007

Changes in Beta 3 (since Feb 20)

  1. Added ability to focus on first item in classbar with 'alt-/' keyboard shortcut
  2. Minor cosmetic improvements to new-project-ui target
  3. Replaced message panel at bottom (status bar) with messages now appear as timed-dismissed translucent panels at the center of the desktop (styled with black background color, rounded corners, and large font for the text; feedback solicited)
  4. Updated swingx jar
  5. Updated hibernate to v3.2.2
  6. Commented out base commands "Export to .."
  7. Retired doc/Cliche; updated doc/README
  8. Fixed a bug in positioning event at proper time in calendar (forgot to set minutes)
  9. Added ability to localize file menu name and file->exit command name through locale-metadata bundle
  10. Fixed bug in ant task that manifests itself in v1.7 (Thanks to Joan Pujol for finding this bug)
  11. Slight revisions to documentation: print improvements; merged two chapters.


Feb 20 2007

Changes in Beta 2 (since Feb 2)

  1. Complete overhaul of the existing documentation, and addition of new chapters to round out / complete the manual. All documentation consolidated into JMatter manual.

  2. Fixed bug # 119: supporting specification of Date format and Time format application-wide. (requested on mailing list)

  3. SaveAndClose() logs activity just like Save() action does. (reported by Justin on mailing list)

  4. Revised new Swing-based component (GridListView) to work with both Java5 and Java6 (Issue with Java SE moving SwingUtilities2 to another package). (reported by Curt Cox on mailing list)

  5. Fixed an incorrect build dependency in in standalone build file (build-standalone.xml) (reported by dmcpaul on mailing list)

  6. new-project-ui target now uses the ant api directly instead of forking a process

  7. Internally replacing usage of Velocity with StringTemplate

  8. Adding keyboard focus and navigation abilities to classbar items

  9. Renamed @Cmd parameter isSensitive to 'sensitive'

  10. Switched to using an enumeration for appeventtypes; documented appevents in manual

  11. Fixed a bug having to do with incorrect redrawing of aggregated object views on initial save (reported by Justin on mailing list).


Feb 2 2007

Changes (since August 25 2006 release)

A. Features / Enhancements

  • Major enhancement to navigation: ability to open views either in new windows, in a separate tab, or in place (replacing current view); ui gesture/mechanism: hold down SHIFT while invoking a command, will prompt you how to open new view. Complete details at:

  • Icon inference logic is improved to be inheritance-aware. For example, if class Bus extends Vehicle and does not provide a corresponding Bus32.png icon, JMatter will fall back the Vehicle icon. More complete documentation of icon inference is available at:

  • When creating a new instance or editing an existing one, Form views now auto-focus on first text component, so that the end-user is not required to use the mouse or to tab before data entry.

  • List Views, when in a separate tab are now default-expanded.

  • Added ability to do a "vacant drop" on items in the classbar; that is, to remove items from the classbar by simply dragging them out of the classbar and dropping them onto an empty area in the desktoppane (can similarly add types or instances to the class bar with dnd by dropping them in)

  • JMatter now defines by default two roles: an administrative role and a new "Default" role. When creating new users, their role defaults to that "Default" role.

  • JMatter tested with H2 database. Also, H2 is now default database when creating new projects (instead of hsqldb). Jar included with distribution.

  • Added a long overdue atomic type: ColorEO. ColorEO is already being used in conjunction with calendaring. When dealing with calendars that have multiple schedules, Schedulable model objects now can define a ColorEO field representing the schedule's color code, which is now used by the calendar views to distinguish schedules.

  • Added annotation attribute "format" for fields of type DateEO and TimeEO which overrides and controls both the display and parsing format used by JMatter for the field in question. Format is specified using the SimpleDateFormat notation. See example in MyTunes demo application, where Song durations are now displayed in a custom format.

  • The JMatter class-bar is now per-user. That is, the class bar can be customized / different for each user. For example, in a multi-user application with users who have different roles.

  • Added ability to specify that a field should not be persisted via a @Fld annotation attribute "persist=false". This is useful when working with derived/calculated fields. See ticket #105 in the jmatter trac.

  • In a fashion similar to how url types can be clicked on and open in the default web browser: added integration with default Mail application. New model object EmailMessage and enhanced Person object with an action to send them an email. Action opens OS's default mail app's composition window and automatically fills person's email address field.

  • Enhancement of Icon List View (this is one of the alternate views for lists). Previous version didn't support item-level focus, selectability, and keyboard navigation like JList-based views did. Now it does.

  • JMatter has a new target "new-project-ui" which somewhat supercedes "new-project." Can now create a new child project usinga GUI front end. New option: projects can now be created either as standalone (frozen) (i.e. including all the libraries it depends on), or as dependent (one that references the jmatter project's codebase and libraries).

  • The styles of captions for required fields and for validation-related messages in the user interface is now specified via css (see the file "resources/styles.css" in child projects). Currently supporting a very few set of properties (font-related, color-related). Implementation of a more complete solution for using css to style swing will likely accompany a future release.

  • Alternative to jibx for unmarshalling data for prepopulating lists: json. mytunes demo app was retrofitted to use the json format for uploading genres

  • Localization. jmatter apps can now be localized! a warm thanks goes out to Felix Torre

  • Ultraviolet tool (not source) is now integrated into jmatter. don't have to set the jmatter base directory.

B. Refactorings

  • JMatter now internally uses the spring framework. Spring's ioc capabilities have helped streamline and simplify JMatter applications' startup code. Some earlier reliance on Jibx to unmarshal configuration information (such as app-config.xml) has now been replaced with Spring and its applicationContext.xml files.

  • Restructured how JMatter applications start up and are launched to accomodate web deployments / three-tier architectures.

  • Swing view mechanism has now been completely modularized. Used to exist as part of the JMatter core project. Now a separate project, built separately and included as a jar.

C. Conventions

  • @CommandAt annotations have been renamed to @Cmd
  • Similarly, @ParamAt becomes @Arg, and @FieldAt becomes @Fld Can now specify tooltip for Fld or Cmd via attribute "description." Beside mnemonic, can now also override label.

  • app-config.xml replaced by spring persistClasses.xml

  • Added convenience where instead of having to manually edit persistClasses.xml, now can simply tag persisted model types with a @Persist annotation (jmatter will do the rest). JMatter uses velocity to dynamically produce persistClasses.xml. In the long term, JMatter will attempt to move to using JPA annotations.

D. Libraries

  • Updated Hibernate jars from v3.1 to v3.2

  • Updated l2fprod commons library with 11.2006 version; also using outlookbar-only jar which is smaller as i'm not using any of the other components at this time

  • Removed flexdock jars which were not being used

  • Got rid or/removed JDNC libraries. Project is now defunct, or carried over through/to SwingX.

  • Added SwingX libraries. Beginning to think about how to leverage this work to improve the look/feel/behaviour of JMatter applications.

  • Minor: renamed lib/src directory to more apt lib/runtime

E. Miscellaneous

  • Meta types are now persisted as entities. As a prelude to supporting applying authorization rules and persisting them

  • I have been updating ultraviolet/umlc and keeping it in sync with JMatter changes.

  • Both the JMatter ant build file (build.xml) and generated jmatter project build files have been significantly cleaned up, streamlined, updated

  • The IntelliJ IDEA support for JMatter (in terms of templates and live templates) is now included with the distribution

  • Source distribution now includes a prebuilt jmatter.jar (binary)

  • Improved the MyTunes demo. mp3's are now streamed. Achieved by using the underlying jlayer library directly, and not as a service provider interface for the java sound api.

  • Removed deleted and deletedOn fields; these fields are not used for the moment.

  • JMatter includes two new modules: one for a web-based view mechanism based on the WingS framework, which may be considered an early alpha implementation. The other based on NextApp's Echo2 which mostly has yet to be written (currently implements a quick and dirty AppFrame, LoginDialog, and ClassBar).

  • JMatter tries to be smart about which jdbc driver to include when producing a distribution, so as to keep the distribution lean.

  • All demo apps have been updated/synched with framework changes

F. Bug Fixes

  • Actually tested JMatter with Oracle Express and fixed a persistence issue which prevented JMatter from working with oracle databases.

  • Fixes to bugs documented on the JMatter trac: (this list is not a complete list of bugs resolved on the JMatter trac; many others have been resolved/closed but may not have required active code changes, or were resolved as a side effect of an enhancement or another fix. see the jmatter trac at for complete reports).

r265 | eitan | 2006-12-13 18:29:53 -0600 (Wed, 13 Dec 2006) | 1 line

added validation to compositequery, as noted in trac issue # 66

r271 | eitan | 2006-12-14 15:47:47 -0600 (Thu, 14 Dec 2006) | 1 line

fixed trac bug #82: persisting choices in the context of a saved query

r274 | eitan | 2006-12-15 10:49:20 -0600 (Fri, 15 Dec 2006) | 1 line

added ability to specify that a field should not be persisted via a field annotation persist=false; related to ticket #105

r275 | eitan | 2006-12-18 11:59:07 -0600 (Mon, 18 Dec 2006) | 1 line

fixed trac bug #106: save and close in tabbed mode should close tab, not window

r300 | eitan | 2007-01-02 13:27:24 -0600 (Tue, 02 Jan 2007) | 1 line

fixed bug #111: bug in binding for text areas

r324 | eitan | 2007-01-09 10:03:36 -0600 (Tue, 09 Jan 2007) | 1 line

implemented issue #28 (see trac): desire for system to prompt on New which subtype to create, not only for abstract base types, but also for concrete base types

r333 | eitan | 2007-01-10 11:16:53 -0600 (Wed, 10 Jan 2007) | 1 line

fixed bug #62: exception when trying to bring up a calendar view for an object that has no schedulables

r336 | eitan | 2007-01-10 17:46:01 -0600 (Wed, 10 Jan 2007) | 1 line

fixed ticket #114; see comments in ticket; having to do with supporting command overriding in gui: not showing duplicate commands with the same name on a type; feature will likely need more work at a future time

r337 | eitan | 2007-01-10 18:05:08 -0600 (Wed, 10 Jan 2007) | 1 line

fixed issue #76: remove command Type.New(): produces an exception; gui is not for creating new types anyway

r343 | eitan | 2007-01-11 11:15:35 -0600 (Thu, 11 Jan 2007) | 1 line

fixed bug #64: incorrect calculation of event position on calendar for events whose times are on or beyond the bounds of displayed sheet (early morning, late evening)

r358 | eitan | 2007-01-16 21:23:20 -0600 (Tue, 16 Jan 2007) | 1 line

fixed bug #68: jcombobox model should reflect list changes immediately

r361 | eitan | 2007-01-23 10:03:51 -0600 (Tue, 23 Jan 2007) | 1 line

fixed two issues: [a] issue #55: lists allowing adding duplicates; [b] a bug in dissociating in a bidirectional many-many situation

r362 | eitan | 2007-01-23 10:50:21 -0600 (Tue, 23 Jan 2007) | 1 line

looked at issue #53: displaying list editing buttons (+/-) only in editable state; implemented it and worked with it a bit before deciding that enabling these buttons in read state is preferable (left implementation commented out in code (see

r367 | eitan | 2007-01-23 11:52:14 -0600 (Tue, 23 Jan 2007) | 1 line

a small, first step in the direction of providing a separate place for styling various parts of a jmatter/swing application; doing this in the context of issue #45: providing a way for customizing required field caption styling without 'digging into the codebase'

r369 | eitan | 2007-01-30 15:14:13 -0600 (Tue, 30 Jan 2007) | 1 line

adding first rough implementation of css interpreter for swing; default stylesheet is in resources/styles.css; currently used only to style required captions on forms, to address bug # 45; will be expanded to provide full styling support using css in jmatter (stay tuned)

r374 | eitan | 2007-02-01 14:48:07 -0600 (Thu, 01 Feb 2007) | 1 line

fixed bug #70: making associationviews aware of their associated item's lifecycle (i.e. when they get deleted) so can auto-sever association if in edit mode

r375 | eitan | 2007-02-01 15:16:46 -0600 (Thu, 01 Feb 2007) | 1 line

fixed bug#60: repeatedly clicking on save (when vetoed) can cause multiple concurrent calls to hibernate which of course is not good

r377 | eitan | 2007-02-01 18:02:33 -0600 (Thu, 01 Feb 2007) | 1 line

fixed bug#117: ensuring classbar folder and items order is correct and consistent

  • For a complete change log since the last (August 25 2006) release, issue this command:

    svn log -r176:HEAD

Eitan Suez Feb 2 2007


JMatter release v20060825

Summary of Bug Fixes, Enhancements

To find out further details about each item below, simply lookup the issue in trac at


Issue #33: Fixed a problem with the redrawing of the login dialog that would sometimes occur when attempting to authenticate


Issue #1: Fix an issue where events shown on the calendar did not have appropriate minimum bounds. Widget's height was a strict function of the event's duration. So that a 5-minute event on a 30-minute resolution grid would draw ridiculously thin.


  • PDF documentation search now works

Issue #27: Posted Javadocs online (see

i18n and l12n

Issue #15: FloatEO's parse() method was not friendly to, say, numbers displayed with different localization. e.g. French 1.500,23

Issue #20: Fixed a character encoding issue in unmarshalling app-config.xml


Issue #22: Added ability to customize field caption. Caption is usually derived from introspection of the bean property. Now can specify in annotation an overriding caption

Issue #23: Added ability to specify in annotation desired custom field length, both from display and persistence perspectives.


Issue #2: JMatter now supports hsqldb and defaults to hsqldb Issue #5: Persistence with MySQL works Issue #11: Revised boolean types to bind to a bit type instead of char, which for some reason was a problem for oracle. Issue #10: Added optimistic locking support. Base type (AbstractComplexEObject) now has a version property, passed on to hibernate for optimistic locking. When stale object exceptions are thrown, the ui properly catches the exception and posts a validation message.

Swing GUI

Issue #24: Fixed a bug which prohibited the specification of a list type in a separate tab view.


Issue #26: Integrated Ryan Ramage's first umlc prototype for jmatter.


A discrepancy existed between the build file in the binary distribution and the one in the source distribution. Specifically, in regards to the target "new-project" there was confusion whether where the new project base directory resided. This distribution tries to rectify this. The default directory where the project is placed is next to (as a sibling of) the jmatter/ directory.

The project is standalone (it contains all the jars it needs) and so can later be moved to any other location on one's disk.