Groovy Usage Patterns by Dierk König

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    2 Favorites

    Groovy Usage Patterns by Dierk König - Presentation Transcript

    1. Seven Groovy usage patterns for Java developers Dierk König dierk.koenig@canoo.com søndag den 17. maj 2009
    2. Welcome! Dierk König Canoo fellow, www.canoo.com Rich Internet Applications Committer to Groovy and Grails Author: Groovy in Action søndag den 17. maj 2009
    3. The 7 usage patterns • Super Glue • Liquid Heart • Keyhole Surgery • Smart Configuration • Unlimited Openness • House-Elf Scripts • Prototype Examples in Groovy søndag den 17. maj 2009
    4. #1 Super Glue • Build application from existing building blocks • Java makes perfect infrastructure: middleware, frameworks, widget sets, services • Scripting makes a flexible (agile) applikation layer: views und controller • Grails, GSP, JBoss Seam, WebWork, Struts 2 Actions,... • Example: combination of XML parser, Java networking and Swing widget set in order to build a standard RSS feed reader søndag den 17. maj 2009
    5. Super Glue example: RSS Reader def url ='http://www.groovyblogs.org/feed/rss' def items = new XmlParser().parse(url).channel.item def cols = 'pubDate title description'.tokenize() groovy.swing.SwingBuilder.build { frame(id:'f', title: 'Groovy Blogs', visible:true) { scrollPane { table { tableModel(list: items) { cols.each { col -> closureColumn header: col, read: { it[col].text() } }}}}} f.pack() } søndag den 17. maj 2009
    6. #2 Liquid Heart • Externalize business models • Given application structure in Java • Allow to learn about the business: keep entities, relations, and behaviour flexible through scripting • Usages: Spring beans, JBoss components,rule engines (groovyrules.dev.java.net, JSR-94), Grails, enterprise risk management for world-leading insurances • Example: calculation rules for bonus allocation søndag den 17. maj 2009
    7. Liquid Heart example: bonus allocation revenue = employee.revenue switch(revenue / 1000) { case 0..100 : return revenue * 0.04 case 100..200 : return revenue * 0.05 case {it > 200} : bonusClub.add(employee) return revenue * 0.06 } Binding binding = new Binding(); binding.setVariable("employee", employee); binding.setVariable("bonusClub", bonusClub); GroovyShell shell = new GroovyShell(binding); File script = new File(filename); float bonus = (float) shell.evaluate(script); søndag den 17. maj 2009
    8. #3 Keyhole Surgery • Minimal-invasive surgery "in vivo" • Lots of need for runtime inspection and modifications • Ad-hoc queries are not foreseeable • "Backdoor" for the live execution of scripts • Particularly useful for product support, failure analysis, hot fixes, emergencies • Usages: Oracle JMX Beans, XWiki, SnipSnap, Ant, Canoo WebTest, Grails Console, GAE, ULC Admin Console • Example: a live Groovy Servlet søndag den 17. maj 2009
    9. Surgery through a Servlet keyhole Problems with the database connection? def ds = Config.dataSource ds.connection = new DebugConnection(ds.connection) Remove malicious users from the servlet context users = servletContext.getAttribute('users') bad = users.findAll { user -> user.cart.items.any { it.price < 0 } } servletContext.setAttribute('users', users - bad) søndag den 17. maj 2009
    10. #4 Smart Configuration • Enhance configuration with logic • Replace dumb XML configs • Use references, loops, conditionals, inheritance, execution logic, runtime environment adaption, ... • Typical scenario for domain specific languages (DSLs), Groovy Builder, Grails plugins, product customization, Groovy for OpenOffice: Community Innovation Program Silver Award Winner • Example: Navis SPARCS N4 søndag den 17. maj 2009
    11. Smart Config example: container routing def ensureEvent = { change -> if (! event.getMostRecentEvent(change) { event.postNewEvent(change) } } switch (event.REROUTE_CTR) { case 'OutboundCarrierId' : ensureEvent('CHANGE_VSL') break case 'POD' : if (! event.CHANGE_VSL) ensureEvent('CHANGE_POD') break } søndag den 17. maj 2009
    12. #5 Unlimited Openness • Every line of code may be changed • It's impossible (and not desirable!) to design for every possible future requirement • Allow for easily changing the code without tedious setup for compilation and deployment • Follow the lessons of Perl, PHP, Python,... • Example: groovyblogs.org, PillarOne søndag den 17. maj 2009
    13. #6 House Elf • Delegate the housework • Build automation, continuous integration, deployment, installer, service monitoring, reports, statistics, automated documentation, functional tests, HTML scraping, Web remote control, XML-RPC, WebServices • Usages with Ant, Maven, AntBuilder, Gant, Gradle, Canoo WebTest, Grails scaffolding, ... • Examples: hooking scripts into Ant søndag den 17. maj 2009
    14. House Elf: musical Ant <groovy> import org.apache.tools.ant.* import org.jfugue.* project.addBuildListener(new PlayListener()) class PlayListener implements BuildListener { def play = { new Player().play(new Pattern(it)) } void buildStarted(event) {} void buildFinished(event) { } void messageLogged(event) { } void targetStarted(event) { play("D E") } void targetFinished(event) { play("C5maj") } void taskStarted(event) {} void taskFinished(event) {} } </groovy> søndag den 17. maj 2009
    15. House Elf: musical Ant <groovy> import org.apache.tools.ant.* import org.jfugue.* project.addBuildListener(new PlayListener()) class PlayListener implements BuildListener { def play = { new Player().play(new Pattern(it)) } void targetStarted(event) { play("D E") } void targetFinished(event) { play("C5maj") } } </groovy> søndag den 17. maj 2009
    16. House Elf: musical Ant <groovy> import org.apache.tools.ant.* import org.jfugue.* def play = { new Player().play(new Pattern(it)) } void targetStarted(event) { play("D E") } void targetFinished(event) { play("C5maj") } project.addBuildListener(player as BuildListener) } </groovy> søndag den 17. maj 2009
    17. House Elf: musical Ant <groovy> import org.apache.tools.ant.* import org.jfugue.* def play = { new Player().play(new Pattern(it)) } def player = [ targetStarted: { play("D E") }, targetFinished: { play("C5maj") } ] project.addBuildListener(player as BuildListener) } </groovy> søndag den 17. maj 2009
    18. House Elf: musical Ant <groovy> import org.apache.tools.ant.* import org.jfugue.* def play = { new Player().play(new Pattern(it)) } def player = [ targetStarted : { play "D E" }, targetFinished : { play "C5maj" } ] project.addBuildListener(player as BuildListener) } </groovy> søndag den 17. maj 2009
    19. #7 Prototype • Feasibility study on the target platform • "Spikes" for technological or algorithmic ideas with more expressiveness, quicker feedback, and enhanced analysis capabilities • Later port to Java is optional • Usages: early user feedback about the domain model through a functional Grails prototype, algorithms for image manipulation • Example: prime number disassembly søndag den 17. maj 2009
    20. Prototype example: prime numbers boolean isPrime(x) { return ! (2..<x).any { y -> x % y == 0 } } int primeBelow(x) { (x..1).find { isPrime(it) } } List primeFactors(x) { if (isPrime(x)) return [x] int p = primeBelow(x) while (p > 1) { if (x % p == 0) return [p, *primeFactors(x.intdiv(p))] p = primeBelow(p-1) } } for (n in 100..110) { println "$n : "+primeFactors(n)} søndag den 17. maj 2009
    21. Prime numbers: counting modulo ops class ModCountCategory { static int count = 0 static int mod(Integer self, Integer argument) { count++ return self - argument * self.intdiv(argument) } } use (ModCountCategory) { for (n in 1000..1010) { ModCountCategory.count = 0 factors = primeFactors(n) println "$n : $factors".padRight(30) + "(in " + "${ModCountCategory.count}".padLeft(5) + " steps)" assert n == factors.inject(1){result, item -> result *= item } } } søndag den 17. maj 2009
    22. Pattern Summary • Super Glue • Liquid Heart • Keyhole Surgery • Smart Configuration • Unlimited Openness • House-Elf Scripts • Prototype Keep groovin' ! søndag den 17. maj 2009
    23. More Information • Groovy in Action groovy.canoo.com/gina Manning, 2007, Foreword by James Gosling König mit Glover, Laforge, King, Skeet • groovy.codehaus.org, grails.org groovyblogs.org, searchgroovy.org søndag den 17. maj 2009
    24. Questions? More patterns in the pipeline: Lipstick - API enhancements Ghost - generating invisible code <your suggestion here> søndag den 17. maj 2009

    + GR8 ConferenceGR8 Conference, 5 months ago

    custom

    1619 views, 2 favs, 4 embeds more stats

    Dierk König, author of Groovy in Action, guides at more

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 1619
      • 1401 on SlideShare
      • 218 from embeds
    • Comments 0
    • Favorites 2
    • Downloads 70
    Most viewed embeds
    • 209 views on http://canoo.com
    • 6 views on http://www.canoo.com
    • 2 views on http://www.canoo.ch
    • 1 views on http://209.85.129.132

    more

    All embeds
    • 209 views on http://canoo.com
    • 6 views on http://www.canoo.com
    • 2 views on http://www.canoo.ch
    • 1 views on http://209.85.129.132

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories