This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information

Category: Release notes

JVx 2.1 is in da house

Happy birthday :) JVx is 2.1

It's another great release today and ~ 6 month after 2.0. We have soo many cool features for you and of course some bugfixes.
The complete changelog is available on our sourceforge project site.

I want to highlight some features for you

  • Configuration via JNDI or Classpath

    It's now possible to have custom configuration files without our recommended directory structure. We still recommend our structure for multi-application deployments, but it's not important for single deployments or complex enterprise deployments. Find more details about loading strategy in the corresponding ticket #1126.

  • Server-side plugin support

    We introduced IServerPlugin. It allows adding plugins and changing server handling on demand. It's easy to write custom protocol recorder or configure session management via plugin.

  • ServerContext and HttpContext

    We introduced HttpContext and ServerContext. The HttpContext allows live access to servlet request and response (if an application server is in use). It makes no difference if you use REST or standard communication. We set the right instances into the context and your application will work without specific technology checks. We also use HttpContext for JVx.mobile.

    The ServerContext is comparable with SessionContext, but it's earlier in the execution process, because it offers access to sessions directly after creation or detection. It's useful for e.g. plugins.

  • Tab/Focus Index

    We introduced set/getTabIndex in IComponent. This API change allows user-defined component navigation via tabulator or Enter key.

  • CommunicationException details

    It's now possible to find out the connection which throwed a CommunicationException.

  • Alignment for IEditor (API change)

    It's now possible to set the alignment on IEditors instead of the cell editors. Small but very useful API change.

  • Autolink with storages

    It's now possible to create automatic link references with other storage. We had this feature already in 2.0 but only for simple storages without conditions - only from clause was used. Now it's possible to configure custom storages with user-defined sort in the same LCO and set this storages as automatic link reference to other storages in the same LCO.

  • Server side bean processing boost

    We change and improved server side bean handling of our AbstractStorage. Here are some numbers for you:

    ....................... Before | After

    Insert Object[] ... Beans: 200 |   0
    Update Bean ....... Beans: 900 | 200
    Update T .......... Beans: 900 | 400
    Fetch Bean ........ Beans: 600 | 200
    Fetch Object[] .... Beans: 300 |   0
    Update Object[] ... Beans: 500 |   0
    Insert Bean ....... Beans: 400 | 100
    Delete Object[] ... Beans: 300 |   0
    Delete Bean ....... Beans: 600 | 200
    Delete T .......... Beans: 600 | 300
    Insert T .......... Beans: 400 | 200

    Created Beans after processing 100 records.
    The current solution is a performance boost and using Object[] is always faster than everything else.

  • Lazy blob loading

    We don't load Blobs immediate. We load it on request. This doesn't need any actions on client side but be aware of server-side handling because the value of a blob column will be RemoteFileHandle instead of byte[]. You should run your unit tests for your business logic. It's possible to disable lazy fetching, per storage with

    setLazyFetchEnabled(boolean);

    It's also possible to define the threshold for loading immediate or loading lazy. Check

    setLargeObjectLimit
    setDefaultLargeObjectLimit

    of DBAccess.

    This is an awesome new feature because is speeds up data transfer.

  • Custom UI properties

    UIResource got:

    public Object getObject(String pObjectName)
    public Object putObject(String pObjectName, Object pObject)

    It's possible to add custom objects per UI instance, e.g. save custom states.

  • REST services refactored

    We refactored our REST services. The implementation now works without problems and is easier to use becasue we don't need full qualified java names in the URL. We try to find the class via accesscontroller. The accesscontroller got a new method for this.

  • Unique component names

    For all lovers of automated UI tests. We have unique names for all our components. It's easy to create GUI tests with tools like Selenium (web tests) or FEST (swing tests) or whatever you use :)

We have about 107 tickets in this release and it's not possible to explain every change in this blog posting, but be sure - it's great!

The Maven archetype should be available in the next few days, because sonatype archetype listings are not live.

VaadinUI 1.2 released

Our VaadinUI 1.2 is available!
It's a feature release with some bugfixes.

The biggest change was the update to vaadin 7.1.15 and we've already 7.3.3 in our development branch (welcome Valo theme).

What's new?

  • Download extension

    Download dynamic content on-demand or whenever you want via WebSockets. More information and an example project for this extension.

  • Configuration of preserveOnUIRefresh

    Simply use preserveOnRefresh as init-param (true | false) in your web.xml or as URL parameter to preserve the application on browser refresh.

  • Use external CSS

    Use an external CSS file to configure your application style. There's no need to change genereated styles.css for simple tasks. Simply configure the init-param externalCss, e.g.

    <init-param>
      <param-name>externalCss</param-name>
      <param-value>../demoapp.css</param-value>
    </init-param>

    Place the demoapp.css in the root directory of your application (not application server ROOT).

    The css will be placed at the end of the stylesheet links in the generated index.html page.

  • Mobile check

    We check if the UI is running on mobile browsers and set parameters for your application: Web.mobile (= VaadinUI.PROP_MOBILE) and Web.mobile.tablet(only for iPad at the moment) (= VaadinUI.PROP_TABLET). Simply check the parameter in your application.

  • Cache for dynamic images

    If you use images from your classpath, vaadin generates internal URLs for you. This URLs are different per image and the browser cache doesn't work. This handling produces unnecessary requests. We solved the problem with an image cache on server side and custom Image resources. With this changes, the browser cache works as expected.

  • IDs for menu items

    We have an experimental solution for setting IDs on menu items. It's experimental because it's possible that vaadin implements support for that. In that case we won't need our solution anymore. But till then, it works. More information...

  • Responsive support

    It's now possible to register a resize event on the application launcher. Use this event to change your application on-demand. We have some impressions for you.

  • Self-contained packages for Portlets

    We have built-in support for self-contained portlets. It's possible to toggle between global and self-contained mode. Simply set the init-param vaadin.shared (true | false) in your web.xml to use vaadin shared from your application server or the self-contained vaadin.

    General information about self-contained packages.

  • invokeLater and WebSockets

    We've completely changed our invokeLater mechanism because it didn't work in previous versions.

Please check the changelog for a complete list.

VisionX Update 2.0.121

Great news for all VisionX users!

The current update release 2.0.121 is available for download. Please check your download area.

The release is more than just an update release. It contains all currently available features. We wrote about some of them:

Repeating frames
IDE integration
QR Codes
Features for developers
Ready made solutions

It contains current JVx, ProjX libraries and source code.

If you miss some features after upgrading, please contact our product support because previous versions provided features without valid license. If the features are already licensed, no worries.

We have a product and feature overview for you.

JVx 2.0.2

We've released JVx 2.0.2 last friday and you should know that it's available :)

It's a smaller update with bugfixes and some improvements. One new feature is the support for an additional row in the databook. We use this row for searching records.

Other interesting features, from the changelog, are

  • added listener to IConnection for notifications about property changes
  • DBAccess isModified introduced
  • register value changed of single column
  • register key event listener for certain key
  • DataBookBuilder introduced
  • ICloseable introduced
  • Set ORDER BY as property of DBStorage
  • new selection modes: CURRENT_ROW_DESELECTED, CURRENT_ROW_SETFILTER
    CURRENT_ROW_DESELECTED_SETFILTER
  • CommonUtil.close introduced

Have fun ;-)

VisionX 2.0.4 has new search features

If you have a lot of work-screens in your application, it's not so easy to find the right screen because VisionX didn't offer search functionality in its open-screen wizard. With upcoming releases, VisionX will have such search functionality:

Screen search

Screen search

The search fields will be visible if you have more than 5 screens!

Another problem with screens is that you can't search for fields or don't see automatically hidden fields, like ID columns. We have another nice search feature for you:

editors

It will be possible to show hidden fields and also the used column name of your database table. The column names are not visible by default, but will be after you've pressed More... :)

JVx 2.0

Hello everybody. 1st April is over and no worries, we won't stop JVx :)

Today is a great day because I'm very happy to announce JVx - version 2.0.

It's an awesome release because JVx 2 contains so many new productivity features. It's still a small codebase and the quality is very high. We made a big step forward and want to show you some details.

First of all, the LoC analysis. Here are some very interesting numbers for you:

JVx library   Swing UI
LoC   Type
63.447   Code
54.335   Comments (~ 46% of Code)
16.823   Empty lines
134.605   Total
LoC   Type
32.410   Code
18.285   Comments (~ 36% of Code)
7.271   Empty lines
57.966   Total
 
JVx library (Test cases)  
LoC   Type
16.650   Code
8.946   Comments (~ 34% of Code)
5.849   Empty lines
27.052   Total

This time, we broke the mark of 100.000 LoC (112.507). We thought it would be possible with 1.0 but now it happened! Our code is still well documented with about 42% of the LoC.

Some additional numbers:

Files and Tests
JVx library source files   501
Swing UI source files   132
Test source files   109
Total   742
Still a small codebase ;) and still very easy to maintain.
 
Unit tests (no UI, without manual perf. tests)   592
Class coverage (without UI)   78%
Method coverage (without UI)   66%

TOP 10 classes

Classname   LoC
MemDataBook 3.399
DBAccess 3.070
JVxTable 2.448
ArrayUtil 2.000
StringUtil 1.477
DBStorage 1.290
FileUtil 1.277
JVxFormLayout 1.178
XmlNode 1.054
SwingApplet 1.053

This is amazing because we have so many features and so less code. I think our quality standards have been met!

And last but not least, a short overview of new features:

  • New metadata cache

    The caching mechanism is now a real killer feature. No ORM library or any other DB API has a similar technique. JVx is unique in this area. What we do? We reduce database calls and requests. We have different cache levels like Global, per Session or per Connection. The cache is a learning cache and your application will be super fast in production mode.

  • Improved Constraints check

    Our linked cell editors (comboboxes, drop-downs) now shows columns from tables referenced via Foreign keys. Now the master table shows columns from tables referenced with Foreign keys. And also the resulting comboboxes show columns from referenced tables. If you have a clean database model, simple use your master table and the GUI is ready. If your database model isn't as clean as it could be, simply define your references with our APIs.

  • Cache mode for Security Managers

    Before JVx 2, a security manager was cached globally per application. Every session was checked with the same security manager. With JVx 2.0 it's possible to have a security manager per client. Every client could have its own security manager instance.

  • Focus listener support

    This is not rocket-science but important for all kind of UIs. Now JVx has support for it.

  • IController and IControllable

    This is completely new because it allows data navigation with centralized controls. Read more.

  • NO more session blocking

    Before JVx 2 the server implementation blocked simultanuous calls via DefaultObjectProvider. This wasn't a real problem for Desktop applications and with few users but it was in Web environments - especially with our Vaadin UI - or with e.g 500 users. This blocking is gone.

  • Session isolation

    Usually, a session has a specific Life-cycle object with business objects and actions. Such Life-cycle objects have direct access to the MasterSession of an application for convenience. If you want Life-cycle objects without access to the MasterSession this is the right feature for you.

  • New layout: UIGridLayout

    The layout is row/column oriented like good old AWT GridLayout.

  • Super-lazy-loading

    If you use down and up keys to navigate in tables with details, you'll be surprised. The standard lazy-loading mechanism loads data in blocks and on-demand. If you had master/detail relations in your screens this wasn't enough because every master record change did load the detail records. With JVx 2. this will happen if you release the down or up key. This is a nice productivity feature.

  • CheckBox CellEditor

    We now support "real" Checkboxes as cell editor. Our choice cell editor is image based and it doesn't support LaFs. Of course, with the right images it might look like a native Checkbox. Now you can use native Checkboxes. We recommend the choice cell editor for columns with multiple possible values, e.g. Yes, No, null. The Checkbox only has two states Yes or No.

  • MetaData customization

    With JVx 2.0 it's possible to set/change MetaData per Storage, e.g. add a Primary Key.

The list is not complete but shows biggest changes and all details are available in the Changelog.

Please download JVx 2 and send us your Feedback.

VaadinUI 1.0

Our new vaadin UI is available. It's the first release and it's awesome.

Get the binaries from our project site. It's licensed under Apache 2.0 and free for all.

The installation is very simple:

  • Download jvxvaadin-1.0.zip
  • Unzip the archive
  • Add all files to your existing JVx application
  • Change Deployment descriptor (web.xml) and replace simpleapp with your application

Have fun ;-)

Vaadin OnlineHelp 1.0

Our new Online Help system is available. It's the first release with our new vaadin UI. It's fully compatible with our old, GXT based, help system.

Get the binaries from our project site. It's licensed under Apache 2.0 and free for all.

The installation is very simple:

  • Download jvxhelp-1.0.zip
  • Unzip the archive
  • Copy the new directory to your application server, e.g. /webapps/
  • Open http://yourserver:port/jvxhelp-1.0/help/

The help content is saved under /structure. The system reads all available files and directories from the structure directory and creates a table of contents.

JVx 1.2 is out

We released JVx 1.2 today - as planned ;-)

The binaries are available on SourceForge or via Maven central. We also updated our Archetype to version 1.2.0 and it should be available in Maven central in the next days.

We told you that the release contains about 90 tickets. The real number of changes is 123.
Check the changelog for a complete list.

Next version will be 2.0

We did decide that version 1.2 is the last release before 2.0. It's not because of new killer features or big API changes.
The higher version number should represent the maturity of JVx.

JVx was started in 2008 and the low version numbers were fine for our own goals, but our users asked for bigger steps. If we compare our 1.2 with other frameworks, we could use 5.0 without problems.

The version 2.0 will be a smaller feature release that changes MetaData handling on server-side. We'll introduce a new caching mechanism that allows manual change of storage metadata.

We plan the release for the end of this year - without guarantee.

We also plan maintenance releases starting with 2.0

Currently, we don't fix bugs in old JVx releases. We only fix bugs in our development version. We offer nightly builds and maven snapshots and we thought that's enough, but some users want to keep old releases. No worries, we'll do our best to make you happy!

JVx EE 1.0.1 is out

What is JVx EE?

It is a small library that allows you to create backend applications for your frontends. Simply re-use your existing domain model and create a JVx application that uses a domain model instead of direct database connections.

It's licensed under Apache 2.0 and is available here.

What's new?

We reviewed the code and fixed some smaller bugs. We added an example application that shows how it works.

A short example

Session.java

public EntityManager getEntityManager() throws Exception
{
    EntityManager em = (EntityManager)get("entityManager");
       
    if (em == null)
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jvxee");  
        em = emf.createEntityManager();
           
        put("entityManager", em);
    }
       
    return em;
}

Screen.java

public IStorage getCustomer() throws Exception
{
    JPAStorage jpaCustomer = (JPAStorage)get("customer");

    if (jpaCustomer == null)
    {
        EntityManager em = getEntityManager();
               
        jpaCustomer = new JPAStorage(Customer.class);
        jpaCustomer.setEntityManager(em);
               
        CustomerEAO customerEAO = new CustomerEAO();
        customerEAO.setEntityManager(em);
               
        jpaCustomer.getJPAAccess().setExternalEAO(customerEAO);
        jpaCustomer.open();
               
        put("customer", jpaCustomer);
    }
       
    return jpaCustomer;
}

public IStorage getCustomerEducation() throws Exception
{
    JPAStorage jpaCustomerEducation = (JPAStorage)get("customerEducation");
       
    if (jpaCustomerEducation == null)
    {
        jpaCustomerEducation = new JPAStorage(Customer.class);
        jpaCustomerEducation.setDetailEntity(Education.class);
        jpaCustomerEducation.setEntityManager(getEntityManager());
        jpaCustomerEducation.open();
               
        put("customerEducation", jpaCustomerEducation);
    }
       
    return jpaCustomerEducation;
}