Browse Source

Java/gemini update and caching test (#2864)

* Java/gemini Cached Query test

* Attempting to update Gemini

* Testing

* More testing

* Fix CachedWorld import

* Visitory Factory was missing

* cached_query url correction

* Removed a bunch of jars

* Fixed postgresql jar missing
Nate 8 years ago
parent
commit
4d2bb9530b
29 changed files with 234 additions and 155 deletions
  1. 38 5
      frameworks/Java/gemini/.classpath
  2. 26 0
      frameworks/Java/gemini/Docroot/WEB-INF/GeminiHello-DJIBOUTI.conf
  3. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/activation.jar
  4. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/gemini-1.4.jar
  5. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/gemini-2.18.0-SNAPSHOT.jar
  6. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/gemini-resin-2.18.0-SNAPSHOT.jar
  7. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/guava-16.0.1.jar
  8. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/jsr305-2.0.0.jar
  9. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/kryonet-1.04-all.jar
  10. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/mail.jar
  11. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/mustache-compiler-0.8.13.jar
  12. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/mysql-connector-java-5.1.23-bin.jar
  13. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/postgresql-9.4.1208.jar
  14. BIN
      frameworks/Java/gemini/Docroot/WEB-INF/lib/trove4j-3.0.3.jar
  15. 1 1
      frameworks/Java/gemini/Docroot/WEB-INF/resin.xml
  16. 1 0
      frameworks/Java/gemini/GeminiHello.launch
  17. 7 6
      frameworks/Java/gemini/Source/hello/GhApplication.java
  18. 1 1
      frameworks/Java/gemini/Source/hello/GhServlet.java
  19. 46 0
      frameworks/Java/gemini/Source/hello/home/entity/CachedWorld.java
  20. 1 1
      frameworks/Java/gemini/Source/hello/home/entity/Fortune.java
  21. 3 3
      frameworks/Java/gemini/Source/hello/home/entity/GhDataEntity.java
  22. 1 1
      frameworks/Java/gemini/Source/hello/home/entity/World.java
  23. 32 5
      frameworks/Java/gemini/Source/hello/home/handler/HelloHandler.java
  24. 3 1
      frameworks/Java/gemini/benchmark_config.json
  25. 34 131
      frameworks/Java/gemini/build.xml
  26. 24 0
      frameworks/Java/gemini/ivy.xml
  27. 14 0
      frameworks/Java/gemini/ivysettings.xml
  28. 1 0
      frameworks/Java/gemini/start.sh
  29. 1 0
      frameworks/Java/gemini/start_postgresql.sh

+ 38 - 5
frameworks/Java/gemini/.classpath

@@ -1,15 +1,48 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.core.runtimeTarget/resin40"/>
 	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/activation.jar"/>
 	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/activation.jar"/>
 	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/mail.jar"/>
 	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/mail.jar"/>
-	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/kryonet-1.04-all.jar"/>
 	<classpathentry kind="src" path="Source"/>
 	<classpathentry kind="src" path="Source"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
-	<classpathentry kind="var" path="Resin4Jee"/>
 	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/mysql-connector-java-5.1.23-bin.jar"/>
 	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/mysql-connector-java-5.1.23-bin.jar"/>
-	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/guava-14.0.1.jar"/>
 	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/trove4j-3.0.3.jar"/>
 	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/trove4j-3.0.3.jar"/>
-	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/gemini-1.4.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Resin"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/guava-16.0.1.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/jsr305-2.0.0.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/mustache-compiler-0.8.13.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/postgresql-9.4.1208.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/gemini-2.18.0-SNAPSHOT.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/gemini-resin-2.18.0-SNAPSHOT.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/reflectasm.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/reflections.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/java-image-scaling.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/kryo.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/kryonet-all.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/asm.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/compiler.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/dbdeploy-ant.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/filters.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/freemarker.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/gemini-admin.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/gemini-form.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/gemini-resin.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/gemini.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/guava.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/im4java.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/jackson-annotations.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/jackson-core.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/jackson-databind.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/javaee-api.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/javaee-web-api.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/javassist.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/javax.jms-api.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/javax.mail-api.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/javax.mail.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/jbcrypt.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/jjwt.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/minlog.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/mysql-connector-java.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/objenesis.jar"/>
+	<classpathentry kind="lib" path="Docroot/WEB-INF/lib/trove4j.jar"/>
 	<classpathentry kind="output" path="Docroot/WEB-INF/classes"/>
 	<classpathentry kind="output" path="Docroot/WEB-INF/classes"/>
 </classpath>
 </classpath>

+ 26 - 0
frameworks/Java/gemini/Docroot/WEB-INF/GeminiHello-DJIBOUTI.conf

@@ -0,0 +1,26 @@
+# -----------------------------------------------------------------------
+# GEMINIHELLO configuration file
+#
+# EXAMPLE MACHINE-SPECIFIC CONFIGURATION
+#
+# The configuration attributes specified in this file are specific to a
+# single development-environment machine.
+# -----------------------------------------------------------------------
+
+# Extend the development configuration, which in turn extends the
+# baseline configuration.
+Extends = GeminiHello-Prod.conf
+
+DeploymentDescription = Production/${Servlet.MachineName}
+
+# Now set any attributes that are specific to this machine.
+
+db.Driver.Class = com.mysql.jdbc.Driver
+db.Driver.UrlPrefix = jdbc:mysql://
+db.ConnectString = 127.0.0.1:3306/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useServerPrepStmts=true&enableQueryTimeouts=false&useUnbufferedIO=false&useReadAheadInput=false&maintainTimeStats=false&cacheRSMetadata=true
+
+Log.Console.On = yes
+Log.Console.LogDebugThreshold = 50
+
+db.Driver.Pooling = 30
+db.Driver.MaxPooling = 30

BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/activation.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/gemini-1.4.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/gemini-2.18.0-SNAPSHOT.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/gemini-resin-2.18.0-SNAPSHOT.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/guava-16.0.1.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/jsr305-2.0.0.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/kryonet-1.04-all.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/mail.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/mustache-compiler-0.8.13.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/mysql-connector-java-5.1.23-bin.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/postgresql-9.4.1208.jar


BIN
frameworks/Java/gemini/Docroot/WEB-INF/lib/trove4j-3.0.3.jar


+ 1 - 1
frameworks/Java/gemini/Docroot/WEB-INF/resin.xml

@@ -14,7 +14,7 @@
     </server>
     </server>
 
 
     <host>
     <host>
-      <web-app id="/" root-directory="/home/knewman/FrameworkBenchmarks/frameworks/Java/gemini/Docroot" />
+      <web-app id="/" root-directory="C:/Development/FrameworkBenchmarks/frameworks/Java/gemini/Docroot" />
     </host>
     </host>
 
 
   </cluster>
   </cluster>

+ 1 - 0
frameworks/Java/gemini/GeminiHello.launch

@@ -6,6 +6,7 @@
 <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
 <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
 <listEntry value="4"/>
 <listEntry value="4"/>
 </listAttribute>
 </listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_60"/>
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.caucho.server.resin.Resin"/>
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.caucho.server.resin.Resin"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-conf &quot;Docroot/WEB-INF/resin.xml&quot;"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-conf &quot;Docroot/WEB-INF/resin.xml&quot;"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="GeminiHello"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="GeminiHello"/>

+ 7 - 6
frameworks/Java/gemini/Source/hello/GhApplication.java

@@ -1,14 +1,14 @@
 package hello;
 package hello;
 
 
-import hello.home.entity.*;
-import hello.home.handler.*;
-
 import com.techempower.*;
 import com.techempower.*;
 import com.techempower.gemini.*;
 import com.techempower.gemini.*;
 import com.techempower.gemini.exceptionhandler.*;
 import com.techempower.gemini.exceptionhandler.*;
 import com.techempower.gemini.path.*;
 import com.techempower.gemini.path.*;
-import com.techempower.gemini.pyxis.*;
 import com.techempower.js.*;
 import com.techempower.js.*;
+import com.techempower.js.legacy.*;
+
+import hello.home.entity.*;
+import hello.home.handler.*;
 
 
 /**
 /**
  * GeminiHello Application.  As a subclass of GeminiApplication, this
  * GeminiHello Application.  As a subclass of GeminiApplication, this
@@ -21,7 +21,7 @@ import com.techempower.js.*;
  * @author mhixson
  * @author mhixson
  */
  */
 public class GhApplication
 public class GhApplication
-     extends GeminiApplication
+     extends ResinGeminiApplication
 {
 {
   //
   //
   // Static variables.
   // Static variables.
@@ -62,8 +62,9 @@ public class GhApplication
   @Override
   @Override
   protected JavaScriptWriter constructJavaScriptWriter()
   protected JavaScriptWriter constructJavaScriptWriter()
   {
   {
-    return JavaScriptWriter.custom()
+    return LegacyJavaScriptWriter.custom()
         .addVisitorFactory(World.class, World.VISITOR_FACTORY)
         .addVisitorFactory(World.class, World.VISITOR_FACTORY)
+        .addVisitorFactory(CachedWorld.class, CachedWorld.VISITOR_FACTORY)
         .build();
         .build();
   }
   }
 
 

+ 1 - 1
frameworks/Java/gemini/Source/hello/GhServlet.java

@@ -2,7 +2,7 @@ package hello;
 
 
 import javax.servlet.annotation.*;
 import javax.servlet.annotation.*;
 
 
-import com.techempower.gemini.*;
+import com.techempower.gemini.transport.*;
 
 
 /**
 /**
  * Main Servlet to be used by the GeminiHello application.  Upon
  * Main Servlet to be used by the GeminiHello application.  Upon

+ 46 - 0
frameworks/Java/gemini/Source/hello/home/entity/CachedWorld.java

@@ -0,0 +1,46 @@
+package hello.home.entity;
+
+import com.techempower.data.annotation.*;
+import com.techempower.js.legacy.*;
+
+/**
+ * Simple World entity.
+ */
+@CachedEntity(table="world")
+public class   CachedWorld
+  extends    GhDataEntity
+{
+
+  private int randomNumber;
+
+  /**
+   * Set the random number.
+   */
+  public void setRandomNumber(int randomNumber)
+  {
+    this.randomNumber = randomNumber;
+  }
+
+  /**
+   * Get the random number.
+   */
+  public int getRandomNumber()
+  {
+    return this.randomNumber;
+  }
+
+  /**
+   * A visitor factory used to map this class to JSON.
+   */
+  public static final VisitorFactory<CachedWorld> VISITOR_FACTORY = new VisitorFactory<CachedWorld>()
+  {
+    @Override
+    public Visitor visitor(CachedWorld world)
+    {
+      return Visitors.map(
+        "id", world.getId(),
+        "randomNumber", world.getRandomNumber());
+    }
+  };
+
+}

+ 1 - 1
frameworks/Java/gemini/Source/hello/home/entity/Fortune.java

@@ -1,7 +1,7 @@
 package hello.home.entity;
 package hello.home.entity;
 
 
 import com.techempower.data.annotation.*;
 import com.techempower.data.annotation.*;
-import com.techempower.js.*;
+import com.techempower.js.legacy.*;
 
 
 /**
 /**
  * A fortune entity.
  * A fortune entity.

+ 3 - 3
frameworks/Java/gemini/Source/hello/home/entity/GhDataEntity.java

@@ -18,16 +18,16 @@ public abstract class GhDataEntity
   /**
   /**
    * The identity for this object.
    * The identity for this object.
    */
    */
-  private int id;
+  private long id;
 
 
   @Override
   @Override
-  public int getId()
+  public long getId()
   {
   {
     return this.id;
     return this.id;
   }
   }
 
 
   @Override
   @Override
-  public void setId(int newIdentity)
+  public void setId(long newIdentity)
   {
   {
     this.id = newIdentity;
     this.id = newIdentity;
   }
   }

+ 1 - 1
frameworks/Java/gemini/Source/hello/home/entity/World.java

@@ -1,7 +1,7 @@
 package hello.home.entity;
 package hello.home.entity;
 
 
 import com.techempower.data.annotation.*;
 import com.techempower.data.annotation.*;
-import com.techempower.js.*;
+import com.techempower.js.legacy.*;
 
 
 /**
 /**
  * Simple World entity.
  * Simple World entity.

+ 32 - 5
frameworks/Java/gemini/Source/hello/home/handler/HelloHandler.java

@@ -1,7 +1,5 @@
 package hello.home.handler;
 package hello.home.handler;
 
 
-import hello.home.entity.*;
-
 import java.util.*;
 import java.util.*;
 import java.util.concurrent.*;
 import java.util.concurrent.*;
 
 
@@ -10,11 +8,13 @@ import com.techempower.gemini.*;
 import com.techempower.gemini.path.*;
 import com.techempower.gemini.path.*;
 import com.techempower.gemini.path.annotation.*;
 import com.techempower.gemini.path.annotation.*;
 
 
+import hello.home.entity.*;
+
 /**
 /**
  * Handles the various framework benchmark request types.
  * Handles the various framework benchmark request types.
  */
  */
 public class HelloHandler
 public class HelloHandler
-    extends  MethodPathHandler<Context>
+    extends  MethodSegmentHandler<Context>
 {
 {
 
 
   private static final int DB_ROWS = 10000;
   private static final int DB_ROWS = 10000;
@@ -30,14 +30,22 @@ public class HelloHandler
     this.store = app.getStore();
     this.store = app.getStore();
   }
   }
   
   
+  @PathDefault
+  public boolean test()
+  {
+    return false;
+  }
+  
   /**
   /**
    * Return "hello world" as a JSON-encoded message.
    * Return "hello world" as a JSON-encoded message.
    */
    */
   @PathSegment("json")
   @PathSegment("json")
-  @PathDefault
   public boolean helloworld()
   public boolean helloworld()
   {
   {
-    return message("Hello, World!");
+    final Map<String,String> resp = new HashMap<>(1);
+    resp.put(GeminiConstants.GEMINI_MESSAGE, "Hello, World!");
+    
+    return json(resp);
   }
   }
 
 
   /**
   /**
@@ -68,6 +76,25 @@ public class HelloHandler
     
     
     return json(worlds);
     return json(worlds);
   }
   }
+
+  /**
+   * Return a list of World objects as JSON, selected randomly from the World
+   * table.  Assume the table has 10,000 rows.
+   */
+  @PathSegment("cached_query")
+  public boolean multipleCachedQueries()
+  {
+    final Random random = ThreadLocalRandom.current();
+    final int queries = query().getInt("queries", 1, 1, 500);
+    final CachedWorld[] worlds = new CachedWorld[queries];
+
+    for (int i = 0; i < queries; i++)
+    {
+      worlds[i] = store.get(CachedWorld.class, random.nextInt(DB_ROWS) + 1);
+    }
+
+    return json(worlds);
+  }
   
   
   /**
   /**
    * Fetch the full list of Fortunes from the database, sort them by the
    * Fetch the full list of Fortunes from the database, sort them by the

+ 3 - 1
frameworks/Java/gemini/benchmark_config.json

@@ -3,7 +3,7 @@
   "tests": [{
   "tests": [{
     "default": {
     "default": {
       "setup_file": "start",
       "setup_file": "start",
-      "json_url": "/",
+      "json_url": "/json",
       "plaintext_url": "/plaintext",
       "plaintext_url": "/plaintext",
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
@@ -25,6 +25,7 @@
       "setup_file": "start",
       "setup_file": "start",
       "db_url": "/db",
       "db_url": "/db",
       "query_url": "/query?queries=",
       "query_url": "/query?queries=",
+      "cached_query_url": "/cached_query?queries=",
       "fortune_url": "/fortunes",
       "fortune_url": "/fortunes",
       "update_url": "/update?queries=",
       "update_url": "/update?queries=",
       "port": 8080,
       "port": 8080,
@@ -47,6 +48,7 @@
       "setup_file": "start_postgresql",
       "setup_file": "start_postgresql",
       "db_url": "/db",
       "db_url": "/db",
       "query_url": "/query?queries=",
       "query_url": "/query?queries=",
+      "cached_query_url": "/cached_query?queries=",
       "fortune_url": "/fortunes",
       "fortune_url": "/fortunes",
       "update_url": "/update?queries=",
       "update_url": "/update?queries=",
       "port": 8080,
       "port": 8080,

+ 34 - 131
frameworks/Java/gemini/build.xml

@@ -9,7 +9,7 @@
        |~~~ (The current source code of GeminiHello and Gemini.)
        |~~~ (The current source code of GeminiHello and Gemini.)
   
   
 -->
 -->
-<project default="build" name="geminihello">
+<project default="build" name="geminihello" xmlns:ivy="antlib:org.apache.ivy.ant" >
 
 
   <target name="compile">
   <target name="compile">
     
     
@@ -33,137 +33,40 @@
     </javac>
     </javac>
     
     
   </target>
   </target>
+
+  <property name="ivy.install.version" value="2.4.0" />
+  <condition property="ivy.home" value="${env.IVY_HOME}">
+    <isset property="env.IVY_HOME" />
+  </condition>
+  <property name="ivy.home" value="${user.home}/.ant" />
+  <property name="ivy.jar.dir" value="${ivy.home}/lib" />
+  <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
+
+  <target name="download-ivy" unless="offline">
+
+      <mkdir dir="${ivy.jar.dir}"/>
+      <!-- download Ivy from web site so that it can be used even without any special installation -->
+      <get src="https://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" 
+            dest="${ivy.jar.file}" usetimestamp="true"/>
+  </target>
+
+  <target name="init-ivy" depends="download-ivy">
+    <!-- try to load ivy here from ivy home, in case the user has not already dropped
+            it into ant's lib dir (note that the latter copy will always take precedence).
+            We will not fail as long as local lib dir exists (it may be empty) and
+            ivy is in at least one of ant's lib dir or the local lib dir. -->
+      <path id="ivy.lib.path">
+          <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
+
+      </path>
+      <taskdef resource="org/apache/ivy/ant/antlib.xml"
+                uri="antlib:org.apache.ivy.ant" classpathref="ivy.lib.path"/>
+  </target>
   
   
-  <target name="build">
-    
-    <!-- Import environment variables. -->
-    <property environment="Environment" />
-    
-    <!-- Declare other variables which can be overridden in a personalized
-         build.properties file. -->
-    <property name="Resin" value="${Environment.RESIN_HOME}" />
-    <property name="GeminiHello" value="." />
-  
-    <!-- Define some timestamps.  These are used to name the zip archive produced
-         by this script, and to assign a version string for static assets. -->
-    <tstamp>
-      <format property="TIMESTAMP_LONG" pattern="yyyy-MM-dd-hh-mm-ss" locale="en" />
-      <format property="TIMESTAMP_SHORT" pattern="yyyyMMddhhmm" locale="en" />
-    </tstamp>
-  
-    <!-- Set the version for this build in GeminiHello-Version.conf.  This will
-         later be copied into the .war file, overriding the placeholder
-         GeminiHello-Version.conf file there for development. -->
-    <mkdir dir="temp/version" />
-    <echo message="StaticsVersion = ${TIMESTAMP_SHORT}" file="temp/version/GeminiHello-Version.conf" append="false" />
-    
-    <!-- Build geminihello.jar. -->
-    <mkdir dir="temp/work" />
-    <javac srcdir="${GeminiHello}/Source" destdir="temp/work" includes="**/*">
-      <classpath>
-        <pathelement location="${Resin}/lib/javaee-16.jar" />
-        <pathelement location="${Resin}/lib/resin.jar" />
-        <fileset dir="${GeminiHello}/Docroot/WEB-INF/lib">
-          <include name="**/*.jar" />
-        </fileset>
-     </classpath>
-    </javac>
-    <jar jarfile="temp/geminihello" basedir="temp/work" />
-    <delete dir="temp/work" />
-    
-    <!-- Prepare for minification. -->
-    <mkdir dir="temp/min" />
-    <copy todir="temp/min/css">
-      <fileset dir="${GeminiHello}/Docroot/css" />
-    </copy>
-    <copy todir="temp/min/js">
-      <fileset dir="${GeminiHello}/Docroot/js" />
-    </copy>
-    <copy todir="temp/min/jsp">
-      <fileset dir="${GeminiHello}/Docroot/WEB-INF/jsp" />
-    </copy>
-    
-    <!-- Minify CSS files using YUI Compressor. -->
-    <apply executable="java" parallel="false" force="true" dest="temp/min/css/">
-      <fileset dir="${GeminiHello}/Docroot/css" includes="**/*.css" />
-      <arg value="-jar" />
-      <arg value="${GeminiHello}/Docroot/WEB-INF/lib/yuicompressor-2.4.4.jar" />
-      <arg value="--type" />
-      <arg value="css" />
-      <srcfile />
-      <arg value="-o" />
-      <mapper type="identity" />
-      <targetfile />
-    </apply>
-    
-    <!-- Minify JS files using Closure Compiler. -->
-    <apply executable="java" parallel="false" force="true" dest="temp/min/js/">
-      <fileset dir="${GeminiHello}/Docroot/js" includes="**/*.js" />
-      <arg value="-jar" />
-      <arg value="${GeminiHello}/Docroot/WEB-INF/lib/closure-compiler.jar" />
-      <arg value="--warning_level=QUIET" />
-      <arg value="--js" />
-      <srcfile />
-      <arg value="--js_output_file" />
-      <mapper type="identity" />
-      <targetfile />
-    </apply>
-    
-    <!-- Minify JSP files using HtmlCompressor. -->
-    <!-- If any JSPs are used to render something other than HTML, then 
-         the <fileset> tag below should be modified to exclude them. -->
-    <apply executable="java" parallel="false" force="true" dest="temp/min/jsp/">
-      <fileset dir="${GeminiHello}/Docroot/WEB-INF/jsp" includes="**/*.jsp" />
-      <arg value="-jar" />
-      <arg value="${GeminiHello}/Docroot/WEB-INF/lib/htmlcompressor-1.1.jar" />
-      <arg value="--preserve-server-script" />
-      <arg value="--type" />
-      <arg value="html" />
-      <srcfile />
-      <arg value="-o" />
-      <mapper type="identity" />
-      <targetfile />
-    </apply>
-    
-    <!-- Build GeminiHello.war. -->
-    <war destfile="temp/GeminiHello.war" webxml="${GeminiHello}/Docroot/WEB-INF/web.xml">
-      <zipfileset dir="${GeminiHello}/Docroot" prefix="">
-        <exclude name="WEB-INF/**/*" />
-        <exclude name="js/**/*" />
-        <exclude name="css/**/*" />
-      </zipfileset>
-      <zipfileset dir="${GeminiHello}/Docroot/WEB-INF" prefix="WEB-INF">
-        <include name="*.conf" />
-        <include name="*.resources" />
-        <include name="*.tld" />
-        <include name="*.txt" />
-        <include name="*.xml" />
-        <include name="emails/**" />
-        <include name="jsp/**" />
-        <include name="lib/**" />
-        <exclude name="resin.xml" />
-        <exclude name="GeminiHello-Version.conf" />
-      </zipfileset>
-      <zipfileset dir="temp" prefix="WEB-INF/lib">
-        <include name="*.jar" />
-      </zipfileset>
-      <zipfileset dir="temp/min/css" prefix="css" />
-      <zipfileset dir="temp/min/js" prefix="js" />
-      <zipfileset dir="temp/min/jsp" prefix="WEB-INF/jsp" />
-      <zipfileset dir="temp/version" prefix="WEB-INF" />
-    </war>
-    
-    <!-- Zip it up. -->
-    <zip destfile="${GeminiHello}/GeminiHello-${TIMESTAMP_LONG}.zip">
-      <zipfileset dir="temp">
-        <include name="*.war" />
-      </zipfileset>
-      <zipfileset dir="${GeminiHello}/Source" prefix="Source" />
-    </zip>
-    
-    <!-- Delete the temporary directory. -->
-    <delete dir="temp" />
-    
+  <target name="resolve" depends="init-ivy" description="--> retrieve dependencies with ivy">
+    <ivy:settings file="./ivysettings.xml"/>
+    <ivy:resolve conf="default" />
+    <ivy:retrieve pattern="Docroot/WEB-INF/lib/[artifact](-[classifier]).[ext]" />
   </target>
   </target>
   
   
 </project>
 </project>

+ 24 - 0
frameworks/Java/gemini/ivy.xml

@@ -0,0 +1,24 @@
+<ivy-module version="2.4">
+    <info organisation="com.techempower" module="App" />
+    
+    <dependencies>
+        <dependency org="javax" name="javaee-api" rev="6.0" />
+        <dependency org="javax" name="javaee-web-api" rev="6.0" />
+        <dependency org="javax.activation" name="activation" rev="1.1.1" />
+        <dependency org="javax.mail" name="javax.mail-api" rev="1.5.6" />
+        <dependency org="com.google.guava" name="guava" rev="18.0" />
+        <dependency org="net.sf.trove4j" name="trove4j" rev="3.0.3" />
+        <dependency org="com.github.spullara.mustache.java" name="compiler" rev="0.8.17" />
+        <dependency org="org.mindrot" name="jbcrypt" rev="0.3m" />
+        <dependency org="postgresql" name="postgresql" rev="9.4.1208-jdbc42-atlassian-hosted" />
+        <dependency org="mysql" name="mysql-connector-java" rev="5.1.34" />
+        <dependency org="com.mortennobel" name="java-image-scaling" rev="0.8.5" />
+        <dependency org="org.im4java" name="im4java" rev="1.4.0" />
+        <dependency org="com.fasterxml.jackson.core" name="jackson-core" rev="2.7.3" />
+        <dependency org="com.fasterxml.jackson.core" name="jackson-annotations" rev="2.7.3" />
+        <dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.7.3" />
+        <dependency org="kryonet" name="kryonet-all" rev="2.21" />
+        <dependency org="org.reflections" name="reflections" rev="0.9.10" />
+        <dependency org="javassist" name="javassist" rev="3.12.1.GA" />
+    </dependencies>
+</ivy-module>

+ 14 - 0
frameworks/Java/gemini/ivysettings.xml

@@ -0,0 +1,14 @@
+<ivysettings>
+    <settings defaultResolver='nexus'/>
+    <resolvers>
+        <chain name="nexus">
+            <ibiblio name='clojars' 
+                     m2compatible='true' 
+                     root='http://clojars.org/repo/' />
+            <ibiblio name='atlassian 3rd-party'
+                     m2compatible='true'
+                     root='https://maven.atlassian.com/3rdparty/' />
+            <ibiblio name='central' m2compatible='true'/>
+        </chain>
+    </resolvers>
+</ivysettings>

+ 1 - 0
frameworks/Java/gemini/start.sh

@@ -7,5 +7,6 @@ sed -i 's|root-directory=".*/FrameworkBenchmarks/frameworks/Java/gemini|root-dir
 sed -i 's|db.Driver.Class = .*|db.Driver.Class = com.mysql.jdbc.Driver|g' Docroot/WEB-INF/GeminiHello.conf
 sed -i 's|db.Driver.Class = .*|db.Driver.Class = com.mysql.jdbc.Driver|g' Docroot/WEB-INF/GeminiHello.conf
 sed -i 's|db.Driver.UrlPrefix = .*|db.Driver.UrlPrefix = jdbc:mysql://|g' Docroot/WEB-INF/GeminiHello.conf
 sed -i 's|db.Driver.UrlPrefix = .*|db.Driver.UrlPrefix = jdbc:mysql://|g' Docroot/WEB-INF/GeminiHello.conf
 mkdir -p Docroot/WEB-INF/classes
 mkdir -p Docroot/WEB-INF/classes
+ant resolve
 ant compile
 ant compile
 resinctl -conf $TROOT/Docroot/WEB-INF/resin.xml start
 resinctl -conf $TROOT/Docroot/WEB-INF/resin.xml start

+ 1 - 0
frameworks/Java/gemini/start_postgresql.sh

@@ -7,5 +7,6 @@ sed -i 's|root-directory=".*/FrameworkBenchmarks/frameworks/Java/gemini|root-dir
 sed -i 's|db.Driver.Class = .*|db.Driver.Class = org.postgresql.Driver|g' Docroot/WEB-INF/GeminiHello.conf
 sed -i 's|db.Driver.Class = .*|db.Driver.Class = org.postgresql.Driver|g' Docroot/WEB-INF/GeminiHello.conf
 sed -i 's|db.Driver.UrlPrefix = .*|db.Driver.UrlPrefix = jdbc:postgresql://|g' Docroot/WEB-INF/GeminiHello.conf
 sed -i 's|db.Driver.UrlPrefix = .*|db.Driver.UrlPrefix = jdbc:postgresql://|g' Docroot/WEB-INF/GeminiHello.conf
 mkdir -p Docroot/WEB-INF/classes
 mkdir -p Docroot/WEB-INF/classes
+ant resolve
 ant compile
 ant compile
 resinctl -conf $TROOT/Docroot/WEB-INF/resin.xml start
 resinctl -conf $TROOT/Docroot/WEB-INF/resin.xml start