Added maven artifact publishing to sbt build
This commit is contained in:
parent
b8e2f483b1
commit
ea7d4865bd
4 changed files with 29 additions and 309 deletions
|
|
@ -1,234 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009-2010 Scalable Solutions AB <http://scalablesolutions.se>
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.config
|
|
||||||
|
|
||||||
import se.scalablesolutions.akka.actor.Actor
|
|
||||||
import se.scalablesolutions.akka.dispatch.MessageDispatcher
|
|
||||||
|
|
||||||
sealed abstract class FaultHandlingStrategy
|
|
||||||
case class AllForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends FaultHandlingStrategy
|
|
||||||
case class OneForOneStrategy(maxNrOfRetries: Int, withinTimeRange: Int) extends FaultHandlingStrategy
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configuration classes - not to be used as messages.
|
|
||||||
*
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
object ScalaConfig {
|
|
||||||
sealed abstract class ConfigElement
|
|
||||||
|
|
||||||
abstract class Server extends ConfigElement
|
|
||||||
abstract class FailOverScheme extends ConfigElement
|
|
||||||
abstract class Scope extends ConfigElement
|
|
||||||
|
|
||||||
case class SupervisorConfig(restartStrategy: RestartStrategy, worker: List[Server]) extends Server
|
|
||||||
|
|
||||||
class Supervise(val actor: Actor, val lifeCycle: LifeCycle, _remoteAddress: RemoteAddress) extends Server {
|
|
||||||
val remoteAddress: Option[RemoteAddress] = if (_remoteAddress eq null) None else Some(_remoteAddress)
|
|
||||||
}
|
|
||||||
object Supervise {
|
|
||||||
def apply(actor: Actor, lifeCycle: LifeCycle, remoteAddress: RemoteAddress) = new Supervise(actor, lifeCycle, remoteAddress)
|
|
||||||
def apply(actor: Actor, lifeCycle: LifeCycle) = new Supervise(actor, lifeCycle, null)
|
|
||||||
def unapply(supervise: Supervise) = Some((supervise.actor, supervise.lifeCycle, supervise.remoteAddress))
|
|
||||||
}
|
|
||||||
|
|
||||||
case class RestartStrategy(
|
|
||||||
scheme: FailOverScheme,
|
|
||||||
maxNrOfRetries: Int,
|
|
||||||
withinTimeRange: Int,
|
|
||||||
trapExceptions: List[Class[_ <: Throwable]]) extends ConfigElement
|
|
||||||
|
|
||||||
case object AllForOne extends FailOverScheme
|
|
||||||
case object OneForOne extends FailOverScheme
|
|
||||||
|
|
||||||
case class LifeCycle(scope: Scope, callbacks: Option[RestartCallbacks]) extends ConfigElement
|
|
||||||
object LifeCycle {
|
|
||||||
def apply(scope: Scope) = new LifeCycle(scope, None)
|
|
||||||
}
|
|
||||||
case class RestartCallbacks(preRestart: String, postRestart: String) {
|
|
||||||
if ((preRestart eq null) || (postRestart eq null)) throw new IllegalArgumentException("Restart callback methods can't be null")
|
|
||||||
}
|
|
||||||
|
|
||||||
case object Permanent extends Scope
|
|
||||||
case object Temporary extends Scope
|
|
||||||
|
|
||||||
case class RemoteAddress(val hostname: String, val port: Int) extends ConfigElement
|
|
||||||
|
|
||||||
class Component(_intf: Class[_],
|
|
||||||
val target: Class[_],
|
|
||||||
val lifeCycle: LifeCycle,
|
|
||||||
val timeout: Int,
|
|
||||||
val transactionRequired: Boolean,
|
|
||||||
_dispatcher: MessageDispatcher, // optional
|
|
||||||
_remoteAddress: RemoteAddress // optional
|
|
||||||
) extends Server {
|
|
||||||
val intf: Option[Class[_]] = if (_intf eq null) None else Some(_intf)
|
|
||||||
val dispatcher: Option[MessageDispatcher] = if (_dispatcher eq null) None else Some(_dispatcher)
|
|
||||||
val remoteAddress: Option[RemoteAddress] = if (_remoteAddress eq null) None else Some(_remoteAddress)
|
|
||||||
}
|
|
||||||
object Component {
|
|
||||||
def apply(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int) =
|
|
||||||
new Component(intf, target, lifeCycle, timeout, false, null, null)
|
|
||||||
|
|
||||||
def apply(target: Class[_], lifeCycle: LifeCycle, timeout: Int) =
|
|
||||||
new Component(null, target, lifeCycle, timeout, false, null, null)
|
|
||||||
|
|
||||||
def apply(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, dispatcher: MessageDispatcher) =
|
|
||||||
new Component(intf, target, lifeCycle, timeout, false, dispatcher, null)
|
|
||||||
|
|
||||||
def apply(target: Class[_], lifeCycle: LifeCycle, timeout: Int, dispatcher: MessageDispatcher) =
|
|
||||||
new Component(null, target, lifeCycle, timeout, false, dispatcher, null)
|
|
||||||
|
|
||||||
def apply(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, remoteAddress: RemoteAddress) =
|
|
||||||
new Component(intf, target, lifeCycle, timeout, false, null, remoteAddress)
|
|
||||||
|
|
||||||
def apply(target: Class[_], lifeCycle: LifeCycle, timeout: Int, remoteAddress: RemoteAddress) =
|
|
||||||
new Component(null, target, lifeCycle, timeout, false, null, remoteAddress)
|
|
||||||
|
|
||||||
def apply(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, dispatcher: MessageDispatcher, remoteAddress: RemoteAddress) =
|
|
||||||
new Component(intf, target, lifeCycle, timeout, false, dispatcher, remoteAddress)
|
|
||||||
|
|
||||||
def apply(target: Class[_], lifeCycle: LifeCycle, timeout: Int, dispatcher: MessageDispatcher, remoteAddress: RemoteAddress) =
|
|
||||||
new Component(null, target, lifeCycle, timeout, false, dispatcher, remoteAddress)
|
|
||||||
|
|
||||||
def apply(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean) =
|
|
||||||
new Component(intf, target, lifeCycle, timeout, transactionRequired, null, null)
|
|
||||||
|
|
||||||
def apply(target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean) =
|
|
||||||
new Component(null, target, lifeCycle, timeout, transactionRequired, null, null)
|
|
||||||
|
|
||||||
def apply(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, dispatcher: MessageDispatcher) =
|
|
||||||
new Component(intf, target, lifeCycle, timeout, transactionRequired, dispatcher, null)
|
|
||||||
|
|
||||||
def apply(target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, dispatcher: MessageDispatcher) =
|
|
||||||
new Component(null, target, lifeCycle, timeout, transactionRequired, dispatcher, null)
|
|
||||||
|
|
||||||
def apply(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, remoteAddress: RemoteAddress) =
|
|
||||||
new Component(intf, target, lifeCycle, timeout, transactionRequired, null, remoteAddress)
|
|
||||||
|
|
||||||
def apply(target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, remoteAddress: RemoteAddress) =
|
|
||||||
new Component(null, target, lifeCycle, timeout, transactionRequired, null, remoteAddress)
|
|
||||||
|
|
||||||
def apply(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, dispatcher: MessageDispatcher, remoteAddress: RemoteAddress) =
|
|
||||||
new Component(intf, target, lifeCycle, timeout, transactionRequired, dispatcher, remoteAddress)
|
|
||||||
|
|
||||||
def apply(target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, dispatcher: MessageDispatcher, remoteAddress: RemoteAddress) =
|
|
||||||
new Component(null, target, lifeCycle, timeout, transactionRequired, dispatcher, remoteAddress)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
||||||
*/
|
|
||||||
object JavaConfig {
|
|
||||||
import scala.reflect.BeanProperty
|
|
||||||
|
|
||||||
sealed abstract class ConfigElement
|
|
||||||
|
|
||||||
class RestartStrategy(
|
|
||||||
@BeanProperty val scheme: FailOverScheme,
|
|
||||||
@BeanProperty val maxNrOfRetries: Int,
|
|
||||||
@BeanProperty val withinTimeRange: Int,
|
|
||||||
@BeanProperty val trapExceptions: Array[Class[_ <: Throwable]]) extends ConfigElement {
|
|
||||||
def transform = se.scalablesolutions.akka.config.ScalaConfig.RestartStrategy(
|
|
||||||
scheme.transform, maxNrOfRetries, withinTimeRange, trapExceptions.toList)
|
|
||||||
}
|
|
||||||
|
|
||||||
class LifeCycle(@BeanProperty val scope: Scope, @BeanProperty val callbacks: RestartCallbacks) extends ConfigElement {
|
|
||||||
def this(scope: Scope) = this(scope, null)
|
|
||||||
def transform = {
|
|
||||||
val callbackOption = if (callbacks eq null) None else Some(callbacks.transform)
|
|
||||||
se.scalablesolutions.akka.config.ScalaConfig.LifeCycle(scope.transform, callbackOption)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class RestartCallbacks(@BeanProperty val preRestart: String, @BeanProperty val postRestart: String) {
|
|
||||||
def transform = se.scalablesolutions.akka.config.ScalaConfig.RestartCallbacks(preRestart, postRestart)
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class Scope extends ConfigElement {
|
|
||||||
def transform: se.scalablesolutions.akka.config.ScalaConfig.Scope
|
|
||||||
}
|
|
||||||
class Permanent extends Scope {
|
|
||||||
override def transform = se.scalablesolutions.akka.config.ScalaConfig.Permanent
|
|
||||||
}
|
|
||||||
class Temporary extends Scope {
|
|
||||||
override def transform = se.scalablesolutions.akka.config.ScalaConfig.Temporary
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class FailOverScheme extends ConfigElement {
|
|
||||||
def transform: se.scalablesolutions.akka.config.ScalaConfig.FailOverScheme
|
|
||||||
}
|
|
||||||
class AllForOne extends FailOverScheme {
|
|
||||||
override def transform = se.scalablesolutions.akka.config.ScalaConfig.AllForOne
|
|
||||||
}
|
|
||||||
class OneForOne extends FailOverScheme {
|
|
||||||
override def transform = se.scalablesolutions.akka.config.ScalaConfig.OneForOne
|
|
||||||
}
|
|
||||||
|
|
||||||
class RemoteAddress(@BeanProperty val hostname: String, @BeanProperty val port: Int)
|
|
||||||
|
|
||||||
abstract class Server extends ConfigElement
|
|
||||||
class Component(@BeanProperty val intf: Class[_],
|
|
||||||
@BeanProperty val target: Class[_],
|
|
||||||
@BeanProperty val lifeCycle: LifeCycle,
|
|
||||||
@BeanProperty val timeout: Int,
|
|
||||||
@BeanProperty val transactionRequired: Boolean, // optional
|
|
||||||
@BeanProperty val dispatcher: MessageDispatcher, // optional
|
|
||||||
@BeanProperty val remoteAddress: RemoteAddress // optional
|
|
||||||
) extends Server {
|
|
||||||
|
|
||||||
def this(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int) =
|
|
||||||
this(intf, target, lifeCycle, timeout, false, null, null)
|
|
||||||
|
|
||||||
def this(target: Class[_], lifeCycle: LifeCycle, timeout: Int) =
|
|
||||||
this(null, target, lifeCycle, timeout, false, null, null)
|
|
||||||
|
|
||||||
def this(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, remoteAddress: RemoteAddress) =
|
|
||||||
this(intf, target, lifeCycle, timeout, false, null, remoteAddress)
|
|
||||||
|
|
||||||
def this(target: Class[_], lifeCycle: LifeCycle, timeout: Int, remoteAddress: RemoteAddress) =
|
|
||||||
this(null, target, lifeCycle, timeout, false, null, remoteAddress)
|
|
||||||
|
|
||||||
def this(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, dispatcher: MessageDispatcher) =
|
|
||||||
this(intf, target, lifeCycle, timeout, false, dispatcher, null)
|
|
||||||
|
|
||||||
def this(target: Class[_], lifeCycle: LifeCycle, timeout: Int, dispatcher: MessageDispatcher) =
|
|
||||||
this(null, target, lifeCycle, timeout, false, dispatcher, null)
|
|
||||||
|
|
||||||
def this(target: Class[_], lifeCycle: LifeCycle, timeout: Int, dispatcher: MessageDispatcher, remoteAddress: RemoteAddress) =
|
|
||||||
this(null, target, lifeCycle, timeout, false, dispatcher, remoteAddress)
|
|
||||||
|
|
||||||
def this(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean) =
|
|
||||||
this(intf, target, lifeCycle, timeout, transactionRequired, null, null)
|
|
||||||
|
|
||||||
def this(target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean) =
|
|
||||||
this(null, target, lifeCycle, timeout, transactionRequired, null, null)
|
|
||||||
|
|
||||||
def this(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, remoteAddress: RemoteAddress) =
|
|
||||||
this(intf, target, lifeCycle, timeout, transactionRequired, null, remoteAddress)
|
|
||||||
|
|
||||||
def this(target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, remoteAddress: RemoteAddress) =
|
|
||||||
this(null, target, lifeCycle, timeout, transactionRequired, null, remoteAddress)
|
|
||||||
|
|
||||||
def this(intf: Class[_], target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, dispatcher: MessageDispatcher) =
|
|
||||||
this(intf, target, lifeCycle, timeout, transactionRequired, dispatcher, null)
|
|
||||||
|
|
||||||
def this(target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, dispatcher: MessageDispatcher) =
|
|
||||||
this(null, target, lifeCycle, timeout, transactionRequired, dispatcher, null)
|
|
||||||
|
|
||||||
def this(target: Class[_], lifeCycle: LifeCycle, timeout: Int, transactionRequired: Boolean, dispatcher: MessageDispatcher, remoteAddress: RemoteAddress) =
|
|
||||||
this(null, target, lifeCycle, timeout, transactionRequired, dispatcher, remoteAddress)
|
|
||||||
|
|
||||||
def transform =
|
|
||||||
se.scalablesolutions.akka.config.ScalaConfig.Component(
|
|
||||||
intf, target, lifeCycle.transform, timeout, transactionRequired, dispatcher,
|
|
||||||
if (remoteAddress ne null) se.scalablesolutions.akka.config.ScalaConfig.RemoteAddress(remoteAddress.hostname, remoteAddress.port) else null)
|
|
||||||
|
|
||||||
def newSupervised(actor: Actor) =
|
|
||||||
se.scalablesolutions.akka.config.ScalaConfig.Supervise(actor, lifeCycle.transform)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (C) 2009-2010 Scalable Solutions AB <http://scalablesolutions.se>
|
|
||||||
*/
|
|
||||||
|
|
||||||
package se.scalablesolutions.akka.security
|
|
||||||
|
|
||||||
import config.ScalaConfig._
|
|
||||||
|
|
||||||
import org.scalatest.Suite
|
|
||||||
import org.scalatest.junit.JUnitSuite
|
|
||||||
import org.scalatest.matchers.MustMatchers
|
|
||||||
import org.scalatest.mock.MockitoSugar
|
|
||||||
import org.mockito.Mockito._
|
|
||||||
import org.mockito.Matchers._
|
|
||||||
import org.junit.{Before, After, Test}
|
|
||||||
|
|
||||||
import _root_.javax.ws.rs.core.{SecurityContext, Context, Response}
|
|
||||||
import _root_.com.sun.jersey.spi.container.{ResourceFilterFactory, ContainerRequest, ContainerRequestFilter, ContainerResponse, ContainerResponseFilter, ResourceFilter}
|
|
||||||
import _root_.com.sun.jersey.core.util.Base64
|
|
||||||
|
|
||||||
class BasicAuthenticatorSpec extends junit.framework.TestCase
|
|
||||||
with Suite with MockitoSugar with MustMatchers {
|
|
||||||
val authenticator = new BasicAuthenticator
|
|
||||||
authenticator.start
|
|
||||||
|
|
||||||
@Test def testChallenge = {
|
|
||||||
val req = mock[ContainerRequest]
|
|
||||||
|
|
||||||
val result: Response = (authenticator !! (Authenticate(req, List("foo")), 10000)).get
|
|
||||||
|
|
||||||
// the actor replies with a challenge for the browser
|
|
||||||
result.getStatus must equal(Response.Status.UNAUTHORIZED.getStatusCode)
|
|
||||||
result.getMetadata.get("WWW-Authenticate").get(0).toString must startWith("Basic")
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test def testAuthenticationSuccess = {
|
|
||||||
val req = mock[ContainerRequest]
|
|
||||||
// fake a basic auth header -> this will authenticate the user
|
|
||||||
when(req.getHeaderValue("Authorization")).thenReturn("Basic " + new String(Base64.encode("foo:bar")))
|
|
||||||
|
|
||||||
// fake a request authorization -> this will authorize the user
|
|
||||||
when(req.isUserInRole("chef")).thenReturn(true)
|
|
||||||
|
|
||||||
val result: AnyRef = (authenticator !! (Authenticate(req, List("chef")), 10000)).get
|
|
||||||
|
|
||||||
result must be(OK)
|
|
||||||
// the authenticator must have set a security context
|
|
||||||
verify(req).setSecurityContext(any[SecurityContext])
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test def testUnauthorized = {
|
|
||||||
val req = mock[ContainerRequest]
|
|
||||||
|
|
||||||
// fake a basic auth header -> this will authenticate the user
|
|
||||||
when(req.getHeaderValue("Authorization")).thenReturn("Basic " + new String(Base64.encode("foo:bar")))
|
|
||||||
when(req.isUserInRole("chef")).thenReturn(false) // this will deny access
|
|
||||||
|
|
||||||
val result: Response = (authenticator !! (Authenticate(req, List("chef")), 10000)).get
|
|
||||||
|
|
||||||
result.getStatus must equal(Response.Status.FORBIDDEN.getStatusCode)
|
|
||||||
|
|
||||||
// the authenticator must have set a security context
|
|
||||||
verify(req).setSecurityContext(any[SecurityContext])
|
|
||||||
}
|
|
||||||
|
|
||||||
class BasicAuthenticator extends BasicAuthenticationActor {
|
|
||||||
def verify(odc: Option[BasicCredentials]): Option[UserInfo] = odc match {
|
|
||||||
case Some(dc) => Some(UserInfo("foo", "bar", "ninja" :: "chef" :: Nil))
|
|
||||||
case _ => None
|
|
||||||
}
|
|
||||||
override def realm = "test"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
package se.scalablesolutions.akka
|
package se.scalablesolutions.akka
|
||||||
|
|
||||||
import util.Logging
|
import se.scalablesolutions.akka.util.Logging
|
||||||
|
|
||||||
import net.lag.configgy.{Configgy, ParseException}
|
import net.lag.configgy.{Configgy, ParseException}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -123,6 +123,34 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) {
|
||||||
)
|
)
|
||||||
|
|
||||||
// ------------------------------------------------------------
|
// ------------------------------------------------------------
|
||||||
|
// publishing
|
||||||
|
Credentials(Path.userHome / ".akka_publish_credentials", log)
|
||||||
|
override def managedStyle = ManagedStyle.Maven
|
||||||
|
|
||||||
|
val publishTo = "Scalable Solutions Maven Repository" at "http://scalablesolutions.se/akka/repository/"
|
||||||
|
val sourceArtifact = Artifact(artifactID, "src", "jar", Some("sources"), Nil, None)
|
||||||
|
val docsArtifact = Artifact(artifactID, "docs", "jar", Some("javadoc"), Nil, None)
|
||||||
|
|
||||||
|
override def packageDocsJar = defaultJarPath("-javadoc.jar")
|
||||||
|
override def packageSrcJar= defaultJarPath("-sources.jar")
|
||||||
|
override def packageToPublishActions = super.packageToPublishActions ++ Seq(packageDocs, packageSrc)
|
||||||
|
|
||||||
|
override def pomExtra =
|
||||||
|
<inceptionYear>2009</inceptionYear>
|
||||||
|
<url>http://akkasource.org</url>
|
||||||
|
<organization>
|
||||||
|
<name>Scalable Solutions AB</name>
|
||||||
|
<url>http://scalablesolutions.se</url>
|
||||||
|
</organization>
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<name>Apache 2</name>
|
||||||
|
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
||||||
|
<distribution>repo</distribution>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
|
||||||
|
// ------------------------------------------------------------
|
||||||
// subprojects
|
// subprojects
|
||||||
class AkkaCoreProject(info: ProjectInfo) extends DefaultProject(info) {
|
class AkkaCoreProject(info: ProjectInfo) extends DefaultProject(info) {
|
||||||
val netty = "org.jboss.netty" % "netty" % "3.2.0.BETA1" % "compile"
|
val netty = "org.jboss.netty" % "netty" % "3.2.0.BETA1" % "compile"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue