Scala, XML and GAE
Upcoming SlideShare
Loading in...5
×
 

Scala, XML and GAE

on

  • 5,585 views

Presentation at first Melbourne Scala User Group 27th April, 2009

Presentation at first Melbourne Scala User Group 27th April, 2009

Statistics

Views

Total Views
5,585
Views on SlideShare
5,559
Embed Views
26

Actions

Likes
5
Downloads
52
Comments
0

4 Embeds 26

http://www.slideshare.net 22
http://www.linkedin.com 2
http://www.mefeedia.com 1
http://www.lmodules.com 1

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Scala, XML and GAE Scala, XML and GAE Presentation Transcript

  • scala, xml and gae mark@ryall.name
  • xml literals
  • val document = <root> <child> <grandchild an_attribute=quot;value1quot; /> <grandchild an_attribute=quot;value2quot; /> </child> </root>
  • val document = scala.xml.Elem(null, quot;rootquot;, scala.xml.Null, scala.xml.TopScope, scala.xml.Elem(null, quot;childquot;, scala.xml.Null, scala.xml.TopScope, scala.xml.Elem(null, quot;grandchildquot;, new scala.xml.UnprefixedAttribute(quot;an_attributequot;,quot;value1quot;, scala.xml.Null), scala.xml.TopScope, scala.xml.Text(quot;content1quot;) ), scala.xml.Elem(null, quot;grandchildquot;, new scala.xml.UnprefixedAttribute(quot;an_attributequot;,quot;value2quot;, scala.xml.Null), scala.xml.TopScope, scala.xml.Text(quot;content2quot;) ) ) )
  • extraction operators
  • // immediate descendant of document called 'child' document quot;childquot; // any descendant of document called 'another_grandchild' document quot;another_grandchildquot; // any descendant attribute called 'an_attribute' document quot;@an_attributequot;
  • pattern matching
  • • match single node with {variable} • match node sequence with {variable @ _*} • cannot match attribute directly
  • val a = document match { case Elem(_, quot;rootquot;, _, _, _*) => true case _ => null }
  • val a = document match { case <root>{ _* }</root> => true case _ => false }
  • def process(node: scala.xml.Node): Unit = { println(node) node match { case <root>{contents @ _* }</root> => for (a <- contents) process(a) case <child>{contents @ _*}</child> => for (a <- contents) process(a) case <grandchild>{contents @ _*}</grandchild> => for (a <- contents) process(a) case _ => println(quot;leafquot;) } }
  • Concatenation def add(p: Node, newEntry: Node ): Node = p match { case <div>{ ch @ _* }</div> => <div>{ ch }{ newEntry }</div> }
  • Extracting attributes document match { case n @ <grandchild>{ _* }</grandchild> => println(n.attribute(quot;an_attributequot;)) }
  • persisting and restoring
  • scala.xml.XML.saveFull(quot;filename.xmlquot;, document, quot;UTF-8quot;, true, null) val document2 = scala.xml.XML.loadFile(quot;filename.xmlquot;)
  • stream parsing
  • val src = scala.io.Source.fromString(quot;<root><child></child></root>quot;) val er = new scala.xml.pull.XMLEventReader().initialize(src) er.next ...
  • building xml
  • var variable1 = quot;value1quot; val variable2 = <another_grandchild an_attribute=quot;value2quot; /> var document = <root> <child> <grandchild an_attribute={variable1} /> {variable2} </child> </root>
  • google app engine
  • • ‘cloud’ web hosting environment on google’s infrastructure • uses non relational ‘bigtable’ for data persistance • user authentication uses google accounts or openid • also has email (sending), memcache and image manipulation services
  • • working example: • code: http://bitbucket.org/markryall/scalagae • live: http://pairs.appspot.com • use latest datanucleus enhancer from http:// www.datanucleus.org/downloads/maven2- nightly/org/datanucleus/datanucleus- enhancer/1.1.2/
  • basics
  • class Servlet extends HttpServlet { override def doGet(request: HttpServletRequest, response: HttpServletResponse): Unit = { val out = response.getWriter() ... out.println(<html>{head}<body>{body}</body></html>) } }
  • authentication
  • var userService = UserServiceFactory.getUserService(); var user = userService.getCurrentUser(); if (user == null) { response.sendRedirect(userService.createLoginURL(request.getRequestURI())) return }
  • persistence
  • @PersistenceCapable {val identityType = IdentityType.APPLICATION} class Person(@Persistent var firstName: String,@Persistent var lastName: String) { @PrimaryKey @Persistent {val valueStrategy = IdGeneratorStrategy.IDENTITY} var id: java.lang.Long = null }