This is the reason because Roma (starting from version 2.0.3) supports the Virtual Objects. Virtual Objects are treated just as real Java Objects but they are declared using a descriptor. Now only XML descriptor is supported but in future it could be planned JSON or other ways.
Virtual Objects, in effects, are declared using the same XML Annotation syntax with minor additions to handle field types, inheritance and other stuff that Roma can't know since the XML descriptor is not backed by a real class file.
Cross language
Virtual object's business logic is written inside the
Hot changes high productivity
Virtual Objects are loaded at run-time and reloaded every time the file is saved. This boost up the productivity since it never requires to restart the JVM!
Indeed changing the signature of a class (add and remove attributes and methods) require always the JVM to restart. This is the reason why the Virtual Objects are strongly suggested to being used to build forms to display.
Web IDE
It's planned for the end of 2009 a powerful graphic editor on the Web to change the virtual objects directly from the running application without the need of an IDE.
Not Just Forms
Even though Virtual Objects makes the difference used in the View Aspect, they can be improve the productivity in any Aspect of Roma. Think for example to a service written entirely in Javascript just creating the XML descriptor and annotating it with the Service Aspect.
Below an example of a Virtual Object that extends the Roma's CustomLogin standard POJO used to make the login. Note that by default the language setted is the Scripting Aspect is JavaScript but you can use any language installed using the JSR 223 implementations.
MyLogin.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<class xmlns="http://www.romaframework.org/xml/roma" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
xsd:schemaLocation="http://www.romaframework.org/xml/roma http://www.romaframework.org/schema/v2/roma.xsd" extends="CustomLogin">
<aspects>
<view>
<form>
<area name="main" type="grid" size="1">
<area name="help" />
<area name="fields" type="grid" size="2" />
<area name="actions" type="row" />
</area>
</form>
</view>
<scripting>
me.field("help", "Please insert your account." );
</scripting>
</aspects>
<fields>
<field name="help" type="String">
<aspects>
<view render="html" />
</aspects>
</field>
<field name="additionalCode" type="String">
<aspects>
<validation required="true" min="5" max="5" />
</aspects>
</field>
</fields>
<actions>
<action name="login">
<aspects>
<scripting>if( me.field("additionalCode") == "12345" ) me.parent.login();</scripting>
</aspects>
</action>
<action name="close">
<aspects>
<scripting>org.romaframework.frontend.RomaFrontend.view().close(me.pojo);</scripting>
</aspects>
</action>
<action name="standardLogin">
<aspects>
<scripting>
<![CDATA[
print('Goto standard login...')
org.romaframework.frontend.RomaFrontend.flow().forward("ProjectLogin")
]]>
</scripting>
</aspects>
</action>
</actions>
</class>
In this example the Virtual Object called “MyLogin” makes the following changes to the class CustomLogin that extends:
Add a new field called “help” defined as a String and displayed as HTML on top of all fields (see area definition)
Add a new field called “additionalCode” defined as a String. This field define some validation rules: it's mandatory and the length must be of 5 characters
In the constructor (see the scripting declaration inside the class) the field help is initialized with a welcome message.
The login action is overridden to check if the virtual field “additionalCode” is equals to “12345”. Only in this case calls the super.login(). Not the use of “me.parent” that returns the super class.
Add a new action called “close” to close the form. Note the use of “me.pojo” to return the real POJO in Roma.
Add a new action called “Standard Login” that show the classic Login form.
You can use a Virtual Object such as normal POJO in Roma. To display the Virtual Object just created write:
public void test() {Or just:
RomaFrontend.flow().forward(new VObject("MyLogin"), "screen:popup");
}
public void test() {The final result is the image on top of this post.
RomaFrontend.flow().forward("MyLogin");
}
Enjoy!
Nessun commento:
Posta un commento