SPLASH-DSM'11 Faculté I&C, Claude Petitpierre Bottom Up Creation of a DSL Using JSON Templates An...

Post on 01-Apr-2015

215 views 0 download

Tags:

Transcript of SPLASH-DSM'11 Faculté I&C, Claude Petitpierre Bottom Up Creation of a DSL Using JSON Templates An...

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