From 9e3a9983a7aa16c69415e4a0911f8ee7ad191263 Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Mon, 15 Jun 2015 12:21:44 +0200 Subject: [PATCH] +act #17719 introduce Tuple3-22 classes for java api --- .../src/test/java/akka/actor/JavaAPI.java | 12 +++++++++++ .../akka/japi/tuple/Tuples.scala.template | 21 +++++++++++++++++++ .../src/main/scala/akka/japi/JavaAPI.scala | 21 +++++++++++++------ project/MiMa.scala | 5 ++++- 4 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 akka-actor/src/main/boilerplate/akka/japi/tuple/Tuples.scala.template diff --git a/akka-actor-tests/src/test/java/akka/actor/JavaAPI.java b/akka-actor-tests/src/test/java/akka/actor/JavaAPI.java index 3590f3e900..4f45491aa5 100644 --- a/akka-actor-tests/src/test/java/akka/actor/JavaAPI.java +++ b/akka-actor-tests/src/test/java/akka/actor/JavaAPI.java @@ -7,6 +7,10 @@ package akka.actor; import akka.event.Logging; import akka.event.Logging.LoggerInitialized; import akka.japi.Creator; +import akka.japi.Pair; +import akka.japi.tuple.Tuple22; +import akka.japi.tuple.Tuple3; +import akka.japi.tuple.Tuple4; import akka.routing.GetRoutees; import akka.routing.FromConfig; import akka.routing.NoRouter; @@ -121,6 +125,14 @@ public class JavaAPI { probe.expectMsg("a-null-0-0"); } + @Test + @SuppressWarnings("unused") + public void mustCompileTupleCreation() { + final Pair p = Pair.create(1, "2"); + final Tuple4 t4 = Tuple4.create(1, "2", 3, 4L); + Tuple22.create(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22); + } + public static class ActorWithConstructorParams extends UntypedActor { private final String a; diff --git a/akka-actor/src/main/boilerplate/akka/japi/tuple/Tuples.scala.template b/akka-actor/src/main/boilerplate/akka/japi/tuple/Tuples.scala.template new file mode 100644 index 0000000000..032f2e93a8 --- /dev/null +++ b/akka-actor/src/main/boilerplate/akka/japi/tuple/Tuples.scala.template @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2015 Typesafe Inc. + */ +package akka.japi.tuple + +[3..22#/** + * Used to create tuples with 1 elements in Java. + */ +object Tuple1 { + def create[[#T1#]]([#t1: T1#]) = new Tuple1([#t1#]) +} + +/** + * Java API Tuple container. + */ +@SerialVersionUID(##1L) +final case class Tuple1[[#T1#]]([#t1: T1#]) { + val toScala: ([#T1#]) = ([#t1#]) +}# + +] \ No newline at end of file diff --git a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala index 6497eb5804..0a3e4b6575 100644 --- a/akka-actor/src/main/scala/akka/japi/JavaAPI.scala +++ b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala @@ -4,14 +4,15 @@ package akka.japi -import language.implicitConversions +import java.util.Collections.{ emptyList, singletonList } + +import akka.util.Collections.EmptyImmutableSeq import scala.collection.immutable +import scala.language.implicitConversions import scala.reflect.ClassTag -import scala.util.control.NoStackTrace import scala.runtime.AbstractPartialFunction -import akka.util.Collections.EmptyImmutableSeq -import java.util.Collections.{ emptyList, singletonList } +import scala.util.control.NoStackTrace /** * A Function interface. Used to create first-class-functions is Java. @@ -53,10 +54,18 @@ trait Predicate[T] { } /** - * Java API: Represents a tuple of two elements. + * Java API + * Represents a pair (tuple) of two elements. + * + * Additional tuple types for 3 to 22 values are defined in the `akka.japi.tuple` package, e.g. [[akka.japi.tuple.Tuple3]]. */ @SerialVersionUID(1L) -case class Pair[A, B](first: A, second: B) +case class Pair[A, B](first: A, second: B) { + def toScala: (A, B) = (first, second) +} +object Pair { + def create[A, B](first: A, second: B): Pair[A, B] = new Pair(first, second) +} /** * A constructor/factory, takes no parameters but creates a new value of type T every call. diff --git a/project/MiMa.scala b/project/MiMa.scala index 2907bd13d4..3c3eeba44a 100644 --- a/project/MiMa.scala +++ b/project/MiMa.scala @@ -534,7 +534,10 @@ object MiMa extends AutoPlugin { FilterAnyProblem("akka.remote.RemoteWatcher$UnwatchRemote"), FilterAnyProblem("akka.remote.RemoteWatcher$Rewatch"), FilterAnyProblem("akka.remote.RemoteWatcher$RewatchRemote"), - FilterAnyProblem("akka.remote.RemoteWatcher$Stats") + FilterAnyProblem("akka.remote.RemoteWatcher$Stats"), + + // toString is available on any object, mima is confused due to a generated toString appearing #17722 + ProblemFilters.exclude[MissingMethodProblem]("akka.japi.Pair.toString") ) }