Your SlideShare is downloading. ×
0
Gaelyk: Groovy Coding to the CloudGuillaume LaforgeGroovy Project ManagerSpringSource, a division of VMwareTwitter: @glafo...
Guillaume Laforge• Groovy Project Manager at VMware    • Initiator of the Grails framework    • Creator of the Gaelyk tool...
Guillaume Laforge• Groovy Project Manager at VMware    • Initiator of the Grails framework    • Creator of the Gaelyk tool...
Introduction to Google App Engine© 2011 SpringOne 2GX 2011. All rights reserved. Do not distribute without permission.
IaaS, PaaS, SaaS• Software as a Service    – Gmail, SalesForce.com                                                        ...
IaaS, PaaS, SaaS• Software as a Service    – Gmail, SalesForce.com                                                        ...
IaaS, PaaS, SaaS• Software as a Service    – Gmail, SalesForce.com                                                        ...
Google App Engine• Google’s PaaS solution    – Run your app on Google’s infrastructure• Initially just Python supported• J...
Key aspects• You can use most of your usual web frameworks for  developping apps on App Engine Java    – A WAR file, basica...
Some of the available services• Memcache    – JCache implementation                             • XMPP    – Save on CPU an...
Limitations• Time and size limits    – 60 second requests — was 30s    – 60 second / 5MB URLFetch — was 10s / 1MB    – 10K...
Quotas & Billing9    @glaforge — http://glaforge.appspot.com   —   http://gplus.to/glaforge
Free tier
No infinite scaling!
No moreusage based
Paid tier w/ free quota
Support!
Reduced quotas
The Datastore
The datastore...• Distributed key / value store     – Based on Google’s «BigTable»     – Schema-less approach• Supporting ...
...and its «limitations»• You’re not using SQL     – No joins     – No database constraints     – No aggregation functions...
Nice dashboard
Now... letʼs dive into Gaelyk!© 2011 SpringOne 2GX 2011. All rights reserved. Do not distribute without permission.
http://gaelyk.appspot.com                       F
http://gaelyk.appspot.com                       F
• Gaelyk is a lightweight Groovy toolkit on top of the  Google App Engine Java SDK• Gaelyk builds on Groovy’s servlet supp...
Why Groovy?• Groovy is a dynamic language for the JVM     – very flexible, malleable, expressive and concise syntax     – ...
First steps...• Go to http://gaelyk.appspot.com• Download the template project• Put your first Groovlet in /WEB-INF/groovy•...
The web.xml                                                                     ">     <web-app xmlns="http://java.sun.com...
MVC: Groovlets and templates           Groovlets                                           Templates          (controllers...
A groovlet• Instead of writing full-blown servlets, just write Groovy  scripts (aka Groovlets)            def numbers = [1...
A groovlet• Instead of writing full-blown servlets, just write Groovy  scripts (aka Groovlets)            def numbers = [1...
A template            <html>                <body>                     <p><%                         def message = "Hello ...
A template            <html>                <body>                     <p><%                         def message = "Hello ...
Shortcuts• Google services                                         – namespace     – datastore, blobstore                 ...
Groovy sugar!
Sending emails with Gaelyk     mail.send to:                 to@gmail.com,             from:                 other@gmail.c...
...compared to Java     Properties props = new Properties();                                                         , nul...
Unfair comparision?29   @glaforge — http://glaforge.appspot.com   —   http://gplus.to/glaforge
Unfair comparision?29   @glaforge — http://glaforge.appspot.com   —   http://gplus.to/glaforge
Unfair comparision?29   @glaforge — http://glaforge.appspot.com   —   http://gplus.to/glaforge
Accessing the datastore• Direct interaction with the low-level datastore API              Entity entity = new Entity("pers...
Querying the datastore• Before... (Java-style)     import com.google.appengine.api.datastore.*                            ...
Querying the datastore... Groovy style!• After...                   def entities = datastore.query {                      ...
@GaelykBinding• The various services and variables are injected in the  binding of Groovlets and Templates     – but were ...
URL Routing system• You can have friendly URL mappings  with the URL routing system     all "/aboutus",         redirect: ...
URL Routing system                                                                  2.5">     <web-app xmlns="http://java....
URL Routing system• You can also define caching times        get "/aboutus", cache: 24.hours,            forward: "/aboutu...
URL Routing system• Special routes for specifying     – incoming emails     – jabber chat messages     – jabber presence a...
URL Routing system• Namespace awareness: nice for multitenancy• Capability awareness: for graceful degradation     // @cus...
Capabilities• Google App Engine allows you to know the status and  availability of the various services     – DATASTORE, D...
Task queue API     // access a configured queue using the subscript notation     queues[dailyEmailQueue]           // or u...
Jabber / XMPP support (1/3)• Sending instant messages     String recipient = "someone@gmail.com"           // check if the...
Jabber / XMPP support (2/3)• Sending instant messages with an XML payload     String recipient = "service@gmail.com"      ...
Jabber / XMPP support (2/3)• Sending instant messages with an XML payload     String recipient = "service@gmail.com"      ...
Jabber / XMPP support (3/3)• Receving incoming instant messages     – Once you’ve configured a route for jabber messages  ...
Memcache service• Map notation access to the cache                                                        }     class Coun...
Closure memoization• Cache the return values for each dinstinct invocation  (for a given arguments set)                   ...
Blobstore enhancements• The blobstore allows to store some large content     – images, videos, etc.       def blob = ...  ...
File service• The file service provides a file-like read/write access over  blobs from the blobstore services     – progra...
File service• Instead of using the blobstore reading capabilities, you can  read from the file service     //
read
from
a
...
Images service• Readable DSL for manipulating images     def blobKey = ...     def image = blobKey.image.transform {      ...
Channel Service• For Comet-style applications      def token = channel.createChannel(clientID)      channel.send clientID,...
Simple plugin system• Gaelyk features a simple plugin system  for extending your apps and share commonalities• A plugin le...
Simple plugin system• A plugin is actually just a zip file!     – Basically, just a Gaelyk application, minus...       • t...
Simple plugin system• An example plugin descriptor     – /WEB-INF/plugins/jsonPlugin.groovy            import
net.sf.json....
Summary• Google App Engine is an interesting PaaS solution     – Deploying Java apps, as easily as you would with PHP     ...
Not only me...Benjamin Muschko                  Vladimír Orany                           Marco VermeulenGradle GAE plugin ...
Onemorething...
CloudFoundry Gaelyk variant57   @glaforge — http://glaforge.appspot.com   —   http://gplus.to/glaforge
CloudFoundry Gaelyk variant                                                                      p orw are                ...
Thank you!                                        e                                L aforg pment                       aum...
Q&A — Got questions, Really?60   © 2011 SpringOne 2GX 2011. All rights reserved. Do not distribute without permission.
Image credits•    Speed limit : http://www.morguefile.com/archive/display/18492     Warehouse : http://www.morguefile.com/...
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Upcoming SlideShare
Loading in...5
×

Gaelyk update - Guillaume Laforge - SpringOne2GX 2011

2,714

Published on

Update on the latest state of the Gaelyk ligthweight toolkit for Google App Engine

Published in: Technology, Business
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,714
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
17
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Transcript of "Gaelyk update - Guillaume Laforge - SpringOne2GX 2011"

    1. 1. Gaelyk: Groovy Coding to the CloudGuillaume LaforgeGroovy Project ManagerSpringSource, a division of VMwareTwitter: @glaforgeBlog: http://glaforge.appspot.com© 2011 SpringOne 2GX 2011. All rights reserved. Do not distribute without permission.
    2. 2. Guillaume Laforge• Groovy Project Manager at VMware • Initiator of the Grails framework • Creator of the Gaelyk toolkit• Co-author of Groovy in Action• Speaking worldwide w/ a French accent• Follow me on... • My blog: http://glaforge.appspot.com • Twitter: @glaforge • Google+: http://gplus.to/glaforge2 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    3. 3. Guillaume Laforge• Groovy Project Manager at VMware • Initiator of the Grails framework • Creator of the Gaelyk toolkit• Co-author of Groovy in Action• Speaking worldwide w/ a French accent• Follow me on... • My blog: http://glaforge.appspot.com • Twitter: @glaforge • Google+: http://gplus.to/glaforge2 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    4. 4. Introduction to Google App Engine© 2011 SpringOne 2GX 2011. All rights reserved. Do not distribute without permission.
    5. 5. IaaS, PaaS, SaaS• Software as a Service – Gmail, SalesForce.com SaaS• Platform as a Service – Google App Engine PaaS – -CloudFoundry• Infrastructure as a Service IaaS – Amazon EC24 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    6. 6. IaaS, PaaS, SaaS• Software as a Service – Gmail, SalesForce.com SaaS• Platform as a Service – Google App Engine PaaS – -CloudFoundry• Infrastructure as a Service IaaS – Amazon EC24 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    7. 7. IaaS, PaaS, SaaS• Software as a Service – Gmail, SalesForce.com SaaS• Platform as a Service – Google App Engine PaaS – -CloudFoundry• Infrastructure as a Service IaaS – Amazon EC24 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    8. 8. Google App Engine• Google’s PaaS solution – Run your app on Google’s infrastructure• Initially just Python supported• Java support added too – Sandboxed JVM – Jetty servlet container• Several JVM-compatible language supported5 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    9. 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 medium traffic application to start being charged6 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    10. 10. Some of the available services• Memcache – JCache implementation • XMPP – Save on CPU and datastore – Send / receive Jabber messages (GTalk)• URL Fetch – Access remote resources • User – HttpUrlConnection – Use Google’s user/ authentication system• Mail – OAuth support – Support both incoming and • Cron & Task queues outgoing emails – Schedule tasks at regular• Images intervals – Resize, crop, rotate... – Queue units of work7 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    11. 11. Limitations• Time and size limits – 60 second requests — was 30s – 60 second / 5MB URLFetch — was 10s / 1MB – 10K files / 32MB each — was 3K files / 10MB each • Forbidden to – write on the file system – create threads – use raw sockets – issue system calls – use IO / Swing / etc. directly8 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    12. 12. Quotas & Billing9 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    13. 13. Free tier
    14. 14. No infinite scaling!
    15. 15. No moreusage based
    16. 16. Paid tier w/ free quota
    17. 17. Support!
    18. 18. Reduced quotas
    19. 19. The Datastore
    20. 20. The datastore...• 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 factor13 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    21. 21. ...and its «limitations»• You’re not using SQL – No joins – No database constraints – No aggregation functions (count, avg...) – But there’s a preview for a «Cloud SQL»• Only filter on one column for inequality in queries• Transactions only available in entity groups – cross group transactions are coming though• You can only update an entity once in a transaction14 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    22. 22. Nice dashboard
    23. 23. Now... letʼs dive into Gaelyk!© 2011 SpringOne 2GX 2011. All rights reserved. Do not distribute without permission.
    24. 24. http://gaelyk.appspot.com F
    25. 25. http://gaelyk.appspot.com F
    26. 26. • 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 nature18 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    27. 27. 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 engine19 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    28. 28. 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/
    29. 29. 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>21 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    30. 30. MVC: Groovlets and templates Groovlets Templates (controllers) (views) Entities (domain) @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    31. 31. 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 } }23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    32. 32. 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 } -r el to Au23 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    33. 33. 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>24 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    34. 34. 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>24 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    35. 35. Shortcuts• Google services – namespace – datastore, blobstore • Variables available – backends, lifecycle – request / response – memcache – context / application – capabilities – sessions – images – params / headers – urlFetch – out / sout / html – mail – localMode / app.* – userService / user – defaultQueue / queues • Methods available – xmpp – include / forward / redirect25 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    36. 36. Groovy sugar!
    37. 37. Sending emails with Gaelyk mail.send to: to@gmail.com, from: other@gmail.com, subject: Hello World, htmlBody: <bold>Hello</bold>27 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    38. 38. ...compared to Java Properties props = new Properties(); , null); Sessio n session = Session.getDefaultInstance(props try { Message msg = new MimeMessage(session); om"));     msg .setFrom(new InternetAddress("other@gmail.c O,     msg.addRecipient(Message.RecipientType.T o@example.com"));                      new InternetAddress("t     msg.setSubject("Hello World");     msg.setText("<bold>Hello</bold>");     Transport.send(msg); } catch (AddressException e) {} } catch (MessagingException e) {}28 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    39. 39. Unfair comparision?29 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    40. 40. Unfair comparision?29 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    41. 41. Unfair comparision?29 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    42. 42. 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)30 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    43. 43. Querying the datastore• Before... (Java-style) 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) )31 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    44. 44. Querying the datastore... Groovy style!• After... def entities = datastore.query { select all from savedscript sort desc by dateCreated where author == params.author limit 10 }• SQL-like query DSL – select: ‘all’, ‘count’, ‘single’, ‘keys’ – from: entityName as SomeClass32 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    45. 45. @GaelykBinding• The various services and variables are injected in the binding of Groovlets and Templates – but were not accessible from plain classes• The transformation @GaelykBinding injects those variables import
groovyx.gaelyk.GaelykBindings 
 //
annotate
your
class
with
the
transformation @GaelykBindings class
WeblogService
{ 



def
numberOfComments(post)
{ 







//
the
datastore
service
is
available 







datastore.execute
{ 











select
count
from
comments
where
postId
==
post.id 







} 



} }33 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    46. 46. URL Routing system• 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", y@title=@title" for ward: "/blog.groovy?year=@year&month=@month@day=@da 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)/ }34 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    47. 47. URL Routing system 2.5"> <web-app xmlns="http://java.sun.com/xml/ns/javaee" version=" ... <filter> <filter-name>RoutesFilter</filter-name> ss> <filter-class>groovyx.gaelyk.routes.RoutesFilter</filter-cla </filter> <filter-mapping> <servlet-name>RoutesFilter</servlet-name> <url-pattern>/*</url-pattern> </filter-mapping> ... </web-app>35 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    48. 48. URL Routing system• 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 since GAE SDK 1.4 – warmup requests36 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    49. 49. URL Routing system• Special routes for specifying – incoming emails – jabber chat messages – jabber presence and subscription messages email to: "/incomingMail.groovy" jabber to: "/incomingXmpp.groovy" // synonym: jabber chat, to: "..." jabber presence, to: "/subs.groovy" jabber subscrpition, to: "/subs.groovy"37 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    50. 50. URL Routing system• 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 }38 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    51. 51. 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 }39 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    52. 52. 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 ]40 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    53. 53. 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() }41 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    54. 54. 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() }42 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    55. 55. 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() }42 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    56. 56. 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 }43 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    57. 57. 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] }44 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    58. 58. 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)45 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    59. 59. 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()46 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    60. 60. File service• The file service provides a file-like read/write access over blobs from the blobstore services – programmatic creation of blobs was an issue before def
file
=
files.createNewBlobFile("text/plain",
"hello.txt") //
writing
with
a
writer file.withWriter
{
writer
‐> 



writer
<<
"some
content" } //
writing
binary
content file.withOutputStream
{
stream
‐> 



stream
<<
"some
content".bytes } //
file.withWriter(encoding:
"US‐ASCII") //
file.withWriter(locked:
false,
finalize:
false)47 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    61. 61. File service• Instead of using the blobstore reading capabilities, you can read from the file service //
read
from
a
buffered
input
stream file.withI nputStream
{
BufferedInputStream
stream
‐> 



//
read
from
the
stream } //
read
from
a
buffered
reader file.withReader{
BufferedReader
reader
‐> 



//
read
from
the
reader } //
locked
and
encoding
params
available
too48 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    62. 62. 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)49 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    63. 63. Channel Service• For Comet-style applications def token = channel.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) { ... }50 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    64. 64. Simple plugin system• 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 initialization51 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    65. 65. Simple plugin system• 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.groovy52 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    66. 66. Simple plugin system• An example plugin descriptor – /WEB-INF/plugins/jsonPlugin.groovy import
net.sf.json.groovy.* 
 //
add
new
variables
in
the
binding binding
{ le jsonLibVersion
=
"2.3"









//
a
simple
string
variab json
=
new
JsonGroovyBuilder()

//
3rd
party
class } 
 //
add
new
routes
with
the
usual
routing
system
format routes
{ get
"/json",
forward:
"/json.groovy" } 
 //
install
a
category
youve
developped categories
jsonlib.JsonlibCategory before
{
req,
resp
‐>
...
}
//
or
after 
 //
any
other
initialization
code
youd
need53 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    67. 67. Summary• Google App Engine is an interesting PaaS solution – Deploying Java apps, as easily as you would with PHP – The free tier lets you easily try out the platform – But beware of the limitations and lock-in factor• Gaelyk provides a simplified approach to creating Servlet centric webapps in a productive manner – Leveraging Groovy’s servlet / template support and dynamic capabilities54 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    68. 68. Not only me...Benjamin Muschko Vladimír Orany Marco VermeulenGradle GAE plugin Gradle Gaelyk Spock testing Eclipse plugin integrationGradle Gaelyk plugin TDD GaelykGaelyk datastore template (w/ Spockviewer plugin & Easyb integration) Eclipse DSLD file55 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    69. 69. Onemorething...
    70. 70. CloudFoundry Gaelyk variant57 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    71. 71. CloudFoundry Gaelyk variant p orw are Va58 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    72. 72. Thank you! e L aforg pment aume vy Develo Guill Groo m Hea d of g mail.co aforge@ mail: gl glaforge e E @ o /glaforg T witter : http://gplus.t Go ogle+:59 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    73. 73. Q&A — Got questions, Really?60 © 2011 SpringOne 2GX 2011. All rights reserved. Do not distribute without permission.
    74. 74. Image credits• 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 Weight balance: http://www.medicalscale1.com/wp-content/uploads/2010/11/balance-weight-scale2.jpg 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 Gaelic cross with clouds : http://www.morguefile.com/archive/display/37889 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 Steve Jobs http://blogs.lentreprise.com/auto-entrepreneur/wp-content/blogs.dir/233/files/2010/07/Steve_Jobs_WWDC07.jpg Duke Nukem Forever http://img.jeuxvideo.fr/photo/00704014-photo-duke-nukem-forever.jpg61 @glaforge — http://glaforge.appspot.com — http://gplus.to/glaforge
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×