Template Based Development Environment
description
Transcript of Template Based Development Environment
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Bottom Up Creation of a DSL Using JSON Templates
An workbench with a novel editor
http://ltiwww.epfl.ch/BUDE
1
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Javascript object
JSON
Generated filesGenerated files
TemplateTemplateTemplateTemplate
Descriptionfile
Descriptionfile
Generated filesGenerated files
Template Based Development Environment
2
ExpansionExpansion
Editor / generatorTemplateTemplate Enhanced object
Specification objectSpecification object
Enhancement
SourceSourceGenerationGeneration
DSLcompiler
DSLcompiler
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
The JSON Objects and the Templates(Introduction)
3
1. JSON expansion
2. Templates
3. Specification object
4. Description file
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
ExpansionExpansion
Principle of the Expansion of the JSON Templates!
4
a: [ {item: "carots", price: 12}, {item: "onions", price: 20}, {item: "spinachs", price: 15} ]
a: [ {item: "carots", price: 12}, {item: "onions", price: 20}, {item: "spinachs", price: 15} ]
{.repeated section a}The price of {item} is {price} RS{.end}
{.repeated section a}The price of {item} is {price} RS{.end}
The price of carots is 12 RSThe price of onions is 20 RS The price of spinachs is 15 RS
The price of carots is 12 RSThe price of onions is 20 RS The price of spinachs is 15 RS
Resulting page
JSON description
Template
http://json.org
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Template Commands
{name}
{.section name} {.or}
{.end}
{.repeated section name}{.or} {.alternates with}
{.end}
{.include "filename"}
5
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
JSON (Javascript) Objects are recursive
6
{ create : { id : "customer", inputVar : "customerName", attributes : [ { intAttribute : { varName : "number" } } ] } [ . . . ] array} { . . . } object
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Empty Attribute: conditional generation
7
{ create : { id : "customer", selector: { }, inVar : "cName" }}
{.section selector} String {inVar};{.end}
{ create : { selector: { id : "customer", inVar : "cName" } }}
// same code generated// with both objects
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Ordered Sequence
8
attributes : [ { stringAttribute: { varName : "name" } }, { intAttribute: { varName : "number" } } ]
public class Customer { String name = ""; int number = 0;}
{.repeated section attributes} {.section intAttribute} int {varName} = 0; {.end} {.section stringAttribute} String {varName} = ""; {.end}{.end}
ExpansionExpansion
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Other Example
9
dataTables : [ { id : "customer", attributes : [ { stringAttribute: { varName : "name", finder: { } } }, { intAttribute: { varName : "number" } } ], relationships : [ { OneToMany : { to : "confirmedOrder" } } ] }
public class Customer { String name = ""; int number = 0;
public static findByName(String name) { query = "select * from customer where name='"+name+"'"; result = execute(query); }
@OneToMany public Collection confirmedOrder;}
Result of the expansion
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Generation of an Application (requires a set of files)
10
{ dataTables: [ { id : "customer", inpVar : "custName" } ]}
{ dataTables: [ { id : "customer", inpVar : "custName" } ]}
aaa bbb abcd cccddd
aaa bbb abcd cccddd
aaa bbb abcd cccddd
aaa bbb abcd cccddd
aaa bbb abcd ccc ddd
aaa bbb abcd ccc ddd
class Customer { String customerName;}
class Customer { String customerName;}
ExpansionExpansion
{.section create} class {Id} { String {inpVar}} {.end}
{.section create} class {Id} { String {inpVar}} {.end}
File description
foreach dataTables expand "dataTemplate.java" to "src/data/"+Id+".java"
for whole expand "taskTemplate.java" to "src/data/Task.java"
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Our Enhancements to the Specification Object
11
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Computation of the Object Arguments
12
TemplateTemplate
Generated files
ExpansionDescriptionfile
Extended specification objectExtended specification objectTemplates
Generated files
Specification objectSpecification object
Enhancement
Computations are made in the specification object, not in the templates
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Computation of Object Arguments
13
{ create : { id : "customer", Id : "Customer",
inputVar : "customerName", InputVar : "CustomerName",
attributes : [ { intAttribute : { varName : "number" }, _index : "0" } ],
myObject : "CUSTOMER_NAME" }}
{ create : {
id : "customer",
inputVar : "customerName",
#attributes : "dataTables[customer].attributes",
#myObject : "myMethod(inputVar)"}
uppercase {equals (id, inputVar)}
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
BUDE: an Eclipse Plugin
14
Double-click: selection of a file
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
BUDE
15
selectionmarked if found
highlighted if error
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Scope of the approach
• Intra-file levelduplication of parts such as menus and sub-menus in a GUI
• Application levelduplication of files and repetitive components within the files
• Architecture levelextension of an application, creation of another
application from a set of predefined components
16
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
More Examples
17
1. Tutorial , tutorial file
2. Menus and submenus in a GUI (intra-file)
3. General Ressort (application level)
4. The DSL compiler itself
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
2) Menus of a GUI
18
private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JMenuBar GUIMenuBar = null;
{.repeated section menus} private JMenu j{id}Menu = null; {.repeated section items} private JMenuItem j{itemId}Item = null; {.end}{.end}
{ menus : [ { id : "Files", items : [ { itemId: "Load" }, { itemId: "Save" } ] } , { . . . } ]}
ExpansionExpansion
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
TaskTask
3) A Workflow: Company General Ressort
19
Customer name
Customer record
Customer part id
Part record
Confirmed order
Customer order
(paper)
found
create
found
create
enter
enter
createR
not
not
PreconditionsPreconditions(work with A.Wegmann and B.Bajic)
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Implementation
x
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
List of the Entity Names
21
roles actions temporary variables data tables
secretary enterCustomerName customerName Customer
findCustomer customerPartId name
createCustomer number
enterCustomerData Part
enterCustomerPartId partID
findPart ConfirmedOrder
engineer createPart comment
enterPartData ManyToOne customer
ManyToOne part
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Specification Object
22
{ application : { version_id : "memory", memory: { }, database : "test", username : "" }, dataTables : [ { id : "customer", attributes : [ { stringAttribute: { }, varName : "name", finder }, { intAttribute: { }, varName : "number" } ], relationships : [ { OneToMany : { to : "confirmedOrder" } } ] }, { . . .
actions : [ { enterAndFind, inputVar : "customerName", #insert : "dataTables[customer]" precondition : [ { stringNotAvailable : "customerPartId" } ] }, { create, inputVar : "customerName", #insert : "dataTables[customer]", transfers : [ { fromAttribute : "customerName", toAttribute : "name" } ], precondition : [ { stringAvailable : "customerName" }, { recordNotAvailable : "customer" } ], #enterAttr : "setSubtract(attributes,\"varName\" ,attributes,\"finder.varName\")" }, { . . .
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Specification Object: Continuation
23
roles : [ { id : "secretary", roleActionList : [ { #enterAndFind : "actions[enterAndFind.customer]" }, { #create : "actions[create.customer]" }, { #enterAndFind : "actions[enterAndFind.part]" }, { confirmed : { #dataTables : "dataTables" } } ] }, { id : "engineer", roleActionList : [ { #create : "actions[create.part]" } ] } ]
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Architecture
24
HomePage.jsp
createIdRecord.jsp
logicData.java
enterInputVar.jsp
EnterIdData.jsp
IdRole.jsp
Manager.jsp
jump to
calls
logicServlet.java
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Description File
25
output directory ".." // relative to the directory of this file
uppercase {equals (id, tableName, inputVar, varName, to)}
foreach dataTables, application expand application.version_id + "/Customer.java" to "src/data/"+Id+".java"
for whole expand application.version_id+"/Task.java" to "src/data/Task.java"
for whole expand "business/LogicServlet.java" to "src/business/LogicServlet.java"
for whole expand "business/LogicData.java" to "src/business/LogicData.java"
foreach roles, actions, dataTables expand "WebContent/SecretaryRole.jsptmpl" to "WebContent/"+Id+"Role.jsp"
for whole expand "WebContent/ERP.jsptmpl" to "WebContent/ERP.jsp"
foreach actions where enterAndFind != null expand "WebContent/Enter.jsptmpl" to "WebContent/Enter"+InputVar+".jsp"
foreach actions where createRecord != null expand "WebContent/CreateRecord.jsptmpl" to "WebContent/Create"+Id+".jsp"
foreach actions where create != null expand "WebContent/EnterData.jsptmpl" to "WebContent/Enter"+Id+"Data.jsp"
for whole expand "WebContent/Manager.jspTmpl" to "WebContent/Manager.jsp"
for application, dataTables where JPA!=null expand "JPA/persistence.xmlTmpl" to "src/META-INF/persistence.xml"
copyfile "WebContent/web.xml" "WebContent/WEB-INF/web.xml"copyfile "JPA/Manager.java" "src/weblangUtils/Manager.java"copyfile "SQL/DBConnection.java" "src/weblangUtils/DBConnection.java"copydir "lib" "/WebContent/WEB-INF/lib"
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
4) DSL : tables
26
dataTable customer { finder string name; int number; OneToMany to confirmedOrder}dataTable part { finder string partId; string grPartInfo; OneToMany to confirmedOrder}dataTable confirmedOrder { string comment; ManyToOne to customer ManyToOne to part}
dataTables : [ { id : "customer", attributes : [ { stringAttribute, varName : "name", finder }, { intAttribute, varName : "number" } ], relationships : [ { OneToMany : { to : "confirmedOrder" } } ] }, {
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Creation of the DSL
27
Specification Object
Specification Object
Linear ObjectLinear Object
DSL Template
DSL Template
SourceSource
ASTAST
CompilerCompiler
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Compiler – JavaCC(generated by templates)
28
{ "attributes" "{" ( // guarded object obj = stringAttributeProd()
{ ((JSONObject)obj).names.add(0,"stringAttribute"); ((JSONObject)obj).objects.add(0,new Highlight()); }
{ attributes.put(obj); } | obj = intAttributeProd()
{ ((JSONObject)obj).names.add(0,"intAttribute"); ((JSONObject)obj).objects.add(0,new Highlight()); }
{ attributes.put(obj); } )+ "}" { return attributes; }}
optimisation of the language
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
actions { enterAndFind { inputVar customerName table customer precondition { stringNotAvailable customerPartId } } enterAndFind { . . . } create { inputVar customerName tableToCreate customer transfers { from customerName to name; } precondition { stringAvailable customerName recordNotAvailable customer } } create { . . . } createRecord { . . . }}
General Ressort DSL: actions and roles
29
roles secretary { enterAndFind customer enterAndFind part create customer createRecord confirmedOrder } roles engineer { create part }
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Remarks About the Approach
30
• The description file provides the list of all the kinds of components and defines thus the architecture
• The specification object gives the customer's view
• The templates implement the platform view
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Generation of Web Applications
• RAD tools: Eclipse/WTP, Ruby on Rails, Spring Roo, Tutorials (quick start + copy and paste)
• Successful former experience with WebLang
• A Web application built with our approach and using either SQL, JPA, JSF or PHP from the same object
31
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Conclusions
• The approach only uses elementary statements (like if then else or inherit)
• No specific library or package required – only (visible) templates
• Templates have been pulled out of the RAD tool and transferred into the developer's space
• These templates are highly customizable and reusable
32
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Conclusion's Conclusion
• Programming languages have been developed layer after layer: Modula, Java, Scala (procedure, object, inheritance, genericity, annotations)
• A simple version of DSM can be developed from the JSON templates and make a greater leap forward
33
SPLASH-DSM'11 Faculté I&C, Claude Petitpierre
Demo ?
(Eclipse/TutorialExample)
34