|
@@ -5,16 +5,17 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
import models.Fortune;
|
|
import models.Fortune;
|
|
import models.World;
|
|
import models.World;
|
|
-import play.*;
|
|
|
|
|
|
+import play.Play;
|
|
import play.core.NamedThreadFactory;
|
|
import play.core.NamedThreadFactory;
|
|
import play.libs.F;
|
|
import play.libs.F;
|
|
import play.libs.Json;
|
|
import play.libs.Json;
|
|
-import play.mvc.*;
|
|
|
|
-
|
|
|
|
|
|
+import play.mvc.Controller;
|
|
|
|
+import play.mvc.Result;
|
|
|
|
+import play.mvc.With;
|
|
import scala.concurrent.ExecutionContext;
|
|
import scala.concurrent.ExecutionContext;
|
|
|
|
+import utils.Headers;
|
|
import utils.Predicate;
|
|
import utils.Predicate;
|
|
import utils.Predicated;
|
|
import utils.Predicated;
|
|
-import views.html.*;
|
|
|
|
|
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
@@ -22,9 +23,9 @@ import java.util.concurrent.ThreadLocalRandom;
|
|
import java.util.concurrent.ThreadPoolExecutor;
|
|
import java.util.concurrent.ThreadPoolExecutor;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
+@With(Headers.class)
|
|
public class Application extends Controller {
|
|
public class Application extends Controller {
|
|
|
|
|
|
- private static final int MAX_QUERIES_PER_REQUEST = 20;
|
|
|
|
private static final int TEST_DATABASE_ROWS = 10000;
|
|
private static final int TEST_DATABASE_ROWS = 10000;
|
|
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
|
|
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
|
|
|
|
|
|
@@ -51,6 +52,7 @@ public class Application extends Controller {
|
|
// the max size of our queue something above the number of concurrent
|
|
// the max size of our queue something above the number of concurrent
|
|
// connections that we need to handle.
|
|
// connections that we need to handle.
|
|
public static class IsDbAvailable implements Predicate {
|
|
public static class IsDbAvailable implements Predicate {
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public boolean condition() {
|
|
public boolean condition() {
|
|
return tpe.getQueue().size() <= 1024;
|
|
return tpe.getQueue().size() <= 1024;
|
|
@@ -60,6 +62,7 @@ public class Application extends Controller {
|
|
@Predicated(predicate = IsDbAvailable.class, failed = SERVICE_UNAVAILABLE)
|
|
@Predicated(predicate = IsDbAvailable.class, failed = SERVICE_UNAVAILABLE)
|
|
public static F.Promise<Result> db() {
|
|
public static F.Promise<Result> db() {
|
|
return getRandomWorlds(1).map(new F.Function<List<World>, Result>() {
|
|
return getRandomWorlds(1).map(new F.Function<List<World>, Result>() {
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public Result apply(List<World> worlds) {
|
|
public Result apply(List<World> worlds) {
|
|
return ok(Json.toJson(worlds.get(0)));
|
|
return ok(Json.toJson(worlds.get(0)));
|
|
@@ -70,6 +73,7 @@ public class Application extends Controller {
|
|
@Predicated(predicate = IsDbAvailable.class, failed = SERVICE_UNAVAILABLE)
|
|
@Predicated(predicate = IsDbAvailable.class, failed = SERVICE_UNAVAILABLE)
|
|
public static F.Promise<Result> queries(final String queryCountString) {
|
|
public static F.Promise<Result> queries(final String queryCountString) {
|
|
return getRandomWorlds(queryCount(queryCountString)).map(new F.Function<List<World>, Result>() {
|
|
return getRandomWorlds(queryCount(queryCountString)).map(new F.Function<List<World>, Result>() {
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public Result apply(List<World> worlds) {
|
|
public Result apply(List<World> worlds) {
|
|
return ok(Json.toJson(worlds));
|
|
return ok(Json.toJson(worlds));
|
|
@@ -86,11 +90,13 @@ public class Application extends Controller {
|
|
List<Fortune> fortunes = Fortune.findAll();
|
|
List<Fortune> fortunes = Fortune.findAll();
|
|
fortunes.add(new Fortune("Additional fortune added at request time."));
|
|
fortunes.add(new Fortune("Additional fortune added at request time."));
|
|
Collections.sort(fortunes, new Comparator<Fortune>() {
|
|
Collections.sort(fortunes, new Comparator<Fortune>() {
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public int compare(Fortune f1, Fortune f2) {
|
|
public int compare(Fortune f1, Fortune f2) {
|
|
return f1.message.compareTo(f2.message);
|
|
return f1.message.compareTo(f2.message);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
+
|
|
return ok(views.html.fortunes.render(fortunes));
|
|
return ok(views.html.fortunes.render(fortunes));
|
|
}
|
|
}
|
|
}, dbEc);
|
|
}, dbEc);
|
|
@@ -99,6 +105,7 @@ public class Application extends Controller {
|
|
@Predicated(predicate = IsDbAvailable.class, failed = SERVICE_UNAVAILABLE)
|
|
@Predicated(predicate = IsDbAvailable.class, failed = SERVICE_UNAVAILABLE)
|
|
public static F.Promise<Result> update(final String queryCountString) {
|
|
public static F.Promise<Result> update(final String queryCountString) {
|
|
return getRandomWorlds(queryCount(queryCountString)).map(new F.Function<List<World>, Result>() {
|
|
return getRandomWorlds(queryCount(queryCountString)).map(new F.Function<List<World>, Result>() {
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public Result apply(List<World> worlds) throws Throwable {
|
|
public Result apply(List<World> worlds) throws Throwable {
|
|
Random random = ThreadLocalRandom.current();
|
|
Random random = ThreadLocalRandom.current();
|
|
@@ -106,14 +113,10 @@ public class Application extends Controller {
|
|
world.randomNumber = (long) (random.nextInt(10000) + 1);
|
|
world.randomNumber = (long) (random.nextInt(10000) + 1);
|
|
}
|
|
}
|
|
|
|
|
|
- worlds = World.save(worlds);
|
|
|
|
- return ok(Json.toJson(worlds));
|
|
|
|
|
|
+ List<World> updatedWorlds = World.save(worlds);
|
|
|
|
+ return ok(Json.toJson(updatedWorlds));
|
|
}
|
|
}
|
|
- });
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public static Result plainText() {
|
|
|
|
- return ok("Hello, World!");
|
|
|
|
|
|
+ }, dbEc);
|
|
}
|
|
}
|
|
|
|
|
|
private static int queryCount(String queryCountString) {
|
|
private static int queryCount(String queryCountString) {
|
|
@@ -134,6 +137,7 @@ public class Application extends Controller {
|
|
|
|
|
|
private static F.Promise<List<World>> getRandomWorlds(final int n) {
|
|
private static F.Promise<List<World>> getRandomWorlds(final int n) {
|
|
return F.Promise.promise(new F.Function0<List<World>>() {
|
|
return F.Promise.promise(new F.Function0<List<World>>() {
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public List<World> apply() throws Throwable {
|
|
public List<World> apply() throws Throwable {
|
|
Random random = ThreadLocalRandom.current();
|
|
Random random = ThreadLocalRandom.current();
|