• Home
  • About
  • Sample Apps
  • Does Swiss IT Matter?

    October 6th, 2008

    A few days ago I attended a conference on Swiss IT. This conference was one in a series of events on the occasion of the year of computer science in Switzerland. The conference focused on the perspectives of the Swiss IT market.
    The first presentation was given by Stephan Hug, CTO of Credit Suisse Private Banking & Switzerland. He explained how Credit Suisse is migrating from PL/1 to Java and at the same time from the mainframe to a distributed environment in the back end. They have quite some challenges to tackle, especially in decoupling all the subsystems. A decentralized environment is inherently less reliable than the mainframe and decoupling is the most important measure to increase reliability. This presentation both interesting and a pretty good PR stunt to attract new talent to Credit Suisse.
    The next talk was about the transformation of a service company into a product company. Working for Canoo which is both a service and product company I have first hand experience of the challenges of a product company. It is common place that product development is tough and takes always longer than expected. Overall the talk was more on the entertainment side than it conveyed valuable information and I certainly missed the importance of marketing in his talk.
    The most interesting talk, at least from a Canoo perspective, was Claude Honegger’s “Integrated human resources management in the IT division of a global financial services company”. Claude Honegger is the CIO of Credit Suisse Switzerland. Credit Suisse IT has been agressively offshoring in the last few years which had quite some impact on Swiss IT service companies. They will continue with this strategy albeit they had to realize that not all IT projects are equally suited for offshoring. At the same time his division has more than 200 open positions. Nevertheless, they intend to replace external contractors by internal personnel as far as possible. At the same time they are cutting the rates for external contractors by 10%. It will be interesting to see how they can fill their vacant positions while at the same time deterring external contractors and singing the praises of offshoring.
    The remaining talks mostly dealt with economic aspects of the Swiss IT market: The economic climate will definitely turn colder in the future (a recession is not expected, though), IT salaries will continue to rise, albeit slower than in the past and government promotion of IT education has basically failed. One of the presenters urged to rely more on career changers then university graduates in IT.
    The conference was concluded by a panel hosted by one of the most well known Swiss TV hosts, Stephan Klapproth. The panel was quite entertaining but the panelists were too much of the same opinion. All agreed that Swiss IT still matters and that there are still many job opportunities despite a tendency to offshore near and far.
    What’s my conclusion and how can Swiss IT companies (esp. smaller ones) survive? We have to be highly flexible and close to our customers. Social skills, which IT workers are generally not attributed with, are decisive for being close to our customers. Education and experience are more important than ever. I don’t see how career changers can fill this gap, hence we still have to rely on university graduates. Last but not least we should promote Swiss quality not only in chocolate or watches but also in IT. Combined with positive thinking which is not a basic Swiss property I am convinced that Swiss IT is still highly competitive.


    Presentation Model Framework

    September 19th, 2008

    In the previous chapter we looked at the implementation of a non-trivial application composed of several application components. If you had a closer look at the code fragments in chapter 3 you probably realized that even for a simple application component quite some boiler plate code was required to make it work. The presentation model contains infrastructure code that takes care of property listener handling, e.g. registering property change listeners and distributing property changes to listeners. It also has to delegate most property requests to the business object. These tasks can easily be extracted into a base class and handled generically.
    In addition, the base class can provide infrastructure such as:

    • Creation, proper initialization, and management of a hierarchy of application components: the root application component is responsible for property change listener management, i. e. all sub-application components delegate to the root application component rather than managing this all over the hierarchy, which simpifies debugging a lot.
    • Breaking cycles: the execution of a property change listener should not trigger (directly or indirectly) the same property change listener.
    • Undo/Redo support: The presentation model is a Java bean and all state transitions are performed by property changes. Hence, undo/redo support is really easy to implement on a generic basis. The abstract presentation model just records all property changes and can undo or redo them on request.

    This leads to a simple presentation model framework with only a few hundred lines of code. It is independent of any widget library, although the current implementation includes configurable table and tree models based on the ULC widget library. They should be easily replaceable by model implementations of some other component library.

    The view code is even more cumbersome. Despite being pretty straightforward way too many lines of code are needed for implementing the view. How can this be simplified?

    • Creating the layout can be accomplished by using either a declarative or programmatic approach. For the declarative approach one would need some XML schema for defining the components and layout of the user interface. At run-time, an interpreter creates the UI based on the XML description. The programmatic approach requires at least a layout class which is tailored to form-based user interfaces. Examples are JGoodies Forms or the new form infrastructure in UltraLightClient ‘08.
    • Connecting the widgets to the presentation model and vice versa can be vastly simplified by utilizing some binding infrastructure. We will talk about binding in the next chapter.
    • The remaining tasks are easy to implement and require little code: proper initialization of the view (most initializations are triggered by the presentation model anyway), forwarding events to the presentation model that are not yet taken care of by the binding infrastructure (e.g. button actions), and reacting to changes in the presentation model (e.g. enabling/disabling portions of the user interface accordingly).

    Now lets have a look at the code for the example from chapter 3. For the programmatic layout of the form I used a simple form layout class.

    The core code for the presentation model looks almost like the example given in chapter 3 (boiled down to three model properties for the sake of simplicity). Thanks to the presentation model framework, the number of lines of code is cut almost in half (now less than 150 lines of code incl. comments and blank lines).

    public class SimpleFormPresentationModel extends AbstractPresentationModel {
        private Person fPerson;
        private ErrorList fErrorList;
     
        public final static String PERSON_NAME = "person.name";
        public final static String PERSON_FIRST_NAME = "person.firstName";
        public final static String ERROR_LIST = "errorList";
     
        private final static String[] PREFIXES = {"PERSON", "UNIVERSITY"};
     
        public SimpleFormPresentationModel() {
            fHasChangedEnabler = new ULCHasChangedEnabler();
        }
     
        public void basicInit() {
            fErrorList = new ErrorList();
            fireAllPropertiesChanged(PREFIXES);
            addPropertyChangeListener(this, getAllPropertyNames(PREFIXES));
            super.basicInit();
        }
     
        public void update(String propertyName, Object oldValue, Object newValue) {
            if (propertyName.equals(PERSON_FIRST_NAME)) {
                validatePerson(PERSON_FIRST_NAME);
                firePropertyChanged(PERSON_NAME, getPersonName(getPerson()));
            }
        }
     
        public Person getPerson() {
            return fPerson;
        }
     
        protected void setPerson(Person person) {
            fPerson = person;
            fireAllPropertiesChanged(PREFIXES);
            fHasChangedEnabler.reset();
            setFocusToProperty(PERSON_FIRST_NAME);
        }
     
        public String getPersonName(Person person) {
            return person != null ? person.getFirstName() + " " + person.getLastName() : "";
        }
    }

    Some functionality is based on conventions which can be customized by overriding the appropriate methods. Properties are “exported” by declaring the path as a string constant, e.g. PERSON_NAME. The business object is referenced by an instance variable. The prefixes of the property constant names are kept in the string array PREFIXES. This way, properties can easily be retrieved by reflection. This is used to fire property change events or register event listeners for all properties.

    Theview class is also reduced to half the lines of code. This is mainly due to the form layout class and the binding infrastructure.

    public class SimpleFormPane implements IPropertyChangeListener {
        private FormLayout fFormLayout;
        private ULCBoxPane fFormPane;
        private ULCTextField fName;
        private ULCTextField fFirstName;
        private SimpleFormPresentationModel fFormPresentationModel;
        private Binding fBinding;
        private Color fErrorColor = new Color(255, 0, 0, 192);
     
        public SimpleFormPane(SimpleFormPresentationModel formPresentationModel) {
            fFormPresentationModel = formPresentationModel;
        }
     
        public ULCComponent getPane() {
            if (fFormLayout == null) {
                createForm();
                fBinding = new Binding(fFormPresentationModel);
                fBinding.bindText(PERSON_NAME, fName);
                fBinding.bindText(PERSON_FIRST_NAME, fFirstName);
            }
            return fFormPane;
        }
     
        private ULCBoxPane createForm() {
            if (fFormLayout == null) {
                fFormLayout = new FormLayout(FormLayout.NULL_RESOURCE_RESOLVER, "PersonForm");
                fName = new ULCTextField(20);
                fFirstName = new ULCTextField(20);
                fFormLayout.addComponent("Name", PERSON_NAME, "Name:", fName, true, "1EE");
                fFormLayout.addComponent("FirstName", PERSON_FIRST_NAME, "First Name:", fFirstName, "1EE");
                fFormPane = new ULCBoxPane(true);
                fFormPane.add("et", fFormLayout.getPane());
            }
            return fFormPane;
        }
     
        public void update(String property, Object oldValue, Object newValue) {
           if (property.equals(LOADED)) {
                fFirstName.requestFocus();
                fLoadButton.setEnabled(!(Boolean)newValue);
            } else if (property.equals(FOCUS)) {
                ULCComponent component = fFormLayout.getComponent((String)newValue);
                if (component != null) {
                    component.requestFocus();
                }
            } else if (property.equals(ERROR_LIST)) {
                ErrorList errorList = (ErrorList)newValue;
                for (at.diefaehre.argo.util.validation.Error error : errorList) {
                    ULCComponent component = fFormLayout.getComponent(error.getProperty());
                    if (component != null) {
                        if (error.isError()) {
                            component.setBackground(fErrorColor);
                        } else {
                            component.setBackground(Color.white);
                        }
                    }
                }
                setFocusToFirstError(errorList);
            }
        }
     
        private void setFocusToFirstError(ErrorList errorList) {
            if (errorList.hasErrors()) {
                for (String field : new String[]{PERSON_FIRST_NAME, PERSON_LAST_NAME, PERSON_UNIVERSITY_ID}) {
                    if (errorList.containsError(field)) {
                        ULCComponent component = fFormLayout.getComponent(field);
                        if (component != null) {
                            component.requestFocus();
                            break;
                        }
                    }
                }
            }
        }
    }

    Now, what does it take to add undo/redo to this example? As mentioned before, the abstract base class for the presentation model already contains generic undo/redo support. All we have to do is offering undo or redo in the user interface. I simply had to add two additional buttons for that, which call undo resp. redo on the presentation model. In addition, the view has to enable or disable the undo/redo buttons if undo/redo is possible or not. The abstract presentation model triggers this event conveniently. The extensions to the presentation model are minimal. It has to reset undo/redo when loading or saving the business object and it sets the focus in the view to the component which was affected by undo/redo.

    How does the presentation model fit into an application which needs to render live data. Actually, the presentation model can also handle this scenario quite nicely. There is only one issue to consider. The data feed can be considered as yet another model which the presentation model can subscribe to. Thereby the presentation model is notified about any relevant model changes. However, these model events most likely occur outside of the UI event thread (e.g. posted by some server) and therefore they cannot be processed synchronously by the presentation model which runs in the UI event thread. The solution is quite simple. The presentation model stores these events in a queue which is processed prior to the next event that occurs in the event thread, i.e. the next event that is going to be processed synchronously. While processing the asynchronous model events the undo/redo recording has to be temporarily suspended since these events are not created by the user and therefore undo/redo is pointless.

    The presentation model framework is available Presentation Model Framework. It solves many design issues in rich user interfaces and also helps developers to focus on implementing cool and ergonomic user interfaces rather than dealing with design and infrastructure issues. The framework is also independent of the user interface component library. The only exception are the table and tree model adapter classes which are specific to the ULC component library. It should be pretty simple to replace them with an implementation for the user interface component library of your own liking. Also included in the download are a number of examples which demonstrate how to use the presentation model framework. These examples were implemented with the ULC component library. In order to compile and run them you also need to download the ULC component library. You can get a free evaluation license for ULC here. Additionally, the examples need some infrastructure code (e.g. binding, form layout and validation support) which comes with the download. This infrastructure code has been extracted from a larger project and stripped down to minimize dependencies. Hence, they do not really serve as an example.

    In the last chapter we will have a look at additional infrastructure which even more simplifies implementing rich user interfaces.


    Save Time and Money (Part 3)

    September 19th, 2008

    In this blog post series, I am revisiting some of the arguments in favor of a Java-based RIA library such as UltraLightClient. Please leave a comment and share your views. See Part 1 and Part 2.

    Why ULC (Part 3)

    I’ll spare you the typical marketing speak about how we believe Canoo’s UltraLightClient will save you real money in terms of time for development and maintenance. Instead I’ll quote from an email that we received from one of our North American customers.

    This development team decided to replace JSF by UltraLightClient halfway through the project. Despite this major change, the project deadline was not extended. Nevertheless, the team managed to deliver in time. Here’s what the Project Lead for Web and User Interface Development had to say on UltraLightClient:

    1. JUnit testing With JSF, unit testing of the interface required much contortion and difficulty in order to make sure the html interface was rendering the correct html. With ULC and Jemmy, the process is as easy as naming the widget and testing its behavior or content. This made for not only easier testing, but far more and far better test cases as the developers had more times and better ease of implementation.
    2. Extremely easy communication with the model. Eliminating the deployment descriptors of JSF, we could interact with the model by actually accessing attributes and calling methods directly on the actual objects. This eliminated the continual transformation between objects and beans, etc that JSF requires. I realize a lot of this can be facilitated with tools, but it seemed even better just to eliminate this needless transformation. Also, the performance was far better with this direct access to the model.
    3. Deploying locally. This is the holy grail of ULC. The fact that I can hit in Eclipse and see exactly what I am working with, or even better, put a break point in the test case and play with the specific part of the interface from there without having to deploy the application! WOW! This reduces developer time by hours per day.
    4. Rich functionality of ULC widgets. This may seem like just a perk to the interface but it is a development issue as well. The fact that the widgets are so feature rich allows the developer to spend less time trying to simulate rich features in DHTML or JavaScript and more time actually realizing the requirements of the application.

    I believe these 4 points are the most important benefits we realized in developing in ULC. (…) We built a full fledged loan renewal system interface in 5 months (4-6 developers). This would have been impossible without the development ease of ULC.

    Other corporate customers say similar things

    Please feel free to contact the ULC sales team and ask for further references.

    Further links:
    Pricing
    Case Studies


    Canoo Code Camp: September 08 Edition

    September 12th, 2008

    Some photos from the Canoo Code Camp, currently taking place somewhere in the Swiss Alps, are appearing in our Flickr stream:

    08_09_Canoo_Codecamp 032

    08_09_Canoo_Codecamp 028

    The Code Camp is an internal event where Canoo developers take some time to evaluate new technologies and develop project ideas. For example, at last year’s camp, we had a closer look at Java FX and developed this sample application.


    Canoo.net Talk at BlogCamp Switzerland

    September 9th, 2008

    Stephan Gillmeier and I attended the recent BlogCamp in Zürich, Switzerland.

    Stephan presents the Canoo.net blog

    Stephan Gillmeier presented an excellent talk on Canoo’s German language blog “Fragen Sie Dr. Bopp” (in English “Ask Dr. Bopp”):

    www.canoo.net/blog

    This is where Canoo’s chief linguist Dr. Stephan Bopp publishes some of the questions we receive at www.canoo.net.

    As a special highlight, Stephan Gillmeier revealed one of his plans for Canoo.net:

    Look up German words from your iPhone

    An iPhone application to look up words on Canoo.net.


    Canoo CEO to present course on RIA and AJAX at ETH Zürich

    September 3rd, 2008

    Hans-Dirk Walter, CEO at Canoo EngineeringCanoo’s CEO Hans-Dirk Walter is presenting a one day course on Rich Internet Applications and AJAX on 12th September 2008.

    The RIA course is part of a three day training “Web-basierte Informationssysteme” from 10th to 12th September 2008 and will be held in German at the ETH in Zürich. Participants may choose to attend only one day or the entire course.

    Praktisch alle Menschen haben Zugang zum “Web”, sei es privat, dienstlich oder zunehmend auch mobil. Das Web ist damit praktisch jederzeit für jedermann verfügbar. Der große Erfolg des Webs liegt darin begründet, dass das Web die Kosten für das Abrufen und Bereitsstellen von Information stark reduziert hat. Dieser dreitägige Kurs stellt die grundlegenden Technologien des Web und der Entwicklung von Web-basierten Anwendungen vor. Am ersten Tag werden Web Services und dienstorientierte Softwarearchitekturen (SOA) vorgestellt, die die Grundlage für verteilte Informationssysteme bieten. Am zweiten Tag wird XML als eine der grundlegenden Technologie zur Repräsentation, Speicherung, Austausch und Verarbeitung von Information vorgestellt. Am dritten Tag werden Rich Internet Applications und die Programmierung von modernen graphischen Benutzerschnittstellen behandelt.

    Here is a summary of the RIA topics that will be presented (in German):

    Rich Internet Applikationen (RIA) sind die nächste Generation der Webtechnologie. Sie verbessern die Benutzerschnittstellen und erweitern den Anwendungsbereich von Webapplikationen entscheidend. Ihr wesentlicher Beitrag: sie verbinden die Vorteile server-basierter Web-Technologie mit Interaktionsmöglichkeiten für den Benutzer, die man sonst nur von lokal installierten Desktop-Applikationen kennt.

    Durch das Schlagwort AJAX und Anwendungen wie Google Maps, Flickr oder e-Opinion, die mit dieser Technologie implementiert sind, wurden Rich Internet Applikationen über die technische Entwickler-Community hinaus bekannt.

    Häufig wird übersehen, dass AJAX nur eine (sehr einfache) Implementierungsalternative ist, um das übergeordnete Ziel ergonomischerer Benutzerschnittstellen zu realisieren. Dieser Kurs gibt einen Überblick über die Ziele, die man durch den Einsatz von RIA Technologie verfolgt, die Architektur und Entwurfsmuster für Rich Internet Applikationen sowie einen Überblick über Technologiealternativen, um solche modernen Systeme zu realisieren. Zusätzlich zu den Konzepten werden Demonstrationen und praktische Beispiele geliefert, um eine richtige Erfahrung mit diesen Technologien zu bekommen.


    Summary of the Course Details:

    When: Wednesday 10th September 2008 to Friday 12th September
    Where: ETH Zürich, IFW-Gebäude, Hörsaal A 36 , Haldeneggsteig 4
    Lecturers:
    Prof. Dr. G. Alonso, ETH Zürich
    Prof. Dr. D. Kossmann, ETH Zürich
    Dr. H.-D. Walter, Canoo AG
    Course name: Web-basierte Informationssysteme

    ETH Zürich Kompaktkurs zum Thema RIA und AJAX


    Register for this course
    at the ETH Zürich website.

    This course is part of an ETH Zürich course program for IT professionals called “Kompaktkurse für Informatiker”.


    Community Contributions for UltraLightClient ‘08

    August 27th, 2008

    The UltraLightClient team is pleased to announce that the a first bunch of community contributions has been ported to the new UltraLightClient ‘08 release.We are planning to port all relevant contributions to UltraLightClient ‘08 during the next few weeks.

    Some words on the UltraLightClient community. The community has two intentions: first of all, it is a component repository for our customers, secondly the UltraLightClient team uses it as a playground to explore new concepts related to UltraLightClient.

    UltraLightClient Code Community

    Let’s look at these two intentions in some more detail:

    UltraLightClient community as component repository for customers
    Customers can find ready to use components in the UltraLightClient community that implement a wide range of requirements. Usually these component come from real world projects where Canoo engineers were engaged either as consultants or as developers. I recommend you to have a look at the following gems in the UltraLightClient community:

    Description Sample Link Community Link
    A native browser component that fully supports HTML and browser plugins (e.g. is able to play YouTube videos) start open
    An interactive charts component that can display all kinds of business charts start open
    A small process framework that helps you to manage and visualize background processes start open
    Input support for text fields à la Google Suggest start open
    An interactive map component that offers the functionality of Google Maps start open

    UltraLightClient community as playground to explore new concepts
    The standard approach for new concepts is not to directly integrate them in the release but to explore them first in a separate project that is hosted on the community. This gives you a chance to see what the UltraLightClient team is currently working on. Successful concepts will be integrated in future versions of UltraLightClient. For example, the UltraLightClient ‘08 release integrated the following contributions from the UltraLightClient community:

    Link summary
    ULC Code Community
    List of migrated contributions
    Canoo UltraLightClient product page


    RIA forms

    August 25th, 2008

    What contributes to the richness of a RIA (Rich Internet Application)?
    What contributes to the poorness of a PUWA (Poor Ugly Web Application)?
    How does a RIA compare to a PUWA?

    In this post, I’ll discuss forms and what they look like in a RIA. Forms are the sort of things that you find a lot in business applications. For example, bank employees use them to manage customer data, to view account transactions, or to calculate mortgage offers. Or what you, as a brave citizen, use to submit your taxes. But forms are not limited to business applications. You can find them in games to set up your player or to configure the game server.

    Consider the following screenshot showing a form to calculate a mortgage offer:

    Rich Mortgage Calculator

    What exactly makes the above form a rich form? Can you spot it? Sorry to disappoint you, but it is not possible to see form richness. The only way to decide that a form is rich or not is to feel the form. And of course with a static screenshot it is really not possible to feel the form. Richness comes from interaction design and not from graphical design. This is a common source for misunderstanding. So let’s repeat it: Richness comes from interaction design and not from graphical design. Two topics in interaction design define the richness of a form: input feedback and input support.

    Input Feedback
    Let’s start with input feedback. The easier the user can connect the feedback to his or her user interaction, the richer the form. Given this fact, a form within a PUWA can never be rich. A PUWA is page-oriented and the user does not get feedback at the time when he or she enters wrong values. Instead he or she gets feedback only when he or she commits the form (see this groundbreaking article that compares PUWAs with Ajax-based web applications). A measurement for the richness of the feedback is the kind of feedback that is available to the user. Basically we distinguish between syntactical and semantic feedback. Syntactical feedback tells the user that field input is not well formed, e.g. error messages such as this is not a number, this is not an email address, this number has to be between 0 and 18. Whereas semantic feedback puts the input in a broader context and checks for business rules, e.g. the total loan amount may not be greater than 80% of the object’s value, or you are not authorized to withdraw more than 2000€ per week. The more semantic feedback the richer the form.

    Input Support
    The second measurement for the richness of a form is input support. One well known example for input support is suggesting valid field values as the user types. You can check out this feature at Google Suggest. Other forms of input support are the calculation of dependent values (e.g. calculating the city name for a given zip code) or disabling of non-mandatory fields (e.g. fields defining the legal guardian for underage persons). The more input support, the richer the form.

    UltraLightClient '08

    How does UltraLightClient ‘08 fit into this? First, its server-side architecture is a perfect fit for ultra-easy semantic feedback. This is because all of your code runs always on the server-side. There is no need to split code and propagate business logic to the client. Just access the business objects you need, it is that easy! Second, UltraLightClient ‘08 includes an high-level form component out-of-the-box. This makes the implementation of forms both, efficient and ultra-easy. The application that provided the screenshot above is implemented with UltraLightClient ‘08 and contains all forms of input feedback and input support.

    Summary
    Richness comes from interaction design (feel) and not from graphical design (see). There are two measurements to decide if a form is rich or not:

    • Input feedback: the more semantic feedback the richer the form
    • Input support: the more support the richer the form

    UltraLightClient ‘08 is a perfect fit for both measurements. Its server-side architecture makes it ultra-easy to provide full semantic input feedback and its high-level form component enables full input support out-of-the-box.


    Server-side Architecture (Part 2)

    August 20th, 2008

    In this blog post series, I am revisiting some of the arguments for a Java-based RIA library such as UltraLightClient. Please leave a comment and share your views. Read Part 1 here.

    Why ULC? (Part 2)

    Within UltraLightClient the programming model and the execution model are server side based. ULC applications are installed and run on the web server. On the client side, a small, browser-like presentation engine, that is generic for all applications, links up with the server to display the corresponding user interface component.

    Fair enough. But how will your business web application project benefit?

    Consider the following reasons:

    1) Faster development - re-use instead of re-invent

    UltraLightClient was designed for complex web applications in the business world, such as typical data entry applications with tonnes of data, tables, table trees, tabs, forms, charts. The library offers a full range of user interface components to build better web interfaces for enterprise applications.

    From a developer’s angle, UltraLightClient takes care of the client/server environment. It handles distribution between the two very efficiently, and as a developer, you do not need to worry about the client/server split. All the application code, presentation and domain logic are run on the server. Development tasks such as distributing the logic between client and server are not required.

    Another huge advantage during development time is that you can preview, test and debug without deploying the application. See Chapter 2 of the ULC Essentials Guide for a detailed description of the ULC DevelopmentRunner.

    2) Re-use existing HTML application platform

    ULC applications share the entire software platform with HTML applications and are easy to integrate with HTML applications. ULC has a typical web application architecture and can be easily used alongside many excellent tools and libraries (e.g. Spring, Hibernate)

    3) Better security

    In general, ULC applications are easier to protect against security attacks than AJAX-based applications. Java is less vulnerable than JavaScript. ULC applications are secure from cross site scripting (XSS) attacks.

    No application code is shipped to or run on the client. The presentation engine is generic and is less susceptible.

    4) Profit from Java EE scalabilty options

    Standard Java EE is supported. This means that all the scaling options available for Java EE can be used to deploy ULC applications.

    5) Highly responsive applications

    From the very start UltraLightClient was designed to develop web applications with a desktop-like user interface. The communication has been highly optimized for the web. This ensures fast responses and ensures an increase in user productivity in comparison to the sluggish performance of AJAX applications. ULC applications easily keep pace with the performance requirements of knowledge workers and supports this user requirement out-of-the-box, i.e. you will not need to spend extra time trying to make your web application more responsive.

    Link summary:
    Why UltraLightClient? (Part 1)
    Top reasons to use ULC
    Case Studies


    Not deploying RIAs is “not an option.”

    August 8th, 2008

    I stumbled across this report discussing Web 2.0 within an enterprise context, which I would like to recommend:

    “Web 2.0 Gets Down to Business”.

    The report discusses the results of an Information Week survey and presents some interesting charts and numbers, e.g. why companies introduced RIAs , or what type of apps are in the pipeline.

    (…) rich apps are the wave of the future as Web users, customers, and employees demand capabilities matching what they’ve experienced on cutting-edge sites. IT must respond, either by effectively outsourcing development or by delivering the goods itself.

    (…)

    But IT can get a lot of return from a more fluid user experience for employees, too. Many insurance companies create RIAs for their sales agents, using platforms such as Adobe Flex to create forms that make it easier to complete complex insurance applications and pass them in an industry-standard format to underwriting systems. Other companies use RIAs to deliver personalized management dashboards – the No. 1 choice when we asked what apps are in planning or development – as well as workflow and multimedia training tools.

    Data visualization is another common RIA use that can transform the productivity and creativity level of managers and knowledge workers. A telecom company might use an RIA to support engineers by providing a visual view of complex network events and possible correlations to problems. Though RIAs generally are overkill for simple Web forms and information displays, they’re particularly well suited to support complex interactions with multiple inputs and pages, large data sets, and the multimedia content seen in geospatial data or complex medical records, for example.