Merged latest changes from trunk.

git-svn-id: https://svn.apache.org/repos/asf/esme/branches/lift-2.4@1171002 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/server/build.sbt b/server/build.sbt
index cf347b1..726182e 100644
--- a/server/build.sbt
+++ b/server/build.sbt
@@ -4,22 +4,20 @@
 
 organization := "Apache Software Foundation"
 
-scalaVersion := "2.8.1"
+scalaVersion := "2.9.1"
 
-seq(WebPlugin.webSettings: _*)
+seq(webSettings :_*)
 
 ivyXML :=
     <dependencies>
-      <dependency org="net.lag" name="configgy" rev="2.0.1">
-        <exclude org="org.scala-tools" module="vscaladoc"/>
-      </dependency>
-      <dependency org="com.twitter" name="ostrich" rev="2.3.2">
+      <dependency org="com.twitter" name="ostrich" rev="4.7.3">
         <exclude org="org.scala-tools" module="vscaladoc"/>
       </dependency>
     </dependencies>
 
 libraryDependencies ++= {
-  val liftVersion = "2.3"
+  val scalaVersion = "2.9.1"
+  val liftVersion = "2.4-M4"
   val compassVersion = "2.1.1"
   val luceneVersion = "2.4.0"
   Seq(
@@ -46,8 +44,8 @@
     "log4j" % "log4j" % "1.2.16" % "compile->default",
     "org.slf4j" % "slf4j-api" % "1.6.1" % "compile->default",
     "org.slf4j" % "slf4j-log4j12" % "1.6.1" % "compile->default",
-    "org.scala-tools.testing" %% "specs" % "1.6.8" % "test->default",
-    "org.scala-lang" % "scala-compiler" % "2.8.1" % "test->default",
+    "org.scala-tools.testing" %% "specs" % "1.6.9" % "test->default",
+    "org.scala-lang" % "scala-compiler" % scalaVersion % "test->default",
     "org.mortbay.jetty" % "jetty" % "[6.1.6,)" % "test->default"
   )
 }
@@ -60,8 +58,10 @@
 
 resolvers += "Twitter Repository" at "http://maven.twttr.com"
 
+resolvers +=  "Java.net Maven2 Repository" at "http://download.java.net/maven/2/"
+
 // Execute tests in the current project serially.
 // Tests from other projects may still run concurrently.
 //parallelExecution in Test := false
 
-//scalacOptions += "-Xprint:typer"
\ No newline at end of file
+//scalacOptions += "-Xprint:typer"
diff --git a/server/pom.xml b/server/pom.xml
index d88a3be..62a3f69 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -73,8 +73,8 @@
     </developer>

     </developers>

     <properties>

-        <lift.version>2.3</lift.version>

-        <scala.version>2.8.1</scala.version>

+        <lift.version>2.4-M4</lift.version>

+        <scala.version>2.9.1</scala.version>

         <compass.version>2.1.1</compass.version>

         <lucene.version>2.4.0</lucene.version>

         <netbeans.hint.deploy.server>gfv3</netbeans.hint.deploy.server>

@@ -273,20 +273,9 @@
            <version>1.6.1</version>

         </dependency>

         <dependency>

-            <groupId>net.lag</groupId>

-            <artifactId>configgy</artifactId>

-            <version>2.0.1</version>

-            <exclusions> 

-              <exclusion> 

-                <groupId>org.scala-tools</groupId>

-                <artifactId>vscaladoc</artifactId>

-              </exclusion>

-            </exclusions>

-        </dependency>

-        <dependency>

             <groupId>com.twitter</groupId>

             <artifactId>ostrich</artifactId>

-            <version>2.3.2</version>    

+            <version>4.7.3</version>

             <exclusions> 

               <exclusion> 

                 <groupId>org.scala-tools</groupId>

@@ -297,7 +286,7 @@
         <dependency>

             <groupId>org.scala-tools.testing</groupId>

             <artifactId>specs_${scala.version}</artifactId>

-            <version>1.6.8</version>

+            <version>1.6.9</version>

             <scope>test</scope>

         </dependency>

         <dependency>

diff --git a/server/project/plugins/build.sbt b/server/project/plugins/build.sbt
index 3e39bf5..8c613b2 100644
--- a/server/project/plugins/build.sbt
+++ b/server/project/plugins/build.sbt
@@ -1,4 +1,7 @@
-resolvers += "Web plugin repo" at "http://siasia.github.com/maven2"
+resolvers  ++= Seq(
+  "Web plugin repo" at "http://siasia.github.com/maven2",
+  Resolver.url("Typesafe repository", new java.net.URL("http://typesafe.artifactoryonline.com/typesafe/ivy-releases/"))(Resolver.defaultIvyPatterns)
+)
 
-//Following means libraryDependencies += "com.github.siasia" %% "xsbt-web-plugin" % <sbt version>
-libraryDependencies <+= sbtVersion("com.github.siasia" %% "xsbt-web-plugin" % _)
\ No newline at end of file
+//Following means libraryDependencies += "com.github.siasia" %% "xsbt-web-plugin" % "0.1.0-<sbt version>""
+libraryDependencies <+= sbtVersion(v => "com.github.siasia" %% "xsbt-web-plugin" % ("0.1.0-"+v))
\ No newline at end of file
diff --git a/server/src/main/scala/bootstrap/liftweb/Boot.scala b/server/src/main/scala/bootstrap/liftweb/Boot.scala
index f165819..4d44c7b 100644
--- a/server/src/main/scala/bootstrap/liftweb/Boot.scala
+++ b/server/src/main/scala/bootstrap/liftweb/Boot.scala
@@ -47,8 +47,8 @@
 import net.liftweb.widgets.tablesorter._
 import widgets.autocomplete.AutoComplete
 //import com.twitter.stats._
-import com.twitter.ostrich.{ServiceTracker, Stats, StatsMBean, RuntimeEnvironment}
-import net.lag.configgy.Config
+import com.twitter.ostrich.admin.{RuntimeEnvironment, AdminHttpService}
+import com.twitter.ostrich.stats.Stats
 
 import _root_.net.liftweb.widgets.logchanger._
 
@@ -175,14 +175,14 @@
     // Build SiteMap
     val entries = Menu(Loc("Home", List("index"), "Home")) ::
         Menu(Loc("user", List("info_view", "user"), "User Info", ifIsLoggedIn,
-          Loc.Snippet("user_info", UserDisplay.userInfo))) ::
+          Loc.Snippet("user_info", UserDisplay.userInfo _))) ::
         logLevel.menu  ::
         Menu(Loc("tag", List("info_view", "tag"), "Tag", ifIsLoggedIn,
-          Loc.Snippet("tag_display", TagDisplay.display))) ::
+          Loc.Snippet("tag_display", TagDisplay.display _))) ::
         Menu(Loc("public", List("info_view", "public"), S.?("base_profile_public"), ifIsLoggedIn)) ::
         Menu(Loc("contacts", List("info_view", "contacts"), S.?("base_profile_contacts"), ifIsLoggedIn)) ::
         Menu(Loc("sign_up", List("signup"), S.?("base_menu_signup"),
-          Snippet("signup", User.signupForm),
+          Snippet("signup", User.signupForm _),
           Unless(User.loggedIn_? _, S.?("base_menu_sign_up_error")))) ::
         Menu(Loc("logout", List("logout"), S.?("base_menu_logout"),
           EarlyResponse(() => {User.logUserOut; S.redirectTo(S.referer openOr "/")}),
@@ -222,17 +222,15 @@
     LiftRules.early.append(makeUtf8)
 
     //JMX
-    if (Props.getBool("jmx.enable", false))
-      StatsMBean("org.apache.esme.stats")
+    //if (Props.getBool("jmx.enable", false))
+    //  StatsMBean("org.apache.esme.stats")
       
-    Stats.makeGauge("users") {Distributor.getUsersCount}
-    Stats.makeGauge("listener") {Distributor.getListenersCount}
+    Stats.addGauge("users") {Distributor.getUsersCount}
+    Stats.addGauge("listener") {Distributor.getListenersCount}
 
     val runtime = new RuntimeEnvironment(getClass)
-    val config = new Config
-    config("admin_text_port") = Props.getInt("admin_text_port") openOr 9989
-    config("admin_http_port") = Props.getInt("admin_http_port") openOr 9990
-    ServiceTracker.startAdmin(config, runtime)
+    val adminService = new AdminHttpService(Props.getInt("admin_http_port") openOr 9990, 0, runtime)
+    adminService.start()
 
     // start Scala Actors used in ESME
     Distributor.touch
diff --git a/server/src/main/scala/org/apache/esme/actor/MessagePullActor.scala b/server/src/main/scala/org/apache/esme/actor/MessagePullActor.scala
index f62af63..e57b7e0 100644
--- a/server/src/main/scala/org/apache/esme/actor/MessagePullActor.scala
+++ b/server/src/main/scala/org/apache/esme/actor/MessagePullActor.scala
@@ -24,7 +24,7 @@
 import actor._
 import org.apache.esme.actor.Distributor.{UserCreatedMessage=>Msg}
 //import com.twitter.stats.Stats
-import com.twitter.ostrich.Stats
+import com.twitter.ostrich.stats.Stats
 
 object MessagePullActor extends LiftActor {
   
diff --git a/server/src/main/scala/org/apache/esme/actor/SchedulerActor.scala b/server/src/main/scala/org/apache/esme/actor/SchedulerActor.scala
index 5fc395b..4c4c082 100755
--- a/server/src/main/scala/org/apache/esme/actor/SchedulerActor.scala
+++ b/server/src/main/scala/org/apache/esme/actor/SchedulerActor.scala
@@ -26,7 +26,7 @@
 import net.liftweb.util._
 import Helpers._
 import net.liftweb.common._
-import com.twitter.ostrich.Stats
+import com.twitter.ostrich.stats.Stats
 
 
 object SchedulerActor extends LiftActor{
diff --git a/server/src/main/scala/org/apache/esme/actor/UserActor.scala b/server/src/main/scala/org/apache/esme/actor/UserActor.scala
index 5e14cd9..407b7bf 100644
--- a/server/src/main/scala/org/apache/esme/actor/UserActor.scala
+++ b/server/src/main/scala/org/apache/esme/actor/UserActor.scala
@@ -33,7 +33,7 @@
 import java.util.{TimeZone, Calendar}
 import scala.xml.{Node, Elem}
 //import com.twitter.stats.Stats
-import com.twitter.ostrich.Stats
+import com.twitter.ostrich.stats.Stats
 
 object UserActor {
   private[actor] case class StartMeUp(user: Long)
diff --git a/server/src/main/scala/org/apache/esme/lib/AccessPoolMgr.scala b/server/src/main/scala/org/apache/esme/lib/AccessPoolMgr.scala
index c3485a4..402fe4d 100755
--- a/server/src/main/scala/org/apache/esme/lib/AccessPoolMgr.scala
+++ b/server/src/main/scala/org/apache/esme/lib/AccessPoolMgr.scala
@@ -60,11 +60,11 @@
 
   val menuItems =
   Menu(Loc("accessPools", new Link("pools_view" :: Nil, true)/*List("pools_view", "index")*/, S.?("base_pool_menu"), ifIsLoggedIn,
-           Loc.Snippet("addPool", addPool),
-           Loc.Snippet("editPool", editPool),
-           Loc.Snippet("poolUsers", displayPoolUsers),
-  		   Loc.Snippet("poolDetail", displayPoolDetail)//regist snippet for pool detail display
-          ,Loc.Snippet("myPools", myPoolsWithRoles)          
+           Loc.Snippet("addPool", addPool _),
+           Loc.Snippet("editPool", editPool _),
+           Loc.Snippet("poolUsers", displayPoolUsers _),
+  		   Loc.Snippet("poolDetail", displayPoolDetail _)//regist snippet for pool detail display
+          ,Loc.Snippet("myPools", myPoolsWithRoles _)
   		)) ::
   Nil
 
diff --git a/server/src/main/scala/org/apache/esme/lib/ActionMgr.scala b/server/src/main/scala/org/apache/esme/lib/ActionMgr.scala
index 72a926a..d6c185e 100644
--- a/server/src/main/scala/org/apache/esme/lib/ActionMgr.scala
+++ b/server/src/main/scala/org/apache/esme/lib/ActionMgr.scala
@@ -61,8 +61,8 @@
   val menuItems:List[Menu] = {
     if(Props.get("esme.enable_actions").openOr("true") == "true") {
       Menu(Loc("actionMgt", List("action_view", "index"), S.?("base_actions_menu"), ifIsLoggedIn,
-           Loc.Snippet("displayActions", displayActions),
-           Loc.Snippet("main", mainActions))) :: Nil     
+           Loc.Snippet("displayActions", displayActions _),
+           Loc.Snippet("main", mainActions _))) :: Nil
     } else {
       List()
     }   
diff --git a/server/src/main/scala/org/apache/esme/lib/AuthMgr.scala b/server/src/main/scala/org/apache/esme/lib/AuthMgr.scala
index 9cfe83a..26aeb5c 100755
--- a/server/src/main/scala/org/apache/esme/lib/AuthMgr.scala
+++ b/server/src/main/scala/org/apache/esme/lib/AuthMgr.scala
@@ -57,8 +57,8 @@
   val menuItems:List[Menu] = {
     if(Props.get("esme.enable_tokens").openOr("true") == "true") {
       Menu(Loc("authToken", List("auth_view", "index"), S.?("base_token_menu"), ifIsLoggedIn,
-           Loc.Snippet("displayTokens", displayTokens),
-           Loc.Snippet("main", mainTokens))) :: Nil   
+           Loc.Snippet("displayTokens", displayTokens _),
+           Loc.Snippet("main", mainTokens _))) :: Nil
     } else {
       List()
     }     
diff --git a/server/src/main/scala/org/apache/esme/lib/ConversationMgr.scala b/server/src/main/scala/org/apache/esme/lib/ConversationMgr.scala
index 7ae8c29..3304d94 100755
--- a/server/src/main/scala/org/apache/esme/lib/ConversationMgr.scala
+++ b/server/src/main/scala/org/apache/esme/lib/ConversationMgr.scala
@@ -50,7 +50,7 @@
 
   val menuItems =
   Menu(Loc("conversation", List("info_view", "conversation"), S.?("base_conv_menu"), ifIsLoggedIn,
-           Loc.Snippet("conv_info", convInfo))) :: Nil         
+           Loc.Snippet("conv_info", convInfo _))) :: Nil
   
   def convInfo(in: NodeSeq): NodeSeq = {  
 
diff --git a/server/src/main/scala/org/apache/esme/lib/MsgParser.scala b/server/src/main/scala/org/apache/esme/lib/MsgParser.scala
index b842f1f..194406e 100644
--- a/server/src/main/scala/org/apache/esme/lib/MsgParser.scala
+++ b/server/src/main/scala/org/apache/esme/lib/MsgParser.scala
@@ -72,12 +72,6 @@
                        atName | hashTag | charBlock)
   }
 
-  val punctRegex = java.util.regex.Pattern.compile("""\p{Punct}""")
-
-  def isPunct(c: Char) = punctRegex.matcher(c.toString).matches
-
-  lazy val punct: Parser[Elem] = elem("separator", isPunct)
-
   lazy val startSpace = rep(' ')
 
   lazy val userNameStr: Parser[String] = alpha ~ rep(alpha | digit | '_') ^^ {
@@ -256,8 +250,6 @@
 
   lazy val spaceEOF = rep(' ') ~ EOF
 
-  lazy val spacePunctOrEnd: Parser[Boolean] = (EOL | ' ' | punct) ^^^ true
-
   lazy val EOF: Parser[Elem] = elem("EOF", isEof _)
 
   def perform(in: String): Box[Performances] = _perform(in) match {
diff --git a/server/src/main/scala/org/apache/esme/lib/ProfileMgr.scala b/server/src/main/scala/org/apache/esme/lib/ProfileMgr.scala
index 35111af..dddd136 100755
--- a/server/src/main/scala/org/apache/esme/lib/ProfileMgr.scala
+++ b/server/src/main/scala/org/apache/esme/lib/ProfileMgr.scala
@@ -55,7 +55,7 @@
 
   val menuItems =
   Menu(Loc("profile", List("profile_view", "edit"), S.?("base_profile_menu"), ifIsLoggedIn,
-           Loc.Snippet("editProfile", editProfile))) ::
+           Loc.Snippet("editProfile", editProfile _))) ::
   Nil
 
   def editProfile(in: NodeSeq): NodeSeq = {
diff --git a/server/src/main/scala/org/apache/esme/lib/SearchMgr.scala b/server/src/main/scala/org/apache/esme/lib/SearchMgr.scala
index bd39c4d..d57bdac 100755
--- a/server/src/main/scala/org/apache/esme/lib/SearchMgr.scala
+++ b/server/src/main/scala/org/apache/esme/lib/SearchMgr.scala
@@ -50,8 +50,8 @@
 
   val menuItems =
   Menu(Loc("search", List("info_view", "search"), S.?("base_menu_search"), ifIsLoggedIn,
-           Loc.Snippet("display_search", displaySearch),
-           Loc.Snippet("searchTerm", searchTerm))) ::
+           Loc.Snippet("display_search", displaySearch _),
+           Loc.Snippet("searchTerm", searchTerm _))) ::
   Nil                                        
   
   def searchTerm(in: NodeSeq): NodeSeq = {
diff --git a/server/src/main/scala/org/apache/esme/lib/StreamMgr.scala b/server/src/main/scala/org/apache/esme/lib/StreamMgr.scala
index 2369680..737b677 100755
--- a/server/src/main/scala/org/apache/esme/lib/StreamMgr.scala
+++ b/server/src/main/scala/org/apache/esme/lib/StreamMgr.scala
@@ -59,7 +59,7 @@
 
   val menuItems =
   Menu(Loc("streams", List("info_view", "streams"), S.?("base_streams_menu"), ifIsLoggedIn,
-           Loc.Snippet("stream_display", StreamDisplay.display))) ::
+           Loc.Snippet("stream_display", StreamDisplay.display _))) ::
   Nil
 
 }
diff --git a/server/src/main/scala/org/apache/esme/lib/TrackMgr.scala b/server/src/main/scala/org/apache/esme/lib/TrackMgr.scala
index a2a0c95..af188f6 100755
--- a/server/src/main/scala/org/apache/esme/lib/TrackMgr.scala
+++ b/server/src/main/scala/org/apache/esme/lib/TrackMgr.scala
@@ -54,8 +54,8 @@
   val menuItems:List[Menu] = {
     if(Props.get("esme.enable_tracks").openOr("true") == "true") {
       Menu(Loc("trackMgt", List("track_view", "index"), S.?("base_track_menu"), ifIsLoggedIn,
-             Loc.Snippet("displayTracking", displayTracking),
-             Loc.Snippet("main", mainTracking))) :: Nil
+             Loc.Snippet("displayTracking", displayTracking _),
+             Loc.Snippet("main", mainTracking _))) :: Nil
     } else {
       List()
     }      
diff --git a/server/src/main/scala/org/apache/esme/lib/UserMgr.scala b/server/src/main/scala/org/apache/esme/lib/UserMgr.scala
index e1ce8f5..223344c 100644
--- a/server/src/main/scala/org/apache/esme/lib/UserMgr.scala
+++ b/server/src/main/scala/org/apache/esme/lib/UserMgr.scala
@@ -50,7 +50,7 @@
 
   val menuItems =
   Menu(Loc("list_users", List("info_view", "users"), S.?("base_users_menu"), ifIsLoggedIn,
-           Loc.Snippet("displayUsers", displayUsers))) ::
+           Loc.Snippet("displayUsers", displayUsers _))) ::
   Nil
 
   def displayUsers(in: NodeSeq): NodeSeq = {
diff --git a/server/src/main/scala/org/apache/esme/model/User.scala b/server/src/main/scala/org/apache/esme/model/User.scala
index 4635479..4f75d81 100644
--- a/server/src/main/scala/org/apache/esme/model/User.scala
+++ b/server/src/main/scala/org/apache/esme/model/User.scala
@@ -43,7 +43,7 @@
 import java.net.URL
 import java.util.logging._
 //import com.twitter.stats.Stats
-import com.twitter.ostrich.Stats
+import com.twitter.ostrich.stats.Stats
 
 object User extends User with KeyedMetaMapper[Long, User] with Loggable {
   override def afterSave = profileChanged _ :: notifyActors _ :: super.afterSave
diff --git a/server/src/test/scala/org/apache/esme/api/API2Test.scala b/server/src/test/scala/org/apache/esme/api/API2Test.scala
index 37d6607..9bf5e97 100644
--- a/server/src/test/scala/org/apache/esme/api/API2Test.scala
+++ b/server/src/test/scala/org/apache/esme/api/API2Test.scala
@@ -39,6 +39,8 @@
 object Api2SpecsRunner extends ConsoleRunner(Api2Specs)

 

 object Api2Specs extends Specification with TestKit {

+  //noDetailedDiffs()

+

   JettyTestServer.start

 

   val baseUrl = JettyTestServer.urlFor("/api2/")