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
KEY
Have Your Cake and Eat It Too: Meta-Programming Techniques for Java
PDF
Lambda: A Peek Under The Hood - Brian Goetz
PPTX
Clojure Fundamentals Course For Beginners
PPTX
Objective-c for Java Developers
PDF
Introduction to the Java bytecode - So@t - 20130924
PDF
New Features Of JDK 7
PPT
Java basic tutorial by sanjeevini india
Ppl for students unit 4 and 5
Have Your Cake and Eat It Too: Meta-Programming Techniques for Java
Lambda: A Peek Under The Hood - Brian Goetz
Clojure Fundamentals Course For Beginners
Objective-c for Java Developers
Introduction to the Java bytecode - So@t - 20130924
New Features Of JDK 7
Java basic tutorial by sanjeevini india

What's hot (19)

PPTX
Java bytecode and classes
PPT
Invoke dynamics
PPTX
Multithreading in java
PPTX
Playing with Java Classes and Bytecode
PDF
Java programming basics
PDF
Clojure - An Introduction for Java Programmers
PPTX
Concurrency in Java
ODP
Method Handles in Java
PDF
Java Threads
PDF
02 basic java programming and operators
PPT
Core java
PPTX
JAVA BYTE CODE
PDF
Objective-C Blocks and Grand Central Dispatch
KEY
Modern Java Concurrency
PDF
A Brief, but Dense, Intro to Scala
PPT
Java Basics
PPTX
Java byte code & virtual machine
PPT
Java basic
PDF
Clojure A Dynamic Programming Language for the JVM
Java bytecode and classes
Invoke dynamics
Multithreading in java
Playing with Java Classes and Bytecode
Java programming basics
Clojure - An Introduction for Java Programmers
Concurrency in Java
Method Handles in Java
Java Threads
02 basic java programming and operators
Core java
JAVA BYTE CODE
Objective-C Blocks and Grand Central Dispatch
Modern Java Concurrency
A Brief, but Dense, Intro to Scala
Java Basics
Java byte code & virtual machine
Java basic
Clojure A Dynamic Programming Language for the JVM
Ad

Viewers also liked (8)

PDF
BOF1-Scala02.pdf
PDF
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
PPT
Presentatie lc vrc bu2013 v2
PDF
program_draft3.pdf
PPTX
Canonical and robotos (2)
PDF
SACSIS2009_TCP.pdf
PDF
Robots and-sitemap - Version 1.0.1
PDF
Voltdb - wikipedia
BOF1-Scala02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
Presentatie lc vrc bu2013 v2
program_draft3.pdf
Canonical and robotos (2)
SACSIS2009_TCP.pdf
Robots and-sitemap - Version 1.0.1
Voltdb - wikipedia
Ad

Similar to camel-scala.pdf (20)

PPT
Writing DSL's in Scala
PDF
An Introduction to Scala for Java Developers
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
Writing DSL's in Scala
An Introduction to Scala for Java Developers
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

More from Hiroshi Ono (20)

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
TwitterOct2008.pdf
PDF
camel-scala.pdf
PDF
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
PDF
scalaliftoff2009.pdf
PDF
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
PDF
nodalities_issue7.pdf
PDF
genpaxospublic-090703114743-phpapp01.pdf
PDF
kademlia-1227143905867010-8.pdf
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
PDF
downey08semaphores.pdf
PDF
TwitterOct2008.pdf
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
TwitterOct2008.pdf
camel-scala.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
scalaliftoff2009.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
nodalities_issue7.pdf
genpaxospublic-090703114743-phpapp01.pdf
kademlia-1227143905867010-8.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
downey08semaphores.pdf
TwitterOct2008.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?