metamodeling vs metaprogramming, a case study on developing client libraries for rest apis
TRANSCRIPT
![Page 1: Metamodeling vs Metaprogramming, A Case Study on Developing Client Libraries for REST APIs](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/1.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/2.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/3.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/4.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/5.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/6.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/7.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/8.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/9.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/10.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/11.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/12.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/13.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/14.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/15.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/16.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/17.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/18.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/19.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/20.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/21.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/22.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/23.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030305/587125931a28abe4448b6095/html5/thumbnails/24.jpg)
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