Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
-
Upload
guillaume-laforge -
Category
Technology
-
view
2.083 -
download
0
Transcript of Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge
![Page 1: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/1.jpg)
Chicago, October 19 - 22, 2010
a lightweight Groovy toolkitfor Google App EngineGuillaume Laforge — SpringSource
mercredi 20 octobre 2010
![Page 2: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/2.jpg)
Guillaume Laforge
• Groovy Project Manager• JSR-241 Spec Lead• Head of Groovy Development
at SpringSource• Initiator of the Grails framework• Founder of the Gaelyk toolkit• Co-author of Groovy in Action
• Speaker: JavaOne, QCon, JavaZone, Sun TechDays, Devoxx, The Spring Experience, SpringOne2GX, JAX, Dynamic Language World, IJTC, and more...
2mercredi 20 octobre 2010
![Page 3: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/3.jpg)
Bug killer... real insects with legs!
• Thanks to Groovy, with one hand left for coding, I’m still more productive than with Java!
3mercredi 20 octobre 2010
![Page 4: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/4.jpg)
Bug killer... real insects with legs!
• Thanks to Groovy, with one hand left for coding, I’m still more productive than with Java!
3mercredi 20 octobre 2010
![Page 5: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/5.jpg)
CloudComputing
mercredi 20 octobre 2010
![Page 6: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/6.jpg)
IaaS, PaaS, SaaS
• Software as a Service– Gmail, SalesForce.com
• Platform as a Service– Google App Engine
• Infrastructure as a Service– Amazon EC2
SaaS
PaaS
IaaS5
mercredi 20 octobre 2010
![Page 7: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/7.jpg)
IaaS, PaaS, SaaS
• Software as a Service– Gmail, SalesForce.com
• Platform as a Service– Google App Engine
• Infrastructure as a Service– Amazon EC2
SaaS
PaaS
IaaS5
mercredi 20 octobre 2010
![Page 8: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/8.jpg)
IaaS, PaaS, SaaS
• Software as a Service– Gmail, SalesForce.com
• Platform as a Service– Google App Engine
• Infrastructure as a Service– Amazon EC2
SaaS
PaaS
IaaS5
mercredi 20 octobre 2010
![Page 9: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/9.jpg)
Google App Engine
• Google’s PaaS solution• Run your app on Google’s infrastructure• Initially just Python supported• 1+ year ago, Java supported added too
– Sandboxed JVM– Jetty servlet container
• Several JVM-compatible language supported
• A few services available– Email, XMPP, URL Fetch, Image, User, Task queues...
6mercredi 20 octobre 2010
![Page 10: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/10.jpg)
Key aspects
• You can use most of your usual web frameworks for developping apps on App Engine Java– A WAR file, basically!– 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
7mercredi 20 octobre 2010
![Page 11: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/11.jpg)
Available services
• Memcache– JCache implementation– Save on CPU and DB
• URL Fetch– Access remote resources– HttpUrlConnection
• Mail– Support both incoming and
outgoing emails
• Images– Resize, crop, rotate...
• XMPP
– Send / receive Jabber messages (GTalk)
• User– Use Google’s user/
authentication system– OAuth support
• Cron & Task queues– Schedule tasks at regular
intervals– Queue units of work
• Blobstore– For storing large content
• And much more...
8mercredi 20 octobre 2010
![Page 12: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/12.jpg)
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
9mercredi 20 octobre 2010
![Page 13: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/13.jpg)
Quotas
10mercredi 20 octobre 2010
![Page 14: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/14.jpg)
Quotas (1/2)
• Bandwidth– 1,3M requests/day– 1GB/day in/out– 6.5 CPU hours/day
• Datastore– 10M calls– 1GB/day– 12GB in / 115GB out– 60 CPU hours/day
• Mail– 7K calls/day– 2K recepients/day– 5K emails/day– 2K attachments– 100MB of attachments
• URL Fetch– 657K calls/day– 4GB in/out /day
11mercredi 20 octobre 2010
![Page 15: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/15.jpg)
Quotas (2/2)
• XMPP– 657K calls/day– 4GB data sent/day– 657K recepients/day– 1MB invitations/day
• Image manipulation–864 calls/day–1GB in / 5GB out–2.5M transforms
• Memcache– 8.6M calls/day– 10GB in– 50GB out
• Task queues– 100K calls
12mercredi 20 octobre 2010
![Page 16: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/16.jpg)
Quotas (2/2)
• XMPP– 657K calls/day– 4GB data sent/day– 657K recepients/day– 1MB invitations/day
• Image manipulation–864 calls/day–1GB in / 5GB out–2.5M transforms
• Memcache– 8.6M calls/day– 10GB in– 50GB out
• Task queues– 100K calls
12
Outdated figures
mercredi 20 octobre 2010
![Page 17: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/17.jpg)
The Datastore
mercredi 20 octobre 2010
![Page 18: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/18.jpg)
The datastore...
• It’s 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
14mercredi 20 octobre 2010
![Page 19: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/19.jpg)
...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
15mercredi 20 octobre 2010
![Page 20: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/20.jpg)
Nice dashboard
mercredi 20 octobre 2010
![Page 21: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/21.jpg)
F
http://gaelyk.appspot.com
mercredi 20 octobre 2010
![Page 22: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/22.jpg)
F
http://gaelyk.appspot.com
mercredi 20 octobre 2010
![Page 23: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/23.jpg)
SpringOne 2GX 2010. All rights reserved. Do not distribute without permission.
0.5.6with Capabilities and
Namespace aware URL routing
18mercredi 20 octobre 2010
![Page 24: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/24.jpg)
SpringOne 2GX 2010. All rights reserved. Do not distribute without permission. 19mercredi 20 octobre 2010
![Page 25: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/25.jpg)
Gaelyk
• 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
20mercredi 20 octobre 2010
![Page 26: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/26.jpg)
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
• The truth: We worked with the Google App Engine Java team before the official launch of the platform, to ensure Groovy would run well on this new environment, and Gaelyk emerged from our test-bed project, and people asked me to Open-Source it!
21mercredi 20 octobre 2010
![Page 27: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/27.jpg)
First steps...
• Go to http://gaelyk.appspot.com
• Download the template project
• Put your first Groovlet in /WEB-INF/groovy
• And your templates at the root
• And you’re ready to go!
• Launch dev_appserver.sh
• Go to http://localhost:8080/
mercredi 20 octobre 2010
![Page 28: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/28.jpg)
The web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
<servlet> <servlet-name>GroovletServlet</servlet-name> <servlet-class>groovyx.gaelyk.GaelykServlet</servlet-class> </servlet> <servlet> <servlet-name>TemplateServlet</servlet-name> <servlet-class>groovyx.gaelyk.GaelykTemplateServlet</servlet-class>
</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> <welcome-file-list> <welcome-file>index.gtpl</welcome-file> </welcome-file-list></web-app>
23mercredi 20 octobre 2010
![Page 29: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/29.jpg)
MVC: Groovlets and templates
Groovlets(controllers)
Templates(views)
Entities(domain)
24mercredi 20 octobre 2010
![Page 30: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/30.jpg)
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 }}
25mercredi 20 octobre 2010
![Page 31: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/31.jpg)
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>
26mercredi 20 octobre 2010
![Page 32: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/32.jpg)
Shortcuts
• Google services–datastore–blobstore–memcache–capabilities– images–urlFetch–mail–userService / user–defaultQueue / queues–xmpp–namespace
• Variables available–request / response–context / application–sessions–params / headers–out / sout / html– localMode / app.*
• Methods available– include / forward / redirect–println / print
27mercredi 20 octobre 2010
![Page 33: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/33.jpg)
SpringOne 2GX 2010. All rights reserved. Do not distribute without permission.
Demo
mercredi 20 octobre 2010
![Page 34: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/34.jpg)
Groovy sugar!
mercredi 20 octobre 2010
![Page 35: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/35.jpg)
Sending emails with Gaelyk
mail.send to: '[email protected]', from: '[email protected]', subject: 'Hello World', htmlBody: '<bold>Hello</bold>'
30mercredi 20 octobre 2010
![Page 36: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/36.jpg)
...compared to Java
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
String msgBody = "...";
try { Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("[email protected]", "Admin"));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress("[email protected]", "Mr. User"));
msg.setSubject("Your Example.com account has been activated");
msg.setText(msgBody);
Transport.send(msg);} catch (AddressException e) {}
} catch (MessagingException e) {}
31mercredi 20 octobre 2010
![Page 37: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/37.jpg)
Accessing the datastore
• Direct interaction with the low-level datastore API
import com.google.appengine.api.datastore.Entity
Entity entity = new Entity("person") // subscript notation, like when accessing a map
entity['name'] = "Guillaume Laforge" // normal property access notationentity.age = 32
entity.save()entity.delete()
datastore.withTransaction { // do stuff with your entities // within the transaction}
32mercredi 20 octobre 2010
![Page 38: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/38.jpg)
Querying to be improved...
import com.google.appengine.api.datastore.*import static com.google.appengine.api.datastore.FetchOptions.Builder.* // query the scripts stored in the datastoredef query = new Query("savedscript") // sort results by descending order of the creation datequery.addSort("dateCreated", Query.SortDirection.DESCENDING) // filters the entities so as to return only scripts by a certain authorquery.addFilter("author", Query.FilterOperator.EQUAL, params.author)
PreparedQuery preparedQuery = datastore.prepare(query) // return only the first 10 resultsdef entities = preparedQuery.asList( withLimit(10) )
33mercredi 20 octobre 2010
![Page 39: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/39.jpg)
...into something groovier?
def entities = datastore.query { select all from savedscript sort desc by dateCreated where author == params.author limit 10} as List
34mercredi 20 octobre 2010
![Page 40: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/40.jpg)
...into something groovier?
def entities = datastore.query { select all from savedscript sort desc by dateCreated where author == params.author limit 10} as List
Not Yet Implemented!
34mercredi 20 octobre 2010
![Page 41: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/41.jpg)
Task queue API
// access a configured queue using the subscript notationqueues['dailyEmailQueue'] // or using the property access notationqueues.dailyEmailQueue // you can also access the default queue with:queues.defaultdefaultQueue
// add a task to the queuequeue << [ countdownMillis: 1000, url: "/task/dailyEmail", taskName: "sendDailyEmailNewsletter", method: 'PUT', params: [date: '20090914'], payload: content]
35mercredi 20 octobre 2010
![Page 42: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/42.jpg)
Jabber / XMPP support (1/3)
• Sending instant messages
String recipient = "[email protected]" // check if the user is onlineif (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()}
36mercredi 20 octobre 2010
![Page 43: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/43.jpg)
Jabber / XMPP support (2/3)
• Sending instant messages with an XML payload
String recipient = "[email protected]" // check if the service is onlineif (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()}
37mercredi 20 octobre 2010
![Page 44: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/44.jpg)
Jabber / XMPP support (2/3)
• Sending instant messages with an XML payload
String recipient = "[email protected]" // check if the service is onlineif (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()}
<customers> <customer id=’1’> <name>Google</name>
</customer></customers>
37mercredi 20 octobre 2010
![Page 45: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/45.jpg)
Jabber / XMPP support (3/3)
• Receving incoming instant messages– Configure the XmppServlet in web.xml– Add the inbound message service in appengine-web.xml
// get the body of the messagemessage.body// get the sender Jabber IDmessage.from// get the list of recipients Jabber IDsmessage.recipients // if the message is an XML document instead of a raw string messageif (message.isXml()) { // get the raw XML message.stanza // get a document parsed with XmlSlurper message.xml}
38mercredi 20 octobre 2010
![Page 46: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/46.jpg)
Memcache service
• Map notation access to the cache
class Country implements Serialzable { String name } def countryFr = new Country(name: 'France') // use the subscript notation to put a country object in the cache
// (you can also use non-string keys)memcache['FR'] = countryFr // check that a key is present in the cacheif ('FR' in memcache) { // use the subscript notation to get an entry from the cache using a key
def countryFromCache = memcache['FR']}
39mercredi 20 octobre 2010
![Page 47: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/47.jpg)
Closure memoization
• Cache the return values for each dinstinct invocation (for a given arguments set)
40
def countEntities = memcache.memoize { String kind -> datastore.prepare( new Query(kind) ) .countEntities()}
// first calldef totalPics = countEntityes('photos')
// second call, hitting the cachetotalPics = countEntityes('photos')
mercredi 20 octobre 2010
![Page 48: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/48.jpg)
Blobstore enhancements
• The blobstore allows to store some large content– images, videos, etc.
41
def blob = ...print blob.filename // contentType, creation, size
// output the content of the blob to the responseblob.serve response
// read the content of the blobblob.withReader { Reader r -> ... }blob.withStream { InputStream is -> ... }
// delete the blobblob.delete()
mercredi 20 octobre 2010
![Page 49: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/49.jpg)
Images service
• Readable DSL for manipulating images
42
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)
mercredi 20 octobre 2010
![Page 50: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/50.jpg)
Capabilities
• Google App Engine allows you to know the status and availability of the various services– DATASTORE, DATESTORE_WRITE, MEMCACHE, etc.– ENABLED, DISABLED, UNKNOWN,
SCHEDULED_MAINTENANCE– is() and not() methods
43
if (capabilities[DATASTORE_WRITE].is(ENABLED)) { // write some content in the datastore} else { // otherwise, redirect to some maintenance page}
mercredi 20 octobre 2010
![Page 51: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/51.jpg)
URL Routing system (1/2)
• You can have friendly URL mappings with the URL routing system
all "/blog/@year/@month/@day/@title", forward: "/blog.groovy?year=@year&month=@month@day=@day@title=@title"
get "/blog/@year/@month/@day", forward: "/blog.groovy?year=@year&month=@month@day=@day"
all "/aboutus", redirect: "/blog/2008/10/20/about-us"
get "/book/isbn/@isbn", forward: "/book.groovy?isbn=@isbn", validate: { isbn ==~ /\d{9}(\d|X)/ }
44mercredi 20 octobre 2010
![Page 52: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/52.jpg)
URL Routing system (2/2)
• Namespace awareness: nice for multitenancy• Capability awareness: for graceful degradation
45
// @cust customer variable could be « acme »post "/@cust/update", forward: "/update.groovy", namespace: { "ns-$cust" }
// different destinations depending on the GAE services status
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}
mercredi 20 octobre 2010
![Page 53: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/53.jpg)
Simple plugin system (1/3)
• Gaelyk 0.4 introduced 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– provide any static content– add new libraries– do any initialization
46mercredi 20 octobre 2010
![Page 54: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/54.jpg)
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
47mercredi 20 octobre 2010
![Page 55: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/55.jpg)
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 bindingbinding {
jsonLibVersion = "2.3" // a simple string variable
json = new JsonGroovyBuilder() // an instance of a class of a 3rd‐party JAR
} // add new routes with the usual routing system format
routes {get "/json", forward: "/json.groovy"
} // install a category you've developped
categories jsonlib.JsonlibCategory // any other initialization code you'd need
48mercredi 20 octobre 2010
![Page 56: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/56.jpg)
SpringOne 2GX 2010. All rights reserved. Do not distribute without permission.
Summary
mercredi 20 octobre 2010
![Page 57: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/57.jpg)
What’s coming next?
• Gaelyk 0.5.5 released a week ago with additional URL routing support (capabilities, namespace)– and a 0.5.6 bug fix this past weekend
• Expect more sugar around the Datastore• An SQL-like query DSL• Easier relationship management (builder)
• Perhaps pre-compiled groovlets and templates
• More generally... – Anything that’ll come up in upcoming GAE SDK versions
50mercredi 20 octobre 2010
![Page 58: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/58.jpg)
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
51mercredi 20 octobre 2010
![Page 59: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/59.jpg)
SpringOne 2GX 2010. All rights reserved. Do not distribute without permission.
Q&A
mercredi 20 octobre 2010
![Page 60: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/60.jpg)
Thanks for your attention!
Guillaume Laforge
Head of Groovy Development
Email: [email protected]
Twitter: @glaforge
• References:• http://gaelyk.appspot.com/• http://groovy.codehaus.org/• http://code.google.com/appengine/
53mercredi 20 octobre 2010
![Page 61: Gaelyk - SpringOne2GX - 2010 - Guillaume Laforge](https://reader033.fdocuments.in/reader033/viewer/2022052823/55587496d8b42aaa7e8b5350/html5/thumbnails/61.jpg)
Images used in this presentation
Bandage http://image.made-in-china.com/2f0j00fIGaTPEYDQnB/Elastic-Crepe-Bandage-Gauze-.jpgRIP http://gipsydan.files.wordpress.com/2009/11/rip.jpgPuzzle: http://www.everystockphoto.com/photo.php?imageId=263521Light bulb: https://newsline.llnl.gov/retooling/mar/03.28.08_images/lightBulb.pngClouds http://www.morguefile.com/archive/display/627059http://www.morguefile.com/archive/display/625552http://www.morguefile.com/archive/display/629785Duke ok GAE http://weblogs.java.net/blog/felipegaucho/archive/ae_gwt_java.pngPython logo : http://python.org/images/python-logo.gifGaelyc cross with clouds : http://www.morguefile.com/archive/display/37889Speed limit : http://www.morguefile.com/archive/display/18492Warehouse : http://www.morguefile.com/archive/display/85628Snow 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
54mercredi 20 octobre 2010