SlideShare a Scribd company logo
Introducing Scala




Developing a new Scala DSL
     for Apache Camel
Goals
●
    Goals
    –   Introduce a few basic concepts/syntax of Scala
    –   How to use these Scala techniques for building a
        Scala DSL (using Apache Camel as an example)
Planning
●
    Introduction
●
    Scala for DSL building
    –   Implicit conversion
    –   Passing functions as parameters
    –   By-name parameters and currying
    –   Caveats
●
    Scala tooling
    –   Maven plugin
    –   Eclipse plugin
Planning
●
    Introduction
●
    Scala for DSL building
    –   Implicit conversion
    –   Passing functions as parameters
    –   By-name parameters and currying
    –   Caveats
●
    Scala tooling
    –   Maven plugin
    –   Eclipse plugin
Introduction
●
    Who am I?
    –   Gert Vanthienen (gert@anova.be)
    –   Independent consultant
         ●
             Open-source (Java/J2EE) technology
         ●
             Legacy integration (System i aka AS/400)
    –   Open-source
         ●
             Apache ServiceMix committer / PMC member
         ●
             Contributor to Apache Camel
Introduction
●
    What is Apache Camel?
    –   Spring-based Integration Framework
    –   Implements enterprise integration patterns
    –   Configured through
         ●
             Java DSL (fluent API)
         ●
             Spring XML configuration file
    –   URIs to work with other transports/protocols
    –   Routing/mediation for ServiceMix, ActiveMQ, CXF, ...
    –   Check out Bruce Snyder's presentation on Friday!!
Introduction
●
    Just a small example of the Java DSL



public class FleetRouteBuilder extends RouteBuilder {

    public void configure() throws Exception {
      from("ftp://server.local:10021/traces/out")
        .to("ftp://server.remote/folder/to/upload")
        .splitter(xpath("/traces/trace"))
        .to("activemq:MY.TRACE.QUEUE")
        .filter(xpath("/trace/@type == 'XYZ'"))
          .to("wmq:QLIN.TRACE.QUEUE");
    }

}
Introduction
●
    What is Scala?
    –   Sca(lable) la(nguage)
    –   Multi-paradigm:
         ●
             Object-oriented: classes, polymorphism, inheritance, ..
         ●
             Functional: function = value, pattern matching, ...
    –   Static typing, using type inference
    –   Interoperates with JRE (and .NET CLR)
         ●
             Scala code compiles into Java bytecode
         ●
             You can call Java code from Scala (and vica versa)
Introduction
●
    A simple Scala class example

    class Person(name: String, age: Int) {

        def eat(food: String) {
          println("Eating " + food + " now")
        }

        def isToddler = age > 0 && age < 3

        override def toString() = "Person[" + name + "]"

    }
Planning
●
    Introduction
●
    Scala language
    –   Implicit conversion
    –   Passing functions as parameters
    –   By-name parameters and currying
    –   Caveats
●
    Scala tooling
    –   Maven plugin
    –   Eclipse plugin
Simple route example
●
    Example of the simplest route possible in Java
    Just receive a message and forward it

    public class MyRouteBuilder extends RouteBuilder {

        public void configure() throws Exception {
          from("direct:a").to("mock:a");
          from("direct:b").to("mock:b");
        }

    }
Simple route example
●
    In the Scala DSL it looks like this...
        class MyRouteBuilder extends RouteBuilder {

            "direct:a" to "mock:a"
            "direct:b" --> "mock:b"

        }

●
    ... using these language features
    –   constructor statements go in the class body
    –   no need for parentheses, dots and semicolons
    –   an operator is implemented like any other method
    –   implicit conversion
Implicit conversion
●
        Strings like “direct:a” and “direct:b” don't have the
        necessary methods (→ and to)
●
        String is final so it can't be subclassed
●
        Using implicit conversion to 'add' the missing
        methods

    class RouteBuilder {

        implicit def stringToUri(uri:String) =
                                        new RichUriString(uri, this)

    }
Implicit conversion
●
        Let's look at the RichUriString
        –   Primary constructor is in class declaration
        –   Defines two methods (return type inference)



    class RichUriString(uri:String, builder:RouteBuilder) {

        def to(target: String) = builder.from(uri).to(target)
        def -->(target: String) = to(target)

    }
Implicit conversion
●
        The full Scala RouteBuilder class

    package org.apache.camel.scala.dsl

    class RouteBuilder {

        val builder = new org.apache.camel.builder.RouteBuilder() {
          override def configure() = {}
        }

        def from(uri: String) = builder.from(uri)

        implicit def stringToUri(uri:String) =
                                        new RichUriString(uri, this)

    }
Implicit conversion
●
    There are a few subtle rules that can bite you when
    using implicit conversion
    –   marking rule
    –   scope rule
    –   explicits-first rule
    –   one-at-a-time rule
    –   non-ambiguity rule
        Example: filter method on ProcessorType/RichString
Filter route example
●
    Java DSL filter looks like this

    public class MyRouteBuilder extends RouteBuilder {

        public void configure() throws Exception {
          from("direct:a").
            filter(body().isEqualTo("<hello/>")).to("mock:a");
        }

    }
Filter route example
●
    In the Scala DSL

    class FilterRouteBuilder extends RouteBuilder {

        "direct:a" when(_.in == "<hello/>") to "mock:a"

    }


●
    Scala language features
        –   passing functions as parameters
        –   equals() in Java becomes == in Scala
Passing functions as parameters
●
        Scala is a functional language
        –   functions are variables
        –   you can pass functions as method parameters
●
        Let's pass a function to the when() method

    class RichUriString(uri: String, builder: RouteBuilder) {

        def when(test: Exchange => Boolean) =
          builder.from(uri).filter(new WhenPredicate(test))


    }
Passing functions as parameters
●
        Predicate<E> is an interface in the Camel API
        –   WhenPredicate is a Scala class that implements it
        –   Use the function with an Exchange to evaluate


    package org.apache.camel.scala.dsl

    class WhenPredicate(function: Exchange => Boolean)
                                       extends Predicate[Exchange]{

        override def matches(exchange: Exchange) = function(exchange)

        //assertMatches is also here

    }
Passing functions as parameters
●
    Passing a function literal in the RouteBuilder
class FilterRouteBuilder extends RouteBuilder {

    "direct:a" when(
      (exchange:Exchange) => exchange.in == "<hello/>"
                                           ) to "mock:a"

}

●
    Shorthand notation
     –   with parameter type inference...
           exchange => exchange.in == "<hello/>"
     –   and placeholders
           _.in == "<hello/>"
CBR example
●
    Java DSL for a simple content-based router

public class MyRouteBuilder extends RouteBuilder {

    public void configure() throws Exception {
      from("direct:a")
        .to("mock:polyglot")
        .choice()
          .when(body().isEqualTo("<hallo/>"))
            .to("mock:dutch")
            .to("mock:german");
          .when(body().isEqualTo("<hello/>")).to("mock:english")
          .otherwise().to("mock:french");

    }

}
CBR example
●
    Scala DSL adds code blocks for supporting more
    advanced route definitions
class CBRRouteBuilder extends RouteBuilder {

    "direct:a" ==> {
      to ("mock:polyglot")
      choice {
        when (_.in == "<hello/>") to ("mock:english")
        when (_.in == "<hallo/>") {
          to ("mock:dutch")
          to ("mock:german")
        }
        otherwise to ("mock:french")
      }
    }

}
By-name parameters and currying
●
        By-name parameters allow you to just pass a block
         of code that takes no parameters


    class RouteBuilder {

        //instead of : def choice(block: () => Unit)
        def choice(block: => Unit) = {
          //just execute the block (no parentheses)
          block
        }

    }
By-name parameters and currying
●
        Currying allows you to use a method that takes
        multiple arguments lists


    class RouteBuilder {

        //snip

        def when(test: Exchange => Boolean)(block: => Unit) = {
          val when = choice.when(new WhenPredicate(test))
          build(when, block)
        }

    }
Caveats
●
    Interaction between Java and Scala generics
●
    Java varargs versus Scala repeated parameters
●
    Operator precedence
Operator precedence
●
    Scala allows you to override operators or declare
    symbol named methods
        –   precedence is determined on the first character

    class SimpleRouteBuilder extends RouteBuilder {

        //these are all the same
        "direct:a" to "mock:a1" to "mock:a2"
        "direct:b" --> "mock:b1" --> "mock:b2"
        "direct:c" --> "mock:c1" to "mock:c2"

        //but this is something entirely different
        "direct:d" to "mock:d1" --> "mock:d2"

    }
Java/Scala generics
●
     Most of the times, you can simply replace <> by []
●
     A Java type defined as...
    public class ProcessorType<Type extends ProcessorType> {}


●
     In Java, you can also declare the raw type ...
     (you'll only get compiler warnings)
●
     ... but in Scala this doesn't work. The solution is
     this (ugly-looking) syntax (existential type).
    implicit def processorWrapper(
                 processor: ProcessorType[T] forSome {type T}) =
                                      new RichProcessor(processor)
Varargs/repeated parameters
●
    Java varargs...
     public Type to(String... uri) {
        //does some work
     }
●
    ... are like Scala repeated parameters
     def to(uris: String*) = //implementation goes here


●
    Caveats:
     def to(uris: String*) = {
       val processor = builder.from(uri)
       processor.to(uris.toArray[String])
     }

     def -->(uris: String*) = to(uris:_*)
Other language features
●
    What else is there?
    –   traits and mixins
    –   pattern matching
    –   partially applied functions
    –   apply() and unapply()
    –   language support for XML
        XML literals, pattern matching for XML, ...
    –   actors
    –   annotation support
    –   ...
Planning
●
    Introduction
●
    Scala for DSL building
    –   Implicit conversion
    –   Passing functions as parameters
    –   By-name parameters and currying
    –   Caveats
●
    Scala tooling
    –   Maven plugin
    –   Eclipse plugin
Scala Maven plugin
●
    Integrate Scala in your current Maven build
    –   http://scala-tools.org/mvnsites/maven-scala-plugin/
    –   specify repository and plugin
    –   also need to specify source/test folders
●
    Other features
    –   continuous compilation (scala:cc)
    –   scaladoc generation (scala:doc)
    –   scala interactive console (scala:console)
Scala Eclipse plugin
●
    Scala plugin for Eclipse
    http://www.scala-lang.org/tools/eclipse/
    –   Scala development perspective
    –   Syntax highlighting and formatting
    –   Wizards for classes, traits, objects, ...
●
    But...
    –   If you have problems, resort to manual building
        (Ctrl-B)
    –   Occasionally, you may have to clean your project to
        get up-to-date compile messages
Scala Eclipse plugin
●
    Configuring Maven Eclipse plugin to generate Scala
    project descriptors
    –   add a nature:
        ch.epfl.lamp.sdt.core.scalanature
    –   add a builder:
        ch.epfl.lamp.sdt.core.scalabuilder
    –   add a build classpath container:
        ch.epfl.lamp.sdt.launching.SCALA_CONTAINER
Thanks for attending...




   Questions? Remarks?
Ad

More Related Content

What's hot (19)

Java bytecode and classes
Java bytecode and classesJava bytecode and classes
Java bytecode and classes
yoavwix
 
Invoke dynamics
Invoke dynamicsInvoke dynamics
Invoke dynamics
Balamurugan Soundararajan
 
Multithreading in java
Multithreading in javaMultithreading in java
Multithreading in java
Raghu nath
 
Playing with Java Classes and Bytecode
Playing with Java Classes and BytecodePlaying with Java Classes and Bytecode
Playing with Java Classes and Bytecode
Yoav Avrahami
 
Java programming basics
Java programming basicsJava programming basics
Java programming basics
Hamid Ghorbani
 
Clojure - An Introduction for Java Programmers
Clojure - An Introduction for Java ProgrammersClojure - An Introduction for Java Programmers
Clojure - An Introduction for Java Programmers
elliando dias
 
Concurrency in Java
Concurrency in  JavaConcurrency in  Java
Concurrency in Java
Allan Huang
 
Method Handles in Java
Method Handles in JavaMethod Handles in Java
Method Handles in Java
hendersk
 
Java Threads
Java ThreadsJava Threads
Java Threads
Hamid Ghorbani
 
02 basic java programming and operators
02 basic java programming and operators02 basic java programming and operators
02 basic java programming and operators
Danairat Thanabodithammachari
 
Core java
Core javaCore java
Core java
Savita Rawat
 
JAVA BYTE CODE
JAVA BYTE CODEJAVA BYTE CODE
JAVA BYTE CODE
Javed Ahmed Samo
 
Objective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central DispatchObjective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central Dispatch
Matteo Battaglio
 
Modern Java Concurrency
Modern Java ConcurrencyModern Java Concurrency
Modern Java Concurrency
Ben Evans
 
A Brief, but Dense, Intro to Scala
A Brief, but Dense, Intro to ScalaA Brief, but Dense, Intro to Scala
A Brief, but Dense, Intro to Scala
Derek Chen-Becker
 
Java Basics
Java BasicsJava Basics
Java Basics
shivamgarg_nitj
 
Java byte code & virtual machine
Java byte code & virtual machineJava byte code & virtual machine
Java byte code & virtual machine
Laxman Puri
 
Java basic
Java basicJava basic
Java basic
Arati Gadgil
 
Clojure A Dynamic Programming Language for the JVM
Clojure A Dynamic Programming Language for the JVMClojure A Dynamic Programming Language for the JVM
Clojure A Dynamic Programming Language for the JVM
elliando dias
 
Java bytecode and classes
Java bytecode and classesJava bytecode and classes
Java bytecode and classes
yoavwix
 
Multithreading in java
Multithreading in javaMultithreading in java
Multithreading in java
Raghu nath
 
Playing with Java Classes and Bytecode
Playing with Java Classes and BytecodePlaying with Java Classes and Bytecode
Playing with Java Classes and Bytecode
Yoav Avrahami
 
Java programming basics
Java programming basicsJava programming basics
Java programming basics
Hamid Ghorbani
 
Clojure - An Introduction for Java Programmers
Clojure - An Introduction for Java ProgrammersClojure - An Introduction for Java Programmers
Clojure - An Introduction for Java Programmers
elliando dias
 
Concurrency in Java
Concurrency in  JavaConcurrency in  Java
Concurrency in Java
Allan Huang
 
Method Handles in Java
Method Handles in JavaMethod Handles in Java
Method Handles in Java
hendersk
 
Objective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central DispatchObjective-C Blocks and Grand Central Dispatch
Objective-C Blocks and Grand Central Dispatch
Matteo Battaglio
 
Modern Java Concurrency
Modern Java ConcurrencyModern Java Concurrency
Modern Java Concurrency
Ben Evans
 
A Brief, but Dense, Intro to Scala
A Brief, but Dense, Intro to ScalaA Brief, but Dense, Intro to Scala
A Brief, but Dense, Intro to Scala
Derek Chen-Becker
 
Java byte code & virtual machine
Java byte code & virtual machineJava byte code & virtual machine
Java byte code & virtual machine
Laxman Puri
 
Clojure A Dynamic Programming Language for the JVM
Clojure A Dynamic Programming Language for the JVMClojure A Dynamic Programming Language for the JVM
Clojure A Dynamic Programming Language for the JVM
elliando dias
 

Viewers also liked (8)

BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfstateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
Hiroshi Ono
 
Presentatie lc vrc bu2013 v2
Presentatie lc vrc bu2013 v2Presentatie lc vrc bu2013 v2
Presentatie lc vrc bu2013 v2
Gerd Sette
 
program_draft3.pdf
program_draft3.pdfprogram_draft3.pdf
program_draft3.pdf
Hiroshi Ono
 
Canonical and robotos (2)
Canonical and robotos (2)Canonical and robotos (2)
Canonical and robotos (2)
panchaloha
 
SACSIS2009_TCP.pdf
SACSIS2009_TCP.pdfSACSIS2009_TCP.pdf
SACSIS2009_TCP.pdf
Hiroshi Ono
 
Robots and-sitemap - Version 1.0.1
Robots and-sitemap - Version 1.0.1Robots and-sitemap - Version 1.0.1
Robots and-sitemap - Version 1.0.1
Naji El Kotob
 
Voltdb - wikipedia
Voltdb - wikipediaVoltdb - wikipedia
Voltdb - wikipedia
Hiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfstateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
Hiroshi Ono
 
Presentatie lc vrc bu2013 v2
Presentatie lc vrc bu2013 v2Presentatie lc vrc bu2013 v2
Presentatie lc vrc bu2013 v2
Gerd Sette
 
program_draft3.pdf
program_draft3.pdfprogram_draft3.pdf
program_draft3.pdf
Hiroshi Ono
 
Canonical and robotos (2)
Canonical and robotos (2)Canonical and robotos (2)
Canonical and robotos (2)
panchaloha
 
SACSIS2009_TCP.pdf
SACSIS2009_TCP.pdfSACSIS2009_TCP.pdf
SACSIS2009_TCP.pdf
Hiroshi Ono
 
Robots and-sitemap - Version 1.0.1
Robots and-sitemap - Version 1.0.1Robots and-sitemap - Version 1.0.1
Robots and-sitemap - Version 1.0.1
Naji El Kotob
 
Voltdb - wikipedia
Voltdb - wikipediaVoltdb - wikipedia
Voltdb - wikipedia
Hiroshi Ono
 
Ad

Similar to camel-scala.pdf (20)

BCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java DevelopersBCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java Developers
Miles Sabin
 
An Introduction to Scala for Java Developers
An Introduction to Scala for Java DevelopersAn Introduction to Scala for Java Developers
An Introduction to Scala for Java Developers
Miles Sabin
 
Angular for Java Enterprise Developers: Oracle Code One 2018
Angular for Java Enterprise Developers: Oracle Code One 2018Angular for Java Enterprise Developers: Oracle Code One 2018
Angular for Java Enterprise Developers: Oracle Code One 2018
Loiane Groner
 
Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play framework
Felipe
 
Spring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard WolffSpring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard Wolff
JAX London
 
Scala and Spring
Scala and SpringScala and Spring
Scala and Spring
Eberhard Wolff
 
java: basics, user input, data type, constructor
java:  basics, user input, data type, constructorjava:  basics, user input, data type, constructor
java: basics, user input, data type, constructor
Shivam Singhal
 
Qcon2011 functions rockpresentation_scala
Qcon2011 functions rockpresentation_scalaQcon2011 functions rockpresentation_scala
Qcon2011 functions rockpresentation_scala
Michael Stal
 
Scala for Java Programmers
Scala for Java ProgrammersScala for Java Programmers
Scala for Java Programmers
Eric Pederson
 
Scala.IO 2024: Mill builds in Scala 3, a migration story
Scala.IO 2024: Mill builds in Scala 3, a migration storyScala.IO 2024: Mill builds in Scala 3, a migration story
Scala.IO 2024: Mill builds in Scala 3, a migration story
James Thompson
 
OpenDaylight and YANG
OpenDaylight and YANGOpenDaylight and YANG
OpenDaylight and YANG
CoreStack
 
Jacarashed-1746968053-300050282-Java.ppt
Jacarashed-1746968053-300050282-Java.pptJacarashed-1746968053-300050282-Java.ppt
Jacarashed-1746968053-300050282-Java.ppt
DilipDas70
 
Railroading into Scala
Railroading into ScalaRailroading into Scala
Railroading into Scala
Nehal Shah
 
A Brief Introduction to Scala for Java Developers
A Brief Introduction to Scala for Java DevelopersA Brief Introduction to Scala for Java Developers
A Brief Introduction to Scala for Java Developers
Miles Sabin
 
Miles Sabin Introduction To Scala For Java Developers
Miles Sabin Introduction To Scala For Java DevelopersMiles Sabin Introduction To Scala For Java Developers
Miles Sabin Introduction To Scala For Java Developers
Skills Matter
 
Introduction to Scala | Big Data Hadoop Spark Tutorial | CloudxLab
Introduction to Scala | Big Data Hadoop Spark Tutorial | CloudxLabIntroduction to Scala | Big Data Hadoop Spark Tutorial | CloudxLab
Introduction to Scala | Big Data Hadoop Spark Tutorial | CloudxLab
CloudxLab
 
Java
JavaJava
Java
javeed_mhd
 
Java basic tutorial
Java basic tutorialJava basic tutorial
Java basic tutorial
Bui Kiet
 
Java basic
Java basicJava basic
Java basic
Sonam Sharma
 
Java Basics
Java BasicsJava Basics
Java Basics
Rajkattamuri
 
BCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java DevelopersBCS SPA 2010 - An Introduction to Scala for Java Developers
BCS SPA 2010 - An Introduction to Scala for Java Developers
Miles Sabin
 
An Introduction to Scala for Java Developers
An Introduction to Scala for Java DevelopersAn Introduction to Scala for Java Developers
An Introduction to Scala for Java Developers
Miles Sabin
 
Angular for Java Enterprise Developers: Oracle Code One 2018
Angular for Java Enterprise Developers: Oracle Code One 2018Angular for Java Enterprise Developers: Oracle Code One 2018
Angular for Java Enterprise Developers: Oracle Code One 2018
Loiane Groner
 
Short intro to scala and the play framework
Short intro to scala and the play frameworkShort intro to scala and the play framework
Short intro to scala and the play framework
Felipe
 
Spring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard WolffSpring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard Wolff
JAX London
 
java: basics, user input, data type, constructor
java:  basics, user input, data type, constructorjava:  basics, user input, data type, constructor
java: basics, user input, data type, constructor
Shivam Singhal
 
Qcon2011 functions rockpresentation_scala
Qcon2011 functions rockpresentation_scalaQcon2011 functions rockpresentation_scala
Qcon2011 functions rockpresentation_scala
Michael Stal
 
Scala for Java Programmers
Scala for Java ProgrammersScala for Java Programmers
Scala for Java Programmers
Eric Pederson
 
Scala.IO 2024: Mill builds in Scala 3, a migration story
Scala.IO 2024: Mill builds in Scala 3, a migration storyScala.IO 2024: Mill builds in Scala 3, a migration story
Scala.IO 2024: Mill builds in Scala 3, a migration story
James Thompson
 
OpenDaylight and YANG
OpenDaylight and YANGOpenDaylight and YANG
OpenDaylight and YANG
CoreStack
 
Jacarashed-1746968053-300050282-Java.ppt
Jacarashed-1746968053-300050282-Java.pptJacarashed-1746968053-300050282-Java.ppt
Jacarashed-1746968053-300050282-Java.ppt
DilipDas70
 
Railroading into Scala
Railroading into ScalaRailroading into Scala
Railroading into Scala
Nehal Shah
 
A Brief Introduction to Scala for Java Developers
A Brief Introduction to Scala for Java DevelopersA Brief Introduction to Scala for Java Developers
A Brief Introduction to Scala for Java Developers
Miles Sabin
 
Miles Sabin Introduction To Scala For Java Developers
Miles Sabin Introduction To Scala For Java DevelopersMiles Sabin Introduction To Scala For Java Developers
Miles Sabin Introduction To Scala For Java Developers
Skills Matter
 
Introduction to Scala | Big Data Hadoop Spark Tutorial | CloudxLab
Introduction to Scala | Big Data Hadoop Spark Tutorial | CloudxLabIntroduction to Scala | Big Data Hadoop Spark Tutorial | CloudxLab
Introduction to Scala | Big Data Hadoop Spark Tutorial | CloudxLab
CloudxLab
 
Java basic tutorial
Java basic tutorialJava basic tutorial
Java basic tutorial
Bui Kiet
 
Ad

More from Hiroshi Ono (20)

Gamecenter概説
Gamecenter概説Gamecenter概説
Gamecenter概説
Hiroshi Ono
 
EventDrivenArchitecture
EventDrivenArchitectureEventDrivenArchitecture
EventDrivenArchitecture
Hiroshi Ono
 
program_draft3.pdf
program_draft3.pdfprogram_draft3.pdf
program_draft3.pdf
Hiroshi Ono
 
nodalities_issue7.pdf
nodalities_issue7.pdfnodalities_issue7.pdf
nodalities_issue7.pdf
Hiroshi Ono
 
genpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdfgenpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdf
Hiroshi Ono
 
kademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfkademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
downey08semaphores.pdf
downey08semaphores.pdfdowney08semaphores.pdf
downey08semaphores.pdf
Hiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
TwitterOct2008.pdf
TwitterOct2008.pdfTwitterOct2008.pdf
TwitterOct2008.pdf
Hiroshi Ono
 
camel-scala.pdf
camel-scala.pdfcamel-scala.pdf
camel-scala.pdf
Hiroshi Ono
 
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfstateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfstateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
Hiroshi Ono
 
nodalities_issue7.pdf
nodalities_issue7.pdfnodalities_issue7.pdf
nodalities_issue7.pdf
Hiroshi Ono
 
genpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdfgenpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdf
Hiroshi Ono
 
kademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfkademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
downey08semaphores.pdf
downey08semaphores.pdfdowney08semaphores.pdf
downey08semaphores.pdf
Hiroshi Ono
 
TwitterOct2008.pdf
TwitterOct2008.pdfTwitterOct2008.pdf
TwitterOct2008.pdf
Hiroshi Ono
 
Gamecenter概説
Gamecenter概説Gamecenter概説
Gamecenter概説
Hiroshi Ono
 
EventDrivenArchitecture
EventDrivenArchitectureEventDrivenArchitecture
EventDrivenArchitecture
Hiroshi Ono
 
program_draft3.pdf
program_draft3.pdfprogram_draft3.pdf
program_draft3.pdf
Hiroshi Ono
 
nodalities_issue7.pdf
nodalities_issue7.pdfnodalities_issue7.pdf
nodalities_issue7.pdf
Hiroshi Ono
 
genpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdfgenpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdf
Hiroshi Ono
 
kademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfkademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
downey08semaphores.pdf
downey08semaphores.pdfdowney08semaphores.pdf
downey08semaphores.pdf
Hiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
 
TwitterOct2008.pdf
TwitterOct2008.pdfTwitterOct2008.pdf
TwitterOct2008.pdf
Hiroshi Ono
 
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfstateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
Hiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
Hiroshi Ono
 
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfstateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
Hiroshi Ono
 
nodalities_issue7.pdf
nodalities_issue7.pdfnodalities_issue7.pdf
nodalities_issue7.pdf
Hiroshi Ono
 
genpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdfgenpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdf
Hiroshi Ono
 
kademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfkademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdf
Hiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Hiroshi Ono
 
downey08semaphores.pdf
downey08semaphores.pdfdowney08semaphores.pdf
downey08semaphores.pdf
Hiroshi Ono
 
TwitterOct2008.pdf
TwitterOct2008.pdfTwitterOct2008.pdf
TwitterOct2008.pdf
Hiroshi Ono
 

camel-scala.pdf

  • 1. Introducing Scala Developing a new Scala DSL for Apache Camel
  • 2. Goals ● Goals – Introduce a few basic concepts/syntax of Scala – How to use these Scala techniques for building a Scala DSL (using Apache Camel as an example)
  • 3. Planning ● Introduction ● Scala for DSL building – Implicit conversion – Passing functions as parameters – By-name parameters and currying – Caveats ● Scala tooling – Maven plugin – Eclipse plugin
  • 4. Planning ● Introduction ● Scala for DSL building – Implicit conversion – Passing functions as parameters – By-name parameters and currying – Caveats ● Scala tooling – Maven plugin – Eclipse plugin
  • 5. Introduction ● Who am I? – Gert Vanthienen ([email protected]) – Independent consultant ● Open-source (Java/J2EE) technology ● Legacy integration (System i aka AS/400) – Open-source ● Apache ServiceMix committer / PMC member ● Contributor to Apache Camel
  • 6. Introduction ● What is Apache Camel? – Spring-based Integration Framework – Implements enterprise integration patterns – Configured through ● Java DSL (fluent API) ● Spring XML configuration file – URIs to work with other transports/protocols – Routing/mediation for ServiceMix, ActiveMQ, CXF, ... – Check out Bruce Snyder's presentation on Friday!!
  • 7. Introduction ● Just a small example of the Java DSL public class FleetRouteBuilder extends RouteBuilder { public void configure() throws Exception { from("ftp://server.local:10021/traces/out") .to("ftp://server.remote/folder/to/upload") .splitter(xpath("/traces/trace")) .to("activemq:MY.TRACE.QUEUE") .filter(xpath("/trace/@type == 'XYZ'")) .to("wmq:QLIN.TRACE.QUEUE"); } }
  • 8. Introduction ● What is Scala? – Sca(lable) la(nguage) – Multi-paradigm: ● Object-oriented: classes, polymorphism, inheritance, .. ● Functional: function = value, pattern matching, ... – Static typing, using type inference – Interoperates with JRE (and .NET CLR) ● Scala code compiles into Java bytecode ● You can call Java code from Scala (and vica versa)
  • 9. Introduction ● A simple Scala class example class Person(name: String, age: Int) { def eat(food: String) { println("Eating " + food + " now") } def isToddler = age > 0 && age < 3 override def toString() = "Person[" + name + "]" }
  • 10. Planning ● Introduction ● Scala language – Implicit conversion – Passing functions as parameters – By-name parameters and currying – Caveats ● Scala tooling – Maven plugin – Eclipse plugin
  • 11. Simple route example ● Example of the simplest route possible in Java Just receive a message and forward it public class MyRouteBuilder extends RouteBuilder { public void configure() throws Exception { from("direct:a").to("mock:a"); from("direct:b").to("mock:b"); } }
  • 12. Simple route example ● In the Scala DSL it looks like this... class MyRouteBuilder extends RouteBuilder { "direct:a" to "mock:a" "direct:b" --> "mock:b" } ● ... using these language features – constructor statements go in the class body – no need for parentheses, dots and semicolons – an operator is implemented like any other method – implicit conversion
  • 13. Implicit conversion ● Strings like “direct:a” and “direct:b” don't have the necessary methods (→ and to) ● String is final so it can't be subclassed ● Using implicit conversion to 'add' the missing methods class RouteBuilder { implicit def stringToUri(uri:String) = new RichUriString(uri, this) }
  • 14. Implicit conversion ● Let's look at the RichUriString – Primary constructor is in class declaration – Defines two methods (return type inference) class RichUriString(uri:String, builder:RouteBuilder) { def to(target: String) = builder.from(uri).to(target) def -->(target: String) = to(target) }
  • 15. Implicit conversion ● The full Scala RouteBuilder class package org.apache.camel.scala.dsl class RouteBuilder { val builder = new org.apache.camel.builder.RouteBuilder() { override def configure() = {} } def from(uri: String) = builder.from(uri) implicit def stringToUri(uri:String) = new RichUriString(uri, this) }
  • 16. Implicit conversion ● There are a few subtle rules that can bite you when using implicit conversion – marking rule – scope rule – explicits-first rule – one-at-a-time rule – non-ambiguity rule Example: filter method on ProcessorType/RichString
  • 17. Filter route example ● Java DSL filter looks like this public class MyRouteBuilder extends RouteBuilder { public void configure() throws Exception { from("direct:a"). filter(body().isEqualTo("<hello/>")).to("mock:a"); } }
  • 18. Filter route example ● In the Scala DSL class FilterRouteBuilder extends RouteBuilder { "direct:a" when(_.in == "<hello/>") to "mock:a" } ● Scala language features – passing functions as parameters – equals() in Java becomes == in Scala
  • 19. Passing functions as parameters ● Scala is a functional language – functions are variables – you can pass functions as method parameters ● Let's pass a function to the when() method class RichUriString(uri: String, builder: RouteBuilder) { def when(test: Exchange => Boolean) = builder.from(uri).filter(new WhenPredicate(test)) }
  • 20. Passing functions as parameters ● Predicate<E> is an interface in the Camel API – WhenPredicate is a Scala class that implements it – Use the function with an Exchange to evaluate package org.apache.camel.scala.dsl class WhenPredicate(function: Exchange => Boolean) extends Predicate[Exchange]{ override def matches(exchange: Exchange) = function(exchange) //assertMatches is also here }
  • 21. Passing functions as parameters ● Passing a function literal in the RouteBuilder class FilterRouteBuilder extends RouteBuilder { "direct:a" when( (exchange:Exchange) => exchange.in == "<hello/>" ) to "mock:a" } ● Shorthand notation – with parameter type inference... exchange => exchange.in == "<hello/>" – and placeholders _.in == "<hello/>"
  • 22. CBR example ● Java DSL for a simple content-based router public class MyRouteBuilder extends RouteBuilder { public void configure() throws Exception { from("direct:a") .to("mock:polyglot") .choice() .when(body().isEqualTo("<hallo/>")) .to("mock:dutch") .to("mock:german"); .when(body().isEqualTo("<hello/>")).to("mock:english") .otherwise().to("mock:french"); } }
  • 23. CBR example ● Scala DSL adds code blocks for supporting more advanced route definitions class CBRRouteBuilder extends RouteBuilder { "direct:a" ==> { to ("mock:polyglot") choice { when (_.in == "<hello/>") to ("mock:english") when (_.in == "<hallo/>") { to ("mock:dutch") to ("mock:german") } otherwise to ("mock:french") } } }
  • 24. By-name parameters and currying ● By-name parameters allow you to just pass a block of code that takes no parameters class RouteBuilder { //instead of : def choice(block: () => Unit) def choice(block: => Unit) = { //just execute the block (no parentheses) block } }
  • 25. By-name parameters and currying ● Currying allows you to use a method that takes multiple arguments lists class RouteBuilder { //snip def when(test: Exchange => Boolean)(block: => Unit) = { val when = choice.when(new WhenPredicate(test)) build(when, block) } }
  • 26. Caveats ● Interaction between Java and Scala generics ● Java varargs versus Scala repeated parameters ● Operator precedence
  • 27. Operator precedence ● Scala allows you to override operators or declare symbol named methods – precedence is determined on the first character class SimpleRouteBuilder extends RouteBuilder { //these are all the same "direct:a" to "mock:a1" to "mock:a2" "direct:b" --> "mock:b1" --> "mock:b2" "direct:c" --> "mock:c1" to "mock:c2" //but this is something entirely different "direct:d" to "mock:d1" --> "mock:d2" }
  • 28. Java/Scala generics ● Most of the times, you can simply replace <> by [] ● A Java type defined as... public class ProcessorType<Type extends ProcessorType> {} ● In Java, you can also declare the raw type ... (you'll only get compiler warnings) ● ... but in Scala this doesn't work. The solution is this (ugly-looking) syntax (existential type). implicit def processorWrapper( processor: ProcessorType[T] forSome {type T}) = new RichProcessor(processor)
  • 29. Varargs/repeated parameters ● Java varargs... public Type to(String... uri) { //does some work } ● ... are like Scala repeated parameters def to(uris: String*) = //implementation goes here ● Caveats: def to(uris: String*) = { val processor = builder.from(uri) processor.to(uris.toArray[String]) } def -->(uris: String*) = to(uris:_*)
  • 30. Other language features ● What else is there? – traits and mixins – pattern matching – partially applied functions – apply() and unapply() – language support for XML XML literals, pattern matching for XML, ... – actors – annotation support – ...
  • 31. Planning ● Introduction ● Scala for DSL building – Implicit conversion – Passing functions as parameters – By-name parameters and currying – Caveats ● Scala tooling – Maven plugin – Eclipse plugin
  • 32. Scala Maven plugin ● Integrate Scala in your current Maven build – http://scala-tools.org/mvnsites/maven-scala-plugin/ – specify repository and plugin – also need to specify source/test folders ● Other features – continuous compilation (scala:cc) – scaladoc generation (scala:doc) – scala interactive console (scala:console)
  • 33. Scala Eclipse plugin ● Scala plugin for Eclipse http://www.scala-lang.org/tools/eclipse/ – Scala development perspective – Syntax highlighting and formatting – Wizards for classes, traits, objects, ... ● But... – If you have problems, resort to manual building (Ctrl-B) – Occasionally, you may have to clean your project to get up-to-date compile messages
  • 34. Scala Eclipse plugin ● Configuring Maven Eclipse plugin to generate Scala project descriptors – add a nature: ch.epfl.lamp.sdt.core.scalanature – add a builder: ch.epfl.lamp.sdt.core.scalabuilder – add a build classpath container: ch.epfl.lamp.sdt.launching.SCALA_CONTAINER
  • 35. Thanks for attending... Questions? Remarks?