Latest Posts

Archives [+]

Entries by Michael Marth

    Posted by Michael Marth JUL 16, 2010

    Add comment

    The current board of directors of the Apache Software Foundation has just been elected - congratulations to:

    • Shane Curcuru
    • Doug Cutting
    • Bertrand Delacretaz
    • Roy T. Fielding
    • Jim Jagielski
    • Sam Ruby
    • Noirin Shirley
    • Greg Stein
    • Henri Yandell

    Roy and Bertrand are colleagues of mine at Day Software.

    To find out more about what the board actually does have a look at "How the ASF works".

    Posted by Michael Marth JUL 02, 2010

    Comment 1

    One particular strength of Java Content Repositories is that they provide so much infrastructure for developing content centric applications. Today, I discovered another hidden gem in JCR2 (JSR-283) that can come in very handy for app development:

    In JCR1 the class ObservationManager used to manage EventListeners that get triggered immediately when an event like a property change occurs. Starting from JCR2 the ObservationManager also provides an EventJournal for each node that can be retrieved without having to register a listener first. The EventJournal is a list of events, e.g. addition, moves or removal(!) of child nodes, complete with user id and timestamp.

    Attached to this post is a little CRX package with a servlet that renders the events for a given node. The relevant lines are:

    ObservationManager om = session.getWorkspace().getObservationManager();
    EventJournal eventJournal = om.getEventJournal(
        Event.NODE_ADDED | Event.NODE_MOVED | Event.NODE_REMOVED  | Event.PROPERTY_CHANGED
        | Event.PROPERTY_REMOVED | Event.PROPERTY_ADDED, path, false, null, null);

    Install the package and point your browser to http://localhost:7402/apps/eventy.html?path=/content (the path parameter specifies the node you are interested in). You should see a list of entries like:

    Event: Path: /content/n3, NodeAdded: , UserId: admin, Timestamp: 1272975189833, UserData: null, Info: {}
    Event: Path: /content/n3, NodeRemoved: , UserId: admin, Timestamp: 1272975212725, UserData: null, Info: {}
    ...

    And from the Javadoc:

    Events returned in the EventJournal instance will be filtered according to [...] the current session's access restrictions

    I am delighted.

    * eventjournal-1.0.zip
    CRX package: sample for EventJournal

    Posted by Michael Marth JUN 21, 2010

    Comments 5

    Day's collection of screencasts is now available as HTML5 video, i.e. using the <video> tag instead of a Flash player (and Flash only as a fallback). The videos have been converted to mp4 and ogg. The semantics of the <video> tag allow for different renditions to be offered to the client which can then choose an appropriate one.

    Check out the screencast Web Application Development with CRX or the CQ5 introduction. You will need a non-IE browser, like:

    • Mozilla Firefox 3.6+ (ogg in HTML5 inline)
    • Apple iPhone 3+ (mp4 low-res in HTML5 fullscreen)
    • Apple iPad (mp4 in HTML5 inline & fullscreen)
    • Apple Safari 4+ (mp4 in HTML5 inline & fullscreen)
    • Google Chrome 5+ (mp4 in HTML5 inline)
    • Google Android 2.1+ (mp4 low-res in device player)
    • Opera 10.5+ (ogg in HTML5 inline)

    (Microsoft IE 6+ uses the Flash fallback)

    Thanks to Cédric Hüsler and Gabriel Walt (see them below testing on their pet devices) for making this possible ;-)

    file

    Posted by Michael Marth JUN 10, 2010

    Add comment

    Last week I have uploaded a Twitter clone application to Day's Package Share. The application's content package not only contains some sample content and the jsp files with the application code. It also includes sample users and their respective access rights on different JCR nodes. Putting all this information in one content package is possible (and even simple) because users, ACLs etc are stored in the content repository as JCR nodes.

    The experience of putting together this package nicely reminded me of the power of the concept of storing all of a a web application's artefacts in the content repository - which can be considered the technical implementation of Day's mantra "everything is content".

    Classically, the image of web content management systems one has in mind looks something like this:

    file

    Content is the input and a web page is the end result of some rendering process. There is nothing wrong with that image, but considering "everything is content" an alternative prototypical image of a CMS came to my mind:

    file

    A web content management system's repository is the place to store and manage all aspects that make up your web site. The web page is not only the end result, but also the source.

    Posted by Michael Marth MAY 28, 2010

    Add comment

    At this week's IKS meeting at Paderborn the second FISE Hackathon took place. FISE is an open source semantic engine that provides semantic annotation algorithms like semantic lifting. The actual annotation algorithms are pluggable through OSGi. Existing CMSs can integrate the engine through an HTTP interface (inspired from Solr). Last week, Bertrand gave an introductory talk about FISE that is available online.

    There was no explicitly set goal for the second Hackathon. Rather, the existing code base was extended in various different directions. Some examples:

    • a language detection enhancement engine (I am particularly glad to see this - automatic language detection in CMSs is a pet passion of mine)
    • a UI for FISE users that allows humans to resolve ambiguities
    • myself, I coded a JCR-based storage engine for the content and annotations

    There was also a good amount of work done on the annotation structure used by FISE and documented on the IKS wiki.

    A complete report of the Hackathon is available on the IKS wiki (the only thing it fails to mention: the event's good spirit).

    One major non-code step was to get many participants up to speed with the FISE engine and enable them to deploy the engine as well as get accustomed with the architecture and code base.

    It was only last week that I took a deeper look into FISE. I like its architecture a lot. The HTTP interface makes it easy to play with FISE as well as integrate it. Even more important, the pluggable archirecture that is mostly inherited from the OSGi services architecture makes FISE very flexible and extensible. This is particularly important given the different natures of the enhancement engines that we want to be able to deploy (hosted services, proprietary, open source, etc). I consider FISE to be a particularly well suited use case for OSGi.