added monadic ops to TransactionalRef, fixed bug with nested txs

This commit is contained in:
jboner 2009-09-17 09:47:22 +02:00
parent 3be193904d
commit 2998fa4dbc
11 changed files with 265 additions and 231 deletions

View file

@ -342,7 +342,6 @@ trait Actor extends Logging with TransactionManagement {
if (!linkedActors.contains(actor)) throw new IllegalStateException("Actor [" + actor + "] is not a linked actor, can't unlink")
linkedActors.remove(actor)
actor.supervisor = None
log.debug("Unlinking actor [%s] from actor [%s]", actor, this)
} else throw new IllegalStateException("Actor has not been started, you need to invoke 'actor.start' before using it")
}

View file

@ -47,7 +47,7 @@ object Multiverse {
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
object Transaction {
val idFactory = new AtomicLong(0L)
val idFactory = new AtomicLong(-1L)
// -- Monad --------------------------

View file

@ -59,6 +59,7 @@ trait TransactionManagement extends Logging {
val currentTx = cflowTx.get
currentTx.join(uuid)
activeTx = Some(currentTx)
log.debug("Joining transaction [%s]", currentTx)
}
}
@ -101,21 +102,17 @@ trait TransactionManagement extends Logging {
}
}
protected def isTransactionTopLevel = activeTx.isDefined && activeTx.get.isTopLevel
protected def isInExistingTransaction = TransactionManagement.threadBoundTx.get.isDefined
protected def isTransactionTopLevel = activeTx.isDefined && activeTx.get.isTopLevel
protected def isTransactionAborted = activeTx.isDefined && activeTx.get.isAborted
protected def incrementTransaction = if (activeTx.isDefined) activeTx.get.increment
protected def decrementTransaction = if (activeTx.isDefined) activeTx.get.decrement
protected def removeTransactionIfTopLevel = if (isTransactionTopLevel) {
activeTx = None
threadBoundTx.set(None)
setThreadLocalTransaction(null)
}
protected def removeTransactionIfTopLevel = if (isTransactionTopLevel) { activeTx = None }
protected def reenteringExistingTransaction= if (activeTx.isDefined) {
val cflowTx = threadBoundTx.get

View file

@ -15,8 +15,6 @@ import org.codehaus.aspectwerkz.proxy.Uuid
import scala.collection.mutable.{ArrayBuffer, HashMap}
/**
* Scala API.
* <p/>
* Example Scala usage:
* <pre>
* val myMap = TransactionalState.newMap
@ -29,44 +27,23 @@ import scala.collection.mutable.{ArrayBuffer, HashMap}
* val myVector = TransactionalVector()
* val myRef = TransactionalRef()
* </pre>
*/
object TransactionalState extends TransactionalState
/**
* Java API.
*
* <p/>
* Example Java usage:
* <pre>
* TransactionalState state = new TransactionalState();
* TransactionalMap myMap = state.newMap();
* TransactionalMap myMap = TransactionalState.newMap();
* </pre>
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class TransactionalState {
def newMap[K, V] = {
// new AtomicTemplate[TransactionalMap[K, V]]() {
// def execute(t: Transaction): TransactionalMap[K, V] = {
new TransactionalMap[K, V]
// }
// }.execute()
}
def newVector[T] = {
// new AtomicTemplate[TransactionalVector[T]]() {
// def execute(t: Transaction): TransactionalVector[T] = {
new TransactionalVector[T]
// }
// }.execute()
}
def newRef[T] = {
// new AtomicTemplate[TransactionalRef[T]]() {
// def execute(t: Transaction): TransactionalRef[T] = {
new TransactionalRef[T]
// }
// }.execute()
}
object TransactionalState {
def newMap[K, V] = TransactionalMap[K, V]()
def newVector[T] = TransactionalVector[T]()
def newRef[T] = TransactionalRef[T]()
}
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
@serializable
trait Transactional {
@ -74,48 +51,67 @@ trait Transactional {
val uuid = Uuid.newUuid.toString
}
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
object TransactionalRef {
/**
* An implicit conversion that converts an option to an iterable value
*/
implicit def ref2Iterable[T](ref: TransactionalRef[T]): Iterable[T] = ref.toList
def apply[T]() = new TransactionalRef[T]
}
/**
* Implements a transactional managed reference.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*
class TransactionalRef[T] extends Transactional {
protected[this] var ref: Option[Ref[T]] = None
def set(elem: T) = swap(elem)
def swap(elem: T) = {
synchronized { if (ref.isEmpty) ref = Some(new Ref[T]) }
ref.get.set(elem)
*/
class TransactionalRef[+T] extends Transactional {
private[this] val ref = new Ref[T]
def swap(elem: T) = ref.set(elem)
def get: Option[T] = {
if (ref.isNull) None
else Some(ref.get)
}
def get: Option[T] =
if (isEmpty) None
else Some(ref.get.get)
def getOrWait: T = {
synchronized { if (ref.isEmpty) ref = Some(new Ref[T]) }
ref.get.getOrAwait
def getOrWait: T = ref.getOrAwait
def getOrElse(default: => T): T = {
if (ref.isNull) default
else ref.get
}
def getOrElse(default: => T): T =
if (isEmpty) default
else ref.get.get
def isDefined: Boolean = ref.isDefined //&& !ref.get.isNull
def isDefined: Boolean = !ref.isNull
def isEmpty: Boolean = !isDefined
def isEmpty: Boolean = ref.isNull
def map[B](f: T => B): Option[B] = if (isEmpty) None else Some(f(ref.get))
def flatMap[B](f: T => Option[B]): Option[B] = if (isEmpty) None else f(ref.get)
def filter(p: T => Boolean): Option[T] = if (isEmpty || p(ref.get)) this else None
def foreach(f: T => Unit) { if (!isEmpty) f(ref.get) }
def elements: Iterator[T] = if (isEmpty) Iterator.empty else Iterator.fromValues(ref.get)
def toList: List[T] = if (isEmpty) List() else List(ref.get)
def toRight[X](left: => X) = if (isEmpty) Left(left) else Right(ref.get)
def toLeft[X](right: => X) = if (isEmpty) Right(right) else Left(ref.get)
def orElse[B >: T](alternative: => TransactionalRef[B]): TransactionalRef[B] = if (isEmpty) alternative else this
}
object TransactionalRef {
def apply[T](elem: T) = {
if (elem == null) throw new IllegalArgumentException("Can't define TransactionalRef with a null initial value, needs to be a PersistentDataStructure")
val ref = new TransactionalRef[T]
ref.swap(elem)
ref
}
object TransactionalMap {
def apply[K, V]() = new TransactionalMap[K, V]
}
*/
/**
* Implements an in-memory transactional Map based on Clojure's PersistentMap.
*
@ -163,8 +159,8 @@ class TransactionalMap[K, V] extends Transactional with scala.collection.mutable
other.hashCode == hashCode
}
object TransactionalMap {
def apply[K, V]() = new TransactionalMap[K, V]
object TransactionalVector {
def apply[T]() = new TransactionalVector
}
/**
@ -204,42 +200,3 @@ class TransactionalVector[T] extends Transactional with RandomAccessSeq[T] {
other.hashCode == hashCode
}
object TransactionalVector {
def apply[T]() = new TransactionalVector
}
class TransactionalRef[T] extends Transactional {
private[this] val ref = new Ref[T]
def swap(elem: T) =
try { ref.set(elem) } catch { case e: org.multiverse.api.exceptions.LoadTooOldVersionException => ref.set(elem) }
def get: Option[T] = {
if (ref.isNull) None
else Some(ref.get)
}
def getOrWait: T = ref.getOrAwait
def getOrElse(default: => T): T = {
if (ref.isNull) default
else ref.get
}
def isDefined: Boolean = !ref.isNull
def isEmpty: Boolean = ref.isNull
}
object TransactionalRef {
def apply[T]() = {
// new AtomicTemplate[TransactionalRef[T]]() {
// def execute(t: Transaction): TransactionalRef[T] = {
new TransactionalRef[T]
// }
// }.execute()
}
}

View file

@ -226,13 +226,12 @@ class InMemoryActorSpec extends TestCase {
val stateful = new InMemStatefulActor
stateful.start
stateful !! SetRefState("init") // set init state
/* val failer = new InMemFailerActor
val failer = new InMemFailerActor
failer.start
try {
stateful !! Failure("testShouldRollbackStateForStatefulServerInCaseOfFailure", "new state", failer) // call failing transactionrequired method
fail("should have thrown an exception")
} catch {case e: RuntimeException => {
}}
*/ assertEquals("init", (stateful !! GetRefState).get) // check that state is == init state
} catch {case e: RuntimeException => {}}
assertEquals("init", (stateful !! GetRefState).get) // check that state is == init state
}
}

View file

@ -64,7 +64,7 @@ object CassandraStorage extends MapStorage
StackPool(SocketProvider(CASSANDRA_SERVER_HOSTNAME, CASSANDRA_SERVER_PORT)),
protocol,
CONSISTENCY_LEVEL)
// ===============================================================
// For Ref
// ===============================================================

View file

@ -19,25 +19,18 @@ case class TokyoCabinetStorageConfig extends PersistentStorageConfig
case class MongoStorageConfig extends PersistentStorageConfig
/**
* Scala API.
* <p/>
* Example Scala usage:
* <pre>
* val myMap = PersistentState.newMap(CassandraStorageConfig)
* </pre>
*/
object PersistentState extends PersistentState
/**
* Java API.
* <p/>
*
* Example Java usage:
* <pre>
* PersistentState state = new PersistentState();
* TransactionalMap myMap = state.newMap(new CassandraStorageConfig());
* TransactionalMap myMap = PersistentState.newMap(new CassandraStorageConfig());
* </pre>
*/
class PersistentState {
object PersistentState {
def newMap(config: PersistentStorageConfig): PersistentMap = config match {
case CassandraStorageConfig() => new CassandraPersistentMap
case MongoStorageConfig() => new MongoPersistentMap
@ -72,7 +65,7 @@ class PersistentState {
trait PersistentMap extends scala.collection.mutable.Map[AnyRef, AnyRef] with Transactional {
protected val newAndUpdatedEntries = TransactionalState.newMap[AnyRef, AnyRef]
protected val removedEntries = TransactionalState.newMap[AnyRef, AnyRef]
protected val shouldClearOnCommit = TransactionalRef[Boolean](false)
protected val shouldClearOnCommit = TransactionalRef[Boolean]()
// to be concretized in subclasses
val storage: MapStorage
@ -165,7 +158,7 @@ trait PersistentVector extends RandomAccessSeq[AnyRef] with Transactional {
protected val newElems = TransactionalState.newVector[AnyRef]
protected val updatedElems = TransactionalState.newMap[Int, AnyRef]
protected val removedElems = TransactionalState.newVector[AnyRef]
protected val shouldClearOnCommit = TransactionalRef[Boolean](false)
protected val shouldClearOnCommit = TransactionalRef[Boolean]()
val storage: VectorStorage

View file

@ -9,8 +9,8 @@ object AllTest extends TestCase {
def suite(): Test = {
val suite = new TestSuite("All Scala tests")
suite.addTestSuite(classOf[CassandraPersistentActorSpec])
//suite.addTestSuite(classOf[MongoPersistentActorSpec])
//suite.addTestSuite(classOf[MongoStorageSpec])
suite.addTestSuite(classOf[MongoPersistentActorSpec])
suite.addTestSuite(classOf[MongoStorageSpec])
suite
}

View file

@ -30,9 +30,16 @@ case class FailureOneWay(key: String, value: String, failer: Actor)
class CassandraPersistentActor extends Actor {
timeout = 100000
makeTransactionRequired
private val mapState = PersistentState.newMap(CassandraStorageConfig())
private val vectorState = PersistentState.newVector(CassandraStorageConfig())
private val refState = PersistentState.newRef(CassandraStorageConfig())
private var mapState: PersistentMap = _
private var vectorState: PersistentVector = _
private var refState: PersistentRef = _
override def initializeTransactionalState = {
mapState = PersistentState.newMap(CassandraStorageConfig())
vectorState = PersistentState.newVector(CassandraStorageConfig())
refState = PersistentState.newRef(CassandraStorageConfig())
}
def receive: PartialFunction[Any, Unit] = {
case GetMapState(key) =>

View file

@ -28,10 +28,13 @@ case object LogSize
class BankAccountActor extends Actor {
makeTransactionRequired
private val accountState =
PersistentState.newMap(MongoStorageConfig())
private val txnLog =
PersistentState.newVector(MongoStorageConfig())
private var accountState: PersistentMap = _
private var txnLog: PersistentVector = _
override def initializeTransactionalState = {
accountState = PersistentState.newMap(MongoStorageConfig())
txnLog = PersistentState.newVector(MongoStorageConfig())
}
def receive: PartialFunction[Any, Unit] = {
// check balance

265
akka.iws
View file

@ -2,15 +2,16 @@
<project relativePaths="false" version="4">
<component name="ChangeListManager">
<list default="true" readonly="true" id="188c966f-a83c-4d3a-9128-54d5a2947a12" name="Default" comment="">
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/HashTrie.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/HashTrie.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentClasher.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStatefulNested.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.ipr" afterPath="$PROJECT_DIR$/akka.ipr" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/main/scala/CassandraStorage.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/main/scala/CassandraStorage.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/PersistentStateful.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/main/scala/PersistentState.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/main/scala/PersistentState.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" />
</list>
<ignored path=".idea/workspace.xml" />
@ -25,6 +26,47 @@
<disable_hints />
</component>
<component name="DebuggerManager">
<line_breakpoints>
<breakpoint url="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" line="90" class="Class at Transaction.scala:90" package="">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint url="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" line="108" class="Class at Transaction.scala:108" package="">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint url="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" line="131" class="Class at Transaction.scala:131" package="">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
</line_breakpoints>
<breakpoint_any>
<breakpoint>
<option name="NOTIFY_CAUGHT" value="true" />
@ -66,64 +108,28 @@
<component name="FileColors" enabled="false" enabledForTabs="false" />
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="TransactionalState.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala">
<file leaf-file-name="CassandraPersistentActorSpec.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="241" column="0" selection-start="5934" selection-end="6105" vertical-scroll-proportion="0.0">
<state line="42" column="0" selection-start="969" selection-end="1352" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="STMBugReproducer.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/STMBugReproducer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="36" column="6" selection-start="915" selection-end="915" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Ref.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/config/Ref.java">
<provider selected="true" editor-type-id="text-editor">
<state line="93" column="76" selection-start="3663" selection-end="3663" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Actor.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="215" column="27" selection-start="7070" selection-end="7070" vertical-scroll-proportion="-14.769231">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="InMemoryActorSpec.scala" pinned="false" current="true" current-in-tab="true">
<file leaf-file-name="InMemoryActorSpec.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="211" column="6" selection-start="8234" selection-end="8234" vertical-scroll-proportion="0.26989618">
<state line="38" column="0" selection-start="1046" selection-end="1433" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="TransactionManagement.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala">
<file leaf-file-name="MongoPersistentActorSpec.scala" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="26" selection-start="1862" selection-end="1862" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Transaction.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="44" column="17" selection-start="1149" selection-end="1149" vertical-scroll-proportion="0.0">
<state line="33" column="0" selection-start="1045" selection-end="1045" vertical-scroll-proportion="0.6984127">
<folding />
</state>
</provider>
@ -142,11 +148,17 @@
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/HashTrie.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/STMSpec.scala" />
<option value="$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/config/Ref.java" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/STMBugReproducer.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" />
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala" />
<option value="$PROJECT_DIR$/akka-persistence/src/main/scala/CassandraStorage.scala" />
<option value="$PROJECT_DIR$/akka-persistence/src/main/scala/PersistentState.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" />
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala" />
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala" />
</list>
</option>
</component>
@ -245,7 +257,8 @@
</panes>
</component>
<component name="PropertiesComponent">
<property name="project.structure.proportion" value="0.0" />
<property name="GoToClass.includeJavaFiles" value="false" />
<property name="project.structure.proportion" value="0.15" />
<property name="project.structure.last.edited" value="Project" />
<property name="MemberChooser.copyJavadoc" value="false" />
<property name="options.splitter.main.proportions" value="0.3" />
@ -323,6 +336,40 @@
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="false" name="InMemoryActorSpec.testOneWayRefShouldRollbackStateForStatefulServerInCaseOfFailure" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma">
<pattern>
<option name="PATTERN" value="se.scalablesolutions.akka.actor.*" />
<option name="ENABLED" value="true" />
</pattern>
<module name="akka-actors" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="" />
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.actor.InMemoryActorSpec" />
<option name="METHOD_NAME" value="testOneWayRefShouldRollbackStateForStatefulServerInCaseOfFailure" />
<option name="TEST_OBJECT" value="method" />
<option name="VM_PARAMETERS" value="" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="ADDITIONAL_CLASS_PATH" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="65127" />
<option name="TRANSPORT" value="0" />
<option name="LOCAL" value="true" />
</RunnerSettings>
<ConfigurationWrapper RunnerId="Debug" />
<method>
<option name="AntTarget" enabled="false" />
<option name="Make" enabled="true" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="true" type="Remote" factoryName="Remote">
<option name="USE_SOCKET_TRANSPORT" value="true" />
<option name="SERVER_MODE" value="false" />
@ -531,12 +578,13 @@
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<list size="5">
<list size="6">
<item index="0" class="java.lang.String" itemvalue="JUnit.STMBugReproducer" />
<item index="1" class="java.lang.String" itemvalue="JUnit.RemoteInMemoryStateTest" />
<item index="2" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec" />
<item index="3" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec.testVectorShouldRollbackStateForStatefulServerInCaseOfFailure" />
<item index="4" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec.testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
<item index="5" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec.testOneWayRefShouldRollbackStateForStatefulServerInCaseOfFailure" />
</list>
<configuration name="&lt;template&gt;" type="WebApp" default="true" selected="false">
<Host>localhost</Host>
@ -578,27 +626,27 @@
</component>
<component name="ToolWindowManager">
<frame x="4" y="22" width="1436" height="878" extended-state="6" />
<editor active="false" />
<editor active="true" />
<layout>
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.19264069" sideWeight="0.44770408" order="0" side_tool="false" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.19264069" sideWeight="0.6747449" order="0" side_tool="false" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32908162" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="true" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32908162" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.5433673" sideWeight="0.5" order="2" side_tool="false" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.31632653" sideWeight="0.5" order="2" side_tool="false" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39923468" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" />
<window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32908162" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" />
@ -636,31 +684,14 @@
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/HashTrie.scala">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="66" column="0" selection-start="2434" selection-end="2434" vertical-scroll-proportion="0.0" />
<state line="73" column="37" selection-start="2679" selection-end="2679" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/ActiveObject.scala">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="294" column="7" selection-start="13343" selection-end="13343" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java">
<provider selected="true" editor-type-id="text-editor">
<state line="11" column="0" selection-start="376" selection-end="448" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/config/Ref.java">
<provider selected="true" editor-type-id="text-editor">
<state line="93" column="76" selection-start="3663" selection-end="3663" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/main/scala/MongoStorage.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<state line="90" column="0" selection-start="2585" selection-end="2585" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@ -672,45 +703,93 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/ActorSpec.scala">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Reactor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="10" column="21" selection-start="0" selection-end="1485" vertical-scroll-proportion="0.0" />
<state line="32" column="45" selection-start="666" selection-end="666" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala">
<entry file="file://$PROJECT_DIR$/akka-rest/src/main/scala/ActorComponentProviderFactory.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="73" column="37" selection-start="2679" selection-end="2679" vertical-scroll-proportion="0.0" />
<state line="14" column="6" selection-start="335" selection-end="335" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/reactor/MessageDispatcherBase.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="241" column="0" selection-start="5934" selection-end="6105" vertical-scroll-proportion="0.0">
<state line="47" column="21" selection-start="1413" selection-end="1413" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/main/scala/CassandraSession.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="7" selection-start="637" selection-end="637" vertical-scroll-proportion="-0.3102493">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="26" selection-start="1862" selection-end="1862" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="44" column="17" selection-start="1149" selection-end="1149" vertical-scroll-proportion="0.0">
<state line="16" column="0" selection-start="405" selection-end="405" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="215" column="27" selection-start="7070" selection-end="7070" vertical-scroll-proportion="-14.769231">
<state line="457" column="29" selection-start="16736" selection-end="16736" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="4" selection-start="453" selection-end="453" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/main/scala/CassandraStorage.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="67" column="0" selection-start="2484" selection-end="2484" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="41" column="38" selection-start="1050" selection-end="1050" vertical-scroll-proportion="0.043419268">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/main/scala/PersistentState.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="160" column="49" selection-start="6053" selection-end="6053" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="211" column="6" selection-start="8234" selection-end="8234" vertical-scroll-proportion="0.26989618">
<state line="38" column="0" selection-start="1046" selection-end="1433" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="42" column="0" selection-start="969" selection-end="1352" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="33" column="0" selection-start="1045" selection-end="1045" vertical-scroll-proportion="0.6984127">
<folding />
</state>
</provider>