xml technologies for restful services development
DESCRIPTION
WS-REST 2011. Second International Workshop on RESTful Design. Chairs: Cesare Pautasso, Erik Wilde, Rosa Alarcon.Frameworks Session. Cornelia Davis and Tom MaguireTRANSCRIPT
![Page 1: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/1.jpg)
1
XML Technologies for RESTful Services Development
Second International Workshop on RESTful Design March 2011 Cornelia Davis Senior Technologist Office of the CTO EMC Corporation
![Page 2: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/2.jpg)
2
Motivation Drivers for this work at EMC
� Goal: Establish an integration architecture that will help EMC bring together its own and partner products.
� We’re basing it on REST because:
– In order to get some standardization the principles need to be easy – The environment is by definition highly distributed and potentially very large and
increasingly in the cloud – Product groups are all building RESTful interfaces – Resource focus
§ With media-type handling § With hyperlinking § With caching
RESTful SOA
![Page 3: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/3.jpg)
3
Agenda
REST Principles
Implementing RESTful services
What’s next?
![Page 4: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/4.jpg)
4
REST Principles
REST is an architectural style that depends upon: Identification and addressiblity of resources
– All interesting bits of information are identified with URIs and are usually accessed via URL
The uniform interface – Interaction with resources through a standardized set of
operations, with well understood semantics Manipulation of resources through representations
– Media types Hypermedia as the engine of application state
– Hyperlink your resources
![Page 5: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/5.jpg)
5
Agenda
REST Principles
Implementing RESTful services
What’s next?
![Page 6: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/6.jpg)
6
Implementing Resource using Jax-RX @Path("/patients") public class Patients extends RestObject { …
@GET @Produces(“application/xml”) public Response getPatients() { … }
@POST @Consumes(“application/xml”) public Response addPatient(…) { … }
@Path("/{pid}") public Patient getPatientByID(@PathParam("pid")String pid) { Patient patient = new Patient(pid); patient.setBaseURI(getSelfURI()); return patient; }
}
Java API for RESTful Web Services1
Annotations for naming, uniform interface and media types
Several Implementations include Apache CXF2, and Jersey3
Media type support through integration with Jax-B4 Implementations
1 https://jsr311.dev.java.net/ 2 http://cxf.apache.org/ 3 https://jersey.dev.java.net/ 4 http://jcp.org/jsr/detail/222.jsp
![Page 7: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/7.jpg)
7
RESTful Service without XML Toolset
CXF Parses URL, instantiates the right Jax-RS annotated POJO and calls it
Service POJO Accesses persistence, instantiates model object and populates with data
Patient
Jax-B Serializes model object into XML or JSON String
String
… then uses Jax-B…
Patient Results
![Page 8: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/8.jpg)
8
…now with Atom representations
CXF Parses URL, instantiates the right Jax-RS annotated POJO and calls it
Service POJO Accesses persistence, instantiates model object and populates with data
Jax-B Serializes model object into XML or JSON String
… then uses Jax-B…
Abdera Serializes FOM object into XML or JSON String
Results
FOM-Pat
String
![Page 9: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/9.jpg)
9
How Well Does Jax-RS Address the Core REST Principles?
Feature Jax-RS Comments Named Resources � URI template support - @Path(/
Patients/{pid}) Define Uniform Interface
�
@GET, @PUT, @POST, @DELETE, @PATCH, etc.
Handle media types ¼ @Produces and @Consumes but handles only media type (format) and not content type (schema)
Hyperlinking � nothing Implementation Generally happens with a bunch of
java code.
![Page 10: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/10.jpg)
10
RESTful Service – XML as the Dial Tone
CXF Parses URL, instantiates the right Jax-RS annotated POJO and calls it
Service POJO Accesses persistence, instantiates model object and populates with data
![Page 11: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/11.jpg)
11
Insert Hyperlinks via XSLT Transformation
CXF Parses URL, instantiates the right Jax-RS annotated POJO and calls it
Service POJO Accesses persistence, instantiates model object and populates with data
XSLT XML transformation
![Page 12: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/12.jpg)
12
The REST XML Framework We’ve developed a framework that:
– Supports rapid development of domain specific RESTful Web Services – Addresses all four REST principles – resources, uniform interface, media
types, hyperlinking – Promotes reusability and deployment time configuration – Heavily leverages XML
Our framework embraces and extends: – CXF (Jax-RS implementation) or Spring MVC – XML Technology
XML Database – EMC Documentum xDB – XQuery Engine
XProc Engine - Calumet XSLT
– The Spring Framework Follows an XRX style
– Xforms on the client – RESTful interfaces – XQuery on the server – O’Reilly published piece: XRX: Simple, Elegant, Disruptive
http://www.oreillynet.com/xml/blog/2008/05/xrx_a_simple_elegant_disruptiv_1.html
![Page 13: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/13.jpg)
13
Overview
POJO for RESTful
Service “declaration”
XProc Pipeline core services implementation
XQuery interface to the persistence tier
XSLT for hyperlink insertion and media type
support
XML Database
XProc pipeline steps
![Page 14: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/14.jpg)
14
Our Persistence – EMC Documentum xDB
� Native XML database � Designed for content-oriented
applications � Ideal for warehousing content in
an application-neutral format � More flexible than RDBMS for
unstructured content and for aggregating diverse data sets
� Extensive, highly productive application development
� XQuery: powerful search, retrieval, linking, and updates
� Transaction and full ACID support
� High-performance, scalable architecture, with minimal overhead
![Page 15: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/15.jpg)
15
XProc pipeline Steps (can) have
– Input ports – Output ports – Options
Parameter input ports Atomic vs. compound steps Standard atomic step library
– xslt, xquery, http-request, xinclude, …
Custom steps – Custom compound steps – Step libraries
XQuery
Source XML document
Result XML document
XSLT
source stylesheet
source
source stylesheet
XSLT stylesheet
![Page 16: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/16.jpg)
16
Declaring Services
� In the POJO:
public class Patients {
private static XMLProcessingContext m_getPatientsProcessing = null; private static XMLProcessingContext m_addPatientProcessing = null;
public void setAddPatientProcessing (XMLProcessingContext val) { m_addPatientProcessing = val; } ... @RequestMapping(method = RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) public String addPatient(HttpServletRequest request, HttpServletResponse response, Model model) { PipelineInputCache pi = new PipelineInputCache();
// supply http body as the source for the resource Create pipeline pi.setInputPort("source", request.getInputStream());
// supply current resource URL as the base URL to craft hyperlinks String baseUrl = request.getRequestURL().toString(); pi.addParameter("stylesheetParameters", new QName("baseURL"), request.getRequestURL().toString());
PipelineOutput output = m_addPatientProcessing.executeOn(pi); } }
Encapsulate operation pipeline and design time bindings
Runtime XProc pipeline parameter binding
![Page 17: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/17.jpg)
17
Binding Operations to XProc Pipelines
� The Spring config: <bean id="Patients" class="com.emc.cto.healthcare.Patients"> <property name="getPatients" ref="getPatientsXMLProcessingContext" /> <property name="addPatient" ref="addPatientXMLProcessingContext" /> <property name="getPatient" ref="getPatientXMLProcessingContext" /> <property name="replacePatient" ref="replacePatientXMLProcessingContext" /> <property name="deletePatient" ref="deletePatientXMLProcessingContext" /> </bean> <bean id="addPatientXMLProcessingContext“ class="com.emc.cto.xproc.XProcXMLProcessingContext"> <property name="xprocPool" ref="xprocPool" /> <property name="pipelineSource"><value>classpath:resourceCreate.xpl</value></property> <property name="inputs"> <map> <entry key="xqueryscript" value="classpath:addPatient.xq" /> <entry key="stylesheet" value="classpath:hyperlinksPatient.xslt" /> </map> </property> <property name="options"> <map> <entry key-ref="iDAssignmentxPath" value="pat:Patient/pat:pid" /> </map> </property> <property name="parameters"><map/></property> </bean>
One XML processing context per operation
Configure the operation with the XProc pipeline
Set design time parameters into the pipeline
![Page 18: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/18.jpg)
18
Binding Resource Model to Physical Model
Resource URI Template
Uniform IF
Patients /patients GET POST
Patient
/patients/{id}
GET PATCH DELETE
Care Episodes
/patients/{id}/careepisodes
GET POST
Care Episode
/patients/{id}/careepisodes/{cid}
GET
…
(typically) One xQuery per operation per resource!!
getPatient.xq
delPatient.xq
uptPatient.xq
getEOC.xq
![Page 19: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/19.jpg)
19
Associating XSLT Transformations
Resource URI Template
Uniform IF
Patients /patients GET POST
Patient
/patients/{id}
GET PATCH DELETE
Care Episodes
/patients/{id}/careepisodes
GET POST
Care Episode
/patients/{id}/careepisodes/{cid}
GET
…
PatientsHyperlinks.xslt Inserts hyperlinks at the collection and entry level
PatientHyperlinks.xslt Inserts hyperlinks in a single Patient
EOCsHyperlinks.xslt Inserts hyperlinks at the collection and entry level
EOCsHyperlinks.xslt Inserts hyperlinks at the collection and entry level
…
Injected into beans (in spring config)
One XSLT per representation
…
![Page 20: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/20.jpg)
20
Sample XSLT for Inserting Hyperlinks <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" … a bunch of namesp <xsl:import href="classpath:insertHyperlinks.xslt" /> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="baseURL"/>
<xsl:template match="p:Patient" mode="inserthere"> <atom:link rel="self">
<xsl:attribute name="href"><xsl:value-of select="$baseURL" /></xsl:attribute> </atom:link> <atom:link rel="prescriptions"> <xsl:attribute name="href"><xsl:value-of select="concat($baseURL,'/activeprescriptions')"/>
</xsl:attribute> </atom:link> <atom:link rel="episodes">
<xsl:attribute name="href“><xsl:value-of select="concat($baseURL,'/careepisodes')" /> </xsl:attribute> </atom:link> <atom:link rel="up">
<xsl:attribute name="href"><xsl:value-of select="functx:substring-before-last($baseURL,'/')" </atom:link> </xsl:template>
</xslt:stylesheet>
![Page 21: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/21.jpg)
21
XProc Pipeline Parmeters Passed to Steps
<!-- insert hyperlinks --> <p:xslt name="xslt"> <p:input port='source'> <p:pipe step='xquery' port='result'/>
</p:input> <p:input port='stylesheet'> <p:pipe step='main' port='stylesheet'/>
</p:input> <p:input port='parameters'> <p:pipe step='main' port='stylesheetParameters'/>
</p:input> <p:with-param port='parameters' name='baseURL' select='/location/text()'> <p:pipe step='locXML' port='result'/>
</p:with-param> </p:xslt>
![Page 22: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/22.jpg)
22
Template Pipelines
XQuery
Source XML document
Result XML document
XSLT
source stylesheet
source
source stylesheet
XSLT stylesheet
uuid
XQuery
Source XML document
Result XML document
XSLT
source stylesheet
source
source stylesheet
XSLT stylesheet
validation
For R
esou
rce
Cre
atio
n
For R
esou
rce
Rep
lace
men
t
![Page 23: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/23.jpg)
23
How Our Framework Measures Up
Feature Jax-RS Our FW Comments Name Resources � �
Use Jax-RS annotated POJOs
Define Uniform Interface
�
�
Use Jax-RS annotated POJOs
Handle media types ¼ ¼
Currently exploring this . – Spring MVC – Stronger typing
Hyperlinking � �
Via XSLT
Implementation �
XML-centric, rapid application development
![Page 24: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/24.jpg)
24
Why XML-Centric?
XML is often the format for resource representations
XML Databases suitable for storing many data sets – Ragged, schema-less, evolving
XML is a good model language
XSLT is ideal for inserting hyperlinks – <xsl:template> defines insertion points – XPath for expressing hyperlink construction rules.
XProc is a nice high-level language – Dealing with composite resources – May evolve to make “programming” accessible to the non-
programmer
![Page 25: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/25.jpg)
25
Agenda
REST Principles
Implementing RESTful services
What’s next?
![Page 26: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/26.jpg)
26
Continued Areas of Exploration…
Finite State Machine for modeling application state Media types
– “You b*$t@^d, you’ve used ‘application/xml’” – Ian Robinson
– Media types are part of the contract for your services Feed paging and archiving – RFC 50051
Caching support – i.e. eTags JSON
1 http://www.ietf.org/rfc/rfc5005.txt
![Page 27: XML Technologies for RESTful Services Development](https://reader033.vdocuments.net/reader033/viewer/2022051515/55493bcab4c905194d8b4cf7/html5/thumbnails/27.jpg)
27
THANK YOU