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?

More Related Content

PDF
Ppl for students unit 4 and 5
PDF
A Brief, but Dense, Intro to Scala
PDF
camel-scala.pdf
PDF
Solid and Sustainable Development in Scala
PDF
An Introduction to Scala for Java Developers
PPTX
Objective-c for Java Developers
ODP
Scala Reflection & Runtime MetaProgramming
PDF
Lambda: A Peek Under The Hood - Brian Goetz
Ppl for students unit 4 and 5
A Brief, but Dense, Intro to Scala
camel-scala.pdf
Solid and Sustainable Development in Scala
An Introduction to Scala for Java Developers
Objective-c for Java Developers
Scala Reflection & Runtime MetaProgramming
Lambda: A Peek Under The Hood - Brian Goetz

What's hot (14)

PDF
Core Java Certification
PPT
Basic info on java intro
PDF
Scala overview
PDF
Core Java Tutorial
PPTX
Introduction to JavaScript
PPTX
An Introduction to JavaScript
PPTX
Core java complete ppt(note)
KEY
Have Your Cake and Eat It Too: Meta-Programming Techniques for Java
PPTX
JS - Basics
PPTX
Scala, Play 2.0 & Cloud Foundry
KEY
Scala: functional programming for the imperative mind
PPTX
From Ruby to Scala
PPT
Core java
PPTX
Advanced Javascript
Core Java Certification
Basic info on java intro
Scala overview
Core Java Tutorial
Introduction to JavaScript
An Introduction to JavaScript
Core java complete ppt(note)
Have Your Cake and Eat It Too: Meta-Programming Techniques for Java
JS - Basics
Scala, Play 2.0 & Cloud Foundry
Scala: functional programming for the imperative mind
From Ruby to Scala
Core java
Advanced Javascript
Ad

Viewers also liked (7)

PPTX
Writing for web & blog wordpress 19.1.2012
PPTX
Meet and Greet w/ New VP of Programs Sandra Nathan.
PDF
TwitterOct2008.pdf
PPTX
名言
PDF
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
PDF
BOF1-Scala02.pdf
PDF
TwitterOct2008.pdf
Writing for web & blog wordpress 19.1.2012
Meet and Greet w/ New VP of Programs Sandra Nathan.
TwitterOct2008.pdf
名言
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
BOF1-Scala02.pdf
TwitterOct2008.pdf
Ad

Similar to camel-scala.pdf (20)

PPT
Writing DSL's in Scala
PDF
BCS SPA 2010 - An Introduction to Scala for Java Developers
PPTX
Camel as a_glue
PDF
Using Scala for building DSLs
PDF
Scala, Akka, and Play: An Introduction on Heroku
PDF
Miles Sabin Introduction To Scala For Java Developers
PDF
A Brief Introduction to Scala for Java Developers
PPTX
AestasIT - Internal DSLs in Scala
PDF
Software Engineering Thailand: Programming with Scala
PDF
Scala for Java Programmers
PDF
Scala In The Wild
PDF
Domain Specific Languages
PDF
TS 4839 - Enterprise Integration Patterns in Practice
PPTX
All about scala
PDF
(Greach 2015) Dsl'ing your Groovy
PPTX
Why Scala is the better Java
PDF
Getting Started With Scala
PDF
Getting Started With Scala
KEY
Apache Camel
PDF
Introduction To Scala
Writing DSL's in Scala
BCS SPA 2010 - An Introduction to Scala for Java Developers
Camel as a_glue
Using Scala for building DSLs
Scala, Akka, and Play: An Introduction on Heroku
Miles Sabin Introduction To Scala For Java Developers
A Brief Introduction to Scala for Java Developers
AestasIT - Internal DSLs in Scala
Software Engineering Thailand: Programming with Scala
Scala for Java Programmers
Scala In The Wild
Domain Specific Languages
TS 4839 - Enterprise Integration Patterns in Practice
All about scala
(Greach 2015) Dsl'ing your Groovy
Why Scala is the better Java
Getting Started With Scala
Getting Started With Scala
Apache Camel
Introduction To Scala

More from Hiroshi Ono (20)

PDF
Voltdb - wikipedia
PPT
Gamecenter概説
PDF
EventDrivenArchitecture
PDF
program_draft3.pdf
PDF
nodalities_issue7.pdf
PDF
genpaxospublic-090703114743-phpapp01.pdf
PDF
kademlia-1227143905867010-8.pdf
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
PDF
downey08semaphores.pdf
PDF
BOF1-Scala02.pdf
PDF
camel-scala.pdf
PDF
SACSIS2009_TCP.pdf
PDF
scalaliftoff2009.pdf
PDF
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
PDF
program_draft3.pdf
PDF
nodalities_issue7.pdf
PDF
genpaxospublic-090703114743-phpapp01.pdf
PDF
kademlia-1227143905867010-8.pdf
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
PDF
downey08semaphores.pdf
Voltdb - wikipedia
Gamecenter概説
EventDrivenArchitecture
program_draft3.pdf
nodalities_issue7.pdf
genpaxospublic-090703114743-phpapp01.pdf
kademlia-1227143905867010-8.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
downey08semaphores.pdf
BOF1-Scala02.pdf
camel-scala.pdf
SACSIS2009_TCP.pdf
scalaliftoff2009.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
program_draft3.pdf
nodalities_issue7.pdf
genpaxospublic-090703114743-phpapp01.pdf
kademlia-1227143905867010-8.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
downey08semaphores.pdf

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 (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
  • 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?