All Downloads are FREE. Search and download functionalities are using the official Maven repository.

skinny.view.velocity.ScalaUberspect.scala Maven / Gradle / Ivy

The newest version!
package skinny.view.velocity

import org.apache.velocity.util.introspection.{ Info, UberspectImpl, VelMethod, VelPropertyGet }
import scala.collection.JavaConverters._

object ScalaUberspect {

  private val GET_METHOD_NAME = "get"

}

/**
 * Velocity Uberspect implementation for Scala
 */
class ScalaUberspect extends UberspectImpl {

  override def getIterator(obj: Object, i: Info): java.util.Iterator[_] = obj match {
    case option: Option[_] => option.iterator.asJava
    case map: scala.collection.Map[_, _] => map.values.iterator.asJava
    case iterable: Iterable[_] => iterable.iterator.asJava
    case iterator: Iterator[_] => iterator.asJava
    case _ => super.getIterator(obj, i)
  }

  override def getMethod(obj: AnyRef, methodName: String, args: Array[AnyRef], i: Info): VelMethod = (obj, methodName) match {
    case (_: Option[_], ScalaUberspect.GET_METHOD_NAME) if args.size == 0 =>
      val method = introspector.getMethod(obj.getClass, methodName, args)
      if (method != null) {
        new RewriteVelMethod(method, (o, params) => {
          o.asInstanceOf[Option[AnyRef]].getOrElse(null)
        })
      } else {
        super.getMethod(obj, methodName, args, i)
      }

    case (_: Seq[_], ScalaUberspect.GET_METHOD_NAME) if args.size == 1 =>
      super.getMethod(obj, "apply", args, i)

    case (_: scala.collection.Map[_, _], ScalaUberspect.GET_METHOD_NAME) if args.size == 1 =>
      val method = introspector.getMethod(obj.getClass, methodName, args)
      if (method != null) {
        new RewriteVelMethod(method, (o, params) => {
          o.asInstanceOf[scala.collection.Map[AnyRef, AnyRef]].getOrElse(params(0), null)
        })
      } else {
        super.getMethod(obj, methodName, args, i)
      }

    case _ =>
      super.getMethod(obj, methodName, args, i)
  }

  override def getPropertyGet(obj: AnyRef, identifier: String, i: Info): VelPropertyGet = {
    Option(obj)
      .map {
        case option: Option[_] if identifier == ScalaUberspect.GET_METHOD_NAME =>
          new ScalaOptionGetExecutor(log, introspector, obj.getClass, identifier)
        case map: scala.collection.Map[_, _] =>
          new ScalaMapGetExecutor(log, introspector, obj.getClass, identifier)
        case _ =>
          new ScalaPropertyExecutor(log, introspector, obj.getClass, identifier)
      }.map { executor =>
        if (executor.isAlive) {
          new UberspectImpl.VelGetterImpl(executor)
        } else {
          super.getPropertyGet(obj, identifier, i)
        }
      }.getOrElse(null)
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy