Browse Source

Fixed some small issues. Restructured ninja-standalone to match ninja-resin.

reyez 11 years ago
parent
commit
73af14b0a8
32 changed files with 447 additions and 525 deletions
  1. 7 0
      ninja-resin/README.md
  2. 11 0
      ninja-resin/changelog.md
  3. 3 3
      ninja-resin/pom.xml
  4. 4 4
      ninja-resin/setup.py
  5. 6 0
      ninja-standalone/README.md
  6. 146 146
      ninja-standalone/pom.xml
  7. 3 3
      ninja-standalone/setup.py
  8. 22 10
      ninja-standalone/src/main/java/conf/Routes.java
  9. 0 0
      ninja-standalone/src/main/java/conf/application.conf
  10. 0 0
      ninja-standalone/src/main/java/conf/messages.properties
  11. 78 0
      ninja-standalone/src/main/java/controllers/HelloDbController.java
  12. 30 0
      ninja-standalone/src/main/java/controllers/HelloFortuneController.java
  13. 1 1
      ninja-standalone/src/main/java/controllers/HelloJsonController.java
  14. 2 2
      ninja-standalone/src/main/java/controllers/HelloPlaintextController.java
  15. 35 0
      ninja-standalone/src/main/java/controllers/SetupController.java
  16. 6 8
      ninja-standalone/src/main/java/dao/FortuneDao.java
  17. 29 25
      ninja-standalone/src/main/java/dao/SetupDao.java
  18. 7 8
      ninja-standalone/src/main/java/dao/WorldDao.java
  19. 0 0
      ninja-standalone/src/main/java/ehcache.xml
  20. 0 41
      ninja-standalone/src/main/java/hello/controllers/DatabaseAccess.java
  21. 0 86
      ninja-standalone/src/main/java/hello/controllers/HelloDbController.java
  22. 0 28
      ninja-standalone/src/main/java/hello/controllers/HelloFortuneController.java
  23. 0 20
      ninja-standalone/src/main/java/hello/views/HelloFortuneController/index.ftl.html
  24. 0 0
      ninja-standalone/src/main/java/logback.xml
  25. 7 6
      ninja-standalone/src/main/java/model/Fortune.java
  26. 2 1
      ninja-standalone/src/main/java/model/World.java
  27. 20 0
      ninja-standalone/src/main/java/views/HelloFortuneController/index.ftl.html
  28. 0 71
      ninja-standalone/src/main/resources/META-INF/persistence.xml
  29. 12 20
      ninja-standalone/src/test/java/controllers/HelloDbControllerTest.java
  30. 5 14
      ninja-standalone/src/test/java/controllers/HelloFortuneControllerTest.java
  31. 6 14
      ninja-standalone/src/test/java/controllers/HelloJsonControllerTest.java
  32. 5 14
      ninja-standalone/src/test/java/controllers/HelloPlaintextControllerTest.java

+ 7 - 0
ninja-resin/README.md

@@ -2,6 +2,13 @@
 
 This is the [Ninja](http://www.ninjaframework.org/) portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
 
+## IMPORTANT!!!!
+
+ninja-resin is in essence just a copy of ninja-standalone with different datasources.
+That means all stuff you change in ninja-resin should also be applied to 
+ninja-standalone and vice-versa.
+
+
 ## Test URLs
 ### JSON Encoding Test
 

+ 11 - 0
ninja-resin/changelog.md

@@ -1,3 +1,14 @@
+Changelog 
+=========
+
+Because ninja-standalone and ninja-resin are almost identical this changelog
+applies to both.
+
+ * 2013-01-08 Performance improvement for Json Afterburner now active by default (from 2.5.1 onwards)
+ * 2013-01-08 Performance improvement for Db: Replaced @Transactional with @UnitOfWork for read only db operations (from 2.5.1 onwards)
+ * 2013-01-08 Reformatted and restructured some code
+ * 2013-01-08 Make sure Ninja is running in production mode (faster templates)
+ * 2013-01-08 Bump to Ninja 2.5.1
  * 2013-12-13 Removed route that is never used in tests.
  * 2013-12-14 Bump to Ninja 2.4.0.
  * 2013-12-14 Added testcases and support for h2 in memory to develop locally with

+ 3 - 3
ninja-resin/pom.xml

@@ -1,11 +1,11 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <groupId>helo.world</groupId>
-    <artifactId>hello-ninja</artifactId>
+    <groupId>org.ninjaframework.techempower</groupId>
+    <artifactId>ninja-resin</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>ninja-resin</name>
-    <description>Nnja test for the TechEmpower/FrameworkBenchmarks project</description>
+    <description>Ninja test for the TechEmpower/FrameworkBenchmarks project</description>
 
     <properties>
         <java.version>1.7</java.version>

+ 4 - 4
ninja-resin/setup.py

@@ -4,19 +4,19 @@ import setup_util
 import os
 
 def start(args, logfile, errfile):
-  setup_util.replace_text("ninja/src/main/webapp/WEB-INF/resin-web.xml", "mysql:\/\/.*:3306", "mysql://" + args.database_host + ":3306")
+  setup_util.replace_text("ninja-resin/src/main/webapp/WEB-INF/resin-web.xml", "mysql:\/\/.*:3306", "mysql://" + args.database_host + ":3306")
   
   try:
-    subprocess.check_call("mvn clean compile war:war", shell=True, cwd="ninja", stderr=errfile, stdout=logfile)
+    subprocess.check_call("mvn clean compile war:war", shell=True, cwd="ninja-resin", stderr=errfile, stdout=logfile)
 
     if os.name == 'nt':
       subprocess.check_call('rmdir /S /Q "%RESIN_HOME%\\webapps\\"', shell=True, stderr=errfile, stdout=logfile)
       subprocess.check_call('mkdir "%RESIN_HOME%\\webapps\\"', shell=True, stderr=errfile, stdout=logfile)
-      subprocess.check_call('copy ninja\\target\\ninja.war "%RESIN_HOME%\\webapps\\ninja.war"', shell=True, stderr=errfile, stdout=logfile)
+      subprocess.check_call('copy ninja-resin\\target\\ninja-resin.war "%RESIN_HOME%\\webapps\\ninja-resin.war"', shell=True, stderr=errfile, stdout=logfile)
       subprocess.check_call('"%RESIN_HOME%\\bin\\start.bat"', shell=True, stderr=errfile, stdout=logfile)
     else:
       subprocess.check_call("rm -rf $RESIN_HOME/webapps/*", shell=True, stderr=errfile, stdout=logfile)
-      subprocess.check_call("cp ninja/target/ninja.war $RESIN_HOME/webapps/ninja.war", shell=True, stderr=errfile, stdout=logfile)
+      subprocess.check_call("cp ninja-resin/target/ninja-resin.war $RESIN_HOME/webapps/ninja-resin.war", shell=True, stderr=errfile, stdout=logfile)
       subprocess.check_call("$RESIN_HOME/bin/resinctl", shell=True, stderr=errfile, stdout=logfile)
     return 0
   except subprocess.CalledProcessError:

+ 6 - 0
ninja-standalone/README.md

@@ -2,6 +2,12 @@
 
 This is the [Ninja-standalone](http://www.ninjaframework.org/) portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
 
+## IMPORTANT!!!!
+
+ninja-resin is in essence just a copy of ninja-standalone with different datasources.
+That means all stuff you change in ninja-resin should also be applied to 
+ninja-standalone and vice-versa.
+
 ## Test URLs
 ### JSON Encoding Test
 

+ 146 - 146
ninja-standalone/pom.xml

@@ -1,70 +1,70 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<groupId>helo.world</groupId>
-	<artifactId>hello-ninja-standalone</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<name>ninja-standalone</name>
-	<description>Nnja test for the TechEmpower/FrameworkBenchmarks project</description>
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.ninjaframework.techempower</groupId>
+    <artifactId>ninja-standalone</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>ninja-standalone</name>
+    <description>Ninja test for the TechEmpower/FrameworkBenchmarks project</description>
 
-	<properties>
-		<java-version>1.7</java-version>
-		<ninja.version>2.5.0</ninja.version>
-		<mysql.version>5.1.26</mysql.version>
-		<jetty.version>9.0.5.v20130815</jetty.version>
-	</properties>
+    <properties>
+        <java-version>1.7</java-version>
+        <ninja.version>2.5.1</ninja.version>
+        <mysql.version>5.1.26</mysql.version>
+        <jetty.version>9.0.5.v20130815</jetty.version>
+    </properties>
 
-	<dependencies>
-		<dependency>
-			<groupId>org.ninjaframework</groupId>
-			<artifactId>ninja-servlet</artifactId>
-			<version>${ninja.version}</version>
-		</dependency>
+    <dependencies>
+        <dependency>
+            <groupId>org.ninjaframework</groupId>
+            <artifactId>ninja-servlet</artifactId>
+            <version>${ninja.version}</version>
+        </dependency>
 
-    		<dependency>
-        		<groupId>org.ninjaframework</groupId>
-        		<artifactId>ninja-standalone</artifactId>
-        		<version>${ninja.version}</version>
-    		</dependency>   
+        <dependency>
+            <groupId>org.ninjaframework</groupId>
+            <artifactId>ninja-standalone</artifactId>
+            <version>${ninja.version}</version>
+        </dependency>   
 
-		<dependency>
-			<groupId>javax.servlet</groupId>
-			<artifactId>javax.servlet-api</artifactId>
-			<version>3.0.1</version>
-			<scope>provided</scope>
-		</dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>3.0.1</version>
+            <scope>provided</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>org.ninjaframework</groupId>
-			<artifactId>ninja-test-utilities</artifactId>
-			<version>${ninja.version}</version>
-			<scope>test</scope>
-		</dependency>
+        <dependency>
+            <groupId>org.ninjaframework</groupId>
+            <artifactId>ninja-test-utilities</artifactId>
+            <version>${ninja.version}</version>
+            <scope>test</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>mysql</groupId>
-			<artifactId>mysql-connector-java</artifactId>
-			<version>${mysql.version}</version>
-		</dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>${mysql.version}</version>
+        </dependency>
                         
-                <dependency>
-                    <groupId>com.h2database</groupId>
-                    <artifactId>h2</artifactId>
-                    <version>1.3.174</version>
-                </dependency>
-	</dependencies>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>1.3.174</version>
+        </dependency>
+    </dependencies>
 
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<version>3.1</version>
-				<configuration>
-					<source>${java-version}</source>
-					<target>${java-version}</target>
-				</configuration>
-			</plugin>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>${java-version}</source>
+                    <target>${java-version}</target>
+                </configuration>
+            </plugin>
 			
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
@@ -81,96 +81,96 @@
                 <version>${ninja.version}</version>
             </plugin>
 
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-enforcer-plugin</artifactId>
-				<version>1.0</version>
-				<executions>
-					<execution>
-						<id>enforce-banned-dependencies</id>
-						<goals>
-							<goal>enforce</goal>
-						</goals>
-						<configuration>
-							<rules>
-								<bannedDependencies>
-									<excludes>
-										<exclude>commons-logging</exclude>
-									</excludes>
-								</bannedDependencies>
-							</rules>
-							<fail>true</fail>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-enforcer-plugin</artifactId>
+                <version>1.0</version>
+                <executions>
+                    <execution>
+                        <id>enforce-banned-dependencies</id>
+                        <goals>
+                            <goal>enforce</goal>
+                        </goals>
+                        <configuration>
+                            <rules>
+                                <bannedDependencies>
+                                    <excludes>
+                                        <exclude>commons-logging</exclude>
+                                    </excludes>
+                                </bannedDependencies>
+                            </rules>
+                            <fail>true</fail>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
 
-			<plugin>
-				<groupId>org.eclipse.jetty</groupId>
-				<artifactId>jetty-maven-plugin</artifactId>
-				<version>${jetty.version}</version>
-				<configuration>
-					<contextPath>/</contextPath>
-					<stopKey>stop</stopKey>
-					<stopPort>8889</stopPort>
-					<scanIntervalSeconds>1</scanIntervalSeconds>
-					<reload>automatic</reload>
-					<scanTargetPatterns>
-						<scanTargetPattern>
-							<directory>target/classes</directory>
-							<includes>
-								<include>**/*</include>
-							</includes>
-							<excludes>
-								<exclude>**/*.ftl.html</exclude>
-								<exclude>assets/**</exclude>
-							</excludes>
-						</scanTargetPattern>
-					</scanTargetPatterns>
-				</configuration>
-			</plugin>
+            <plugin>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-maven-plugin</artifactId>
+                <version>${jetty.version}</version>
+                <configuration>
+                    <contextPath>/</contextPath>
+                    <stopKey>stop</stopKey>
+                    <stopPort>8889</stopPort>
+                    <scanIntervalSeconds>1</scanIntervalSeconds>
+                    <reload>automatic</reload>
+                    <scanTargetPatterns>
+                        <scanTargetPattern>
+                            <directory>target/classes</directory>
+                            <includes>
+                                <include>**/*</include>
+                            </includes>
+                            <excludes>
+                                <exclude>**/*.ftl.html</exclude>
+                                <exclude>assets/**</exclude>
+                            </excludes>
+                        </scanTargetPattern>
+                    </scanTargetPatterns>
+                </configuration>
+            </plugin>
 
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-deploy-plugin</artifactId>
-				<version>2.7</version>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-			</plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <version>2.7</version>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
 
-			<plugin>
-				<artifactId>maven-assembly-plugin</artifactId>
-				<version>2.4</version>
-				<configuration>
-					<descriptorRefs>
-						<descriptorRef>jar-with-dependencies</descriptorRef>
-					</descriptorRefs>
-					<archive>
-						<manifest>
-							<mainClass>ninja.standalone.NinjaJetty</mainClass>
-						</manifest>
-					</archive>
-				</configuration>
-			</plugin>
-		</plugins>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>2.4</version>
+                <configuration>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                    <archive>
+                        <manifest>
+                            <mainClass>ninja.standalone.NinjaJetty</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+        </plugins>
 
-		<resources>
-			<resource>
-				<directory>src/main/java</directory>
-				<includes>
-					<include>**/*</include>
-				</includes>
-				<excludes>
-					<exclude>**/*.java</exclude>
-				</excludes>
-			</resource>
-			<resource>
-				<directory>src/main/resources</directory>
-				<includes>
-					<include>**/*</include>
-				</includes>
-			</resource>
-		</resources>
-	</build>
+        <resources>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+    </build>
 </project>

+ 3 - 3
ninja-standalone/setup.py

@@ -4,11 +4,11 @@ import setup_util
 import os
 
 def start(args, logfile, errfile):
-  setup_util.replace_text("ninja-standalone/src/main/resources/conf/application.conf", "mysql:\/\/.*:3306", "mysql://" + args.database_host + ":3306")
+  setup_util.replace_text("ninja-standalone/src/main/java/conf/application.conf", "mysql:\/\/.*:3306", "mysql://" + args.database_host + ":3306")
   
   try:
     subprocess.check_call("mvn clean compile assembly:single", shell=True, cwd="ninja-standalone", stderr=errfile, stdout=logfile)
-    subprocess.check_call("java -Dninja.port=8080 -jar target/hello-ninja-standalone-0.0.1-SNAPSHOT-jar-with-dependencies.jar", cwd="ninja-standalone", shell=True, stderr=errfile, stdout=logfile)
+    subprocess.check_call("java -Dninja.port=8080 -jar target/ninja-standalone-0.0.1-SNAPSHOT-jar-with-dependencies.jar", cwd="ninja-standalone", shell=True, stderr=errfile, stdout=logfile)
     return 0
   except subprocess.CalledProcessError:
     return 1
@@ -17,7 +17,7 @@ def stop(logfile, errfile):
   p = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE)
   out, err = p.communicate()
   for line in out.splitlines():
-    if 'hello-ninja' in line:
+    if 'ninja-standalone' in line:
       pid = int(line.split(None, 2)[1])
       os.kill(pid, 9)
   return 0

+ 22 - 10
ninja-standalone/src/main/java/conf/Routes.java

@@ -1,23 +1,35 @@
 package conf;
 
-import hello.controllers.HelloDbController;
-import hello.controllers.HelloFortuneController;
-import hello.controllers.HelloJsonController;
-import hello.controllers.HelloPlaintextController;
+import com.google.inject.Inject;
+import controllers.HelloDbController;
+import controllers.HelloFortuneController;
+import controllers.HelloJsonController;
+import controllers.HelloPlaintextController;
+import controllers.SetupController;
 import ninja.Router;
 import ninja.application.ApplicationRoutes;
+import ninja.utils.NinjaProperties;
 
 public class Routes implements ApplicationRoutes {
 
+    @Inject
+    NinjaProperties ninjaProperties;
+
     @Override
     public void init(Router router) {
 
-	router.GET().route("/plaintext").with(HelloPlaintextController.class, "index");
-	router.GET().route("/json").with(HelloJsonController.class, "index");
-	router.GET().route("/queries").with(HelloDbController.class, "multiGet");
-	router.GET().route("/db").with(HelloDbController.class, "singleGet");
-	router.GET().route("/fortunes").with(HelloFortuneController.class, "index");
+        router.GET().route("/plaintext").with(HelloPlaintextController.class, "index");
+        router.GET().route("/json").with(HelloJsonController.class, "index");
+        router.GET().route("/queries").with(HelloDbController.class, "multiGet");
+        router.GET().route("/db").with(HelloDbController.class, "singleGet");
+        router.GET().route("/fortunes").with(HelloFortuneController.class, "index");
         router.GET().route("/update").with(HelloDbController.class, "update");
 
+        // This route is only active when developing the app in dev mode
+        // e.g. when calling "mvn ninja:run".
+        if (ninjaProperties.isDev()) {
+            router.GET().route("/setupData").with(SetupController.class, "setupData");
+        }
+
     }
-}
+}

+ 0 - 0
ninja-standalone/src/main/resources/conf/application.conf → ninja-standalone/src/main/java/conf/application.conf


+ 0 - 0
ninja-standalone/src/main/resources/conf/messages.properties → ninja-standalone/src/main/java/conf/messages.properties


+ 78 - 0
ninja-standalone/src/main/java/controllers/HelloDbController.java

@@ -0,0 +1,78 @@
+package controllers;
+
+import dao.WorldDao;
+import model.World;
+
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+
+import ninja.Result;
+import ninja.Results;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.inject.persist.Transactional;
+import ninja.jpa.UnitOfWork;
+import ninja.params.Param;
+
+@Singleton
+public class HelloDbController {
+
+    private static final int DB_ROWS = 10000;
+    private final Random random = ThreadLocalRandom.current();
+
+    @Inject
+    WorldDao worldDao;
+
+    @UnitOfWork
+    public Result singleGet() {
+        return Results.json().render(getRandomWorld());
+    }
+
+    @UnitOfWork
+    public Result multiGet(@Param("queries") Integer queries) {
+        if (queries == null || queries < 1) {
+            queries = 1;
+        }
+        if (queries > 500) {
+            queries = 500;
+        }
+
+        final World[] worlds = new World[queries];
+
+        for (int i = 0; i < queries; i++) {
+            worlds[i] = getRandomWorld();
+        }
+
+        return Results.json().render(worlds);
+    }
+
+    @Transactional
+    public Result update(@Param("queries") Integer queries) {
+        if (queries == null || queries < 1) {
+            queries = 1;
+        }
+        if (queries > 500) {
+            queries = 500;
+        }
+
+        final World[] worlds = new World[queries];
+
+        for (int i = 0; i < queries; i++) {
+            worlds[i] = getRandomWorld();
+        }
+
+        // now update stuff:
+        for (World world : worlds) {
+            world.randomNumber = random.nextInt();
+            worldDao.put(world);
+        }
+
+        return Results.json().render(worlds);
+    }
+
+    private World getRandomWorld() {
+        return worldDao.get(random.nextInt(DB_ROWS) + 1);
+    }
+
+}

+ 30 - 0
ninja-standalone/src/main/java/controllers/HelloFortuneController.java

@@ -0,0 +1,30 @@
+package controllers;
+
+import dao.FortuneDao;
+import model.Fortune;
+
+import java.util.Collections;
+import java.util.List;
+
+import ninja.Result;
+import ninja.Results;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import ninja.jpa.UnitOfWork;
+
+@Singleton
+public class HelloFortuneController {
+
+    @Inject
+    FortuneDao fortuneDao;
+
+    @UnitOfWork
+    public Result index() {
+        List<Fortune> fortunes = fortuneDao.getAll();
+        fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+        Collections.sort(fortunes);
+
+        return Results.html().render("fortunes", fortunes);
+    }
+}

+ 1 - 1
ninja-standalone/src/main/java/hello/controllers/HelloJsonController.java → ninja-standalone/src/main/java/controllers/HelloJsonController.java

@@ -1,4 +1,4 @@
-package hello.controllers;
+package controllers;
 
 import ninja.Result;
 import ninja.Results;

+ 2 - 2
ninja-standalone/src/main/java/hello/controllers/HelloPlaintextController.java → ninja-standalone/src/main/java/controllers/HelloPlaintextController.java

@@ -1,4 +1,4 @@
-package hello.controllers;
+package controllers;
 
 import ninja.Result;
 import ninja.Results;
@@ -8,6 +8,6 @@ import com.google.inject.Singleton;
 @Singleton
 public class HelloPlaintextController {
     public Result index() {
-	return Results.text().render("Hello, world!");
+	return Results.text().renderRaw("Hello, world!");
     }
 }

+ 35 - 0
ninja-standalone/src/main/java/controllers/SetupController.java

@@ -0,0 +1,35 @@
+package controllers;
+
+import dao.WorldDao;
+import model.World;
+
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+
+import ninja.Result;
+import ninja.Results;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import dao.SetupDao;
+
+@Singleton
+public class SetupController {
+
+    @Inject
+    SetupDao setupDao;
+
+    public Result setupData() {
+        
+        setupDao.deleteAllData();
+        
+        setupDao.generateWorldsForTest();
+        setupDao.generateFortunesForTest();
+        
+        return Results.text().render("setup done");
+        
+    }
+    
+   
+
+}

+ 6 - 8
ninja-standalone/src/main/java/hello/dao/FortuneDao.java → ninja-standalone/src/main/java/dao/FortuneDao.java

@@ -1,6 +1,6 @@
-package hello.dao;
+package dao;
 
-import hello.model.Fortune;
+import model.Fortune;
 
 import java.util.List;
 
@@ -10,7 +10,6 @@ import javax.persistence.Query;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-import com.google.inject.persist.Transactional;
 
 @Singleton
 public class FortuneDao {
@@ -18,14 +17,13 @@ public class FortuneDao {
     @Inject
     Provider<EntityManager> entitiyManagerProvider;
 
-    @Transactional
     public List<Fortune> getAll() {
-	EntityManager entityManager = entitiyManagerProvider.get();
+        EntityManager entityManager = entitiyManagerProvider.get();
 
-	Query q = entityManager.createQuery("SELECT x FROM Fortune x");
-	List<Fortune> fortunes = q.getResultList();
+        Query q = entityManager.createQuery("SELECT x FROM Fortune x");
+        List<Fortune> fortunes = q.getResultList();
 
-	return fortunes;
+        return fortunes;
     }
 
 }

+ 29 - 25
ninja-standalone/src/test/java/hello/controllers/SetupDao.java → ninja-standalone/src/main/java/dao/SetupDao.java

@@ -1,21 +1,21 @@
-package hello.controllers;
+package dao;
 
-import hello.model.Fortune;
-
-import java.util.List;
+import model.Fortune;
 
 import javax.persistence.EntityManager;
-import javax.persistence.Query;
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
-import hello.model.World;
+import java.util.List;
+import javax.persistence.Query;
+import model.World;
 
 /**
- * This class is just for testing.
- * Has nothing to do with the TechEmpower test itself...
+ * This class is just for testing. Has nothing to do with the TechEmpower test
+ * itself...
+ *
  * @author ra
  */
 @Singleton
@@ -24,44 +24,48 @@ public class SetupDao {
     @Inject
     Provider<EntityManager> entitiyManagerProvider;
 
+    @Transactional
+    public void deleteAllData() {
+
+        entitiyManagerProvider.get().createQuery("DELETE FROM World");
+        entitiyManagerProvider.get().createQuery("DELETE FROM Fortune");
+
+    }
+
     @Transactional
     public void generateWorldsForTest() {
-	
+
         for (int i = 0; i < 10000; i++) {
-            
+
             World world = new World();
             world.randomNumber = i; // not really a random number. But we can test with that...
             entitiyManagerProvider.get().persist(world);
-            
-         }
-        
-        
+
+        }
+
     }
-    
+
     @Transactional
     public void generateFortunesForTest() {
-	
 
         {
-            
+
             Fortune fortune = new Fortune();
             // dummy message => just to make sure utf-8 works.
             fortune.message = "レームワークのベンチマーク";
             entitiyManagerProvider.get().persist(fortune);
-            
+
         }
-        
+
         {
- 
+
             Fortune fortune = new Fortune();
             // dummy message => just to make sure utf-8 works.
             fortune.message = "<script>I want to be escaped</script>";
             entitiyManagerProvider.get().persist(fortune);
-            
-        }   
-   
-        
-        
+
+        }
+
     }
 
 }

+ 7 - 8
ninja-standalone/src/main/java/hello/dao/WorldDao.java → ninja-standalone/src/main/java/dao/WorldDao.java

@@ -1,13 +1,12 @@
-package hello.dao;
+package dao;
 
-import hello.model.World;
+import model.World;
 
 import javax.persistence.EntityManager;
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-import com.google.inject.persist.Transactional;
 
 @Singleton
 public class WorldDao {
@@ -16,12 +15,12 @@ public class WorldDao {
     Provider<EntityManager> entitiyManagerProvider;
 
     public World get(int id) {
-	EntityManager entityManager = entitiyManagerProvider.get();
-	return entityManager.find(World.class, id);
+        EntityManager entityManager = entitiyManagerProvider.get();
+        return entityManager.find(World.class, id);
     }
-    
+
     public void put(World world) {
-	EntityManager entityManager = entitiyManagerProvider.get();
-	entityManager.persist(world);
+        EntityManager entityManager = entitiyManagerProvider.get();
+        entityManager.persist(world);
     }
 }

+ 0 - 0
ninja-standalone/src/main/resources/ehcache.xml → ninja-standalone/src/main/java/ehcache.xml


+ 0 - 41
ninja-standalone/src/main/java/hello/controllers/DatabaseAccess.java

@@ -1,41 +0,0 @@
-package hello.controllers;
-
-import com.google.inject.Inject;
-import com.google.inject.persist.UnitOfWork;
-import ninja.Context;
-import ninja.Filter;
-import ninja.FilterChain;
-import ninja.Result;
-
-/**
- *
- * @author ra
- */
-public class DatabaseAccess implements Filter {
-    
-    @Inject
-    private UnitOfWork unitOfWork;
-
-    @Override
-    public Result filter(FilterChain filterChain, Context context) {
-        
-        Result result;
-                
-        try {
-            
-            unitOfWork.begin();
-          
-            result = filterChain.next(context);
-            
-        } finally {
-            
-            unitOfWork.end();
-            
-        }
-        
-        return result;
-     }
- 
-}
-
-

+ 0 - 86
ninja-standalone/src/main/java/hello/controllers/HelloDbController.java

@@ -1,86 +0,0 @@
-package hello.controllers;
-
-import hello.dao.WorldDao;
-import hello.model.World;
-
-import java.util.Random;
-import java.util.concurrent.ThreadLocalRandom;
-
-import ninja.Result;
-import ninja.Results;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import com.google.inject.persist.Transactional;
-import ninja.FilterWith;
-import ninja.params.Param;
-
-@Singleton
-public class HelloDbController {
-
-    private static final int DB_ROWS = 10000;
-    private final Random random = ThreadLocalRandom.current();
-
-    @Inject
-    WorldDao worldDao;
-
-
-    public Result singleGet() {
-	return Results.json().render(getRandomWorld());
-    }
-
-    // @Transactional is important here as it encapsulates all
-    // JPA calls in dependent methods inside one - and only one - 
-    // transaction. Otherwise WorldDao would open x new transactions what
-    // is of course slower than only having one encapsulating transaction.
-    @FilterWith(DatabaseAccess.class)
-    public Result multiGet(@Param("queries") Integer queries) {
-	if (queries == null || queries < 1) {
-	    queries = 1;
-	}
-	if (queries > 500) {
-	    queries = 500;
-	}
-
-	final World[] worlds = new World[queries];
-
-	for (int i = 0; i < queries; i++) {
-	    worlds[i] = getRandomWorld();
-	}
-
-	return Results.json().render(worlds);
-    }
-    
-    // @Transactional is important here as it encapsulates all
-    // JPA calls in dependent methods inside one - and only one - 
-    // transaction. Otherwise WorldDao would open x new transactions what
-    // is of course slower than only having one encapsulating transaction.
-    @FilterWith(DatabaseAccess.class)
-    public Result update(@Param("queries") Integer queries) {
-	if (queries == null || queries < 1) {
-	    queries = 1;
-	}
-	if (queries > 500) {
-	    queries = 500;
-	}
-
-	final World[] worlds = new World[queries];
-
-	for (int i = 0; i < queries; i++) {
-	    worlds[i] = getRandomWorld();
-	}
-        
-        // now update stuff:
-        for (World world : worlds) {
-            world.randomNumber = random.nextInt();
-            worldDao.put(world);
-        }
-
-	return Results.json().render(worlds);
-    }
-
-    private World getRandomWorld() {
-	return worldDao.get(random.nextInt(DB_ROWS) + 1);
-    }
-
-}

+ 0 - 28
ninja-standalone/src/main/java/hello/controllers/HelloFortuneController.java

@@ -1,28 +0,0 @@
-package hello.controllers;
-
-import hello.dao.FortuneDao;
-import hello.model.Fortune;
-
-import java.util.Collections;
-import java.util.List;
-
-import ninja.Result;
-import ninja.Results;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class HelloFortuneController {
-
-    @Inject
-    FortuneDao fortuneDao;
-
-    public Result index() {
-	List<Fortune> fortunes = fortuneDao.getAll();
-	fortunes.add(new Fortune(0, "Additional fortune added at request time."));
-	Collections.sort(fortunes);
-
-	return Results.html().render("fortunes", fortunes);
-    }
-}

+ 0 - 20
ninja-standalone/src/main/java/hello/views/HelloFortuneController/index.ftl.html

@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>Fortunes</title>
-</head>
-<body>
-	<table>
-		<tr>
-			<th>id</th>
-			<th>message</th>
-		</tr>
-		<#list fortunes as fortune>
-		<tr>
-			<td>${fortune.id}</td>
-			<td>${fortune.message}</td>
-		</tr>
-		</#list>
-	</table>
-</body>
-</html>

+ 0 - 0
ninja-standalone/src/main/resources/logback.xml → ninja-standalone/src/main/java/logback.xml


+ 7 - 6
ninja-standalone/src/main/java/hello/model/Fortune.java → ninja-standalone/src/main/java/model/Fortune.java

@@ -1,4 +1,4 @@
-package hello.model;
+package model;
 
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -7,6 +7,7 @@ import javax.persistence.Id;
 
 @Entity
 public class Fortune implements Comparable<Fortune> {
+
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     public int id;
@@ -17,20 +18,20 @@ public class Fortune implements Comparable<Fortune> {
     }
 
     public Fortune(int id, String message) {
-	this.id = id;
-	this.message = message;
+        this.id = id;
+        this.message = message;
     }
 
     public int getId() {
-	return this.id;
+        return this.id;
     }
 
     public String getMessage() {
-	return this.message;
+        return this.message;
     }
 
     @Override
     public int compareTo(Fortune other) {
-	return message.compareTo(other.message);
+        return message.compareTo(other.message);
     }
 }

+ 2 - 1
ninja-standalone/src/main/java/hello/model/World.java → ninja-standalone/src/main/java/model/World.java

@@ -1,4 +1,4 @@
-package hello.model;
+package model;
 
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -7,6 +7,7 @@ import javax.persistence.Id;
 
 @Entity
 public class World {
+
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     public int id;

+ 20 - 0
ninja-standalone/src/main/java/views/HelloFortuneController/index.ftl.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Fortunes</title>
+    </head>
+    <body>
+        <table>
+            <tr>
+                <th>id</th>
+                <th>message</th>
+            </tr>
+            <#list fortunes as fortune>
+            <tr>
+                <td>${fortune.id}</td>
+                <td>${fortune.message}</td>
+            </tr>
+            </#list>
+        </table>
+    </body>
+</html>

+ 0 - 71
ninja-standalone/src/main/resources/META-INF/persistence.xml

@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<persistence xmlns="http://java.sun.com/xml/ns/persistence"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
-	version="2.0">
-    
-        
-        <!-- Database for tests and local dev mode... -->
-        <persistence-unit name="h2" transaction-type="RESOURCE_LOCAL">
-            <provider>org.hibernate.ejb.HibernatePersistence</provider>
-            <properties>
-                <property name="javax.persistence.provider" value="org.hibernate.ejb.HibernatePersistence" />
-                <property name="hibernate.connection.driver_class" value="org.h2.Driver" />
-                <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
-                <!-- you may want to enable the ddl if you do not use migrations. -->
-                <property name="hibernate.hbm2ddl.auto" value="create" />
-                <property name="hibernate.show_sql" value="false" />
-                <property name="hibernate.format_sql" value="false" />
-
-                <!-- Connection Pooling settings -->
-                <property name="hibernate.connection.provider_class"
-                          value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider" />
-
-                <property name="hibernate.c3p0.max_size" value="100" />
-                <property name="hibernate.c3p0.min_size" value="0" />
-                <property name="hibernate.c3p0.acquire_increment" value="1" />
-                <property name="hibernate.c3p0.idle_test_period" value="300" />
-                <property name="hibernate.c3p0.max_statements" value="0" />
-                <property name="hibernate.c3p0.timeout" value="100" />     
-            </properties>
-        </persistence-unit>
-
-	<!-- Direct mysql -->
-	<persistence-unit name="mysql" transaction-type="RESOURCE_LOCAL">
-		<provider>org.hibernate.ejb.HibernatePersistence</provider>
-
-		<properties>
-			<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
-			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
-
-			<property name="hibernate.show_sql" value="false" />
-			<property name="hibernate.format_sql" value="false" />
-
-			<!-- Connection Pooling settings -->
-			<property name="hibernate.connection.provider_class"
-				value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider" />
-
-			<property name="hibernate.c3p0.max_size" value="100" />
-			<property name="hibernate.c3p0.min_size" value="0" />
-			<property name="hibernate.c3p0.acquire_increment" value="1" />
-			<property name="hibernate.c3p0.idle_test_period" value="300" />
-			<property name="hibernate.c3p0.max_statements" value="0" />
-			<property name="hibernate.c3p0.timeout" value="100" />
-		</properties>
-	</persistence-unit>
-
-	<!-- Resin datasource -->
-	<persistence-unit name="resin" transaction-type="RESOURCE_LOCAL">
-		<provider>org.hibernate.ejb.HibernatePersistence</provider>
-		<jta-data-source>java:comp/env/jdbc/hello_world</jta-data-source>
-
-		<properties>
-			<property name="hibernate.connection.datasource" value="java:comp/env/jdbc/hello_world" />
-			<property name="hibernate.transaction.factory_class"
-				value="org.hibernate.transaction.JTATransactionFactory" />
-			<property name="hibernate.transaction.manager_lookup_class"
-				value="org.hibernate.transaction.ResinTransactionManagerLookup" />
-		</properties>
-	</persistence-unit>
-</persistence>

+ 12 - 20
ninja-standalone/src/test/java/hello/controllers/HelloDbControllerTest.java → ninja-standalone/src/test/java/controllers/HelloDbControllerTest.java

@@ -1,29 +1,21 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
+package controllers;
 
-package hello.controllers;
-
-import hello.model.World;
+import dao.SetupDao;
+import model.World;
 import ninja.NinjaDocTester;
 import org.doctester.testbrowser.Request;
 import org.doctester.testbrowser.Response;
 import org.hamcrest.CoreMatchers;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
 import org.junit.Test;
 import static org.junit.Assert.*;
 import org.junit.Before;
-import org.junit.BeforeClass;
 
-/**
- *
- * @author ra
- */
 public class HelloDbControllerTest extends NinjaDocTester {
             
-    String SINGLE_GET = "/db";
-    String QUERIES = "/queries";
+    String URL_DB = "/db";
+    String URL_QUERIES = "/queries";
     String URL_UPDATE = "/update";
     
     @Before
@@ -37,11 +29,11 @@ public class HelloDbControllerTest extends NinjaDocTester {
         Response response = makeRequest(
                 Request
                         .GET()
-                        .url(testServerUrl().path(SINGLE_GET))
+                        .url(testServerUrl().path(URL_DB))
                         .contentTypeApplicationJson());
         
         // Just make sure that we get back a World Json.
-        assertThat(response.payloadAs(World.class), CoreMatchers.notNullValue());      
+        assertThat(response.payloadAs(World.class), notNullValue());      
                 
     }
     
@@ -62,12 +54,12 @@ public class HelloDbControllerTest extends NinjaDocTester {
                 .GET()
                 .url(
                     testServerUrl()
-                    .path(QUERIES)
+                    .path(URL_QUERIES)
                     .addQueryParameter("queries", numberOfQueries + ""))
                 .contentTypeApplicationJson());
         
         // Just make sure that we get back an array
-        assertThat(response.payloadAs(World[].class).length, CoreMatchers.is(numberOfQueries)); 
+        assertThat(response.payloadAs(World[].class).length, is(numberOfQueries)); 
     }
     
     @Test
@@ -91,7 +83,7 @@ public class HelloDbControllerTest extends NinjaDocTester {
                     .addQueryParameter("queries", numberOfQueries + ""))
                 .contentTypeApplicationJson());
         
-        assertThat(response.payloadAs(World[].class).length, CoreMatchers.is(numberOfQueries)); 
+        assertThat(response.payloadAs(World[].class).length, is(numberOfQueries)); 
         
     }
 

+ 5 - 14
ninja-standalone/src/test/java/hello/controllers/HelloFortuneControllerTest.java → ninja-standalone/src/test/java/controllers/HelloFortuneControllerTest.java

@@ -1,25 +1,16 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
+package controllers;
 
-package hello.controllers;
-
-import hello.model.Fortune;
+import dao.SetupDao;
+import model.Fortune;
 import ninja.NinjaDocTester;
 import org.doctester.testbrowser.Request;
 import org.doctester.testbrowser.Response;
 import org.junit.Test;
 import static org.junit.Assert.*;
 
-/**
- *
- * @author ra
- */
 public class HelloFortuneControllerTest extends NinjaDocTester {
 
-    String URL = "/fortunes";
+    String URL_FORTUNES = "/fortunes";
     
     @Test
     public void testSomeMethod() {
@@ -27,7 +18,7 @@ public class HelloFortuneControllerTest extends NinjaDocTester {
         getInjector().getInstance(SetupDao.class).generateFortunesForTest();
 
         Response response 
-                = makeRequest(Request.GET().url(testServerUrl().path(URL)));
+                = makeRequest(Request.GET().url(testServerUrl().path(URL_FORTUNES)));
         
         System.out.println(" " + response.payload);
         

+ 6 - 14
ninja-standalone/src/test/java/hello/controllers/HelloJsonControllerTest.java → ninja-standalone/src/test/java/controllers/HelloJsonControllerTest.java

@@ -1,25 +1,17 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package hello.controllers;
+package controllers;
 
 import ninja.NinjaDocTester;
 import org.doctester.testbrowser.Request;
 import org.doctester.testbrowser.Response;
 import org.hamcrest.CoreMatchers;
+import static org.hamcrest.CoreMatchers.is;
 import org.junit.Test;
 import static org.junit.Assert.*;
 
-/**
- *
- * @author ra
- */
+
 public class HelloJsonControllerTest extends NinjaDocTester {
     
-    String URL = "/json";
+    String URL_JSON = "/json";
 
     @Test
     public void testHelloJsonController() {
@@ -27,12 +19,12 @@ public class HelloJsonControllerTest extends NinjaDocTester {
         Response response = makeRequest(
             Request
                 .GET()
-                .url(testServerUrl().path(URL))
+                .url(testServerUrl().path(URL_JSON))
                 .contentTypeApplicationJson());
         
         assertThat(
             response.payloadAs(Message.class).message, 
-            CoreMatchers.is("Hello, world"));
+            is("Hello, world"));
         
     }
     

+ 5 - 14
ninja-standalone/src/test/java/hello/controllers/HelloPlaintextControllerTest.java → ninja-standalone/src/test/java/controllers/HelloPlaintextControllerTest.java

@@ -1,36 +1,27 @@
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package hello.controllers;
+package controllers;
 
 import ninja.NinjaDocTester;
 import org.doctester.testbrowser.Request;
 import org.doctester.testbrowser.Response;
 import org.hamcrest.CoreMatchers;
+import static org.hamcrest.CoreMatchers.is;
 import org.junit.Test;
 import static org.junit.Assert.*;
 
-/**
- *
- * @author ra
- */
 public class HelloPlaintextControllerTest extends NinjaDocTester {
     
-    String URL = "/plaintext";
+    String URL_PLAINTEXT = "/plaintext";
     
     @Test
     public void helloPlaintextControllerTest() {
         
         Response response = makeRequest(
-            Request.GET().url(testServerUrl().path(URL)));
+            Request.GET().url(testServerUrl().path(URL_PLAINTEXT)));
         
         assertThat(response.payload, CoreMatchers.is("Hello, world!"));
         assertThat(
             response.headers.get("Content-Type"), 
-            CoreMatchers.is("text/plain; charset=UTF-8"));
+            is("text/plain; charset=UTF-8"));
         
    
     }