What To Know About Java Licensing Changes


Java LogoOracle (the owner of Java) announced that, starting April 2019, the popular Java version 8 would no longer receive any updates; and that Java version 11 (and later) would only be available for commercial “subscribers” (with a required annual fee). Since Oracle’s version of Java has been the one most prominently available for download, it is extremely likely that the version of Java installed on your/your users/your clients systems is Oracle’s edition. Oracle’s changes may require you to change, or license, the version of Java you have installed.

Java was developed in 1991 at Sun Microsystems with the programming principles of “Simple, Robust, Portable, Platform-independent, Secured, High Performance, Multithreaded, Architecture Neutral, Object-Oriented, Interpreted and Dynamic”. Its primary objective was to be a portable, simple, and secure programming language. Since its introduction, Java has become one of the most widely adopted programming languages, used by over 9 million developers and running on 7 billion devices worldwide. Part of its popularity can be traced to the fact that it has been open source software since 2006; however, in 2018 Oracle announced a series of licensing changes that has implications for all users of Java. Revelation Software uses Java as the programming language for its Engine Server and Telnet Server functionality, and so these changes may impact you and your clients/companies as well.

In order to potentially simplify the management of Java for our users, OpenInsight version 10.0.8 and later will include the OpenJDK JRE for Java (currently version 11); users can choose to allow the OpenInsight 10 installer set up this version of Java on their server system, or the installer can leave the JRE unconfigured if the user wishes to use a different solution for Java as described below.

To explain further, your options now include:
– Contracting with Oracle for a commercial annual license: This will include support and updates. For larger corporations, this may be a suitable solution;
– Switch to one of the remaining open source providers of Java (with or without paid support), known as OpenJDK: This is the recommended solution for customers who do not wish to contract directly with Oracle, and can be automatically installed via the OpenInsight 10 installation process;
– Remain on the (no-longer-supported) Java version 8: Since this has reached the end of Long Term Support, this option may potentially leave you/your users/your clients vulnerable to security issues that may arise in the future. This is not usually recommended.

For additional explanations of the licensing changes, and the various options (including URLs for downloads), please read this:

https://docs.google.com/document/d/1nFGazvrCvHMZJgFstlbzoHjpAVwv5DEdnaBr_5pKuHo/preview#

OpenJDK providers include Linux distros, AdoptOpenJDK, Amazon, Azul, BellSoft, IBM, jClarity, Red Hat, SAP, and others; versions of OpenJDK Java can be downloaded from any of these sources. For example:

https://adoptopenjdk.net/
https://aws.amazon.com/corretto/
https://access.redhat.com/documentation/en-us/openjdk/8/html/openjdk_8_for_windows_getting_started_guide/getting_started_with_openjdk_for_windows

Originally written by Bob Catalano, Revelation Software Inc. and published to www.revelation.com

 

Lots of data to capture in a single form? OpenInsight 10 has the prefect solution.


PropertyGrid1I occasionally have people ask me about user interface design from an end user’s point of view and mostly this is when a developer is tasked with capturing a very large amount of data, needing lots of controls, in one logical place.

Often, it is possible to break up the required data into bite sized chunks, or to categorise it somehow and then present their data controls as a smaller subset on two or more forms.  Sometimes, probably more often than not, it makes sense to break up the form using the tab control and display these subsets of data controls over multiple pages.  This is something that I have done a lot in my demo applications.

However, I am told that this is not always possible and I have seen data entry forms with hundreds of controls, split over countless tabs.  I recently heard of one OpenInsight based system where a control limit had been reached, forcing a rethink of how the data was to be presented to the end users.

Now, I am currently working on a ‘real world’ application that also demands that, on several of the data entry forms, I need to be able to display and capture hundreds of data fields.  For the form that I am currently working on, this means nearly 400 hundred data items and this translates to well over double that number of controls to be maintained on the form.  AND, I can find no logical way to split these controls over multiple forms 😦

A form with this number of controls means that I had a massive tab control and a form running over 20 or more pages.  From a developer’s point of view, this results in a very cumbersome form to manage and maintain at design time.  For example, how would I easily add in new data prompts without having to spend a large amount of time moving controls around to make the new items fit my already crowded forms?   Worse still, it resulted in a very difficult to navigate form for my users.  Yes, they could probably learn where everything is over time, but in the interests of providing my users with an intuitive display from day one and a far easier to navigate user interface, I had to find another method.

So, following a quick prompt from Carl, I took a look at the brand new Property Grid control in OpenInsight 10.  This is not yet data aware (and I’m not sure of any plans to make it data aware), so there is a code to be written behind the scenes for my use of the control, but it was definitely the perfect solution.

So what did I build to get over this large number of controls issue?

PropertyGrid2

As you will see in the data entry form above, I have managed to reduce the tab count to just 12 tabs.  Although this is still quite a lot, they make sense because most of these will be displaying related data from other data tables.  For example, a list of actions to be undertaken or that have been completed with dates, status and notes, or viewing details.  These will be largely edit tables, one on each tab.

The main tab reduction was achieved through the use of the Property Grid, displayed on the right of the form.  When the user is on the Summary tab (shortly to be renamed), the property grid maintains a few hundred property details that were originally split over numerous tabs.  This data is now displayed in a easily navigable, collapsible, categorised list, enabling the user to show and hide data as required.

When designing the Property Grid, the OpenInsight developer is presented with 29 pre-defined control options that are embedded in the new control.  Things like Dialog, Static and colour pickers, right through to combo boxes, file pickers and more.  The user’s choice is then displayed in the grid and it is pretty easy to them pick up those values and save them to the database.  It is also super quick and easy to add in new data items and to have them display under the correct category.

The Property Grid control is fully documented in the ‘OpenInsight 10 Presentation Server Reference Manual’, but writing data to a cell in the grid is just one line of code.  In the example below, valPropertyStatus contains the data to be written and “Property Status” is simply the name that you have defined in the Property Grid row when you built out the various rows.  It really is that easy, no messing around trying to work out in code which cell or row you are in, you simply use an ‘English’ name.

 Call Set_Property_Only ( CtrlEntID, "VALUE", valPropertyStatus, "Property Status" )

Now, as I might have mentioned earlier, the Property Grid is not yet data aware, so you will need to get these data changes and write them to the data record yourself.

However, I have taken a slightly different approach.  I am not a professional OpenInsight application developer, so I in no way suggest that this method is right and proper but it works for me.

As shown in the image below, I wanted to have collector windows for ‘each’ of the data items in the grid.  This enables me to provide my users with a consistent and easy to navigate solution.  It enables me to present my users with all manner of data controls in easily built and maintained collector (dialog) windows.  In the example below, when the user clicks on the Vendor cell (a button displays), the user is presented with a collector window with, not only the vendor’s name, but also their contact information.  This includes the email address and if the user clicks the blue text, OpenInsight will open up the user’s default email client and drop in the vendor’s email address.

PropertyGrid3

You will notice that the orange Record ID box displays the Record ID.  This will be made invisible for the beta, but it is displayed for development purposes at the moment.  This Record ID is passed to the collector window from the calling window and the record is automatically read and displayed for editing.  When the user has made their changes, the data is immediately written to the record.

When the data is saved and the collector window is closed, the Property Grid is updated to display the new value, or values.  In the case of a collector window with multiple data items, I have chosen the best piece of data to display.  In the example above, this is the Vendor’s name.  In some other instances, I have used three dots (. . .) to indicate that there is data to be viewed.  This solution is used when no single data value works.

A nice, easy and good looking solution.  

Now, those of you that are professional developers and observant, will have noticed a flaw in my design.  If I am passing in a record ID, what is to stop the user from saving a value from the Property Grid without a valid Property Record?  This could quickly result in useless data – property characteristic details without a property address and other meaningful data to readily identify the property,

This issue is addressed by simply checking for a valid record on file when the Property Grid is accessed. If there is no record yet saved to file or it does not meet my requirements of having a valid address, access to the Property Grid is blocked, a message is displayed and the message and collector window closes when the user clicks the message’s OK button.  i.e. the user cannot add data to the grid without a valid record being already saved to disk.

PropertyGrid4

Yes, the method that I am using is a little more complicated than just allowing the user to change the data in the Property Grid and have that data saved when the main save button is pressed.  And, I’ll probably allow that as an option further down the line.  However, I’m pretty pleased with this solution and it is definitely making it easier to develop and use my application.

Oh, and for those of you that think creating and maintaining many collector windows is long winded and time consuming, this is actually pretty quick and easy.  I simply:

  1. Use a template window – So, Open and Save As.
  2. Use a template Commuter Module which prompts me for certain bits of information which are dropped into the code automatically and then this is compiled and saved.
  3. Test run the window and add any additional event code that might be needed.

I am not saying that this is the right, recommended or perfect solution but if you would like to see this in more detail please comment below and I’ll look to put a video together with a look at the Property Grid working and the code used behind the forms.

 

How To Deploy OpenInsight 10 To Your Customers


How To Deploy OpenInsight 10 To Your Customers

didyouknowoi

Deployment in OpenInsight 10 is significantly different from prior versions.  Because system information is now encrypted on a per-system basis, you must tell the copy of OpenInsight 10 that you are changing the serial number (which is used in the encryption process) ‘before’ you change it.  Failure to do this will result in a system that cannot be accessed (until you put the original serial number back into the system).

The steps to making a deployment as you want are as follows:

  1. Request, and receive, the new authorisation code from Revelation Software with the new serial number and new number of users.
  2. In your “master” OpenInsight 10 system, in SYSPROG, go to the Settings/Users/Policy Setup menu choice in the IDE.
  3. In the policy configuration window, check the box “System Deployment Preparation” and press the OK button.
  4. In the Serial Number Entry dialog that appears, enter (and re-enter to verify) the new serial number you obtained from Revelation Software and press the OK button.
  5. Remove or change as appropriate the REVPARAM file from the cloned copy of OpenInsight before deployment.
  6. Clone your copy of OpenInsight.

On the client system, your steps will be as follows:

  1. Copy in the cloned copy of OpenInsight.
  2. Update the license information with the new authorisation code/serial number/number of users (see below).
  3. Run the clientsetup.exe routine found in your OpenInsight 10 folder.

At this point, your client’s copy of OpenInsight should be ready to run.

To update the license information, you have two choices.  In the cloned copy of OpenInsight, you can start up the system with your ‘original’ authentication (just by starting up OpenInsight normally), and then go to the Settings/Application Settings menu in the IDE, and choosing “License Renewal”.  You will be prompted to enter the new authorisation code, and (after confirming that the entered information is correct) you can save the new authorisation information, shut down OpenInsight, and restart OpenInsight.  You’ll find that the system is now running with the new serial number/number of users.

Alternatively, if you wish to ship out systems without your authorisation file in it, you can use the (non-GUI) routine to create the new authorisation file.  This step can be done on your ‘master’ copy of OpenInsight, before deployment to the client system.

Open up a DOS command prompt, and “cd” to your OpenInsight 10 folder.  Type in the following:

REVAUTH OI <authcode> CLIENT.LIC

Where <authcode> is replaced with the authentication code you received from Revelation Software (which I believe you can put in quotes).  So for example, you will type something like this:

REVAUTH OI "xxxxx-xxxxx-xxxxx-xxxxx-xxxxx-xxxxx" CLIENT.LIC

If there are any errors, revauth will respond with “Invalid code entered: <errcode>”. Otherwise, it will create a valid license file named CLIENT.LIC.  Take that CLIENT.LIC file, and copy it into your “cloned” system, RENAMING IT TO REVENGINE.LIC.  This will then become the license/authentication information for the “cloned” copy, and you should then be able to install that copy as outlined above.

Please remember to run the clientsetup.exe after copying in the cloned copy.

First published on www.revelation.com

New Create User Details function


RTI_CREATE_USER_DETAILS function for OpenInsight 10.0.5 and above.

didyouknowoi

OpenInsight 10 provides support for login policies including locking out of users after a definable number of unsuccessful attempts, password construction requirements, etc. Sensitive data for policy and user information is stored in AES encrypted records.  Policies and users are maintained via the OpenInsight 10 IDE.

OpenInsight 10.0.5 and above introduces a new function called RTI_CREATE_USER_DETAILS that allows developers the ability to create a new user or modify information about an existing user in the OpenInsight database.

Description: Creates a new user or modifies information about an existing user in the current database.

Note:  Only Level 1 (Administrator) and Level 2 (System Administrator) users can create users. Level 0 (User) users can only change their own, existing information.

Syntax: RTI_CREATE_USER_DETAILS(userID, currentPwd, userpassword, fullName, validValue, disabledFlag, disabledDate, disabledTime, resetFlag, userType, userLevel, o4wLevel, expirval, expirdate, errDetails)

Return: “1” if the create or edit succeeded
Value: “” or “0” if the create or edit failed, and additional details are returned in the errDetails parameter.

Parameters: The function has the following parameters.

ParameterDescriptionParameterDescription

Parameter Description
userID A user identifier. userID must begin with an alpha character, followed by any combination of characters, digits, and underscores and cannot include spaces.
currentPwd If enhanced authentication is enabled on this OpenInsight system, then a User-level user who wishes to change any user information must pass in the current password in this parameter. This allows the system to verify that they are authorised to make changes to this user information.
userpassword The new password for this user. If enhanced authentication is enabled, then the password must match the specified authentication policy. If legacy authentication is used instead, the password must be a string of characters, 6 to 20 characters in length, and – if not specified – the default is null, and a password is not required to access the database as this user.
fullName The full name of the user.
validValue This is a user-defined parameter that allows the developer to specify additional information that they would like returned if the user’s logged-in state is queried (for example, to implement additional permission levels and groups). By default, this value is “1”.
disabledFlag If enhanced authentication is enabled on this OpenInsight system, then if set (value is “1”), the user will be disabled; if it is reset (value is “0”), the user will no longer be disabled. If the user is disabled, pass in the additional disabledDate and disabledTime parameters.
disabledDate If enhanced authentication is enabled on this OpenInsight system, and the disabledFlag has been set, this parameter specifies the internal date that the user is disabled until.
disabledTime If enhanced authentication is enabled on this OpenInsight system, and the disabledFlag has been set, this parameter specifies the internal time that the user is disabled until.
resetFlag If this parameter is set (“1”), the user must reset their password at the next login.
userType If this user should only be allowed to access the OpenInsight desktop interface, specify “0” for this parameter. If this user should only be allowed to access OpenInsight via O4W, specify “1” for this parameter. If the user should be able to access both desktop and O4W instances, specify “2” for this parameter.
Userlevel If the user is defined as an OI user, or as both an OI and O4W user, specify the OI permissions level here. There are three levels of users. When the user is logged in, the value is stored in the system variable @ADMIN.

There is no default value for Userlevel. If you do not specify a value, execution fails, and an error is generated.

Value Description
0 User
1 Administrator
2 System Administrator
o4wLevel If the user is defined as an O4W user, or both an O4W and OI user, specify the O4W permissions level here. The valid values for O4W permission groups are customisable on a per-site basis.
expirval Expiration parameter for the password. Possible values are:
Value Description
0 Expires at next login
1 Never Expires (default)
2 Expires at the expiry date
expirdate If expirval = 2, the expiration date (passed as a standard output converted date in a format such as mm/dd/yyyy).  Only required if expirval = 2. Note that this value is only relevant when legacy authentication is used on the OpenInsight system; if enhanced authentication is enabled, expiration will be as per policy.
errDetails If any errors are encountered during the execution of this function, they are returned in this parameter.

 

Starting the Presentation Server


didyouknowoiWhile most of an application’s configuration information is stored in various application database records, there are some startup options that need to be determined before the actual database can be accessed (i.e. before the OpenEngine virtual machine is loaded).

The Presentation Server can be configured with a wide range of options at startup, via means of an RXI configuration file, and/or a set of command line switches.  Both methods support nearly all of the same options, but any option specified by a command line switch always overrides the same option specified in the configuration file.

Presentation Server configuration (RXI) files

There are nearly twenty options that can be applied when starting the Presentation Server and adding these as switches to a command line shortcut can be a tedious and error-prone exercise. In order to remedy this, it is possible to create an RXI (Revelation Xml Ini) file to store these options instead, where they are read and parsed by the PS during its boot-up sequence.  Read On…

Modernising the writing, debugging and management of Symbolic Code – Scheduled for OI 10.0.4.


youtubeoi10-e1529069260513.pngI was recently working on a new application and I came across an issue with one of my symbolic dictionary items.  The code was pretty simple, but not being a professional developer, I just could not see what the issue was.

Now, I would usually have dropped in a simple debug statement to see what variables were being set when and with what values.  This would have quickly told me where I had gone wrong in my code.  So, I dropped a Debug statement into my symbolic code, saved the table, ran the form and we dropped into the debugger.

Alas, no variable information is displayed in the debugger for the symbolic code and I was none the wiser for my efforts.  Back to the very simple Symbolic Code editor and I had to work things out for myself.  With only three lines of code, I actually managed to find the error pretty quickly, but just imagine if that was a 100 lines of code, a thousand lines of code or more – yes I have seen this on more than a few occasions.

I was talking to Bob Carten during one of our exploratory and (for me) learning sessions and I mentioned how difficult the symbolic editor is to work in.  He laughed and asked if I’d be interested in a new feature coming in OpenInsight 10.0.4 and which specifically addressed my issue.

In fact, Bob told me excitedly that this new method of writing symbolic code, opens up a whole host of other possibilities.  He touched on them, but I am afraid that he quickly left me scratching my head.  For example, why would you want to have a three part conversion, at least that’s what I think we were talking about?  Anyway, that’s for another time.

For now, you can see this new technique in my latest OI10 Quick Start Video which has just finished uploading to my YouTube channel.

Elegant debug statements


youtubeoi10.pngI recently uploaded an OpenInsight 10 lesson and at the beginning of the video I talk about a rogue debug statement that I had left in my code in the previous video (on purpose you understand).

Mark Marsh (Professional OpenInsight Application Developer) emailed me with an extremely useful tip to using debug statements in code and which will avoid the issue and embarrassment of leaving a rogue debug statement in your code.  It is also great for those of you with OpenInsight development teams because the trick is user specific.

I’d like to offer Mark a huge thank you for sharing this invaluable tip with me and for enabling me to then share it with you.

You can see the video here and the tip is in the video comments – it’s well worth a look.