Skip to content

Commit e03d047

Browse files
authored
Merge pull request #29 from softwaremill/java_api
Java api
2 parents c13179f + f862ad3 commit e03d047

20 files changed

+2425
-4
lines changed

build.sbt

+4
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,14 @@ lazy val core: Project = (project in file("core"))
5454
.settings(commonSettings: _*)
5555
.settings(
5656
name := "core",
57+
testOptions in Test := Seq(Tests.Argument(TestFrameworks.JUnit, "-a")), // required for javadsl JUnit tests
58+
crossPaths := false, // https://github.com/sbt/junit-interface/issues/35
5759
libraryDependencies ++= Seq(
5860
"com.typesafe.akka" %% "akka-http" % akkaHttpVersion,
5961
"com.typesafe.akka" %% "akka-http-testkit" % akkaHttpVersion % "test",
6062
"org.scalacheck" %% "scalacheck" % "1.13.4" % "test",
63+
"junit" % "junit" % "4.12" % "test",
64+
"com.novocode" % "junit-interface" % "0.11" % "test",
6165
scalaTest
6266
)
6367
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.softwaremill.session.javadsl
2+
3+
import java.util.function.Supplier
4+
5+
import akka.http.javadsl.server.Route
6+
import akka.http.javadsl.server.directives.RouteAdapter
7+
import com.softwaremill.session.CsrfCheckMode
8+
9+
/**
10+
* Java alternative for com.softwaremill.session.CsrfDirectives
11+
*/
12+
trait CsrfDirectives {
13+
14+
def randomTokenCsrfProtection[T](checkMode: CsrfCheckMode[T], inner: Supplier[Route]): Route = RouteAdapter {
15+
com.softwaremill.session.CsrfDirectives.randomTokenCsrfProtection(checkMode) {
16+
inner.get.asInstanceOf[RouteAdapter].delegate
17+
}
18+
}
19+
20+
def setNewCsrfToken[T](checkMode: CsrfCheckMode[T], inner: Supplier[Route]): Route = RouteAdapter {
21+
com.softwaremill.session.CsrfDirectives.setNewCsrfToken(checkMode) {
22+
inner.get.asInstanceOf[RouteAdapter].delegate
23+
}
24+
}
25+
26+
27+
}
28+
29+
object CsrfDirectives extends CsrfDirectives
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.softwaremill.session.javadsl;
2+
3+
import akka.http.javadsl.server.AllDirectives;
4+
import akka.http.javadsl.server.Route;
5+
import com.softwaremill.session.CsrfCheckMode;
6+
import com.softwaremill.session.SessionContinuity;
7+
import com.softwaremill.session.SessionManager;
8+
import com.softwaremill.session.SetSessionTransport;
9+
import scala.Option;
10+
11+
import java.util.function.Function;
12+
import java.util.function.Supplier;
13+
14+
public class HttpSessionAwareDirectives<T> extends AllDirectives {
15+
16+
private final SessionManager<T> sessionManager;
17+
18+
public HttpSessionAwareDirectives(SessionManager<T> sessionManager) {
19+
this.sessionManager = sessionManager;
20+
}
21+
22+
23+
public Route setSession(SessionContinuity sc, SetSessionTransport st, T session, Supplier<Route> continuity) {
24+
return SessionDirectives$.MODULE$.setSession(sc, st, session, continuity);
25+
}
26+
27+
public Route optionalSession(SessionContinuity sc, SetSessionTransport st, Function<Option<T>, Route> continuity) {
28+
return SessionDirectives$.MODULE$.optionalSession(sc, st, continuity);
29+
}
30+
31+
public Route requiredSession(SessionContinuity<T> sc, SetSessionTransport st, Function<T, Route> continuity) {
32+
return SessionDirectives$.MODULE$.requiredSession(sc, st, continuity);
33+
}
34+
35+
public Route touchRequiredSession(SessionContinuity<T> sc, SetSessionTransport st, Function<T, Route> continuity) {
36+
return SessionDirectives$.MODULE$.touchRequiredSession(sc, st, continuity);
37+
}
38+
39+
public Route invalidateSession(SessionContinuity<T> sc, SetSessionTransport st, Supplier<Route> continuity) {
40+
return SessionDirectives$.MODULE$.invalidateSession(sc, st, continuity);
41+
}
42+
43+
public Route setNewCsrfToken(CsrfCheckMode<T> checkHeader, Supplier<Route> continuity) {
44+
return CsrfDirectives$.MODULE$.setNewCsrfToken(checkHeader, continuity);
45+
}
46+
47+
public Route randomTokenCsrfProtection(CsrfCheckMode<T> checkHeader, Supplier<Route> continuity) {
48+
return CsrfDirectives$.MODULE$.randomTokenCsrfProtection(checkHeader, continuity);
49+
}
50+
51+
public SessionManager<T> getSessionManager() {
52+
return sessionManager;
53+
}
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.softwaremill.session.javadsl
2+
3+
/**
4+
* Can't use the trait com.softwaremill.session.InMemoryRefreshTokenStorage in Java code, hence this wrapper
5+
* http://stackoverflow.com/questions/7637752/using-scala-traits-with-implemented-methods-in-java
6+
*/
7+
abstract class InMemoryRefreshTokenStorage[T]() extends com.softwaremill.session.InMemoryRefreshTokenStorage[T]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.softwaremill.session.javadsl
2+
3+
import java.util.function.Supplier
4+
5+
import akka.http.javadsl.server.Route
6+
import akka.http.javadsl.server.directives.RouteAdapter
7+
import com.softwaremill.session._
8+
9+
/**
10+
* Java alternative for com.softwaremill.session.SessionDirectives
11+
*/
12+
trait SessionDirectives extends OneOffSessionDirectives with RefreshableSessionDirectives {
13+
14+
def setSession[T](sc: SessionContinuity[T], st: SetSessionTransport, v: T, inner: Supplier[Route]): Route = RouteAdapter {
15+
com.softwaremill.session.SessionDirectives.setSession(sc, st, v) {
16+
inner.get.asInstanceOf[RouteAdapter].delegate
17+
}
18+
}
19+
20+
def invalidateSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: Supplier[Route]): Route = RouteAdapter {
21+
com.softwaremill.session.SessionDirectives.invalidateSession(sc, st) {
22+
inner.get.asInstanceOf[RouteAdapter].delegate
23+
}
24+
}
25+
26+
def optionalSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: java.util.function.Function[Option[T], Route]): Route = RouteAdapter {
27+
com.softwaremill.session.SessionDirectives.optionalSession(sc, st) { session =>
28+
inner.apply(session).asInstanceOf[RouteAdapter].delegate
29+
}
30+
}
31+
32+
def requiredSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: java.util.function.Function[T, Route]): Route = RouteAdapter {
33+
com.softwaremill.session.SessionDirectives.requiredSession(sc, st) { session =>
34+
inner.apply(session).asInstanceOf[RouteAdapter].delegate
35+
}
36+
}
37+
38+
def touchRequiredSession[T](sc: SessionContinuity[T], st: GetSessionTransport, inner: java.util.function.Function[T, Route]): Route = RouteAdapter {
39+
com.softwaremill.session.SessionDirectives.touchRequiredSession(sc, st) { session =>
40+
inner.apply(session).asInstanceOf[RouteAdapter].delegate
41+
}
42+
}
43+
44+
}
45+
46+
object SessionDirectives extends SessionDirectives
47+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.softwaremill.session.javadsl;
2+
3+
import com.softwaremill.session.SessionSerializer;
4+
import com.softwaremill.session.SessionSerializer$;
5+
import scala.collection.immutable.Map;
6+
7+
/**
8+
* Wrapper for session serializers in com.softwaremill.session.SessionSerializer
9+
*/
10+
public final class SessionSerializers {
11+
12+
public static final SessionSerializer<String, String> StringToStringSessionSerializer = SessionSerializer$.MODULE$.stringToStringSessionSerializer();
13+
public static final SessionSerializer<Integer, String> IntToStringSessionSerializer = (SessionSerializer<Integer, String>) (SessionSerializer) SessionSerializer$.MODULE$.intToStringSessionSerializer();
14+
public static final SessionSerializer<Long, String> LongToStringSessionSerializer = (SessionSerializer<Long, String>) (SessionSerializer) SessionSerializer$.MODULE$.longToStringSessionSerializer();
15+
public static final SessionSerializer<Float, String> FloatToStringSessionSerializer = (SessionSerializer<Float, String>) (SessionSerializer) SessionSerializer$.MODULE$.floatToStringSessionSerializer();
16+
public static final SessionSerializer<Double, String> DoubleToStringSessionSerializer = (SessionSerializer<Double, String>) (SessionSerializer) SessionSerializer$.MODULE$.doubleToStringSessionSerializer();
17+
public static final SessionSerializer<Map<String, String>, String> MapToStringSessionSerializer = SessionSerializer$.MODULE$.mapToStringSessionSerializer();
18+
19+
private SessionSerializers() {
20+
}
21+
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.softwaremill.session.javadsl;
2+
3+
import com.softwaremill.session.CookieST$;
4+
import com.softwaremill.session.HeaderST$;
5+
import com.softwaremill.session.SetSessionTransport;
6+
7+
/**
8+
* Wrapper for session transports in com.softwaremill.session.SetSessionTransport
9+
*/
10+
public final class SessionTransports {
11+
12+
public static final SetSessionTransport CookieST = CookieST$.MODULE$;
13+
public static final SetSessionTransport HeaderST = HeaderST$.MODULE$;
14+
15+
private SessionTransports() {
16+
}
17+
18+
}

core/src/main/scala/com/softwaremill/session/CsrfDirectives.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.softwaremill.session
22

3-
import akka.http.scaladsl.server.{Directive1, Directive0}
43
import akka.http.scaladsl.server.Directives._
4+
import akka.http.scaladsl.server.{Directive0, Directive1}
55
import akka.stream.Materializer
66

77
trait CsrfDirectives {

core/src/main/scala/com/softwaremill/session/RefreshTokenStorage.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,4 @@ trait InMemoryRefreshTokenStorage[T] extends RefreshTokenStorage[T] {
6666
}
6767

6868
def log(msg: String): Unit
69-
}
69+
}

core/src/main/scala/com/softwaremill/session/SessionConfig.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ object SessionConfig {
112112
/**
113113
* Creates a default configuration using the given secret.
114114
*/
115-
def default(serverSecret: String) = fromConfig(ConfigFactory.load()
115+
def default(serverSecret: String): SessionConfig = fromConfig(ConfigFactory.load()
116116
.withValue("akka.http.session.server-secret", ConfigValueFactory.fromAnyRef(serverSecret)))
117+
118+
def defaultConfig(serverSecret: String): SessionConfig = default(serverSecret) // required for javadsl directives, because default is a keyword
117119
}

core/src/main/scala/com/softwaremill/session/SessionDirectives.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.softwaremill.session
22

3-
import akka.http.scaladsl.server.{Directive1, Directive0}
43
import akka.http.scaladsl.server.Directives._
4+
import akka.http.scaladsl.server.{Directive0, Directive1}
55

66
import scala.concurrent.ExecutionContext
77

@@ -80,6 +80,7 @@ trait SessionDirectives extends OneOffSessionDirectives with RefreshableSessionD
8080
def touchRequiredSession[T](sc: SessionContinuity[T], st: GetSessionTransport): Directive1[T] = {
8181
requiredSession(sc, st).flatMap { d => setOneOffSessionSameTransport(sc, st, d) & provide(d) }
8282
}
83+
8384
}
8485

8586
object SessionDirectives extends SessionDirectives

0 commit comments

Comments
 (0)