Skip to content

Commit aba4cbb

Browse files
committed
Merge pull request #27 from jcacciatore/scala-adaptor
Scala adaptor
2 parents 984cb1b + d2b7f1e commit aba4cbb

File tree

4 files changed

+226
-1
lines changed

4 files changed

+226
-1
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
apply plugin: 'scala'
2+
3+
tasks.withType(ScalaCompile) {
4+
scalaCompileOptions.unchecked = true
5+
6+
configure(scalaCompileOptions.forkOptions) {
7+
memoryMaximumSize = '1g'
8+
jvmArgs = ['-XX:MaxPermSize=512m']
9+
}
10+
}
11+
12+
dependencies {
13+
// Scala compiler and related tools
14+
scalaTools 'org.scala-lang:scala-compiler:2.10.0'
15+
scalaTools 'org.scala-lang:scala-library:2.10.0'
16+
17+
compile 'org.scala-lang:scala-library:2.10.0'
18+
compile 'org.scala-lang:scala-reflect:2.10.0'
19+
compile 'org.scalatest:scalatest_2.10:1.9.1'
20+
21+
compile project(':rxjava-core')
22+
provided 'junit:junit:4.10'
23+
provided 'org.mockito:mockito-core:1.9.5'
24+
25+
testCompile 'org.scalatest:scalatest_2.10:1.9.1'
26+
}
27+
28+
task test(overwrite: true, dependsOn: testClasses) << {
29+
ant.taskdef(name: 'scalatest',
30+
classname: 'org.scalatest.tools.ScalaTestAntTask',
31+
classpath: sourceSets.test.runtimeClasspath.asPath
32+
)
33+
ant.scalatest(runpath: sourceSets.test.classesDir,
34+
haltonfailure: 'true',
35+
fork: 'false') {reporter(type: 'stdout')}
36+
}
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
/**
2+
* Copyright 2013 Netflix, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package rx.lang.scala
17+
18+
import rx.util.FunctionLanguageAdaptor
19+
import org.junit.{Assert, Before, Test}
20+
import rx.observables.Observable
21+
import org.scalatest.junit.JUnitSuite
22+
import org.mockito.Mockito._
23+
import org.mockito.{MockitoAnnotations, Mock}
24+
25+
import scala.collection.JavaConverters._
26+
import collection.mutable.ArrayBuffer
27+
28+
class ScalaAdaptor extends FunctionLanguageAdaptor {
29+
30+
val ON_NEXT = "onNext"
31+
val ON_ERROR = "onError"
32+
val ON_COMPLETED = "onCompleted"
33+
34+
def getFunctionClass: Array[Class[_]] = {
35+
return Array(classOf[Map[String, _]], classOf[(AnyRef) => Object], classOf[(AnyRef, AnyRef) => Object],
36+
classOf[(AnyRef, AnyRef, AnyRef) => Object], classOf[(AnyRef, AnyRef, AnyRef, AnyRef) => Object],
37+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef) => Object],
38+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
39+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
40+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) =>Object],
41+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
42+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
43+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
44+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
45+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
46+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
47+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
48+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
49+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
50+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
51+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
52+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object],
53+
classOf[(AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object])
54+
}
55+
56+
def call(function: AnyRef, args: Array[AnyRef]) : Object = {
57+
function match {
58+
case (func: Map[String, _]) => return matchOption(function.asInstanceOf[Map[String, _]].get(ON_NEXT), args)
59+
case _ => return matchFunction(function, args)
60+
}
61+
}
62+
63+
private def matchOption(funcOption: Option[_], args: Array[AnyRef]) : Object = {
64+
funcOption match {
65+
case Some(func: AnyRef) => return matchFunction(func, args)
66+
case _ => return None
67+
}
68+
}
69+
70+
private def matchFunction(function: AnyRef, args: Array[AnyRef]) : Object = function match {
71+
case (f: ((AnyRef) => Object)) => return f(args(0))
72+
case (f: ((AnyRef, AnyRef) => Object)) => return f(args(0), args(1))
73+
case (f: ((AnyRef, AnyRef, AnyRef) => Object)) => return f(args(0), args(1), args(2))
74+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
75+
return f(args(0), args(1), args(2), args(3))
76+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
77+
return f(args(0), args(1), args(2), args(3), args(4))
78+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
79+
return f(args(0), args(1), args(2), args(3), args(4), args(5))
80+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
81+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6))
82+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
83+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7))
84+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
85+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8))
86+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
87+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9))
88+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
89+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10))
90+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
91+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11))
92+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
93+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12))
94+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
95+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13))
96+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
97+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14))
98+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
99+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15))
100+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
101+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16))
102+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
103+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17))
104+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
105+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18))
106+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
107+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19))
108+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
109+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19), args(20))
110+
case (f: ((AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef, AnyRef) => Object)) =>
111+
return f(args(0), args(1), args(2), args(3), args(4), args(5), args(6), args(7), args(8), args(9), args(10), args(11), args(12), args(13), args(14), args(15), args(16), args(17), args(18), args(19), args(20), args(21))
112+
113+
}
114+
}
115+
116+
class UnitTestSuite extends JUnitSuite {
117+
@Mock private[this]
118+
val assertion: ScriptAssertion = null
119+
120+
@Before def before {
121+
MockitoAnnotations.initMocks(this)
122+
}
123+
124+
@Test def testTake() {
125+
Observable.toObservable("1", "2", "3").take(1).subscribe(Map(
126+
"onNext" -> ((callback: String) => {
127+
print("testTake: callback = " + callback)
128+
assertion.received(callback)
129+
})
130+
))
131+
verify(assertion, times(1)).received("1")
132+
}
133+
134+
@Test def testFilterWithToList() {
135+
val numbers = Observable.toObservable[Int](1, 2, 3, 4, 5, 6, 7, 8, 9)
136+
numbers.filter((x: Int) => 0 == (x % 2)).toList().subscribe(
137+
(callback: java.util.List[Int]) => {
138+
val lst = callback.asScala.toList
139+
println("filter onNext -> got " + lst)
140+
assertion.received(lst)
141+
}
142+
)
143+
verify(assertion, times(1)).received(List(2,4,6,8))
144+
}
145+
146+
@Test def testLast() {
147+
val numbers = Observable.toObservable[Int](1, 2, 3, 4, 5, 6, 7, 8, 9)
148+
numbers.last().subscribe((callback: Int) => {
149+
println("testLast: onNext -> got " + callback)
150+
assertion.received(callback)
151+
})
152+
verify(assertion, times(1)).received(9)
153+
}
154+
155+
@Test def testMap() {
156+
val numbers = Observable.toObservable(1, 2, 3, 4, 5, 6, 7, 8, 9)
157+
val mappedNumbers = new ArrayBuffer[Int]()
158+
numbers.map(((x: Int)=> { x * x })).subscribe(((squareVal: Int) => {
159+
println("square is " + squareVal )
160+
mappedNumbers += squareVal
161+
}))
162+
Assert.assertEquals(List(1,4,9,16,25,36,49,64,81), mappedNumbers.toList)
163+
164+
}
165+
166+
@Test def testZip() {
167+
val numbers = Observable.toObservable(1, 2, 3)
168+
val colors = Observable.toObservable("red", "green", "blue")
169+
val characters = Observable.toObservable("lion-o", "cheetara", "panthro")
170+
171+
Observable.zip(numbers.toList, colors.toList, characters.toList, ((n: java.util.List[Int], c: java.util.List[String], t: java.util.List[String]) => { Map(
172+
"numbers" -> n,
173+
"colors" -> c,
174+
"thundercats" -> t
175+
)})).subscribe((m: Map[String, _]) => {
176+
println("zipped map is " + m.toString())
177+
})
178+
179+
180+
}
181+
182+
trait ScriptAssertion {
183+
def error(ex: Exception)
184+
185+
def received(obj: Any)
186+
}
187+
}

rxjava-core/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
apply plugin: 'java'
22
apply plugin: 'eclipse'
3+
apply plugin: 'idea'
34

45
// we want to target Java 1.5 so this can be used on Android
56
sourceCompatibility = JavaVersion.VERSION_1_5

settings.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ rootProject.name='rxjava'
22
include 'rxjava-core', \
33
'language-adaptors:rxjava-groovy', \
44
'language-adaptors:rxjava-jruby', \
5-
'language-adaptors:rxjava-clojure'
5+
'language-adaptors:rxjava-clojure', \
6+
'language-adaptors:rxjava-scala' \

0 commit comments

Comments
 (0)