On Sunday 24 May 2009 09:36:48 pm Andreas Joseph Krogh wrote:
> Hi all.
> Normally this kind of post would be better posted to -users, but I'm looking 
> for the developers comments on this.
> 
> Anyone have any experience using Scala with Struts2? I'm especially thinking 
> about s:iterate and scala.List.
> 
> I've managed to use s:iterate with Scala's List like this:
> <s:iterator value="%{getMyList().toArray().unbox(@java.lang.obj...@class)}" 
> status="status">
> getMyList() returns a scala.List from my Scala-object, which I convert to an 
> JAVA-array using toArray().unbox().
> 
> This seems very hackish and it would be cool if one could make a 
> "struts2-scala-plugin" which registered some kind of Iterator which the 
> IteratorComponent could use, refactoring out the call to 
> "MakeIterator.convert(findValue(value))" to a factory of some kind which 
> checked some kind of registry for providing a proper Iterator for the 
> Scala-object returned by findValue(value).
> 
> Comments?

For the curious;
After some Googleing I "solved" this issue by defining a 
getListAsJavaIterator() method in my Scala-object which uses "implicit 
conversion" compiler-magic to define a new "iterator()" method on the 
Scala-Iterable Trait:

object JavaIterableConversions {

        class JavaIterator[T](itr: Iterator[T]) extends java.util.Iterator[T] {
                def hasNext() = itr.hasNext
                def next() = itr.next
                def remove() = throw new
                                java.lang.UnsupportedOperationException("Remove 
is not implemented in JavaIterableConversions:JavaIterator")
        }

        class JavaIterable[T](iterable: Iterable[T]) extends 
java.lang.Iterable[T] {
                def iterator() = new JavaIterator[T](iterable.elements)
        }

        implicit def implicitScalaIterableToJavaIterable[T](iterable : 
Iterable[T]): java.lang.Iterable[T] =
                new JavaIterable[T](iterable)

}

Usage:

import JavaIterableConversions._
class MyScalaClass {
        @BeanProperty
        var items: List[Item] = _

        def getListAsJavaIterator(): java.util.Iterator[_] = {
                items.iterator();
        }
}

Note: the iterator() *must* be defined in the same class as the 
implicit-conversion implicitScalaIterableToJavaIterable is defined/imported as 
it's the scala-compiler which does it's magic here. Trying to call 
items.iterator() from a JAVA-class will *not* work.

-- 
Andreas Joseph Krogh <[email protected]>
Senior Software Developer / CTO
------------------------+---------------------------------------------+
OfficeNet AS            | The most difficult thing in the world is to |
Rosenholmveien 25       | know how to do a thing and to watch         |
1414 TrollÄsen          | somebody else doing it wrong, without       |
NORWAY                  | comment.                                    |
                        |                                             |
Tlf:    +47 24 15 38 90 |                                             |
Fax:    +47 24 15 38 91 |                                             |
Mobile: +47 909  56 963 |                                             |
------------------------+---------------------------------------------+

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to