Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs
-
Upload
markus-scheidgen -
Category
Technology
-
view
21 -
download
0
Transcript of 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
ECMFA 2016: Metamodeling vs Metaprogramming
RESTful Web ApplicationsMetamodeling vs Metaprogramming
Markus [email protected]
@mscheidgen
Frederik [email protected]
Sven [email protected]
@sefftinge
2
ECMFA 2016: Metamodeling vs Metaprogramming
Agenda
■ Model-driven for Web Applications
■ Representational State Transfer (REST)
■ Metamodeling: external DSL
■ Metaprogramming: Active Annotations
■ Conclusions
3
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
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
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
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
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” }
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
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
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
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
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
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
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
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...
}
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...
}
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
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; }}
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
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” }
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
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
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