You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@esme.apache.org by es...@apache.org on 2010/10/10 20:07:49 UTC

svn commit: r1006328 - in /incubator/esme/trunk/server: ./ src/main/resources/props/ src/main/scala/bootstrap/liftweb/ src/main/scala/org/apache/esme/actor/ src/main/scala/org/apache/esme/lib/ src/main/scala/org/apache/esme/model/ src/main/scala/org/ap...

Author: esjewett
Date: Sun Oct 10 18:07:49 2010
New Revision: 1006328

URL: http://svn.apache.org/viewvc?rev=1006328&view=rev
Log:
Merge tagandconversationfollow branch into trunk

Added:
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/ConvDistributor.scala
      - copied unchanged from r1006324, incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/actor/ConvDistributor.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/TagDistributor.scala
      - copied unchanged from r1006324, incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/actor/TagDistributor.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/UserConvFollow.scala
      - copied unchanged from r1006324, incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/UserConvFollow.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/UserTagFollow.scala
      - copied unchanged from r1006324, incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/UserTagFollow.scala
Modified:
    incubator/esme/trunk/server/   (props changed)
    incubator/esme/trunk/server/src/main/resources/props/compass.filesystem.cfg.xml   (props changed)
    incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/Distributor.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/ConversationMgr.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/ProfileMgr.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Mailbox.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Message.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/MessageTag.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Tag.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/User.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/snippet/TagDisplay.scala
    incubator/esme/trunk/server/src/main/webapp/info_view/conversation.html
    incubator/esme/trunk/server/src/main/webapp/info_view/tag.html

Propchange: incubator/esme/trunk/server/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Oct 10 18:07:49 2010
@@ -1,3 +1,4 @@
 /incubator/esme/branches/lift-2.0/server:928728-939625
 /incubator/esme/branches/metadata:966215-979767
+/incubator/esme/branches/tagandconversationfollow:966215-1006324
 /incubator/esme/branches/ui-2010-03-05:919339-923098

Propchange: incubator/esme/trunk/server/src/main/resources/props/compass.filesystem.cfg.xml
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Oct 10 18:07:49 2010
@@ -1 +1,2 @@
 /incubator/esme/branches/metadata/src/main/resources/props/compass.filesystem.cfg.xml:966215-979767
+/incubator/esme/branches/tagandconversationfollow/src/main/resources/props/compass.filesystem.cfg.xml:966215-1006324

Modified: incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala Sun Oct 10 18:07:49 2010
@@ -83,7 +83,7 @@ class Boot {
 
     if (Props.mode == Props.RunModes.Test) {
       Schemifier.destroyTables_!!(Log.infoF _, User, ExtSession,
-        Message, Mailbox, Tag,
+        Message, Mailbox, Tag, UserTagFollow, UserConvFollow,
         Relationship, MessageTag,
         AuthToken, UrlStore, Tracking,
         Action, AccessPool,
@@ -91,7 +91,7 @@ class Boot {
     }
 
     Schemifier.schemify(true, Log.infoF _, User, ExtSession, Message,
-      Mailbox, Tag,
+      Mailbox, Tag, UserTagFollow, UserConvFollow,
       Relationship, MessageTag, AuthToken,
       UrlStore, Tracking, Action, 
       AccessPool, Privilege, UserAuth, UserCryptoSig)
@@ -233,7 +233,9 @@ class Boot {
     // start Scala Actors used in ESME
     Distributor.touch
     SchedulerActor.touch
-    MessagePullActor.touch
+    MessagePullActor.touch   
+    TagDistributor.touch  
+    ConvDistributor.touch
     // ScalaInterpreter.touch
 
 

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/Distributor.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/Distributor.scala?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/Distributor.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/Distributor.scala Sun Oct 10 18:07:49 2010
@@ -74,7 +74,9 @@ object Distributor extends LiftActor {
 
       case nm @ NewMessage(msg) =>
         val toSend = UserActor.TestForTracking(msg)
-        users.values.foreach(_ ! toSend)
+        users.values.foreach(_ ! toSend) 
+        TagDistributor ! nm      
+        ConvDistributor ! nm
         listeners.foreach(_ ! nm)    
 
       case UpdateTrackingFor(userId, ttype) =>

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/ConversationMgr.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/ConversationMgr.scala?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/ConversationMgr.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/ConversationMgr.scala Sun Oct 10 18:07:49 2010
@@ -49,24 +49,59 @@ object ConversationMgr {
 
   val menuItems =
   Menu(Loc("conversation", List("info_view", "conversation"), S.?("base_conv_menu"), ifIsLoggedIn,
-           Loc.Snippet("displayConversation", displayConversation))) ::
-  Nil
-
-  def displayConversation(in: NodeSeq): NodeSeq = {
-
-    val jsId = "timeline_messages"                  
+           Loc.Snippet("conv_info", convInfo))) ::
+  Nil         
+  
+  def convInfo(in: NodeSeq): NodeSeq = {  
 
     val cid = S.param("cid").map(toLong).openOr(-1L)
+    val messages = Message.findMessages(List(cid))   
+    val user = User.currentUser  
 
-    val msgs = Message.findAndPrime(By(Message.conversation, cid),
-                                    OrderBy(Message.id, Descending))
-
-    Script(
-      OnLoad(JsCrVar(jsId, JsArray(
-          msgs.map(m => JsObj(("message", m.asJs)) ) :_*)) &
-      JsFunc(" displayMessages", JsVar(jsId), jsId).cmd)
-    )
-
-  }
-
+    def followOrUnfollow: NodeSeq = {          
+      val ret: Box[NodeSeq] = for { 
+        u <- user
+        m = messages.values.toList.first
+      } yield {                 
+        if (!m.followers.contains(u)) {
+          ajaxButton("Follow conversation", () => {  
+            m.followers += u
+            m.save       
+            updateFollow
+          })
+        } else {
+          ajaxButton("Unfollow conversation", () => {    
+            m.followers -= u
+            m.save
+            updateFollow
+          })
+        }  
+      }
+                         
+      ret.open_!                                     
+    }      
+    
+    def displayConversation(in: NodeSeq): NodeSeq = {
+
+      val jsId = "timeline_messages"                  
+
+      val cid = S.param("cid").map(toLong).openOr(-1L)
+
+      val msgs = Message.findAndPrime(By(Message.conversation, cid),
+                                      OrderBy(Message.id, Descending))
+
+      Script(
+        OnLoad(JsCrVar(jsId, JsArray(
+            msgs.map(m => JsObj(("message", m.asJs)) ) :_*)) &
+        JsFunc(" displayMessages", JsVar(jsId), jsId).cmd)
+      )
+
+    }
+
+    def updateFollow: JsCmd = SetHtml("following", followOrUnfollow)
+
+    bind("conv", in, 
+         "followButton" -> followOrUnfollow,
+         "displayConversation" -> displayConversation _ )       
+  }                                
 }

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/ProfileMgr.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/ProfileMgr.scala?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/ProfileMgr.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/ProfileMgr.scala Sun Oct 10 18:07:49 2010
@@ -140,7 +140,7 @@ object ProfileMgr {
                        "password" -%> password(pwd, p => pwd = p.trim),
                        "confirm" -%> password(pwd, p => checkEmailPassword(p.trim)),
                        "openid" -%> text(openIdUrl, registerOpenID(_)),
-                       "save" -%> submit("Save", user.save))
+                       "save" -%> submit("Save", user.save _))
     }).getOrElse(NodeSeq.Empty)
 
   }

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Mailbox.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Mailbox.scala?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Mailbox.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Mailbox.scala Sun Oct 10 18:07:49 2010
@@ -102,6 +102,12 @@ case class DirectReason(fromUserId: Long
 }
 case class ConversationReason(conversationId: Long) extends MailboxReason {
   def attr = new UnprefixedAttribute("conversation", conversationId.toString, Null)
+}                                                                                 
+case class TagFollowReason(tagName: String) extends MailboxReason {
+  def attr = new UnprefixedAttribute("tag", tagName, Null)
+}            
+case class ConvFollowReason(convId: Long) extends MailboxReason {
+  def attr = new UnprefixedAttribute("conversation", convId, Null)
 }
 case class LoginReason(userId: Long) extends MailboxReason {
   def attr = new UnprefixedAttribute("login", userId.toString, Null)

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Message.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Message.scala?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Message.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Message.scala Sun Oct 10 18:07:49 2010
@@ -279,7 +279,7 @@ object Message extends Message with Long
 
 
 @Searchable
-class Message extends LongKeyedMapper[Message] {
+class Message extends LongKeyedMapper[Message] with ManyToMany {
   import Message._
   
   def getSingleton = Message // what's the "meta" server
@@ -324,7 +324,9 @@ class Message extends LongKeyedMapper[Me
 
   object replyTo extends MappedLongForeignKey(this, Message)
 
-  object conversation extends MappedLongForeignKey(this, Message)
+  object conversation extends MappedLongForeignKey(this, Message)  
+  
+  object followers extends MappedManyToMany(UserConvFollow, UserConvFollow.conversation, UserConvFollow.user, User) 
 
   object pool extends MappedLongForeignKey(this, AccessPool) {
     override def asJs = 

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/MessageTag.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/MessageTag.scala?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/MessageTag.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/MessageTag.scala Sun Oct 10 18:07:49 2010
@@ -36,7 +36,7 @@ class MessageTag extends LongKeyedMapper
   object id extends MappedLongIndex(this)
   
   object message extends MappedLongForeignKey(this, Message)
-  object tag extends MappedLongForeignKey(this, Tag) // MappedText(this)
+  object tag extends MappedLongForeignKey(this, Tag)
   object sentTo extends MappedLongForeignKey(this, User)
   object url extends MappedLongForeignKey(this, UrlStore)
 }

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Tag.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Tag.scala?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Tag.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Tag.scala Sun Oct 10 18:07:49 2010
@@ -61,12 +61,14 @@ object Tag extends Tag with MetaProtoTag
   
 }
 
-class Tag extends ProtoTag[Tag] {
-  def getSingleton = Tag // what's the "meta" server
+class Tag extends ProtoTag[Tag] with ManyToMany {
+  def getSingleton = Tag // what's the "meta" server    
   
   def findMessages(): List[Message] =
   Message.findAndPrime(In.fk(MessageTag.message, By(MessageTag.tag, this)),
 		       OrderBy(Message.id, Descending))
 
-  override def toXml = <tag id={id.is.toString} name={name.is}>{"#" + name.is}</tag>
-}
+  override def toXml = <tag id={id.is.toString} name={name.is}>{"#" + name.is}</tag>    
+                                                                                           
+  object followers extends MappedManyToMany(UserTagFollow, UserTagFollow.tag, UserTagFollow.user, User)                                                                                         
+}               

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/User.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/User.scala?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/User.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/User.scala Sun Oct 10 18:07:49 2010
@@ -198,7 +198,7 @@ object User extends User with KeyedMetaM
 /**
  * An O-R mapped "User" class that includes first name, last name, password
  */
-class User extends KeyedMapper[Long, User] with UserIdAsString {// OpenIDProtoUser[User] {
+class User extends KeyedMapper[Long, User] with UserIdAsString with ManyToMany {// OpenIDProtoUser[User] {
   import S._
 
   def getSingleton = User // what's the "meta" server
@@ -400,5 +400,9 @@ class User extends KeyedMapper[Long, Use
 
   def timezoneDisplayName = S.?("base_user_ui_timezone")
 
-  def localeDisplayName = S.?("base_user_ui_locale")
+  def localeDisplayName = S.?("base_user_ui_locale")  
+  
+  object tagsfollowing extends MappedManyToMany(UserTagFollow, UserTagFollow.user, UserTagFollow.tag, Tag)
+  
+  object convsfollowing extends MappedManyToMany(UserConvFollow, UserConvFollow.user, UserConvFollow.conversation, Message) 
 }

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/snippet/TagDisplay.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/snippet/TagDisplay.scala?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/snippet/TagDisplay.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/snippet/TagDisplay.scala Sun Oct 10 18:07:49 2010
@@ -82,17 +82,47 @@ object TagDisplay {
            "date" -> Text(new Date(m.when.is).toString))
     }
 
-  def display(in: NodeSeq): NodeSeq = {
-    val name = (S.param("tag") openOr "N/A").trim
+  def display(in: NodeSeq): NodeSeq = {  
+  
+    val name = (S.param("tag") openOr "N/A").trim 
+    
+    val tag = Tag.findAll(By(Tag.name, name))
+    val user = User.currentUser
 
     val tagList: List[Message] =
     for {
-      tag <- Tag.findAll(By(Tag.name, name))
-      item <- tag.findMessages()
-    } yield item
+      t <- tag
+      item <- t.findMessages()
+    } yield item   
+    
+    def followOrUnfollow: NodeSeq = {          
+      val ret: Box[NodeSeq] = for { 
+        u <- user
+        t = tag.first
+      } yield {                 
+        if (!t.followers.contains(u)) {
+          ajaxButton("Follow tag", () => {  
+            t.followers += u
+            t.save       
+            updateFollow
+          })
+        } else {
+          ajaxButton("Unfollow tag", () => {    
+            t.followers -= u
+            t.save
+            updateFollow
+          })
+        }  
+      }
+                             
+      ret.open_!                                      
+    }  
+    
+    def updateFollow: JsCmd = SetHtml("following", followOrUnfollow)
 
     bind("tag", in, "name" -> name,
-         "each" -> bindTag(tagList) _)
+         "each" -> bindTag(tagList) _,
+         "followButton" -> followOrUnfollow )
 
-  }
+  }  
 }

Modified: incubator/esme/trunk/server/src/main/webapp/info_view/conversation.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/info_view/conversation.html?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/info_view/conversation.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/info_view/conversation.html Sun Oct 10 18:07:49 2010
@@ -17,24 +17,25 @@
  under the License.                                           *
 -->
 <lift:surround with="base" at="left">
-    <lift:TableSorterSnip/>
-    <link rel="stylesheet" type="text/css" href="../style/style.css" />
-<head>
-        <script src="../scripts/display_messages.js" type="text/javascript"/> 
-        <script src="../scripts/pretty.js" type="text/javascript"/> 
-</head>
-
-<div id="back-header">
-	<h1><lift:loc>ui_default_conversation</lift:loc></h1>
-	<div class="container-aux">
-        <div>
-            <lift:displayConversation/>
-	    <lift:embed what="templates-hidden/message_core"/>
-        </div>
-	</div><!--container-settings-->
+  <lift:TableSorterSnip/>
+  <link rel="stylesheet" type="text/css" href="../style/style.css" />
+  <head>
+    <script src="../scripts/display_messages.js" type="text/javascript"/> 
+    <script src="../scripts/pretty.js" type="text/javascript"/> 
+  </head>
+                   
+  <div id="back-header">  
+    <lift:conv_info>
+    <h1><lift:loc>ui_default_conversation</lift:loc></h1>
+    <div class="container-aux">        
+      <span id="following"><conv:followButton/></span>
+      <div>
+        <conv:displayConversation/>
+        <lift:embed what="templates-hidden/message_core"/>
+      </div>
+    </div><!--container-settings-->    
+    </lift:conv_info>
 	</div>
-
-	<!-- End demo -->    
 </lift:surround>
 
 

Modified: incubator/esme/trunk/server/src/main/webapp/info_view/tag.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/info_view/tag.html?rev=1006328&r1=1006327&r2=1006328&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/info_view/tag.html (original)
+++ incubator/esme/trunk/server/src/main/webapp/info_view/tag.html Sun Oct 10 18:07:49 2010
@@ -22,7 +22,8 @@
     <lift:tag_display>
 <div id="back-header">
 	<h1><lift:loc>ui_tag_title</lift:loc><i> '<tag:name/>'</i></h1>
-<div class="container-settings">
+<div class="container-settings">    
+      <span id="following"><tag:followButton/></span> 
 
               <table id="esme-table" class="tablesorter">
             <thead>