Post on 10-May-2015
1
How to write plugins in a language other than Java
Stefan SaasenConfluence Team Lead, Atlassian
Polyglot Plugin Development
2
• Written an Atlassian plugin in Java• Interested in other programming languages• Eager to see what is possible with Atlassian plugins
Audience
3
• Who has actually written a Atlassian plugin?• In any other language than Java?
Show of hands
4
5
6
Rhino
7
8
https://bitbucket.org/ssaasen/atlassian-jruby-example-plugin
https://bitbucket.org/ssaasen/atlassian-scala-example-plugin
• Why?• How?
• Example 1: Scala
• Example 2: JRuby
• Go and do it!
Polyglot Plugins
9
Why not?
10
Why ?
11
• 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
What to tell the boss?
14
15
“Succinctness”
“No time to write in Java”
“Less bugs”
16
• Why?• How?
• Example 1: Scala
• Example 2: JRuby
• Go and do it!
Polyglot Plugins
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
24
Overview
Java
JVM
Java Standard Library
Scala Runtime Library
java
csc
alac
Java Bytecode*.class
Scala
25
26
• Start with Maven to get the AMPS goodness
• Use the maven-scala-plugin
• Add SBT if necessary
Build process
27
• Compile time is a concern!• FSC• Useful Maven goals:
mvn scala:ccmvn scala:console
Build process f.
28
Bundle runtime
29
Size might be a problem :(
30
31
Option Scope Package Size
Bundle
Bundle & Shrink w/ProGuard
Install separately
compile mvn package -Pbundle 8.5 MB Simple
compile mvn package -Pproduction 680 KB Deploy
externally
provided mvn package 50 KB Deploy internally
Deployment options
Simply install using the plugin manager!
32
• 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
Development checklist
Scala: Working with Java APIs
34
• Collections• Method naming conventions• Annotations• Null vs. Option
Scala gotchas (the 80%)
35
• 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
Collections
36
37
38
39
• Libraries rely on bean style naming conventionse.g. XWork, Velocity
• Scala: uniform access principle• Solution: Use @BeanProperty and
@BooleanBeanProperty
Method naming conventions
40
41
42
43
• How to use @JavaAnnotation on a getter method when defining fields?
• Scala meta annotations @beanGetter, @beanGetter, @field, @getter, @setter
(Meta)-Annotations
44
45
46
47
• 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
Option vs. null
48
49
50
51
52
Show me the code!
53
57
58
59
60
• Servlet & XWork action• Confluence macro• REST via Jersey/Jackson• Build setup• Use as a starting point
Example Scala plugin
61
https://bitbucket.org/ssaasen/atlassian-scala-example-plugin
• 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”
Let’s recap
62
• Why?• How?
• Example 1: Scala
• Example 2: JRuby
• Go and do it!
Agenda
63
• 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
(J)Ruby
64
65
How?
66
67
Overview
Java
JVM
Java Standard Library
Ruby Runtime
Ruby Standard Library
RubyGems Your Ruby Code
java
cjr
ubyc
Ruby files *.rb
Java Bytecode*.class
68
69
70
71
Plugins can’t be written in Ruby
72
But we can still use Ruby in a plugin!
• 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
Recipe for using JRuby
• 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
Embedding Strategies
76
• 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
Building the plugin
Show me the code!
78
79
80
81
1 minute
82
83
84
85
86
87
88
89
• 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 ;-)
Example JRuby plugin
90https://bitbucket.org/ssaasen/atlassian-jruby-example-plugin
• 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
Let’s recap
• 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
Conclusion
#atlascamp
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.
“”
93
Thank you!
94
95
• “Happy Foods” by swanksalothttp://www.flickr.com/photos/swanksalot/5021262869/
• “Construction” by Daniel Morrishttp://www.flickr.com/photos/danielmorris/275438405/
• “70 80 90” by roujohttp://www.flickr.com/photos/tekmagika/437989361