Our generic REST interface of JVx got an update.
The REST services are a powerful feature of JVx and built-in. Usually you would implement your own REST services, but JVx has the concept of lifecycle objects and the powerful action mechanism. It would be ugly to implement another layer on top of JVx just for REST services. This is a framework feature.
We had this powerful feature for a long time and it is still in use for different use-cases:
AngularJS 4 with VisionX and JVx REST services
AngularJS with JVx in action
Our REST interface just works and you are able to create microservices very fast and efficient.
But the interface has a problem with some kind of parameters because they are also generic. Suppose you have the following method:
public IFileHandle createReport(ICondition pFilter, SortDefinition pSort)
The result type (IFileHandle) isn't a problem because JVx will send the bytes in the REST response, but the parameters: pFilter and pSort are specific types and not base types like String, Array, int, float.
It wasn't possible to call such methods without wrapper methods like:
public IFileHandle createReport(String pFilter, String pSort)
{
return createReport(createCondition(pFilter), createSort(pSort));
}
Still not hard to solve, but parsing the filter and sort definition weren't trivial tasks. In fact, it was annoying.
We now have support for such parameters and much more. It's not super modern but an awesome solution!
Assume you have following code in one of your lifecycle objects:
public DBStorage getAdrData
() throws Throwable
{
DBStorage dbs
= (DBStorage
)get
("adrData");
if (dbs
== null)
{
dbs
= new DBStorage
();
dbs.setDBAccess(getDataSource());
dbs.setWritebackTable("ADDRESS");
dbs.open();
put("adrData", dbs);
}
return dbs;
}
The DBStorage class offers a public method:
public IFileHandle createCSV(String pFileName, String[] pColumnNames, String[] pLabels,
ICondition pFilter, SortDefinition pSort) throws Exception
This method creates a CSV report (address data in this example). It has some parameters for the expected filename, optional column names which should be used for the report, optional labels for the column names, the filter condition and sort definition.
To call this method as REST service, simply send a post request with following information:
e.g. URL:
http://localhost/jvx/services/rest/demo/Address/object/adrData/createCSV
(demo is the application name, Address is the lifecycle object name, adrData is the object name)
Body:
["test.rtf", null, null,
"{j:new LessEquals('NR', 10)}",
"{j:new SortDefinition(new String[] {'NR', 'STAIR'}, new boolean[] {true, false}}"]);
The body contains Java Code (in the JSON string).
W00t?
JVx got support for executing simple Java code. We introduced the new utility class SimpleJavaSource. It's a backport from our commercial product VisionX. The SimpleJavaSource is able to execute the given parameters and creates real Java objects. It doesn't support conditions or loops, so it's really simple - but powerful!
With our new SimpleJavaSource and the support for parameter Code, it'll be possible to call most methods without additional wrapper methods.
The SimpleJavaSource class is now included in JVx and ready to use. It's simple but powerful:
SimpleJavaSource ssj
= new SimpleJavaSource
();
ssj.
addImport("javax.rad.model.condition.*");
String sEqualsCode = "new Equals('ID', 0).or(new Like('NAME', '%john%'))";
ICondition cond = (ICondition)ssj.execute(sEqualsCode);
The new features will be available with our next JVx release and are already available via nightly builds.