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.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;
}

JVx 1.1 is available

Yesterday, we released a brand new version of JVx. The version number is now 1.1. We had some delays between 1.0 and 1.1 because we decided to do more researching as we originally planned. The 1.0 release was too stable and full featured because we only got positive feedback and some feature requests. Our product VisionX also uses JVx 1.0 and our customers had absolutely no problems.

Last year, we decided to open our nightly builds for everyone and because of our high quality standards, we had a new release every day. Some versions were broken but most versions were ready for production use. Of course, a nightly build is not an official release.

But now you are able to use the latest version of JVx as an official release and of course we offer full support.

We have a bunch of new features and smaller bugfixes. Many changes are related to other open source frameworks because we researched a lot of interesting libraries and frameworks. The famous ones are Javeleon and Vert.x.

So, what happened with JVx since 1.0?

  • Improved REST support for all server-side life-cycle objects. It's possible to call actions and to access data (CRUD and metadata). The REST interface is using the same APIs and the same security settings as your web or desktop application. If you're using JVx, it's a task of 1 minute to bind external html5 clients.
    It's very easy to provide custom data for your customers, e.g. create a view in your database, use existing DAOs or dynamically create reports. You'll need about 5 minutes to provide new functionality.

  • Full support for Vert.x

    We successfully used Vert.x http and socket server instead of Tomcat or JBoss. Simply use your existing applications and integrate them in your Vert.x environment. Don't change your application, simply use another technology.
    Simply use Vert.x event bus for asynchronous and live messages.

  • Execute database procedures and functions like Java functions. Don't write many LoC for database access. We now offer input and output parameters as known from direct JDBC calls. We didn't reinvent the wheel but made JDBC a little bit easier to use.

    Standard JDBC procedure call:

    // Standard IN-OUT Parameter Test with plain JDBC
    Connection con = dba.getConnection();

    CallableStatement cstmt = con.prepareCall("{ call EXECPROCEDURE(?, ?, ?) }");
    cstmt.registerOutParameter(1, Types.DECIMAL);
    cstmt.registerOutParameter(3, Types.VARCHAR);

    cstmt.setObject(1, BigDecimal.valueOf(1), Types.DECIMAL);
    cstmt.setObject(2, "ABC", Types.VARCHAR);
    cstmt.execute();

    Same procedure call with JVx:

    OutParam ouTextParam = new OutParam(InOutParam.SQLTYPE_VARCHAR);
    InOutParam ioNumberParam = new InOutParam(InOutParam.SQLTYPE_DECIMAL,
                                              BigDecimal.valueOf(1));
    dba.executeProcedure("execProcedure", ioNumberParam, "ABC", ouTextParam);

    The Oracle procedure:

    CREATE OR REPLACE PROCEDURE execProcedure(pNumber IN OUT NUMBER,
                                              pInText IN VARCHAR2,
                                              pOutText OUT VARCHAR2) IS
      nr NUMBER := pNumber;
    BEGIN
      pOutText := 'Out: '|| pOutText ||' In: '|| pInText;

      pNumber := pNumber + pNumber;
    END execProcedure;

  • Custom UI factories

    It's now fully supportet that you create your own UI factories or extend existing factories. A JVx application will use your custom factory. This allows replacement of single standard components with your own components or simply integrate new components in your application.

  • Oracle Forms integration

    The whole framework was successfully integrated in Oracle Forms applications. A JVx application or a single screen interacts with Forms like standard Forms screens. It's now possible to use modern UI elements in your Forms application without changing or migrating the whole application. We use both technologies and that boosts development time.

  • Full NTLMv2 authentication support

    We had support for NTLMv1 in JVx 1.0 and earlier, but with modern Windows OS' you had to set a registry key to force NTLMv1 because the OS' used NTLMv2. We now support modern Windows versions (Vista, Win7, Win8) out-of-the-box.

  • JVx is ready for Embedded devices

    We made some experiments with embedded Hardware like RaspberryPi or Beagleboard. We always used JVx for our applications and JVx 1.1 works without problems. If you're interested in our experiments, check our Videos on YouTube.

  • Pimped standard Save file dialog to ask for override existing files
  • Prepared JVx for JVx.mobile

The complete changelog is available here.

VisionX 1.1.1 is released

We released VisionX 1.1.1 as little Thank you to our customers. Thanks for the great Feedback and for all the compliments!

The new release contains many improvements and solves some ugly problems.

The details

  • Application reload in Browsers

    It is not necessary to clear the Java or Browser cache. The application now reloads automatically.

  • Data export

    The simple export of records now creates valid CSV files. Simply open it with Excel or other Office suites.

  • Install the database without freeze

    VisionX had a problem with opened database connections, because the installation waits until all resources are freed. In the current release, VisionX closes all opened connections during installation. The database installation now runs smoothly.

  • Translation update

    We updated the English translation.

  • Tomcat Settings

    If you reused a Tomcat setting, the port is set to 80. Now the stored port is used.

  • User Management

    Now it is possible to customize the User Management screen.

  • Form screen validation

    If you close a form screen but not all required fields are filled, you get only one information dialog.

  • Default table sort

    If you sort a table with different columns and different sort orders, it is saved now.

  • Edit data table

    We found a potential freeze during screen update and changed the display of the data type.

  • Action editor

    A value change command does not create a new insert command anymore.

Have fun with this fantastic release.

JVx 0.9 beta-2 is available

It is available from the project page.

What’s New?

The complete list of changes can be found here.

  • Default Database (CoC)It is now possible to configure multiple db datasources via config.xml
    <?xml version="1.0" encoding="UTF-8"?>

    <application>
    <securitymanager>
    <class>com.sibvisions.rad.server.security.DBSecurityManager</class>
    </securitymanager>

    <datasource>
    <db name="default">
    <url>jdbc:oracle:thin:@localhost:1521:mydb</url>
    <username>user</username>
    <password>password</password>
    </db>
    </datasource>
    </application>

    If the DBSecurityManager does not define a specific datasource, the datasource with the name "default" is used.

  • Quoting in DBAccessDBAccess supports case sensitive database access. To enable the feature, call
    setQuoting(true);

    on your DBAccess instance.

  • Custom SessionManager and ObjectProviderIt was possible to use a custom ObjectProvider but it was not possible to extend the DefaultObjectProvider. Now this limit is gone. Additional it is now possible to use a custom SessionManager and extend the DefaultSessionManager.

    Configure the objects in your server config.xml like this:

    <server>
    <sessionmanager>com.sibvisions.AnotherSessionManager</sessionmanager>
    <objectprovider>com.sibvisions.AnotherObjectProvider</objectprovider>
    <server>
  • Server Side TriggersOur DataBooks now supports specific events like before insert or after delete. The server side storage did not have this events, so you had to overwrite the data manipulation methods to call your business logic or to change the default behaviour. That was not very cool.

    We have implemented a very powerful feature, with which you have full control of your data sent to the data tier. Do you know database triggers?
    Now you have the same power in your storages.

    A short example:

    public void getUsers()
    {
    DBStorage dbsUsers = new DBStorage();
    dbsUsers.setDBAccess(getDBAccess());
    dbsUsers.setFromClause("V_USER_USERS");
    dbsUsers.setWritebackTable("USERS");
    dbsUsers.open();

    dbsUsers.eventBeforeInsert().addListener(this, "doEncryptPwd");
    dbsUsers.eventBeforeUpdate().addListener(this, "doEncryptPwd");
    }

    public void doEncryptPwd(StorageEvent pEvent)
    {
    IBean bn = pEvent.getNew();

    bn.put("PASSWORD", AbstractSecurityManager.getEncryptedPassword(
    SessionContext.getCurrentSessionConfig(),
    (String)bn.get("PASSWORD")));

    pEvent.setNew(bn);
    }

    Use the event handling as usual.

  • Flat POJO support for StoragesInstead of using the dynamic property access via IBean, it is possible to work with POJOs:
    public void doEncryptPwd(StorageEvent pEvent)
    {
    User user = pEvent.getNew(User.class);

    user.setPassword(AbstractSecurityManager.getEncryptedPassword(
    SessionContext.getCurrentSessionConfig(),
    user.getPassword()));

    pEvent.setNew(user);
    }

    You can work with every useful POJO because the storage mapps only available properties to the POJO.

  • Useful bugfixes

We look forward to your reviews ;)

JVx 0.9 beta-1 is available

Check out our new JVx version. It is available from the project page.

What's in the current beta?

The complete list of changes can be found here.

Some features, however, at this point:

  • Introduced DBCredentials and DataSourceHandlerIt is now possible to configure multiple db datasources via config.xml
    <?xml version="1.0" encoding="UTF-8"?>

    <application>
    <securitymanager>
    <class>com.sibvisions.rad.server.security.DBSecurityManager</class>
    <database datasource="mydb" />
    </securitymanager>

    <datasource>
    <db name="mydb">
    <url>jdbc:oracle:thin:@localhost:1521:mydb</url>
    <username>user</username>
    <password>password</password>
    </db>
    <db name="masterdb">
    <url>jdbc:derby://localhost:1527/masterdb</url>
    <username>master</username>
    <password>master</password>
    </db>
    </datasource>
    </application>

    and use the configured security manager connection in the Session:

    IConfiguration config = SessionContext.getCurrentSessionConfig();

    dba = DBAccess.getDBAccess(DBSecurityManager.getCredentials(config));
    dba.open();

    or any connection, by name:

    IConfiguration config = SessionContext.getCurrentSessionConfig();

    DBCredentials cred = DataSourceHandler.createDBCredentials(config, "masterdb");

    dba = DBAccess.getDBAccess(cred);
    dba.open();

    It is still possible to use the old configuration format:

    <?xml version="1.0" encoding="UTF-8"?>

    <application>
    <securitymanager>
    <class>com.sibvisions.rad.server.security.DBSecurityManager</class>
    <database>
    <driver>org.hsqldb.jdbcDriver</driver>
    <url>jdbc:hsqldb:hsql://localhost/demodb</url>
    <username>sa</username>
    <password></password>
    </database>
    </securitymanager>

    You can create DBCredentials or read the config programatically, as it was with JVx 0.8.

  • Introduced AbstractCachedStorageThe AbstractCachedStorage is the new base class for all IStorage or ICachedStorage implementations. It implements the metadata caching and offers simple export functionality. With this class it is easy to develop new storages.
  • Introduced AbstractMemStorageThe AbstractMemStorage extends the AbstractCachedStorage and offers a MemDataBook on the server-side. With this class it is very simple to create storages with data kept in memory. You don't need a special backend, e.g. you can use a List to fill the storage. Our TwitterStorage uses this storage.
  • DBAccess supports pre-configured java.sql.ConnectionCreate a DBAccess instance with a pre-configured connection, e.g.
    Connection con = getJNDIConnection();

    DBAccess.getDBAccess(con)

  • XmlNode performance tuningOur XmlNode allows XML access with following syntax:
    XmlWorker xmw = new XmlWorker();
    xmnRead = xmw.read(new FileInputStream("example.xml"));

    xmnRead.setNode("/archive/element(1)/user", "xml");
    xmnRead.setNode("/archive/new/element", "car");

    The class offers powerful and simple XML handling - check it out!

  • Bugfixes and Test cases

We look forward to your reviews ;)

JVx 0.8 released

JVx 0.8 ist out now!

We put much time and work into the new release. It contains almost 100 improvements!

But before we go into the details, it should be mentioned that JVx is now hosted on SourceForge. This step was particularly important to us, in order to be able to develop together with our Community.

Our Forum contains detailed instructions for working together.
We appreciate any help.

Download JVx 0.8 here

What's new?

  • API changes
    • We removed set/getTableColumnNames, set/getTreeColumnNames, set/getEditorColumnNames and introduced ColumnView. Now it is possible to set a column view per UI control e.g.: ITable, ITree, IEditor, null (ALL)

      Old:

      rdbInvoice.getRowDefinition().
      setTableColumnNames(new String [] { "POS", "PRICE"});

      New:

      rdbInvoice.getRowDefinition().
      setColumnView(null, new ColumnView("POS", "PRICE"));
    • DBAccess has now a static method, setAutomaticLinkColumnNameTranslation, to translate the automatic link column names into a user-defined name.Default:
      tmpAutoLinkColumnNames.put("*_id", "*");
      tmpAutoLinkColumnNames.put("*_ID", "*");
    • Changed, automatic, visible column detection from case insensitive to case sensitive, for compatibility reasons!Old:
      setDefaultIgnoredColumnNames("*_ID");

      New:

      setDefaultIgnoredColumnNames("*_ID", "*_id");

      Default:

      "*ID", "*id", "*_ID", "*_id", "*_INTERN", "*_intern"
    • Renamed countRows to getEstimatedRowCount in IStorage
  • MetaData handlingReduced client/server requests,
    Reduced creation loops on server side,
    Caching for sub storages,
    Fixed Nullable column detection,
    Client Cache roles,
    Label detection,
    Split Client and Server MetaData usage
  • SerializerUniversalSerializer is now the standard serializer,
    Support for async serialization with new TypeCache,
    Bean packages unified,
    New init method for ISerializer,
    The serializer name is now included in the connection properties
  • JNDI supportServer is now available via JNDI or Singleton
  • DB supportHSQLDB driver is now registered,
    HSQLDB locking mechanism fixed,
    Derby locking support,
    close open statements,
    Check constraint detection with 'OR', 'AND', 'IN',
    Automatic Link Column Name detection works now DB independent,
    Fetch optimization (reduced method calls),
    BigDecimal DataType contains always a BigDecimal - DB independent
  • SecurityDifferend Password algorithms (SecureHash),
    Automatic Security detection of lifecycle objects,
    XmlSecurityManager now supports more than 1 User
  • Smaller changes and BugfixesAll details are documented in our Support System or the ChangeLog