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" />