Groovy's Builder

1,835 views

Published on

2010-12-20のGlassfish & JavaFX合同勉強会で発表した資料です。

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,835
On SlideShare
0
From Embeds
0
Number of Embeds
318
Actions
Shares
0
Downloads
10
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Groovy's Builder

  1. 1. http://www.flickr.com/photos/iancarroll/5058330466/
  2. 2. Ad::
  3. 3. Ad::@GrabConfig(systemClassLoader=true) // for GroovyServ@GrabResolver(name="kobo-repo", root="http://github.com/kobo/maven-repo/raw/master/release")@Grab("org.jggug.kobo:gexcelapi:0.2")import org.jggug.kobo.gexcelapi.GExceldef book = GExcel.open(args[0])def sheet = book[0]println sheet.A1.valuesheet.A1.value = "New value of A1"sheet.A_.each{ cell -> println cell.value }sheet._1.each{ cell -> println cell.value }sheet.A1_B6.each{ row -> row.each { cell -> println it.value } }
  4. 4. Sample of import  javafx.stage.*; import  javafx.scene.*; import  javafx.scene.shape.*; import  javafx.scene.paint.*; Stage  {        title:  "Sample  by  JavaFX  Script"        width:  600        height:  450        scene:  Scene  {                fill:  Color.LIGHTSKYBLUE                content:  Rectangle  {                        x:  25,  y:  40                        width:  100,  height:  50                        fill:  Color.RED                }        } }
  5. 5. 6
  6. 6. import  groovy.swing.SwingBuilderSample of import  java.awt.BorderLayout  as  BL int  count  =  0 new  SwingBuilder().edt  {        frame(                title:Hello,                size:[600,  450],                show:true        )  {                borderLayout()                textLabel  =  label(                        text:Sample  of  SwingBuilder,                        constraints:  BL.NORTH                )                button(                        text:  Click  Me!,                        actionPerformed:  {                                count++                                textLabel.text  =                                  "Clicked  ${count}  time(s)."                                println  "clicked"                        },                        constraints:  BL.SOUTH                )        } }
  7. 7. http://www.flickr.com/photos/33678919@N07/5239012324/
  8. 8. from Roadmap http://www.flickr.com/photos/33678919@N07/5239012324/
  9. 9. http://svn.codehaus.org/griffon/builders/fxbuilder/
  10. 10. import  griffon.builder.fx.FxBuilderSample of import  javafx.stage.* import  javafx.scene.* import  javafx.scene.shape.* import  javafx.scene.paint.* new  FxBuilder().edt  {        stage(                title:  "Sample  by  FxBuilder  of  Groovy",                width:  600,                height:  450,                scene:  scene(fill:  Color.$LIGHTSKYBLUE)  {                        rectangle(                                x:  25,  y:  40,                                width:  100,  height:  50,                                fill:  Color.$RED                        )                }        ) } http://griffon.codehaus.org/FxBuilder+Plugin
  11. 11. import  griffon.builder.fx.FxBuilder import  javafx.stage.*import  javafx.stage.*; import  javafx.scene.*import  javafx.scene.*; import  javafx.scene.shape.*import  javafx.scene.shape.*; import  javafx.scene.paint.*import  javafx.scene.paint.*; new  FxBuilder().edt  {Stage  {        stage(        title:  "Sample  by  JavaFX  Script",                title:  "Sample  by  FxBuilder  of  Groovy",        width:  600                width:  600,        height:  450                height:  450,        scene:  Scene  {                fill:  Color.LIGHTSKYBLUE                content:  Rectangle  {                        x:  25,  y:  40 ≒                        width:  100,  height:  50                        fill:  Color.RED                scene:  scene(fill:Color.$LIGHTSKYBLUE){                        rectangle(                                x:  25,  y:  40,                                width:  100,  height:  50,                                fill:  Color.$RED                }                        )        }                }}        ) } FxBuilder
  12. 12. JavaFX Script Welcome tohttp://www.flickr.com/photos/anirudhkoul/3734360895/
  13. 13. Minimum lecture series #65535 only for DSL/Builderhttp://www.flickr.com/photos/iancarroll/5058330466/
  14. 14. Minimum BasicValue:  ${value}”
  15. 15. Features for
  16. 16. Features for
  17. 17. Features for
  18. 18. groovy.lang.Closure  closure  =  {  String  arg  -­‐>        return  "hoge:${arg}"} Java8 #//  closure.call(“foo”)    //=>  “hoge:foo”//  closure(“foo”)              //=>  “hoge:foo”
  19. 19. Args of//   ( ){  -­‐>  "hoge"  }.call()                              //=>  "hoge"//   ( ){  num  -­‐>  "hoge:${num}"  }.call(123)  //=>  "hoge:123"//   ( ){  num,  String  id,  option  -­‐>        return  "hoge:${num}:${id}:${option}"}.call(123,  “0A”,  “X”)                          //=>  "hoge:123:0A:X"//   it{  "hoge:${it}"  }.call(123)                  //=>  "hoge:123"
  20. 20. as Args//   ( )someMethod({  num  -­‐>  num  *  2  })//  someMethod  {  num  -­‐>  num  *  2  }//  someMethod(arg1,  arg2,  {  num  -­‐>  num  *  2  })someMethod(arg1,  arg2)  {  num  -­‐>  num  *  2  }  //
  21. 21. Features for
  22. 22. MOP::class  MopSample  {        def  methodMissing(String  name,  args)  {                println  "Method:  $name($args)"        }}def  sample  =  new  MopSample()sample.hoge()//  =>  “Method:  hoge([])”sample.foo(123,  456)//  =>  “Method:  foo([123,  456])”
  23. 23. MOP::class  MopSample  {        def  propertyMissing(String  name)  {  //  for  getter                println  "Property:  $name"        }        def  propertyMissing(String  name,  value)  {  //  for  setter                println  "Property:  $name  =  $value"        }}sample  =  new  MopSample2()sample.hoge              //=>  "Property:  hoge"sample.bar                //=>  "Property:  bar"sample.baz  =  "!!"  //=>  "Property:  baz  =  !!"
  24. 24. Features for
  25. 25. ex.def  writer  =  new  StringWriter()def  builder  =  new  groovy.xml.MarkupBuilder(writer)builder.books  {        book(published:"2010-­‐12-­‐20")  {                author  "nobeans"                title    "Groovy ←Describe here "        }        3.times  {                book  "Groovy   ${it+1} "        } <books>}    <book  published=2010-­‐12-­‐20>println  writer.toString()        <author>nobeans</author>        <title>Groovy </title>    </book>    <book>Groovy   1 </book> Format as Xml→    <book>Groovy   2 </book>    <book>Groovy   3 </book> </books>
  26. 26. Basic Theory ofbuilder.books  {        book(published:"2010-­‐12-­‐20")  {                author  "nobeans"                title    "Groovy "        }        3.times  {                book  "Groovy   ${it+1} "        }}
  27. 27. Basic Theory ofbuilder.books  {        book(published:"2010-­‐12-­‐20")  {                author  "nobeans"                title    "Groovy "        }        3.times  {                book  "Groovy   ${it+1} "        }}
  28. 28. Classification of Dynamically Statically Defined Method Defined Method extends extends BuilderSupport FactoryBuilderSupport Extends MarkupBuilder SwingBuilder Abstract NodeBuilder FxBuilder Class DOMBuilder ObjectGraphBuilder AntBuilder JmxBuilder SAXBuilder ConfigSlurperIndependent CliBuilder
  29. 29. public  abstract  class  BuilderSupport  ...  {      //  ...snip...      protected  abstract  void  setParent(Object  parent,  Object  child);      protected  abstract  Object  createNode(Object  name);      protected  abstract  Object  createNode(Object  name,  Object  value);      protected  abstract  Object  createNode(Object  name,  Map  attributes);      protected  abstract  Object  createNode(Object  name,  Map  attributes,                                                                                Object  value);      //  ...snip...}
  30. 30. public  class  SwingBuilder  extends  FactoryBuilderSupport  {        //  ...snip...        def  registerSupportNodes()  {                registerFactory("action",  new  ActionFactory())                registerFactory("actions",  new  CollectionFactory())                registerFactory("map",  new  MapFactory())                registerFactory("imageIcon",  new  ImageIconFactory())                registerFactory("buttonGroup",  new  ButtonGroupFactory())                addAttributeDelegate(ButtonGroupFactory.&buttonGroupAttributeDelegate)                //  ...snip...        }        //  ...snip...}
  31. 31. ≪sample≫powered by NodeBuilder http://www.flickr.com/photos/timothymorgan/75294154/
  32. 32. def  writer  =  new  StringWriter()new  DdlBuilder(writer).scheme  {    book  { CREATE  TABLE  book  (        id                type:int        id  INTEGER,        title          type:String        title  TEXT,        published  type:Date        published  TIMESTAMP,        author        type:int        author  INTEGER    } )    author  { CREATE  TABLE  author  (        id                type:int        id  INTEGER,        name            type:String        name  TEXT    } )}println  writer.toString()
  33. 33. class  DdlBuilder  {        def  writer        DdlBuilder(writer)  {  this.writer  =  writer  }        def  scheme(Closure  cls)  {                new  NodeBuilder().scheme(cls).each  {  table  -­‐>                        writer.println  "CREATE  TABLE  ${table.name()}  ("                        writer.println  table.collect  {  col  -­‐>                                "        ${col.name()}  ${type(col.attribute(type))}"                        }.join(",n")                        writer.println  ")"                }        }        private  type(clazz)  {                switch  (clazz)  {                        case  String:  return  "TEXT"                        case  int:        return  "INTEGER"                        case  Date:      return  "TIMESTAMP"                        default:                            throw  new  RuntimeException("unsupported  type:  $clazz")                }        }}
  34. 34. Features for
  35. 35. http://www.flickr.com/photos/ztyx/4601942293/

×