| @@ -0,0 +1,231 @@ | ||
| @REM activator launcher script | ||
| @REM | ||
| @REM Environment: | ||
| @REM In order for Activator to work you must have Java available on the classpath | ||
| @REM JAVA_HOME - location of a JDK home dir (optional if java on path) | ||
| @REM CFG_OPTS - JVM options (optional) | ||
| @REM Configuration: | ||
| @REM activatorconfig.txt found in the ACTIVATOR_HOME or ACTIVATOR_HOME/ACTIVATOR_VERSION | ||
| @setlocal enabledelayedexpansion | ||
|
|
||
| @echo off | ||
|
|
||
| set "var1=%~1" | ||
| if defined var1 ( | ||
| if "%var1%"=="help" ( | ||
| echo. | ||
| echo Usage activator [options] [command] | ||
| echo. | ||
| echo Commands: | ||
| echo ui Start the Activator UI | ||
| echo new [name] [template-id] Create a new project with [name] using template [template-id] | ||
| echo list-templates Print all available template names | ||
| echo help Print this message | ||
| echo. | ||
| echo Options: | ||
| echo -jvm-debug [port] Turn on JVM debugging, open at the given port. Defaults to 9999 if no port given. | ||
| echo. | ||
| echo Environment variables ^(read from context^): | ||
| echo JAVA_OPTS Environment variable, if unset uses "" | ||
| echo SBT_OPTS Environment variable, if unset uses "" | ||
| echo ACTIVATOR_OPTS Environment variable, if unset uses "" | ||
| echo. | ||
| echo Please note that in order for Activator to work you must have Java available on the classpath | ||
| echo. | ||
| goto :end | ||
| ) | ||
| ) | ||
|
|
||
| if "%ACTIVATOR_HOME%"=="" ( | ||
| set "ACTIVATOR_HOME=%~dp0" | ||
| @REM remove trailing "\" from path | ||
| set ACTIVATOR_HOME=!ACTIVATOR_HOME:~0,-1! | ||
| ) | ||
|
|
||
| set ERROR_CODE=0 | ||
| set APP_VERSION=1.3.6 | ||
| set ACTIVATOR_LAUNCH_JAR=activator-launch-%APP_VERSION%.jar | ||
|
|
||
| rem Detect if we were double clicked, although theoretically A user could | ||
| rem manually run cmd /c | ||
| for %%x in (%cmdcmdline%) do if %%~x==/c set DOUBLECLICKED=1 | ||
|
|
||
| rem FIRST we load a config file of extra options (if there is one) | ||
| set "CFG_FILE_HOME=%UserProfile%\.activator\activatorconfig.txt" | ||
| set "CFG_FILE_VERSION=%UserProfile%\.activator\%APP_VERSION%\activatorconfig.txt" | ||
| set CFG_OPTS= | ||
| if exist %CFG_FILE_VERSION% ( | ||
| FOR /F "tokens=* eol=# usebackq delims=" %%i IN ("%CFG_FILE_VERSION%") DO ( | ||
| set DO_NOT_REUSE_ME=%%i | ||
| rem ZOMG (Part #2) WE use !! here to delay the expansion of | ||
| rem CFG_OPTS, otherwise it remains "" for this loop. | ||
| set CFG_OPTS=!CFG_OPTS! !DO_NOT_REUSE_ME! | ||
| ) | ||
| ) | ||
| if "%CFG_OPTS%"=="" ( | ||
| if exist %CFG_FILE_HOME% ( | ||
| FOR /F "tokens=* eol=# usebackq delims=" %%i IN ("%CFG_FILE_HOME%") DO ( | ||
| set DO_NOT_REUSE_ME=%%i | ||
| rem ZOMG (Part #2) WE use !! here to delay the expansion of | ||
| rem CFG_OPTS, otherwise it remains "" for this loop. | ||
| set CFG_OPTS=!CFG_OPTS! !DO_NOT_REUSE_ME! | ||
| ) | ||
| ) | ||
| ) | ||
|
|
||
| rem We use the value of the JAVACMD environment variable if defined | ||
| set _JAVACMD=%JAVACMD% | ||
|
|
||
| if "%_JAVACMD%"=="" ( | ||
| if not "%JAVA_HOME%"=="" ( | ||
| if exist "%JAVA_HOME%\bin\java.exe" set "_JAVACMD=%JAVA_HOME%\bin\java.exe" | ||
|
|
||
| rem if there is a java home set we make sure it is the first picked up when invoking 'java' | ||
| SET "PATH=%JAVA_HOME%\bin;%PATH%" | ||
| ) | ||
| ) | ||
|
|
||
| if "%_JAVACMD%"=="" set _JAVACMD=java | ||
|
|
||
| rem Detect if this java is ok to use. | ||
| for /F %%j in ('"%_JAVACMD%" -version 2^>^&1') do ( | ||
| if %%~j==java set JAVAINSTALLED=1 | ||
| if %%~j==openjdk set JAVAINSTALLED=1 | ||
| ) | ||
|
|
||
| rem Detect the same thing about javac | ||
| if "%_JAVACCMD%"=="" ( | ||
| if not "%JAVA_HOME%"=="" ( | ||
| if exist "%JAVA_HOME%\bin\javac.exe" set "_JAVACCMD=%JAVA_HOME%\bin\javac.exe" | ||
| ) | ||
| ) | ||
| if "%_JAVACCMD%"=="" set _JAVACCMD=javac | ||
| for /F %%j in ('"%_JAVACCMD%" -version 2^>^&1') do ( | ||
| if %%~j==javac set JAVACINSTALLED=1 | ||
| ) | ||
|
|
||
| rem BAT has no logical or, so we do it OLD SCHOOL! Oppan Redmond Style | ||
| set JAVAOK=true | ||
| if not defined JAVAINSTALLED set JAVAOK=false | ||
| if not defined JAVACINSTALLED set JAVAOK=false | ||
|
|
||
| if "%JAVAOK%"=="false" ( | ||
| echo. | ||
| echo A Java JDK is not installed or can't be found. | ||
| if not "%JAVA_HOME%"=="" ( | ||
| echo JAVA_HOME = "%JAVA_HOME%" | ||
| ) | ||
| echo. | ||
| echo Please go to | ||
| echo http://www.oracle.com/technetwork/java/javase/downloads/index.html | ||
| echo and download a valid Java JDK and install before running Activator. | ||
| echo. | ||
| echo If you think this message is in error, please check | ||
| echo your environment variables to see if "java.exe" and "javac.exe" are | ||
| echo available via JAVA_HOME or PATH. | ||
| echo. | ||
| if defined DOUBLECLICKED pause | ||
| exit /B 1 | ||
| ) | ||
|
|
||
| rem Check what Java version is being used to determine what memory options to use | ||
| for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do ( | ||
| set JAVA_VERSION=%%g | ||
| ) | ||
|
|
||
| rem Strips away the " characters | ||
| set JAVA_VERSION=%JAVA_VERSION:"=% | ||
|
|
||
| rem TODO Check if there are existing mem settings in JAVA_OPTS/CFG_OPTS and use those instead of the below | ||
| for /f "delims=. tokens=1-3" %%v in ("%JAVA_VERSION%") do ( | ||
| set MAJOR=%%v | ||
| set MINOR=%%w | ||
| set BUILD=%%x | ||
|
|
||
| set META_SIZE=-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=256M | ||
| if "!MINOR!" LSS "8" ( | ||
| set META_SIZE=-XX:PermSize=64M -XX:MaxPermSize=256M | ||
| ) | ||
|
|
||
| set MEM_OPTS=!META_SIZE! | ||
| ) | ||
|
|
||
| rem We use the value of the JAVA_OPTS environment variable if defined, rather than the config. | ||
| set _JAVA_OPTS=%JAVA_OPTS% | ||
| if "%_JAVA_OPTS%"=="" set _JAVA_OPTS=%CFG_OPTS% | ||
|
|
||
| set DEBUG_OPTS= | ||
|
|
||
| rem Loop through the arguments, building remaining args in args variable | ||
| set args= | ||
| :argsloop | ||
| if not "%~1"=="" ( | ||
| rem Checks if the argument contains "-D" and if true, adds argument 1 with 2 and puts an equal sign between them. | ||
| rem This is done since batch considers "=" to be a delimiter so we need to circumvent this behavior with a small hack. | ||
| set arg1=%~1 | ||
| if "!arg1:~0,2!"=="-D" ( | ||
| set "args=%args% "%~1"="%~2"" | ||
| shift | ||
| shift | ||
| goto argsloop | ||
| ) | ||
|
|
||
| if "%~1"=="-jvm-debug" ( | ||
| if not "%~2"=="" ( | ||
| rem This piece of magic somehow checks that an argument is a number | ||
| for /F "delims=0123456789" %%i in ("%~2") do ( | ||
| set var="%%i" | ||
| ) | ||
| if defined var ( | ||
| rem Not a number, assume no argument given and default to 9999 | ||
| set JPDA_PORT=9999 | ||
| ) else ( | ||
| rem Port was given, shift arguments | ||
| set JPDA_PORT=%~2 | ||
| shift | ||
| ) | ||
| ) else ( | ||
| set JPDA_PORT=9999 | ||
| ) | ||
| shift | ||
|
|
||
| set DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=!JPDA_PORT! | ||
| goto argsloop | ||
| ) | ||
| rem else | ||
| set "args=%args% "%~1"" | ||
| shift | ||
| goto argsloop | ||
| ) | ||
|
|
||
| :run | ||
|
|
||
| if "!args!"=="" ( | ||
| if defined DOUBLECLICKED ( | ||
| set CMDS="ui" | ||
| ) else set CMDS=!args! | ||
| ) else set CMDS=!args! | ||
|
|
||
| rem We add a / in front, so we get file:///C: instead of file://C: | ||
| rem Java considers the later a UNC path. | ||
| rem We also attempt a solid effort at making it URI friendly. | ||
| rem We don't even bother with UNC paths. | ||
| set JAVA_FRIENDLY_HOME_1=/!ACTIVATOR_HOME:\=/! | ||
| set JAVA_FRIENDLY_HOME=/!JAVA_FRIENDLY_HOME_1: =%%20! | ||
|
|
||
| rem Checks if the command contains spaces to know if it should be wrapped in quotes or not | ||
| set NON_SPACED_CMD=%_JAVACMD: =% | ||
| if "%_JAVACMD%"=="%NON_SPACED_CMD%" %_JAVACMD% %DEBUG_OPTS% %MEM_OPTS% %ACTIVATOR_OPTS% %SBT_OPTS% %_JAVA_OPTS% "-Dactivator.home=%JAVA_FRIENDLY_HOME%" -jar "%ACTIVATOR_HOME%\%ACTIVATOR_LAUNCH_JAR%" %CMDS% | ||
| if NOT "%_JAVACMD%"=="%NON_SPACED_CMD%" "%_JAVACMD%" %DEBUG_OPTS% %MEM_OPTS% %ACTIVATOR_OPTS% %SBT_OPTS% %_JAVA_OPTS% "-Dactivator.home=%JAVA_FRIENDLY_HOME%" -jar "%ACTIVATOR_HOME%\%ACTIVATOR_LAUNCH_JAR%" %CMDS% | ||
|
|
||
| if ERRORLEVEL 1 goto error | ||
| goto end | ||
|
|
||
| :error | ||
| set ERROR_CODE=1 | ||
|
|
||
| :end | ||
|
|
||
| @endlocal | ||
|
|
||
| exit /B %ERROR_CODE% |
| @@ -0,0 +1,46 @@ | ||
| import javax.inject.*; | ||
| import play.*; | ||
| import play.mvc.EssentialFilter; | ||
| import play.http.HttpFilters; | ||
| import play.mvc.*; | ||
|
|
||
| import filters.ExampleFilter; | ||
|
|
||
| /** | ||
| * This class configures filters that run on every request. This | ||
| * class is queried by Play to get a list of filters. | ||
| * | ||
| * Play will automatically use filters from any class called | ||
| * <code>Filters</code> that is placed the root package. You can load filters | ||
| * from a different class by adding a `play.http.filters` setting to | ||
| * the <code>application.conf</code> configuration file. | ||
| */ | ||
| @Singleton | ||
| public class Filters implements HttpFilters { | ||
|
|
||
| private final Environment env; | ||
| private final EssentialFilter exampleFilter; | ||
|
|
||
| /** | ||
| * @param env Basic environment settings for the current application. | ||
| * @param exampleFilter A demonstration filter that adds a header to | ||
| */ | ||
| @Inject | ||
| public Filters(Environment env, ExampleFilter exampleFilter) { | ||
| this.env = env; | ||
| this.exampleFilter = exampleFilter; | ||
| } | ||
|
|
||
| @Override | ||
| public EssentialFilter[] filters() { | ||
| // Use the example filter if we're running development mode. If | ||
| // we're running in production or test mode then don't use any | ||
| // filters at all. | ||
| if (env.mode().equals(Mode.DEV)) { | ||
| return new EssentialFilter[] { exampleFilter }; | ||
| } else { | ||
| return new EssentialFilter[] {}; | ||
| } | ||
| } | ||
|
|
||
| } |
| @@ -0,0 +1,31 @@ | ||
| import com.google.inject.AbstractModule; | ||
| import java.time.Clock; | ||
|
|
||
| import services.ApplicationTimer; | ||
| import services.AtomicCounter; | ||
| import services.Counter; | ||
|
|
||
| /** | ||
| * This class is a Guice module that tells Guice how to bind several | ||
| * different types. This Guice module is created when the Play | ||
| * application starts. | ||
| * | ||
| * Play will automatically use any class called `Module` that is in | ||
| * the root package. You can create modules in other locations by | ||
| * adding `play.modules.enabled` settings to the `application.conf` | ||
| * configuration file. | ||
| */ | ||
| public class Module extends AbstractModule { | ||
|
|
||
| @Override | ||
| public void configure() { | ||
| // Use the system clock as the default implementation of Clock | ||
| bind(Clock.class).toInstance(Clock.systemDefaultZone()); | ||
| // Ask Guice to create an instance of ApplicationTimer when the | ||
| // application starts. | ||
| bind(ApplicationTimer.class).asEagerSingleton(); | ||
| // Set AtomicCounter as the implementation for Counter. | ||
| bind(Counter.class).to(AtomicCounter.class); | ||
| } | ||
|
|
||
| } |
| @@ -0,0 +1,60 @@ | ||
| package controllers; | ||
|
|
||
| import akka.actor.ActorSystem; | ||
| import javax.inject.*; | ||
| import play.*; | ||
| import play.mvc.*; | ||
| import java.util.concurrent.Executor; | ||
| import java.util.concurrent.CompletableFuture; | ||
| import java.util.concurrent.CompletionStage; | ||
| import java.util.concurrent.TimeUnit; | ||
| import scala.concurrent.duration.Duration; | ||
| import scala.concurrent.ExecutionContextExecutor; | ||
|
|
||
| /** | ||
| * This controller contains an action that demonstrates how to write | ||
| * simple asynchronous code in a controller. It uses a timer to | ||
| * asynchronously delay sending a response for 1 second. | ||
| * | ||
| * @param actorSystem We need the {@link ActorSystem}'s | ||
| * {@link Scheduler} to run code after a delay. | ||
| * @param exec We need a Java {@link Executor} to apply the result | ||
| * of the {@link CompletableFuture} and a Scala | ||
| * {@link ExecutionContext} so we can use the Akka {@link Scheduler}. | ||
| * An {@link ExecutionContextExecutor} implements both interfaces. | ||
| */ | ||
| @Singleton | ||
| public class AsyncController extends Controller { | ||
|
|
||
| private final ActorSystem actorSystem; | ||
| private final ExecutionContextExecutor exec; | ||
|
|
||
| @Inject | ||
| public AsyncController(ActorSystem actorSystem, ExecutionContextExecutor exec) { | ||
| this.actorSystem = actorSystem; | ||
| this.exec = exec; | ||
| } | ||
|
|
||
| /** | ||
| * An action that returns a plain text message after a delay | ||
| * of 1 second. | ||
| * | ||
| * The configuration in the <code>routes</code> file means that this method | ||
| * will be called when the application receives a <code>GET</code> request with | ||
| * a path of <code>/message</code>. | ||
| */ | ||
| public CompletionStage<Result> message() { | ||
| return getFutureMessage(1, TimeUnit.SECONDS).thenApplyAsync(Results::ok, exec); | ||
| } | ||
|
|
||
| private CompletionStage<String> getFutureMessage(long time, TimeUnit timeUnit) { | ||
| CompletableFuture<String> future = new CompletableFuture<>(); | ||
| actorSystem.scheduler().scheduleOnce( | ||
| Duration.create(time, timeUnit), | ||
| () -> future.complete("Hi!"), | ||
| exec | ||
| ); | ||
| return future; | ||
| } | ||
|
|
||
| } |
| @@ -0,0 +1,35 @@ | ||
| package controllers; | ||
|
|
||
| import javax.inject.*; | ||
| import play.*; | ||
| import play.mvc.*; | ||
|
|
||
| import services.Counter; | ||
|
|
||
| /** | ||
| * This controller demonstrates how to use dependency injection to | ||
| * bind a component into a controller class. The class contains an | ||
| * action that shows an incrementing count to users. The {@link Counter} | ||
| * object is injected by the Guice dependency injection system. | ||
| */ | ||
| @Singleton | ||
| public class CountController extends Controller { | ||
|
|
||
| private final Counter counter; | ||
|
|
||
| @Inject | ||
| public CountController(Counter counter) { | ||
| this.counter = counter; | ||
| } | ||
|
|
||
| /** | ||
| * An action that responds with the {@link Counter}'s current | ||
| * count. The result is plain text. This action is mapped to | ||
| * <code>GET</code> requests with a path of <code>/count</code> | ||
| * requests by an entry in the <code>routes</code> config file. | ||
| */ | ||
| public Result count() { | ||
| return ok(Integer.toString(counter.nextCount())); | ||
| } | ||
|
|
||
| } |
| @@ -0,0 +1,23 @@ | ||
| package controllers; | ||
|
|
||
| import play.mvc.*; | ||
|
|
||
| import views.html.*; | ||
|
|
||
| /** | ||
| * This controller contains an action to handle HTTP requests | ||
| * to the application's home page. | ||
| */ | ||
| public class HomeController extends Controller { | ||
|
|
||
| /** | ||
| * An action that renders an HTML page with a welcome message. | ||
| * The configuration in the <code>routes</code> file means that | ||
| * this method will be called when the application receives a | ||
| * <code>GET</code> request with a path of <code>/</code>. | ||
| */ | ||
| public Result index() { | ||
| return ok(index.render("Your new application is ready.")); | ||
| } | ||
|
|
||
| } |
| @@ -0,0 +1,45 @@ | ||
| package filters; | ||
|
|
||
| import akka.stream.Materializer; | ||
| import java.util.concurrent.CompletionStage; | ||
| import java.util.concurrent.Executor; | ||
| import java.util.function.Function; | ||
| import javax.inject.*; | ||
| import play.mvc.*; | ||
| import play.mvc.Http.RequestHeader; | ||
|
|
||
|
|
||
| /** | ||
| * This is a simple filter that adds a header to all requests. It's | ||
| * added to the application's list of filters by the | ||
| * {@link Filters} class. | ||
| */ | ||
| @Singleton | ||
| public class ExampleFilter extends Filter { | ||
|
|
||
| private final Executor exec; | ||
|
|
||
| /** | ||
| * @param mat This object is needed to handle streaming of requests | ||
| * and responses. | ||
| * @param exec This class is needed to execute code asynchronously. | ||
| * It is used below by the <code>thenAsyncApply</code> method. | ||
| */ | ||
| @Inject | ||
| public ExampleFilter(Materializer mat, Executor exec) { | ||
| super(mat); | ||
| this.exec = exec; | ||
| } | ||
|
|
||
| @Override | ||
| public CompletionStage<Result> apply( | ||
| Function<RequestHeader, CompletionStage<Result>> next, | ||
| RequestHeader requestHeader) { | ||
|
|
||
| return next.apply(requestHeader).thenApplyAsync( | ||
| result -> result.withHeader("X-ExampleFilter", "foo"), | ||
| exec | ||
| ); | ||
| } | ||
|
|
||
| } |
| @@ -0,0 +1,50 @@ | ||
| package services; | ||
|
|
||
| import java.time.Clock; | ||
| import java.time.Instant; | ||
| import java.util.concurrent.CompletableFuture; | ||
| import javax.inject.*; | ||
| import play.Logger; | ||
| import play.inject.ApplicationLifecycle; | ||
|
|
||
| /** | ||
| * This class demonstrates how to run code when the | ||
| * application starts and stops. It starts a timer when the | ||
| * application starts. When the application stops it prints out how | ||
| * long the application was running for. | ||
| * | ||
| * This class is registered for Guice dependency injection in the | ||
| * {@link Module} class. We want the class to start when the application | ||
| * starts, so it is registered as an "eager singleton". See the code | ||
| * in the {@link Module} class to see how this happens. | ||
| * | ||
| * This class needs to run code when the server stops. It uses the | ||
| * application's {@link ApplicationLifecycle} to register a stop hook. | ||
| */ | ||
| @Singleton | ||
| public class ApplicationTimer { | ||
|
|
||
| private final Clock clock; | ||
| private final ApplicationLifecycle appLifecycle; | ||
| private final Instant start; | ||
|
|
||
| @Inject | ||
| public ApplicationTimer(Clock clock, ApplicationLifecycle appLifecycle) { | ||
| this.clock = clock; | ||
| this.appLifecycle = appLifecycle; | ||
| // This code is called when the application starts. | ||
| start = clock.instant(); | ||
| Logger.info("ApplicationTimer demo: Starting application at " + start); | ||
|
|
||
| // When the application starts, register a stop hook with the | ||
| // ApplicationLifecycle object. The code inside the stop hook will | ||
| // be run when the application stops. | ||
| appLifecycle.addStopHook(() -> { | ||
| Instant stop = clock.instant(); | ||
| Long runningTime = stop.getEpochSecond() - start.getEpochSecond(); | ||
| Logger.info("ApplicationTimer demo: Stopping application at " + clock.instant() + " after " + runningTime + "s."); | ||
| return CompletableFuture.completedFuture(null); | ||
| }); | ||
| } | ||
|
|
||
| } |
| @@ -0,0 +1,26 @@ | ||
| package services; | ||
|
|
||
| import java.util.concurrent.atomic.AtomicInteger; | ||
| import javax.inject.*; | ||
|
|
||
| /** | ||
| * This class is a concrete implementation of the {@link Counter} trait. | ||
| * It is configured for Guice dependency injection in the {@link Module} | ||
| * class. | ||
| * | ||
| * This class has a {@link Singleton} annotation because we need to make | ||
| * sure we only use one counter per application. Without this | ||
| * annotation we would get a new instance every time a {@link Counter} is | ||
| * injected. | ||
| */ | ||
| @Singleton | ||
| public class AtomicCounter implements Counter { | ||
|
|
||
| private final AtomicInteger atomicCounter = new AtomicInteger(); | ||
|
|
||
| @Override | ||
| public int nextCount() { | ||
| return atomicCounter.getAndIncrement(); | ||
| } | ||
|
|
||
| } |
| @@ -0,0 +1,13 @@ | ||
| package services; | ||
|
|
||
| /** | ||
| * This interface demonstrates how to create a component that is injected | ||
| * into a controller. The interface represents a counter that returns a | ||
| * incremented number each time it is called. | ||
| * | ||
| * The {@link Modules} class binds this interface to the | ||
| * {@link AtomicCounter} implementation. | ||
| */ | ||
| public interface Counter { | ||
| int nextCount(); | ||
| } |
| @@ -0,0 +1,20 @@ | ||
| @* | ||
| * This template takes a single argument, a String containing a | ||
| * message to display. | ||
| *@ | ||
| @(message: String) | ||
|
|
||
| @* | ||
| * Call the `main` template with two arguments. The first | ||
| * argument is a `String` with the title of the page, the second | ||
| * argument is an `Html` object containing the body of the page. | ||
| *@ | ||
| @main("Welcome to Play") { | ||
|
|
||
| @* | ||
| * Get an `Html` object by calling the built-in Play welcome | ||
| * template and passing a `String` message. | ||
| *@ | ||
| @play20.welcome(message, style = "Java") | ||
|
|
||
| } |
| @@ -0,0 +1,23 @@ | ||
| @* | ||
| * This template is called from the `index` template. This template | ||
| * handles the rendering of the page header and body tags. It takes | ||
| * two arguments, a `String` for the title of the page and an `Html` | ||
| * object to insert into the body of the page. | ||
| *@ | ||
| @(title: String)(content: Html) | ||
|
|
||
| <!DOCTYPE html> | ||
| <html lang="en"> | ||
| <head> | ||
| @* Here's where we render the page title `String`. *@ | ||
| <title>@title</title> | ||
| <link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")"> | ||
| <link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")"> | ||
| <script src="@routes.Assets.versioned("javascripts/hello.js")" type="text/javascript"></script> | ||
| </head> | ||
| <body> | ||
| @* And here's where we render the `Html` object containing | ||
| * the page content. *@ | ||
| @content | ||
| </body> | ||
| </html> |
| @@ -0,0 +1,18 @@ | ||
| name := """example-app""" | ||
|
|
||
| version := "1.0-SNAPSHOT" | ||
|
|
||
| lazy val root = (project in file(".")).enablePlugins(PlayJava) | ||
|
|
||
| scalaVersion := "2.11.7" | ||
|
|
||
| libraryDependencies ++= Seq( | ||
| javaJdbc, | ||
| cache, | ||
| javaWs | ||
| ) | ||
|
|
||
| enablePlugins(DebianPlugin) | ||
| maintainer := "Rodrigo Valente <rodrigoavrav@gmail.com>" | ||
| packageSummary := "My custom package" | ||
| packageDescription := "Package" |
| @@ -0,0 +1,353 @@ | ||
| # This is the main configuration file for the application. | ||
| # https://www.playframework.com/documentation/latest/ConfigFile | ||
| # ~~~~~ | ||
| # Play uses HOCON as its configuration file format. HOCON has a number | ||
| # of advantages over other config formats, but there are two things that | ||
| # can be used when modifying settings. | ||
| # | ||
| # You can include other configuration files in this main application.conf file: | ||
| #include "extra-config.conf" | ||
| # | ||
| # You can declare variables and substitute for them: | ||
| #mykey = ${some.value} | ||
| # | ||
| # And if an environment variable exists when there is no other subsitution, then | ||
| # HOCON will fall back to substituting environment variable: | ||
| #mykey = ${JAVA_HOME} | ||
|
|
||
| ## Akka | ||
| # https://www.playframework.com/documentation/latest/ScalaAkka#Configuration | ||
| # https://www.playframework.com/documentation/latest/JavaAkka#Configuration | ||
| # ~~~~~ | ||
| # Play uses Akka internally and exposes Akka Streams and actors in Websockets and | ||
| # other streaming HTTP responses. | ||
| akka { | ||
| # "akka.log-config-on-start" is extraordinarly useful because it log the complete | ||
| # configuration at INFO level, including defaults and overrides, so it s worth | ||
| # putting at the very top. | ||
| # | ||
| # Put the following in your conf/logback.xml file: | ||
| # | ||
| # <logger name="akka.actor" level="INFO" /> | ||
| # | ||
| # And then uncomment this line to debug the configuration. | ||
| # | ||
| #log-config-on-start = true | ||
| } | ||
|
|
||
| ## Secret key | ||
| # http://www.playframework.com/documentation/latest/ApplicationSecret | ||
| # ~~~~~ | ||
| # The secret key is used to sign Play's session cookie. | ||
| # This must be changed for production, but we don't recommend you change it in this file. | ||
| play.crypto.secret = "changeme" | ||
|
|
||
| ## Modules | ||
| # https://www.playframework.com/documentation/latest/Modules | ||
| # ~~~~~ | ||
| # Control which modules are loaded when Play starts. Note that modules are | ||
| # the replacement for "GlobalSettings", which are deprecated in 2.5.x. | ||
| # Please see https://www.playframework.com/documentation/latest/GlobalSettings | ||
| # for more information. | ||
| # | ||
| # You can also extend Play functionality by using one of the publically available | ||
| # Play modules: https://playframework.com/documentation/latest/ModuleDirectory | ||
| play.modules { | ||
| # By default, Play will load any class called Module that is defined | ||
| # in the root package (the "app" directory), or you can define them | ||
| # explicitly below. | ||
| # If there are any built-in modules that you want to disable, you can list them here. | ||
| #enabled += my.application.Module | ||
|
|
||
| # If there are any built-in modules that you want to disable, you can list them here. | ||
| #disabled += "" | ||
| } | ||
|
|
||
| ## IDE | ||
| # https://www.playframework.com/documentation/latest/IDE | ||
| # ~~~~~ | ||
| # Depending on your IDE, you can add a hyperlink for errors that will jump you | ||
| # directly to the code location in the IDE in dev mode. The following line makes | ||
| # use of the IntelliJ IDEA REST interface: | ||
| #play.editor="http://localhost:63342/api/file/?file=%s&line=%s" | ||
|
|
||
| ## Internationalisation | ||
| # https://www.playframework.com/documentation/latest/JavaI18N | ||
| # https://www.playframework.com/documentation/latest/ScalaI18N | ||
| # ~~~~~ | ||
| # Play comes with its own i18n settings, which allow the user's preferred language | ||
| # to map through to internal messages, or allow the language to be stored in a cookie. | ||
| play.i18n { | ||
| # The application languages | ||
| langs = [ "en" ] | ||
|
|
||
| # Whether the language cookie should be secure or not | ||
| #langCookieSecure = true | ||
|
|
||
| # Whether the HTTP only attribute of the cookie should be set to true | ||
| #langCookieHttpOnly = true | ||
| } | ||
|
|
||
| ## Play HTTP settings | ||
| # ~~~~~ | ||
| play.http { | ||
| ## Router | ||
| # https://www.playframework.com/documentation/latest/JavaRouting | ||
| # https://www.playframework.com/documentation/latest/ScalaRouting | ||
| # ~~~~~ | ||
| # Define the Router object to use for this application. | ||
| # This router will be looked up first when the application is starting up, | ||
| # so make sure this is the entry point. | ||
| # Furthermore, it's assumed your route file is named properly. | ||
| # So for an application router like `my.application.Router`, | ||
| # you may need to define a router file `conf/my.application.routes`. | ||
| # Default to Routes in the root package (aka "apps" folder) (and conf/routes) | ||
| #router = my.application.Router | ||
|
|
||
| ## Action Creator | ||
| # https://www.playframework.com/documentation/latest/JavaActionCreator | ||
| # ~~~~~ | ||
| #actionCreator = null | ||
|
|
||
| ## ErrorHandler | ||
| # https://www.playframework.com/documentation/latest/JavaRouting | ||
| # https://www.playframework.com/documentation/latest/ScalaRouting | ||
| # ~~~~~ | ||
| # If null, will attempt to load a class called ErrorHandler in the root package, | ||
| #errorHandler = null | ||
|
|
||
| ## Filters | ||
| # https://www.playframework.com/documentation/latest/ScalaHttpFilters | ||
| # https://www.playframework.com/documentation/latest/JavaHttpFilters | ||
| # ~~~~~ | ||
| # Filters run code on every request. They can be used to perform | ||
| # common logic for all your actions, e.g. adding common headers. | ||
| # Defaults to "Filters" in the root package (aka "apps" folder) | ||
| # Alternatively you can explicitly register a class here. | ||
| #filters = my.application.Filters | ||
|
|
||
| ## Session & Flash | ||
| # https://www.playframework.com/documentation/latest/JavaSessionFlash | ||
| # https://www.playframework.com/documentation/latest/ScalaSessionFlash | ||
| # ~~~~~ | ||
| session { | ||
| # Sets the cookie to be sent only over HTTPS. | ||
| #secure = true | ||
|
|
||
| # Sets the cookie to be accessed only by the server. | ||
| #httpOnly = true | ||
|
|
||
| # Sets the max-age field of the cookie to 5 minutes. | ||
| # NOTE: this only sets when the browser will discard the cookie. Play will consider any | ||
| # cookie value with a valid signature to be a valid session forever. To implement a server side session timeout, | ||
| # you need to put a timestamp in the session and check it at regular intervals to possibly expire it. | ||
| #maxAge = 300 | ||
|
|
||
| # Sets the domain on the session cookie. | ||
| #domain = "example.com" | ||
| } | ||
|
|
||
| flash { | ||
| # Sets the cookie to be sent only over HTTPS. | ||
| #secure = true | ||
|
|
||
| # Sets the cookie to be accessed only by the server. | ||
| #httpOnly = true | ||
| } | ||
| } | ||
|
|
||
| ## Netty Provider | ||
| # https://www.playframework.com/documentation/latest/SettingsNetty | ||
| # ~~~~~ | ||
| play.server.netty { | ||
| # Whether the Netty wire should be logged | ||
| #log.wire = true | ||
|
|
||
| # If you run Play on Linux, you can use Netty's native socket transport | ||
| # for higher performance with less garbage. | ||
| #transport = "native" | ||
| } | ||
|
|
||
| ## WS (HTTP Client) | ||
| # https://www.playframework.com/documentation/latest/ScalaWS#Configuring-WS | ||
| # ~~~~~ | ||
| # The HTTP client primarily used for REST APIs. The default client can be | ||
| # configured directly, but you can also create different client instances | ||
| # with customized settings. You must enable this by adding to build.sbt: | ||
| # | ||
| # libraryDependencies += ws // or javaWs if using java | ||
| # | ||
| play.ws { | ||
| # Sets HTTP requests not to follow 302 requests | ||
| #followRedirects = false | ||
|
|
||
| # Sets the maximum number of open HTTP connections for the client. | ||
| #ahc.maxConnectionsTotal = 50 | ||
|
|
||
| ## WS SSL | ||
| # https://www.playframework.com/documentation/latest/WsSSL | ||
| # ~~~~~ | ||
| ssl { | ||
| # Configuring HTTPS with Play WS does not require programming. You can | ||
| # set up both trustManager and keyManager for mutual authentication, and | ||
| # turn on JSSE debugging in development with a reload. | ||
| #debug.handshake = true | ||
| #trustManager = { | ||
| # stores = [ | ||
| # { type = "JKS", path = "exampletrust.jks" } | ||
| # ] | ||
| #} | ||
| } | ||
| } | ||
|
|
||
| ## Cache | ||
| # https://www.playframework.com/documentation/latest/JavaCache | ||
| # https://www.playframework.com/documentation/latest/ScalaCache | ||
| # ~~~~~ | ||
| # Play comes with an integrated cache API that can reduce the operational | ||
| # overhead of repeated requests. You must enable this by adding to build.sbt: | ||
| # | ||
| # libraryDependencies += cache | ||
| # | ||
| play.cache { | ||
| # If you want to bind several caches, you can bind the individually | ||
| #bindCaches = ["db-cache", "user-cache", "session-cache"] | ||
| } | ||
|
|
||
| ## Filters | ||
| # https://www.playframework.com/documentation/latest/Filters | ||
| # ~~~~~ | ||
| # There are a number of built-in filters that can be enabled and configured | ||
| # to give Play greater security. You must enable this by adding to build.sbt: | ||
| # | ||
| # libraryDependencies += filters | ||
| # | ||
| play.filters { | ||
| ## CORS filter configuration | ||
| # https://www.playframework.com/documentation/latest/CorsFilter | ||
| # ~~~~~ | ||
| # CORS is a protocol that allows web applications to make requests from the browser | ||
| # across different domains. | ||
| # NOTE: You MUST apply the CORS configuration before the CSRF filter, as CSRF has | ||
| # dependencies on CORS settings. | ||
| cors { | ||
| # Filter paths by a whitelist of path prefixes | ||
| #pathPrefixes = ["/some/path", ...] | ||
|
|
||
| # The allowed origins. If null, all origins are allowed. | ||
| #allowedOrigins = ["http://www.example.com"] | ||
|
|
||
| # The allowed HTTP methods. If null, all methods are allowed | ||
| #allowedHttpMethods = ["GET", "POST"] | ||
| } | ||
|
|
||
| ## CSRF Filter | ||
| # https://www.playframework.com/documentation/latest/ScalaCsrf#Applying-a-global-CSRF-filter | ||
| # https://www.playframework.com/documentation/latest/JavaCsrf#Applying-a-global-CSRF-filter | ||
| # ~~~~~ | ||
| # Play supports multiple methods for verifying that a request is not a CSRF request. | ||
| # The primary mechanism is a CSRF token. This token gets placed either in the query string | ||
| # or body of every form submitted, and also gets placed in the users session. | ||
| # Play then verifies that both tokens are present and match. | ||
| csrf { | ||
| # Sets the cookie to be sent only over HTTPS | ||
| #cookie.secure = true | ||
|
|
||
| # Defaults to CSRFErrorHandler in the root package. | ||
| #errorHandler = MyCSRFErrorHandler | ||
| } | ||
|
|
||
| ## Security headers filter configuration | ||
| # https://www.playframework.com/documentation/latest/SecurityHeaders | ||
| # ~~~~~ | ||
| # Defines security headers that prevent XSS attacks. | ||
| # If enabled, then all options are set to the below configuration by default: | ||
| headers { | ||
| # The X-Frame-Options header. If null, the header is not set. | ||
| #frameOptions = "DENY" | ||
|
|
||
| # The X-XSS-Protection header. If null, the header is not set. | ||
| #xssProtection = "1; mode=block" | ||
|
|
||
| # The X-Content-Type-Options header. If null, the header is not set. | ||
| #contentTypeOptions = "nosniff" | ||
|
|
||
| # The X-Permitted-Cross-Domain-Policies header. If null, the header is not set. | ||
| #permittedCrossDomainPolicies = "master-only" | ||
|
|
||
| # The Content-Security-Policy header. If null, the header is not set. | ||
| #contentSecurityPolicy = "default-src 'self'" | ||
| } | ||
|
|
||
| ## Allowed hosts filter configuration | ||
| # https://www.playframework.com/documentation/latest/AllowedHostsFilter | ||
| # ~~~~~ | ||
| # Play provides a filter that lets you configure which hosts can access your application. | ||
| # This is useful to prevent cache poisoning attacks. | ||
| hosts { | ||
| # Allow requests to example.com, its subdomains, and localhost:9000. | ||
| #allowed = [".example.com", "localhost:9000"] | ||
| } | ||
| } | ||
|
|
||
| ## Evolutions | ||
| # https://www.playframework.com/documentation/latest/Evolutions | ||
| # ~~~~~ | ||
| # Evolutions allows database scripts to be automatically run on startup in dev mode | ||
| # for database migrations. You must enable this by adding to build.sbt: | ||
| # | ||
| # libraryDependencies += evolutions | ||
| # | ||
| play.evolutions { | ||
| # You can disable evolutions for a specific datasource if necessary | ||
| #db.default.enabled = false | ||
| } | ||
|
|
||
| ## Database Connection Pool | ||
| # https://www.playframework.com/documentation/latest/SettingsJDBC | ||
| # ~~~~~ | ||
| # Play doesn't require a JDBC database to run, but you can easily enable one. | ||
| # | ||
| # libraryDependencies += jdbc | ||
| # | ||
| play.db { | ||
| # The combination of these two settings results in "db.default" as the | ||
| # default JDBC pool: | ||
| #config = "db" | ||
| #default = "default" | ||
|
|
||
| # Play uses HikariCP as the default connection pool. You can override | ||
| # settings by changing the prototype: | ||
| prototype { | ||
| # Sets a fixed JDBC connection pool size of 50 | ||
| #hikaricp.minimumIdle = 50 | ||
| #hikaricp.maximumPoolSize = 50 | ||
| } | ||
| } | ||
|
|
||
| ## JDBC Datasource | ||
| # https://www.playframework.com/documentation/latest/JavaDatabase | ||
| # https://www.playframework.com/documentation/latest/ScalaDatabase | ||
| # ~~~~~ | ||
| # Once JDBC datasource is set up, you can work with several different | ||
| # database options: | ||
| # | ||
| # Slick (Scala preferred option): https://www.playframework.com/documentation/latest/PlaySlick | ||
| # JPA (Java preferred option): https://playframework.com/documentation/latest/JavaJPA | ||
| # EBean: https://playframework.com/documentation/latest/JavaEbean | ||
| # Anorm: https://www.playframework.com/documentation/latest/ScalaAnorm | ||
| # | ||
| db { | ||
| # You can declare as many datasources as you want. | ||
| # By convention, the default datasource is named `default` | ||
|
|
||
| # https://www.playframework.com/documentation/latest/Developing-with-the-H2-Database | ||
| #default.driver = org.h2.Driver | ||
| #default.url = "jdbc:h2:mem:play" | ||
| #default.username = sa | ||
| #default.password = "" | ||
|
|
||
| # You can turn on SQL logging for any datasource | ||
| # https://www.playframework.com/documentation/latest/Highlights25#Logging-SQL-statements | ||
| #default.logSql=true | ||
| } |
| @@ -0,0 +1,41 @@ | ||
| <!-- https://www.playframework.com/documentation/latest/SettingsLogger --> | ||
| <configuration> | ||
|
|
||
| <conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel" /> | ||
|
|
||
| <appender name="FILE" class="ch.qos.logback.core.FileAppender"> | ||
| <file>${application.home:-.}/logs/application.log</file> | ||
| <encoder> | ||
| <pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern> | ||
| </encoder> | ||
| </appender> | ||
|
|
||
| <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> | ||
| <encoder> | ||
| <pattern>%coloredLevel %logger{15} - %message%n%xException{10}</pattern> | ||
| </encoder> | ||
| </appender> | ||
|
|
||
| <appender name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender"> | ||
| <appender-ref ref="FILE" /> | ||
| </appender> | ||
|
|
||
| <appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender"> | ||
| <appender-ref ref="STDOUT" /> | ||
| </appender> | ||
|
|
||
| <logger name="play" level="INFO" /> | ||
| <logger name="application" level="DEBUG" /> | ||
|
|
||
| <!-- Off these ones as they are annoying, and anyway we manage configuration ourselves --> | ||
| <logger name="com.avaje.ebean.config.PropertyMapLoader" level="OFF" /> | ||
| <logger name="com.avaje.ebeaninternal.server.core.XmlConfigLoader" level="OFF" /> | ||
| <logger name="com.avaje.ebeaninternal.server.lib.BackgroundThread" level="OFF" /> | ||
| <logger name="com.gargoylesoftware.htmlunit.javascript" level="OFF" /> | ||
|
|
||
| <root level="WARN"> | ||
| <appender-ref ref="ASYNCFILE" /> | ||
| <appender-ref ref="ASYNCSTDOUT" /> | ||
| </root> | ||
|
|
||
| </configuration> |
| @@ -0,0 +1,13 @@ | ||
| # Routes | ||
| # This file defines all application routes (Higher priority routes first) | ||
| # ~~~~ | ||
|
|
||
| # An example controller showing a sample home page | ||
| GET / controllers.HomeController.index | ||
| # An example controller showing how to use dependency injection | ||
| GET /count controllers.CountController.count | ||
| # An example controller showing how to write asynchronous code | ||
| GET /message controllers.AsyncController.message | ||
|
|
||
| # Map static resources from the /public folder to the /assets URL path | ||
| GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) |
| @@ -0,0 +1,4 @@ | ||
| #Activator-generated Properties | ||
| #Wed Jul 12 00:41:48 UTC 2017 | ||
| template.uuid=3ae04e99-eaf4-4283-a326-f9d0c45df7b4 | ||
| sbt.version=0.13.11 |
| @@ -0,0 +1,21 @@ | ||
| // The Play plugin | ||
| addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.10") | ||
|
|
||
| // Web plugins | ||
| addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0") | ||
| addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0") | ||
| addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.4") | ||
| addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.8") | ||
| addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.1") | ||
| addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0") | ||
| addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.6") | ||
|
|
||
| // Play enhancer - this automatically generates getters/setters for public fields | ||
| // and rewrites accessors of these fields to use the getters/setters. Remove this | ||
| // plugin if you prefer not to have this feature, or disable on a per project | ||
| // basis using disablePlugins(PlayEnhancer) in your build.sbt | ||
| addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") | ||
|
|
||
| // Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using | ||
| // enablePlugins(PlayEbean). | ||
| // addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.2") |
| @@ -0,0 +1,3 @@ | ||
| if (window.console) { | ||
| console.log("Welcome to your Play application's JavaScript!"); | ||
| } |
| @@ -0,0 +1,45 @@ | ||
| import java.util.ArrayList; | ||
| import java.util.HashMap; | ||
| import java.util.List; | ||
| import java.util.Map; | ||
|
|
||
| import com.fasterxml.jackson.databind.JsonNode; | ||
| import org.junit.*; | ||
|
|
||
| import play.mvc.*; | ||
| import play.test.*; | ||
| import play.data.DynamicForm; | ||
| import play.data.validation.ValidationError; | ||
| import play.data.validation.Constraints.RequiredValidator; | ||
| import play.i18n.Lang; | ||
| import play.libs.F; | ||
| import play.libs.F.*; | ||
| import play.twirl.api.Content; | ||
|
|
||
| import static play.test.Helpers.*; | ||
| import static org.junit.Assert.*; | ||
|
|
||
|
|
||
| /** | ||
| * | ||
| * Simple (JUnit) tests that can call all parts of a play app. | ||
| * If you are interested in mocking a whole application, see the wiki for more details. | ||
| * | ||
| */ | ||
| public class ApplicationTest { | ||
|
|
||
| @Test | ||
| public void simpleCheck() { | ||
| int a = 1 + 1; | ||
| assertEquals(2, a); | ||
| } | ||
|
|
||
| @Test | ||
| public void renderTemplate() { | ||
| Content html = views.html.index.render("Your new application is ready."); | ||
| assertEquals("text/html", html.contentType()); | ||
| assertTrue(html.body().contains("Your new application is ready.")); | ||
| } | ||
|
|
||
|
|
||
| } |
| @@ -0,0 +1,25 @@ | ||
| import org.junit.*; | ||
|
|
||
| import play.mvc.*; | ||
| import play.test.*; | ||
|
|
||
| import static play.test.Helpers.*; | ||
| import static org.junit.Assert.*; | ||
|
|
||
| import static org.fluentlenium.core.filter.FilterConstructor.*; | ||
|
|
||
| public class IntegrationTest { | ||
|
|
||
| /** | ||
| * add your integration test here | ||
| * in this example we just check if the welcome page is being shown | ||
| */ | ||
| @Test | ||
| public void test() { | ||
| running(testServer(3333, fakeApplication(inMemoryDatabase())), HTMLUNIT, browser -> { | ||
| browser.goTo("http://localhost:3333"); | ||
| assertTrue(browser.pageSource().contains("Your new application is ready.")); | ||
| }); | ||
| } | ||
|
|
||
| } |