Polyglot Plugin Programming

Post on 10-May-2015

1.039 views 0 download

Tags:

Transcript of Polyglot Plugin Programming

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

• 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