Polyglot Alchemy : JSR 223 In Action

1,519 views

Published on

Today your customers want to tailor applications to their specific needs, in terms of both business logic and user interface. In short, they want to inject custom code to transform a mainstream system into a platform as a service (PaaS). To support this vision, Amadeus built an extensibility framework relying on the JVM and JSR 223 to turn its business-critical solutions into a PaaS. Attend this session to hear how it dealt with JSR 223 limitations, why it picked Groovy as its favorite language, and the challenges it faced with sandboxing and hot swap on multitenant systems. The presentation also shares what Amadeus expects from invokedynamic and the coming support of JavaScript on the JVM.

Published in: Technology
1 Comment
0 Likes
Statistics
Notes
  • http://goo.gl/Q9yoaJ 'If you are a website owner then let’s face it – all you need is a best quality references from the pages which contain the most ethical and helpful information of your industry. Yes Search engines love link from the pages which contains quality content and I'll providing the best quality links pointing towards your site. Article submission service is the best to way to generate more and more references which boost your search engine ranking and provide you the unlimited opportunities to mark new sales as it drive the maximum potential costumers towards your site. Articles are the most lethal tool for website promotion, as an ethical campaign it can have extraordinary long term effect in sales. Effective article marketing is an investment in your business!' http://goo.gl/Q9yoaJ
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

No Downloads
Views
Total views
1,519
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
13
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide
  • Amadeus provides transaction processing power and technology solutions to both travel providers (airlines, hotels, rail operators, cruise and ferry operators, car rental, tour operators) and travel agencies (online and offline). A worldwide network connecting travel providers and travel agencies through a highly effective processing platform for the distribution of travel products and services, and as a provider of a comprehensive portfolio of IT solutions which automate mission-critical business processes.
  • We are concerned with two last
  • Struggle to address differentiation and local requirementsWe are concerned with two last[A corporate booking tool deploy in Chile -> Chilean railway]No time, always more pressing demands, leads to adoption issues or misfit with some markets
  • Typical e-Commerce setup, web-server, app-server, database, EIS. Running on iPlanet, Weblogic, Windows, blue part: Linux, in-house
  • We want to have option to change direction.
  • Allows safe timed executions of scripts by adding elapsed time checks on loops (for, while, do), the first statement of closures, and the first statement of methods. This is especially useful when executing foreign scripts that you do not have control over. Inject this transformation into a script that you want to timeout after a specified amount of time. Allows "interrupt-safe" executions of scripts by adding Thread.currentThread().isInterrupted() checks on loops (for, while, do) and first statement of closures. By default, also adds an interrupt check statement on the beginning of method calls.
  • Used annotations coming with groovy 1 to specify at compile time methods maximum execution time transformation add a statement checking the condition as the first statement of for/while/do loops (so one check at the beginning of each iteration) closure/method calls (so one check when entering a user defined method/closure) nothing stops a script doing long I/Os in a procedural script But we can inject this annotation automatically in compiler configuration so it applies to all scripts We even used the transformation // (we could maybe use transformations directly but annotations provide a nicer API than manipulating AST nodes)
  • Simple Json over HTTP, no particular std
  • Distributed CVSDevelop, test and debug locallyDeploy and activateIntegrate automatic provisioning in the deployment processReport on usage in a multi-tenant environmentMain candidate Javascript
  • Distributed CVSDevelop, test and debug locallyDeploy and activateIntegrate automatic provisioning in the deployment processReport on usage in a multi-tenant environmentMain candidate Javascript
  • Distributed CVSDevelop, test and debug locallyDeploy and activateIntegrate automatic provisioning in the deployment processReport on usage in a multi-tenant environmentMain candidate Javascript
  • ThursdayTuesday
  • Polyglot Alchemy : JSR 223 In Action

    1. 1. ©2013AmadeusITGroupSA©2012AmadeusITGroupSA Polyglot alchemy: JSR 223 in action Fabrice Matrat Marc Campora
    2. 2. ©2013AmadeusITGroupSA  Marc Campora  Sr Manager  Java Middleware  mcampora@amadeus.com  @mcampora
    3. 3. ©2013AmadeusITGroupSA  Fabrice Matrat  System Architect  Technical Evangelist  fmatrat@amadeus.com  @fabricematrat
    4. 4. ©2013AmadeusITGroupSA Context & Pb Statement Key design decisions Looking forward & Conclusion
    5. 5. ©2013AmadeusITGroupSA Context & Pb Statement Key design decisions Looking forward & Conclusion
    6. 6. ©2013AmadeusITGroupSA Amadeus  Leading provider of IT solutions for the travel industry  Connect Providers (ex. airlines) and Resellers (ex. TAs)  Provide IT solutions (ex. check-in or inventory system)
    7. 7. ©2013AmadeusITGroupSA System Constraints 3.7M Bookings/day 1.6B Transactions/day 100+ IT changes/day <0.5s Response time 99.99% Availability 600k Terminals
    8. 8. ©2013AmadeusITGroupSA Our products  Inventory  Departure control  Self Booking Tools  Point-of-sale  e-Commerce  Mobile companions
    9. 9. ©2013AmadeusITGroupSA Technical platform  A clear technical strategy  RIA even for the mobile  Community products  SaaS, multi-tenants infrastructure Web-based Common hardware Common code Java, JEE, JavaScript
    10. 10. ©2013AmadeusITGroupSA Problem statement  Community versus specific
    11. 11. ©2013AmadeusITGroupSA From SaaS to PaaS Application logic Middleware & Framework Application UI
    12. 12. ©2013AmadeusITGroupSA From SaaS to PaaS Application logic Middleware & Framework Script execution environment A P I Application UI Custom logic Custom UI Custom UI
    13. 13. ©2013AmadeusITGroupSA Features and ambition Dev. Env. •Distributed version control •Self service loads and fallbacks •Access control and traceability •Life cycle management UI •Custom dialogs •UI extensions API •Call reservation systems •Call any external Web services •Store and retrieve custom data •Send emails •… Runtime •Hotswap •Sandboxing •Isolation •Usage monitoring
    14. 14. ©2013AmadeusITGroupSA Context & Pb Statement Key design decisions Looking forward & Conclusion
    15. 15. ©2013AmadeusITGroupSA JSR 223 Sandbox Integration
    16. 16. ©2013AmadeusITGroupSA Scripting on JVM Application logic Middleware & Framework Script execution environment A P I Application UI Script Script Script
    17. 17. ©2013AmadeusITGroupSA Scripting for Amadeus PaaS PaaS JVM Performance Memory WS Templating Strong Community Dev. Productivity
    18. 18. ©2013AmadeusITGroupSA Language Choice (2010) Language •Java 1.6 •Groovy 1.6 •Jython 2.5 •JRuby 1.4 •Rhino 1.7 Methodology •Popularity •Documentation •Depth-first search •Fibonacci •Templating •WebService
    19. 19. ©2013AmadeusITGroupSA Groovy Java Rhino Groovy JRuby Jython 0 50 100 150 200 250 300 350 400 450 500 0 200 400 600 800 1000 1200 1400 Memory Time
    20. 20. ©2013AmadeusITGroupSA Embed Groovy Binding binding = new Binding(); binding.setVariable("foo", new Integer(2)); GroovyShell shell = new GroovyShell(binding); shell.evaluate("println 'Hello World!'; x = 123; return foo * 10");
    21. 21. ©2013AmadeusITGroupSA Embed Groovy ClassLoader parent = getClass().getClassLoader(); GroovyClassLoader loader = new GroovyClassLoader(parent); File script = new File("HelloWorld.groovy") Class<GroovyObject> groovyClass = loader.parseClass(script); GroovyObject groovyObject = groovyClass.newInstance(); groovyObject.invokeMethod("run", new Object[0]);
    22. 22. ©2013AmadeusITGroupSA Embed Groovy String[] roots = new String[] { "/my/groovy/script/path" }; GroovyScriptEngine gse = new GroovyScriptEngine(roots); Binding binding = new Binding(); binding.setVariable("input", "world"); gse.run("hello.groovy", binding); System.out.println(binding.getVariable("output"));
    23. 23. ©2013AmadeusITGroupSA Groovy Plug to Amadeus PaaS What about JavaScript ?
    24. 24. ©2013AmadeusITGroupSA JSR 223 Standard to embed scripting in JVM Independent from language Part of JDK 6+ One entry point: javax.script
    25. 25. ©2013AmadeusITGroupSA Groovy vs. JSR 223 Binding binding = new Binding(); binding.setVariable("foo", new Integer(2)); GroovyShell shell = new GroovyShell(binding); shell.evaluate("println 'Hello World!'; x = 123; return foo * 10"); ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine= mgr.getEngineByName("groovy"); Bindigs bindings = engine.createBindings(); bindings.put("foo", new Integer(2)); engine.eval("println 'Hello World!'; x = 123; return foo * 10", bindings);
    26. 26. ©2013AmadeusITGroupSA JSR 223 in and out In Out
    27. 27. ©2013AmadeusITGroupSA In Out
    28. 28. ©2013AmadeusITGroupSA Multiple script technology Freemarker Groovy ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName( "groovy"); engine.eval("println 'Hello World!'"); ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName( "freemarker"); engine.eval("Hello ${who}!");
    29. 29. ©2013AmadeusITGroupSA Common API Interface Description ScriptEngine Main wrapper ScriptEngineFactory Factory for ScriptEngine Compilable ScriptEngine which contains methods to compile script Invocable ScriptEngine whose methods allow scripts to be executed. Bindings A mapping of key/value pairs, all of whose keys are Strings. ScriptContext Context Classes Description ScriptEngineManager Discovery and instantiation mechanism for ScriptEngine AbstractScriptEngine Super Class CompiledScript Store results of compilations. SimpleBindings HashMap bindings SimpleScriptContext Simple ScriptContext.
    30. 30. ©2013AmadeusITGroupSA In Out
    31. 31. ©2013AmadeusITGroupSA Availability  800 languages on JVM  Around 60 are maintained  20 have JSR 223 Implementation Language Availability Groovy Yes Scala Yes Jython Yes JRuby Yes Clojure Yes Ceylon No Golo No … ..
    32. 32. ©2013AmadeusITGroupSA Performance  Compilation Result  JSR 223 No Access  Storage Script Compilation Result Script Script Script
    33. 33. ©2013AmadeusITGroupSA  Cache Performance Byte Code Custom classloader Cache
    34. 34. ©2013AmadeusITGroupSA Hot swapping Groovy  Run 2 versions of the same script Passport.groovy got changed Passport.class new code 1110000011 new hash new code 1110000011 new hash Custom classloader
    35. 35. ©2013AmadeusITGroupSA JSR 223 Sandbox Integration
    36. 36. ©2013AmadeusITGroupSA  Script in JVM sharing platform and resources Sandbox
    37. 37. ©2013AmadeusITGroupSA  Bad things can happen  Consume resources (CPU, disk, threads)  Java and Amadeus API is available Sandbox java.lang.System.exit(1)
    38. 38. ©2013AmadeusITGroupSA Access control Compile Runtime
    39. 39. ©2013AmadeusITGroupSA Compile : How ?  Check every node in AST @ compile time org.codehaus.groovy.control.customizers.CompilationCustomizer org.codehaus.groovy.ast.GroovyCodeVisitor
    40. 40. ©2013AmadeusITGroupSA Compile : Design  Deny/Allow/Deny  Blacklist Everything  Whitelist  Blacklist Methods granularity in whitelisted classes java.lang.System java.lang.System.exit java.lang.System.currentTimeMillis
    41. 41. ©2013AmadeusITGroupSA Compile : Implementation class SecureCodeCustomizer extends CompilationCustomizer { public SecureCodeCustomizer() { super(CompilePhase.CANONICALIZATION); } public void call(…) { final ModuleNode ast = source.getAST(); ast.getStatementBlock().visit(new SecureCodeVisitor()); … } } class SecureCodeVisitor implements GroovyCodeVisitor { public void visitMethodCallExpression(MethodCallExpression call) { checkMethodAuthorized(call); … } public void visitStaticMethodCallExpression (…) {…} public void visitClassExpression (…) {…} … }
    42. 42. ©2013AmadeusITGroupSA Access control Compile Runtime
    43. 43. ©2013AmadeusITGroupSA Runtime  Java Security  leverage the JVM's Security Managers  Wrap Primitive/Method  Add Wrapping ((Object)"ls").execute() def obj = ((Object)"ls") // Throw an exception if necessary authorizeStatement(obj, "execute") obj.execute();
    44. 44. ©2013AmadeusITGroupSA Resource Sharing Stability Isolation
    45. 45. ©2013AmadeusITGroupSA Sandbox code (for stability)  Timeout enforcement  Protection against infinite loops and other patterns  Injected @ compile time via AST transformation @groovy.transform.TimedInterrupt( value = 10L, unit = TimeUnit.SECONDS ) def config = new CompilerConfiguration() def customizer = new ASTTransformationCustomizer( [value:10L, unit:TimeUnit.SECONDS], TimedInterrupt) config.addCompilationCustomizers(customizer)
    46. 46. ©2013AmadeusITGroupSA We are not alone  Oracle Application Developer Framework  https://github.com/sjurgemeyer/GR8ConfUS2013/tree/ master/JimDriscoll  Jenkins  http://kohsuke.org/2012/04/27/groovy- secureastcustomizer-is-harmful/  Call to the community for improvement !
    47. 47. ©2013AmadeusITGroupSA Resource Sharing Stability Isolation
    48. 48. ©2013AmadeusITGroupSA Remoting  AST can optimize the Contextual information sent to the Execution Farm. Application farm Scripting farm(s) REST/Json with application context
    49. 49. ©2013AmadeusITGroupSA Remoting  Isolation  SandBox Failure  Memory or IO contentions  No Resources Impact on Main application Farm  Customers or staging isolation  On demand provisioning  Fine grain usage reports  Billing Model
    50. 50. ©2013AmadeusITGroupSA JSR 223 Sandbox Integration
    51. 51. ©2013AmadeusITGroupSA Developer experience Production Preview
    52. 52. ©2013AmadeusITGroupSA Groovy productivity  Java  XML appears as objects  TripPlan<extends XMLNode> tp = TripPlanFactory.tripplan tp.AIR.ITINERARIES.each {itinerary -> Logger.info itinerary.text() }  Untyped language  Actually you have the choice  def unknown = "we’re @ J1 2013"  String message = "we’re @ J1 2013"
    53. 53. ©2013AmadeusITGroupSA A practical case study…
    54. 54. ©2013AmadeusITGroupSA A practical case study…
    55. 55. ©2013AmadeusITGroupSA A practical case study… UI Hook Action Server Placeholder import amadeus.pnr.tripplan // get PNR in-memory representation (a.k.a. TripPlan) def tripplan = TripPlan.getTripPlan() // defining a list of eligible countries def COUNTRY_LIST=["US", "PR", "AS", "VI", "MP", "GU"] // defining a list of eligible carriers def CARRIER_LIST=["UA","AA"] // business condition if one goes to or comes from US, // or if carrier is UA or AA def eligibleTrip = !tripplan.AIR.LIST_ITINERARY.LIST_SEGMENT.findAll { ((it.E_LOCATION.COUNTRY_CODE in COUNTRY_LIST) || (it.B_LOCATION.COUNTRY_CODE in COUNTRY_LIST)) || (it.AIRLINE.CODE in CARRIER_LIST) }.isEmpty() // if trip eligible, trigger the UI enrichment bean.with { if (eligibleTrip) { // the id of the product UI placeholder in which to display. placeholder = "customTSAPlaceholder" // the script to be called during the next step to // process the user inputs. actionId = "CustomTSAProcess" } } {Template} {macro init()} <div style="padding-left: 20px;"> {@aria:TextField { label: 'Maiden name', labelWidth: 210, block: true, bind: to("pspt") } /} {@aria:TextField { label: 'Redress number', block: true, labelWidth: 210, bind: to("redn") } /} {@aria:TextField { label: 'Known traveler id', block: true, labelWidth: 210, bind: to("knwt") } /} </div> {/macro} {/Template}
    56. 56. ©2013AmadeusITGroupSA A practical case study…
    57. 57. ©2013AmadeusITGroupSA Context & Pb Statement Key design decisions Looking forward & Conclusion
    58. 58. ©2013AmadeusITGroupSA Remaining challenges  A productive development environment
    59. 59. ©2013AmadeusITGroupSA Remaining challenges  A productive development environment  Success leads to Elasticity
    60. 60. ©2013AmadeusITGroupSA Remaining challenges  A productive development environment  Success leads to Elasticity  Add new languages to enlarge the user base
    61. 61. ©2013AmadeusITGroupSA Take home messages  Groovy is great to customize applications  The JVM and JSR223 give you access to other languages  Sandboxing and isolation are a must  Unfortunately sandboxing and isolation are specific to the language
    62. 62. ©2013AmadeusITGroupSA Some more… Special thanks to the team! UI produced using AriaTemplates ™ (github.com/ariatemplates) To know more about Amadeus: http://www.amadeus.com JavaOne  Polyglot Enterprise Development on the JVM [CON2382] Mark Little – VP Red Hat Inc  The JVM Is Over: The Polyglot Virtual Machine Is Here [CON5344] Marcus Lagergren - Runtime Futurist, Oracle  Liftoff with Groovy 2.1 [CON2591] Guillaume Laforge - Pivotal  Embedded DSL: Groovy and Scala Fair Duel [TUT4524] Corinne Krych - RedHat and Pascal Cohen - Amadeus
    63. 63. ©2013AmadeusITGroupSA Q&A

    ×