VisionX compared to RAD

Post to Twitter

We started with VisionX as RAD tool because we tried to solve common problems with database development. If you create applications with access to databases, you know what I mean. It's horrible to do the same boring things multiple times. You have to create table definitions, create screens, bind models to controllers or views, use or don't use ORM, implement business logic, ...
The most interesting part is business logic because all other things are not that complex (of course, database modelling is not a trivial task).

Today I'm conviced that VisionX is the evolution of RAD.

Why do I think that?

Usually, RAD tools offer an all-in-one solution for developing applications. They contain IDE features but aren't an IDE. A RAD tool is more like a lightweight IDE with some useful addons like database modeler, GUI editor and debugger. Some RAD tools offer SCM integration, Test automation and other ALM methods.

RAD is not the right definition for VisionX because it's more than that. It doesn't show you the source code directly because an IDE is better for that. Why shouldn't we use an IDE for editing source code? VisionX doesn't offer SCM features because there are enough good tools available.

VisionX primarily supports Eclipse as IDE and all available SCM tools but not directly linked with VisionX. VisionX is not open source but it uses open source frameworks and all built applications are available with their source code. We didn't re-invent the wheel but tried to allow end-users to create their own applications without being a developer.
We think it's better to use the best tools, instead of creating something similar. You decide what's the best tool.

VixionX wasn't designed for developers. It was designed for end users. This is a big difference compared to RAD tools.

But VisionX is not limited to end users, because it creates and reads Java source code. Every Java developer can work with VisionX but with familiar development tools like Eclipse. The tool offers a WYSIWYG editor and has some useful addons, but it goes a few steps further.
VisionX doesn't need a database modeler because an end user doesn't know what a database(model) is. The user knows which data is needed, like Phone number, currency, description. The user also knows if a selection field is needed or an image should be shown. But primary key, foreign key and constraints are totally unknown.

You can compare VisionX with Excel because the user enters data and the application decides what is shown. But there's no hidden magic because VisionX simply works with generated and interpreted source code. If you change the source code, VisionX takes care of it.

And another big difference to RAD tools is, that VisionX creates modern 3-tier applications following single-sourcing approach. It's the only tool that creates an application that runs without source code changes as Desktop application, native HTML5 application in modern web browsers and as native smartphone app. It offers live preview on all targets and it has a unique reporting included. It's not based on XML files or meta information. It's based on Word or Excel templates. Every end user is able to create a word or excel file.

VisionX is a tool, designed for end users but a developer will love it because it helps to do all the boring work and under the hood it's still a modern development tool.

New VisionX feature for developers

Post to Twitter

This new feature is especially for all Oracle Forms developers :)

It will be possible to configure existing DB storages and create new storages. The feature will be added to the data area of VisionX:

Storage edit button

Storage edit button

The new wizard will show the default SQL statement and it'll be possible to change the statement:

Edit DB storage(s)

Edit DB storage(s)

This new wizard is not useful for end-users because only developers should change SQL statements. Because of that, it won't be available for all VisionX users - it depends on the license.

The new wizard has some additional features like moving a DB storage from screen-level to session level which is like a global storage. You can create DB storages without creating a RemoteDataBook. Such storages will be available as source for drop-downs in the data edit wizard, like Views or Tables.

The new feature-set will make you happy!

Our Live-Ticker implementation - World cup 2014

Post to Twitter

We got a lot of (positive) feedback for our live ticker in Packung! It's great to see actual results depending on the current score :)

We started our live ticker in 2008 with a simple implementation in Java. The solution simply sniffed results from standard html pages. It was easy to get results because result pages didn't use Ajax. It was harder in 2010 and 2012 because Ajax was heavily used. But we found some pages without Ajax.

What's the problem with Ajax? It's not possible to get the complete html content with one simple http request with Java. You need a "browser" that handles javascript and async calls.

We didn't find a html page with live results this year, which didn't use Ajax or Flash. So we thought about a clever solution because we won't pay for "free content". And of course, our betting game is free and we don't earn money. But what's a clever solution? The task is simple: Grab results from existing live-ticker website (be aware of Ajax) - but how?

The solution is simple: Use a browser :)

But Java doesn't offer a browser control, doesn't it? Yes, JavaFX does!

In 2008 we played around with QT webkit control of QT Jambi (but the project is not active) because it was a nice browser control. The problem was that it didn't work headless and our application server was a linux box without X-Server. This year, we had the same restrictions because our server is a linux box and still no X-Server. We thought that JavaFX could be the right solution for us...

BUT it doesn't work headless enough - not with latest release. It will be better in upcoming releases and/or custom JavaFX builds because there is a Glass windowing component called Monocle. But this was the right challenge for us.

Our current solution runs on Linux, without a real X-Server. It's a JavaFX WebView/WebEngine that reads data from a public live-ticker.

How our solution works?

Install important linux packages:

yum install xorg-x11-server-Xvfb xorg-x11-xauth gcc glib2 glib2-devel libtiff libtiff-devel libjpeg-devel cairo cairo-devel pango pango-devel redhat-lsb

optional if available

yum install redhat-lsb-graphics

Download and install ATK

wget ftp://ftp.muug.mb.ca/mirror/centos/6/os/x86_64/Packages/atk-1.30.0-1.el6.x86_64.rpm
wget ftp://ftp.muug.mb.ca/mirror/centos/6/os/x86_64/Packages/atk-devel-1.30.0-1.el6.x86_64.rpm
rpm -Uvh *.rpm

and GTK+

wget http://ftp.gnome.org/pub/gnome/sources/gtk+/2.18/gtk+-2.18.2.tar.gz
tar -xvf gtk+-2.18.2.tar.gz
cd gtk+-2.18.2
./configure
make
make install

Start Xvfb:

Xvfb :99 &

Start application:

#!/bin/sh
export DISPLAY=:99
export LD_LIBRARY_PATH=/usr/local/lib
./jdk1.8.0_05/bin/java -jar livescore.jar >> liveupdate.log 2>> liveupdate_err.log &

The application itself is trivial. It's a class with main method:

/**
 * Starts the application.
 *
 * @param pArgs the application parameters
 */

public static void main(String[] pArgs)
{
    new Livescore();
}

/**
 * Creates a new instance of <code>Livescore</code> and starts the update procedure.
 */

public Livescore()
{
    super();

    fxPanel = new JFXPanel();
       
    Platform.runLater(new Runnable()
    {
        public void run()
        {
            fxPanel.setScene(new Scene(new BorderPane(), 800, 600));
               
            browser = new SimpleBrowser();
            browser.load();
        }
    });
       
    start();
}

We need the JFXPanel because JavaFX needs a scene, otherwise it'll throw Exceptions. We don't need the instance for other things.

The SimpleBrowser class is similar to this snippet:

/**
 * Loads the configured website.
 */

public void load()
{
    if (view == null)
    {
        view = new WebView();
        engine = view.getEngine();

        engine.load("http://live-ticker.url");
    }
    else
    {
        engine.reload();
    }

    if (thCheck == null)
    {
        thCheck = new Thread(new Runnable()
        {
            public void run()
            {
                try
                {
                    while (Thread.currentThread() == thCheck)
                    {
                        Platform.runLater(new Runnable()
                        {
                            public void run()
                            {
                                checkResults();
                            }
                        });
                       
                        Thread.sleep(10000);
                    }
                }
                catch (InterruptedException ie)
                {
                    //stop
                }
               
                thCheck = null;
            }
        });
        thCheck.start();
    }
}

That's it. We got two "silent" Exceptions

java.lang.NullPointerException
  at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:57)
  at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
  at java.lang.reflect.Field.get(Field.java:387)
  at com.sun.javafx.webkit.theme.ScrollBarThemeImpl.getFieldValue(ScrollBarThemeImpl.java:397)
 ...
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
  at com.sun.javafx.webkit.theme.ScrollBarThemeImpl.thumbPosition(ScrollBarThemeImpl.java:267)
  at com.sun.javafx.webkit.theme.ScrollBarThemeImpl.getThumbPosition(ScrollBarThemeImpl.java:352)
  at com.sun.webkit.Timer.twkFireTimerEvent(Native Method)
  at com.sun.webkit.Timer.fireTimerEvent(Timer.java:66)
  at com.sun.webkit.Timer.notifyTick(Timer.java:47)
  at javafx.scene.web.WebEngine$PulseTimer$2.pulse(WebEngine.java:1154)
  ...

after the application start, because of some scrolling problems, but these Exceptions had no effect (in our solution).

The solution would rock with a real headless JavaFX but it's ok for us.

VisionX store - Test phase!

Post to Twitter

Our VisionX store is now available for selected customers.
It'll be included in VisionX starting with version 2.0.28 and should work out-of-the-box.

The final UI will look like:

VisionX Solution store

VisionX Solution store

We'll offer free applications, modules and addons but also paid content for customers with a valid license. The first application is our Demo ERP which shows the full power of VisionX because it contains reports, a lot of actions, charts, a tree and will run as desktop, web and native iOS application.

The server-side of the store was developed with standard JVx and the client as well, but the client isn't available without VisionX. It's possible to host your own VisionX store in your own environment, but this feature needs a separate license.

Have fun ;-)

Twitter Storage in action

Post to Twitter

We re-activated our Twitter storage for Packung! 2014. The old implementation was based on twitter4j 2.1.7 and since Twitter API changes, our implementation stopped to work. After a library update to twitter4j 4.0.1 and some smaller changes, everything is fine again.

The storage in action:

Twitter Storage implementation

Twitter Storage implementation

The storage extends the standard AbstractMemStorage of JVx.

Tippspiel für die Fußball WM2014 - Los gehts!

Post to Twitter

wm2014   tippspiel_packung

Unser gutes altes Tippspiel ist für die WM 2014 bereit. Wir sind zwar etwas spät dran, aber noch ist alles möglich.

Wenn du einen unserer 3 Fan-Preise gewinnen möchtest, spiel einfach mit:

Der Link zur Info Seite: http://wm2014.sibvisions.com

Vergiss bitte nicht, auf die Topwette (der Weltmeister). Damit kannst du dir am Ende 20 extra Punkte krallen und ev. noch den Sieg an dich reißen. Die Topwette kann nur vor dem Turnierstart gesetzt werden.

Auch in diesem Jahr halten wir dich via Twitter, nach jedem Spieltag, auf dem Laufenden!

JVx 2.0.2

Post to Twitter

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 ;-)

JVx swing UI / VisionX Button with popup menu

Post to Twitter

We didn't have support for Buttons with popup menus in JVx because standard Swing doesn't support this feature out-of-the box. But such a component would be very useful for some UIs.

We didn't change our UI definition but we started with support in Swing. Our JVxButton now has support for showing a popup menu. It could be like this one:

DropDown

DropDown

We've added some buttons to VisionX, because it reduces the amount of buttons :)

VisionX with new buttons

VisionX with new buttons

It's easy to use the new feature in your Swing application and also in your JVx application (for Swing UIs):

UIPopupMenu pmDocumentation = new UIPopupMenu();
pmDocumentation.setTranslation(getLauncher().getTranslation());
       
pmDocumentation.add(miHelp);
pmDocumentation.add(miSpecification);
       
((JVxButton)butDocumentation.getResource()).setPopupMenu((JPopupMenu)pmDocumentation.getResource());
       
//because we add the resource
pmDocumentation.addNotify();

There are some things to know:

  • Set the translation because the resource is added and the UIPopupMenu doesn't have a parent.
  • Call addNotify to enable translation (same problem because of missing parent)
  • You should check if the resource of the button is an instance of JVxButton to be UI technology independent

If you work with above code, you'll have all JVx features like simple event handling or translation.