metamodeling vs metaprogramming, a case study on developing client libraries for rest apis

24
ECMFA 2016: Metamodeling vs Metaprogramming Metamodeling vs Metaprogramming A Case Study on Developing Client Libraries for REST APIs Markus Scheidgen [email protected] @mscheidgen Frederik Marticke [email protected] Sven Efftinge [email protected] @svenefftinge 1

Upload: markus-scheidgen

Post on 08-Jan-2017

21 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Metamodeling vs MetaprogrammingA Case Study on Developing Client Libraries for REST APIs

Markus [email protected]

@mscheidgen

Frederik [email protected]

Sven [email protected]

@svenefftinge

1

Page 2: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

RESTful Web ApplicationsMetamodeling vs Metaprogramming

Markus [email protected]

@mscheidgen

Frederik [email protected]

Sven [email protected]

@sefftinge

2

Page 3: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Agenda

■ Model-driven for Web Applications

■ Representational State Transfer (REST)

■ Metamodeling: external DSL

■ Metaprogramming: Active Annotations

■ Conclusions

3

Page 4: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

MDD and WEB REST Metamodeling Active Annotations Conclusions

Web Applications4

Endpoints

GWT: Java

Javascript

Cloud Storagee.g. from Google

Hypertext Transfer Protocol (HTTP)

Cliente.g. Web Browser

Servere.g. App Engine

Page 5: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

MDD and WEB REST Metamodeling Active Annotations Conclusions

Web Applications – Horizontal “Platforms”5

Endpoints

GWT: Java

Javascript

Graph Databasee.g. Neo4J

Servlet: JavaRuby JavascriptPython PHP

Document Databasee.g. MongoDB

Cloud Stoagee.g. from Google

SQL Databasee.g. MySQL

Hypertext Transfer Protocol (HTTP)

JavascriptJavae.g. on Android

Objective-Ce.g. on iOS

Dart

Page 6: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

MDD and WEB REST Metamodeling Active Annotations Conclusions

Web Applications – Horizontal “Platforms”6

Endpoints

GWT: Java

Javascript

Graph Databasee.g. Neo4J

Servlet: JavaRuby JavascriptPython PHP

Document Databasee.g. MongoDB

Cloud Stoagee.g. from Google

SQL Databasee.g. MySQL

Hypertext Transfer Protocol (HTTP)

JavascriptJavae.g. on Android

Objective-Ce.g. on iOS

Dart

Page 7: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

MDD and WEB REST Metamodeling Active Annotations Conclusions

Web Applications – Horizontal “Platforms”7

Endpoints

GWT: Java

Javascript

Graph Databasee.g. Neo4J

Servlet: JavaRuby JavascriptPython PHP

Document Databasee.g. MongoDB

Cloud Stoagee.g. from Google

SQL Databasee.g. MySQL

Hypertext Transfer Protocol (HTTP)

JavascriptJavae.g. on Android

Objective-Ce.g. on iOS

Dart

Page 8: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

MDD and WEB REST Metamodeling Active Annotations Conclusions

Web Applications – Vertical “Platforms”8

Endpoints

GWT: Java

Javascript

Graph Databasee.g. Neo4J

Servlet: JavaRuby JavascriptPython PHP

Document Databasee.g. MongoDB

Cloud Stoagee.g. from Google

SQL Databasee.g. MySQL

Hypertext Transfer Protocol (HTTP)

JavascriptJavae.g. on Android

Objective-Ce.g. on iOS

Dart

object.name = “John”

json.put(“name”, “John”);

bean.setName(“John”);

entity.set(“name”,“John”);

{ name : “John” }

Page 9: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

Representational State Transfer (REST)

■ Set of principles for distributed architectures by Roy Fielding

■ Most importantly: stateless server

■ Allows robust, scalable, easy to build and easy to maintain server

■ In practice almost always synonymous with web-services based on HTTP and JSON

■ Examples: Facebook, Twitter, Google+, Youtube, ...

9

Page 10: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

CLIENT

10

GET api.twitter.com/1.1/

statuses/user_timeline.json?screen_name=”mscheidgen”

GET api.twitter.com/1.1/

statuses/user_timeline.json?screen_name=”mscheidgen”&

max_id=”37..3”

200 OK[ { id : 1233364542, text : “Something els”, favorits : 21, retweets = 3, user : { screen_name : “mscheidgen”, name : “Markus Scheidgen”, follower : 1021, ... }, ... }, ... { id : 36462522 text : “Check out the new ...”, ... }]

SERVER

200 OK [ { id : 1233364542, text : “Going to ECMFA; #STAF”, favorits : 21, retweets = 3, user : { screen_name : “mscheidgen”, name : “Markus Scheidgen”, follower : 1021, ... }, ... }, ... { id : 374256453 text : “Check out the new ...”, ... }]

reprsentational

state transfer

Page 11: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

11

REST – How it works

■ Identify resources via URLs: host, path, and parameters

■ CRUD methods, i.e. HTTP’s PUT, GET, POST, DELETE

■ Resource contents is represented platform independently as JSON (or XML)

■ HATEOAS: ideally hyperlinks in resources connect all resources of one service

Page 12: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

REST – Metrics and Flaws

+ HTTP and JSON are platform independent, libraries for most systems and programming languages exist

- HTTP and JSON represent the smallest common denominator for most systems and programming languages

- Loads of platform specific boilerplate code to process HTTP and JSON

- No static types for URL and JSON data, no static safety

12

Page 13: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

REST – Client Libraries13

val request = HTTP.get("api.twitter.com/1.1/"statuses/user_timeline.json")request.queryString("screen_name", "mscheidgen")

val str = request.asString()val jsonNode = JSON.parse(str)val jsonArray = jsonNode.asArray()

for (i:0..<jsonArray.length) { val jsonItem = jsonArray.get(i); println(jsonItem.get("text"))}

val result = twitter.statuses.userTimeline. userId("mscheidgen").xResult() for (item:result) { println(item.text)}

exists?

right type?

is it an array?

exists/right type?

save

Page 14: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

REST – Client Libraries

■ language specific, uses language features, i.e. type safety

■ turns HTTP request/response RPCs into regular method calls

■ comprises

■ a method for each API function

■ a wrapper type for each API resource type

■ Client libraries consist of very canonical, schematic boilerplate code. They are dull, tedious, and error prone to make.

14

Page 15: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

Codethe desired platform code, e.g. a REST client library

Codethe desired platform code, e.g. a REST client library

Code-Generatora tool that processes a metamodel instance to generates code

Code-Generatora tool that processes a metamodel instance to generates code

Platform/Language

Platform/Language

Metamodeling15

Metamodeldefines language constructs,e.g. constructs to define REST request and resource types

Modeluses the given language constructs, e.g. to describe a REST API

Code-Generatora tool that processes a metamodel instance to generates code

Codethe desired platform code, e.g. a REST client library

Metametamodelthe metamodeling language

Code-Generator Language

Platform/Language

Page 16: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

A Metamodel for REST APIs16

method:Methodspath:EString

Request

separator:EString

Parameter

PrimitiveDataType

ComplexDataType

Response

Field

GETPOSTPUTDELETE

«enum»Methods

type 1

response 1{subsets features}

pathPattern:EString

PathParameter

baseURL:EString

REST-API

features 0..*

parameters 0..*{subsets features}

Class

array:EBoolean

Feature

DataType

name:EString

NamedElement

0..* parameters{redefines features} 0..*

dataTypes

0..*requests

QueryParameter

BodyParameter

get request Timeline for “statuses/user_timeline.json”

returns array of Status {query max_id : Stringquery screen_name : String

}

datatype Status {id : Stringtext : Stringfavorits : Integerretweets : Integeruser : User

}

datatype User {screen_name : Stringname : String...

}

Page 17: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

xTend17

@request(path=“statuses/user_timeline.json”, response=@Response(type=Status, isArray=true))class Timeline {

String max_idString screen_name

}

@JSON class Status {String idString textint favoritsint retweetsUser user

}

@JSON class User {String screen_nameString name...

}

get request Timeline for “statuses/user_timeline.json”

returns array of Status {query max_id : Stringquery screen_name : String

}

datatype Status {id : Stringtext : Stringfavorits : Integerretweets : Integeruser : User

}

datatype User {screen_name : Stringname : String...

}

Page 18: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

Metaprogramming xTend – Active Annotations18

@Request(path="statuses/user_timeline.json", response=@Response(type=Status, isArray=true))class Timeline { String max_id String screen_name}

public class Timeline extends AbstractRequest<List<Status>> { @Override public List<Status> xResult() { JSONArray jsonArray = xResponse().getJSONArray(""); List<Status> result = new ArrayList<Status>(); for (int i = 0; i < jsonArray.length(); i++) { result.add(new Status(jsonArray.getJSONObject(i))); } return Collections.unmodifiableList(result); } ...

xTend compiler + RequestClassProcessor implementsRegisterGlobalsParticipantTransformationParticipantCodeGenerationParticipantValidationParticipant

Page 19: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

Active Annotations – Simple Examples19

@AddConstructorclass Customer { private val String id @Accessors(PUBLIC_GETTER, PROTECTED_SETTER) private String name}

public class Customer { private final String id; private String name; public Customer(final String id) { super(); this.id = id; } public String getName() { return this.name; } protected void setName(final String name) { this.name = name; }}

Page 20: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

Metamodeling vs Metaprogramming20

xTend Language

xTend Codee.g. uses annotations to describe REST request and resource types

xTend Compiler

Codethe desired Java code, e.g. a REST client library

Active Annotations Class Processors

Codethe desired platform code, e.g.

Codethe desired platform code, e.g.

Code-GeneratorCode-GeneratorMetamodel

Model

Code-Generator

Codethe desired platform code, e.g. a REST client library

Page 21: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

Beyond REST – Active Annotation and Web21

Endpoints

GWT: Java

Javascript

Cloud Storagee.g. from Google

HTTP

@GWTJavaScriptObject@JSONObject@JavaBean@CloudStorageEntityclass User {

String screen_nameString name...

}

object.name = “John”

json.put(“name”, “John”);

bean.setName(“John”);

entity.set(“name”,“John”);

{ name : “John” }

Page 22: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

Beyond REST – Active Annotation and Web22

class Statuses { @com.google.endpoints.ApiMethod( name=“statuses/user_timeline.json”) @RequestFromEndpoints @ApiMethodMockup List<StatusBean> getTimeline( String screenName, String maxId) { ... }}

@Request(path=“statuses/user_timeline.json”, response=@Response(type=Status, isArray=true))class Timeline {

String max_idString screen_name

}

REST Client Library Request Code

Server CodeMockup Skeletona bare bone implementa-tion for tests

HTTP

Page 23: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

Conclusions

■ Model-driven can be used for Web application development, especially for REST APIs

■ Active annotations can be used like stereotype to extend an existing programming language

■ Active annotation are an internal DSL alternative to custom code-generation

23

Page 24: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs

ECMFA 2016: Metamodeling vs Metaprogramming

Introduction REST Metamodeling Active Annotations Conclusions

Questions24

xTend Language

xTend Codee.g. uses annotations to describe REST request and resource types

xTend Compiler

Codethe desired Java code, e.g. a REST client library

Active Annotations Class Processors

Codethe desired platform code, e.g.

Codethe desired platform code, e.g.

Code-GeneratorCode-GeneratorMetamodel

Model

Code-Generator

Codethe desired platform code, e.g. a REST client library