View
215
Download
1
Embed Size (px)
Citation preview
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific LanguagesDomain Specific Languagesfor Interactive Web for Interactive Web
ServicesServices
Claus BrabrandClaus Brabrand[ Joint work with Anders Møller, Michael Schwartzbach, BRICS, [ Joint work with Anders Møller, Michael Schwartzbach, BRICS,
Denmark ]Denmark ]
Compose Research GroupCompose Research Group
INRIA/LaBRI, University of Bordeaux IINRIA/LaBRI, University of Bordeaux I
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Program FamilyProgram Family
””Web servers on which clients can initiate sessions Web servers on which clients can initiate sessions that involve several exchanges of information that involve several exchanges of information mediated by HTML forms”.mediated by HTML forms”.
serverserverclientclient InternetInternet
Interactive (Form-Based) Web Services:Interactive (Form-Based) Web Services:
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
public class SessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); HttpSession session = request.getSession(true); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><HEAD><TITLE>Servlet Demo</TITLE></HEAD><BODY>"); if (session.isNew()) { out.println("<FORM ACTION=SessionServlet>" + "Enter your name: <INPUT NAME=handle>" + "<INPUT TYPE=SUBMIT></FORM>"); session.putValue("state", "1"); } else { String state = (String) session.getValue("state"); if (state.equals("1")) { String name = (String) request.getParameter("handle"); int users = ((Integer) context.getAttribute("users")).intValue() + 1; context.setAttribute("users", new Integer(users)); session.putValue("name", name); out.println("Hello " + name + ", you are user number " + users); session.putValue("state", "2"); } else /* state.equals("2") */ { String name = (String) session.getValue("name"); out.println("Goodbye " + name); session.invalidate(); } } out.println("</BODY></HTML>"); }}
A Program from the Program A Program from the Program FamilyFamily Java Servlet
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
A Program from the Program A Program from the Program FamilyFamily
WebWebServiceService
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
public class SessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); HttpSession session = request.getSession(true); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><HEAD><TITLE>Servlet Demo</TITLE></HEAD><BODY>"); if (session.isNew()) { out.println("<FORM ACTION=SessionServlet>" + "Enter your name: <INPUT NAME=handle>" + "<INPUT TYPE=SUBMIT></FORM>"); session.putValue("state", "1"); } else { String state = (String) session.getValue("state"); if (state.equals("1")) { String name = (String) request.getParameter("handle"); int users = ((Integer) context.getAttribute("users")).intValue() + 1; context.setAttribute("users", new Integer(users)); session.putValue("name", name); out.println("Hello " + name + ", you are user number " + users); session.putValue("state", "2"); } else /* state.equals("2") */ { String name = (String) session.getValue("name"); out.println("Goodbye " + name); session.invalidate(); } } out.println("</BODY></HTML>"); }}
A Program from the Program A Program from the Program FamilyFamily
session management
Java Servlet
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
public class SessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); HttpSession session = request.getSession(true); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><HEAD><TITLE>Servlet Demo</TITLE></HEAD><BODY>"); if (session.isNew()) { out.println("<FORM ACTION=SessionServlet>" + "Enter your name: <INPUT NAME=handle>" + "<INPUT TYPE=SUBMIT></FORM>"); session.putValue("state", "1"); } else { String state = (String) session.getValue("state"); if (state.equals("1")) { String name = (String) request.getParameter("handle"); int users = ((Integer) context.getAttribute("users")).intValue() + 1; context.setAttribute("users", new Integer(users)); session.putValue("name", name); out.println("Hello " + name + ", you are user number " + users); session.putValue("state", "2"); } else /* state.equals("2") */ { String name = (String) session.getValue("name"); out.println("Goodbye " + name); session.invalidate(); } } out.println("</BODY></HTML>"); }}
A Program from the Program A Program from the Program FamilyFamily
state management
Java Servlet
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
public class SessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); HttpSession session = request.getSession(true); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><HEAD><TITLE>Servlet Demo</TITLE></HEAD><BODY>"); if (session.isNew()) { out.println("<FORM ACTION=SessionServlet>" + "Enter your name: <INPUT NAME=handle>" + "<INPUT TYPE=SUBMIT></FORM>"); session.putValue("state", "1"); } else { String state = (String) session.getValue("state"); if (state.equals("1")) { String name = (String) request.getParameter("handle"); int users = ((Integer) context.getAttribute("users")).intValue() + 1; context.setAttribute("users", new Integer(users)); session.putValue("name", name); out.println("Hello " + name + ", you are user number " + users); session.putValue("state", "2"); } else /* state.equals("2") */ { String name = (String) session.getValue("name"); out.println("Goodbye " + name); session.invalidate(); } } out.println("</BODY></HTML>"); }}
A Program from the Program A Program from the Program FamilyFamily
document construction
Java Servlet
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
public class SessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); HttpSession session = request.getSession(true); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><HEAD><TITLE>Servlet Demo</TITLE></HEAD><BODY>"); if (session.isNew()) { out.println("<FORM ACTION=SessionServlet>" + "Enter your name: <INPUT NAME=handle>" + "<INPUT TYPE=SUBMIT></FORM>"); session.putValue("state", "1"); } else { String state = (String) session.getValue("state"); if (state.equals("1")) { String name = (String) request.getParameter("handle"); int users = ((Integer) context.getAttribute("users")).intValue() + 1; context.setAttribute("users", new Integer(users)); session.putValue("name", name); out.println("Hello " + name + ", you are user number " + users); session.putValue("state", "2"); } else /* state.equals("2") */ { String name = (String) session.getValue("name"); out.println("Goodbye " + name); session.invalidate(); } } out.println("</BODY></HTML>"); }}
A Program from the Program A Program from the Program FamilyFamily Java Servlet
session management state management document construction
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
public class SessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); HttpSession session = request.getSession(true); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><HEAD><TITLE>Servlet Demo</TITLE></HEAD><BODY>"); if (session.isNew()) { out.println("<FORM ACTION=SessionServlet>" + "Enter your name: <INPUT NAME=handle>" + "<INPUT TYPE=SUBMIT></FORM>"); session.putValue("state", "1"); } else { String state = (String) session.getValue("state"); if (state.equals("1")) { String name = (String) request.getParameter("handle"); int users = ((Integer) context.getAttribute("users")).intValue() + 1; context.setAttribute("users", new Integer(users)); session.putValue("name", name); out.println("Hello " + name + ", you are user number " + users); session.putValue("state", "2"); } else /* state.equals("2") */ { String name = (String) session.getValue("name"); out.println("Goodbye " + name); session.invalidate(); } } out.println("</BODY></HTML>"); }}
A Program from the Program A Program from the Program FamilyFamily
session management state management document construction
Java Servlet
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
The The <<bigwigbigwig>> Language/SystemLanguage/System
• A high-level domain-specific A high-level domain-specific programming language for programming language for developing interactive Web services.developing interactive Web services.
<<bigwigbigwig>><<bigwigbigwig>>
HTMLHTML
CGI ScriptsCGI Scripts
JavaScriptJavaScript
HTTP Auth.HTTP Auth.
Java AppletsJava Applets
CompleteService
Specification
CompleteService
Specification
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
<<bigwigbigwig>> = = a Collection oa Collection offDomain Specific LanguagesDomain Specific Languages
• C-like core language withC-like core language with•Session-based rSession-based runtime systemuntime system
•Dynamic documentsDynamic documents
•FForm-field orm-field validationvalidation
•Relational dRelational databaseatabase
•Concurrency controlConcurrency control
•Semantic sSemantic securityecurity
•Cryptographic securityCryptographic security
•Syntactic-level macrosSyntactic-level macros
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
<<bigwigbigwig>> = = a Collection oa Collection offDomain Specific LanguagesDomain Specific Languages
• C-like core language withC-like core language with•Session-based rSession-based runtime systemuntime system
•Dynamic documentsDynamic documents
•FForm-field orm-field validationvalidation
•Relational dRelational databaseatabase
•Concurrency controlConcurrency control
•Semantic sSemantic securityecurity
•Cryptographic securityCryptographic security
•Syntactic-level macrosSyntactic-level macros
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Implementation ApproachesImplementation Approaches
• Traditionally 2 approaches:Traditionally 2 approaches:
– Script-centered:Script-centered:•Perl/CGI, Java Servlets, …Perl/CGI, Java Servlets, …
– Page-centered:Page-centered:•ASP, PHP, JSP, ...ASP, PHP, JSP, ...
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Script-Centered:Script-Centered:Perl/CGI, Servlets, ...Perl/CGI, Servlets, ...
e
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
WebWebServiceService
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Script-Centered:Script-Centered:Perl/CGI, Servlets, ...Perl/CGI, Servlets, ...
e
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
WebWebServiceService
requestrequest
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Script-Centered:Script-Centered:Perl/CGI, Servlets, ...Perl/CGI, Servlets, ...
e
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
WebWebServiceService
computecomputereplyreply
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Script-Centered:Script-Centered:Perl/CGI, Servlets, ...Perl/CGI, Servlets, ...
e
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
e
WebWebServiceService
HTMLHTML
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Script-Centered:Script-Centered:Perl/CGI, Servlets, ...Perl/CGI, Servlets, ...
e
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
e
WebWebServiceService
submitsubmit
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Script-Centered:Script-Centered:Perl/CGI, Servlets, ...Perl/CGI, Servlets, ...
e
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
e
WebWebServiceService
computecomputereplyreply
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Script-Centered:Script-Centered:Perl/CGI, Servlets, ...Perl/CGI, Servlets, ...
e
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
e
eWebWebServiceServiceHTMLHTML
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
e
e
e
PagePage-Centered:-Centered:PHP, ASP, JSP, ...PHP, ASP, JSP, ...
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
WebWebServiceService
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Page-CenteredPage-Centered
• Increased level of abstractionIncreased level of abstraction::•CGI protocol details abstracted awayCGI protocol details abstracted away
• Easy to add dynamics to static pagesEasy to add dynamics to static pages::•
• ScalabilityScalability::•SpecializedSpecialized Web server Web server
““Service code embedded in tags andService code embedded in tags and interpreted by specialized Web server”interpreted by specialized Web server”
<html><body>Time: <%= Now() %></body></html><html><body>Time: <%= Now() %></body></html><%= Now() %>
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Script-Centered vs. PageScript-Centered vs. Page--CenteredCentered
• As the service complexity increases:As the service complexity increases:– Page-Page-CCentered entered Script- Script-CCentered entered
•A lot of HTML is generated by script elementsA lot of HTML is generated by script elements
• Interesting dInteresting duality:uality:•Script-centered:Script-centered:
– DDefaultefault:: program programming,ming, EEscapescape:: print printinging ( (printprint))
•Page-centered:Page-centered:– DDefaultefault:: print printing,ing, EEscapescape:: programming programming (<%... (<%...
%>)%>)
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Fundamental DrawbacksFundamental Drawbacks
<input name=”x”>
a_scripta_script another_scriptanother_script
<%= $y %>submitsubmit
WebWebServiceService
• A service A service == a collection of a collection of scripts/pages!scripts/pages!
• Implicit control-flow:Implicit control-flow:
•No interaction correspondenceNo interaction correspondence::
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
SessionSession-Centered:-Centered:Mawl and Mawl and <<bigwigbigwig>>!!
e
CLIENT INTERNET SERVERCLIENT INTERNET SERVER
e
e
Web ServiceWeb Service
showshow x; x;
showshow y; y;
xx
yy
submitsubmit
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
SessionSession-Centered:-Centered:Mawl and Mawl and <<bigwigbigwig>>!!
e
e
Web ServiceWeb Service
showshow x; x;
showshow y; y;
xx
submitsubmit
• Domain specific abstration: Domain specific abstration: showshow
• Explicit control-flowExplicit control-flow
• Check interaction correspondenceCheck interaction correspondence
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
e
e
e
General Purpose General Purpose ManuallyManually
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
WebWebServiceService
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
e
e
e
savesave
General Purpose General Purpose ManuallyManually
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
WebWebServiceService
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
e
e
e
savesave
restorerestore
General Purpose General Purpose ManuallyManually
CLIENCLIENTT INTERNET SERVER INTERNET SERVER
WebWebServiceService
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
General Purpose General Purpose ManuallyManually
• Private (to each session thread):Private (to each session thread):ServletContext context = getServletContext();int p ((Integer) context.getAttribute("p")).intValue();p++;context.setAttribute("p", new Integer(var));
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
General Purpose General Purpose ManuallyManually
• Private (to each session thread):Private (to each session thread):
• Shared (among all session threads):Shared (among all session threads):HttpSession session = request.getSession(true);int s ((Integer) session.getValue("s")).intValue();s++;session.setValue("s", new Integer(var));
ServletContext context = getServletContext();int p ((Integer) context.getAttribute("p")).intValue();p++;context.setAttribute("p", new Integer(var));
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific: Domain Specific: sharedshared modifiermodifier
• Private (to each session thread):Private (to each session thread):int p;
...p++;...
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific: Domain Specific: sharedshared modifiermodifier
• Private (to each session thread):Private (to each session thread):
• Shared (among all session threads):Shared (among all session threads):shared int s;
...s++;...
int p;
...p++;...
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Domain Specific AutomaticallyAutomatically
e
CLIENT INTERNET SERVERCLIENT INTERNET SERVER
e
e
Web ServiceWeb Service
[ save ][ save ][ restore ][ restore ]
showshow x; x;
showshow y; y;
xx
yy
submitsubmit
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Dynamically Generated Dynamically Generated XMXML:L:Current ProblemsCurrent Problems
• Traditionally:Traditionally:• print(...)print(...) in Perl/CGI, ...in Perl/CGI, ...• <% print(...) %><% print(...) %> in PHP, ASP, JSP, ...in PHP, ASP, JSP, ...
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Our Solution:Our Solution:HTML documents in HTML documents in <<bigwigbigwig>>• Templates (1Templates (1stst class, class, higherhigher--orderorder
valuesvalues):):•XML fragments with XML fragments with named gapsnamed gaps::
• OperationsOperations::•plug:plug: for document constructionfor document construction
•show:show: for client interactionfor client interaction
[[[[ Hello Hello <[<[whatwhat]>]>!!]]]]
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
PlugPlug
• Plug:Plug: expexp <[<[ idid == expexp ]]
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
PlugPlug
• Plug:Plug: expexp <[<[ idid == expexp ]]
• Example:Example:htmlhtml hello = hello = [[ Hello [[ Hello <[<[whatwhat]>]>! ]]! ]];;htmlhtml world = world = [[ <b>World</b> ]][[ <b>World</b> ]];;
htmlhtml h = hello <[ h = hello <[whatwhat = world]; = world];...;...;
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
ShowShow
• Show:Show: showshow expexp ;;
xx
CLIENT CLIENT INTERNET INTERNET SERVER SERVER
eshowshow xx;;
submitsubmitsuspendsuspendresumeresume
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
ShowShow
• Show:Show: showshow expexp ;;
• Example:Example:
xx
CLIENT CLIENT INTERNET INTERNET SERVER SERVER
eshowshow xx;;
submitsubmitsuspendsuspendresumeresume
htmlhtml hello = hello = [[ Hello [[ Hello <[<[whatwhat]>]>! ]]! ]];;htmlhtml world = world = [[ <b>World</b> ]][[ <b>World</b> ]];;
htmlhtml hh = hello <[ = hello <[whatwhat = world]; = world];showshow h h;;
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Show-ReceiveShow-Receive
• SShowhow:: showshow expexp receivereceive[[vv
==ff, ..., ...];]; xx
CLIENT CLIENT INTERNET INTERNET SERVER SERVER
e
ff, ..., ...submitsubmitshowshow x x receivereceive[v=f,..][v=f,..];;
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Show-ReceiveShow-Receive
• SShowhow:: showshow expexp receivereceive[[vv
==ff, ..., ...];];
• Example:Example:stringstring s; s;htmlhtml inputinput = = [[[[ Enter email: Enter email: <input type=”text” name=”<input type=”text” name=”emailemail”>”>]]]];;
showshow input input receivereceive[s = [s = emailemail];];
xx
CLIENT CLIENT INTERNET INTERNET SERVER SERVER
eshowshow x x receivereceive[v=f,..][v=f,..];;
ff, ..., ...submitsubmit
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Example: ”Welcome”Example: ”Welcome”
htmlhtml greeting = greeting = [[[[ Hello Hello <[<[whowho]>]>, welcome to , welcome to <[<[whatwhat]>]>..]]]];;
htmlhtml cover = cover = [[[[ <head><title>Welcome</title></head><head><title>Welcome</title></head> <body><body><[<[contentscontents]>]></body></body>]]]];;
htmlhtml h; h;h = greeting <[h = greeting <[whowho = = ”Stranger””Stranger”];];h = h <[h = h <[whatwhat = = [[ <b>GPCE</b> ]][[ <b>GPCE</b> ]]];];showshow cover <[ cover <[contentscontents = h]; = h];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Flexibility: PHP/ASP/JSPFlexibility: PHP/ASP/JSP
• List of results (e.g. “List of results (e.g. “search enginesearch engine”)”)::•One template with 10,20,30, One template with 10,20,30,
or 40 or 40 hardwiredhardwired server-sideserver-sidescript elements: script elements:
•One template with one big One template with one big ””generate-allgenerate-all”” server-side server-side script element:script element:
script-centeredscript-centered
<% ..1.. %><% ..1.. %>
...or......or...
<% ..2.. %><% ..2.. %>
<% ..20.. %><% ..20.. %> :
<% <% for for i=1 to N doi=1 to N do { ..i.. } { ..i.. } %>%>
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Flexibility:Flexibility: <<bigwigbigwig>>
• List of results (e.g. “List of results (e.g. “search enginesearch engine”)”)::
<ul> <li>1 <li>2 : <li>N</ul>
<ul> <li>1 <li>2 : <li>N</ul>
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Flexibility:Flexibility: <<bigwigbigwig>>
• List of results (e.g. “List of results (e.g. “search enginesearch engine”)”)::•Two templates: “Two templates: “layoutlayout” and “” and “entryentry”...”...
<ul> <li>1 <li>2 : <li>N</ul>
<ul> <li>1 <li>2 : <li>N</ul>
htmlhtml layoutlayout = = [[ <ul>[[ <ul><[<[itemsitems]>]></ul> ]]</ul> ]];;htmlhtml entry = entry = [[ <li>[[ <li><[<[numnum]><[]><[itemsitems]>]> ]] ]];;
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Flexibility:Flexibility: <<bigwigbigwig>>
• List of results (e.g. “List of results (e.g. “search enginesearch engine”)”)::•Two templates: “Two templates: “layoutlayout” and “” and “entryentry”...”...
•...and o...and one recursive function: ne recursive function: ““ff””htmlhtml f( f(intint n) { n) { ifif (n (n === 0) = 0) returnreturn layoutlayout;; returnreturn f(n-1) <[ f(n-1) <[itemitemss = entry <[ = entry <[numnum = n]]; = n]];}}
htmlhtml layoutlayout = = [[ <ul>[[ <ul><[<[itemsitems]>]></ul> ]]</ul> ]];;htmlhtml entry = entry = [[ <li>[[ <li><[<[numnum]><[]><[itemsitems]>]> ]] ]];;
<ul> <li>1 <li>2 : <li>N</ul>
<ul> <li>1 <li>2 : <li>N</ul>
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Flexibility:Flexibility: <<bigwigbigwig>>
• List of results (e.g. “List of results (e.g. “search enginesearch engine”)”)::•Two templates: “Two templates: “layoutlayout” and “” and “entryentry”...”...
•...and o...and one recursive function: ne recursive function: ““ff””
•Example usage:Example usage:
htmlhtml f( f(intint n) { n) { ifif (n (n === 0) = 0) returnreturn layoutlayout;; returnreturn f(n-1) <[ f(n-1) <[itemitemss = entry <[ = entry <[numnum = n]]; = n]];}}
<ul> <li>1 <li>2 : <li>27</ul>
<ul> <li>1 <li>2 : <li>27</ul>
htmlhtml layoutlayout = = [[ <ul>[[ <ul><[<[itemsitems]>]></ul> ]]</ul> ]];;htmlhtml entry = entry = [[ <li>[[ <li><[<[numnum]><[]><[itemsitems]>]> ]] ]];;
showshow f(27);f(27);
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
htmlhtml f( f(intint n) { n) { ifif (n (n === 0) = 0) returnreturn layoutlayout;; returnreturn f(n-1) <[ f(n-1) <[itemitemss = entry <[ = entry <[numnum = n]]; = n]];}}
htmlhtml layoutlayout = = [[ <ul>[[ <ul><[<[itemsitems]>]></ul> ]]</ul> ]];;htmlhtml entry = entry = [[ <li>[[ <li><[<[numnum]><[]><[itemsitems]>]> ]] ]];;
Flexibility: Separates Flexibility: Separates Designer / Programmer Designer / Programmer AspectsAspects
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
htmlhtml f( f(intint n) { n) { ifif (n (n === 0) = 0) returnreturn layoutlayout;; returnreturn f(n-1) <[ f(n-1) <[itemitemss = entry <[ = entry <[numnum = n]]; = n]];}}
htmlhtml layoutlayout = = [[ <table>[[ <table><[<[itemsitems]>]></table> ]]</table> ]];;htmlhtml entry = entry = [[[[ <tr><td><tr><td><[<[numnum]>]></td></tr></td></tr> <[<[itemsitems]>]>]]]];;
htmlhtml layoutlayout = = [[ <ul>[[ <ul><[<[itemsitems]>]></ul> ]]</ul> ]];;htmlhtml entry = entry = [[ <li>[[ <li><[<[numnum]><[]><[itemsitems]>]> ]] ]];;
Flexibility: Separates Flexibility: Separates Designer / Programmer Designer / Programmer AspectsAspects
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
<input name=”x”>
a_scripta_script another_scriptanother_script
<%= $y %>submitsubmit
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Type SafetyType Safety(in terms of (in terms of <<bigwigbigwig>>))
• Show/Receive correspondenceShow/Receive correspondence::
• Gap presenGap presencece::
htmlhtml dd = = [[[[ Enter email: Enter email: <<input type=“text” name=“input type=“text” name=“emailemail”>”>]]]];;
showshow d d receivereceive[s = [s = ageage];];
htmlhtml hellohello = = [[ [[ Hello Hello <[<[whatwhat]>]>!! ]] ]];;htmlhtml world = world = [[ <b>World</b> ]][[ <b>World</b> ]];;htmlhtml h; h;
h = hello <[h = hello <[contentscontents = world]; = world];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Static Analysis!Static Analysis!
Apply standard, Apply standard, data-flow analysisdata-flow analysis techniques, techniques,but with highly but with highly domain-specific latticesdomain-specific lattices
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Static Analysis!Static Analysis!
• Conservatively approximateConservatively approximatefor all HTML variables & program for all HTML variables & program points:points:
• Their Their gaps and fields (and their kinds)gaps and fields (and their kinds) all possible runtime values all possible runtime values
• Forward data-flow analysis:Forward data-flow analysis:1.1. Control-flow graph (trivial for Control-flow graph (trivial for <<bigwigbigwig>>))
2.2. Finite lattice: Finite lattice: Gap-and-FieldGap-and-Field
3.3. Monotone transfer functions: plug, assign, ...Monotone transfer functions: plug, assign, ...
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Gap-and-Field LatticeGap-and-Field LatticeGKindGKind
nogap
string
html
error
FKindFKind
error
text
nofield
checkboxradio
tup(F1)
rel(F1) rel(Fn)
tup(Fn)
..
..
• An An abstract documentabstract document is: is:
((GNameGName GKindGKind) x () x (FNameFName FKindFKind))
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer Monotone Transfer FunctionsFunctions
• Plug:Plug: xx11 <[ <[gg = = xx22]]
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer Monotone Transfer FunctionsFunctions
• Plug:Plug: xx11 <[ <[gg = = xx22]]
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa nogapnogap
gg nogapnogap
nn htmlhtml
GNameGName GKindGKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer Monotone Transfer FunctionsFunctions
• Plug:Plug: xx11 <[ <[gg = = xx22]]
<[g = ]
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa nogapnogap
gg nogapnogap
nn htmlhtml
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa
gg
nn
GG : : GKindGKind x x GKindGKind GKindGKind
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer Monotone Transfer FunctionsFunctions
• Plug:Plug: xx11 <[ <[gg = = xx22]]
<[g = ]
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa nogapnogap
gg nogapnogap
nn htmlhtml
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa htmlhtml
gg
nn
GG : : GKindGKind x x GKindGKind GKindGKind
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer Monotone Transfer FunctionsFunctions
• Plug:Plug: xx11 <[ <[gg = = xx22]]
<[g = ]
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa nogapnogap
gg nogapnogap
nn htmlhtml
GNameGName GKindGKind
aa htmlhtml
gg nogapnogap
nn
GG : : GKindGKind x x GKindGKind GKindGKind
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer Monotone Transfer FunctionsFunctions
• Plug:Plug: xx11 <[ <[gg = = xx22]]
<[g = ]
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa nogapnogap
gg nogapnogap
nn htmlhtml
GNameGName GKindGKind
aa htmlhtml
gg nogapnogap
nn htmlhtml
GG : : GKindGKind x x GKindGKind GKindGKind
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer Monotone Transfer FunctionsFunctions
• Plug:Plug: xx11 <[ <[gg = = xx22]]
<[g = ]
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa nogapnogap
gg nogapnogap
nn htmlhtml
GNameGName GKindGKind
aa htmlhtml
gg nogapnogap
nn htmlhtml
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Then: Check SolutionThen: Check Solution
• Traverse solution: intercept Traverse solution: intercept errorerrorss
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Then: Check SolutionThen: Check Solution
• Traverse solution: intercept Traverse solution: intercept errorerrorss
gap presentgap present
EE11 <[ <[gg = E = E22]]FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Then: Check SolutionThen: Check Solution
• Traverse solution: intercept Traverse solution: intercept errorerrorss
gap presentgap present
field presentfield present
type check:type check: v ~ v ~ texttext
EE11 <[ <[gg = E = E22]]
showshow E E receivereceive[v=[v=ff, , ......];];
FNameFName FKindFKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
GNameGName GKindGKind
aa htmlhtml
gg htmlhtml
nn nogapnogap
FNameFName FKindFKind
ee radioradio
ff texttext
tt texttext
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Type SafetyType Safety??
• Show/Receive interaction Show/Receive interaction correspondencecorrespondence::
• Gap presenGap presencece::
htmlhtml dd = = [[[[ Enter email: Enter email: <<input type=“text” name=“input type=“text” name=“emailemail”>”>]]]];;
showshow d d receivereceive[s = [s = ageage];];
htmlhtml hellohello = = [[ [[ Hello Hello <[<[whatwhat]>]>!! ]] ]];;htmlhtml world = world = [[ <b>World</b> ]][[ <b>World</b> ]];;htmlhtml h; h;
h = hello <[h = hello <[contentscontents = world]; = world];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Type SafetyType Safety!!
• Show/Receive interaction Show/Receive interaction correspondencecorrespondence::
• Gap presenGap presencece::
htmlhtml dd = = [[[[ Enter email: Enter email: <<input type=“text” name=“input type=“text” name=“emailemail”>”>]]]];;
showshow d d receivereceive[s = [s = ageage];];
htmlhtml hellohello = = [[ [[ Hello Hello <[<[whatwhat]>]>!! ]] ]];;htmlhtml world = world = [[ <b>World</b> ]][[ <b>World</b> ]];;htmlhtml h; h;
h = hello <[h = hello <[contentscontents = world]; = world];
*** receive.wig:5: input field ‘email’ not received no such input field ‘age’
*** receive.wig:5: input field ‘email’ not received no such input field ‘age’
*** plug.wig:5: no such gap ‘contents’*** plug.wig:5: no such gap ‘contents’
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectaspectss•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Example: ”Welcome”Example: ”Welcome”
htmlhtml greeting = greeting = [[[[ Hello Hello <[<[whowho]>]>, welcome to , welcome to <[<[whatwhat]>]>..]]]];;
htmlhtml cover = cover = [[[[ <head><title>Welcome</title></head><head><title>Welcome</title></head> <body><body><[<[contentscontents]>]></body></body>]]]];;
htmlhtml h; h;h = greeting <[h = greeting <[whowho = = ”Stranger””Stranger”];];h = h <[h = h <[whatwhat = = [[ <b>GPCE</b> ]][[ <b>GPCE</b> ]]];];showshow cover <[ cover <[contentscontents = h]; = h];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Example: ”Welcome”Example: ”Welcome”
htmlhtml greeting = greeting = [[[[ Hello Hello <[<[whowho]>]>, welcome to , welcome to <[<[whatwhat]>]>..]]]];;
htmlhtml cover = cover = [[[[ <head><title>Welcome</title></head><head><title>Welcome</title></head> <body><body><[<[contentscontents]>]></body></body>]]]];;
htmlhtml h; h;h = greeting <[h = greeting <[whowho = = ”Stranger””Stranger”];];h = h <[h = h <[whatwhat = = [[ <b>GPCE</b> ]][[ <b>GPCE</b> ]]];];showshow cover <[ cover <[contentscontents = h]; = h];
Valid HTML !?Valid HTML !?
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Static AnalysisStatic Analysis (again)! (again)!
• Conservatively approximateConservatively approximatefor allfor all HTML variables & program points HTML variables & program points::
• A A summary graphsummary graph all possible runtime values all possible runtime values
• Forward data-flow analysis:Forward data-flow analysis:1.1. Control-flow graph: (Control-flow graph: (trivial for trivial for <<bigwigbigwig>>))
2.2. Finite lattice: Finite lattice: summary graphssummary graphs
3.3. Monotone transfer functions: plug, assign, ...Monotone transfer functions: plug, assign, ...
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Summary GraphSummary Graph
htmlhtml greeting = greeting = ...;...;
htmlhtml cover = ...; cover = ...;
htmlhtml h; h;h = greeting <[h = greeting <[whowho = = ”Stranger””Stranger”];];h = h <[h = h <[whatwhat = = [[ <b>GPCE</b> ]][[ <b>GPCE</b> ]]];];showshow cover <[ cover <[contentscontents = h]; = h];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Summary GraphSummary Graph
””Stranger”Stranger”greetinggreeting
whowho
htmlhtml greeting = greeting = ...;...;
htmlhtml cover = ...; cover = ...;
htmlhtml h; h;h = greeting <[h = greeting <[whowho = = ”Stranger””Stranger”];];h = h <[h = h <[whatwhat = = [[ <b>GPCE</b> ]][[ <b>GPCE</b> ]]];];showshow cover <[ cover <[contentscontents = h]; = h];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Summary GraphSummary Graph
””Stranger”Stranger”greetinggreeting
gpcegpce
whowho
whatwhat
htmlhtml greeting = greeting = ...;...;
htmlhtml cover = ...; cover = ...;
htmlhtml h; h;h = greeting <[h = greeting <[whowho = = ”Stranger””Stranger”];];h = h <[h = h <[whatwhat = = [[ <b>GPCE</b> ]][[ <b>GPCE</b> ]]];];showshow cover <[ cover <[contentscontents = h]; = h];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Summary GraphSummary Graph
””Stranger”Stranger”
covercover
greetinggreeting
gpcegpce
contentscontents whowho
whatwhat
htmlhtml greeting = greeting = ...;...;
htmlhtml cover = ...; cover = ...;
htmlhtml h; h;h = greeting <[h = greeting <[whowho = = ”Stranger””Stranger”];];h = h <[h = h <[whatwhat = = [[ <b>GPCE</b> ]][[ <b>GPCE</b> ]]];];showshow cover <[ cover <[contentscontents = h]; = h];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer FunctionMonotone Transfer Function
• Plug:Plug: xx11 <[ <[gg = = xx22]]
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer FunctionMonotone Transfer Function
• Plug:Plug:
gg
gg
gggg
xx11 <[ <[gg = = xx22]]
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer FunctionMonotone Transfer Function
• Plug:Plug:
<[<[gg = ]= ]
xx11 <[ <[gg = = xx22]]
gg
gg
gggg
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer FunctionMonotone Transfer Function
• Plug:Plug:
<[<[gg = ]= ]
xx11 <[ <[gg = = xx22]]
gg
gg
gggg
gg
gg
gggg
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer FunctionMonotone Transfer Function
• Plug:Plug:
<[<[gg = ]= ]
xx11 <[ <[gg = = xx22]]
gg
gg
gggg
gg
gg
gggg
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer FunctionMonotone Transfer Function
• Plug:Plug:
<[<[gg = ]= ]
xx11 <[ <[gg = = xx22]]
gg
gg
gggg
gg
gg
gggg
However, too imprecise...!However, too imprecise...!
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer FunctionMonotone Transfer Function
<[<[gg = ]= ]
• Plug:Plug:
open gapsopen gaps
xx11 <[ <[gg = = xx22]]
gg
gg
gggg
gg
gg
gggg
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Monotone Transfer FunctionMonotone Transfer Function
• Plug:Plug: xx11 <[ <[gg = = xx22]]
<[<[gg = ]= ]
open gapsopen gaps
gg
gg
gggg
gg
gg
gggg
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
GapTrack AnalysisGapTrack Analysis
• GapTrack data-flow analysis:GapTrack data-flow analysis:– program points compute:program points compute:
•““Tracks the origins (templates) of open Tracks the origins (templates) of open gaps”gaps”
((gg )) ’’
: : GNameGName 22TEMPLATESTEMPLATES
<[<[gg = ]= ]
gg
gg
gggg
gg
gg
gggg
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
...;...;h = greeting <[h = greeting <[who who = = ”Stranger””Stranger”];];h = h <[h = h <[what what = = [[ <b>GPCE</b> ]][[ <b>GPCE</b> ]]];];showshow cover <[ cover <[contentscontents = h]; = h];
• Now: Now: summary graphsummary graph show show statementsstatements
•Then what...?Then what...?
Validation?Validation?
””Stranger”Stranger”
covercover
greetinggreeting
bricsbrics
contentscontents whowho
whatwhat
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Validation?Validation?
a set of a set of hopefulhopeful
XML docs XML docs
a set of a set of hopefulhopeful
XML docs XML docs
A A summary graphsummary graphdescribes:describes:
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Validation?Validation?
a set of a set of hopefulhopeful
XML docs XML docs
a set of a set of hopefulhopeful
XML docs XML docs
a set of a set of validvalid
XML docs XML docs
a set of a set of validvalid
XML docs XML docs
A A summary graphsummary graphdescribes:describes:
A DTD describesA DTD describes(e.g. XHTML 1.0):(e.g. XHTML 1.0):
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Validation!Validation!
a set of a set of hopefulhopeful
XML docs XML docs
a set of a set of hopefulhopeful
XML docs XML docs
a set of a set of validvalid
XML docs XML docs
a set of a set of validvalid
XML docs XML docs
validation!validation!
A A summary graphsummary graphdescribes:describes:
A DTD describesA DTD describes(e.g. XHTML 1.0):(e.g. XHTML 1.0):
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Validation!Validation!
a set of a set of hopefulhopeful
XML docs XML docs
a set of a set of hopefulhopeful
XML docs XML docs
a set of a set of validvalid
XML docs XML docs
a set of a set of validvalid
XML docs XML docs
validationvalidation!
• Decidable!:• Summary graph traversal (parsing vs. DTD)• Memoization termination• Sound and complete!
• Decidable!:• Summary graph traversal (parsing vs. DTD)• Memoization termination• Sound and complete!
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Compiler Compiler VValalidation Recipeidation Recipe
• Step-by-Step:Step-by-Step:1. 1. Extract control-flow graphExtract control-flow graph2. 2. Gap-and-FieldGap-and-Field data-flow analysisdata-flow analysis3. 3. GapGapTrackTrack data-flow analysisdata-flow analysis4. 4. Summary GraphSummary Graph data-flow data-flow analysisanalysis55. . ValidationValidation ((shows)shows) graphgraph analysi analysiss
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Experiments Experiments 800MHz Pentium III / Linux800MHz Pentium III / Linux
Program # Lines # Templates
Time (sec.)
chat 65 3 0.1guess 75 6 0.1calendar 77 5 0.1xbiff 561 18 0.1webboard 1132 37 0.6cdshop 1709 36 0.5jaoo 1941 73 2.4bachelor 2535 137 8.2courses 4465 57 1.3eatcs 5345 133 6.7
Many validation errors found, Many validation errors found, no spurious errorsno spurious errors
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
ExampleExample Revisited Revisited
html greeting = [[ Hello <[who]>, welcome to <[what]>.]];
html cover = [[ <head><title>Welcome</title></head> <body><[contents]></body>]];
html h;h = greeting <[who = ”Stranger”];h = h <[what = [[ <b>GPCE</b> ]]];show cover <[contents = h];
html greeting = [[ Hello <[who]>, welcome to <[what]>.]];
html cover = [[ <head><title>Welcome</title></head> <body><[contents]></body>]];
html h;h = greeting <[who = ”Stranger”];h = h <[what = [[ <b>GPCE</b> ]]];show cover <[contents = h];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Planting an ErrorPlanting an Error
html greeting = [[ <td>Hello <[who]>, welcome to <[what]>.</td>]];
html cover = [[ <head><title>Welcome</title></head> <body><table><[contents]></table></body>]];
html h;h = greeting <[who = ”Stranger”];h = h <[what = [[ <b>GPCE</b> ]]];show cover <[contents = h];
html greeting = [[ <td>Hello <[who]>, welcome to <[what]>.</td>]];
html cover = [[ <head><title>Welcome</title></head> <body><table><[contents]></table></body>]];
html h;h = greeting <[who = ”Stranger”];h = h <[what = [[ <b>GPCE</b> ]]];show cover <[contents = h];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
ExampleExample Revisited Revisited--- welcome.wig:13 HTML Validation:welcome.wig:7 warning: possible illegal subelement ‘td’ of ‘table’ template: <table><[contents]></table> contents: td plugs: contents:{welcome.wig:13}
--- welcome.wig:13 HTML Validation:welcome.wig:7 warning: possible illegal subelement ‘td’ of ‘table’ template: <table><[contents]></table> contents: td plugs: contents:{welcome.wig:13}
112233445566778899
1010111112121313
html greeting = [[ <td>Hello <[who]>, welcome to <[what]>.</td>]];
html cover = [[ <head><title>Welcome</title></head> <body><table><[contents]></table></body>]];
html h;h = greeting <[who = ”Stranger”];h = h <[what = [[ <b>GPCE</b> ]]];show cover <[contents = h];
html greeting = [[ <td>Hello <[who]>, welcome to <[what]>.</td>]];
html cover = [[ <head><title>Welcome</title></head> <body><table><[contents]></table></body>]];
html h;h = greeting <[who = ”Stranger”];h = h <[what = [[ <b>GPCE</b> ]]];show cover <[contents = h];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Domain Specific RepresentationRepresentation
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Domain Specific RepresentationRepresentation
• Constant:Constant:• O O (1)(1)
• Plug:Plug:• O O (1)(1)
• Show:Show:• OO (|d|) (|d|)
[[ hello <[what]>! ]]
x <[g = y]
show d;
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Domain Specific RepresentationRepresentation
document structure
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Domain Specific RepresentationRepresentation
document structure
string
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Domain Specific RepresentationRepresentation
document structure
string templates
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Domain Specific RepresentationRepresentation
dynamic
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Domain Specific RepresentationRepresentation
static
dynamic
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Domain Specific RepresentationRepresentation
static
dynamic“Transmit JavaScript recipe for client-side doc. reconstruction”
“Transmit JavaScript recipe for client-side doc. reconstruction”
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Domain Specific RepresentationRepresentation
static
dynamic“Transmit JavaScript recipe for client-side doc. reconstruction”
“Transmit JavaScript recipe for client-side doc. reconstruction”
“Write each template to a separate file so that it can be cached”
“Write each template to a separate file so that it can be cached”
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
ExperimentsExperiments
• Size of HTML:Size of HTML: original HTML
JavaScript reconstruction
...all templates cached
Cut to 2.6% – 25% sizeCut to 2.6% – 25% size
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Experiments Experiments (700MHz, 28.8 Modem)(700MHz, 28.8 Modem)
• TimeTime (download+render):(download+render): original HTML
...all templates cached
2.2x – 10x faster2.2x – 10x faster
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Problems?Problems?
• ““DynDoc”:DynDoc”:•Templates with Templates with named gapsnamed gaps•Plug and showPlug and show
• ProblemsProblems::•ForcesForces linear linear document document constructionconstruction• Intermixes pIntermixes programmerrogrammer // d designer esigner aspectsaspects•No interaction cNo interaction correspondenceorrespondence•No static XML validationNo static XML validation•No common fragments cachingNo common fragments caching
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Example: ”EnterEmail”Example: ”EnterEmail”
htmlhtml input = input = [[[[ Please enter your email:<br>Please enter your email:<br> <input type=”text” name=”<input type=”text” name=”emailemail”>”>]]]];;
htmlhtml output = output = [[ Your email is: [[ Your email is: <[<[emailemail]>]> ]] ]];;
stringstring s; s; showshow input input receivereceive[s = [s = emailemail];];showshow output <[ output <[emailemail = s];= s];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Example: ”EnterEmail”Example: ”EnterEmail”
formatformat EmailEmail = = regexpregexp(”<(”<wordword>@<>@<wordword>(>(\\.<.<wordword>)+”);>)+”);
htmlhtml input = input = [[[[ Please enter your email:<br>Please enter your email:<br> <input type=”text” name=”<input type=”text” name=”emailemail”>”>]]]];;
htmlhtml output = output = [[ Your email is: [[ Your email is: <[<[emailemail]>]> ]] ]];;
stringstring s; s; showshow input input receivereceive[s = [s = emailemail];];showshow output <[ output <[emailemail = s];= s];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Example: ”EnterEmail”Example: ”EnterEmail”
formatformat EmailEmail = = regexpregexp(”<(”<wordword>@<>@<wordword>(>(\\.<.<wordword>)+”);>)+”);
htmlhtml input = input = [[[[ Please enter your email:<br>Please enter your email:<br> <input type=”text” name=”<input type=”text” name=”emailemail” ” format=”format=”EmailEmail””>>]]]];;
htmlhtml output = output = [[ Your email is: [[ Your email is: <[<[emailemail]>]> ]] ]];;
stringstring s; s; showshow input input receivereceive[s = [s = emailemail];];showshow output <[ output <[emailemail = s];= s];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Example: ”EnterEmail”Example: ”EnterEmail”
formatformat EmailEmail = = regexpregexp(”<(”<wordword>@<>@<wordword>(>(\\.<.<wordword>)+”);>)+”);
htmlhtml input = input = [[[[ Please enter your email:<br>Please enter your email:<br> <input type=”text” name=”<input type=”text” name=”emailemail” ” format=”format=”EmailEmail””>>]]]];;
htmlhtml output = output = [[ Your email is: [[ Your email is: <[<[emailemail]>]> ]] ]];;
stringstring s; s;show input input receivereceive[s = [s = emailemail];];showshow output <[ output <[emailemail = s];= s];
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Form Field Validation: Form Field Validation: ““PowerForms”PowerForms”• Domain specific languageDomain specific language::
•uniquely for uniquely for form-fieldform-field validation validation
• Declarative Declarative specification (regexps)specification (regexps)::•AAbstracts away operational detailsbstracts away operational details
• PowerForms also available as PowerForms also available as stand-alone toolstand-alone tool
PowerFormsPowerFormsPowerFormsPowerFormsHTMLHTML
JavaScript
(subset)
JavaScript
(subset)
HTMLHTML
RegexpsRegexps
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Form-Form-Field InterdependencyField Interdependency
• ““Favorite LetterFavorite Letter””•Select filteringSelect filtering
• ““NYC OfficeNYC Office””•Complex interdependencyComplex interdependency
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
OutlineOutline
• Introduction (Program Family)Introduction (Program Family)
• Session ManagementSession Management•State ManagementState Management
• Document ConstructionDocument Construction•Domain Specific VerificationsDomain Specific Verifications
•Domain Specific OptimizationDomain Specific Optimization
• Form-Field ValidationForm-Field Validation
• ConclusionConclusion
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Language Domain Specific Language Design and Analyses:Design and Analyses:
• Yield:Yield:Flexible, Safe, and EfficientFlexible, Safe, and EfficientDynamic Generation of XMLDynamic Generation of XML
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Domain Specific Language Domain Specific Language Design and Analyses:Design and Analyses:
• Yield:Yield:
• AND:AND:•Non-linear Non-linear document document constructionconstruction
•SeparatesSeparates p programmerrogrammer // d designer esigner aspectsaspects
•Guaranteed Guaranteed interaction cinteraction correspondenceorrespondence
•SStatic XML validationtatic XML validation
•CCommon fragments cachingommon fragments caching
Flexible, Safe, and EfficientFlexible, Safe, and EfficientDynamic Generation of XMLDynamic Generation of XML
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Objective AssessmentsObjective Assessments
• Robustness:Robustness:•Session integritySession integrity
•State integrityState integrity
• Interaction correspondenceInteraction correspondence
•XML validityXML validity
• PerformancePerformance•Well...Well...
• ConcisenessConciseness•1/5 code (compared to Java Servlets)1/5 code (compared to Java Servlets)
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
public class SessionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); HttpSession session = request.getSession(true); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><HEAD><TITLE>Servlet Demo</TITLE></HEAD><BODY>"); if (session.isNew()) { out.println("<FORM ACTION=SessionServlet>" + "Enter your name: <INPUT NAME=handle>" + "<INPUT TYPE=SUBMIT></FORM>"); session.putValue("state", "1"); } else { String state = (String) session.getValue("state"); if (state.equals("1")) { String name = (String) request.getParameter("handle"); int users = ((Integer) context.getAttribute("users")).intValue() + 1; context.setAttribute("users", new Integer(users)); session.putValue("name", name); out.println("Hello " + name + ", you are user number " + users); session.putValue("state", "2"); } else /* state.equals("2") */ { String name = (String) session.getValue("name"); out.println("Goodbye " + name); session.invalidate(); } } out.println("</BODY></HTML>"); }}
session management state management document construction
Conciseness (Servlets)Conciseness (Servlets)
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
Conciseness (Conciseness (<<bigwigbigwig>>))service { shared int users = 0;
session Hello() { string name; show [[Enter your name: <input name=handle>]] receive[name=handle]; users++; show [[Hello <[who]>, you are user number <[count]>]] <[who=name,count=users]; show [[Goodbye <[who]>]] <[who=name]; }}
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
0
100
200
300
400
Servlets <bigwig>
Conciseness (Conciseness (<<bigwigbigwig>>))service { shared int users = 0;
session Hello() { string name; show [[Enter your name: <input name=handle>]] receive[name=handle]; users++; show [[Hello <[who]>, you are user number <[count]>]] <[who=name,count=users]; show [[Goodbye <[who]>]] <[who=name]; }}
session management state management document construction misc.
Overall: 1/5 code
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
The The <<bigwigbigwig>> Compiler Compiler
• Version 2.0:Version 2.0:• Implemented in CImplemented in C (f (for or UNIXUNIX // Linux)Linux)
•Complete source code availableComplete source code available– Approximately 2.5 MB sourceApproximately 2.5 MB source
• LicenLicenssee:: GPL (GPL (Gnu Public LicenGnu Public Licenssee))
<<bigwigbigwig>><<bigwigbigwig>>
HTMLHTML
CGI ScriptsCGI Scripts
JavaScriptJavaScript
HTTP Auth.HTTP Auth.
Java AppletsJava Applets
CompleteService
Specification
CompleteService
Specification
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
• Homepage:Homepage:– IntroductionIntroduction– ExamplesExamples– Ref. manualRef. manual– TutorialsTutorials– PapersPapers– PresentationsPresentations– Downloads:Downloads:
•src / binsrc / bin
– 2 Recorded Presentations (MS & IBM 2 Recorded Presentations (MS & IBM Research)Research)
http://www.brics.dk/bigwig/http://www.brics.dk/bigwig/
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
<<bigwigbigwig>> Publications Publications
• Concurrency ControlConcurrency Control ETAPS/FASE,ETAPS/FASE, 19981998• Runtime SystemRuntime System Computer Networks J.Computer Networks J., , 19991999• Dynamic DocumentsDynamic Documents POPL, POPL, 20002000• Form-Field ValidationForm-Field Validation WWW Journal, WWW Journal, 20002000• HTML ValidationHTML Validation PASTE, PASTE, 20012001• The The <<bigwigbigwig>> Project Project TOIT Journal,TOIT Journal, 20022002• Syntax MacrosSyntax Macros PEPM, PEPM, 20022002• Document CachingDocument Caching WWW Journal, WWW Journal, 20022002
GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003GPCE 2003, Erfurt Dynamic Generation of XML September 22, 2003
<<bigwigbigwig>> JWIG (Java) JWIG (Java)
http://www.brics.dk/JWIG/