Refactored RemotedataActors, improved ActorSystem configuration

This commit is contained in:
Petar Bozin 2017-03-02 19:59:51 +01:00
parent 1de412a81d
commit e164dea18e
32 changed files with 1880 additions and 1578 deletions

View File

@ -1,68 +0,0 @@
akka {
extensions = ["com.romix.akka.serialization.kryo.KryoSerializationExtension$"]
actor {
provider = "akka.remote.RemoteActorRefProvider"
kryo {
type = "graph"
idstrategy = "default"
buffer-size = 65536
max-buffer-size = -1
use-manifests = false
use-unsafe = true
post-serialization-transformations = "off"
#post-serialization-transformations = "lz4,aes"
#encryption {
# aes {
# mode = "AES/CBC/PKCS5Padding"
# key = j68KkRjq21ykRGAQ
# IV-length = 16
# }
#}
implicit-registration-logging = true
kryo-trace = false
resolve-subclasses = true
}
serializers {
#java = "akka.serialization.JavaSerializer"
kryo = "com.romix.akka.serialization.kryo.KryoSerializer"
}
serialization-bindings {
"net.liftweb.common.Full" = kryo,
"net.liftweb.common.Empty" = kryo,
"net.liftweb.common.Box" = kryo,
"net.liftweb.common.ParamFailure" = kryo,
"code.api.APIFailure" = kryo,
"code.views.RemoteViewCaseClasses" = kryo,
"code.model.BankAccount" = kryo,
"code.model.View" = kryo,
"code.model.dataAccess.ViewImpl" = kryo,
"code.model.User" = kryo,
"code.model.ViewId" = kryo,
"code.model.ViewUID" = kryo,
//"code.model.Permission" = kryo,
"scala.Unit" = kryo,
"scala.Boolean" = kryo,
"java.io.Serializable" = kryo,
"scala.collection.immutable.List" = kryo,
"akka.actor.ActorSelectionMessage" = kryo
}
}
remote {
netty {
hostname = "127.0.0.1"
tcp {
send-buffer-size = 50000000
receive-buffer-size = 50000000
maximum-frame-size = 52428800
}
}
}
}

View File

@ -1,6 +0,0 @@
include "common"
akka {
remote.netty.tcp.hostname = "127.0.0.1"
remote.netty.tcp.port = 5446
}

View File

@ -1,6 +0,0 @@
include "common"
akka {
remote.netty.tcp.hostname = "10.38.16.163"
remote.netty.tcp.port = 5448
}

View File

@ -68,12 +68,15 @@ write_metrics=true
db.url=jdbc:postgresql://localhost:5432/dbname?user=dbusername&password=thepassword
## Enable remote Akka actor for data split
## Set to true and also edit and set host/port in obpremotedata.conf
#enable_remotedata=true
# Note! Above is currently disabled in source code!!
## If set to true, must set hostname and port
## of remote machine
#remotedata.enable=true
#remotedata.hostname=127.0.0.1
#remotedata.port=2662
## If remotedata is enabled, set the remote database parameters
## db has to be accessible from box set in obpremotedata.conf
## Set separate database for data split
## If remotedata is disabled, bd has to be accessible from local machine
## If remotedata is enabled, db has to be accessible from remote machine
#remotedata.db.driver=org.h2.Driver
#remotedata.db.url=jdbc:h2:./lift_proto.db.remotedata;DB_CLOSE_ON_EXIT=FALSE
#remotedata.db.username=user

View File

@ -1,6 +0,0 @@
include "common"
akka {
remote.natty.tcp.hostname = "127.0.0.1"
remote.netty.tcp.port = 5444
}

View File

@ -78,7 +78,7 @@ import code.api.Constant._
import code.cards.MappedPhysicalCard
import code.cards.PinReset
import code.fx.{MappedCurrency, MappedFXRate}
import code.remotedata.RemotedataActorSystem
import code.remotedata.RemotedataActors
import code.transaction.MappedTransaction
import code.transactionStatusScheduler.TransactionStatusScheduler
@ -355,11 +355,12 @@ class Boot extends Loggable{
}
}
if (!Props.getBool("enable_remotedata", false)) {
if (!Props.getBool("remotedata.enable", false)) {
try {
RemotedataActorSystem.startLocalWorkerSystem()
logger.info(s"RemoteDataActors.startLocalWorkerSystem() starting")
RemotedataActors.startLocalWorkerSystem()
} catch {
case ex: Exception => logger.warn(s"RemoteDataActorSystem.startLocalWorkerSystem() could not start: $ex")
case ex: Exception => logger.warn(s"RemoteDataActors.startLocalWorkerSystem() could not start: $ex")
}
}
@ -434,6 +435,9 @@ object ToSchemify {
)
val models = List(
MappedCounterparty,
MappedCounterpartyMetadata,
MappedCounterpartyWhereTag,
AuthUser,
Admin,
Nonce,
@ -441,8 +445,6 @@ object ToSchemify {
Consumer,
MappedNarrative,
MappedWhereTag,
MappedCounterpartyMetadata,
MappedCounterpartyWhereTag,
MappedBank,
MappedBankAccount,
MappedTransaction,
@ -467,7 +469,6 @@ object ToSchemify {
MappedEntitlement,
MappedPhysicalCard,
PinReset,
MappedCounterparty,
MappedBadLoginAttempt,
MappedFXRate,
MappedCurrency,

View File

@ -4,7 +4,7 @@ package code.accountholder
import code.model.{AccountId, BankId, User}
import net.liftweb.util.SimpleInjector
import code.remotedata.Remotedata
import code.remotedata.RemotedataAccountHolders
import net.liftweb.common.Box
@ -12,8 +12,8 @@ object AccountHolders extends SimpleInjector {
val accountHolders = new Inject(buildOne _) {}
def buildOne: AccountHolders = MapperAccountHolders
//def buildOne: AccountHolders = Remotedata
//def buildOne: AccountHolders = MapperAccountHolders
def buildOne: AccountHolders = RemotedataAccountHolders
}

View File

@ -5,14 +5,14 @@ import net.liftweb.common.Box
import code.model._
import java.util.Date
import code.remotedata.Remotedata
import code.remotedata.RemotedataComments
object Comments extends SimpleInjector {
val comments = new Inject(buildOne _) {}
//def buildOne: Comments = MappedComments
def buildOne: Comments = Remotedata
def buildOne: Comments = RemotedataComments
}

View File

@ -3,14 +3,14 @@ package code.metadata.counterparties
import net.liftweb.common.Box
import net.liftweb.util.SimpleInjector
import code.model.{AccountId, BankId, Counterparty, CounterpartyMetadata}
import code.remotedata.Remotedata
import code.remotedata.RemotedataCounterparties
object Counterparties extends SimpleInjector {
val counterparties = new Inject(buildOne _) {}
def buildOne: Counterparties = MapperCounterparties
// def buildOne: Counterparties = AkkaMapperViews
//def buildOne: Counterparties = RemotedataCounterparties
}
@ -85,4 +85,4 @@ class RemoteCounterpartiesCaseClasses {
case class checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)
}
object RemoteCounterpartiesCaseClasses extends RemoteCounterpartiesCaseClasses
object RemoteCounterpartiesCaseClasses extends RemoteCounterpartiesCaseClasses

View File

@ -5,14 +5,14 @@ import java.util.Date
import net.liftweb.common.Box
import code.model._
import code.remotedata.Remotedata
import code.remotedata.RemotedataTags
object Tags extends SimpleInjector {
val tags = new Inject(buildOne _) {}
//def buildOne: Tags = MappedTags
def buildOne: Tags = Remotedata
def buildOne: Tags = RemotedataTags
}

View File

@ -1,756 +0,0 @@
package code.remotedata
import java.util.Date
import akka.actor.{ActorKilledException, ActorSelection, ActorSystem}
import akka.pattern.ask
import akka.util.Timeout
import code.accountholder.{AccountHolders, RemoteAccountHoldersCaseClasses}
import code.api.APIFailure
import code.metadata.comments.{Comments, RemoteCommentsCaseClasses}
import code.metadata.counterparties.{Counterparties, CounterpartyTrait, RemoteCounterpartiesCaseClasses}
import code.model.dataAccess.ResourceUser
import code.model.{CreateViewJSON, Permission, UpdateViewJSON, _}
import code.users.{RemoteUserCaseClasses, Users}
import code.views.{RemoteViewCaseClasses, Views}
import com.typesafe.config.ConfigFactory
import net.liftweb.common.{Full, _}
import net.liftweb.util.Props
import code.metadata.tags.{RemoteTagsCaseClasses, Tags}
import scala.collection.immutable.List
import scala.concurrent.Await
import scala.concurrent.duration._
object Remotedata extends Views with Users with Counterparties with AccountHolders with Comments with Tags{
val TIMEOUT = 10 seconds
val rViews = RemoteViewCaseClasses
val rUsers = RemoteUserCaseClasses
val rCounterparties = RemoteCounterpartiesCaseClasses
val rAccountHolders = RemoteAccountHoldersCaseClasses
val rComments = RemoteCommentsCaseClasses
val rTags = RemoteTagsCaseClasses
implicit val timeout = Timeout(10000 milliseconds)
val remote = ActorSystem("LookupSystem", ConfigFactory.load("remotelookup"))
val cfg = ConfigFactory.load("obplocaldata")
val host = cfg.getString("akka.remote.netty.tcp.hostname")
val port = cfg.getString("akka.remote.netty.tcp.port")
var actorPath = "akka.tcp://OBPDataWorkerSystem@" + host + ":" + port + "/user/OBPLocalDataActor"
if (Props.getBool("enable_remotedata", false)) {
val cfg = ConfigFactory.load("obpremotedata")
val rhost = cfg.getString("akka.remote.netty.tcp.hostname")
val rport = cfg.getString("akka.remote.netty.tcp.port")
actorPath = "akka.tcp://OBPDataWorkerSystem@" + rhost + ":" + rport + "/user/OBPRemoteDataActor"
}
var viewsActor: ActorSelection = remote.actorSelection(actorPath)
def addPermissions(views: List[ViewUID], user: User): Box[List[View]] = {
val res = try {
Full(
Await.result(
(viewsActor ? rViews.addPermissions(views, user)).mapTo[List[View]],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"One or more views not found", 404)
case e: Throwable => throw e
}
res
}
def permission(account: BankAccountUID, user: User): Box[Permission] = {
Full(
Await.result(
(viewsActor ? rViews.permission(account, user)).mapTo[Permission],
TIMEOUT
)
)
}
def addPermission(viewUID: ViewUID, user: User): Box[View] = {
val res = try {
Full(
Await.result(
(viewsActor ? rViews.addPermission(viewUID, user)).mapTo[View],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"View $viewUID. not found", 404)
case e: Throwable => throw e
}
res
}
//TODO Fix return values in order to better describe failures
def revokePermission(viewUID : ViewUID, user : User) : Box[Boolean] = {
val res = try {
Full(
Await.result(
(viewsActor ? rViews.revokePermission(viewUID, user)).mapTo[Boolean],
TIMEOUT
)
)
}
catch {
case k: ClassCastException => k.getMessage match {
case "Cannot cast net.liftweb.common.Failure to java.lang.Boolean" =>
return Empty ~> APIFailure(s"View $viewUID. not removed", 400)
case "Cannot cast net.liftweb.common.ParamFailure to java.lang.Boolean" =>
return Empty ~> APIFailure(s"View $viewUID. not found", 404)
case _ =>
return Empty ~> APIFailure(s"Unknown error", 406)
}
case e: Throwable => throw e
}
res
}
def revokeAllPermissions(bankId : BankId, accountId: AccountId, user : User) : Box[Boolean] = {
val res = try{
Full(
Await.result(
(viewsActor ? rViews.revokeAllPermissions(bankId, accountId, user)).mapTo[Boolean],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> Failure("One of the views this user has access to is the owner view, and there would be no one with access" +
" to this owner view if access to the user was revoked. No permissions to any views on the account have been revoked.")
case e: Throwable => throw e
}
res
}
def view(viewUID : ViewUID) : Box[View] = {
val res = try {
Full(
Await.result(
(viewsActor ? rViews.view(viewUID)).mapTo[View],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"View $viewUID. not found", 404)
case e: Throwable => throw e
}
res
}
def view(viewId : ViewId, account: BankAccountUID) : Box[View] = {
val res = try {
Full(
Await.result(
(viewsActor ? rViews.view(viewId, account)).mapTo[View],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"View $viewId. not found", 404)
case e: Throwable => throw e
}
res
}
def createView(bankAccountId: BankAccountUID, view: CreateViewJSON): Box[View] = {
Await.result(
(viewsActor ? rViews.createView(bankAccountId, view)).mapTo[Box[View]],
TIMEOUT
)
}
def updateView(bankAccountId : BankAccountUID, viewId: ViewId, viewUpdateJson : UpdateViewJSON) : Box[View] = {
Await.result(
(viewsActor ? rViews.updateView(bankAccountId, viewId, viewUpdateJson)).mapTo[Box[View]],
TIMEOUT
)
}
def removeView(viewId: ViewId, bankAccountId: BankAccountUID): Box[Unit] = {
Await.result(
(viewsActor ? rViews.removeView(viewId, bankAccountId)).mapTo[Box[Unit]],
TIMEOUT
)
}
def permissions(account : BankAccountUID) : List[Permission] = {
Await.result(
(viewsActor ? rViews.permissions(account)).mapTo[List[Permission]],
TIMEOUT
)
}
def views(bankAccountId : BankAccountUID) : List[View] = {
Await.result(
(viewsActor ? rViews.views(bankAccountId)).mapTo[List[View]],
TIMEOUT
)
}
def permittedViews(user: User, bankAccountId: BankAccountUID): List[View] = {
Await.result(
(viewsActor ? rViews.permittedViews(user, bankAccountId)).mapTo[List[View]],
TIMEOUT
)
}
def publicViews(bankAccountId : BankAccountUID) : List[View] = {
Await.result(
(viewsActor ? rViews.publicViews(bankAccountId)).mapTo[List[View]],
TIMEOUT
)
}
def getAllPublicAccounts() : List[BankAccountUID] = {
Await.result(
(viewsActor ? rViews.getAllPublicAccounts()).mapTo[List[BankAccountUID]],
TIMEOUT
)
}
def getPublicBankAccounts(bank : Bank) : List[BankAccountUID] = {
Await.result(
(viewsActor ? rViews.getPublicBankAccounts(bank)).mapTo[List[BankAccountUID]],
TIMEOUT
)
}
def getAllAccountsUserCanSee(user : Box[User]) : List[BankAccountUID] = {
user match {
case Full(theUser) => {
Await.result (
(viewsActor ? rViews.getAllAccountsUserCanSee(theUser)).mapTo[List[BankAccountUID]],
TIMEOUT)
}
case _ => getAllPublicAccounts()
}
}
def getAllAccountsUserCanSee(bank: Bank, user : Box[User]) : List[BankAccountUID] = {
user match {
case Full(theUser) => {
Await.result(
(viewsActor ? rViews.getAllAccountsUserCanSee(bank, theUser)).mapTo[List[BankAccountUID]],
TIMEOUT
)
}
case _ => getPublicBankAccounts(bank)
}
}
def getNonPublicBankAccounts(user : User) : List[BankAccountUID] = {
Await.result(
(viewsActor ? rViews.getNonPublicBankAccounts(user)).mapTo[List[BankAccountUID]],
TIMEOUT
)
}
def getNonPublicBankAccounts(user : User, bankId : BankId) : List[BankAccountUID] = {
Await.result(
(viewsActor ? rViews.getNonPublicBankAccounts(user, bankId)).mapTo[List[BankAccountUID]],
TIMEOUT
)
}
def grantAccessToAllExistingViews(user : User) = {
Await.result(
(viewsActor ? rViews.grantAccessToAllExistingViews(user)).mapTo[Boolean],
TIMEOUT
)
}
def grantAccessToView(user : User, view : View) = {
Await.result(
(viewsActor ? rViews.grantAccessToView(user, view)).mapTo[Boolean],
TIMEOUT
)
}
def getOwners(view: View) : Set[User] = {
Await.result(
(viewsActor ? rViews.getOwners(view)).mapTo[Set[User]],
TIMEOUT
)
}
def createOwnerView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = {
Full(Await.result(
(viewsActor ? rViews.createOwnerView(bankId, accountId, description)).mapTo[View],
TIMEOUT
)
)
}
def createPublicView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = {
Full(Await.result(
(viewsActor ? rViews.createPublicView(bankId, accountId, description)).mapTo[View],
TIMEOUT
)
)
}
def createAccountantsView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = {
Full(Await.result(
(viewsActor ? rViews.createAccountantsView(bankId, accountId, description)).mapTo[View],
TIMEOUT
)
)
}
def createAuditorsView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = {
Full(Await.result(
(viewsActor ? rViews.createAuditorsView(bankId, accountId, description)).mapTo[View],
TIMEOUT
)
)
}
def createRandomView(bankId: BankId, accountId: AccountId) : Box[View] = {
Full(Await.result(
(viewsActor ? rViews.createRandomView(bankId, accountId)).mapTo[View],
TIMEOUT
)
)
}
def viewExists(bankId: BankId, accountId: AccountId, name: String): Boolean = {
Await.result(
(viewsActor ? rViews.viewExists(bankId, accountId, name)).mapTo[Boolean],
TIMEOUT
)
}
def removeAllViews(bankId: BankId, accountId: AccountId): Boolean = {
Await.result(
(viewsActor ? rViews.removeAllViews(bankId, accountId)).mapTo[Boolean],
TIMEOUT
)
}
def removeAllPermissions(bankId: BankId, accountId: AccountId): Boolean = {
Await.result(
(viewsActor ? rViews.removeAllViews(bankId, accountId)).mapTo[Boolean],
TIMEOUT
)
}
// Resource user part
def getUserByResourceUserId(id : Long) : Box[User] = {
val res = try {
Full(
Await.result(
(viewsActor ? rUsers.getUserByResourceUserId(id)).mapTo[User],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404)
case e: Throwable => throw e
}
res
}
def getResourceUserByResourceUserId(id : Long) : Box[ResourceUser] = {
val res = try {
Full(
Await.result(
(viewsActor ? rUsers.getResourceUserByResourceUserId(id)).mapTo[ResourceUser],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"ResourceUser not found", 404)
case e: Throwable => throw e
}
res
}
def getUserByProviderId(provider : String, idGivenByProvider : String) : Box[User] = {
val res = try {
Full(
Await.result(
(viewsActor ? rUsers.getUserByProviderId(provider, idGivenByProvider)).mapTo[User],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404)
case e: Throwable => throw e
}
res
}
def getUserByUserId(userId : String) : Box[User] = {
val res = try {
Full(
Await.result(
(viewsActor ? rUsers.getUserByUserId(userId)).mapTo[User],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404)
case e: Throwable => throw e
}
res
}
def getUserByUserName(userName : String) : Box[ResourceUser] = {
val res = try {
Full(
Await.result(
(viewsActor ? rUsers.getUserByUserName(userName)).mapTo[ResourceUser],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404)
case e: Throwable => throw e
}
res
}
def getUserByEmail(email : String) : Box[List[ResourceUser]] = {
val res = try {
Full(
Await.result(
(viewsActor ? rUsers.getUserByEmail(email)).mapTo[List[ResourceUser]],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404)
case e: Throwable => throw e
}
res
}
def getAllUsers() : Box[List[ResourceUser]] = {
val res = try {
Full(
Await.result(
(viewsActor ? rUsers.getAllUsers()).mapTo[List[ResourceUser]],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Users not found", 404)
case e: Throwable => throw e
}
res
}
def createResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) : Box[ResourceUser] = {
val res = try {
Full(
Await.result(
(viewsActor ? rUsers.createResourceUser(provider, providerId, name, email, userId)).mapTo[ResourceUser],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404)
case e: Throwable => throw e
}
res
}
def createUnsavedResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) : Box[ResourceUser] = {
val res = try {
Full(
Await.result(
(viewsActor ? rUsers.createUnsavedResourceUser(provider, providerId, name, email, userId)).mapTo[ResourceUser],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404)
case e: Throwable => throw e
}
res
}
def saveResourceUser(resourceUser: ResourceUser) : Box[ResourceUser] = {
val res = try {
Full(
Await.result(
(viewsActor ? rUsers.saveResourceUser(resourceUser)).mapTo[ResourceUser],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404)
case e: Throwable => throw e
}
res
}
def deleteResourceUser(userId: Long) : Box[Boolean] = {
val res = try{
Full(
Await.result(
(viewsActor ? rUsers.deleteResourceUser(userId)).mapTo[Boolean],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not deleted", 404)
case e: Throwable => throw e
}
res
}
override def getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty): Box[CounterpartyMetadata] = {
val res = try {
Full(
Await.result(
(viewsActor ? rCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty)).mapTo[CounterpartyMetadata],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not getOrCreateMetadata", 404)
case e: Throwable => throw e
}
res
}
override def getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId): List[CounterpartyMetadata] = {
val res = try {
Full(
Await.result(
(viewsActor ? rCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId)).mapTo[List[CounterpartyMetadata]],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not getMetadatas", 404)
case e: Throwable => throw e
}
res.get
}
override def getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String): Box[CounterpartyMetadata] = {
val res = try {
Full(
Await.result(
(viewsActor ? rCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String)).mapTo[CounterpartyMetadata],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not getMetadata", 404)
case e: Throwable => throw e
}
res
}
override def getCounterparty(counterPartyId: String): Box[CounterpartyTrait] = {
val res = try {
Full(
Await.result(
(viewsActor ? rCounterparties.getCounterparty(counterPartyId: String)).mapTo[CounterpartyTrait],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not getCounterparty", 404)
case e: Throwable => throw e
}
res
}
override def getCounterpartyByIban(iban: String): Box[CounterpartyTrait] = {
val res = try {
Full(
Await.result(
(viewsActor ? rCounterparties.getCounterpartyByIban(iban: String)).mapTo[CounterpartyTrait],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not getCounterpartyByIban", 404)
case e: Throwable => throw e
}
res
}
override def createCounterparty(createdByUserId: String, thisBankId: String, thisAccountId: String, thisViewId: String, name: String, otherBankId: String, otherAccountId: String, otherAccountRoutingScheme: String, otherAccountRoutingAddress: String, otherBankRoutingScheme: String, otherBankRoutingAddress: String, isBeneficiary: Boolean): Box[CounterpartyTrait] = {
val res = try {
Full(
Await.result(
(viewsActor ? rCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, name, otherBankId, otherAccountId,
otherAccountRoutingScheme, otherAccountRoutingAddress, otherBankRoutingScheme, otherBankRoutingAddress,
isBeneficiary)).mapTo[CounterpartyTrait],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not createCounterparty", 404)
case e: Throwable => throw e
}
res
}
override def checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String): Boolean = {
Await.result(
(viewsActor ? rCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)).mapTo[Boolean],
TIMEOUT
)
}
override def createAccountHolder(userId: Long, bankId: String, accountId: String, source: String = "MappedAccountHolder"): Boolean = {
Await.result(
(viewsActor ? rAccountHolders.createAccountHolder(userId, bankId, accountId, source)).mapTo[Boolean],
TIMEOUT
)
}
override def getAccountHolders(bankId: BankId, accountId: AccountId): Set[User] = {
Await.result(
(viewsActor ? rAccountHolders.getAccountHolders(bankId, accountId)).mapTo[Set[User]],
TIMEOUT
)
}
// bulkDeletes for tests
def bulkDeleteAllPermissionsAndViews(): Boolean = {
Await.result(
(viewsActor ? rViews.bulkDeleteAllPermissionsAndViews()).mapTo[Boolean],
TIMEOUT
)
}
def bulkDeleteAllAccountHolders(): Box[Boolean] = {
Full(
Await.result(
(viewsActor ? rAccountHolders.bulkDeleteAllAccountHolders()).mapTo[Boolean],
TIMEOUT
)
)
}
def bulkDeleteAllResourceUsers(): Box[Boolean] = {
Full(
Await.result(
(viewsActor ? rUsers.bulkDeleteAllResourceUsers()).mapTo[Boolean],
TIMEOUT
)
)
}
// METADATA
// Comments
def getComments(bankId : BankId, accountId : AccountId, transactionId : TransactionId)(viewId : ViewId) : List[Comment] = {
Await.result(
(viewsActor ? rComments.getComments(bankId, accountId, transactionId, viewId)).mapTo[List[Comment]],
TIMEOUT
)
}
def addComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(userId: UserId, viewId : ViewId, text : String, datePosted : Date) : Box[Comment] = {
Full(
Await.result(
(viewsActor ? rComments.addComment(bankId, accountId, transactionId, userId, viewId, text, datePosted)).mapTo[Comment],
TIMEOUT
)
)
}
def deleteComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(commentId : String) : Box[Boolean] = {
val res = try {
Full(
Await.result(
(viewsActor ? rComments.deleteComment(bankId, accountId, transactionId, commentId)).mapTo[Boolean],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Cannot delete the comment", 404)
case e: Throwable => throw e
}
res
}
def bulkDeleteComments(bankId: BankId, accountId: AccountId): Boolean = {
Await.result(
(viewsActor ? rComments.bulkDeleteComments(bankId, accountId)).mapTo[Boolean],
TIMEOUT
)
}
// Tags
def getTags(bankId : BankId, accountId : AccountId, transactionId : TransactionId)(viewId : ViewId) : List[TransactionTag] = {
Await.result(
(viewsActor ? rTags.getTags(bankId, accountId, transactionId, viewId)).mapTo[List[TransactionTag]],
TIMEOUT
)
}
def addTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(userId: UserId, viewId : ViewId, tagText : String, datePosted : Date) : Box[TransactionTag] = {
Full(
Await.result(
(viewsActor ? rTags.addTag(bankId, accountId, transactionId, userId, viewId, tagText, datePosted)).mapTo[TransactionTag],
TIMEOUT
)
)
}
def deleteTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(tagId : String) : Box[Boolean] = {
val res = try {
Full(
Await.result(
(viewsActor ? rTags.deleteTag(bankId, accountId, transactionId, tagId)).mapTo[Boolean],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Cannot delete the tag", 404)
case e: Throwable => throw e
}
res
}
def bulkDeleteTags(bankId: BankId, accountId: AccountId): Boolean = {
Await.result(
(viewsActor ? rTags.bulkDeleteTags(bankId, accountId)).mapTo[Boolean],
TIMEOUT
)
}
}

View File

@ -0,0 +1,43 @@
package code.remotedata
import code.accountholder.{AccountHolders, RemoteAccountHoldersCaseClasses}
import code.model.{AccountId, BankId, User}
import net.liftweb.common.{Full, _}
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.Await
import scala.concurrent.duration._
object RemotedataAccountHolders extends AccountHolders {
implicit val timeout = Timeout(10000 milliseconds)
val TIMEOUT = 10 seconds
val rAccountHolders = RemoteAccountHoldersCaseClasses
var accountHoldersActor = RemotedataActorSystem.getActor("accountHolders")
override def createAccountHolder(userId: Long, bankId: String, accountId: String, source: String = "MappedAccountHolder"): Boolean = {
Await.result(
(accountHoldersActor ? rAccountHolders.createAccountHolder(userId, bankId, accountId, source)).mapTo[Boolean],
TIMEOUT
)
}
override def getAccountHolders(bankId: BankId, accountId: AccountId): Set[User] = {
Await.result(
(accountHoldersActor ? rAccountHolders.getAccountHolders(bankId, accountId)).mapTo[Set[User]],
TIMEOUT
)
}
def bulkDeleteAllAccountHolders(): Box[Boolean] = {
Full(
Await.result(
(accountHoldersActor ? rAccountHolders.bulkDeleteAllAccountHolders()).mapTo[Boolean],
TIMEOUT
)
)
}
}

View File

@ -0,0 +1,66 @@
package code.remotedata
import java.util.concurrent.TimeUnit
import akka.actor.Actor
import akka.event.Logging
import akka.util.Timeout
import code.accountholder.{MapperAccountHolders, RemoteAccountHoldersCaseClasses}
import code.model._
import net.liftweb.common._
import net.liftweb.util.ControlHelpers.tryo
import scala.concurrent.duration._
class RemotedataAccountHoldersActor extends Actor {
val logger = Logging(context.system, this)
val mAccountHolders = MapperAccountHolders
val rAccountHolders = RemoteAccountHoldersCaseClasses
def receive = {
case rAccountHolders.createAccountHolder(userId: Long, bankId: String, accountId: String, source: String) =>
logger.info("createAccountHolder(" + userId +", "+ bankId +", "+ accountId +", "+ source +")")
{
for {
res <- tryo{mAccountHolders.createAccountHolder(userId, bankId, accountId, source)}
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rAccountHolders.getAccountHolders(bankId: BankId, accountId: AccountId) =>
logger.info("getAccountHolders(" + bankId +", "+ accountId +")")
{
for {
res <- tryo{mAccountHolders.getAccountHolders(bankId, accountId)}
} yield {
sender ! res.asInstanceOf[Set[User]]
}
}.getOrElse( context.stop(sender) )
case rAccountHolders.bulkDeleteAllAccountHolders() =>
logger.info("bulkDeleteAllAccountHolders()")
{
for {
res <- mAccountHolders.bulkDeleteAllAccountHolders()
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message)
}
}

View File

@ -1,705 +0,0 @@
package code.remotedata
import java.util.concurrent.TimeUnit
import akka.actor.{Actor, ActorSystem, Props => ActorProps}
import akka.event.Logging
import akka.util.Timeout
import bootstrap.liftweb.ToSchemify
import code.accountholder.{MapperAccountHolders, RemoteAccountHoldersCaseClasses}
import code.metadata.comments.{MappedComment, MappedComments, RemoteCommentsCaseClasses}
import code.metadata.counterparties.{CounterpartyTrait, MapperCounterparties, RemoteCounterpartiesCaseClasses}
import code.metadata.tags.{MappedTags, RemoteTagsCaseClasses}
import code.model._
import code.model.dataAccess.ResourceUser
import code.users.{LiftUsers, RemoteUserCaseClasses}
import code.views.{MapperViews, RemoteViewCaseClasses}
import com.typesafe.config.ConfigFactory
import net.liftweb.common._
import net.liftweb.db.StandardDBVendor
import net.liftweb.http.LiftRules
import net.liftweb.mapper.{DB, Schemifier}
import net.liftweb.util.Props
import net.liftweb.util.ControlHelpers.tryo
import scala.concurrent.duration._
class RemotedataActor extends Actor {
val logger = Logging(context.system, this)
Schemifier.schemify(true, Schemifier.infoF _, ToSchemify.modelsRemotedata: _*)
val mViews = MapperViews
val rViews = RemoteViewCaseClasses
val mUsers = LiftUsers
val rUsers = RemoteUserCaseClasses
val mCounterparties = MapperCounterparties
val rCounterparties = RemoteCounterpartiesCaseClasses
val mAccountHolders = MapperAccountHolders
val rAccountHolders = RemoteAccountHoldersCaseClasses
val mComments = MappedComments
val rComments = RemoteCommentsCaseClasses
val mTags = MappedTags
val rTags = RemoteTagsCaseClasses
def receive = {
case rViews.addPermissions(views : List[ViewUID], user : User) =>
logger.info("addPermissions(" + views +"," + user +")")
{
for {
res <- mViews.addPermissions(views, user)
} yield {
sender ! res.asInstanceOf[List[View]]
}
}.getOrElse( context.stop(sender) )
case rViews.addPermission(viewUID : ViewUID, user : User) =>
logger.info("addPermission(" + viewUID +"," + user +")")
{
for {
res <- mViews.addPermission(viewUID, user)
} yield {
sender ! res.asInstanceOf[View]
}
}.getOrElse( context.stop(sender) )
case rViews.permission(account : BankAccountUID, user: User) =>
logger.info("permission(" + account +"," + user +")")
{
for {
res <- mViews.permission(account, user)
} yield {
sender ! res.asInstanceOf[Permission]
}
}.getOrElse( context.stop(sender) )
//TODO Fix return values in order to better describe failures
case rViews.revokePermission(viewUID : ViewUID, user : User) =>
logger.info("revokePermission(" + viewUID +"," + user +")")
val res = mViews.revokePermission(viewUID, user)
res match {
case Full(r) => sender ! r
case f => sender ! f
}
case rViews.revokeAllPermissions(bankId : BankId, accountId : AccountId, user : User) =>
logger.info("revokeAllPermissions(" + bankId +"," + accountId +","+ user +")")
{
for {
res <- mViews.revokeAllPermissions(bankId, accountId, user)
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rViews.view(viewUID : ViewUID) =>
logger.info("view(" + viewUID +")")
{
for {
res <- mViews.view(viewUID)
} yield {
sender ! res.asInstanceOf[View]
}
}.getOrElse( context.stop(sender) )
case rViews.view(viewId: ViewId, bankAccountId: BankAccountUID) =>
logger.info("view(" + viewId +", "+ bankAccountId + ")")
{
for {
res <- mViews.view(viewId, bankAccountId)
} yield {
sender ! res.asInstanceOf[View]
}
}.getOrElse( context.stop(sender) )
case rViews.createView(bankAccountId : BankAccountUID, view: CreateViewJSON) =>
logger.info("createView(" + bankAccountId +","+ view +")")
sender ! mViews.createView(bankAccountId, view)
case rViews.updateView(bankAccountId : BankAccountUID, viewId : ViewId, viewUpdateJson : UpdateViewJSON) =>
logger.info("updateView(" + bankAccountId +","+ viewId +","+ viewUpdateJson +")")
sender ! mViews.updateView(bankAccountId, viewId, viewUpdateJson)
//case r.view(viewId: ViewId, bankAccountId: BankAccountUID) =>
// logger.info("view(" + viewId +","+ bankAccountId +")")
// sender ! v.view(ViewId(viewId.value), bankAccountId)
case rViews.removeView(viewId : ViewId, bankAccountId: BankAccountUID) =>
logger.info("removeView(" + viewId +","+ bankAccountId +")")
sender ! mViews.removeView(viewId, bankAccountId)
case rViews.permissions(bankAccountId : BankAccountUID) =>
logger.info("premissions(" + bankAccountId +")")
sender ! mViews.permissions(bankAccountId)
case rViews.views(bankAccountId : BankAccountUID) =>
logger.info("views(" + bankAccountId +")")
sender ! mViews.views(bankAccountId)
case rViews.permittedViews(user: User, bankAccountId: BankAccountUID) =>
logger.info("permittedViews(" + user +", " + bankAccountId +")")
sender ! mViews.permittedViews(user, bankAccountId)
case rViews.publicViews(bankAccountId : BankAccountUID) =>
logger.info("publicViews(" + bankAccountId +")")
sender ! mViews.publicViews(bankAccountId)
case rViews.getAllPublicAccounts() =>
logger.info("getAllPublicAccounts()")
sender ! mViews.getAllPublicAccounts
case rViews.getPublicBankAccounts(bank : Bank) =>
logger.info("getPublicBankAccounts(" + bank +")")
sender ! mViews.getPublicBankAccounts(bank)
case rViews.getAllAccountsUserCanSee(user : Box[User]) =>
logger.info("getAllAccountsUserCanSee(" + user +")")
sender ! mViews.getAllAccountsUserCanSee(user)
case rViews.getAllAccountsUserCanSee(user : User) =>
logger.info("getAllAccountsUserCanSee(" + user +")")
sender ! mViews.getAllAccountsUserCanSee(Full(user))
case rViews.getAllAccountsUserCanSee(bank: Bank, user : Box[User]) =>
logger.info("getAllAccountsUserCanSee(" + bank +", "+ user +")")
sender ! mViews.getAllAccountsUserCanSee(bank, user)
case rViews.getAllAccountsUserCanSee(bank: Bank, user : User) =>
logger.info("getAllAccountsUserCanSee(" + bank +", "+ user +")")
sender ! mViews.getAllAccountsUserCanSee(bank, Full(user))
case rViews.getNonPublicBankAccounts(user: User, bankId: BankId) =>
logger.info("getNonPublicBankAccounts(" + user +", "+ bankId +")")
sender ! mViews.getNonPublicBankAccounts(user, bankId)
case rViews.getNonPublicBankAccounts(user: User) =>
logger.info("getNonPublicBankAccounts(" + user +")")
sender ! mViews.getNonPublicBankAccounts(user)
case rViews.createOwnerView(bankId, accountId, description) =>
logger.info("createOwnerView(" + bankId +", "+ accountId +", "+ description +")")
sender ! mViews.createOwnerView(bankId, accountId, description).orNull
case rViews.createPublicView(bankId, accountId, description) =>
logger.info("createPublicView(" + bankId +", "+ accountId +", "+ description +")")
sender ! mViews.createPublicView(bankId, accountId, description).orNull
case rViews.createAccountantsView(bankId, accountId, description) =>
logger.info("createAccountantsView(" + bankId +", "+ accountId +", "+ description +")")
sender ! mViews.createAccountantsView(bankId, accountId, description).orNull
case rViews.createAuditorsView(bankId, accountId, description) =>
logger.info("createAuditorsView(" + bankId +", "+ accountId +", "+ description +")")
sender ! mViews.createAuditorsView(bankId, accountId, description).orNull
case rViews.createRandomView(bankId, accountId) =>
logger.info("createRandomView(" + bankId +", "+ accountId +")")
sender ! mViews.createRandomView(bankId, accountId).orNull
case rViews.getOwners(view) =>
logger.info("getOwners(" + view +")")
sender ! mViews.getOwners(view)
case rViews.grantAccessToView(user, view) =>
logger.info("grantAccessToView(" + user +", "+ view +")")
sender ! mViews.grantAccessToView(user, view)
case rViews.grantAccessToAllExistingViews(user) =>
logger.info("grantAccessToAllExistingViews(" + user +")")
sender ! mViews.grantAccessToAllExistingViews(user)
case rViews.removeAllPermissions(bankId, accountId) =>
logger.info("removeAllPermissions(" + bankId +", "+ accountId +")")
sender ! mViews.removeAllPermissions(bankId, accountId)
case rViews.removeAllViews(bankId, accountId) =>
logger.info("removeAllViews(" + bankId +", "+ accountId +")")
sender ! mViews.removeAllViews(bankId, accountId)
// Resource User part
case rUsers.getUserByResourceUserId(id: Long) =>
logger.info("getUserByResourceUserId(" + id +")")
{
for {
res <- mUsers.getUserByResourceUserId(id)
} yield {
sender ! res.asInstanceOf[User]
}
}.getOrElse( context.stop(sender) )
case rUsers.getResourceUserByResourceUserId(id: Long) =>
logger.info("getResourceUserByResourceUserId(" + id +")")
{
for {
res <- mUsers.getResourceUserByResourceUserId(id)
} yield {
sender ! res.asInstanceOf[ResourceUser]
}
}.getOrElse( context.stop(sender) )
case rUsers.getUserByProviderId(provider : String, idGivenByProvider : String) =>
logger.info("getUserByProviderId(" + provider +"," + idGivenByProvider +")")
{
for {
res <- mUsers.getUserByProviderId(provider, idGivenByProvider)
} yield {
sender ! res.asInstanceOf[User]
}
}.getOrElse( context.stop(sender) )
case rUsers.getUserByUserId(userId: String) =>
logger.info("getUserByUserId(" + userId +")")
{
for {
res <- mUsers.getUserByUserId(userId)
} yield {
sender ! res.asInstanceOf[User]
}
}.getOrElse( context.stop(sender) )
case rUsers.getUserByUserName(userName: String) =>
logger.info("getUserByUserName(" + userName +")")
{
for {
res <- mUsers.getUserByUserName(userName)
} yield {
sender ! res.asInstanceOf[ResourceUser]
}
}.getOrElse( context.stop(sender) )
case rUsers.getUserByEmail(email: String) =>
logger.info("getUserByEmail(" + email +")")
{
for {
res <- mUsers.getUserByEmail(email)
} yield {
sender ! res
}
}.getOrElse( context.stop(sender) )
case rUsers.getAllUsers() =>
logger.info("getAllUsers()")
{
for {
res <- mUsers.getAllUsers()
} yield {
sender ! res
}
}.getOrElse( context.stop(sender) )
case rUsers.createResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) =>
logger.info("createResourceUser(" + provider + ", " + providerId.getOrElse("None") + ", " + name.getOrElse("None") + ", " + email.getOrElse("None") + ", " + userId.getOrElse("None") + ")")
{
for {
res <- mUsers.createResourceUser(provider, providerId, name, email, userId)
} yield {
sender ! res.asInstanceOf[ResourceUser]
}
}.getOrElse( context.stop(sender) )
case rUsers.createUnsavedResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) =>
logger.info("createUnsavedResourceUser(" + provider + ", " + providerId.getOrElse("None") + ", " + name.getOrElse("None") + ", " + email.getOrElse("None") + ", " + userId.getOrElse("None") + ")")
{
for {
res <- mUsers.createUnsavedResourceUser(provider, providerId, name, email, userId)
} yield {
sender ! res.asInstanceOf[ResourceUser]
}
}.getOrElse( context.stop(sender) )
case rUsers.saveResourceUser(resourceUser: ResourceUser) =>
logger.info("saveResourceUser")
{
for {
res <- mUsers.saveResourceUser(resourceUser)
} yield {
sender ! res.asInstanceOf[ResourceUser]
}
}.getOrElse( context.stop(sender) )
case rUsers.deleteResourceUser(id: Long) =>
logger.info("deleteResourceUser(" + id +")")
{
for {
res <- tryo{mUsers.deleteResourceUser(id)}
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)=>
logger.info("checkCounterpartyAvailable(" + name +", "+ thisBankId +", "+ thisAccountId +", "+ thisViewId +")")
sender ! mCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)
case rCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, name, otherBankId, otherAccountId,
otherAccountRoutingScheme, otherAccountRoutingAddress, otherBankRoutingScheme, otherBankRoutingAddress,
isBeneficiary) =>
logger.info("createCounterparty(" + createdByUserId +", "+ thisBankId +", "+ thisAccountId +", "+ thisViewId +", "+ name +", "+ otherBankId + otherAccountId +", "
+ otherAccountRoutingScheme +", "+ otherAccountRoutingAddress +", "+ otherBankRoutingScheme +", "+ otherBankRoutingAddress +", "+ isBeneficiary+ ")")
{
for {
res <- mCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, name, otherBankId, otherAccountId,
otherAccountRoutingScheme, otherAccountRoutingAddress, otherBankRoutingScheme, otherBankRoutingAddress,
isBeneficiary)
} yield {
sender ! res.asInstanceOf[CounterpartyTrait]
}
}.getOrElse( context.stop(sender) )
case rCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty) =>
logger.info("getOrCreateMetadata(" + originalPartyBankId +", " +originalPartyAccountId+otherParty+")")
{
for {
res <- mCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty)
} yield {
sender ! res.asInstanceOf[CounterpartyMetadata]
}
}.getOrElse( context.stop(sender) )
case rCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId) =>
logger.info("getOrCreateMetadata(" + originalPartyBankId +", "+originalPartyAccountId+")")
Full({
for {
res <- Full(mCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId))
} yield {
sender ! res.asInstanceOf[List[CounterpartyMetadata]]
}
}).getOrElse(context.stop(sender))
case rCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String) =>
logger.info("getMetadata(" + originalPartyBankId +", "+originalPartyAccountId+")")
{
for {
res <- mCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String)
} yield {
sender ! res.asInstanceOf[CounterpartyMetadata]
}
}.getOrElse( context.stop(sender) )
case rCounterparties.getCounterparty(counterPartyId: String) =>
logger.info("getCounterparty(" + counterPartyId +")")
{
for {
res <- mCounterparties.getCounterparty(counterPartyId: String)
} yield {
sender ! res.asInstanceOf[CounterpartyTrait]
}
}.getOrElse( context.stop(sender) )
case rCounterparties.getCounterpartyByIban(iban: String) =>
logger.info("getOrCreateMetadata(" + iban +")")
{
for {
res <- mCounterparties.getCounterpartyByIban(iban: String)
} yield {
sender ! res.asInstanceOf[CounterpartyTrait]
}
}.getOrElse( context.stop(sender) )
case rAccountHolders.createAccountHolder(userId: Long, bankId: String, accountId: String, source: String) =>
logger.info("createAccountHolder(" + userId +", "+ bankId +", "+ accountId +", "+ source +")")
{
for {
res <- tryo{mAccountHolders.createAccountHolder(userId, bankId, accountId, source)}
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rAccountHolders.getAccountHolders(bankId: BankId, accountId: AccountId) =>
logger.info("getAccountHolders(" + bankId +", "+ accountId +")")
{
for {
res <- tryo{mAccountHolders.getAccountHolders(bankId, accountId)}
} yield {
sender ! res.asInstanceOf[Set[User]]
}
}.getOrElse( context.stop(sender) )
case rAccountHolders.bulkDeleteAllAccountHolders() =>
logger.info("bulkDeleteAllAccountHolders()")
{
for {
res <- mAccountHolders.bulkDeleteAllAccountHolders()
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rUsers.bulkDeleteAllResourceUsers() =>
logger.info("bulkDeleteAllResourceUsers()")
{
for {
res <- mUsers.bulkDeleteAllResourceUsers()
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rViews.bulkDeleteAllPermissionsAndViews() =>
logger.info("bulkDeleteAllPermissionsAndViews()")
{
for {
res <- tryo{mViews.bulkDeleteAllPermissionsAndViews()}
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
// METADATA
// Comments
case rComments.getComments(bankId, accountId, transactionId, viewId) =>
logger.info("getComments(" + bankId +", "+ accountId +", "+ transactionId +", "+ viewId +")")
sender ! mComments.getComments(bankId, accountId, transactionId)(viewId)
case rComments.addComment(bankId, accountId, transactionId, userId, viewId, text, datePosted) =>
logger.info("addComment(" + bankId +", "+ accountId +", "+ transactionId +", "+ text +", "+ text +", "+ datePosted +")")
{
for {
res <- mComments.addComment(bankId, accountId, transactionId)(userId, viewId, text, datePosted)
} yield {
sender ! res.asInstanceOf[Comment]
}
}.getOrElse( context.stop(sender) )
case rComments.deleteComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId, commentId : String) =>
logger.info("deleteComment(" + bankId +", "+ accountId +", "+ transactionId + commentId +")")
{
for {
res <- mComments.deleteComment(bankId, accountId, transactionId)(commentId)
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rComments.bulkDeleteComments(bankId: BankId, accountId: AccountId) =>
logger.info("bulkDeleteComments(" + bankId +", "+ accountId + ")")
{
for {
res <- tryo{mComments.bulkDeleteComments(bankId, accountId)}
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
// Tags
case rTags.getTags(bankId, accountId, transactionId, viewId) =>
logger.info("getTags(" + bankId +", "+ accountId +", "+ transactionId +", "+ viewId +")")
sender ! mTags.getTags(bankId, accountId, transactionId)(viewId)
case rTags.addTag(bankId, accountId, transactionId, userId, viewId, text, datePosted) =>
logger.info("addTag(" + bankId +", "+ accountId +", "+ transactionId +", "+ text +", "+ text +", "+ datePosted +")")
{
for {
res <- mTags.addTag(bankId, accountId, transactionId)(userId, viewId, text, datePosted)
} yield {
sender ! res.asInstanceOf[TransactionTag]
}
}.getOrElse( context.stop(sender) )
case rTags.deleteTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId, tagId : String) =>
logger.info("deleteTag(" + bankId +", "+ accountId +", "+ transactionId + tagId +")")
{
for {
res <- mTags.deleteTag(bankId, accountId, transactionId)(tagId)
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rTags.bulkDeleteTags(bankId: BankId, accountId: AccountId) =>
logger.info("bulkDeleteTags(" + bankId +", "+ accountId + ")")
{
for {
res <- tryo{mTags.bulkDeleteTags(bankId, accountId)}
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message)
}
}
object RemotedataActorSystem extends Loggable {
implicit val timeout = Timeout(1 seconds)
def startRemoteWorkerSystem(): Unit = {
val remote = ActorSystem("OBPDataWorkerSystem", ConfigFactory.load("obpremotedata"))
val actor = remote.actorOf(ActorProps[RemotedataActor], name = "OBPRemoteDataActor")
logger.info("Started OBPDataWorkerSystem")
}
def startLocalWorkerSystem(): Unit = {
val remote = ActorSystem("OBPDataWorkerSystem", ConfigFactory.load("obplocaldata"))
val actor = remote.actorOf(ActorProps[RemotedataActor], name = "OBPLocalDataActor")
logger.info("Started OBPDataWorkerSystem locally")
}
def setupRemotedataDB(): Unit = {
// set up the way to connect to the relational DB we're using (ok if other connector than relational)
if (!DB.jndiJdbcConnAvailable_?) {
val driver =
Props.mode match {
case Props.RunModes.Production | Props.RunModes.Staging | Props.RunModes.Development => Props.get("remotedata.db.driver") openOr "org.h2.Driver"
case _ => "org.h2.Driver"
}
val vendor =
Props.mode match {
case Props.RunModes.Production | Props.RunModes.Staging | Props.RunModes.Development =>
new StandardDBVendor(driver,
Props.get("remotedata.db.url") openOr "jdbc:h2:./lift_proto.remotedata.db;AUTO_SERVER=TRUE",
Props.get("remotedata.db.user"), Props.get("remotedata.db.password"))
case _ =>
new StandardDBVendor(
driver,
"jdbc:h2:mem:OBPData;DB_CLOSE_DELAY=-1",
Empty, Empty)
}
logger.debug("Using database driver: " + driver)
LiftRules.unloadHooks.append(vendor.closeAllConnections_! _)
DB.defineConnectionManager(net.liftweb.util.DefaultConnectionIdentifier, vendor)
}
}
// Entry point if running as standalone remote data server, without jetty
def main (args: Array[String]): Unit = {
if (args.length >= 1 && args(0) == "standalone") {
setupRemotedataDB()
showLogoAfterDelay()
startRemoteWorkerSystem()
}
}
def showLogoAfterDelay() = {
val actorSystem = ActorSystem()
implicit val executor = actorSystem.dispatcher
val scheduler = actorSystem.scheduler
scheduler.scheduleOnce(
Duration(4, TimeUnit.SECONDS),
runnable = new Runnable {
def run(): Unit = {
println(
"""
| ______ _______ _______ __ _______ __
| / " \ | _ "\ | __ "\ /""\ | __ "\ |" \
| // ____ \ (. |_) :) (. |__) :) _____ / \ (. |__) :)|| |
| / / ) :)|: \/ |: ____/ // ") /' /\ \ |: ____/ |: |
| (: (____/ // (| _ \\ (| / (_____/ // __' \ (| / |. |
| \ / |: |_) :)/|__/ \ / / \\ \ /|__/ \ /\ |\
| \"_____/ (_______/(_______) (___/ \___)(_______) (__\_|_)
| _______ _______ ___ ___ ______ ___________ _______
| /" \ /" "||" \ /" | / " \(" _ ")/" "|
| |: |(: ______) \ \ // | // ____ \)__/ \\__/(: ______)
| |_____/ ) \/ | /\\ \/. | / / ) :) \\_ / \/ |
| // / // ___)_ |: \. |(: (____/ // |. | // ___)_
| |: __ \ (: "||. \ /: | \ / \: | (: "|
| |__| \___) \_______)|___|\__/|___| \"_____/ \__| \_______)
| __ ______ ___________ ______ _______
| /""\ /" _ "\(" _ ")/ " \ /" \
| / \ (: ( \___))__/ \\__/// ____ \ |: |
| /' /\ \ \/ \ \\_ / / / ) :)|_____/ )
| // __' \ // \ _ |. | (: (____/ // // /
| / / \\ \(: _) \ \: | \ / |: __ \
| (___/ \___)\_______) \__| \"_____/ |__| \___)
|""".stripMargin)
}
}
)
}
}

View File

@ -0,0 +1,42 @@
package code.remotedata
import akka.actor.ActorSystem
import com.typesafe.config.ConfigFactory
import net.liftweb.util.Props
import net.liftweb.common.Loggable
object RemotedataActorSystem extends Loggable {
var obpActorSystem: ActorSystem = null
def init () = {
if (obpActorSystem == null ) {
val system = ActorSystem("LookupSystem", ConfigFactory.load(ConfigFactory.parseString(RemotedataConfig.lookupConf)))
logger.info(RemotedataConfig.lookupConf)
obpActorSystem = system
}
obpActorSystem
}
def getActor(actorName: String) = {
this.init
val actorPath = Props.getBool("remotedata.enable", false) match {
case true =>
val hostname = RemotedataConfig.remoteHostname
val port = RemotedataConfig.remotePort
"akka.tcp://RemotedataActorSystem@" + hostname + ":" + port + "/user/" + actorName
case false =>
val hostname = RemotedataConfig.localHostname
val port = RemotedataConfig.localPort
"akka.tcp://RemotedataActorSystem@" + hostname + ":" + port + "/user/" + actorName
}
this.obpActorSystem.actorSelection(actorPath)
}
}

View File

@ -0,0 +1,123 @@
package code.remotedata
import java.util.concurrent.TimeUnit
import akka.actor.{Actor, ActorSystem, Props => ActorProps}
import akka.event.Logging
import akka.util.Timeout
import bootstrap.liftweb.ToSchemify
import com.typesafe.config.ConfigFactory
import net.liftweb.common._
import net.liftweb.db.StandardDBVendor
import net.liftweb.http.LiftRules
import net.liftweb.mapper.{DB, Schemifier}
import net.liftweb.util.Props
import scala.concurrent.duration._
object RemotedataActors extends Loggable {
def startLocalWorkerSystem(): Unit = {
val system = ActorSystem("RemotedataActorSystem", ConfigFactory.load(ConfigFactory.parseString(RemotedataConfig.localConf)))
logger.info("Starting local RemotedataActorSystem")
logger.info(RemotedataConfig.localConf)
logger.info(system.actorOf(ActorProps[RemotedataUsersActor], name = "users"))
logger.info(system.actorOf(ActorProps[RemotedataViewsActor], name = "views"))
logger.info(system.actorOf(ActorProps[RemotedataAccountHoldersActor], name = "accountHolders"))
logger.info(system.actorOf(ActorProps[RemotedataCounterpartiesActor], name = "counterparties"))
logger.info(system.actorOf(ActorProps[RemotedataTagsActor], name = "tags"))
logger.info(system.actorOf(ActorProps[RemotedataCommentsActor], name = "comments"))
logger.info("Cmplete")
}
def startRemoteWorkerSystem(): Unit = {
val system = ActorSystem("RemotedataActorSystem", ConfigFactory.load(ConfigFactory.parseString(RemotedataConfig.remoteConf)))
logger.info("Starting remote RemotedataActorSystem")
logger.info(RemotedataConfig.remoteConf)
logger.info(system.actorOf(ActorProps[RemotedataUsersActor], name = "users"))
logger.info(system.actorOf(ActorProps[RemotedataViewsActor], name = "views"))
logger.info(system.actorOf(ActorProps[RemotedataAccountHoldersActor], name = "accountHolders"))
logger.info(system.actorOf(ActorProps[RemotedataCounterpartiesActor], name = "counterparties"))
logger.info(system.actorOf(ActorProps[RemotedataTagsActor], name = "tags"))
logger.info(system.actorOf(ActorProps[RemotedataCommentsActor], name = "comments"))
logger.info("Complete")
}
def setupRemotedataDB(): Unit = {
// set up the way to connect to the relational DB we're using (ok if other connector than relational)
if (!DB.jndiJdbcConnAvailable_?) {
val driver =
Props.mode match {
case Props.RunModes.Production | Props.RunModes.Staging | Props.RunModes.Development => Props.get("remotedata.db.driver") openOr "org.h2.Driver"
case _ => "org.h2.Driver"
}
val vendor =
Props.mode match {
case Props.RunModes.Production | Props.RunModes.Staging | Props.RunModes.Development =>
new StandardDBVendor(driver,
Props.get("remotedata.db.url") openOr "jdbc:h2:./lift_proto.remotedata.db;AUTO_SERVER=TRUE",
Props.get("remotedata.db.user"), Props.get("remotedata.db.password"))
case _ =>
new StandardDBVendor(
driver,
"jdbc:h2:mem:OBPData;DB_CLOSE_DELAY=-1",
Empty, Empty)
}
logger.debug("Using database driver: " + driver)
LiftRules.unloadHooks.append(vendor.closeAllConnections_! _)
DB.defineConnectionManager(net.liftweb.util.DefaultConnectionIdentifier, vendor)
}
Schemifier.schemify(true, Schemifier.infoF _, ToSchemify.modelsRemotedata: _*)
}
// Entry point if running as standalone remote data server, without jetty
def main (args: Array[String]): Unit = {
if (args.length >= 1 && args(0) == "standalone") {
setupRemotedataDB()
showLogoAfterDelay()
startRemoteWorkerSystem()
}
}
def showLogoAfterDelay() = {
val actorSystem = ActorSystem()
implicit val executor = actorSystem.dispatcher
val scheduler = actorSystem.scheduler
scheduler.scheduleOnce(
Duration(4, TimeUnit.SECONDS),
runnable = new Runnable {
def run(): Unit = {
println(
"""
| ______ _______ _______ __ _______ __
| / " \ | _ "\ | __ "\ /""\ | __ "\ |" \
| // ____ \ (. |_) :) (. |__) :) _____ / \ (. |__) :)|| |
| / / ) :)|: \/ |: ____/ // ") /' /\ \ |: ____/ |: |
| (: (____/ // (| _ \\ (| / (_____/ // __' \ (| / |. |
| \ / |: |_) :)/|__/ \ / / \\ \ /|__/ \ /\ |\
| \"_____/ (_______/(_______) (___/ \___)(_______) (__\_|_)
| _______ _______ ___ ___ ______ ___________ _______
| /" \ /" "||" \ /" | / " \(" _ ")/" "|
| |: |(: ______) \ \ // | // ____ \)__/ \\__/(: ______)
| |_____/ ) \/ | /\\ \/. | / / ) :) \\_ / \/ |
| // / // ___)_ |: \. |(: (____/ // |. | // ___)_
| |: __ \ (: "||. \ /: | \ / \: | (: "|
| |__| \___) \_______)|___|\__/|___| \"_____/ \__| \_______)
| __ ______ ___________ ______ _______
| /""\ /" _ "\(" _ ")/ " \ /" \
| / \ (: ( \___))__/ \\__/// ____ \ |: |
| /' /\ \ \/ \ \\_ / / / ) :)|_____/ )
| // __' \ // \ _ |. | (: (____/ // // /
| / / \\ \(: _) \ \: | \ / |: __ \
| (___/ \___)\_______) \__| \"_____/ |__| \___)
|""".stripMargin)
}
}
)
}
}

View File

@ -0,0 +1,65 @@
package code.remotedata
import java.util.Date
import akka.actor.ActorKilledException
import akka.pattern.ask
import akka.util.Timeout
import code.api.APIFailure
import code.metadata.comments.{Comments, RemoteCommentsCaseClasses}
import code.model._
import net.liftweb.common.{Full, _}
import scala.collection.immutable.List
import scala.concurrent.Await
import scala.concurrent.duration._
object RemotedataComments extends Comments {
implicit val timeout = Timeout(10000 milliseconds)
val TIMEOUT = 10 seconds
val rComments = RemoteCommentsCaseClasses
var commentsActor = RemotedataActorSystem.getActor("comments")
def getComments(bankId : BankId, accountId : AccountId, transactionId : TransactionId)(viewId : ViewId) : List[Comment] = {
Await.result(
(commentsActor ? rComments.getComments(bankId, accountId, transactionId, viewId)).mapTo[List[Comment]],
TIMEOUT
)
}
def addComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(userId: UserId, viewId : ViewId, text : String, datePosted : Date) : Box[Comment] = {
Full(
Await.result(
(commentsActor ? rComments.addComment(bankId, accountId, transactionId, userId, viewId, text, datePosted)).mapTo[Comment],
TIMEOUT
)
)
}
def deleteComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(commentId : String) : Box[Boolean] = {
val res = try {
Full(
Await.result(
(commentsActor ? rComments.deleteComment(bankId, accountId, transactionId, commentId)).mapTo[Boolean],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Cannot delete the comment", 404)
case e: Throwable => throw e
}
res
}
def bulkDeleteComments(bankId: BankId, accountId: AccountId): Boolean = {
Await.result(
(commentsActor ? rComments.bulkDeleteComments(bankId, accountId)).mapTo[Boolean],
TIMEOUT
)
}
}

View File

@ -0,0 +1,70 @@
package code.remotedata
import java.util.concurrent.TimeUnit
import akka.actor.Actor
import akka.event.Logging
import akka.util.Timeout
import bootstrap.liftweb.ToSchemify
import code.metadata.comments.{MappedComment, MappedComments, RemoteCommentsCaseClasses}
import code.model._
import net.liftweb.common._
import net.liftweb.util.ControlHelpers.tryo
import scala.concurrent.duration._
class RemotedataCommentsActor extends Actor {
val logger = Logging(context.system, this)
val mComments = MappedComments
val rComments = RemoteCommentsCaseClasses
def receive = {
case rComments.getComments(bankId, accountId, transactionId, viewId) =>
logger.info("getComments(" + bankId +", "+ accountId +", "+ transactionId +", "+ viewId +")")
sender ! mComments.getComments(bankId, accountId, transactionId)(viewId)
case rComments.addComment(bankId, accountId, transactionId, userId, viewId, text, datePosted) =>
logger.info("addComment(" + bankId +", "+ accountId +", "+ transactionId +", "+ text +", "+ text +", "+ datePosted +")")
{
for {
res <- mComments.addComment(bankId, accountId, transactionId)(userId, viewId, text, datePosted)
} yield {
sender ! res.asInstanceOf[Comment]
}
}.getOrElse( context.stop(sender) )
case rComments.deleteComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId, commentId : String) =>
logger.info("deleteComment(" + bankId +", "+ accountId +", "+ transactionId + commentId +")")
{
for {
res <- mComments.deleteComment(bankId, accountId, transactionId)(commentId)
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rComments.bulkDeleteComments(bankId: BankId, accountId: AccountId) =>
logger.info("bulkDeleteComments(" + bankId +", "+ accountId + ")")
{
for {
res <- tryo{mComments.bulkDeleteComments(bankId, accountId)}
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message)
}
}

View File

@ -0,0 +1,106 @@
package code.remotedata
import akka.actor.ActorSystem
import com.typesafe.config.ConfigFactory
import net.liftweb.util.Props
object RemotedataConfig {
val remoteHostname = Props.get("remotedata.hostname").openOr("127.0.0.1")
val remotePort = Props.get("remotedata.port").openOr("2662")
val localHostname = "127.0.0.1"
val localPort = "2552"
val commonConf =
"""
akka {
extensions = ["com.romix.akka.serialization.kryo.KryoSerializationExtension$"]
actor {
provider = "akka.remote.RemoteActorRefProvider"
kryo {
type = "graph"
idstrategy = "default"
buffer-size = 65536
max-buffer-size = -1
use-manifests = false
use-unsafe = true
post-serialization-transformations = "off"
#post-serialization-transformations = "lz4,aes"
#encryption {
# aes {
# mode = "AES/CBC/PKCS5Padding"
# key = j68KkRjq21ykRGAQ
# IV-length = 16
# }
#}
implicit-registration-logging = true
kryo-trace = false
resolve-subclasses = true
}
serializers {
kryo = "com.romix.akka.serialization.kryo.KryoSerializer"
}
serialization-bindings {
"net.liftweb.common.Full" = kryo,
"net.liftweb.common.Empty" = kryo,
"net.liftweb.common.Box" = kryo,
"net.liftweb.common.ParamFailure" = kryo,
"code.api.APIFailure" = kryo,
"code.views.RemoteViewCaseClasses" = kryo,
"code.model.BankAccount" = kryo,
"code.model.View" = kryo,
"code.model.dataAccess.ViewImpl" = kryo,
"code.model.User" = kryo,
"code.model.ViewId" = kryo,
"code.model.ViewUID" = kryo,
"code.model.Permission" = kryo,
"scala.Unit" = kryo,
"scala.Boolean" = kryo,
"java.io.Serializable" = kryo,
"scala.collection.immutable.List" = kryo,
"akka.actor.ActorSelectionMessage" = kryo
}
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty {
tcp {
send-buffer-size = 50000000
receive-buffer-size = 50000000
maximum-frame-size = 52428800
}
}
}
}
"""
val lookupConf =
s"""
${commonConf}
akka {
remote.netty.tcp.hostname = ${localHostname}
remote.netty.tcp.port = 0
}
"""
val localConf =
s"""
${commonConf}
akka {
remote.netty.tcp.hostname = ${localHostname}
remote.netty.tcp.port = ${localPort}
}
"""
val remoteConf =
s"""
${commonConf}
akka {
remote.netty.tcp.hostname = ${remoteHostname}
remote.netty.tcp.port = ${remotePort}
}
"""
}

View File

@ -0,0 +1,131 @@
package code.remotedata
import java.util.Date
import akka.actor.ActorKilledException
import akka.pattern.ask
import akka.util.Timeout
import code.api.APIFailure
import code.metadata.counterparties.{RemoteCounterpartiesCaseClasses, CounterpartyTrait, Counterparties}
import code.model._
import net.liftweb.common.{Full, _}
import scala.collection.immutable.List
import scala.concurrent.Await
import scala.concurrent.duration._
object RemotedataCounterparties extends Counterparties {
implicit val timeout = Timeout(10000 milliseconds)
val TIMEOUT = 10 seconds
val rCounterparties = RemoteCounterpartiesCaseClasses
var counterpartiesActor = RemotedataActorSystem.getActor("counterparties")
override def getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty): Box[CounterpartyMetadata] = {
val res = try {
Full(
Await.result(
(counterpartiesActor ? rCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty)).mapTo[CounterpartyMetadata],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not getOrCreateMetadata", 404)
case e: Throwable => throw e
}
res
}
override def getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId): List[CounterpartyMetadata] = {
val res = try {
Full(
Await.result(
(counterpartiesActor ? rCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId)).mapTo[List[CounterpartyMetadata]],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not getMetadatas", 404)
case e: Throwable => throw e
}
res.get
}
override def getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String): Box[CounterpartyMetadata] = {
val res = try {
Full(
Await.result(
(counterpartiesActor ? rCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String)).mapTo[CounterpartyMetadata],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not getMetadata", 404)
case e: Throwable => throw e
}
res
}
override def getCounterparty(counterPartyId: String): Box[CounterpartyTrait] = {
val res = try {
Full(
Await.result(
(counterpartiesActor ? rCounterparties.getCounterparty(counterPartyId: String)).mapTo[CounterpartyTrait],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not getCounterparty", 404)
case e: Throwable => throw e
}
res
}
override def getCounterpartyByIban(iban: String): Box[CounterpartyTrait] = {
val res = try {
Full(
Await.result(
(counterpartiesActor ? rCounterparties.getCounterpartyByIban(iban: String)).mapTo[CounterpartyTrait],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not getCounterpartyByIban", 404)
case e: Throwable => throw e
}
res
}
override def createCounterparty(createdByUserId: String, thisBankId: String, thisAccountId: String, thisViewId: String, name: String, otherBankId: String, otherAccountId: String, otherAccountRoutingScheme: String, otherAccountRoutingAddress: String, otherBankRoutingScheme: String, otherBankRoutingAddress: String, isBeneficiary: Boolean): Box[CounterpartyTrait] = {
val res = try {
Full(
Await.result(
(counterpartiesActor ? rCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, name, otherBankId, otherAccountId,
otherAccountRoutingScheme, otherAccountRoutingAddress, otherBankRoutingScheme, otherBankRoutingAddress,
isBeneficiary)).mapTo[CounterpartyTrait],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Can not createCounterparty", 404)
case e: Throwable => throw e
}
res
}
override def checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String): Boolean = {
Await.result(
(counterpartiesActor ? rCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)).mapTo[Boolean],
TIMEOUT
)
}
}

View File

@ -0,0 +1,119 @@
package code.remotedata
import java.util.concurrent.TimeUnit
import akka.actor.Actor
import akka.event.Logging
import akka.util.Timeout
import code.metadata.counterparties.{CounterpartyTrait, MapperCounterparties, RemoteCounterpartiesCaseClasses}
import code.model._
import net.liftweb.common._
import net.liftweb.util.ControlHelpers.tryo
import scala.concurrent.duration._
class RemotedataCounterpartiesActor extends Actor {
val logger = Logging(context.system, this)
val mCounterparties = MapperCounterparties
val rCounterparties = RemoteCounterpartiesCaseClasses
def receive = {
case rCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)=>
logger.info("checkCounterpartyAvailable(" + name +", "+ thisBankId +", "+ thisAccountId +", "+ thisViewId +")")
sender ! mCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)
case rCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId,
name, otherBankId, otherAccountId, otherAccountRoutingScheme,
otherAccountRoutingAddress, otherBankRoutingScheme,
otherBankRoutingAddress, isBeneficiary) =>
logger.info("createCounterparty(" + createdByUserId +", "+ thisBankId +", "+ thisAccountId +", "+ thisViewId +", "+ name +", "+ otherBankId + otherAccountId +", "
+ otherAccountRoutingScheme +", "+ otherAccountRoutingAddress +", "+ otherBankRoutingScheme +", "+ otherBankRoutingAddress +", "+ isBeneficiary+ ")")
{
for {
res <- mCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, name, otherBankId, otherAccountId,
otherAccountRoutingScheme, otherAccountRoutingAddress, otherBankRoutingScheme, otherBankRoutingAddress,
isBeneficiary)
} yield {
sender ! res.asInstanceOf[CounterpartyTrait]
}
}.getOrElse( context.stop(sender) )
case rCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty) =>
logger.info("getOrCreateMetadata(" + originalPartyBankId +", " +originalPartyAccountId+otherParty+")")
{
for {
res <- mCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty)
} yield {
sender ! res.asInstanceOf[CounterpartyMetadata]
}
}.getOrElse( context.stop(sender) )
case rCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId) =>
logger.info("getOrCreateMetadata(" + originalPartyBankId +", "+originalPartyAccountId+")")
Full({
for {
res <- Full(mCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId))
} yield {
sender ! res.asInstanceOf[List[CounterpartyMetadata]]
}
}).getOrElse(context.stop(sender))
case rCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String) =>
logger.info("getMetadata(" + originalPartyBankId +", "+originalPartyAccountId+")")
{
for {
res <- mCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String)
} yield {
sender ! res.asInstanceOf[CounterpartyMetadata]
}
}.getOrElse( context.stop(sender) )
case rCounterparties.getCounterparty(counterPartyId: String) =>
logger.info("getCounterparty(" + counterPartyId +")")
{
for {
res <- mCounterparties.getCounterparty(counterPartyId: String)
} yield {
sender ! res.asInstanceOf[CounterpartyTrait]
}
}.getOrElse( context.stop(sender) )
case rCounterparties.getCounterpartyByIban(iban: String) =>
logger.info("getOrCreateMetadata(" + iban +")")
{
for {
res <- mCounterparties.getCounterpartyByIban(iban: String)
} yield {
sender ! res.asInstanceOf[CounterpartyTrait]
}
}.getOrElse( context.stop(sender) )
case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message)
}
}

View File

@ -0,0 +1,66 @@
package code.remotedata
import java.util.Date
import akka.actor.ActorKilledException
import akka.pattern.ask
import akka.util.Timeout
import code.api.APIFailure
import code.metadata.tags.{RemoteTagsCaseClasses, Tags}
import code.model._
import net.liftweb.common.{Full, _}
import scala.collection.immutable.List
import scala.concurrent.Await
import scala.concurrent.duration._
object RemotedataTags extends Tags {
implicit val timeout = Timeout(10000 milliseconds)
val TIMEOUT = 10 seconds
val rTags = RemoteTagsCaseClasses
var tagsActor = RemotedataActorSystem.getActor("tags")
def getTags(bankId : BankId, accountId : AccountId, transactionId : TransactionId)(viewId : ViewId) : List[TransactionTag] = {
Await.result(
(tagsActor ? rTags.getTags(bankId, accountId, transactionId, viewId)).mapTo[List[TransactionTag]],
TIMEOUT
)
}
def addTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(userId: UserId, viewId : ViewId, tagText : String, datePosted : Date) : Box[TransactionTag] = {
Full(
Await.result(
(tagsActor ? rTags.addTag(bankId, accountId, transactionId, userId, viewId, tagText, datePosted)).mapTo[TransactionTag],
TIMEOUT
)
)
}
def deleteTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(tagId : String) : Box[Boolean] = {
val res = try {
Full(
Await.result(
(tagsActor ? rTags.deleteTag(bankId, accountId, transactionId, tagId)).mapTo[Boolean],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Cannot delete the tag", 404)
case e: Throwable => throw e
}
res
}
def bulkDeleteTags(bankId: BankId, accountId: AccountId): Boolean = {
Await.result(
(tagsActor ? rTags.bulkDeleteTags(bankId, accountId)).mapTo[Boolean],
TIMEOUT
)
}
}

View File

@ -0,0 +1,70 @@
package code.remotedata
import java.util.concurrent.TimeUnit
import akka.actor.Actor
import akka.event.Logging
import akka.util.Timeout
import code.metadata.tags.{MappedTags, RemoteTagsCaseClasses}
import code.model._
import net.liftweb.common._
import net.liftweb.util.ControlHelpers.tryo
import scala.concurrent.duration._
class RemotedataTagsActor extends Actor {
val logger = Logging(context.system, this)
val mTags = MappedTags
val rTags = RemoteTagsCaseClasses
def receive = {
case rTags.getTags(bankId, accountId, transactionId, viewId) =>
logger.info("getTags(" + bankId +", "+ accountId +", "+ transactionId +", "+ viewId +")")
sender ! mTags.getTags(bankId, accountId, transactionId)(viewId)
case rTags.addTag(bankId, accountId, transactionId, userId, viewId, text, datePosted) =>
logger.info("addTag(" + bankId +", "+ accountId +", "+ transactionId +", "+ text +", "+ text +", "+ datePosted +")")
{
for {
res <- mTags.addTag(bankId, accountId, transactionId)(userId, viewId, text, datePosted)
} yield {
sender ! res.asInstanceOf[TransactionTag]
}
}.getOrElse( context.stop(sender) )
case rTags.deleteTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId, tagId : String) =>
logger.info("deleteTag(" + bankId +", "+ accountId +", "+ transactionId + tagId +")")
{
for {
res <- mTags.deleteTag(bankId, accountId, transactionId)(tagId)
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rTags.bulkDeleteTags(bankId: BankId, accountId: AccountId) =>
logger.info("bulkDeleteTags(" + bankId +", "+ accountId + ")")
{
for {
res <- tryo{mTags.bulkDeleteTags(bankId, accountId)}
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message)
}
}

View File

@ -0,0 +1,210 @@
package code.remotedata
import akka.actor.ActorKilledException
import akka.pattern.ask
import akka.util.Timeout
import code.api.APIFailure
import code.model.User
import code.model.dataAccess.ResourceUser
import code.users.{RemoteUserCaseClasses, Users}
import net.liftweb.common.{Full, _}
import scala.collection.immutable.List
import scala.concurrent.Await
import scala.concurrent.duration._
object RemotedataUsers extends Users {
implicit val timeout = Timeout(10000 milliseconds)
val TIMEOUT = 10 seconds
val rUsers = RemoteUserCaseClasses
var usersActor = RemotedataActorSystem.getActor("users")
def getUserByResourceUserId(id : Long) : Box[User] = {
val res = try {
Full(
Await.result(
(usersActor ? rUsers.getUserByResourceUserId(id)).mapTo[User],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404)
case e: Throwable => throw e
}
res
}
def getResourceUserByResourceUserId(id : Long) : Box[ResourceUser] = {
val res = try {
Full(
Await.result(
(usersActor ? rUsers.getResourceUserByResourceUserId(id)).mapTo[ResourceUser],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"ResourceUser not found", 404)
case e: Throwable => throw e
}
res
}
def getUserByProviderId(provider : String, idGivenByProvider : String) : Box[User] = {
val res = try {
Full(
Await.result(
(usersActor ? rUsers.getUserByProviderId(provider, idGivenByProvider)).mapTo[User],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404)
case e: Throwable => throw e
}
res
}
def getUserByUserId(userId : String) : Box[User] = {
val res = try {
Full(
Await.result(
(usersActor ? rUsers.getUserByUserId(userId)).mapTo[User],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404)
case e: Throwable => throw e
}
res
}
def getUserByUserName(userName : String) : Box[ResourceUser] = {
val res = try {
Full(
Await.result(
(usersActor ? rUsers.getUserByUserName(userName)).mapTo[ResourceUser],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404)
case e: Throwable => throw e
}
res
}
def getUserByEmail(email : String) : Box[List[ResourceUser]] = {
val res = try {
Full(
Await.result(
(usersActor ? rUsers.getUserByEmail(email)).mapTo[List[ResourceUser]],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404)
case e: Throwable => throw e
}
res
}
def getAllUsers() : Box[List[ResourceUser]] = {
val res = try {
Full(
Await.result(
(usersActor ? rUsers.getAllUsers()).mapTo[List[ResourceUser]],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"Users not found", 404)
case e: Throwable => throw e
}
res
}
def createResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) : Box[ResourceUser] = {
val res = try {
Full(
Await.result(
(usersActor ? rUsers.createResourceUser(provider, providerId, name, email, userId)).mapTo[ResourceUser],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404)
case e: Throwable => throw e
}
res
}
def createUnsavedResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) : Box[ResourceUser] = {
val res = try {
Full(
Await.result(
(usersActor ? rUsers.createUnsavedResourceUser(provider, providerId, name, email, userId)).mapTo[ResourceUser],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404)
case e: Throwable => throw e
}
res
}
def saveResourceUser(resourceUser: ResourceUser) : Box[ResourceUser] = {
val res = try {
Full(
Await.result(
(usersActor ? rUsers.saveResourceUser(resourceUser)).mapTo[ResourceUser],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404)
case e: Throwable => throw e
}
res
}
def deleteResourceUser(userId: Long) : Box[Boolean] = {
val res = try{
Full(
Await.result(
(usersActor ? rUsers.deleteResourceUser(userId)).mapTo[Boolean],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"User not deleted", 404)
case e: Throwable => throw e
}
res
}
def bulkDeleteAllResourceUsers(): Box[Boolean] = {
Full(
Await.result(
(usersActor ? rUsers.bulkDeleteAllResourceUsers()).mapTo[Boolean],
TIMEOUT
)
)
}
}

View File

@ -0,0 +1,166 @@
package code.remotedata
import java.util.concurrent.TimeUnit
import akka.actor.Actor
import akka.event.Logging
import akka.util.Timeout
import code.model._
import code.model.dataAccess.ResourceUser
import code.users.{LiftUsers, RemoteUserCaseClasses}
import net.liftweb.common._
import net.liftweb.util.ControlHelpers.tryo
import scala.concurrent.duration._
class RemotedataUsersActor extends Actor {
val logger = Logging(context.system, this)
val mUsers = LiftUsers
val rUsers = RemoteUserCaseClasses
def receive = {
case rUsers.getUserByResourceUserId(id: Long) =>
logger.info("getUserByResourceUserId(" + id +")")
{
for {
res <- mUsers.getUserByResourceUserId(id)
} yield {
sender ! res.asInstanceOf[User]
}
}.getOrElse( context.stop(sender) )
case rUsers.getResourceUserByResourceUserId(id: Long) =>
logger.info("getResourceUserByResourceUserId(" + id +")")
{
for {
res <- mUsers.getResourceUserByResourceUserId(id)
} yield {
sender ! res.asInstanceOf[ResourceUser]
}
}.getOrElse( context.stop(sender) )
case rUsers.getUserByProviderId(provider : String, idGivenByProvider : String) =>
logger.info("getUserByProviderId(" + provider +"," + idGivenByProvider +")")
{
for {
res <- mUsers.getUserByProviderId(provider, idGivenByProvider)
} yield {
sender ! res.asInstanceOf[User]
}
}.getOrElse( context.stop(sender) )
case rUsers.getUserByUserId(userId: String) =>
logger.info("getUserByUserId(" + userId +")")
{
for {
res <- mUsers.getUserByUserId(userId)
} yield {
sender ! res.asInstanceOf[User]
}
}.getOrElse( context.stop(sender) )
case rUsers.getUserByUserName(userName: String) =>
logger.info("getUserByUserName(" + userName +")")
{
for {
res <- mUsers.getUserByUserName(userName)
} yield {
sender ! res.asInstanceOf[ResourceUser]
}
}.getOrElse( context.stop(sender) )
case rUsers.getUserByEmail(email: String) =>
logger.info("getUserByEmail(" + email +")")
{
for {
res <- mUsers.getUserByEmail(email)
} yield {
sender ! res
}
}.getOrElse( context.stop(sender) )
case rUsers.getAllUsers() =>
logger.info("getAllUsers()")
{
for {
res <- mUsers.getAllUsers()
} yield {
sender ! res
}
}.getOrElse( context.stop(sender) )
case rUsers.createResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) =>
logger.info("createResourceUser(" + provider + ", " + providerId.getOrElse("None") + ", " + name.getOrElse("None") + ", " + email.getOrElse("None") + ", " + userId.getOrElse("None") + ")")
{
for {
res <- mUsers.createResourceUser(provider, providerId, name, email, userId)
} yield {
sender ! res.asInstanceOf[ResourceUser]
}
}.getOrElse( context.stop(sender) )
case rUsers.createUnsavedResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) =>
logger.info("createUnsavedResourceUser(" + provider + ", " + providerId.getOrElse("None") + ", " + name.getOrElse("None") + ", " + email.getOrElse("None") + ", " + userId.getOrElse("None") + ")")
{
for {
res <- mUsers.createUnsavedResourceUser(provider, providerId, name, email, userId)
} yield {
sender ! res.asInstanceOf[ResourceUser]
}
}.getOrElse( context.stop(sender) )
case rUsers.saveResourceUser(resourceUser: ResourceUser) =>
logger.info("saveResourceUser")
{
for {
res <- mUsers.saveResourceUser(resourceUser)
} yield {
sender ! res.asInstanceOf[ResourceUser]
}
}.getOrElse( context.stop(sender) )
case rUsers.deleteResourceUser(id: Long) =>
logger.info("deleteResourceUser(" + id +")")
{
for {
res <- tryo{mUsers.deleteResourceUser(id)}
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rUsers.bulkDeleteAllResourceUsers() =>
logger.info("bulkDeleteAllResourceUsers()")
{
for {
res <- mUsers.bulkDeleteAllResourceUsers()
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message)
}
}

View File

@ -0,0 +1,331 @@
package code.remotedata
import akka.actor.ActorKilledException
import akka.pattern.ask
import akka.util.Timeout
import code.api.APIFailure
import code.model.{CreateViewJSON, Permission, UpdateViewJSON, _}
import code.views.{RemoteViewCaseClasses, Views}
import net.liftweb.common.{Full, _}
import scala.collection.immutable.List
import scala.concurrent.Await
import scala.concurrent.duration._
object RemotedataViews extends Views {
implicit val timeout = Timeout(10000 milliseconds)
val TIMEOUT = 10 seconds
val rViews = RemoteViewCaseClasses
var viewsActor = RemotedataActorSystem.getActor("views")
def addPermissions(views: List[ViewUID], user: User): Box[List[View]] = {
val res = try {
Full(
Await.result(
(viewsActor ? rViews.addPermissions(views, user)).mapTo[List[View]],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"One or more views not found", 404)
case e: Throwable => throw e
}
res
}
def permission(account: BankAccountUID, user: User): Box[Permission] = {
Full(
Await.result(
(viewsActor ? rViews.permission(account, user)).mapTo[Permission],
TIMEOUT
)
)
}
def addPermission(viewUID: ViewUID, user: User): Box[View] = {
val res = try {
Full(
Await.result(
(viewsActor ? rViews.addPermission(viewUID, user)).mapTo[View],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"View $viewUID. not found", 404)
case e: Throwable => throw e
}
res
}
//TODO Fix return values in order to better describe failures
def revokePermission(viewUID : ViewUID, user : User) : Box[Boolean] = {
val res = try {
Full(
Await.result(
(viewsActor ? rViews.revokePermission(viewUID, user)).mapTo[Boolean],
TIMEOUT
)
)
}
catch {
case k: ClassCastException => k.getMessage match {
case "Cannot cast net.liftweb.common.Failure to java.lang.Boolean" =>
return Empty ~> APIFailure(s"View $viewUID. not removed", 400)
case "Cannot cast net.liftweb.common.ParamFailure to java.lang.Boolean" =>
return Empty ~> APIFailure(s"View $viewUID. not found", 404)
case _ =>
return Empty ~> APIFailure(s"Unknown error", 406)
}
case e: Throwable => throw e
}
res
}
def revokeAllPermissions(bankId : BankId, accountId: AccountId, user : User) : Box[Boolean] = {
val res = try{
Full(
Await.result(
(viewsActor ? rViews.revokeAllPermissions(bankId, accountId, user)).mapTo[Boolean],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> Failure("One of the views this user has access to is the owner view, and there would be no one with access" +
" to this owner view if access to the user was revoked. No permissions to any views on the account have been revoked.")
case e: Throwable => throw e
}
res
}
def view(viewUID : ViewUID) : Box[View] = {
val res = try {
Full(
Await.result(
(viewsActor ? rViews.view(viewUID)).mapTo[View],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"View $viewUID. not found", 404)
case e: Throwable => throw e
}
res
}
def view(viewId : ViewId, account: BankAccountUID) : Box[View] = {
val res = try {
Full(
Await.result(
(viewsActor ? rViews.view(viewId, account)).mapTo[View],
TIMEOUT
)
)
}
catch {
case k: ActorKilledException => Empty ~> APIFailure(s"View $viewId. not found", 404)
case e: Throwable => throw e
}
res
}
def createView(bankAccountId: BankAccountUID, view: CreateViewJSON): Box[View] = {
Await.result(
(viewsActor ? rViews.createView(bankAccountId, view)).mapTo[Box[View]],
TIMEOUT
)
}
def updateView(bankAccountId : BankAccountUID, viewId: ViewId, viewUpdateJson : UpdateViewJSON) : Box[View] = {
Await.result(
(viewsActor ? rViews.updateView(bankAccountId, viewId, viewUpdateJson)).mapTo[Box[View]],
TIMEOUT
)
}
def removeView(viewId: ViewId, bankAccountId: BankAccountUID): Box[Unit] = {
Await.result(
(viewsActor ? rViews.removeView(viewId, bankAccountId)).mapTo[Box[Unit]],
TIMEOUT
)
}
def permissions(account : BankAccountUID) : List[Permission] = {
Await.result(
(viewsActor ? rViews.permissions(account)).mapTo[List[Permission]],
TIMEOUT
)
}
def views(bankAccountId : BankAccountUID) : List[View] = {
Await.result(
(viewsActor ? rViews.views(bankAccountId)).mapTo[List[View]],
TIMEOUT
)
}
def permittedViews(user: User, bankAccountId: BankAccountUID): List[View] = {
Await.result(
(viewsActor ? rViews.permittedViews(user, bankAccountId)).mapTo[List[View]],
TIMEOUT
)
}
def publicViews(bankAccountId : BankAccountUID) : List[View] = {
Await.result(
(viewsActor ? rViews.publicViews(bankAccountId)).mapTo[List[View]],
TIMEOUT
)
}
def getAllPublicAccounts() : List[BankAccountUID] = {
Await.result(
(viewsActor ? rViews.getAllPublicAccounts()).mapTo[List[BankAccountUID]],
TIMEOUT
)
}
def getPublicBankAccounts(bank : Bank) : List[BankAccountUID] = {
Await.result(
(viewsActor ? rViews.getPublicBankAccounts(bank)).mapTo[List[BankAccountUID]],
TIMEOUT
)
}
def getAllAccountsUserCanSee(user : Box[User]) : List[BankAccountUID] = {
user match {
case Full(theUser) => {
Await.result (
(viewsActor ? rViews.getAllAccountsUserCanSee(theUser)).mapTo[List[BankAccountUID]],
TIMEOUT)
}
case _ => getAllPublicAccounts()
}
}
def getAllAccountsUserCanSee(bank: Bank, user : Box[User]) : List[BankAccountUID] = {
user match {
case Full(theUser) => {
Await.result(
(viewsActor ? rViews.getAllAccountsUserCanSee(bank, theUser)).mapTo[List[BankAccountUID]],
TIMEOUT
)
}
case _ => getPublicBankAccounts(bank)
}
}
def getNonPublicBankAccounts(user : User) : List[BankAccountUID] = {
Await.result(
(viewsActor ? rViews.getNonPublicBankAccounts(user)).mapTo[List[BankAccountUID]],
TIMEOUT
)
}
def getNonPublicBankAccounts(user : User, bankId : BankId) : List[BankAccountUID] = {
Await.result(
(viewsActor ? rViews.getNonPublicBankAccounts(user, bankId)).mapTo[List[BankAccountUID]],
TIMEOUT
)
}
def grantAccessToAllExistingViews(user : User) = {
Await.result(
(viewsActor ? rViews.grantAccessToAllExistingViews(user)).mapTo[Boolean],
TIMEOUT
)
}
def grantAccessToView(user : User, view : View) = {
Await.result(
(viewsActor ? rViews.grantAccessToView(user, view)).mapTo[Boolean],
TIMEOUT
)
}
def getOwners(view: View) : Set[User] = {
Await.result(
(viewsActor ? rViews.getOwners(view)).mapTo[Set[User]],
TIMEOUT
)
}
def createOwnerView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = {
Full(Await.result(
(viewsActor ? rViews.createOwnerView(bankId, accountId, description)).mapTo[View],
TIMEOUT
)
)
}
def createPublicView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = {
Full(Await.result(
(viewsActor ? rViews.createPublicView(bankId, accountId, description)).mapTo[View],
TIMEOUT
)
)
}
def createAccountantsView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = {
Full(Await.result(
(viewsActor ? rViews.createAccountantsView(bankId, accountId, description)).mapTo[View],
TIMEOUT
)
)
}
def createAuditorsView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = {
Full(Await.result(
(viewsActor ? rViews.createAuditorsView(bankId, accountId, description)).mapTo[View],
TIMEOUT
)
)
}
def createRandomView(bankId: BankId, accountId: AccountId) : Box[View] = {
Full(Await.result(
(viewsActor ? rViews.createRandomView(bankId, accountId)).mapTo[View],
TIMEOUT
)
)
}
def viewExists(bankId: BankId, accountId: AccountId, name: String): Boolean = {
Await.result(
(viewsActor ? rViews.viewExists(bankId, accountId, name)).mapTo[Boolean],
TIMEOUT
)
}
def removeAllViews(bankId: BankId, accountId: AccountId): Boolean = {
Await.result(
(viewsActor ? rViews.removeAllViews(bankId, accountId)).mapTo[Boolean],
TIMEOUT
)
}
def removeAllPermissions(bankId: BankId, accountId: AccountId): Boolean = {
Await.result(
(viewsActor ? rViews.removeAllViews(bankId, accountId)).mapTo[Boolean],
TIMEOUT
)
}
// bulkDeletes for tests
def bulkDeleteAllPermissionsAndViews(): Boolean = {
Await.result(
(viewsActor ? rViews.bulkDeleteAllPermissionsAndViews()).mapTo[Boolean],
TIMEOUT
)
}
}

View File

@ -0,0 +1,237 @@
package code.remotedata
import java.util.concurrent.TimeUnit
import akka.actor.Actor
import akka.event.Logging
import akka.util.Timeout
import code.views.{MapperViews, RemoteViewCaseClasses}
import code.model._
import net.liftweb.common._
import net.liftweb.util.ControlHelpers.tryo
import scala.concurrent.duration._
class RemotedataViewsActor extends Actor {
val logger = Logging(context.system, this)
val mViews = MapperViews
val rViews = RemoteViewCaseClasses
def receive = {
case rViews.addPermissions(views : List[ViewUID], user : User) =>
logger.info("addPermissions(" + views +"," + user +")")
{
for {
res <- mViews.addPermissions(views, user)
} yield {
sender ! res.asInstanceOf[List[View]]
}
}.getOrElse( context.stop(sender) )
case rViews.addPermission(viewUID : ViewUID, user : User) =>
logger.info("addPermission(" + viewUID +"," + user +")")
{
for {
res <- mViews.addPermission(viewUID, user)
} yield {
sender ! res.asInstanceOf[View]
}
}.getOrElse( context.stop(sender) )
case rViews.permission(account : BankAccountUID, user: User) =>
logger.info("permission(" + account +"," + user +")")
{
for {
res <- mViews.permission(account, user)
} yield {
sender ! res.asInstanceOf[Permission]
}
}.getOrElse( context.stop(sender) )
//TODO Fix return values in order to better describe failures
case rViews.revokePermission(viewUID : ViewUID, user : User) =>
logger.info("revokePermission(" + viewUID +"," + user +")")
val res = mViews.revokePermission(viewUID, user)
res match {
case Full(r) => sender ! r
case f => sender ! f
}
case rViews.revokeAllPermissions(bankId : BankId, accountId : AccountId, user : User) =>
logger.info("revokeAllPermissions(" + bankId +"," + accountId +","+ user +")")
{
for {
res <- mViews.revokeAllPermissions(bankId, accountId, user)
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case rViews.view(viewUID : ViewUID) =>
logger.info("view(" + viewUID +")")
{
for {
res <- mViews.view(viewUID)
} yield {
sender ! res.asInstanceOf[View]
}
}.getOrElse( context.stop(sender) )
case rViews.view(viewId: ViewId, bankAccountId: BankAccountUID) =>
logger.info("view(" + viewId +", "+ bankAccountId + ")")
{
for {
res <- mViews.view(viewId, bankAccountId)
} yield {
sender ! res.asInstanceOf[View]
}
}.getOrElse( context.stop(sender) )
case rViews.createView(bankAccountId : BankAccountUID, view: CreateViewJSON) =>
logger.info("createView(" + bankAccountId +","+ view +")")
sender ! mViews.createView(bankAccountId, view)
case rViews.updateView(bankAccountId : BankAccountUID, viewId : ViewId, viewUpdateJson : UpdateViewJSON) =>
logger.info("updateView(" + bankAccountId +","+ viewId +","+ viewUpdateJson +")")
sender ! mViews.updateView(bankAccountId, viewId, viewUpdateJson)
//case r.view(viewId: ViewId, bankAccountId: BankAccountUID) =>
// logger.info("view(" + viewId +","+ bankAccountId +")")
// sender ! v.view(ViewId(viewId.value), bankAccountId)
case rViews.removeView(viewId : ViewId, bankAccountId: BankAccountUID) =>
logger.info("removeView(" + viewId +","+ bankAccountId +")")
sender ! mViews.removeView(viewId, bankAccountId)
case rViews.permissions(bankAccountId : BankAccountUID) =>
logger.info("premissions(" + bankAccountId +")")
sender ! mViews.permissions(bankAccountId)
case rViews.views(bankAccountId : BankAccountUID) =>
logger.info("views(" + bankAccountId +")")
sender ! mViews.views(bankAccountId)
case rViews.permittedViews(user: User, bankAccountId: BankAccountUID) =>
logger.info("permittedViews(" + user +", " + bankAccountId +")")
sender ! mViews.permittedViews(user, bankAccountId)
case rViews.publicViews(bankAccountId : BankAccountUID) =>
logger.info("publicViews(" + bankAccountId +")")
sender ! mViews.publicViews(bankAccountId)
case rViews.getAllPublicAccounts() =>
logger.info("getAllPublicAccounts()")
sender ! mViews.getAllPublicAccounts
case rViews.getPublicBankAccounts(bank : Bank) =>
logger.info("getPublicBankAccounts(" + bank +")")
sender ! mViews.getPublicBankAccounts(bank)
case rViews.getAllAccountsUserCanSee(user : Box[User]) =>
logger.info("getAllAccountsUserCanSee(" + user +")")
sender ! mViews.getAllAccountsUserCanSee(user)
case rViews.getAllAccountsUserCanSee(user : User) =>
logger.info("getAllAccountsUserCanSee(" + user +")")
sender ! mViews.getAllAccountsUserCanSee(Full(user))
case rViews.getAllAccountsUserCanSee(bank: Bank, user : Box[User]) =>
logger.info("getAllAccountsUserCanSee(" + bank +", "+ user +")")
sender ! mViews.getAllAccountsUserCanSee(bank, user)
case rViews.getAllAccountsUserCanSee(bank: Bank, user : User) =>
logger.info("getAllAccountsUserCanSee(" + bank +", "+ user +")")
sender ! mViews.getAllAccountsUserCanSee(bank, Full(user))
case rViews.getNonPublicBankAccounts(user: User, bankId: BankId) =>
logger.info("getNonPublicBankAccounts(" + user +", "+ bankId +")")
sender ! mViews.getNonPublicBankAccounts(user, bankId)
case rViews.getNonPublicBankAccounts(user: User) =>
logger.info("getNonPublicBankAccounts(" + user +")")
sender ! mViews.getNonPublicBankAccounts(user)
case rViews.createOwnerView(bankId, accountId, description) =>
logger.info("createOwnerView(" + bankId +", "+ accountId +", "+ description +")")
sender ! mViews.createOwnerView(bankId, accountId, description).orNull
case rViews.createPublicView(bankId, accountId, description) =>
logger.info("createPublicView(" + bankId +", "+ accountId +", "+ description +")")
sender ! mViews.createPublicView(bankId, accountId, description).orNull
case rViews.createAccountantsView(bankId, accountId, description) =>
logger.info("createAccountantsView(" + bankId +", "+ accountId +", "+ description +")")
sender ! mViews.createAccountantsView(bankId, accountId, description).orNull
case rViews.createAuditorsView(bankId, accountId, description) =>
logger.info("createAuditorsView(" + bankId +", "+ accountId +", "+ description +")")
sender ! mViews.createAuditorsView(bankId, accountId, description).orNull
case rViews.createRandomView(bankId, accountId) =>
logger.info("createRandomView(" + bankId +", "+ accountId +")")
sender ! mViews.createRandomView(bankId, accountId).orNull
case rViews.getOwners(view) =>
logger.info("getOwners(" + view +")")
sender ! mViews.getOwners(view)
case rViews.grantAccessToView(user, view) =>
logger.info("grantAccessToView(" + user +", "+ view +")")
sender ! mViews.grantAccessToView(user, view)
case rViews.grantAccessToAllExistingViews(user) =>
logger.info("grantAccessToAllExistingViews(" + user +")")
sender ! mViews.grantAccessToAllExistingViews(user)
case rViews.removeAllPermissions(bankId, accountId) =>
logger.info("removeAllPermissions(" + bankId +", "+ accountId +")")
sender ! mViews.removeAllPermissions(bankId, accountId)
case rViews.removeAllViews(bankId, accountId) =>
logger.info("removeAllViews(" + bankId +", "+ accountId +")")
sender ! mViews.removeAllViews(bankId, accountId)
case rViews.bulkDeleteAllPermissionsAndViews() =>
logger.info("bulkDeleteAllPermissionsAndViews()")
{
for {
res <- tryo{mViews.bulkDeleteAllPermissionsAndViews()}
} yield {
sender ! res.asInstanceOf[Boolean]
}
}.getOrElse( context.stop(sender) )
case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message)
}
}

View File

@ -4,14 +4,14 @@ import net.liftweb.util.SimpleInjector
import net.liftweb.common.Box
import code.model.User
import code.model.dataAccess.ResourceUser
import code.remotedata.Remotedata
import code.remotedata.RemotedataUsers
object Users extends SimpleInjector {
val users = new Inject(buildOne _) {}
def buildOne: Users = LiftUsers
//def buildOne: Users = Remotedata
//def buildOne: Users = LiftUsers
def buildOne: Users = RemotedataUsers
}

View File

@ -5,15 +5,15 @@ import code.model._
import net.liftweb.util.SimpleInjector
import code.model.Permission
import code.model.CreateViewJSON
import code.remotedata.Remotedata
import code.remotedata.RemotedataViews
object Views extends SimpleInjector {
val views = new Inject(buildOne _) {}
//TODO Remove MapperViews when Remotedata is optimized and stable
def buildOne: Views = MapperViews
//def buildOne: Views = Remotedata
//def buildOne: Views = MapperViews
def buildOne: Views = RemotedataViews
}

View File

@ -121,7 +121,7 @@ trait LocalMappedConnectorTestSetup extends TestConnectorSetupWithStandardPermis
//empty the relational db tables after each test
ToSchemify.models.filterNot(exclusion).foreach(_.bulkDelete_!!())
if (!Props.getBool("enable_remotedata", false)) {
if (!Props.getBool("remotedata.enable", false)) {
ToSchemify.modelsRemotedata.filterNot(exclusion).foreach(_.bulkDelete_!!())
} else {
Views.views.vend.bulkDeleteAllPermissionsAndViews()

View File

@ -53,7 +53,7 @@ trait TestConnectorSetupWithStandardPermissions extends TestConnectorSetup {
//empty the relational db tables after each test
ToSchemify.models.filterNot(exclusion).foreach(_.bulkDelete_!!())
if (!Props.getBool("enable_remotedata", false)) {
if (!Props.getBool("remotedata.enable", false)) {
ToSchemify.modelsRemotedata.filterNot(exclusion).foreach(_.bulkDelete_!!())
} else {
Views.views.vend.bulkDeleteAllPermissionsAndViews()

View File

@ -92,7 +92,7 @@ class SandboxDataLoadingTest extends FlatSpec with SendServerRequests with Shoul
//drop database tables before
//MongoDB.getDb(DefaultMongoIdentifier).foreach(_.dropDatabase())
ToSchemify.models.foreach(_.bulkDelete_!!())
if (!Props.getBool("enable_remotedata", false)) {
if (!Props.getBool("remotedata.enable", false)) {
ToSchemify.modelsRemotedata.foreach(_.bulkDelete_!!())
} else {
Views.views.vend.bulkDeleteAllPermissionsAndViews()