SlideShare a Scribd company logo
1 of 74
A lightweight
             Groovy toolkit
for developing web applications
         on Google App Engine
Guillaume Laforge / @glaforge

   • Groovy Project Manager
   • Head of Groovy Development
     at SpringSource
   • Initiator of the Grails framework
   • Founder of the Gaelyk toolkit
   • Co-author of Groovy in Action
   • Member of «Les Cast Codeurs» podcast

   • Speaker: JavaOne, QCon, JavaZone, Sun TechDays,
     Devoxx, The Spring Experience, SpringOne2GX,
     JAX, Dynamic Language World, IJTC, and more...

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   2
Et la suite du le Paris GGUG ?

   • Aujourd’hui, nous allons parler de Gaelyk

   • Et demain ?
           – Spock — Mathilde Lemée
           – Transformation d’AST — Hamlet D’Arcy
           – Gradle — Grégory Boissinot


   • Et vous ?
           – Racontez-nous votre utilisation de Groovy,
             Grails, Gradle, Spock, etc.



Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   3
Cloud
Computing
IaaS, PaaS, SaaS



   • Software as a Service
           – Gmail, SalesForce.com                                                                                   SaaS
   • Platform as a Service
           – Google App Engine
                                                                                                                     PaaS
   • Infrastructure as a Service
           – Amazon EC2
                                                                                                                     IaaS
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.          5
IaaS, PaaS, SaaS



   • Software as a Service
           – Gmail, SalesForce.com                                                                                   SaaS
   • Platform as a Service
           – Google App Engine
                                                                                                                     PaaS
   • Infrastructure as a Service
           – Amazon EC2
                                                                                                                     IaaS
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.          5
IaaS, PaaS, SaaS



   • Software as a Service
           – Gmail, SalesForce.com                                                                                   SaaS
   • Platform as a Service
           – Google App Engine
                                                                                                                     PaaS
   • Infrastructure as a Service
           – Amazon EC2
                                                                                                                     IaaS
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.          5
Google App Engine

   • Google’s PaaS solution
   • Run your app on Google’s infrastructure

   • Initially just Python supported

   • Java supported added too
           – Sandboxed JVM
           – Jetty servlet container


   • Several JVM-compatible language supported


Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   6
Key aspects

   • You can use most of your usual web frameworks for
     developping apps on App Engine Java
           – A WAR file, basically! (an exploded war actually)
           – Uploading to the cloud by sending deltas of changes

   • No OS image, or software to install
           – Unlike with Amazon EC2

   • All the scaling aspects are handled for you
           – Database / session replication, load balancing...

   • There are quotas, but you need a high traffic
     application to start being charged
           – Free to get started

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   7
Available services

   • Memcache                                                                                                        – Send / receive Jabber
                                                                                                                       messages (GTalk)
           – JCache implementation
           – Save on CPU and DB                                                                               • User
                                                                                                                     – Use Google’s user/
   • URL Fetch                                                                                                         authentication system
           – Access remote resources                                                                                 – OAuth support
           – HttpUrlConnection
                                                                                                              • Cron & Task queues
   • Mail                                                                                                            – Schedule tasks at regular
           – Support both incoming and                                                                                 intervals
             outgoing emails                                                                                         – Queue units of work
   • Images                                                                                                   • Blobstore
           – Resize, crop, rotate...                                                                                 – For storing large content
   • XMPP                                                                                                     • And much more...
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                                 8
Limitations

   •Not our usual relational database
           – key / value datastore

   •30 seconds request duration limit
   • Forbidden to
           – write on the file system
           – create threads
           – use raw sockets
           – issue system calls
           – use IO / Swing / etc. directly
                  •There’s a whitelist of classes allowed

   • Number of files and their size are limited
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   9
Quotas




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   10
Quotas (1/2)

   •Bandwidth                                                                                                 •Mail
           – 1,3M requests/day                                                                                       – 7K calls/day
           – 1GB/day in/out                                                                                          – 2K recepients/day
           – 6.5 CPU hours/day                                                                                       – 5K emails/day
                                                                                                                     – 2K attachments
                                                                                                                     – 100MB of attachments
   •Datastore
           – 10M calls
           – 1GB/day                                                                                          •URL Fetch
           – 12GB in / 115GB out                                                                                     – 657K calls/day
           – 60 CPU hours/day                                                                                        – 4GB in/out /day



Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                            11
Quotas (2/2)

   •XMPP                                                                                                      •Memcache
           – 657K calls/day                                                                                          – 8.6M calls/day
           – 4GB data sent/day                                                                                       – 10GB in
           – 657K recepients/day                                                                                     – 50GB out
           – 1MB invitations/day
                                                                                                              •Task queues
   •Image manipulation                                                                                               – 100K calls

    –864 calls/day
    –1GB in / 5GB out
    –2.5M transforms



Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                      12
Quotas (2/2)

   •XMPP                                                                                                      •Memcache
           – 657K calls/day                                                                                          – 8.6M calls/day
           – 4GB data sent/day                                                                                       – 10GB in
           – 657K recepients/day                                                                                     – 50GB out
           – 1MB invitations/day
                                                                                                              •Task queues
   •Image manipulation                                                                                               – 100K calls

    –864 calls/day
                                                                                                                                        ur es
    –1GB in / 5GB out                                                                                                           d fig
                                                                                                                          da te
    –2.5M transforms
                                                                                                                     O ut

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                              12
The Datastore
The datastore...

   • Not your father’s relational database! «NoSQL»

   • Distributed key / value store
           – Based on Google’s «BigTable»
           – Schema-less approach
   • Supporting
           – Transactions and partitioning
           – Hierarchies through entity groups
   • Data access APIs
           – JPA and JDO
                  • but adds a big request load time factor
           – Direct low-level APIs

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   14
...and its «limitations»

   • You’re not using SQL
           –No joins
           – No database constraints
           – No aggregation functions (count, avg...)


   • In a query, you can only filter on one column
     for inequality

   • Transactions only available in entity groups

   • You can only update an entity once in a transaction

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   15
Nice dashboard
http://gaelyk.appspot.com




                            F
http://gaelyk.appspot.com




                            F
Gaelyk 0.6 released!




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   18
• Gaelyk is a lightweight Groovy toolkit on top of
     the Google App Engine Java SDK

   • Gaelyk builds on Groovy’s servlet support
           – Groovlets: Groovy scripts instead of raw servlets!
           – Groovy templates: JSP-like template engine
           – Both allow for a clean separation of views and logic


   • Gaelyk provides several enhancements around the
     GAE Java SDK to make life easier, thanks to
     Groovy’s dynamic nature


Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   19
Why Groovy?

   • Groovy is a dynamic language for the JVM
           – very flexible, malleable, expressive and concise syntax
           – easy to learn for Java developers
                  • deriving from the Java 5 grammar
           – provides powerful APIs to simplify the life of developers
                  • possibility to dynamically enrich existing APIs
           – support for Groovlets and its own template engine




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   20
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   21
First steps...



• Go to http://gaelyk.appspot.com
• Download the template project
• Put your first Groovlet in /WEB-INF/groovy
• And your templates in /WEB-INF/pages
• And you’re ready to go!
• Launch dev_appserver.sh
• Go to http://localhost:8080/
The web.xml

                                                                             ">
             <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5
               <listener>
                                                                              /servlet-class>
                 <listener-class>groovyx.gaelyk.GaelykServletContextListener<
               </listener>
               <servlet>
                 <servlet-name>GroovletServlet</servlet-name>
                 <servlet-class>groovyx.gaelyk.GaelykServlet</servlet-class>
               </servlet>
               <servlet>
                 <servlet-name>TemplateServlet</servlet-name>
                                                                              -class>
                 <servlet-class>groovyx.gaelyk.GaelykTemplateServlet</servlet
               </servlet>

                <servlet-mapping>
                  <servlet-name>GroovletServlet</servlet-name>
                  <url-pattern>*.groovy</url-pattern>
                </servlet-mapping>
                <servlet-mapping>
                  <servlet-name>TemplateServlet</servlet-name>
                  <url-pattern>*.gtpl</url-pattern>
                </servlet-mapping>
              </web-app>




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   23
MVC: Groovlets and templates




                                Groovlets                                                                            Templates
                               (controllers)                                                                           (views)




                                                                                    Entities
                                                                                   (domain)




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
A groovlet

   • Instead of writing full-blown servlets, just write
     Groovy scripts (aka Groovlets)

                                 def numbers = [1, 2, 3, 4]
                                 def now = new Date()

                                  html.html {
                                      body {
                                          numbers.each { number -> p number }
                                          p now
                                      }
                                  }




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   25
A groovlet

   • Instead of writing full-blown servlets, just write
     Groovy scripts (aka Groovlets)

                                 def numbers = [1, 2, 3, 4]
                                 def now = new Date()

                                  html.html {
                                      body {
                                          numbers.each { number -> p number }
                                          p now
                                      }
                                                                                                                                 di ng
                                                                                                                               oa
                                  }

                                                                                                                          -rel
                                                                                                                       to
                                                                                                                     Au
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                       25
A template

                                      <html>
                                          <body>
                                               <p><%
                                                   def message = "Hello World!"
                                                   print message %>
                                               </p>
                                               <p><%= message %></p>
                                               <p>${message}</p>
                                               <ul>
                                               <% 3.times { %>
                                                    <li>${message}</li>
                                               <% } %>
                                               </ul>
                                           </body>
                                       </html>


Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   26
A template

                                      <html>
                                          <body>
                                               <p><%
                                                   def message = "Hello World!"
                                                   print message %>
                                               </p>
                                               <p><%= message %></p>
                                               <p>${message}</p>
                                               <ul>
                                               <% 3.times { %>
                                                    <li>${message}</li>
                                               <% } %>
                                                                                                                                 di ng
                                               </ul>
                                                                                                                            el oa
                                           </body>
                                                                                                                       to -r
                                                                                                                     Au
                                       </html>


Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                       26
Shortcuts

• Google services                                                                                               • Variables available
  –datastore                                                                                                      –request / response
  –blobstore                                                                                                      –context / application
  –memcache                                                                                                       –sessions
  –capabilities                                                                                                   –params / headers
  –images                                                                                                         –out / sout / html
  –urlFetch                                                                                                       –localMode / app.*
  –mail
  –userService / user                                                                                           • Methods available
  –defaultQueue / queues                                                                                          –include / forward /
  –xmpp                                                                                                            redirect
  –namespace                                                                                                      –println / print
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                         27
D E M O
          28
Groovy sugar!
Sending emails with Gaelyk




                    mail.send to:                                                  'to@gmail.com',
                            from:                                                  'other@gmail.com',
                         subject:                                                  'Hello World',
                        htmlBody:                                                  '<bold>Hello</bold>'




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   30
...compared to Java


  Properties props = new Properties();
                                                      , null);
  Sessio n session = Session.getDefaultInstance(props

  try {
      Message msg = new MimeMessage(session);
                                                      om", "Admin"));
      msg .setFrom(new InternetAddress("other@gmail.c
                                               O,
      msg.addRecipient(Message.RecipientType.T
                                                             , "Mr. User"));
                        new InternetAddress("to@example.com"
      msg.setSubject("Hello World");
      msg.setText("<bold>Hello</bold>");
      Transport.send(msg);
  } catch (AddressException e) {}
  } catch (MessagingException e) {}




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   31
Accessing the datastore

   • Direct interaction with the low-level datastore API
                                      Entity entity = new Entity("person")
                                       
                                                                                   map
                                      // subscript notation, like when accessing a
                                      entity['name'] = "Guillaume Laforge"
                                       
                                      // normal property access notation
                                      entity.age = 32

                                       entity.save()   // asyncSave()
                                       entity.delete() // asyncDelete()

                                       datastore.withTransaction {
                                           // do stuff with your entities
                                           // within the transaction
                                       }

                                        // use the asynchronous datastore service
                                        datastore.async.put(entity)

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   32
Querying to be improved...

                  import com.google.appengine.api.datastore.*
                                                                                     der.*
                  import static com.google.appengine.api.datastore.FetchOptions.Buil
                   
                  // query the scripts stored in the datastore
                  def query = new Query("savedscript")
                   
                  // sort results by descending order of the creation date
                  query.addSort("dateCreated", Query.SortDirection.DESCENDING)
                   
                                                                                    author
                  // filters the entities so as to return only scripts by a certain
                                                                                     r)
                  query.addFilter("author", Query.FilterOperator.EQUAL, params.autho
                    
                   PreparedQuery preparedQuery = datastore.prepare(query)
                    
                   // return only the first 10 results
                   def entities = preparedQuery.asList( withLimit(10) )




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   33
...into something groovier?



                              def entities = datastore.query {
                                  select all from savedscript
                                  sort desc by dateCreated
                                  where author == params.author
                                  limit 10
                              } as List




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   34
...into something groovier?



                              def entities = datastore.query {
                                  select all from savedscript
                                  sort desc by dateCreated
                                  where author == params.author
                                  limit 10                         te d!
                              } as List                       m en
                                                                                                                     p le
                                                                                                        et Im
                                                                                                    o tY
                                                                                              N


Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.          34
URL Routing system (1/4)

   • You can have friendly URL mappings with the URL
     routing system
        all "/aboutus",
            redirect: "/blog/2008/10/20/about-us"

        all "/blog/@year/@month/@day/@title",
                                                                @day@title=@title"
            forward: "/blog.groovy?year=@year&month=@month@day=

         get "/blog/@year/@month/@day",
                                                                 @day"
             forward: "/blog.groovy?year=@year&month=@month@day=

         get "/book/isbn/@isbn",
             forward: "/book.groovy?isbn=@isbn",
             validate: { isbn ==~ /d{9}(d|X)/ }


           – You’ll have to configure the RouteFilter in web.xml

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   35
URL Routing system (2/4)

   • You can also define caching times

                   get "/aboutus", cache: 24.hours,
                       forward: "/aboutus.gtpl"

                   get "/breaking-news", cache: 1.minute,
                       forward: "/news.groovy?last=10"


           – Nice for GAE’s infamous «loading requests»
                  •less critical with GAE SDK 1.4
                          – ability to reserve 3 instances (billing)
                          – warmup requests

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   36
URL Routing system (3/4)

   • Special routes for specifying
           – incoming emails
           – jabber messages



                                      email to "/incomingMail.groovy"

                                       jabber to "/incomingXmpp.groovy"




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   37
URL Routing system (4/4)

   • Namespace awareness: nice for multitenancy
   • Capability awareness: for graceful degradation

        // @cust customer variable could be « acme »
        post "/@cust/update", forward: "/update.groovy",
                             namespace: { "ns-$cust" }

                                                              es status
        // different destinations depending on the GAE servic
        get "/speakers", forward {
            to "/speakers.groovy" // default destination
            // when the datastore is not available
            to "/unavailable.gtpl" on DATASTORE not ENABLED
            // show some maintenance is upcoming
                                                                   
            to "/speakers.groovy?maintenance=true" on DATASTORE
                    is SCHEDULED_MAINTENANCE
         }

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   38
Capabilities

   • Google App Engine allows you to know the status
     and availability of the various services
           – DATASTORE, DATESTORE_WRITE, MEMCACHE...
           – ENABLED, DISABLED, UNKNOWN,
             SCHEDULED_MAINTENANCE
           – is() and not() methods


              if (capabilities[DATASTORE_WRITE].is(ENABLED)) {
                  // write some content in the datastore
              } else {
                  // otherwise, redirect to some maintenance page
              }


Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   39
Task queue API

                     // access a configured queue using the subscript notation
                     queues['dailyEmailQueue']
                      
                     // or using the property access notation
                     queues.dailyEmailQueue
                      
                     // you can also access the default queue with:
                     queues.default
                     defaultQueue

                      // add a task to the queue
                      queue << [
                          countdownMillis: 1000, url: "/task/dailyEmail",
                          taskName: "sendDailyEmailNewsletter",
                          method: 'PUT', params: [date: '20090914'],
                          payload: content
                      ]


Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   40
Jabber / XMPP support (1/3)

   • Sending instant messages

                String recipient = "someone@gmail.com"
                 
                // check if the user is online
                if (xmpp.getPresence(recipient).isAvailable()) {
                    // send the message
                    def status = xmpp.send(to: recipient,
                                         body: "Hello, how are you?")
                  
                              // checks the message was successfully
                              // delivered to all the recipients
                              assert status.isSuccessful()
                 }



Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   41
Jabber / XMPP support (2/3)

   • Sending instant messages with an XML payload
                String recipient = "service@gmail.com"
                 
                // check if the service is online
                if (xmpp.getPresence(recipient).isAvailable()) {
                    // send the message
                    def status = xmpp.send(to: recipient, xml: {
                        customers {
                            customer(id: 1) {
                                name 'Google'
                            }
                        }
                    })
                 
                    // checks the message was successfully delivered to the service
                    assert status.isSuccessful()
                 }



Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   42
Jabber / XMPP support (2/3)

   • Sending instant messages with an XML payload
                String recipient = "service@gmail.com"
                 
                // check if the service is online
                if (xmpp.getPresence(recipient).isAvailable()) {
                    // send the message
                    def status = xmpp.send(to: recipient, xml: {
                        customers {
                            customer(id: 1) {              <customers>
                                name 'Google'                  <customer id=’1’>
                            }                                      <name>Google</name>
                        }                                      </customer>
                                                           </customers>
                    })
                 
                    // checks the message was successfully delivered to the service
                    assert status.isSuccessful()
                 }



Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   42
Jabber / XMPP support (3/3)

   • Receving incoming instant messages
           – Once you’ve configured a route for jabber messages
           – Add the inbound message service in appengine-web.xml

                 def message = xmpp.parseMessage(request)
                 // get the body of the message
                 message.body
                 // get the sender Jabber ID
                 message.from
                 // get the list of recipients Jabber IDs
                 message.recipients
                  
                 // if the message is an XML document instead of a raw string message
                 if (message.isXml()) {
                     // get the raw XML
                     message.stanza
                     // get a document parsed with XmlSlurper
                     message.xml
                 }
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   43
Memcache service

   • Map notation access to the cache

                                                           }
        class Country implements Serialzable { String name
         
        def countryFr = new Country(name: 'France')
         
                                                              in the cache
        // use the subscript notation to put a country object
        // (you can also use non-string keys)
        memcache['FR'] = countryFr
         
        // check that a key is present in the cache
        if ('FR' in memcache) {
                                                               the cache using a key
            // use the subscript notation to get an entry from
            def countryFromCache = memcache['FR']
          }




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   44
Closure memoization

   • Cache the return values for each dinstinct
     invocation (for a given arguments set)

                                                                 ->
              def countEntities = memcache.memoize { String kind
                  datastore.prepare( new Query(kind) )
                           .countEntities()
              }

               // first call
               def totalPics = countEntityes('photos')

               // second call, hitting the cache
               totalPics = countEntityes('photos')



Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   45
Blobstore enhancements

   • The blobstore allows to store some large content
           – images, videos, etc.
          def blob = ...
          print blob.filename // contentType, creation, size

           // output the content of the blob to the response
           blob.serve response

           // read the content of the blob
           blob.withReader { Reader r -> ... }
           blob.withStream { InputStream is -> ... }

            // delete the blob
            blob.delete()

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   46
Images service

   • Readable DSL for manipulating images

                      def blobKey = ...

                      def image = blobKey.image.transform {
                          resize 1600, 1200
                          crop 0.1, 0.1, 0.9, 0.9
                          horizontal flip // vertical flip too
                          rotate 90
                          feeling lucky // image corrections
                      }

                       def thumbnail = image.resize(100, 100)


Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   47
Channel Service

   • For Comet-style applications

                      def token = hannel.createChannel('clientID')
                      channel.send 'clientID', 'Hi!'



   • Then in the view, in JavaScript...

                       channel = new goog.appengine.Channel(token);
                       socket = channel.open();
                       socket.onmessage = function(msg) { ... }




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   48
Simple plugin system (1/3)

• Gaelyk features a simple plugin system for
  extending your apps and share commonalities

• A plugin lets you
        – provide additional groovlets and templates
        – contribute new URL routes
        – add new categories
        – define variables in the binding
        – override existing binding variables
        – provide any static content
        – add new libraries
        – do any initialization
        – add before/after request hooks
Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   49
Simple plugin system (2/3)

• A plugin is actually just a zip file!
        – Basically, just a Gaelyk application, minus...
                •the Groovy / Gaelyk / GAE JARs
                •the web.xml and appengine-web.xml descriptors
        – But with a /WEB-INF/plugins/myplugin.groovy
          descriptor


• A plugin must be referenced in /WEB-INF/
  plugins.groovy with
        – install myplugin
                •shortcut to /WEB-INF/plugins/myplugin.groovy



Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   50
Simple plugin system (3/3)

• An example plugin descriptor
        – /WEB-INF/plugins/jsonPlugin.groovy
          import
net.sf.json.*
          import
net.sf.json.groovy.*
          

          //
add
new
variables
in
the
binding
          binding
{
                                                                        le
              jsonLibVersion
=
"2.3"









//
a
simple
string
variab
                                                                        
of
a
3rd‐party
JAR
              json
=
new
JsonGroovyBuilder()

//
an
instance
of
a
class
          }
          

          //
add
new
routes
with
the
usual
routing
system
format
          routes
{
              get
"/json",
forward:
"/json.groovy"
          }
          

          //
install
a
category
you've
developped
           categories
jsonlib.JsonlibCategory

           before
{
req,
resp
‐>
...
}
//
or
after
           

           //
any
other
initialization
code
you'd
need

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   51
a ry
                                         m m
               S u




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Summary

• Easy access to a cloud solution
        –Deploying Java apps, as easily as you would with PHP
• Familiar to Java folks
        –Your good old Servlet centric webapps style
• Pretty cheap
        –You need a high-trafficed website to reach the quotas
• Gaelyk provides a simplified approach to
  creating Servlet centric webapps in a
  productive manner
        –Leveraging Groovy’s servlet / template support and
         dynamic capabilities

Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   53
What’s coming next?

• Expect more sugar around the Datastore
        – An SQL-like query DSL
        – Easier relationship management (builder?)


• Perhaps pre-compiled groovlets and templates
        – Less needed since SDK 1.4
                • (reserve 3 hot instances, warmup requests)


• Testing facilities specific to Gaelyk
   –testing utility class, Spock-specific ones...

• Anything that’ll come up in newer GAE SDK versions


Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   54
Thanks for your attention!




                                     e
                             e Laforg velopment
                  Gu illaum oovy De         m
                         of Gr e@gmail.co
                  Head laforg
                   E mail: g glaforge
                             @
                   T witter:

                                                                                                            • References:
                                                                                                                 • http://gaelyk.appspot.com/
                                                                                                                 • http://groovy.codehaus.org/
                                                                                                                 • http://code.google.com/
                                                                                                                     appengine/


Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.                               55
Picture credits

         Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png
         Speed limit : http://www.morguefile.com/archive/display/18492
         Warehouse : http://www.morguefile.com/archive/display/85628
         Check mark: http://www.lnl.infn.it/~epics/WikiDumps/localhost/600px-symbol_ok.svg.png
         Puzzle: http://www.everystockphoto.com/photo.php?imageId=263521
         Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png
         Clouds http://www.morguefile.com/archive/display/627059
         http://www.morguefile.com/archive/display/625552
         http://www.morguefile.com/archive/display/629785
         Duke ok GAE http://weblogs.java.net/blog/felipegaucho/archive/ae_gwt_java.png
         Python logo : http://python.org/images/python-logo.gif
         Gaelyc cross with clouds : http://www.morguefile.com/archive/display/37889
         Speed limit : http://www.morguefile.com/archive/display/18492
         Warehouse : http://www.morguefile.com/archive/display/85628
         Snow foot steps : http://www.flickr.com/photos/robinvanmourik/2875929243/
         Sugar : http://www.flickr.com/photos/ayelie/441101223/sizes/l/
         Press release: http://www.napleswebdesign.net/wp-content/uploads/2009/06/press_release_11.jpg




Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.   56

More Related Content

What's hot

Acquia Search Overview
Acquia Search OverviewAcquia Search Overview
Acquia Search OverviewAcquia
 
2011 June - Singapore GTUG presentation. App Engine program update + intro to Go
2011 June - Singapore GTUG presentation. App Engine program update + intro to Go2011 June - Singapore GTUG presentation. App Engine program update + intro to Go
2011 June - Singapore GTUG presentation. App Engine program update + intro to Goikailan
 
Optimizing training on Apache MXNet
Optimizing training on Apache MXNetOptimizing training on Apache MXNet
Optimizing training on Apache MXNetAmazon Web Services
 
Zimbra - BlanKonf Semarang
Zimbra - BlanKonf SemarangZimbra - BlanKonf Semarang
Zimbra - BlanKonf Semarangprinceofgiri
 
Sp2010 high availlability_sql
Sp2010 high availlability_sqlSp2010 high availlability_sql
Sp2010 high availlability_sqlSamuel Zürcher
 
MED201 Media Ingest and Storage Solutions with AWS - AWS re: Invent 2012
MED201 Media Ingest and Storage Solutions with AWS - AWS re: Invent 2012MED201 Media Ingest and Storage Solutions with AWS - AWS re: Invent 2012
MED201 Media Ingest and Storage Solutions with AWS - AWS re: Invent 2012Amazon Web Services
 
Amazon CloudFront - Delivering Dynamic Content From The Edge
Amazon CloudFront - Delivering Dynamic Content From The EdgeAmazon CloudFront - Delivering Dynamic Content From The Edge
Amazon CloudFront - Delivering Dynamic Content From The EdgeAmazon Web Services
 
(Oleg zhurakousky)spring integration-scala-intro
(Oleg zhurakousky)spring integration-scala-intro(Oleg zhurakousky)spring integration-scala-intro
(Oleg zhurakousky)spring integration-scala-introSkills Matter Talks
 
Fez Update: Fez 2 release, APSR outcomes, Research Assessment outcomes
Fez Update: Fez 2 release, APSR outcomes, Research Assessment outcomesFez Update: Fez 2 release, APSR outcomes, Research Assessment outcomes
Fez Update: Fez 2 release, APSR outcomes, Research Assessment outcomesmrangryfish
 
SPSMEL 2012 - SQL 2012 AlwaysOn Availability Groups for SharePoint 2010 / 2013
SPSMEL 2012 - SQL 2012 AlwaysOn Availability Groups for SharePoint 2010 / 2013SPSMEL 2012 - SQL 2012 AlwaysOn Availability Groups for SharePoint 2010 / 2013
SPSMEL 2012 - SQL 2012 AlwaysOn Availability Groups for SharePoint 2010 / 2013Michael Noel
 

What's hot (12)

Acquia Search Overview
Acquia Search OverviewAcquia Search Overview
Acquia Search Overview
 
2011 June - Singapore GTUG presentation. App Engine program update + intro to Go
2011 June - Singapore GTUG presentation. App Engine program update + intro to Go2011 June - Singapore GTUG presentation. App Engine program update + intro to Go
2011 June - Singapore GTUG presentation. App Engine program update + intro to Go
 
Optimizing training on Apache MXNet
Optimizing training on Apache MXNetOptimizing training on Apache MXNet
Optimizing training on Apache MXNet
 
Zimbra - BlanKonf Semarang
Zimbra - BlanKonf SemarangZimbra - BlanKonf Semarang
Zimbra - BlanKonf Semarang
 
Route 53 Latency Based Routing
Route 53 Latency Based RoutingRoute 53 Latency Based Routing
Route 53 Latency Based Routing
 
Sp2010 high availlability_sql
Sp2010 high availlability_sqlSp2010 high availlability_sql
Sp2010 high availlability_sql
 
MED201 Media Ingest and Storage Solutions with AWS - AWS re: Invent 2012
MED201 Media Ingest and Storage Solutions with AWS - AWS re: Invent 2012MED201 Media Ingest and Storage Solutions with AWS - AWS re: Invent 2012
MED201 Media Ingest and Storage Solutions with AWS - AWS re: Invent 2012
 
Amazon CloudFront - Delivering Dynamic Content From The Edge
Amazon CloudFront - Delivering Dynamic Content From The EdgeAmazon CloudFront - Delivering Dynamic Content From The Edge
Amazon CloudFront - Delivering Dynamic Content From The Edge
 
(Oleg zhurakousky)spring integration-scala-intro
(Oleg zhurakousky)spring integration-scala-intro(Oleg zhurakousky)spring integration-scala-intro
(Oleg zhurakousky)spring integration-scala-intro
 
SenseiDB
SenseiDBSenseiDB
SenseiDB
 
Fez Update: Fez 2 release, APSR outcomes, Research Assessment outcomes
Fez Update: Fez 2 release, APSR outcomes, Research Assessment outcomesFez Update: Fez 2 release, APSR outcomes, Research Assessment outcomes
Fez Update: Fez 2 release, APSR outcomes, Research Assessment outcomes
 
SPSMEL 2012 - SQL 2012 AlwaysOn Availability Groups for SharePoint 2010 / 2013
SPSMEL 2012 - SQL 2012 AlwaysOn Availability Groups for SharePoint 2010 / 2013SPSMEL 2012 - SQL 2012 AlwaysOn Availability Groups for SharePoint 2010 / 2013
SPSMEL 2012 - SQL 2012 AlwaysOn Availability Groups for SharePoint 2010 / 2013
 

Viewers also liked

Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Guillaume Laforge
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Guillaume Laforge
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Guillaume Laforge
 
Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Guillaume Laforge
 

Viewers also liked (6)

Groovy 2.0 webinar
Groovy 2.0 webinarGroovy 2.0 webinar
Groovy 2.0 webinar
 
Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
Groovy 2 and beyond
Groovy 2 and beyondGroovy 2 and beyond
Groovy 2 and beyond
 
Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013
 

Similar to Lightweight Groovy toolkit for Google App Engine

Cloud Computing from an Entrpreneur's Viewpoint
Cloud Computing from an Entrpreneur's ViewpointCloud Computing from an Entrpreneur's Viewpoint
Cloud Computing from an Entrpreneur's ViewpointJ Singh
 
Red Dirt Ruby Conference
Red Dirt Ruby ConferenceRed Dirt Ruby Conference
Red Dirt Ruby ConferenceJohn Woodell
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Guillaume Laforge
 
Jan 2013 HUG: Cloud-Friendly Hadoop and Hive
Jan 2013 HUG: Cloud-Friendly Hadoop and HiveJan 2013 HUG: Cloud-Friendly Hadoop and Hive
Jan 2013 HUG: Cloud-Friendly Hadoop and HiveYahoo Developer Network
 
Google Cloud Platform, Compute Engine, and App Engine
Google Cloud Platform, Compute Engine, and App EngineGoogle Cloud Platform, Compute Engine, and App Engine
Google Cloud Platform, Compute Engine, and App EngineCsaba Toth
 
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013Amazon Web Services
 
Petabyte scale on commodity infrastructure
Petabyte scale on commodity infrastructurePetabyte scale on commodity infrastructure
Petabyte scale on commodity infrastructureelliando dias
 
Google Developer Days Brazil 2009 - Java Appengine
Google Developer Days Brazil 2009 -  Java AppengineGoogle Developer Days Brazil 2009 -  Java Appengine
Google Developer Days Brazil 2009 - Java AppenginePatrick Chanezon
 
Hadoop in the Enterprise - Dr. Amr Awadallah @ Microstrategy World 2011
Hadoop in the Enterprise - Dr. Amr Awadallah @ Microstrategy World 2011Hadoop in the Enterprise - Dr. Amr Awadallah @ Microstrategy World 2011
Hadoop in the Enterprise - Dr. Amr Awadallah @ Microstrategy World 2011Cloudera, Inc.
 
Google App Engine At A Glance
Google App Engine At A GlanceGoogle App Engine At A Glance
Google App Engine At A GlanceStefan Christoph
 
Trend Micro Big Data Platform and Apache Bigtop
Trend Micro Big Data Platform and Apache BigtopTrend Micro Big Data Platform and Apache Bigtop
Trend Micro Big Data Platform and Apache BigtopEvans Ye
 
What is Google App Engine?
What is Google App Engine?What is Google App Engine?
What is Google App Engine?weschwee
 
Appscale at CLOUDCOMP '09
Appscale at CLOUDCOMP '09Appscale at CLOUDCOMP '09
Appscale at CLOUDCOMP '09Chris Bunch
 
Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume LaforgeGaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume LaforgeGuillaume Laforge
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGuillaume Laforge
 
Distributed Data processing in a Cloud
Distributed Data processing in a CloudDistributed Data processing in a Cloud
Distributed Data processing in a Cloudelliando dias
 
Aloha on-rails-2009
Aloha on-rails-2009Aloha on-rails-2009
Aloha on-rails-2009John Woodell
 
Stratos Open PaaS OSCON 2011
Stratos Open PaaS OSCON 2011Stratos Open PaaS OSCON 2011
Stratos Open PaaS OSCON 2011Paul Fremantle
 

Similar to Lightweight Groovy toolkit for Google App Engine (20)

Cloud Computing from an Entrpreneur's Viewpoint
Cloud Computing from an Entrpreneur's ViewpointCloud Computing from an Entrpreneur's Viewpoint
Cloud Computing from an Entrpreneur's Viewpoint
 
Red Dirt Ruby Conference
Red Dirt Ruby ConferenceRed Dirt Ruby Conference
Red Dirt Ruby Conference
 
App Engine Meetup
App Engine MeetupApp Engine Meetup
App Engine Meetup
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
 
Jan 2013 HUG: Cloud-Friendly Hadoop and Hive
Jan 2013 HUG: Cloud-Friendly Hadoop and HiveJan 2013 HUG: Cloud-Friendly Hadoop and Hive
Jan 2013 HUG: Cloud-Friendly Hadoop and Hive
 
Google Cloud Platform, Compute Engine, and App Engine
Google Cloud Platform, Compute Engine, and App EngineGoogle Cloud Platform, Compute Engine, and App Engine
Google Cloud Platform, Compute Engine, and App Engine
 
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013
Cloud Connected Devices on a Global Scale (CPN303) | AWS re:Invent 2013
 
Petabyte scale on commodity infrastructure
Petabyte scale on commodity infrastructurePetabyte scale on commodity infrastructure
Petabyte scale on commodity infrastructure
 
Google Developer Days Brazil 2009 - Java Appengine
Google Developer Days Brazil 2009 -  Java AppengineGoogle Developer Days Brazil 2009 -  Java Appengine
Google Developer Days Brazil 2009 - Java Appengine
 
Hadoop in the Enterprise - Dr. Amr Awadallah @ Microstrategy World 2011
Hadoop in the Enterprise - Dr. Amr Awadallah @ Microstrategy World 2011Hadoop in the Enterprise - Dr. Amr Awadallah @ Microstrategy World 2011
Hadoop in the Enterprise - Dr. Amr Awadallah @ Microstrategy World 2011
 
Google App Engine At A Glance
Google App Engine At A GlanceGoogle App Engine At A Glance
Google App Engine At A Glance
 
Trend Micro Big Data Platform and Apache Bigtop
Trend Micro Big Data Platform and Apache BigtopTrend Micro Big Data Platform and Apache Bigtop
Trend Micro Big Data Platform and Apache Bigtop
 
What is Google App Engine?
What is Google App Engine?What is Google App Engine?
What is Google App Engine?
 
Appscale at CLOUDCOMP '09
Appscale at CLOUDCOMP '09Appscale at CLOUDCOMP '09
Appscale at CLOUDCOMP '09
 
Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume LaforgeGaelyk - SpringOne2GX - 2010 - Guillaume Laforge
Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume Laforge
 
PaaS with Java
PaaS with JavaPaaS with Java
PaaS with Java
 
Distributed Data processing in a Cloud
Distributed Data processing in a CloudDistributed Data processing in a Cloud
Distributed Data processing in a Cloud
 
Aloha on-rails-2009
Aloha on-rails-2009Aloha on-rails-2009
Aloha on-rails-2009
 
Stratos Open PaaS OSCON 2011
Stratos Open PaaS OSCON 2011Stratos Open PaaS OSCON 2011
Stratos Open PaaS OSCON 2011
 

More from Guillaume Laforge

Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Guillaume Laforge
 
Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Guillaume Laforge
 
Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Guillaume Laforge
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Guillaume Laforge
 
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGroovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGuillaume Laforge
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGuillaume Laforge
 
Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Guillaume Laforge
 
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Guillaume Laforge
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Guillaume Laforge
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Guillaume Laforge
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Guillaume Laforge
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovyGuillaume Laforge
 
Groovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGroovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGroovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
 
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Guillaume Laforge
 
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Guillaume Laforge
 
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGroovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGuillaume Laforge
 

More from Guillaume Laforge (20)

Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012
 
Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012Groovy update at SpringOne2GX 2012
Groovy update at SpringOne2GX 2012
 
JavaOne 2012 Groovy update
JavaOne 2012 Groovy updateJavaOne 2012 Groovy update
JavaOne 2012 Groovy update
 
Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012Groovy 1.8 et 2.0 au BreizhC@mp 2012
Groovy 1.8 et 2.0 au BreizhC@mp 2012
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
 
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume LaforgeGroovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
Groovy 2.0 update - Cloud Foundry Open Tour Moscow - Guillaume Laforge
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific Languages
 
Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012Groovy 2.0 - Devoxx France 2012
Groovy 2.0 - Devoxx France 2012
 
Whats new in Groovy 2.0?
Whats new in Groovy 2.0?Whats new in Groovy 2.0?
Whats new in Groovy 2.0?
 
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
Groovy Update, new in 1.8 and beyond - Guillaume Laforge - Devoxx 2011
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
 
Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011Groovy Update - Guillaume Laforge - Greach 2011
Groovy Update - Guillaume Laforge - Greach 2011
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovy
 
Groovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume LaforgeGroovy update - S2GForum London 2011 - Guillaume Laforge
Groovy update - S2GForum London 2011 - Guillaume Laforge
 
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGroovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
 
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
 
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
 
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGroovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
 

Recently uploaded

The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 

Recently uploaded (20)

The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 

Lightweight Groovy toolkit for Google App Engine

  • 1. A lightweight Groovy toolkit for developing web applications on Google App Engine
  • 2. Guillaume Laforge / @glaforge • Groovy Project Manager • Head of Groovy Development at SpringSource • Initiator of the Grails framework • Founder of the Gaelyk toolkit • Co-author of Groovy in Action • Member of «Les Cast Codeurs» podcast • Speaker: JavaOne, QCon, JavaZone, Sun TechDays, Devoxx, The Spring Experience, SpringOne2GX, JAX, Dynamic Language World, IJTC, and more... Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 2
  • 3. Et la suite du le Paris GGUG ? • Aujourd’hui, nous allons parler de Gaelyk • Et demain ? – Spock — Mathilde Lemée – Transformation d’AST — Hamlet D’Arcy – Gradle — Grégory Boissinot • Et vous ? – Racontez-nous votre utilisation de Groovy, Grails, Gradle, Spock, etc. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 3
  • 5. IaaS, PaaS, SaaS • Software as a Service – Gmail, SalesForce.com SaaS • Platform as a Service – Google App Engine PaaS • Infrastructure as a Service – Amazon EC2 IaaS Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 5
  • 6. IaaS, PaaS, SaaS • Software as a Service – Gmail, SalesForce.com SaaS • Platform as a Service – Google App Engine PaaS • Infrastructure as a Service – Amazon EC2 IaaS Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 5
  • 7. IaaS, PaaS, SaaS • Software as a Service – Gmail, SalesForce.com SaaS • Platform as a Service – Google App Engine PaaS • Infrastructure as a Service – Amazon EC2 IaaS Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 5
  • 8. Google App Engine • Google’s PaaS solution • Run your app on Google’s infrastructure • Initially just Python supported • Java supported added too – Sandboxed JVM – Jetty servlet container • Several JVM-compatible language supported Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 6
  • 9. Key aspects • You can use most of your usual web frameworks for developping apps on App Engine Java – A WAR file, basically! (an exploded war actually) – Uploading to the cloud by sending deltas of changes • No OS image, or software to install – Unlike with Amazon EC2 • All the scaling aspects are handled for you – Database / session replication, load balancing... • There are quotas, but you need a high traffic application to start being charged – Free to get started Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 7
  • 10. Available services • Memcache – Send / receive Jabber messages (GTalk) – JCache implementation – Save on CPU and DB • User – Use Google’s user/ • URL Fetch authentication system – Access remote resources – OAuth support – HttpUrlConnection • Cron & Task queues • Mail – Schedule tasks at regular – Support both incoming and intervals outgoing emails – Queue units of work • Images • Blobstore – Resize, crop, rotate... – For storing large content • XMPP • And much more... Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 8
  • 11. Limitations •Not our usual relational database – key / value datastore •30 seconds request duration limit • Forbidden to – write on the file system – create threads – use raw sockets – issue system calls – use IO / Swing / etc. directly •There’s a whitelist of classes allowed • Number of files and their size are limited Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 9
  • 12. Quotas Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 10
  • 13. Quotas (1/2) •Bandwidth •Mail – 1,3M requests/day – 7K calls/day – 1GB/day in/out – 2K recepients/day – 6.5 CPU hours/day – 5K emails/day – 2K attachments – 100MB of attachments •Datastore – 10M calls – 1GB/day •URL Fetch – 12GB in / 115GB out – 657K calls/day – 60 CPU hours/day – 4GB in/out /day Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 11
  • 14. Quotas (2/2) •XMPP •Memcache – 657K calls/day – 8.6M calls/day – 4GB data sent/day – 10GB in – 657K recepients/day – 50GB out – 1MB invitations/day •Task queues •Image manipulation – 100K calls –864 calls/day –1GB in / 5GB out –2.5M transforms Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 12
  • 15. Quotas (2/2) •XMPP •Memcache – 657K calls/day – 8.6M calls/day – 4GB data sent/day – 10GB in – 657K recepients/day – 50GB out – 1MB invitations/day •Task queues •Image manipulation – 100K calls –864 calls/day ur es –1GB in / 5GB out d fig da te –2.5M transforms O ut Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 12
  • 17. The datastore... • Not your father’s relational database! «NoSQL» • Distributed key / value store – Based on Google’s «BigTable» – Schema-less approach • Supporting – Transactions and partitioning – Hierarchies through entity groups • Data access APIs – JPA and JDO • but adds a big request load time factor – Direct low-level APIs Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 14
  • 18. ...and its «limitations» • You’re not using SQL –No joins – No database constraints – No aggregation functions (count, avg...) • In a query, you can only filter on one column for inequality • Transactions only available in entity groups • You can only update an entity once in a transaction Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 15
  • 22. Gaelyk 0.6 released! Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 18
  • 23. • Gaelyk is a lightweight Groovy toolkit on top of the Google App Engine Java SDK • Gaelyk builds on Groovy’s servlet support – Groovlets: Groovy scripts instead of raw servlets! – Groovy templates: JSP-like template engine – Both allow for a clean separation of views and logic • Gaelyk provides several enhancements around the GAE Java SDK to make life easier, thanks to Groovy’s dynamic nature Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 19
  • 24. Why Groovy? • Groovy is a dynamic language for the JVM – very flexible, malleable, expressive and concise syntax – easy to learn for Java developers • deriving from the Java 5 grammar – provides powerful APIs to simplify the life of developers • possibility to dynamically enrich existing APIs – support for Groovlets and its own template engine Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 20
  • 25. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 26. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 27. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 28. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 29. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 30. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 31. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 32. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 33. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 34. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 35. Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 21
  • 36. First steps... • Go to http://gaelyk.appspot.com • Download the template project • Put your first Groovlet in /WEB-INF/groovy • And your templates in /WEB-INF/pages • And you’re ready to go! • Launch dev_appserver.sh • Go to http://localhost:8080/
  • 37. The web.xml "> <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5 <listener> /servlet-class> <listener-class>groovyx.gaelyk.GaelykServletContextListener< </listener> <servlet> <servlet-name>GroovletServlet</servlet-name> <servlet-class>groovyx.gaelyk.GaelykServlet</servlet-class> </servlet> <servlet> <servlet-name>TemplateServlet</servlet-name> -class> <servlet-class>groovyx.gaelyk.GaelykTemplateServlet</servlet </servlet> <servlet-mapping> <servlet-name>GroovletServlet</servlet-name> <url-pattern>*.groovy</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>TemplateServlet</servlet-name> <url-pattern>*.gtpl</url-pattern> </servlet-mapping> </web-app> Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 23
  • 38. MVC: Groovlets and templates Groovlets Templates (controllers) (views) Entities (domain) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 39. A groovlet • Instead of writing full-blown servlets, just write Groovy scripts (aka Groovlets) def numbers = [1, 2, 3, 4] def now = new Date() html.html { body { numbers.each { number -> p number } p now } } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 25
  • 40. A groovlet • Instead of writing full-blown servlets, just write Groovy scripts (aka Groovlets) def numbers = [1, 2, 3, 4] def now = new Date() html.html { body { numbers.each { number -> p number } p now } di ng oa } -rel to Au Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 25
  • 41. A template <html> <body> <p><% def message = "Hello World!" print message %> </p> <p><%= message %></p> <p>${message}</p> <ul> <% 3.times { %> <li>${message}</li> <% } %> </ul> </body> </html> Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 26
  • 42. A template <html> <body> <p><% def message = "Hello World!" print message %> </p> <p><%= message %></p> <p>${message}</p> <ul> <% 3.times { %> <li>${message}</li> <% } %> di ng </ul> el oa </body> to -r Au </html> Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 26
  • 43. Shortcuts • Google services • Variables available –datastore –request / response –blobstore –context / application –memcache –sessions –capabilities –params / headers –images –out / sout / html –urlFetch –localMode / app.* –mail –userService / user • Methods available –defaultQueue / queues –include / forward / –xmpp redirect –namespace –println / print Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 27
  • 44. D E M O 28
  • 46. Sending emails with Gaelyk mail.send to: 'to@gmail.com', from: 'other@gmail.com', subject: 'Hello World', htmlBody: '<bold>Hello</bold>' Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 30
  • 47. ...compared to Java Properties props = new Properties(); , null); Sessio n session = Session.getDefaultInstance(props try { Message msg = new MimeMessage(session); om", "Admin"));     msg .setFrom(new InternetAddress("other@gmail.c O,     msg.addRecipient(Message.RecipientType.T , "Mr. User"));                      new InternetAddress("to@example.com"     msg.setSubject("Hello World");     msg.setText("<bold>Hello</bold>");     Transport.send(msg); } catch (AddressException e) {} } catch (MessagingException e) {} Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 31
  • 48. Accessing the datastore • Direct interaction with the low-level datastore API Entity entity = new Entity("person")   map // subscript notation, like when accessing a entity['name'] = "Guillaume Laforge"   // normal property access notation entity.age = 32 entity.save() // asyncSave() entity.delete() // asyncDelete() datastore.withTransaction { // do stuff with your entities // within the transaction } // use the asynchronous datastore service datastore.async.put(entity) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 32
  • 49. Querying to be improved... import com.google.appengine.api.datastore.* der.* import static com.google.appengine.api.datastore.FetchOptions.Buil   // query the scripts stored in the datastore def query = new Query("savedscript")   // sort results by descending order of the creation date query.addSort("dateCreated", Query.SortDirection.DESCENDING)   author // filters the entities so as to return only scripts by a certain r) query.addFilter("author", Query.FilterOperator.EQUAL, params.autho   PreparedQuery preparedQuery = datastore.prepare(query)   // return only the first 10 results def entities = preparedQuery.asList( withLimit(10) ) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 33
  • 50. ...into something groovier? def entities = datastore.query { select all from savedscript sort desc by dateCreated where author == params.author limit 10 } as List Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 34
  • 51. ...into something groovier? def entities = datastore.query { select all from savedscript sort desc by dateCreated where author == params.author limit 10 te d! } as List m en p le et Im o tY N Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 34
  • 52. URL Routing system (1/4) • You can have friendly URL mappings with the URL routing system all "/aboutus", redirect: "/blog/2008/10/20/about-us" all "/blog/@year/@month/@day/@title", @day@title=@title" forward: "/blog.groovy?year=@year&month=@month@day= get "/blog/@year/@month/@day", @day" forward: "/blog.groovy?year=@year&month=@month@day= get "/book/isbn/@isbn", forward: "/book.groovy?isbn=@isbn", validate: { isbn ==~ /d{9}(d|X)/ } – You’ll have to configure the RouteFilter in web.xml Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 35
  • 53. URL Routing system (2/4) • You can also define caching times get "/aboutus", cache: 24.hours, forward: "/aboutus.gtpl" get "/breaking-news", cache: 1.minute, forward: "/news.groovy?last=10" – Nice for GAE’s infamous «loading requests» •less critical with GAE SDK 1.4 – ability to reserve 3 instances (billing) – warmup requests Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 36
  • 54. URL Routing system (3/4) • Special routes for specifying – incoming emails – jabber messages email to "/incomingMail.groovy" jabber to "/incomingXmpp.groovy" Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 37
  • 55. URL Routing system (4/4) • Namespace awareness: nice for multitenancy • Capability awareness: for graceful degradation // @cust customer variable could be « acme » post "/@cust/update", forward: "/update.groovy", namespace: { "ns-$cust" } es status // different destinations depending on the GAE servic get "/speakers", forward { to "/speakers.groovy" // default destination // when the datastore is not available to "/unavailable.gtpl" on DATASTORE not ENABLED // show some maintenance is upcoming to "/speakers.groovy?maintenance=true" on DATASTORE is SCHEDULED_MAINTENANCE } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 38
  • 56. Capabilities • Google App Engine allows you to know the status and availability of the various services – DATASTORE, DATESTORE_WRITE, MEMCACHE... – ENABLED, DISABLED, UNKNOWN, SCHEDULED_MAINTENANCE – is() and not() methods if (capabilities[DATASTORE_WRITE].is(ENABLED)) { // write some content in the datastore } else { // otherwise, redirect to some maintenance page } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 39
  • 57. Task queue API // access a configured queue using the subscript notation queues['dailyEmailQueue']   // or using the property access notation queues.dailyEmailQueue   // you can also access the default queue with: queues.default defaultQueue // add a task to the queue queue << [ countdownMillis: 1000, url: "/task/dailyEmail", taskName: "sendDailyEmailNewsletter", method: 'PUT', params: [date: '20090914'], payload: content ] Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 40
  • 58. Jabber / XMPP support (1/3) • Sending instant messages String recipient = "someone@gmail.com"   // check if the user is online if (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, body: "Hello, how are you?")   // checks the message was successfully // delivered to all the recipients assert status.isSuccessful() } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 41
  • 59. Jabber / XMPP support (2/3) • Sending instant messages with an XML payload String recipient = "service@gmail.com"   // check if the service is online if (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, xml: { customers { customer(id: 1) { name 'Google' } } })   // checks the message was successfully delivered to the service assert status.isSuccessful() } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 42
  • 60. Jabber / XMPP support (2/3) • Sending instant messages with an XML payload String recipient = "service@gmail.com"   // check if the service is online if (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, xml: { customers { customer(id: 1) { <customers> name 'Google' <customer id=’1’> } <name>Google</name> } </customer> </customers> })   // checks the message was successfully delivered to the service assert status.isSuccessful() } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 42
  • 61. Jabber / XMPP support (3/3) • Receving incoming instant messages – Once you’ve configured a route for jabber messages – Add the inbound message service in appengine-web.xml def message = xmpp.parseMessage(request) // get the body of the message message.body // get the sender Jabber ID message.from // get the list of recipients Jabber IDs message.recipients   // if the message is an XML document instead of a raw string message if (message.isXml()) { // get the raw XML message.stanza // get a document parsed with XmlSlurper message.xml } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 43
  • 62. Memcache service • Map notation access to the cache } class Country implements Serialzable { String name   def countryFr = new Country(name: 'France')   in the cache // use the subscript notation to put a country object // (you can also use non-string keys) memcache['FR'] = countryFr   // check that a key is present in the cache if ('FR' in memcache) { the cache using a key // use the subscript notation to get an entry from def countryFromCache = memcache['FR'] } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 44
  • 63. Closure memoization • Cache the return values for each dinstinct invocation (for a given arguments set) -> def countEntities = memcache.memoize { String kind datastore.prepare( new Query(kind) ) .countEntities() } // first call def totalPics = countEntityes('photos') // second call, hitting the cache totalPics = countEntityes('photos') Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 45
  • 64. Blobstore enhancements • The blobstore allows to store some large content – images, videos, etc. def blob = ... print blob.filename // contentType, creation, size // output the content of the blob to the response blob.serve response // read the content of the blob blob.withReader { Reader r -> ... } blob.withStream { InputStream is -> ... } // delete the blob blob.delete() Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 46
  • 65. Images service • Readable DSL for manipulating images def blobKey = ... def image = blobKey.image.transform { resize 1600, 1200 crop 0.1, 0.1, 0.9, 0.9 horizontal flip // vertical flip too rotate 90 feeling lucky // image corrections } def thumbnail = image.resize(100, 100) Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 47
  • 66. Channel Service • For Comet-style applications def token = hannel.createChannel('clientID') channel.send 'clientID', 'Hi!' • Then in the view, in JavaScript... channel = new goog.appengine.Channel(token); socket = channel.open(); socket.onmessage = function(msg) { ... } Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 48
  • 67. Simple plugin system (1/3) • Gaelyk features a simple plugin system for extending your apps and share commonalities • A plugin lets you – provide additional groovlets and templates – contribute new URL routes – add new categories – define variables in the binding – override existing binding variables – provide any static content – add new libraries – do any initialization – add before/after request hooks Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 49
  • 68. Simple plugin system (2/3) • A plugin is actually just a zip file! – Basically, just a Gaelyk application, minus... •the Groovy / Gaelyk / GAE JARs •the web.xml and appengine-web.xml descriptors – But with a /WEB-INF/plugins/myplugin.groovy descriptor • A plugin must be referenced in /WEB-INF/ plugins.groovy with – install myplugin •shortcut to /WEB-INF/plugins/myplugin.groovy Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 50
  • 69. Simple plugin system (3/3) • An example plugin descriptor – /WEB-INF/plugins/jsonPlugin.groovy import
net.sf.json.* import
net.sf.json.groovy.* 
 //
add
new
variables
in
the
binding binding
{ le jsonLibVersion
=
"2.3"









//
a
simple
string
variab 
of
a
3rd‐party
JAR json
=
new
JsonGroovyBuilder()

//
an
instance
of
a
class } 
 //
add
new
routes
with
the
usual
routing
system
format routes
{ get
"/json",
forward:
"/json.groovy" } 
 //
install
a
category
you've
developped categories
jsonlib.JsonlibCategory before
{
req,
resp
‐>
...
}
//
or
after 
 //
any
other
initialization
code
you'd
need Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 51
  • 70. a ry m m S u Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 71. Summary • Easy access to a cloud solution –Deploying Java apps, as easily as you would with PHP • Familiar to Java folks –Your good old Servlet centric webapps style • Pretty cheap –You need a high-trafficed website to reach the quotas • Gaelyk provides a simplified approach to creating Servlet centric webapps in a productive manner –Leveraging Groovy’s servlet / template support and dynamic capabilities Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 53
  • 72. What’s coming next? • Expect more sugar around the Datastore – An SQL-like query DSL – Easier relationship management (builder?) • Perhaps pre-compiled groovlets and templates – Less needed since SDK 1.4 • (reserve 3 hot instances, warmup requests) • Testing facilities specific to Gaelyk –testing utility class, Spock-specific ones... • Anything that’ll come up in newer GAE SDK versions Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 54
  • 73. Thanks for your attention! e e Laforg velopment Gu illaum oovy De m of Gr e@gmail.co Head laforg E mail: g glaforge @ T witter: • References: • http://gaelyk.appspot.com/ • http://groovy.codehaus.org/ • http://code.google.com/ appengine/ Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 55
  • 74. Picture credits Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png Speed limit : http://www.morguefile.com/archive/display/18492 Warehouse : http://www.morguefile.com/archive/display/85628 Check mark: http://www.lnl.infn.it/~epics/WikiDumps/localhost/600px-symbol_ok.svg.png Puzzle: http://www.everystockphoto.com/photo.php?imageId=263521 Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.png Clouds http://www.morguefile.com/archive/display/627059 http://www.morguefile.com/archive/display/625552 http://www.morguefile.com/archive/display/629785 Duke ok GAE http://weblogs.java.net/blog/felipegaucho/archive/ae_gwt_java.png Python logo : http://python.org/images/python-logo.gif Gaelyc cross with clouds : http://www.morguefile.com/archive/display/37889 Speed limit : http://www.morguefile.com/archive/display/18492 Warehouse : http://www.morguefile.com/archive/display/85628 Snow foot steps : http://www.flickr.com/photos/robinvanmourik/2875929243/ Sugar : http://www.flickr.com/photos/ayelie/441101223/sizes/l/ Press release: http://www.napleswebdesign.net/wp-content/uploads/2009/06/press_release_11.jpg Copyright 2010 SpringSource. Copying, publishing or distributing without express written permission is prohibited. 56