The Javascript code generator creates a javascript library out of a Java service object model.
Example for a gradle build configuration:
// ------------------------------------------------------
// Javascript API generation
// ------------------------------------------------------
task generateJavascript (type: JavaExec) {
main = 'org.resoa.codegen.CodeGenerator'
classpath = sourceSets.main.runtimeClasspath
// first argument is the folder, containing the resoa service domain jars.
// second argument is the target folder for your javascript API library
// third argument is the path to a xml file with root element JSFunctionList, defining your extended API functionality
args = ['build/libs', 'build/javascript', 'build/resources/main/prototype.function.xml'].toList()
}
The Codegenerator will define /generate the following:
- namespace according to the java namespace. The package name itself will be a self executing function, returning all defined classes.
- javascript class for every java bean
- property and prototype get/set functions for every java bean property of a class
- prototype functions getInstance(), instanceOf(jsonString), isClassProperty(propName)
- additional prototype functions and constructor, specified by a xml file (default prototype.function.xml)
- a type definition class (name is the extension of the java class name by _ClassDef). Use this type to add a default behaviour of your properties in datatables etc. Set JSFunctionList attribute generateClassDef to false, if you don’t need these descriptor types.
- simple minify of the generate javsascrupt library. Set ‘JSFunctionList attribute shrink to false, if you don’t need the .min.js files.
Extend your API by JSFunctionList – prototype.function.xml
Declare additional functionality to your javascript API. Here’s the default file:
<?xml version="1.0" encoding="UTF-8"?>
<JSFunctionList xmlns="http://www.resoa.org/deploy" generateClassDef="true" shrink="true">
<!-- Define additional constructor function with jsonString as parameter -->
<Constructor>
<Code>if (jsonstring != null){var jsonobj = JSON.parse(jsonstring)[this];
if (jsonobj == null)return;for (var p in jsonobj){if (jsonobj[p] != null)this[p] = jsonobj[p];};};</Code>
<Arguments>jsonstring</Arguments>
</Constructor>
<!-- Define additional functions -->
<!-- *************************** -->
<!-- toJSON function: create an Jquery/AJAX read JSON object for a resoa service request. Arguments:
- method: The service method, you like to call
- callback: The name of the callback function if you use JSONP
- priority: the priority, the service request will be handled within the resoa grid
- async: JQUERY Ajax option for synchronized or async request processing -->
<Functions name="toJson">
<Code>var tmp={};tmp[this]=this;tmp.method=method;
if(callback != null)tmp.callback = callback;if(priority != null)tmp.priority = priority;if(async != null)tmp.async = true;
return JSON.stringify(tmp);</Code>
<Arguments>method</Arguments>
<Arguments>callback</Arguments>
<Arguments>priority</Arguments>
<Arguments>async</Arguments>
</Functions>
<!-- fromForm function: Fill an instance out of an HTML form.
Mapping concvention:The HTML form name attribute must be the business object class name, extended by _ and the object attribute name
Argument: the form
-->
<Functions name="fromForm">
<Code><![CDATA[for (var p in this){var fp = form[this + "_" + p];if (fp != null && fp.value != null && fp.value.length > 0) this[p] = fp.value;}]]></Code>
<Arguments>form</Arguments>
</Functions>
<!-- fillForm function: Set values within an HTML form from a service instance
Mapping concvention:The HTML form name attribute must be the business object class name, extended by _ and the object attribute name
-->
<Functions name="fillForm">
<Code><![CDATA[if (form == null)return;if (form.size != null){if (form.size() > 0)form = form[0];else return;}
for (var p in this){if (! this.isClassProperty(p) || this[p] == null || form.elements[this.toString() + "_" + p] == null) continue;form.elements[this.toString() + "_" + p].value = this[p].toString();}]]></Code>
<Arguments>form</Arguments>
</Functions>
<!-- Wrap function for wrapping JSON into a javascript api obejct instance -->
<Functions name="wrap">
<Code><![CDATA[var inst = this.getInstance();if (obj == null)return inst;
for (var p in inst){if (! this.isClassProperty(p) || obj[p] == null)continue;inst[p] = obj[p];} return inst;]]></Code>
<Arguments>obj</Arguments>
</Functions>
<!-- _ClassDef Descriptor type area
**********************************************
optionally generated by CodeGenerator
define descriptor properties, which should be added to javascript types as default
As an example: Add behaviour of a property within a jquery datatable -->
<Properties javascriptType="string" name = "searchable" value="true" />
<Properties javascriptType="string" name = "sortable" value="true" />
<Properties javascriptType="string" name = "defaultContent" value="""" />
<Properties javascriptType="date" name = "eventFunction" value="org.resoa.functions.handleDateString" />
<Properties javascriptType="date" name = "sortable" value="true" />
<!-- You also can define properties for Javascript fields. Use the system generated fieldName as identifier
example: <property fieldName="XSDType_XSDAttribute" name = "visible" value="false" /> -->
<Properties fieldName="Student_id" name = "visible" value="false" />
</JSFunctionList>
js file dependencies and utilities
Check the resoa.services-x.x.x.jar root, here we added relevant javascript files:
- Import the the json.min.js when using auto-generated libraries
Resoa JSON functionality uses XMLGregorianCalendar for date serialization. Check jsutil.min.js, there are utilities like
- JSUTIL.XMLDateToJavascriptDate: Helper function vor date handling
- Hashcode generator functions
- Cookie get/set/check helper functions