SlideShare uma empresa Scribd logo
1 de 85
Baixar para ler offline
Practical Domain-Specific
                                   Languages with Groovy

                       All the techniques to create your own DSLs

                                                     Guillaume Laforge
                                                 Head of Groovy Development



Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Guillaume Laforge

   • Groovy Project Manager
   • JSR-241 Spec Lead
   • Head of Groovy Development
     at SpringSource
   • Initiator of the Grails framework

   • Co-author of Groovy in Action

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

                                                                                                                     2
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
A few words about Groovy

   • Groovy is a dynamic language for the JVM
           – with a Meta Object Protocol
           – compiles directly to bytecode, seamless Java interop
   • Open Source ASL 2 project hosted at Codehaus
   • Relaxed grammar derived from Java 5
           – + borrowed good ideas from Ruby, Python, Smalltalk
   • Fast... for a dynlang on the JVM
   • Closures, properties, optional typing, BigDecimal
     by default, nice wrapper APIs, and more...




                                                                                                                     3
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
a
                     d
                    n
                  e
                g
               A
                                                                                   • The context and
                                                                                     the usual issues we face
                                                                                   • Some real-life examples of
                                                                                     Domain-Specific Languages
                                                                                   • Groovy’s DSL capabilities
                                                                                   • Integrating a DSL
                                                                                     in your application
                                                                                   • Considerations to remember
                                                                                     when designing your own DSL


                                                                                                                     4
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
The context
Subject Matter Experts,
  Business analysts...
Developer producing
           LOLCODE



HAI
CAN HAS STDIO?
I HAS A VAR
IM IN YR LOOP
   UP VAR!!1
   VISIBLE VAR
   IZ VAR BIGGER THAN 10?
KTHXBYE
IM OUTTA YR LOOP
KTHXBYE
Lots of languages...
And in the end...
...nobody understands each other
Expressing requirements...




                                                                                                                     10
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
DSL: a potential solution?

  • Use a more expressive language than a general purpose one

  • Share a common metaphore of understanding between
    developers and subject matter experts

  • Have domain experts help with the design of the business
    logic of an application

  • Avoid cluttering business code with too much boilerplate
    technical code

  • Cleanly separate business logic from application code

  • Let business rules have their own lifecycle




                                                                                                                     11
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Towards more readibility (1)




                                                                                                                     12
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Towards more readibility (1)




                                                                                                                     12
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Towards more readibility (1)




                                                                                                                     20%




                                                                                                                     12
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Towards more readibility (2)




                                                                                                                     13
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Towards more readibility (2)




                                                                                                                     13
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Towards more readibility (2)




                                                                                                                     80%

                                                                                                                           13
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
a
                     d
                    n
                  e
                g
               A
                                                                                   • The context and
                                                                                     the usual issues we face
                                                                                   • Some real-life examples of
                                                                                     Domain-Specific Languages
                                                                                   • Groovy’s DSL capabilities
                                                                                   • Integrating a DSL
                                                                                     in your application
                                                                                   • Considerations to remember
                                                                                     when designing your own DSL


                                                                                                                     14
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
A collection of DSLs


   • In our everyday life, we’re surrounded by DSLs

           – Technical dialects

           – Notations

           – Business languages




                                                                                                                     15
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Technical dialects




                                                                                                                     16
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
SQL
^[w-.]+@([w-]){2,4}$




                                                                                                                     18
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Notations




                                                                                                                     19
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
1. e4 e5
2. Nf3 Nc6
3. Bb5 a6
L2 U F-1 B L2 F B -1 U L2
Visual!
Business languages




                                                                                                                     23
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Real-life Groovy examples

   • Anti-malaria drug resistance simulation
   • Human Resources employee skills representation
   • Insurance policies risk calculation engine
   • Loan acceptance rules engine for a financial
     platform
   • Mathematica-like lingua for nuclear safety
     simulations
   • Market data feeds evolution scenarios

   • and more...


                                                                                                                     24
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
a
                     d
                    n
                  e
                g
               A
                                                                                   • The context and
                                                                                     the usual issues we face
                                                                                   • Some real-life examples of
                                                                                     Domain-Specific Languages
                                                                                   • Groovy’s DSL capabilities
                                                                                   • Integrating a DSL
                                                                                     in your application
                                                                                   • Considerations to remember
                                                                                     when designing your own DSL


                                                                                                                     25
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
A flexible & malleable syntax

   • No need to write full-blown classes, use scripts
   • Optional typing (def)
           – in scripts, you can even omit the def keyword
   • Native syntax constructs
   • Parentheses & semi-colons are optional
   • Named arguments
   • BigDecimal by default for decimal numbers
   • Closures for custom control structures
   • Operator overloading



                                                                                                                     26
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Scripts vs classes

   • Hide all the boilerplate technical code
           – an end-user doesn’t need to know about classes


           – public class Rule {
                 public static void main(String[] args) {
                     System.out.println(“Hello”);
                 }
             }

           – println “Hello”




                                                                                                                     27
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Optional typing

   • No need to bother with types or even generics
           – unless you want to!
   • Imagine an interest rate lookup table method
     returning some generified type:

           –Rate<LoanType, Duration, BigDecimal>[]
                 lookupTable() { ... }
            def table = lookupTable()

   • No need to repeat the horrible generics type info!



                                                                                                                     28
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Native syntax constructs

   • Lists
           – [Monday, Tuesday, Wednesday]

   • Maps
           – [CA: ‘California’, TX: ‘Texas’]

   • Ranges
           – def bizDays = Monday..Friday
           – def allowedAge = 18..65
           – You can create your own custom ranges




                                                                                                                     29
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Optional parens & semis

   • Make statements and expressions
     look more like natural languages



           – move(left);

           – move left




                                                                                                                     30
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Named arguments

   • In Groovy you can mix named and unnamed
     arguments for method parameters
           – named params are actually put in a map parameter
           – plus optional parens & semis

   •       take 1.pill,
            of: Chloroquinine,
         after: 6.hours
   • Corresponds to a method signature like:
           –def take(Map m, MedicineQuantity mq)


                                                                                                                     31
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
BigDecimal by default

   • Main reason why financial institutions often decide
     to use Groovy for their business rules!
           – Although these days rounding issues are overrated!

   • Java vs Groovy for a simple interpolation equation

   • BigDecimal uMinusv = c.subtract(a);
     BigDecimal vMinusl = b.subtract(c);
     BigDecimal uMinusl = a.subtract(b);
     return e.multiply(uMinusv)
                 .add(d.multiply(vMinusl))
                 .divide(uMinusl, 10, BigDecimal.ROUND_HALF_UP);

   • (d * (b - c) + e * (c - a)) / (a - b)



                                                                                                                     32
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Custom control structures,
  thanks to closures

   • When closures are last, they can be put “out” of the
     parentheses surrounding parameters

   • unless (account.balance > 100.euros,
         { account.debit 100.euros })

   • unless (account.balance > 100.euros) {
         account.debit 100.euros
     }

   • Signature def unless(boolean b, Closure c)


                                                                                                                     33
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Operator overloading

                                                                                    • Currency amounts
a+b                  a.plus(b)
a-b                  a.minus(b)
                                                                                            –15.euros + 10.dollars
a*b                  a.multiply(b)
a/b                  a.divide(b)
                                                                                    • Distance handling
a%b                  a.modulo(b)
                                                                                            –10.kilometers - 10.meters
a ** b               a.power(b)
a|b                  a.or(b)
                                                                                    • Workflow, concurrency
a&b                  a.and(b)
a^b                  a.xor(b)
                                                                                            –taskA | taskB & taskC
a[b]                 a.getAt(b)
a << b               a.leftShift(b)
                                                                                    • Credit an account
a >> b               a.rightShift(b)
                                                                                            –account << 10.dollars
+a                   a.positive()
                                                                                             account += 10.dollars
-a                   a.negative()
                                                                                             account.credit 10.dollars
~a                   a.bitwiseNegate()
                                                                                                                     34
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Groovy’s dynamic heart:

The MOP!
MetaObject Protocol
Groovy’s MOP

   • All the accesses to methods, properties,
     constructors, operators, etc. can be intercepted
     thanks to the MOP
   • While Java’s behavior is hard-wired at compile-
     time in the class
   • Groovy’s runtime behavior is adaptable at
     runtime through the metaclass.
   • Different hooks for changing the runtime behavior
           – GroovyObject, custom MetaClass implementation,
             categories, ExpandoMetaClass




                                                                                                                     36
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
GroovyObject

   • All instances of classes created in Groovy
     implement the GroovyObject interface:

           –getProperty(String name)
           –setProperty(String name, Object value)
           –invokeMethod(String name, Object[]
            params)
           –getMetaClass()
           –setMetaClass(MetaClass mc)

   • A GO can have “pretended” methods and properties


                                                                                                                     37
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
MetaClass

   • The core of Groovy’s MOP system
           –invokeConstructor()
           –invokeMethod() and invokeStaticMethod()
           –invokeMissingMethod()
           –getProperty() and setProperty()
           –getAttribute() and setAttribute()
           –respondsTo() and hasProperty()
   • MetaClasses can change the behavior of existing
     third-party classes — even from the JDK


                                                                                                                     38
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
ExpandoMetaClass

   • A DSL for MetaClasses!
   • MoneyAmount.metaClass.constructor = { ... }
     Number.metaClass.getDollars = { ... }
     Distance.metaClass.toMeters = { ... }
     Distance.metaClass.static.create = { ... }
   • To avoid repetition of Type.metaClass, you can pass
     a closure to metaClass { ... }
   • The delegate variable in closure represents the
     current instance, and it the default parameter




                                                                                                                     39
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
The Builder pattern
The Groovy MarkupBuilder

   • def mkp = new MarkupBuilder()
     mkp.html {
         head {
             title “Groovy in Action”
         }
         body {
             div(width: ‘100’) {
                 p(class: ‘para) {
                     span “Best book ever!”
                 }
             }
         }
     }
                                                                                                                     41
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
A builder for HR

   • softskills {
         ideas {
             capture 2
             formulate 3
         }
         ...
     }
     knowhow {
         languages {
             java 4
             groovy 5
         }
         ...
     }


                                                                                                                     42
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
A builder for HR

   • softskills {
         ideas {
             capture 2
             formulate 3
         }
         ...
     }
     knowhow {
         languages {
             java 4
             groovy 5
         }
         ...
     }


                                                                                                                     42
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Builders


• Builders are...
     – a mechanism for creating any tree-structered graph
     – the realization of the GoF builder pattern at the syntax level
       in Groovy
     – simply a clever use of chained method invocation, closures,
       parentheses omission, and use of the GroovyObject methods


• Existing builders
     – XML, Object graph, Swing, Ant, JMX, and more...



                                                                                                                      43
 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
The clever trick

   • GroovyObject#invokeMethod() is used to catch all
     non-existing method calls in the context of the
     builder
   • The nesting of closures visually shows the level of
     nesting / depth in the tree
   • builder.m1(attr1:1, attr2:2, { builder.m2(...,
     {...}) } becomes equivalent to
         builder.m1(attr1:1, attr2:2) { m2(...) {...} }
         thanks to parens omission




                                                                                                                     44
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Adding properties to numbers

   • Three possible approaches

           – create a Category
                  •a category is a kind of decorator for default MCs


           – create a custom MetaClass
                  •a full-blown MC class to implement and to set on the
                   POGO instance


           – use ExpandoMetaClass
                  •friendlier DSL approach but with a catch



                                                                                                                     45
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
With a Category

   • class DistanceCategory {
         static Distance getMeters(Integer self) {
             new Distance(self, Unit.METERS)
         }
     }

         use(DistanceCategory) {
             100.meters
         }

   • Interesting scope: thread-bound & lexical
   • But doesn’t work across the hierarchy of classes
           – ie. subclasses won’t benefit from the new property


                                                                                                                     46
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
With an ExpandoMetaClass

   • Number.metaClass.getMeters = {->
         new Distance(delegate, Unit.METERS)
     }

         100.meters

   • Works for the class hierarchy for POJOs, and a flag
     exists to make it work for POGOs too
   • But the catch is it’s really a global change, so
     beware EMC enhancements collisions




                                                                                                                     47
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Compile-time
  metaprogramming

   • Groovy 1.6 introduced AST Transformations
   • Compile-time == No runtime performance penalty!




                                                                          Transformation

                                                                                                                     48
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
AST Transformations

   • Two kinds of transformations


           – Global transformations
                  •applicable to all compilation units


           – Local transformations
                  •applicable to marked program elements
                  •using specific marker annotations




                                                                                                                     49
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Example #1: @Singleton

   • Let’s revisit this evil (anti-)pattern
                    public class Evil {
               !

                        public static final Evil instance = new Evil ();
                        private Evil () {}
                        Evil getInstance() { return instance; }
                    }


   • In Groovy
                    @Singleton class Evil {}
               !



   • Also a “lazy” version
                    @Singleton(lazy = true) class Evil {}
               !




                                                                                                                     50
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Example #2: @Delegate
  Not just for Managers

   • You can delegate to fields of your classes
           – class Employee {
                 def doTheWork() { “done” }
             }
             class Manager {
                 @Delegate
                 Employee slave = new Employee()
             }
             def god = new Manager()
             assert god.doTheWork() == “done”

   • Damn manager who will get all the praiser...


                                                                                                                     51
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Global transformations

   • Implement ASTTransformation
   • Annotate the transfo specifying a compilation phase

   • @GroovyASTTransformation(phase=CompilePhase.CONVERSION)
     public class MyTransformation
         implements ASTTransformation {
         public void visit(ASTNode[] nodes, SourceUnit unit)
         { ... }
     }

   • For discovery, create the file META-INF/services/
         org.codehaus.groovy.transform.ASTTransformation
   • Add the fully qualified name of the class in that file


                                                                                                                     52
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Local transformations

   • Same approach as Globale transformations
   • But you don’t need the META-INF file
   • Instead create an annotation to specify on which
     element the transformation should apply

   • @Retention(RetentionPolicy.SOURCE)
     @Target([ElementType.METHOD])
     @GroovyASTTransformationClass(
         [quot;fqn.MyTransformationquot;])
     public @interface WithLogging {...}



                                                                                                                     53
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Example: the Spock
  framework

   • Changing the semantics of the original code
   • But keeping a valid Groovy syntax
   • @Speck
     class HelloSpock {
         def quot;can you figure out what I'm up to?quot;() {
             expect:
             name.size() == size

                                         where:
                                         name << [quot;Kirkquot;, quot;Spockquot;, quot;Scottyquot;]
                                         size << [4, 5, 6]
                         }
         }

                                                                                                                     54
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
a
                     d
                    n
                  e
                g
               A
                                                                                   • The context and
                                                                                     the usual issues we face
                                                                                   • Some real-life examples of
                                                                                     Domain-Specific Languages
                                                                                   • Groovy’s DSL capabilities
                                                                                   • Integrating a DSL
                                                                                     in your application
                                                                                   • Considerations to remember
                                                                                     when designing your own DSL


                                                                                                                     55
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Various integration
  mechanisms

   • Java 6’s javax.script.* APIs (aka JSR-223)
   • Spring’s language namespace
   • Groovy’s own mechanisms

   • But a key idea is to externalize those DSL programs
           – DSL programs can have their own lifecycle
           – no need to redeploy an application because of a rule
             change
           – business people won’t see the technical code




                                                                                                                     56
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Java 6’s javax.script.* API

   • Groovy 1.6 provides its own implementation of the
     javax.script.* API

   • ScriptEngineManager mgr =
             new ScriptEngineManager();
     ScriptEngine engine =
             mgr.getEngineByName(“Groovy”);

         String result = (String)engine.eval(“2+3”);




                                                                                                                     57
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Spring’s lang namespace

   • POGOs (Plain Old Groovy Objects) can be pre-
     compiled as any POJO and used interchangeably
     with POJOs in a Spring application
   • But Groovy scripts & classes can be loaded at
     runtime through the <lang:groovy/> namespace
     and tag
   • Reloadable on change
   • Customizable through a custom MetaClass

   • <lang:groovy id=quot;eventsquot;
         script-source=quot;classpath:dsl/
     eventsChart.groovyquot;
         customizer-ref=quot;eventsMetaClassquot; />

                                                                                                                     58
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Groovy’s own mechanisms

   • Eval
           – for evaluating simple expressions


   • GroovyShell
           – for more complex scripts and DSLs


   • GroovyClassLoader
           – the most powerful mechanism




                                                                                                                     59
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Eval

   • Simple mechanism to evaluate math-like formulas

   • Eval.me (                                                                           ‘3*4’)
     Eval.x (1,                                                                          ‘3*x + 4’)
     Eval.xy (1, 2,                                                                      ‘x + y’)
     Eval.xyz(1, 2, 3,                                                                   ‘x * y - z’)




                                                                                                                     60
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
GroovyShell

   • A Binding provides a context of execution
           – can implement lazy evaluation if needed
   • A base script class can be specified

   • def binding = new Binding()
     binding.mass = 22.3
     binding.velocity = 10.6
     def shell = new GroovyShell(binding)
     shell.evaluate(“mass * velocity ** 2 / 2”)




                                                                                                                     61
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
GroovyClassLoader

   • Most powerful mechanism
           – could also visit or change the AST
           – scripts & classes can be loaded from elsewhere
           – more control on compilation

   • GroovyClassLoader gcl =
             new GroovyClassLoader();
     Class clazz = gcl.parseClass(
             new File(“f.groovy”));
     GroovyObject instance =
             (GroovyObject)clazz.newInstance();
     instance.setMetaClass(customMC);


                                                                                                                     62
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Externalize business rules

   • Although Groovy DSLs can be embedded in normal
     Groovy classes, you should externalize them
   • Store them elsewhere
           – in a database, an XML file, etc.
   • Benefits
           – Business rules are not entangled
             in technical application code
           – Business rules can have their own lifecycle, without
             requiring application redeployments




                                                                                                                     63
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
a
                     d
                    n
                  e
                g
               A
                                                                                   • The context and
                                                                                     the usual issues we face
                                                                                   • Some real-life examples of
                                                                                     Domain-Specific Languages
                                                                                   • Groovy’s DSL capabilities
                                                                                   • Integrating a DSL
                                                                                     in your application
                                                                                   • Considerations to remember
                                                                                     when designing your own DSL


                                                                                                                     64
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Start small, with key concepts
Beware overengineering!
Grow your language progressively
Get your hands dirty
Play with the end-users
Let your DSL fly,
it’s not yours,
it’s theirs!
Tight feedback loop
Iterative process
Stay humble.
You can’t get it right the first time.
Don’t design alone at your desk
Involve the end users from the start
Playing it safe
in a sandbox
Various levels of
  sandboxing



   • Groovy supports the usual Java Security Managers

   • Use metaprogramming tricks to prevent calling /
     instanciating certain classes

   • Create a special GroovyClassLoader AST code
     visitor to filter only the nodes of the AST you want
     to keep
           – ArithmeticShell in Groovy’s samples



                                                                                                                     72
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
Test, test, test!

   • Don’t just test for nominal cases
           – Explicitely test for errors!


   • Ensure end-users get meaninful error messages




                                                                                                                     73
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
a
                     d
                    n
                  e
                g
               A
                                                                                   • Summary

                                                                                   • Questions & Answers




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

   • Groovy’s a great fit for Domain-Specific Languages
           – Malleable & flexible syntax
           – Full object-orientation


   • Metaprogramming capabilities
           – Runtime metaprogramming
           – Compile-time metaprogramming


   • Groovy’s very often used for mission-critical DSLs




                                                                                                                     75
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
GR8 Conference

                                                           • If you wish to learn more about
                                                             Groovy, Grails and Griffon, register
                                                             for the GR8 Conference
                                                           • A conference dedicated to Groovy,
                                                             Grails, Griffon and other Groovy
                                                             related technologies
                                                           • Co-organized by SpringSource and the
                                                             Danish JUG (Javagruppen)
                                                           • Takes place in Copenhagen,
                                                             Denmark, on May 18th and 19th
                                                           • Use the code SPRING to get a
                                                             discount ;-)
                                                                                                                     76
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
?
I kan haz my cheezburgr naw?
 Or do ya reely haz keshtionz?
Appendix




                                                                                                                     78
Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
• http://www.flickr.com/photos/wheatfields/420088151/sizes/l/
• http://www.flickr.com/photos/therefromhere/518053737/sizes/l/
• http://www.flickr.com/photos/romainguy/230416692/sizes/l/
• http://www.flickr.com/photos/addictive_picasso/2874279971/sizes/l/
• http://www.flickr.com/photos/huangjiahui/3127634297/sizes/l/
• http://www.flickr.com/photos/25831000@N08/3064515804/sizes/o/
• http://www.flickr.com/photos/lanier67/3147696168/sizes/l/
• http://www.flickr.com/photos/ktb/4916063/sizes/o/
• http://www.flickr.com/photos/nathonline/918128338/sizes/l/
• http://www.flickr.com/photos/kevinsteele/39300193/sizes/l/
• http://commons.wikimedia.org/wiki/File:Brueghel-tower-of-babel.jpg
• http://commons.wikimedia.org/wiki/File:Platypus.jpg
• http://www.flickr.com/photos/joaomoura/2317171808/sizes/l/
• http://www.flickr.com/photos/wiccked/132687067/
• http://www.flickr.com/photos/xcbiker/386876546/sizes/l/
• http://www.flickr.com/photos/pietel/152403711/sizes/o/


                                                                                                                      79
 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
• http://www.flickr.com/photos/forezt/192554677/sizes/o/
• http://keremkosaner.files.wordpress.com/2008/04/softwaredevelopment.gif
• http://www.jouy.inra.fr
• http://www.flickr.com/photos/ejpphoto/408101818/sizes/o/
• http://www.flickr.com/photos/solaro/2127576608/sizes/l/
• http://www.flickr.com/photos/biggreymare/2846899405/sizes/l/
• http://www.flickr.com/photos/timsamoff/252370986/sizes/l/
• http://www.flickr.com/photos/29738009@N08/2975466425/sizes/l/
• http://www.flickr.com/photos/howie_berlin/180121635/sizes/o/
• http://www.flickr.com/photos/yogi/1281980605/sizes/l/
• http://www.flickr.com/photos/dorseygraphics/1336468896/sizes/l/




                                                                                                                      80
 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.

Mais conteúdo relacionado

Semelhante a Practical Groovy Domain-Specific Languages - SpringOne Europe 2009

Groovy and Grails in Google App Engine
Groovy and Grails in Google App EngineGroovy and Grails in Google App Engine
Groovy and Grails in Google App EngineGuillaume Laforge
 
Gregor Hohpe Track Intro The Cloud As Middle Ware
Gregor Hohpe Track Intro The Cloud As Middle WareGregor Hohpe Track Intro The Cloud As Middle Ware
Gregor Hohpe Track Intro The Cloud As Middle Waredeimos
 
Groovy-Eclipse at Eclipsecon2010
Groovy-Eclipse at Eclipsecon2010Groovy-Eclipse at Eclipsecon2010
Groovy-Eclipse at Eclipsecon2010guest9ff00
 
Sioux Hot-or-Not: Domain Driven Design (Edwin Van Dillen)
Sioux Hot-or-Not: Domain Driven Design (Edwin Van Dillen)Sioux Hot-or-Not: Domain Driven Design (Edwin Van Dillen)
Sioux Hot-or-Not: Domain Driven Design (Edwin Van Dillen)siouxhotornot
 
Writing Domain-Specific Languages in Groovy
Writing Domain-Specific Languages in GroovyWriting Domain-Specific Languages in Groovy
Writing Domain-Specific Languages in GroovyGuillaume Laforge
 
InsideRIA Outlook for 2009
InsideRIA Outlook for 2009InsideRIA Outlook for 2009
InsideRIA Outlook for 2009AndreCharland
 
Razorfish - Michael Brito on Intel Digital Drag Race
Razorfish - Michael Brito on Intel Digital Drag RaceRazorfish - Michael Brito on Intel Digital Drag Race
Razorfish - Michael Brito on Intel Digital Drag RaceRazorfish
 
Server Day 2009: Spring dm Server by Alef Arendsen
Server Day 2009: Spring dm Server by Alef ArendsenServer Day 2009: Spring dm Server by Alef Arendsen
Server Day 2009: Spring dm Server by Alef ArendsenJUG Genova
 
HBase and Hadoop at Adobe
HBase and Hadoop at AdobeHBase and Hadoop at Adobe
HBase and Hadoop at AdobeCosmin Lehene
 
Stingray - Riverbed Technology
Stingray - Riverbed TechnologyStingray - Riverbed Technology
Stingray - Riverbed TechnologyChris Westin
 
German in 7 Million Shared Objects
German in 7 Million  Shared ObjectsGerman in 7 Million  Shared Objects
German in 7 Million Shared ObjectsESUG
 
Jeroen van Disseldorp: Making Open Source Work in the Enterprise
Jeroen van Disseldorp: Making Open Source Work in the EnterpriseJeroen van Disseldorp: Making Open Source Work in the Enterprise
Jeroen van Disseldorp: Making Open Source Work in the EnterpriseFriprogsenteret
 
Practical Domain-Specific Languages in Groovy
Practical Domain-Specific Languages in GroovyPractical Domain-Specific Languages in Groovy
Practical Domain-Specific Languages in GroovyGuillaume Laforge
 
Razorfish - Ray Velez and Laura Fraga (Ford Motor) on Agile Processes
Razorfish - Ray Velez and Laura Fraga (Ford Motor) on Agile ProcessesRazorfish - Ray Velez and Laura Fraga (Ford Motor) on Agile Processes
Razorfish - Ray Velez and Laura Fraga (Ford Motor) on Agile ProcessesRazorfish
 
Charlie Talk - Mulesource (Crowd)
Charlie Talk - Mulesource (Crowd)Charlie Talk - Mulesource (Crowd)
Charlie Talk - Mulesource (Crowd)Atlassian
 
Javascript Framework Roundup FYB
Javascript Framework Roundup FYBJavascript Framework Roundup FYB
Javascript Framework Roundup FYBnukeevry1
 
Domain Driven Design Development Spring Portfolio
Domain Driven Design Development Spring PortfolioDomain Driven Design Development Spring Portfolio
Domain Driven Design Development Spring PortfolioSrini Penchikala
 
The Flash to HTML5 Opportunity
The Flash to HTML5 OpportunityThe Flash to HTML5 Opportunity
The Flash to HTML5 OpportunityThomas Burleson
 

Semelhante a Practical Groovy Domain-Specific Languages - SpringOne Europe 2009 (20)

Groovy and Grails in Google App Engine
Groovy and Grails in Google App EngineGroovy and Grails in Google App Engine
Groovy and Grails in Google App Engine
 
Gregor Hohpe Track Intro The Cloud As Middle Ware
Gregor Hohpe Track Intro The Cloud As Middle WareGregor Hohpe Track Intro The Cloud As Middle Ware
Gregor Hohpe Track Intro The Cloud As Middle Ware
 
Groovy-Eclipse at Eclipsecon2010
Groovy-Eclipse at Eclipsecon2010Groovy-Eclipse at Eclipsecon2010
Groovy-Eclipse at Eclipsecon2010
 
Sioux Hot-or-Not: Domain Driven Design (Edwin Van Dillen)
Sioux Hot-or-Not: Domain Driven Design (Edwin Van Dillen)Sioux Hot-or-Not: Domain Driven Design (Edwin Van Dillen)
Sioux Hot-or-Not: Domain Driven Design (Edwin Van Dillen)
 
Writing Domain-Specific Languages in Groovy
Writing Domain-Specific Languages in GroovyWriting Domain-Specific Languages in Groovy
Writing Domain-Specific Languages in Groovy
 
InsideRIA Outlook for 2009
InsideRIA Outlook for 2009InsideRIA Outlook for 2009
InsideRIA Outlook for 2009
 
Razorfish - Michael Brito on Intel Digital Drag Race
Razorfish - Michael Brito on Intel Digital Drag RaceRazorfish - Michael Brito on Intel Digital Drag Race
Razorfish - Michael Brito on Intel Digital Drag Race
 
Server Day 2009: Spring dm Server by Alef Arendsen
Server Day 2009: Spring dm Server by Alef ArendsenServer Day 2009: Spring dm Server by Alef Arendsen
Server Day 2009: Spring dm Server by Alef Arendsen
 
HBase and Hadoop at Adobe
HBase and Hadoop at AdobeHBase and Hadoop at Adobe
HBase and Hadoop at Adobe
 
Stingray - Riverbed Technology
Stingray - Riverbed TechnologyStingray - Riverbed Technology
Stingray - Riverbed Technology
 
German in 7 Million Shared Objects
German in 7 Million  Shared ObjectsGerman in 7 Million  Shared Objects
German in 7 Million Shared Objects
 
Jeroen van Disseldorp: Making Open Source Work in the Enterprise
Jeroen van Disseldorp: Making Open Source Work in the EnterpriseJeroen van Disseldorp: Making Open Source Work in the Enterprise
Jeroen van Disseldorp: Making Open Source Work in the Enterprise
 
Hello Gumbo
Hello GumboHello Gumbo
Hello Gumbo
 
Amoocon May 2009 Germany
Amoocon May 2009   GermanyAmoocon May 2009   Germany
Amoocon May 2009 Germany
 
Practical Domain-Specific Languages in Groovy
Practical Domain-Specific Languages in GroovyPractical Domain-Specific Languages in Groovy
Practical Domain-Specific Languages in Groovy
 
Razorfish - Ray Velez and Laura Fraga (Ford Motor) on Agile Processes
Razorfish - Ray Velez and Laura Fraga (Ford Motor) on Agile ProcessesRazorfish - Ray Velez and Laura Fraga (Ford Motor) on Agile Processes
Razorfish - Ray Velez and Laura Fraga (Ford Motor) on Agile Processes
 
Charlie Talk - Mulesource (Crowd)
Charlie Talk - Mulesource (Crowd)Charlie Talk - Mulesource (Crowd)
Charlie Talk - Mulesource (Crowd)
 
Javascript Framework Roundup FYB
Javascript Framework Roundup FYBJavascript Framework Roundup FYB
Javascript Framework Roundup FYB
 
Domain Driven Design Development Spring Portfolio
Domain Driven Design Development Spring PortfolioDomain Driven Design Development Spring Portfolio
Domain Driven Design Development Spring Portfolio
 
The Flash to HTML5 Opportunity
The Flash to HTML5 OpportunityThe Flash to HTML5 Opportunity
The Flash to HTML5 Opportunity
 

Mais de Guillaume 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
 
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
 
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 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
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 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
 

Mais de Guillaume Laforge (20)

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
 
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
 
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 2.0 webinar
Groovy 2.0 webinarGroovy 2.0 webinar
Groovy 2.0 webinar
 
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
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 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...
 

Último

Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 

Último (20)

Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 

Practical Groovy Domain-Specific Languages - SpringOne Europe 2009

  • 1. Practical Domain-Specific Languages with Groovy All the techniques to create your own DSLs Guillaume Laforge Head of Groovy Development Copyright 2009 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 2. Guillaume Laforge • Groovy Project Manager • JSR-241 Spec Lead • Head of Groovy Development at SpringSource • Initiator of the Grails framework • Co-author of Groovy in Action • Speaker: JavaOne, QCon, JavaZone, Sun TechDays, Devoxx, The Spring Experience, JAX, Dynamic Language World, IJTC, and more... 2 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 3. A few words about Groovy • Groovy is a dynamic language for the JVM – with a Meta Object Protocol – compiles directly to bytecode, seamless Java interop • Open Source ASL 2 project hosted at Codehaus • Relaxed grammar derived from Java 5 – + borrowed good ideas from Ruby, Python, Smalltalk • Fast... for a dynlang on the JVM • Closures, properties, optional typing, BigDecimal by default, nice wrapper APIs, and more... 3 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 4. a d n e g A • The context and the usual issues we face • Some real-life examples of Domain-Specific Languages • Groovy’s DSL capabilities • Integrating a DSL in your application • Considerations to remember when designing your own DSL 4 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 6. Subject Matter Experts, Business analysts...
  • 7. Developer producing LOLCODE HAI CAN HAS STDIO? I HAS A VAR IM IN YR LOOP UP VAR!!1 VISIBLE VAR IZ VAR BIGGER THAN 10? KTHXBYE IM OUTTA YR LOOP KTHXBYE
  • 9. And in the end... ...nobody understands each other
  • 10. Expressing requirements... 10 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 11. DSL: a potential solution? • Use a more expressive language than a general purpose one • Share a common metaphore of understanding between developers and subject matter experts • Have domain experts help with the design of the business logic of an application • Avoid cluttering business code with too much boilerplate technical code • Cleanly separate business logic from application code • Let business rules have their own lifecycle 11 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 12. Towards more readibility (1) 12 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 13. Towards more readibility (1) 12 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 14. Towards more readibility (1) 20% 12 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 15. Towards more readibility (2) 13 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 16. Towards more readibility (2) 13 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 17. Towards more readibility (2) 80% 13 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 18. a d n e g A • The context and the usual issues we face • Some real-life examples of Domain-Specific Languages • Groovy’s DSL capabilities • Integrating a DSL in your application • Considerations to remember when designing your own DSL 14 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 19. A collection of DSLs • In our everyday life, we’re surrounded by DSLs – Technical dialects – Notations – Business languages 15 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 20. Technical dialects 16 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 21. SQL
  • 22. ^[w-.]+@([w-]){2,4}$ 18 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 23. Notations 19 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 24. 1. e4 e5 2. Nf3 Nc6 3. Bb5 a6
  • 25. L2 U F-1 B L2 F B -1 U L2
  • 27. Business languages 23 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 28. Real-life Groovy examples • Anti-malaria drug resistance simulation • Human Resources employee skills representation • Insurance policies risk calculation engine • Loan acceptance rules engine for a financial platform • Mathematica-like lingua for nuclear safety simulations • Market data feeds evolution scenarios • and more... 24 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 29. a d n e g A • The context and the usual issues we face • Some real-life examples of Domain-Specific Languages • Groovy’s DSL capabilities • Integrating a DSL in your application • Considerations to remember when designing your own DSL 25 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 30. A flexible & malleable syntax • No need to write full-blown classes, use scripts • Optional typing (def) – in scripts, you can even omit the def keyword • Native syntax constructs • Parentheses & semi-colons are optional • Named arguments • BigDecimal by default for decimal numbers • Closures for custom control structures • Operator overloading 26 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 31. Scripts vs classes • Hide all the boilerplate technical code – an end-user doesn’t need to know about classes – public class Rule { public static void main(String[] args) { System.out.println(“Hello”); } } – println “Hello” 27 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 32. Optional typing • No need to bother with types or even generics – unless you want to! • Imagine an interest rate lookup table method returning some generified type: –Rate<LoanType, Duration, BigDecimal>[] lookupTable() { ... } def table = lookupTable() • No need to repeat the horrible generics type info! 28 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 33. Native syntax constructs • Lists – [Monday, Tuesday, Wednesday] • Maps – [CA: ‘California’, TX: ‘Texas’] • Ranges – def bizDays = Monday..Friday – def allowedAge = 18..65 – You can create your own custom ranges 29 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 34. Optional parens & semis • Make statements and expressions look more like natural languages – move(left); – move left 30 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 35. Named arguments • In Groovy you can mix named and unnamed arguments for method parameters – named params are actually put in a map parameter – plus optional parens & semis • take 1.pill, of: Chloroquinine, after: 6.hours • Corresponds to a method signature like: –def take(Map m, MedicineQuantity mq) 31 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 36. BigDecimal by default • Main reason why financial institutions often decide to use Groovy for their business rules! – Although these days rounding issues are overrated! • Java vs Groovy for a simple interpolation equation • BigDecimal uMinusv = c.subtract(a); BigDecimal vMinusl = b.subtract(c); BigDecimal uMinusl = a.subtract(b); return e.multiply(uMinusv) .add(d.multiply(vMinusl)) .divide(uMinusl, 10, BigDecimal.ROUND_HALF_UP); • (d * (b - c) + e * (c - a)) / (a - b) 32 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 37. Custom control structures, thanks to closures • When closures are last, they can be put “out” of the parentheses surrounding parameters • unless (account.balance > 100.euros, { account.debit 100.euros }) • unless (account.balance > 100.euros) { account.debit 100.euros } • Signature def unless(boolean b, Closure c) 33 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 38. Operator overloading • Currency amounts a+b a.plus(b) a-b a.minus(b) –15.euros + 10.dollars a*b a.multiply(b) a/b a.divide(b) • Distance handling a%b a.modulo(b) –10.kilometers - 10.meters a ** b a.power(b) a|b a.or(b) • Workflow, concurrency a&b a.and(b) a^b a.xor(b) –taskA | taskB & taskC a[b] a.getAt(b) a << b a.leftShift(b) • Credit an account a >> b a.rightShift(b) –account << 10.dollars +a a.positive() account += 10.dollars -a a.negative() account.credit 10.dollars ~a a.bitwiseNegate() 34 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 39. Groovy’s dynamic heart: The MOP! MetaObject Protocol
  • 40. Groovy’s MOP • All the accesses to methods, properties, constructors, operators, etc. can be intercepted thanks to the MOP • While Java’s behavior is hard-wired at compile- time in the class • Groovy’s runtime behavior is adaptable at runtime through the metaclass. • Different hooks for changing the runtime behavior – GroovyObject, custom MetaClass implementation, categories, ExpandoMetaClass 36 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 41. GroovyObject • All instances of classes created in Groovy implement the GroovyObject interface: –getProperty(String name) –setProperty(String name, Object value) –invokeMethod(String name, Object[] params) –getMetaClass() –setMetaClass(MetaClass mc) • A GO can have “pretended” methods and properties 37 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 42. MetaClass • The core of Groovy’s MOP system –invokeConstructor() –invokeMethod() and invokeStaticMethod() –invokeMissingMethod() –getProperty() and setProperty() –getAttribute() and setAttribute() –respondsTo() and hasProperty() • MetaClasses can change the behavior of existing third-party classes — even from the JDK 38 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 43. ExpandoMetaClass • A DSL for MetaClasses! • MoneyAmount.metaClass.constructor = { ... } Number.metaClass.getDollars = { ... } Distance.metaClass.toMeters = { ... } Distance.metaClass.static.create = { ... } • To avoid repetition of Type.metaClass, you can pass a closure to metaClass { ... } • The delegate variable in closure represents the current instance, and it the default parameter 39 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 45. The Groovy MarkupBuilder • def mkp = new MarkupBuilder() mkp.html { head { title “Groovy in Action” } body { div(width: ‘100’) { p(class: ‘para) { span “Best book ever!” } } } } 41 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 46. A builder for HR • softskills { ideas { capture 2 formulate 3 } ... } knowhow { languages { java 4 groovy 5 } ... } 42 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 47. A builder for HR • softskills { ideas { capture 2 formulate 3 } ... } knowhow { languages { java 4 groovy 5 } ... } 42 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 48. Builders • Builders are... – a mechanism for creating any tree-structered graph – the realization of the GoF builder pattern at the syntax level in Groovy – simply a clever use of chained method invocation, closures, parentheses omission, and use of the GroovyObject methods • Existing builders – XML, Object graph, Swing, Ant, JMX, and more... 43 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 49. The clever trick • GroovyObject#invokeMethod() is used to catch all non-existing method calls in the context of the builder • The nesting of closures visually shows the level of nesting / depth in the tree • builder.m1(attr1:1, attr2:2, { builder.m2(..., {...}) } becomes equivalent to builder.m1(attr1:1, attr2:2) { m2(...) {...} } thanks to parens omission 44 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 50. Adding properties to numbers • Three possible approaches – create a Category •a category is a kind of decorator for default MCs – create a custom MetaClass •a full-blown MC class to implement and to set on the POGO instance – use ExpandoMetaClass •friendlier DSL approach but with a catch 45 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 51. With a Category • class DistanceCategory { static Distance getMeters(Integer self) { new Distance(self, Unit.METERS) } } use(DistanceCategory) { 100.meters } • Interesting scope: thread-bound & lexical • But doesn’t work across the hierarchy of classes – ie. subclasses won’t benefit from the new property 46 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 52. With an ExpandoMetaClass • Number.metaClass.getMeters = {-> new Distance(delegate, Unit.METERS) } 100.meters • Works for the class hierarchy for POJOs, and a flag exists to make it work for POGOs too • But the catch is it’s really a global change, so beware EMC enhancements collisions 47 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 53. Compile-time metaprogramming • Groovy 1.6 introduced AST Transformations • Compile-time == No runtime performance penalty! Transformation 48 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 54. AST Transformations • Two kinds of transformations – Global transformations •applicable to all compilation units – Local transformations •applicable to marked program elements •using specific marker annotations 49 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 55. Example #1: @Singleton • Let’s revisit this evil (anti-)pattern public class Evil { ! public static final Evil instance = new Evil (); private Evil () {} Evil getInstance() { return instance; } } • In Groovy @Singleton class Evil {} ! • Also a “lazy” version @Singleton(lazy = true) class Evil {} ! 50 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 56. Example #2: @Delegate Not just for Managers • You can delegate to fields of your classes – class Employee { def doTheWork() { “done” } } class Manager { @Delegate Employee slave = new Employee() } def god = new Manager() assert god.doTheWork() == “done” • Damn manager who will get all the praiser... 51 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 57. Global transformations • Implement ASTTransformation • Annotate the transfo specifying a compilation phase • @GroovyASTTransformation(phase=CompilePhase.CONVERSION) public class MyTransformation implements ASTTransformation { public void visit(ASTNode[] nodes, SourceUnit unit) { ... } } • For discovery, create the file META-INF/services/ org.codehaus.groovy.transform.ASTTransformation • Add the fully qualified name of the class in that file 52 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 58. Local transformations • Same approach as Globale transformations • But you don’t need the META-INF file • Instead create an annotation to specify on which element the transformation should apply • @Retention(RetentionPolicy.SOURCE) @Target([ElementType.METHOD]) @GroovyASTTransformationClass( [quot;fqn.MyTransformationquot;]) public @interface WithLogging {...} 53 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 59. Example: the Spock framework • Changing the semantics of the original code • But keeping a valid Groovy syntax • @Speck class HelloSpock { def quot;can you figure out what I'm up to?quot;() { expect: name.size() == size where: name << [quot;Kirkquot;, quot;Spockquot;, quot;Scottyquot;] size << [4, 5, 6] } } 54 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 60. a d n e g A • The context and the usual issues we face • Some real-life examples of Domain-Specific Languages • Groovy’s DSL capabilities • Integrating a DSL in your application • Considerations to remember when designing your own DSL 55 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 61. Various integration mechanisms • Java 6’s javax.script.* APIs (aka JSR-223) • Spring’s language namespace • Groovy’s own mechanisms • But a key idea is to externalize those DSL programs – DSL programs can have their own lifecycle – no need to redeploy an application because of a rule change – business people won’t see the technical code 56 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 62. Java 6’s javax.script.* API • Groovy 1.6 provides its own implementation of the javax.script.* API • ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName(“Groovy”); String result = (String)engine.eval(“2+3”); 57 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 63. Spring’s lang namespace • POGOs (Plain Old Groovy Objects) can be pre- compiled as any POJO and used interchangeably with POJOs in a Spring application • But Groovy scripts & classes can be loaded at runtime through the <lang:groovy/> namespace and tag • Reloadable on change • Customizable through a custom MetaClass • <lang:groovy id=quot;eventsquot; script-source=quot;classpath:dsl/ eventsChart.groovyquot; customizer-ref=quot;eventsMetaClassquot; /> 58 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 64. Groovy’s own mechanisms • Eval – for evaluating simple expressions • GroovyShell – for more complex scripts and DSLs • GroovyClassLoader – the most powerful mechanism 59 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 65. Eval • Simple mechanism to evaluate math-like formulas • Eval.me ( ‘3*4’) Eval.x (1, ‘3*x + 4’) Eval.xy (1, 2, ‘x + y’) Eval.xyz(1, 2, 3, ‘x * y - z’) 60 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 66. GroovyShell • A Binding provides a context of execution – can implement lazy evaluation if needed • A base script class can be specified • def binding = new Binding() binding.mass = 22.3 binding.velocity = 10.6 def shell = new GroovyShell(binding) shell.evaluate(“mass * velocity ** 2 / 2”) 61 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 67. GroovyClassLoader • Most powerful mechanism – could also visit or change the AST – scripts & classes can be loaded from elsewhere – more control on compilation • GroovyClassLoader gcl = new GroovyClassLoader(); Class clazz = gcl.parseClass( new File(“f.groovy”)); GroovyObject instance = (GroovyObject)clazz.newInstance(); instance.setMetaClass(customMC); 62 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 68. Externalize business rules • Although Groovy DSLs can be embedded in normal Groovy classes, you should externalize them • Store them elsewhere – in a database, an XML file, etc. • Benefits – Business rules are not entangled in technical application code – Business rules can have their own lifecycle, without requiring application redeployments 63 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 69. a d n e g A • The context and the usual issues we face • Some real-life examples of Domain-Specific Languages • Groovy’s DSL capabilities • Integrating a DSL in your application • Considerations to remember when designing your own DSL 64 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 70. Start small, with key concepts Beware overengineering!
  • 71. Grow your language progressively
  • 72. Get your hands dirty Play with the end-users
  • 73. Let your DSL fly, it’s not yours, it’s theirs!
  • 75. Stay humble. You can’t get it right the first time. Don’t design alone at your desk Involve the end users from the start
  • 76. Playing it safe in a sandbox
  • 77. Various levels of sandboxing • Groovy supports the usual Java Security Managers • Use metaprogramming tricks to prevent calling / instanciating certain classes • Create a special GroovyClassLoader AST code visitor to filter only the nodes of the AST you want to keep – ArithmeticShell in Groovy’s samples 72 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 78. Test, test, test! • Don’t just test for nominal cases – Explicitely test for errors! • Ensure end-users get meaninful error messages 73 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 79. a d n e g A • Summary • Questions & Answers 74 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 80. Summary • Groovy’s a great fit for Domain-Specific Languages – Malleable & flexible syntax – Full object-orientation • Metaprogramming capabilities – Runtime metaprogramming – Compile-time metaprogramming • Groovy’s very often used for mission-critical DSLs 75 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 81. GR8 Conference • If you wish to learn more about Groovy, Grails and Griffon, register for the GR8 Conference • A conference dedicated to Groovy, Grails, Griffon and other Groovy related technologies • Co-organized by SpringSource and the Danish JUG (Javagruppen) • Takes place in Copenhagen, Denmark, on May 18th and 19th • Use the code SPRING to get a discount ;-) 76 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 82. ? I kan haz my cheezburgr naw? Or do ya reely haz keshtionz?
  • 83. Appendix 78 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 84. • http://www.flickr.com/photos/wheatfields/420088151/sizes/l/ • http://www.flickr.com/photos/therefromhere/518053737/sizes/l/ • http://www.flickr.com/photos/romainguy/230416692/sizes/l/ • http://www.flickr.com/photos/addictive_picasso/2874279971/sizes/l/ • http://www.flickr.com/photos/huangjiahui/3127634297/sizes/l/ • http://www.flickr.com/photos/25831000@N08/3064515804/sizes/o/ • http://www.flickr.com/photos/lanier67/3147696168/sizes/l/ • http://www.flickr.com/photos/ktb/4916063/sizes/o/ • http://www.flickr.com/photos/nathonline/918128338/sizes/l/ • http://www.flickr.com/photos/kevinsteele/39300193/sizes/l/ • http://commons.wikimedia.org/wiki/File:Brueghel-tower-of-babel.jpg • http://commons.wikimedia.org/wiki/File:Platypus.jpg • http://www.flickr.com/photos/joaomoura/2317171808/sizes/l/ • http://www.flickr.com/photos/wiccked/132687067/ • http://www.flickr.com/photos/xcbiker/386876546/sizes/l/ • http://www.flickr.com/photos/pietel/152403711/sizes/o/ 79 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.
  • 85. • http://www.flickr.com/photos/forezt/192554677/sizes/o/ • http://keremkosaner.files.wordpress.com/2008/04/softwaredevelopment.gif • http://www.jouy.inra.fr • http://www.flickr.com/photos/ejpphoto/408101818/sizes/o/ • http://www.flickr.com/photos/solaro/2127576608/sizes/l/ • http://www.flickr.com/photos/biggreymare/2846899405/sizes/l/ • http://www.flickr.com/photos/timsamoff/252370986/sizes/l/ • http://www.flickr.com/photos/29738009@N08/2975466425/sizes/l/ • http://www.flickr.com/photos/howie_berlin/180121635/sizes/o/ • http://www.flickr.com/photos/yogi/1281980605/sizes/l/ • http://www.flickr.com/photos/dorseygraphics/1336468896/sizes/l/ 80 Copyright 2008 SpringSource. Copying, publishing or distributing without express written permission is prohibited.