Scala, XML and GAE

28
scala, xml and gae [email protected]

description

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

Transcript of Scala, XML and GAE

Page 2: Scala, XML and GAE

xml literals

Page 3: Scala, XML and GAE

val document =<root> <child> <grandchild an_attribute="value1" /> <grandchild an_attribute="value2" /> </child></root>

Page 4: Scala, XML and GAE

val document =scala.xml.Elem(null, "root", scala.xml.Null, scala.xml.TopScope, scala.xml.Elem(null, "child", scala.xml.Null, scala.xml.TopScope, scala.xml.Elem(null, "grandchild", new scala.xml.UnprefixedAttribute("an_attribute","value1", scala.xml.Null), scala.xml.TopScope, scala.xml.Text("content1") ), scala.xml.Elem(null, "grandchild", new scala.xml.UnprefixedAttribute("an_attribute","value2", scala.xml.Null), scala.xml.TopScope, scala.xml.Text("content2") ) ))

Page 5: Scala, XML and GAE

extraction operators

Page 6: Scala, XML and GAE

// immediate descendant of document called 'child'document \ "child"

// any descendant of document called 'another_grandchild'document \\ "another_grandchild"

// any descendant attribute called 'an_attribute'document \\ "@an_attribute"

Page 7: Scala, XML and GAE

pattern matching

Page 8: Scala, XML and GAE

• match single node with {variable}

• match node sequence with {variable @ _*}

• cannot match attribute directly

Page 9: Scala, XML and GAE

val a = document match { case Elem(_, "root", _, _, _*) => true case _ => null}

Page 10: Scala, XML and GAE

val a = document match { case <root>{ _* }</root> => true case _ => false}

Page 11: Scala, XML and GAE

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("leaf") }}

Page 12: Scala, XML and GAE

def add(p: Node, newEntry: Node ): Node = p match { case <div>{ ch @ _* }</div> => <div>{ ch }{ newEntry }</div> }

Concatenation

Page 13: Scala, XML and GAE

document match { case n @ <grandchild>{ _* }</grandchild> => println(n.attribute("an_attribute"))}

Extracting attributes

Page 14: Scala, XML and GAE

persisting and restoring

Page 15: Scala, XML and GAE

scala.xml.XML.saveFull("filename.xml", document, "UTF-8", true, null)

val document2 = scala.xml.XML.loadFile("filename.xml")

Page 16: Scala, XML and GAE

stream parsing

Page 17: Scala, XML and GAE

val src = scala.io.Source.fromString("<root><child></child></root>")val er = new scala.xml.pull.XMLEventReader().initialize(src)er.next...

Page 18: Scala, XML and GAE

building xml

Page 19: Scala, XML and GAE

var variable1 = "value1"

val variable2 = <another_grandchild an_attribute="value2" />

var document = <root> <child> <grandchild an_attribute={variable1} /> {variable2} </child> </root>

Page 20: Scala, XML and GAE

google app engine

Page 21: Scala, XML and GAE

• ‘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

Page 23: Scala, XML and GAE

basics

Page 24: Scala, XML and GAE

class Servlet extends HttpServlet { override def doGet(request: HttpServletRequest, response: HttpServletResponse): Unit = { val out = response.getWriter()... out.println(<html>{head}<body>{body}</body></html>) }}

Page 25: Scala, XML and GAE

authentication

Page 26: Scala, XML and GAE

var userService = UserServiceFactory.getUserService();var user = userService.getCurrentUser();

if (user == null) { response.sendRedirect(userService.createLoginURL(request.getRequestURI())) return}

Page 27: Scala, XML and GAE

persistence

Page 28: Scala, XML and GAE

@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 }