Extending the XML web development framework

COCOON

into a complete web service for the registration of scientific primary data

RegServ v1.0

Jan Hinzmann

Universität Hannover

B.Sc. Colloquium

06.07.2005 Hannover

Overview

History

since 2003: project CoData

2005 bachelorthesis

RegServ: Architecture

cocoon

corelibrary

interfaces

Further Work

database for metadata

searchinterface

History

2003

project CoData was founded

2004

simple browserinterface to register a Data-DOI in the handlesystem

the browserinterface was then extended by the
registerCitationDOI-method

end 2004

customers have registered over 6.000 Data-DOIs

RegServ: Architecture

The web application has the following architecture:

servletcontainer: tomcat

https, authentification

servlet: cocoon

SoC/MVC2

webapp: RegServ

core-library: regserv.jar

tasks

commands

browserinterface

webserviceinterface

Cocoon: Web Development Framework

SoC – Separation of Concerns MVC2

sitemap.xmap

flowscript.js

content.xml

style.xsl

source: http://cocoon.apache.org/2.1/introduction.html

tomcat

Cocoon: webapp

cocoon

myWebapp

sitemap

http://localhost/cocoon/myWebapp/index.html

matcher

Cocoon: sitemap

Sitemap

<map:match pattern="index.html">

<map:generate src="index.xml"/>

<map:transform src="xml2html.xsl"/>

<map:serialize type="html"/>

</map:match>

index.xml

xml2html.xsl

index.html

http://localhost/cocoon/myWebapp/index.html

html,xhtml

pdf

postscript

xml

xls (Excel)

zip

...

Cocoon: flowscript

http://localhost/cocoon/myWebapp/index.html

Sitemap

<map:match pattern="index.html">

<map:call function="hello"/>

</map:match>

<map:match pattern="helloWorld">

<map:generate src="index.xml"/>

<map:transform src="index.xsl">

<map:parameter name="foo" value="{flow-attribute:foo}"/>

</map:transform>

<map:serialize type="html"/>

</map:match>

flow.js

function hello(){

var value = "Hello World!";

var foo = {"foo":value};

cocoon.sendPage("helloWorld", foo);

}

index.html

<html>

<body>

<p>Hello World!</p>

</body>

</html>

Overview

History

since 2003: project CoData

2005 bachelorthesis

RegServ: Architecture

cocoon

corelibrary

interfaces

Further Work

database for metadata

searchinterface

Core: packages

task

collect commands and execute them

commands

provide corefunctionality

util

logging

timestamp

checksum (URN)

exception

errorhandling

Core: tasks

the following tasks have been determined:

registerCitationDOI

registerDataDOI

updateURL

updateCitationDOI

transformData2CitationDOI

Each task consists of one or more commands.

When a task is executed, all its commands are executed.

Core: commands

For the tasks we need the following commands:

storeXML -- DB

registerDOI -- IDF

sendMail -- DDB

storePICA -- GBV

updateURL -- IDF

Core: putting it all together

How do I use the library?

get an instance of ifis.task.Task

get instances of ifis.commands.*

add your commands to the task

execute the task

How to get parameters in order to instantiate these commands?

use an interface

browserinterface

webserviceinterface

(formularinterface)

Core: usage

Overview

History

since 2003: project CoData

2005 bachelorthesis

RegServ: Architecture

cocoon

corelibrary

interfaces

Further Work

database for metadata

searchinterface

Browserinterface

application flow

select task

provide parameter

see preview

get resumé

Browserinterface:
http://beethoven.kbs.uni-hannover.de:8080/cocoon/regserv/browserinterface/

sitemap

flowscript

Cocoon

corelibrary

1

2

4

DDB

IDF

DB

GBV

Service-Request

task?

parameter?

preview

Service-Response

3

5

Browserinterface: task

Browserinterface: parameter

Browserinterface: error

Browserinterface: preview

Browserinterface: resumé

Webserviceinterface

2005: new requirements

"We need a (soap)webserviceinterface."

cocoon has an integrated axis-component

application flow

send a SOAP:Envelope

get a SOAP:Response

Webserviceinterface: the doubled code

sitemap

flowscript

Cocoon

corelibrary

DDB

IDF

DB

GBV

webserviceinterface

browserinterface

Axis

javascript

java

same code

axisproxy

cannot call

processPipelineTo()

=> compute XSLT ...

Webserviceinterface: thesis

Thesis:

make Cocoon interpret soap-messages to skip the axis-component!

Thoughts:

The soapEnvelope is xml

it contains all necessary data

the name of the first node after the bodynode is the methodname

the parameters are provided in a well-defined order

Idea:

generate the soapEnvelope with a StreamGenerator and store it for later use in a flowscriptvariable ('soapData')

extract the methodname

as soon as the methodname is known, extract the parameters

execute the method and send the answer

Webserviceinterface: what do we get?

<?xml version=”1.0”?>

<soapenv:Envelope

xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<soapenv:Body>

<ns1:registerDataDOI

soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

xmlns:ns1="CodataWS">

<ns1:arg0 xsi:type="xsd:string">10.1594/ifis/test1</ns1:arg0>

<ns1:arg1 xsi:type="xsd:string">http://jan.geeksonly.de</ns1:arg1>

</ns1:registerDataDOI>

</soapenv:Body>

</soapenv:Envelope>

methodname

parameter

Webserviceinterface: what should we send?

<?xml version=”1.0”?>

<soapenv:Envelope

xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/”

xmlns:xsd=”http://www.w3.org/2001/XMLSchema”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema−instance”>

<soapenv:Body>

<ns1:registerDataDOIResponse

soapenv: encodingStyl e=”http://schemas.xmlsoap.org/soap/encoding/”

xmlns:ns1=”CodataWS”>

<ns1:registerDataDOIReturn xsi:type=”xsd:string”>OK

</ns1:registerDataDOIReturn>

</ns1:registerDataDOIResponse>

</soapenv:Body>

</soapenv:Envelope>

answer

message

Webserviceinterface: solution

Cocoon

sitemap

flowscript

corelibrary

call

Request

main()

Matcher

Generator (Stream)

XML soapData;

//assign soapData:

processPipelineTo(soapData);

soap:Envelope

String soapMethod;

//assign soapMethod:

processPipelineTo(soapMethod);

Generator

soapMethod

Parameter soapParameter;

//assign soapParameter:

processPipelineTo(URL/DOI/...);

* soapParameter *

Generator

String soapAnswer;

//sending answer:

sendPage("answer", answer);

answer

soapAnswer

Response

/*call corelibrary and execute the task.*/

Webserviceinterface: solution

SOAP-Request

sitemap

flowscript

Cocoon

corelibrary

SOAP-Response

1

2

3

4

DDB

DOI.org

DB

GBV

Conclusion

2005 within the context of the bachelorthesis:

refactorings made the use of Axis obsolet: only single code! :o)

a general solution for a web service with cocoon has been found

this was possible without any performanceloss

the application has become more modular

all tasks have been implemented for both interfaces

June 2005

customers have registered over 200.000 DOIs

Further Work

implement Databaseconnection to store the incoming metadata

implement a searchinterface on the metadata

gain performance in the implementation towards the handlesystem

implement look-up-methods to answer questions like

"How many handle are registered atm?"

"Is a DOI already in the handlesystem?"

"What is the URL according to this DOI?"

implement a formularinterface

many other usefull things ...

Thank you!

- end -

Jan Hinzmann

2005-06-27T15:42:40