1
Polyglot Plugin Development
How to write plugins in a language other than Java




Stefan Saasen
Confluence Team Lead, Atlassian

                                                     2
Audience
• Written an Atlassian plugin in Java
• Interested in other programming languages
• Eager to see what is possible with Atlassian plugins




                                                         3
Show of hands
• Who has actually written a Atlassian plugin?
• In any other language than Java?




                                                 4
5
Rhino
        6
7
https://bitbucket.org/ssaasen/atlassian-jruby-example-plugin

https://bitbucket.org/ssaasen/atlassian-scala-example-plugin




                                                               8
Polyglot Plugins
• Why?
• How?
 • Example 1: Scala
 • Example 2: JRuby

• Go and do it!


                      9
Why not?
           10
Why ?
        11
What to tell the boss?
• Leverage existing knowledge in the team
• Libraries/applications already written in language X
• Time to market/devspeed
• Explore technologies in a sandboxed environment
• Grass looks always greener on the other side


                                                         12
What to tell the boss?
• Leverage existing knowledge in the team
• Libraries/applications already written in language X
• Time to market/devspeed
• Explore technologies in a sandboxed environment
• Grass looks always greener on the other side


                                                         13
14
“No time to write in Java”

                  “Less bugs”
“Succinctness”
                                15
16
Polyglot Plugins
• Why?
• How?
 • Example 1: Scala
 • Example 2: JRuby

• Go and do it!


                      17
• Hybrid language: Object oriented & functional
• Concise, statically typed (with type inference)
• Higher order/first class functions, pattern matching
• Powerful type system
• Rich standard library


                                                        18
19
20
21
22
How?


       23
Overview

                                          Scala




                                                  scalac
                Scala Runtime Library

Java Bytecode
   *.class                                Java

                 Java Standard Library




                                                  javac
                                    JVM


                                                           24
25
26
Build process
• Start with Maven to get
  the AMPS goodness
• Use the maven-scala-
  plugin
• Add SBT if necessary



                            27
Build process f.
 • Compile time is a concern!
 • FSC
 • Useful Maven goals:
    mvn scala:cc
    mvn scala:console


                                28
Bundle runtime
                 29
Size might be a
  problem :(
                  30
Deployment options
     Option          Scope       Package        Size

                                mvn package
     Bundle          compile     -Pbundle
                                               8.5 MB    Simple

Bundle & Shrink                 mvn package              Deploy
                     compile                   680 KB
 w/ProGuard                     -Pproduction            externally

                                                         Deploy
Install separately   provided   mvn package    50 KB
                                                        internally
                                                                     31
Simply install using the
   plugin manager!

                           32
Development checklist
• Dependencies: Scala libraries are jar files and often
  available from Maven repositories
• Compile time: mvn scala:cc for continuous compilation
• Workflow: scala:cc & atlas-cli pi or
  mvn package && atlas-install-plugin
• Profit: mvn scala:console to get the Scala REPL

                                                          33
Scala: Working
with Java APIs
                 34
Scala gotchas (the 80%)
• Collections
• Method naming conventions
• Annotations
• Null vs. Option




                              35
Collections
 • Immutable vs Mutable, serial vs. parallel
 • Rich API: Prefer Scala collections
 • Convert between Java and Scala collections when
   calling Java methods
 • Solution: JavaConverters (explicit, preferred) vs.
   JavaConversions (implicit)
 • Watch out for serialization: Bandana/XStream
                                                        36
37
38
39
Method naming conventions
• Libraries rely on bean style naming conventions
  e.g. XWork, Velocity
• Scala: uniform access principle
• Solution: Use @BeanProperty and
  @BooleanBeanProperty



                                                    40
41
42
43
(Meta)-Annotations
• How to use @JavaAnnotation on a getter method
  when defining fields?
• Scala meta annotations @beanGetter, @beanGetter,
  @field, @getter, @setter




                                                     44
45
46
47
Option vs. null
 • In Scala Option represents an optional value.
 • Don’t let the billion-dollar mistake leak into your
   Scala code!
 • Solution: wrap nullable method calls in an Option




                                                         48
49
50
51
52
Show me the
   code!
              53
57
58
59
60
Example Scala plugin
• Servlet & XWork action
• Confluence macro
• REST via Jersey/Jackson
• Build setup
• Use as a starting point
                    https://bitbucket.org/ssaasen/atlassian-scala-example-plugin

                                                                                   61
Let’s recap
 • Replace Java entirely with Scala or mix and match
 • Runtime library: 3 deployment options
 • Fits into the AMPS development workflow
 • Scala Gotchas: watch out for common problems
 • “Scala is a great fit to write Atlassian plugins in”


                                                         62
Agenda
• Why?
• How?
 • Example 1: Scala
 • Example 2: JRuby

• Go and do it!


                      63
(J)Ruby
• Dynamic, object-oriented language
• Everything is an object (no “primitives”)
• Meta-programming and open, executable classes
  allow for easy creation of DSLs
• JRuby: Ruby runtime written in Java



                                                  64
65
How?


       66
Overview
                    Ruby
Ruby files *.rb                                  Your Ruby
                  Standard          RubyGems




                                                              jrubyc
                                                   Code
                   Library

                                  Ruby Runtime

Java Bytecode
   *.class                                             Java

                     Java Standard Library




                                                              javac
                                        JVM




                                                                       67
68
69
70
Plugins can’t be
written in Ruby

                   71
But we can still use
 Ruby in a plugin!

                       72
Recipe for using JRuby
• Embed the Ruby Runtime
• Use Java to execute Ruby scripts and classes
• Make components of the host application available
• Use the script execution result in Java




                                                      73
Embedding Strategies
• javax.scripting - JSR 223
• Apache Bean Scripting Framework (BSF)
• JRuby Embed - lower level JRuby API




                                          74
Embedding Strategies
• javax.scripting - JSR 223
  Only configurable via system properties :(
• Apache Bean scripting framework (BSF)
  No point in adding a separate API
• JRuby Embed - lower level JRuby API



                                              75
76
Building the plugin
• Package Ruby files
• Download and package Ruby gems
• Make Ruby gems available on the Ruby LOAD_PATH
• Bundle everything into a plugin jar file
• A lot of Maven XML :)
• Caveat: JRuby runtime is even larger!
                                                   77
Show me the
   code!
              78
79
80
1 minute


           81
82
83
84
85
86
87
88
89
Example JRuby plugin
• How to use Rubygem based
  libraries in a plugin
• How to access host
  components in Ruby
• How to use the execution result
• Sinatra in Confluence ;-)
                     https://bitbucket.org/ssaasen/atlassian-jruby-example-plugin
                                                                                    90
Let’s recap
• The plugin can’t be written in Ruby!
• Use the Ruby runtime
• Development workflow bonus: dynamic reloading!
• The overhead of adding the runtime and providing
  Java glue code makes this only feasible for high
  value use cases :(

                                                     91
Conclusion
• Scala is a great alternative when
  developing an Atlassian plugin
• JRuby is powerful, makes
  developing in a dynamic language
  possible but requires more work and
  custom Java adapter code
• Java interoperability needs to be well
  understood in both cases
                                           92
TAKE-AWAYS




“   The power of the Atlassian plugin framework allows
    you to build your plugins the way you want and

                                     ”
    Java doesn’t have to be the limit.




     #atlascamp


                                                         93
Thank you!




             94
• “Happy Foods” by swanksalot
  http://www.flickr.com/photos/swanksalot/5021262869/
• “Construction” by Daniel Morris
  http://www.flickr.com/photos/danielmorris/275438405/
• “70 80 90” by roujo
  http://www.flickr.com/photos/tekmagika/437989361



                                                        95

Polyglot Plugin Programming

  • 1.
  • 2.
    Polyglot Plugin Development Howto write plugins in a language other than Java Stefan Saasen Confluence Team Lead, Atlassian 2
  • 3.
    Audience • Written anAtlassian plugin in Java • Interested in other programming languages • Eager to see what is possible with Atlassian plugins 3
  • 4.
    Show of hands •Who has actually written a Atlassian plugin? • In any other language than Java? 4
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
    Polyglot Plugins • Why? •How? • Example 1: Scala • Example 2: JRuby • Go and do it! 9
  • 10.
  • 11.
  • 12.
    What to tellthe boss? • Leverage existing knowledge in the team • Libraries/applications already written in language X • Time to market/devspeed • Explore technologies in a sandboxed environment • Grass looks always greener on the other side 12
  • 13.
    What to tellthe boss? • Leverage existing knowledge in the team • Libraries/applications already written in language X • Time to market/devspeed • Explore technologies in a sandboxed environment • Grass looks always greener on the other side 13
  • 14.
  • 15.
    “No time towrite in Java” “Less bugs” “Succinctness” 15
  • 16.
  • 17.
    Polyglot Plugins • Why? •How? • Example 1: Scala • Example 2: JRuby • Go and do it! 17
  • 18.
    • Hybrid language:Object oriented & functional • Concise, statically typed (with type inference) • Higher order/first class functions, pattern matching • Powerful type system • Rich standard library 18
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
    Overview Scala scalac Scala Runtime Library Java Bytecode *.class Java Java Standard Library javac JVM 24
  • 25.
  • 26.
  • 27.
    Build process • Startwith Maven to get the AMPS goodness • Use the maven-scala- plugin • Add SBT if necessary 27
  • 28.
    Build process f. • Compile time is a concern! • FSC • Useful Maven goals: mvn scala:cc mvn scala:console 28
  • 29.
  • 30.
    Size might bea problem :( 30
  • 31.
    Deployment options Option Scope Package Size mvn package Bundle compile -Pbundle 8.5 MB Simple Bundle & Shrink mvn package Deploy compile 680 KB w/ProGuard -Pproduction externally Deploy Install separately provided mvn package 50 KB internally 31
  • 32.
    Simply install usingthe plugin manager! 32
  • 33.
    Development checklist • Dependencies:Scala libraries are jar files and often available from Maven repositories • Compile time: mvn scala:cc for continuous compilation • Workflow: scala:cc & atlas-cli pi or mvn package && atlas-install-plugin • Profit: mvn scala:console to get the Scala REPL 33
  • 34.
  • 35.
    Scala gotchas (the80%) • Collections • Method naming conventions • Annotations • Null vs. Option 35
  • 36.
    Collections • Immutablevs Mutable, serial vs. parallel • Rich API: Prefer Scala collections • Convert between Java and Scala collections when calling Java methods • Solution: JavaConverters (explicit, preferred) vs. JavaConversions (implicit) • Watch out for serialization: Bandana/XStream 36
  • 37.
  • 38.
  • 39.
  • 40.
    Method naming conventions •Libraries rely on bean style naming conventions e.g. XWork, Velocity • Scala: uniform access principle • Solution: Use @BeanProperty and @BooleanBeanProperty 40
  • 41.
  • 42.
  • 43.
  • 44.
    (Meta)-Annotations • How touse @JavaAnnotation on a getter method when defining fields? • Scala meta annotations @beanGetter, @beanGetter, @field, @getter, @setter 44
  • 45.
  • 46.
  • 47.
  • 48.
    Option vs. null • In Scala Option represents an optional value. • Don’t let the billion-dollar mistake leak into your Scala code! • Solution: wrap nullable method calls in an Option 48
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
    Show me the code! 53
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
    Example Scala plugin •Servlet & XWork action • Confluence macro • REST via Jersey/Jackson • Build setup • Use as a starting point https://bitbucket.org/ssaasen/atlassian-scala-example-plugin 61
  • 62.
    Let’s recap •Replace Java entirely with Scala or mix and match • Runtime library: 3 deployment options • Fits into the AMPS development workflow • Scala Gotchas: watch out for common problems • “Scala is a great fit to write Atlassian plugins in” 62
  • 63.
    Agenda • Why? • How? • Example 1: Scala • Example 2: JRuby • Go and do it! 63
  • 64.
    (J)Ruby • Dynamic, object-orientedlanguage • Everything is an object (no “primitives”) • Meta-programming and open, executable classes allow for easy creation of DSLs • JRuby: Ruby runtime written in Java 64
  • 65.
  • 66.
  • 67.
    Overview Ruby Ruby files *.rb Your Ruby Standard RubyGems jrubyc Code Library Ruby Runtime Java Bytecode *.class Java Java Standard Library javac JVM 67
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
    But we canstill use Ruby in a plugin! 72
  • 73.
    Recipe for usingJRuby • Embed the Ruby Runtime • Use Java to execute Ruby scripts and classes • Make components of the host application available • Use the script execution result in Java 73
  • 74.
    Embedding Strategies • javax.scripting- JSR 223 • Apache Bean Scripting Framework (BSF) • JRuby Embed - lower level JRuby API 74
  • 75.
    Embedding Strategies • javax.scripting- JSR 223 Only configurable via system properties :( • Apache Bean scripting framework (BSF) No point in adding a separate API • JRuby Embed - lower level JRuby API 75
  • 76.
  • 77.
    Building the plugin •Package Ruby files • Download and package Ruby gems • Make Ruby gems available on the Ruby LOAD_PATH • Bundle everything into a plugin jar file • A lot of Maven XML :) • Caveat: JRuby runtime is even larger! 77
  • 78.
    Show me the code! 78
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
    Example JRuby plugin •How to use Rubygem based libraries in a plugin • How to access host components in Ruby • How to use the execution result • Sinatra in Confluence ;-) https://bitbucket.org/ssaasen/atlassian-jruby-example-plugin 90
  • 91.
    Let’s recap • Theplugin can’t be written in Ruby! • Use the Ruby runtime • Development workflow bonus: dynamic reloading! • The overhead of adding the runtime and providing Java glue code makes this only feasible for high value use cases :( 91
  • 92.
    Conclusion • Scala isa great alternative when developing an Atlassian plugin • JRuby is powerful, makes developing in a dynamic language possible but requires more work and custom Java adapter code • Java interoperability needs to be well understood in both cases 92
  • 93.
    TAKE-AWAYS “ The power of the Atlassian plugin framework allows you to build your plugins the way you want and ” Java doesn’t have to be the limit. #atlascamp 93
  • 94.
  • 95.
    • “Happy Foods”by swanksalot http://www.flickr.com/photos/swanksalot/5021262869/ • “Construction” by Daniel Morris http://www.flickr.com/photos/danielmorris/275438405/ • “70 80 90” by roujo http://www.flickr.com/photos/tekmagika/437989361 95