Trace:
Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
jvx:firstapp_step-by-step [2018/01/30 08:27] admin |
jvx:firstapp_step-by-step [2020/06/10 11:04] cduncan Edited for English grammar (capitalization, punctuation, correct verb conjugation) |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ~~Title: First JVx application (step-by-step)~~ | + | ~~Title: First JVx Application (Step-by-Step)~~ |
The aim of this tutorial is to create an application with the Enterprise Application Framework – [[https://jvx.sibvisions.com|JVx]]. Moreover, a quick overview of the framework's possibilities will be given. | The aim of this tutorial is to create an application with the Enterprise Application Framework – [[https://jvx.sibvisions.com|JVx]]. Moreover, a quick overview of the framework's possibilities will be given. | ||
- | The application's task is to display the data from a database table and make them editable. The application requests authentification with user name and password. | + | The application's task is to display the data from a database table and make them editable. The application requests authentication with username and password. |
The following skills and tools are needed: | The following skills and tools are needed: | ||
Line 15: | Line 15: | ||
This documentation covers the following areas: | This documentation covers the following areas: | ||
- | * [[#folder_structure|JVx folder structure]] | + | * [[#folder_structure|JVx Folder Structure]] |
- | * [[#project_configuration|Eclipse project configuration]] | + | * [[#project_configuration|Eclipse Project Configuration]] |
- | * [[#application_development|Application development]] | + | * [[#application_development|Application Development]] |
* Client | * Client | ||
* Server | * Server | ||
- | * [[#workscreen|Creation of a work screen]] | + | * [[#create_a_work_screen|Creation of a Workscreen]] |
- | * [[#hypersql|Use of a HyperSQL database]] | + | * [[#create_database|Use of a HyperSQL Database]] |
- | == Folder structure == | + | == Folder Structure == |
- | To develop an application with JVx, a special folder structure is recommended. This simplifies the Build process and separates any dependencies between Client and Server. This structure is to be created as follows: | + | To develop an application with JVx, a special folder structure is recommended. This simplifies the build process and separates any dependencies between client and server. This structure is to be created as follows: |
{{:jvx:folders.png?nolink|}} | {{:jvx:folders.png?nolink|}} | ||
Line 39: | Line 39: | ||
|apps|Contains all available applications. Only one application is contained in this concrete example.| | |apps|Contains all available applications. Only one application is contained in this concrete example.| | ||
|firstapp|Contains the application with project configuration, sources, libraries.| | |firstapp|Contains the application with project configuration, sources, libraries.| | ||
- | |help|Contains the client (GWT) for the online help and help pages.| | + | |help|Contains the client for the online help and help pages.| |
- | |libs|Contains all libraries which are necessary both on the client and the server.| | + | |libs|Contains all libraries that are necessary both on the client and the server.| |
- | |libs/client|Contains all libraries which are only necessary for the client.| | + | |libs/client|Contains all libraries that are only necessary for the client.| |
- | |libs/server|Contains all libraries which are only necessary for the server.| | + | |libs/server|Contains all libraries that are only necessary for the server.| |
- | |src.client|Contains all the sources which are only necessary for the client.| | + | |src.client|Contains all the sources that are only necessary for the client.| |
- | |src.server|Contains all the sources which are only necessary for the server.| | + | |src.server|Contains all the sources that are only necessary for the server.| |
|test|Contains unit tests for the client and server or the libraries.| | |test|Contains unit tests for the client and server or the libraries.| | ||
- | Once the folder structure has been created, copy the library jvxclient.jar to the folder libs/client and the library jvx.jar to the folder libs/server. Both libraries are contained in the JVx binary package. | + | Once the folder structure has been created, copy the library ''jvxclient.jar'' to the folder ''libs/client'' and the library ''jvx.jar'' to the folder ''libs/server''. Both libraries are contained in the JVx binary package. |
- | == Project configuration == | + | == Project Configuration == |
Once the configuration steps have been performed, a new project can be created with Eclipse: | Once the configuration steps have been performed, a new project can be created with Eclipse: | ||
* **File / New / Java Project** | * **File / New / Java Project** | ||
- | * Note that the project has to be set up in the application folder firstapp \\ {{:jvx:newproject.png?nolink|}} | + | * Note that the project has to be set up in the application folder ''firstapp'' \\ {{:jvx:newproject.png?nolink|}} |
- | * **Remove** the src folder from the **Source Folders** \\ **Set** the folders ''src.client'', ''src.server'' and ''test'' as **Source Folder** \\ {{:jvx:newproject_folders.png?nolink|}} | + | * **Remove** the ''src'' folder from the **Source Folders** \\ **Set** the folders ''src.client'', ''src.server'' and ''test'' as **Source Folder** \\ {{:jvx:newproject_folders.png?nolink|}} |
* **Add** the ''jvx.jar'' library, from the project directory ''JVxFirstApp/libs/server'' \\ {{:jvx:newproject_libs.png?nolink|}} | * **Add** the ''jvx.jar'' library, from the project directory ''JVxFirstApp/libs/server'' \\ {{:jvx:newproject_libs.png?nolink|}} | ||
* The project can now be created | * The project can now be created | ||
Line 63: | Line 63: | ||
{{:jvx:project_eclipse.png?nolink|}} | {{:jvx:project_eclipse.png?nolink|}} | ||
- | == Application development == | + | The ''src'' folder can be deleted for consistency as it is not needed in our application. |
- | On the server side, the application needs a configuration file for the settings that only concern the application. For the configuration of the server, an extra configuration file is needed. First we create the file for the application: | + | == Application Development == |
+ | |||
+ | On the server side, the application needs a configuration file for the settings that only concern the application. For the configuration of the server, an extra configuration file is needed. First, we create the file for the application: | ||
* **File** / **New** / **File** - config.xml \\ (created directly in the application folder **JVxFirstApp**) \\ {{:jvx:app_config.png?nolink|}} | * **File** / **New** / **File** - config.xml \\ (created directly in the application folder **JVxFirstApp**) \\ {{:jvx:app_config.png?nolink|}} | ||
Line 89: | Line 91: | ||
^Parameter^Description^ | ^Parameter^Description^ | ||
- | |securitymanager/class|The security manager for verification of the user names/password when logging into the application.| | + | |securitymanager/class|The security manager for verification of the usernames/password when logging into the application.| |
|securitymanager/usersfile|The file with the username/password combinations allowed.| | |securitymanager/usersfile|The file with the username/password combinations allowed.| | ||
- | |lifecycle/mastersession|The class name of the server object which is instantiated when the client performs a login or starts a new MasterSession.| | + | |lifecycle/mastersession|The class name of the server object that is instantiated when the client performs a login or starts a new MasterSession.| |
- | |lifecycle/application|The class name of the server object which is instantiated when the application is first accessed. This object is reused every time the application is accessed.| | + | |lifecycle/application|The class name of the server object that is instantiated when the application is first accessed. This object is reused every time the application is accessed.| |
The server configuration file must be stored in the folder ''../JVxFirstApp/rad/server''. | The server configuration file must be stored in the folder ''../JVxFirstApp/rad/server''. | ||
- | However, the folder does not appear in our Eclipse project because it is at a higher folder level. The configuration file could be created directly in the file system or we can create a folder link in our project: | + | However, the folder does not appear in our Eclipse project because it is at a higher folder level. The configuration file could be created directly in the file system, or we can create a folder link in our project: |
* **File** / **New** / **Folder** \\ {{:jvx:server_link.png?nolink|}} | * **File** / **New** / **Folder** \\ {{:jvx:server_link.png?nolink|}} | ||
Line 112: | Line 114: | ||
</server> | </server> | ||
</file> | </file> | ||
- | \\ | + | The server does not need any special parameters for our application. \\ \\ For the client, we now need a class of type ''javax.rad.application.IApplication''. A standard implementation of JVx is implemented via ''com.sibvisions.rad.application.Application''. We then derive our client from it and thereby create a class in the directory ''src.client'' with the following source code: |
- | For the client, we now need a class of type javax.rad.application.IApplication. A standard implementation of JVx is implemented via com.sibvisions.rad.application.Application. We then derive our client from it and thereby create a class, in the directory src.client, with the following source code: | + | |
<file java FirstApplication.java> | <file java FirstApplication.java> | ||
Line 147: | Line 148: | ||
| | ||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | // Overwritten methods | + | // Overwritten Methods |
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
Line 173: | Line 174: | ||
^Method^Description^ | ^Method^Description^ | ||
|Constructor|The standard constructor cannot be used, as each application is started with a technology-dependent launcher. This launcher is already passed to the application in the constructor.| | |Constructor|The standard constructor cannot be used, as each application is started with a technology-dependent launcher. This launcher is already passed to the application in the constructor.| | ||
- | |createConnection|The communication protocol is initialised. A DirectServerConnection is sufficient for our application, because both the client and the server are started in the same VM. However, if an application server is in use, a HttpConnection could also be used.| | + | |createConnection|The communication protocol is initialized. A ''DirectServerConnection'' is sufficient for our application because both the client and the server are started in the same VM. However, if an application server is in use, a ''HttpConnection'' could also be used.| |
- | |getApplicationName|Sets the application name. This name is needed for the communication with the server, as the latter uses the appropriate application configuration depending on the application name. \\ In our case the application name must be firstapp, because the work directory is also called ''../JVxFirstApp/rad/firstapp/''. The application name MUST always match the directory name!| | + | |getApplicationName|Sets the application name. This name is needed for the communication with the server, as the latter uses the appropriate application configuration depending on the application name. \\ In our case, the application name must be ''firstapp'', because the work directory is also called ''../JVxFirstApp/rad/**firstapp**/''. The application name MUST always match the directory name!| |
It is now time for the first start of the application. To do so, we set up a Runtime configuration: | It is now time for the first start of the application. To do so, we set up a Runtime configuration: | ||
Line 181: | Line 182: | ||
^Parameter^Description^ | ^Parameter^Description^ | ||
- | |Main class|The technology-dependant launcher is defined here. We use the Swing technology for our application and start a Swing application.| | + | |Main class|The technology-dependent launcher is defined here. We use the Swing technology for our application and start a Swing application.| |
- | |Program arguments|The launcher must be told which application to start. For our Swing application, we can use the mechanism of programme arguments and pass the class name of our application.| | + | |Program arguments|The launcher must be told which application to start. For our Swing application, we can use the mechanism of program arguments and pass the class name of our application.| |
The application can now be started and looks as follows: | The application can now be started and looks as follows: | ||
Line 206: | Line 207: | ||
</file> | </file> | ||
- | Any number of user lines can be entered! | + | Any number of ''user'' lines can be entered! |
Now the login to the application works perfectly. However, to fulfill our task, we still need the possibility to display or edit a database table. We will now turn to this part of the task. | Now the login to the application works perfectly. However, to fulfill our task, we still need the possibility to display or edit a database table. We will now turn to this part of the task. | ||
- | == Create a work screen== | + | == Create a Workscreen== |
- | Before we create a WorkScreen, we prepare the application to display the WorkScreen. To do so, we extend our ''FirstApplication'' class as follows: | + | Before we create a workscreen, we prepare the application to display the workscreen. To do so, we extend our ''FirstApplication'' class as follows: |
<file java FirstApplication.java> | <file java FirstApplication.java> | ||
Line 251: | Line 252: | ||
| | ||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | // Overwritten methods | + | // Overwritten Methods |
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
Line 323: | Line 324: | ||
^Method^Description^ | ^Method^Description^ | ||
- | |afterLogin|This method is invoked form the super class after a successful login. We use this method to extend our menu and our ToolBar. \\ \\ It is not necessary to undo our changes after logout as this is done by the super class.| | + | |afterLogin|This method is invoked form the super class after a successful login. We use this method to extend our menu and our toolbar. \\ \\ It is not necessary to undo our changes after logout as this is done by the super class.| |
- | |doOpenDBEdit|This method is called when the Menu or the ToolBar button are selected.| | + | |doOpenDBEdit|This method is called when the menu or the toolbar button is selected.| |
- | |createMenuItem|Provided by the super class to create menu entries. The first parameter contains the name of the method which is to be called when the menu entry is selected. The second parameter contains the command (ActionCommand) which does not play any role in our case. The text of the menu entry is to be defined in the third parameter and, lastly, the image for the entry is passed.| | + | |createMenuItem|Provided by the super class to create menu entries. The first parameter contains the name of the method that is to be called when the menu entry is selected. The second parameter contains the command (ActionCommand) which does not play any role in our case. The text of the menu entry is to be defined in the third parameter, and, lastly, the image for the entry is passed.| |
- | |createToolBarButton|Similar to ''createMenuItem'', except that here a button is created which adjusts itself to the layout of the ToolBar.| | + | |createToolBarButton|Similar to ''createMenuItem'', except here a button is created which adjusts itself to the layout of the toolbar.| |
|UIImage.getImage|Provides a predefined image from the image library of JVx. \\ We use a predefined image for convenience.| | |UIImage.getImage|Provides a predefined image from the image library of JVx. \\ We use a predefined image for convenience.| | ||
- | We now create the client class for our work screen: | + | We now create the client class for our workscreen: |
- | * **File** / **New** / **Class** \\ ''src.client'' \\ ''apps.firstapp.frames.DBEditFrame''\\ {{:jvx:dbedit_new.png?nolink|}} | + | * **File** / **New** / **Class** \\ ''src.client'', ''apps.firstapp.frames.DBEditFrame''\\ {{:jvx:dbedit_new.png?nolink|}} |
- | and use the following Source Code: | + | and use the following source code: |
<file java DBEditFrame.java> | <file java DBEditFrame.java> | ||
Line 357: | Line 358: | ||
{ | { | ||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | // Class members | + | // Class Members |
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
Line 439: | Line 440: | ||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | // Overwritten methods | + | // Overwritten Methods |
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
Line 466: | Line 467: | ||
^Method^Description^ | ^Method^Description^ | ||
- | |initializeModel|Instantiates the objects for access to the server or to data.| | + | |initializeModel|Instantiates the objects for access to the server or data.| |
- | |InitializeUI|Layout of the work screen.| | + | |InitializeUI|Layout of the workscreen.| |
- | |dispose|Ends the connection to the server for the WorkScreen and closes the Frame. The connection must not be explicitely closed, as this takes place fully automatically by the GarbageCollector. This is however not a drawback in our first application.| | + | |dispose|Ends the connection to the server for the workscreen and closes the frame. The connection must not be explicitly closed, as this takes place fully automatically by the GarbageCollector. This is, however, not a drawback in our first application.| |
- | |createSubConnection|We create our own connection to the server. This has the advantage that a separate Lifecycle object is used on the server. This object contains all objects which are needed by the WorkScreen. Once the WorkScreen is closed, the used memory is released. Moreover, each connection can have special parameters and timeouts. The requested Lifecycle object is defined with the class name: ''apps.firstapp.frames.DBEdit''. \\ \\ The class we will create later.| | + | |createSubConnection|We create our own connection to the server. This has the advantage that a separate lifecycle object is used on the server. This object contains all objects which are needed by the workscreen. Once the workscreen is closed, the used memory is released. Moreover, each connection can have special parameters and timeouts. The requested lifecycle object is defined with the class name: ''apps.firstapp.frames.DBEdit''. \\ \\ The class we will create later.| |
^Member^Description^ | ^Member^Description^ | ||
- | |connection|The connection to the server, especially for the WorkScreen. A special communication protocol is used in the background. In our case, it is represented by the class ''DirectServerConnection''.| | + | |connection|The connection to the server, especially for the workscreen. A special communication protocol is used in the background. In our case, it is represented by the class ''DirectServerConnection''.| |
- | |dataSource|The DataSource is independent of the communication protocol and takes care of the data transfer between client and server. The connection defines under which name the server-side object is to be found in the lifecycle object.| | + | |dataSource|The data source is independent of the communication protocol and takes care of the data transfer between client and server. The connection defines under which name the server-side object is to be found in the lifecycle object.| |
|rdbContacts|The model and the controller for data display. \\ The name ''contacts'' defines under which name the server-side business object can be found.| | |rdbContacts|The model and the controller for data display. \\ The name ''contacts'' defines under which name the server-side business object can be found.| | ||
|table|The view for data display.| | |table|The view for data display.| | ||
- | The WorkScreen is now ready and can be integrated in the application. We now implement the missing call: | + | The workscreen is now ready and can be integrated in the application. We now implement the missing call: |
<file java FirstApplication.java> | <file java FirstApplication.java> | ||
Line 504: | Line 505: | ||
^Method^Description^ | ^Method^Description^ | ||
- | |doOpenDBEdit|The method can easily throw a Throwable. All application errors are caught by the application and shown in an information dialogue.| | + | |doOpenDBEdit|The method can easily throw a ''Throwable''. All application errors are caught by the application and shown in an information dialogue.| |
|configureFrame|This method is provided by the super class and ensures that all frames have a similar look. This also includes the menu icon.| | |configureFrame|This method is provided by the super class and ensures that all frames have a similar look. This also includes the menu icon.| | ||
Line 546: | Line 547: | ||
{ | { | ||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | // User-defined methods | + | // User-Defined Methods |
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| | ||
Line 578: | Line 579: | ||
^Description^ | ^Description^ | ||
- | |The class represents a lifecycle object for a session. In our case, a session begins with the login to the application and ends with the logout. There is exactly one instance of this object for each session. This allows objects to be used for the full duration of the login. \\ \\ Thanks to the inheritance of ''apps.firstapp.Application'' it is very easy to use even application objects.| | + | |The class represents a lifecycle object for a session. In our case, a session begins with the login to the application and ends with the logout. There is exactly one instance of this object for each session. This allows objects to be used for the full duration of the login. \\ \\ Thanks to the inheritance of ''apps.firstapp.Application'', it is very easy to use even application objects.| |
^Method^Description^ | ^Method^Description^ | ||
- | |getDBAccess|Opens a new connection to a HyperSQL database, if this has not already happened. \\ \\ The Exception Handling is taken over by the server.| | + | |getDBAccess|Opens a new connection to a HyperSQL database if this has not already happened. \\ \\ The exception handling is taken over by the server.| |
* **File** / **New** / **Class** \\ ''src.server'', ''apps.firstapp.frames.DBEdit'' \\ {{:jvx:lco_dbedit.png?nolink|}} | * **File** / **New** / **Class** \\ ''src.server'', ''apps.firstapp.frames.DBEdit'' \\ {{:jvx:lco_dbedit.png?nolink|}} | ||
Line 602: | Line 603: | ||
{ | { | ||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
- | // User-defined methods | + | // User-Defined Methods |
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
Line 633: | Line 634: | ||
^Description^ | ^Description^ | ||
- | |The class represents the lifecycle object for the DBEditFrame work screen. The objects can only be accessed via the SubConnection of the work screen. \\ \\ Thanks to the inheritance of ''apps.firstapp.Session'' it is very easy to access all Session and Application objects.| | + | |The class represents the lifecycle object for the ''DBEditFrame'' workscreen. The objects can only be accessed via the SubConnection of the workscreen. \\ \\ Thanks to the inheritance of ''apps.firstapp.Session'', it is very easy to access all ''Session'' and ''Application'' objects.| |
^Method^Description^ | ^Method^Description^ | ||
|getContacts|Enables the access to the database table ''CONTACTS''. The method name must match the object name of the RemoteDataBook: ''contacts => getContacts''. \\ \\ The Exception Handling is taken over by the Server.| | |getContacts|Enables the access to the database table ''CONTACTS''. The method name must match the object name of the RemoteDataBook: ''contacts => getContacts''. \\ \\ The Exception Handling is taken over by the Server.| | ||
- | The application is now fully implemented and ready to run. So as to be able to work with the application, we need a database with the ''CONTACTS'' table which we want to access. The configuration of HyperSQL DB is not described in detail in this document, as the examples on the project page are detailed and suffice. In the next chapter, you will find a short summary of the necessary steps. | + | The application is now fully implemented and ready to run. So as to be able to work with the application, we need a database with the ''CONTACTS'' table that we want to access. The configuration of HyperSQL DB is not described in detail in this document, as the examples on the project page are detailed and sufficient. In the next chapter, you will find a short summary of the necessary steps. |
- | == Create database == | + | == Create Database == |
The following steps should take place to create and start a HyperSQL DB. | The following steps should take place to create and start a HyperSQL DB. | ||
Line 660: | Line 661: | ||
file:firstappdb -dbname.0 firstappdb</file> | file:firstappdb -dbname.0 firstappdb</file> | ||
- | == The first application == | + | == The First Application == |
Once the database has been started, the application can also be started. The final application should look as follows: | Once the database has been started, the application can also be started. The final application should look as follows: | ||
Line 666: | Line 667: | ||
{{:jvx:app_finished.png?nolink|}} | {{:jvx:app_finished.png?nolink|}} | ||
- | The Source Code and the Eclipse project can be found in the [[https://www.sibvisions.com/en/jvxmdownload|Download]] section. | + | The source code and the Eclipse project can be found in the [[https://www.sibvisions.com/en/jvxmdownload|Download]] section. |