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 =