diff --git a/src/swebdsl/Data.scala b/src/swebdsl/data/Data.scala similarity index 78% rename from src/swebdsl/Data.scala rename to src/swebdsl/data/Data.scala index 998e7f9..5f29ab4 100644 --- a/src/swebdsl/Data.scala +++ b/src/swebdsl/data/Data.scala @@ -1,20 +1,9 @@ -package swebdsl +package swebdsl.data import com.google.appengine.api.datastore._ import scala.collection.mutable.HashMap import scala.collection.mutable.ArrayBuffer -trait Cache { - private var cache: HashMap[String, AnyRef] = new HashMap[String, AnyRef] - - def cache[T](key: String, l: => T): T = { - if (!cache.contains(key)) { - cache(key) = l.asInstanceOf[AnyRef] - } - cache(key).asInstanceOf[T] - } -} - abstract class DataObject(key: String) { def singleton: DataObjectSingleton[_] @@ -66,7 +55,7 @@ abstract class DataObject(key: String) { } -abstract class DataObjectSingleton[T <: DataObject](var cls: Class[_]) { +abstract class DataObjectSingleton[T <: DataObject](var cls: Class[T]) { def kind: String = cls.getSimpleName() def all(): ArrayBuffer[T] = { @@ -106,7 +95,11 @@ abstract class DataObjectSingleton[T <: DataObject](var cls: Class[_]) { var keys = values.keySet().iterator() while (keys.hasNext()) { var key = keys.next() - cls.getMethod(key + "_$eq", cls.getMethod(key).getReturnType).invoke(e, values.get(key)) + try { + cls.getMethod(key + "_$eq", cls.getMethod(key).getReturnType).invoke(e, values.get(key)) + } catch { + case e: Exception => + } } results.append(e) } @@ -114,3 +107,21 @@ abstract class DataObjectSingleton[T <: DataObject](var cls: Class[_]) { } } +object DataUtils { + def key2DataObject(cls: Class[_], key: String): AnyRef = { + if (cls.getSuperclass() != classOf[DataObject]) { + return null + } + var e = cls.newInstance().asInstanceOf[DataObject] + var ds = DatastoreServiceFactory.getDatastoreService() + e.ent = ds.get(KeyFactory.createKey(cls.getSimpleName(), key.toInt)) + var values = e.ent.getProperties() + var keys = values.keySet().iterator() + while (keys.hasNext()) { + var key = keys.next() + cls.getMethod(key + "_$eq", cls.getMethod(key).getReturnType).invoke(e, values.get(key)) + } + return e + } +} + diff --git a/src/swebdsl/Forms.scala b/src/swebdsl/ui/Forms.scala similarity index 94% rename from src/swebdsl/Forms.scala rename to src/swebdsl/ui/Forms.scala index f4efc34..e0adc02 100644 --- a/src/swebdsl/Forms.scala +++ b/src/swebdsl/ui/Forms.scala @@ -1,4 +1,4 @@ -package swebdsl +package swebdsl.ui import javax.servlet.http._ @@ -113,14 +113,14 @@ trait Forms { else throw new RuntimeException("Don't know how to create an input for " + a) - def action(s: String)(c: => Unit) { + def button(s: String)(c: => Unit) { actionCounter += 1 mode match { case PageMode.Render => { - write("") + write("") } case PageMode.Action => { - if (request.getParameter("action-" + actionCounter) != null) { + if (request.getParameter("button-" + actionCounter) != null) { c } } diff --git a/src/swebdsl/MainServlet.scala b/src/swebdsl/ui/MainServlet.scala similarity index 72% rename from src/swebdsl/MainServlet.scala rename to src/swebdsl/ui/MainServlet.scala index f213d7f..a27c74b 100644 --- a/src/swebdsl/MainServlet.scala +++ b/src/swebdsl/ui/MainServlet.scala @@ -1,13 +1,14 @@ -package swebdsl +package swebdsl.ui import javax.servlet._ import javax.servlet.http._ import java.io._ -import scala.collection.mutable.HashMap +import scala.collection.mutable.{HashMap, ArrayBuffer} import com.google.appengine.api.datastore._ abstract class MainServlet extends HttpServlet { var pageMap = HashMap[String, String]() + var dataConverters = new ArrayBuffer[((Class[_], String) => AnyRef)] def pages: List[Page] @@ -46,10 +47,20 @@ abstract class MainServlet extends HttpServlet { args(i) = pargs(i) } else if (argType == classOf[Int]) { args(i) = int2Integer(pargs(i).toInt) - } else if (argType.getSuperclass() == classOf[DataObject]) { - args(i) = key2DataObject(pargs(i), argType) + //} else if (argType.getSuperclass() == classOf[DataObject]) { + //args(i) = key2DataObject(pargs(i), argType) } else { - matches = false + var r: AnyRef = null + for (conv <- dataConverters) { + r = conv(argType, pargs(i)) + if (r != null) { + matches = true + args(i) = r + } + } + if (r == null) { + matches = false + } } i += 1 } @@ -73,16 +84,4 @@ abstract class MainServlet extends HttpServlet { } } - private def key2DataObject(key: String, cls: Class[_]): DataObject = { - var e = cls.newInstance().asInstanceOf[DataObject] - var ds = DatastoreServiceFactory.getDatastoreService() - e.ent = ds.get(KeyFactory.createKey(cls.getSimpleName(), key.toInt)) - var values = e.ent.getProperties() - var keys = values.keySet().iterator() - while (keys.hasNext()) { - var key = keys.next() - cls.getMethod(key + "_$eq", cls.getMethod(key).getReturnType).invoke(e, values.get(key)) - } - return e - } } diff --git a/src/swebdsl/Page.scala b/src/swebdsl/ui/Page.scala similarity index 91% rename from src/swebdsl/Page.scala rename to src/swebdsl/ui/Page.scala index f69edf7..4f7ec08 100644 --- a/src/swebdsl/Page.scala +++ b/src/swebdsl/ui/Page.scala @@ -1,5 +1,6 @@ -package swebdsl +package swebdsl.ui +import collection.mutable.HashMap import java.io._ import javax.servlet.http._ @@ -10,6 +11,18 @@ object PageMode extends Enumeration { case class IgnoreMe() +trait Cache { + private var cache: HashMap[String, AnyRef] = new HashMap[String, AnyRef] + + def cache[T](key: String, l: => T): T = { + if (!cache.contains(key)) { + cache(key) = l.asInstanceOf[AnyRef] + } + cache(key).asInstanceOf[T] + } +} + + abstract case class Page(ign: IgnoreMe) extends Forms with Cache { var sectionDepth = 1 var style = new Style @@ -28,6 +41,11 @@ abstract case class Page(ign: IgnoreMe) extends Forms with Cache { this.out = out this.request = req this.response = res + postInit + } + + def postInit { + } def resetCounters { diff --git a/src/swebdsl/Style.scala b/src/swebdsl/ui/Style.scala similarity index 89% rename from src/swebdsl/Style.scala rename to src/swebdsl/ui/Style.scala index 618e6d2..ba9438b 100644 --- a/src/swebdsl/Style.scala +++ b/src/swebdsl/ui/Style.scala @@ -1,4 +1,4 @@ -package swebdsl +package swebdsl.ui class Style { import scala.collection.mutable.Stack @@ -53,6 +53,11 @@ class Style { this } + def native(s: String)(c: => Unit) = { + setSelector(s, c) + this + } + def body(c: => Unit): Style = { setSelector("body", c) this @@ -101,18 +106,6 @@ class Style { def setSpecificStyle(css: String) { this.css.append(css) - /* - var s : Style = this - while(s.parent != null) { - s = s.parent - } - val key = s.styleStack map(_.name) mkString(" >> ") - if(s.styles contains key) { - s.styles(key).append(css) - } else { - s.styles(key) = new StringBuffer(css) - } - */ } override def toString: String =