Author: vdichev
Date: Sat Jul  4 18:48:54 2009
New Revision: 791160

URL: http://svn.apache.org/viewvc?rev=791160&view=rev
Log:
ESME-75 Scala interpreter action

Added:
    
incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/ScalaInterpreter.scala
   (with props)
Modified:
    incubator/esme/trunk/server/pom.xml
    incubator/esme/trunk/server/src/main/scala/bootstrap/liftweb/Boot.scala
    
incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/UserActor.scala
    
incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/MsgParser.scala
    
incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Action.scala
    
incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Mailbox.scala
    incubator/esme/trunk/server/src/main/webapp/action_view/index.html

Modified: incubator/esme/trunk/server/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/esme/trunk/server/pom.xml?rev=791160&r1=791159&r2=791160&view=diff
==============================================================================
--- incubator/esme/trunk/server/pom.xml (original)
+++ incubator/esme/trunk/server/pom.xml Sat Jul  4 18:48:54 2009
@@ -179,7 +179,7 @@
       <groupId>org.scala-lang</groupId>
       <artifactId>scala-compiler</artifactId>
       <version>${scala.version}</version>
-      <scope>test</scope>
+      <!--<scope>test</scope>-->
     </dependency>
     <dependency>
       <groupId>org.apache.lucene</groupId>

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=791160&r1=791159&r2=791160&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 Sat 
Jul  4 18:48:54 2009
@@ -143,6 +143,7 @@
     Distributor.touch
     SchedulerActor.touch
     MessagePullActor.touch
+    ScalaInterpreter.touch
 
     Action.findAll(By(Action.disabled, false), By(Action.removed, 
false)).foreach {
       _.startActors

Added: 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/ScalaInterpreter.scala
URL: 
http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/ScalaInterpreter.scala?rev=791160&view=auto
==============================================================================
--- 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/ScalaInterpreter.scala
 (added)
+++ 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/ScalaInterpreter.scala
 Sat Jul  4 18:48:54 2009
@@ -0,0 +1,84 @@
+/**
+ * Copyright 2008-2009 WorldWide Conferencing, LLC
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.esme.actor
+
+import java.io.PrintWriter
+import scala.tools.nsc.Interpreter
+import scala.tools.nsc.Settings
+
+import scala.actors.Actor
+import scala.actors.Actor._
+
+import org.apache.esme.model._
+import net.liftweb.util.{Empty,Props}
+
+object ScalaInterpreter extends Actor{
+
+  val settings = new Settings()
+  val origBootclasspath = settings.bootclasspath.value
+  lazy val pathList = List(jarPathOfClass("scala.tools.nsc.Interpreter"),
+                           jarPathOfClass("scala.ScalaObject"))
+
+  def act = loop {
+    react {
+      case ScalaExcerpt(from, replyTo, pool, code) =>
+      settings.bootclasspath.value = (origBootclasspath :: 
pathList).mkString(java.io.File.separator)
+      actor {
+        val out = new java.io.StringWriter()
+        val interpreter = new Interpreter(settings, new PrintWriter(out))
+        interpreter.interpret(code)
+        Message.create.author(from).
+                       when(System.currentTimeMillis).
+                       source("scala").
+                       replyTo(replyTo).
+                       pool(pool).
+                       setTextAndTags(out.toString, Nil, Empty).
+                       foreach{ msg =>
+                         if (msg.save) {
+                           Distributor ! Distributor.AddMessageToMailbox(from, 
msg, InterpreterReason(from))
+                         }
+                       }
+      }
+        
+    }
+  }
+  
+  if (Props.getBool("actions.scala_interpreter.enable", false))
+    start
+  
+  // do nothing
+  def touch {
+  }
+  
+  def jarPathOfClass(className: String) = {
+    val resource = className.split('.').mkString("/", "/", ".class")
+    val path = getClass.getResource(resource).getPath
+    val indexOfFile = path.indexOf("file:")
+    val indexOfSeparator = path.lastIndexOf('!')
+    path.substring(indexOfFile, indexOfSeparator)
+
+    // potentially problematic with e.g. OSGi:
+    // Class.forName(className).getProtectionDomain.getCodeSource.getLocation
+  }
+ 
+  case class ScalaExcerpt(from: Long, replyTo: Long, pool: Long, code: String)
+}

Propchange: 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/ScalaInterpreter.scala
------------------------------------------------------------------------------
    svn:executable = *

Modified: 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/UserActor.scala
URL: 
http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/UserActor.scala?rev=791160&r1=791159&r2=791160&view=diff
==============================================================================
--- 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/UserActor.scala
 (original)
+++ 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/actor/UserActor.scala
 Sat Jul  4 18:48:54 2009
@@ -222,6 +222,7 @@
           case UnfollowedReason(unfollowerId) => mb.unfollowed(unfollowerId)
           case ProfileReason(moduserId) => mb.profile(moduserId)
           case RegularReason(actionId) => mb.regular(actionId)
+          case InterpreterReason(userId) => mb.interpreter(userId)
           case NoReason =>
         }
         mb.saveMe
@@ -249,6 +250,9 @@
               Distributor.AddMessageToMailbox(id, msg, ResendReason(userId))
 
             case FetchFeed(url) => MessagePullActor ! 
MessagePullActor.Fetch(td.performId)
+            
+            case ScalaInterpret => if (msg.source.is != "scala")
+              ScalaInterpreter ! ScalaInterpreter.ScalaExcerpt(userId, 
msg.id.is, msg.pool.is, msg.getText)
 
             case PerformFilter => // IGNORE
           }

Modified: 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/MsgParser.scala
URL: 
http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/MsgParser.scala?rev=791160&r1=791159&r2=791160&view=diff
==============================================================================
--- 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/MsgParser.scala 
(original)
+++ 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/MsgParser.scala 
Sat Jul  4 18:48:54 2009
@@ -216,7 +216,8 @@
         HttpTo(protocol + urlpart, userPass._1, userPass._2, hdrs, data)
     }) |
   (acceptCI("atom:") ~> httpUrl <~ EOF ^^ {url => 
FetchAtom(UrlStore.make(url))}) |
-  (acceptCI("rss:") ~> httpUrl <~ EOF ^^ {url => FetchRss(UrlStore.make(url))})
+  (acceptCI("rss:") ~> httpUrl <~ EOF ^^ {url => 
FetchRss(UrlStore.make(url))}) |
+  (acceptCI("scala") ~ lineSpace ~ EOF ^^^ ScalaInterpret)
 
   lazy val httpHeader: Parser[(String, String)] = EOL ~ accept("header:") ~
   lineSpace ~> rep1(uchar) ~ '=' ~ rep1(uchar) ^^ {

Modified: 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Action.scala
URL: 
http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Action.scala?rev=791160&r1=791159&r2=791160&view=diff
==============================================================================
--- 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Action.scala 
(original)
+++ 
incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Action.scala 
Sat Jul  4 18:48:54 2009
@@ -449,3 +449,4 @@
 case class FetchRss(override val url: UrlStore) extends FetchFeed(url)
 case object PerformResend extends Performances
 case object PerformFilter extends Performances
+case object ScalaInterpret extends Performances

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=791160&r1=791159&r2=791160&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 
Sat Jul  4 18:48:54 2009
@@ -61,6 +61,7 @@
   object unfollowed extends MappedLongForeignKey(this, User)
   object profile extends MappedLongForeignKey(this, User)
   object regular extends MappedLongForeignKey(this, Action)
+  object interpreter extends MappedLongForeignKey(this, User)
 
   lazy val reason: MailboxReason =
   viaTrack.can.map(TrackReason) or directlyFrom.can.map(DirectReason)  or
@@ -100,3 +101,6 @@
 case class RegularReason(actionId: Long) extends MailboxReason {
   def attr = new UnprefixedAttribute("regular", actionId.toString, Null)
 }
+case class InterpreterReason(userId: Long) extends MailboxReason {
+  def attr = new UnprefixedAttribute("interpreter", userId.toString, Null)
+}

Modified: incubator/esme/trunk/server/src/main/webapp/action_view/index.html
URL: 
http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/action_view/index.html?rev=791160&r1=791159&r2=791160&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/action_view/index.html 
(original)
+++ incubator/esme/trunk/server/src/main/webapp/action_view/index.html Sat Jul  
4 18:48:54 2009
@@ -52,7 +52,8 @@
           followed -- user is being followed<br/>
           unfollowed -- user is being unfollowed<br/>
           profile -- user changed profile<br/>
-          every N mins -- repeat action, N is an integer
+          every N mins -- repeat action, N is an integer<br/>
+          pool:mypool -- message is in access pool mypool
         </td>
       </tr>
 
@@ -65,7 +66,8 @@
           mailto:[email protected] -- sends the message to [email protected]<br/>
           http://foo.com/message/in -- HTTP post, %s expands to message<br/>
           atom:http://blog.com/feed.atom -- posts new messages from Atom 
feed<br/>
-          rss:http://blog.com/feed.rss -- posts new messages from RSS feed
+          rss:http://blog.com/feed.rss -- posts new messages from RSS feed<br/>
+          scala -- proccess message text in Scala interpreter
         </td>
       </tr>
       <input type="submit" value="Add" />


Reply via email to