Browse Source

Update Fortune Template (#6807)

* Update Fortune Template
Redkale 3 years ago
parent
commit
d32c6d7fb5

+ 3 - 2
frameworks/Java/redkale/benchmark_config.json

@@ -25,8 +25,8 @@
                 "plaintext_url": "/plaintext",
                 "json_url": "/json",
                 "db_url": "/db",
-                "query_url2": "/queries?q=", 
-                "fortune_url2": "/fortunes",
+                "query_url": "/queries?q=", 
+                "fortune_url": "/fortunes",
                 "update_url2": "/updates?q=",
                 "cached_query_url": "/cached-worlds?q=",
                 "port": 8080,
@@ -50,6 +50,7 @@
                 "json_url": "/json",
                 "db_url": "/db",
                 "query_url": "/queries?q=", 
+                "fortune_url": "/fortunes",
                 "update_url2": "/updates?q=",
                 "cached_query_url": "/cached-worlds?q=",
                 "port": 8080,

+ 1 - 0
frameworks/Java/redkale/conf/application.xml

@@ -17,6 +17,7 @@
             <content-type plain="text/plain" json="application/json"/>  
             <date period="1000"/>
         </response>
+        <render value="org.redkalex.benchmark.FortuneRender"/>
         <services autoload="true"/>        
         <rest autoload="true"/>
         <servlets autoload="true"/>

+ 3 - 2
frameworks/Java/redkale/config.toml

@@ -18,8 +18,8 @@ versus = "Redkale"
 urls.plaintext = "/plaintext"
 urls.json = "/json"
 urls.db = "/db"
-urls.fortune2 = "/fortunes"
-urls.query2 = "/queries?q="
+urls.fortune = "/fortunes"
+urls.query = "/queries?q="
 urls.update2 = "/updates?q="
 urls.cached_query = "/cached-worlds?q="
 approach = "Realistic"
@@ -36,6 +36,7 @@ versus = "Redkale"
 urls.plaintext = "/plaintext"
 urls.json = "/json"
 urls.db = "/db"
+urls.fortune = "/fortunes"
 urls.query = "/queries?q="
 urls.update2 = "/updates?q="
 urls.cached_query = "/cached-worlds?q="

+ 0 - 29
frameworks/Java/redkale/pom-mongodb.xml

@@ -27,12 +27,6 @@
             <version>2.5.0-SNAPSHOT</version>
         </dependency>
         
-        <dependency> 
-            <groupId>com.fizzed</groupId>
-            <artifactId>rocker-compiler</artifactId>
-            <version>1.3.0</version>
-        </dependency> 
-         
         <dependency>
             <groupId>org.mongodb</groupId>
             <artifactId>mongodb-driver-reactivestreams</artifactId>
@@ -101,29 +95,6 @@
                 </executions>    
             </plugin>
                  
-            <plugin>
-                <groupId>com.fizzed</groupId>
-                <artifactId>rocker-maven-plugin</artifactId>
-                <version>1.3.0</version>
-                <executions>
-                    <execution>
-                        <id>generate-rocker-templates</id>
-                        <phase>generate-sources</phase>
-                        <goals>
-                            <goal>generate</goal>
-                        </goals>
-                        <configuration>
-                            <javaVersion>1.8</javaVersion>
-                            <templateDirectory>${basedir}/src/main/templates</templateDirectory>
-                            <outputDirectory>${basedir}/target/generated-sources/rocker</outputDirectory>
-                            <discardLogicWhitespace>false</discardLogicWhitespace>
-                            <addAsSources>true</addAsSources>
-                            <optimize>true</optimize>
-                            <failOnError>true</failOnError>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>

+ 0 - 30
frameworks/Java/redkale/pom.xml

@@ -6,7 +6,6 @@
     <version>1.0.0</version>
 
     <properties>
-        <!-- the main class -->
         <main.class>org.redkale.boot.Application</main.class>
         <stack.version>1.0.0</stack.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -27,12 +26,6 @@
             <version>2.5.0-SNAPSHOT</version>
         </dependency>
         
-        <dependency> 
-            <groupId>com.fizzed</groupId>
-            <artifactId>rocker-compiler</artifactId>
-            <version>1.3.0</version>
-        </dependency> 
-        
     </dependencies>
 
     <repositories>
@@ -96,29 +89,6 @@
                 </executions>    
             </plugin>
                  
-            <plugin>
-                <groupId>com.fizzed</groupId>
-                <artifactId>rocker-maven-plugin</artifactId>
-                <version>1.3.0</version>
-                <executions>
-                    <execution>
-                        <id>generate-rocker-templates</id>
-                        <phase>generate-sources</phase>
-                        <goals>
-                            <goal>generate</goal>
-                        </goals>
-                        <configuration>
-                            <javaVersion>1.8</javaVersion>
-                            <templateDirectory>${basedir}/src/main/templates</templateDirectory>
-                            <outputDirectory>${basedir}/target/generated-sources/rocker</outputDirectory>
-                            <discardLogicWhitespace>false</discardLogicWhitespace>
-                            <addAsSources>true</addAsSources>
-                            <optimize>true</optimize>
-                            <failOnError>true</failOnError>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>

+ 9 - 20
frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/BenchmarkService.java

@@ -5,14 +5,13 @@
  */
 package org.redkalex.benchmark;
 
-import com.fizzed.rocker.RockerOutput;
-import com.fizzed.rocker.runtime.ArrayOfByteArraysOutput;
 import java.util.Random;
 import java.util.concurrent.*;
 import javax.annotation.Resource;
 import org.redkale.net.http.*;
 import org.redkale.service.AbstractService;
 import org.redkale.source.*;
+import org.redkale.util.Utility;
 import org.redkalex.benchmark.CachedWorld.WorldEntityCache;
 
 /**
@@ -24,8 +23,6 @@ public class BenchmarkService extends AbstractService {
 
     private static final byte[] helloBytes = "Hello, world!".getBytes();
 
-    private final ThreadLocal<RedRandom> rands = ThreadLocal.withInitial(RedRandom::new);
-
     @Resource
     private DataSource source;
 
@@ -41,36 +38,30 @@ public class BenchmarkService extends AbstractService {
 
     @RestMapping(name = "db")
     public CompletableFuture<World> findWorldAsync() {
-        return source.findAsync(World.class, randomId(rands.get()));
+        return source.findAsync(World.class, randomId(ThreadLocalRandom.current()));
     }
 
     @RestMapping(name = "queries")
     public CompletableFuture<World[]> queryWorldAsync(int q) {
         final int size = Math.min(500, Math.max(1, q));
-        final Random random = rands.get();
+        final Random random = ThreadLocalRandom.current();
         final CompletableFuture<World>[] futures = new CompletableFuture[size];
         for (int i = 0; i < size; i++) {
             futures[i] = source.findAsync(World.class, randomId(random));
         }
-        return CompletableFuture.allOf(futures).thenApply(v -> {
-            World[] worlds = new World[size];
-            for (int i = 0; i < size; i++) {
-                worlds[i] = futures[i].join();
-            }
-            return worlds;
-        });
+        return Utility.allOfFutures(futures, c -> new World[c]);
     }
 
     @RestMapping(name = "updates")
     public CompletableFuture<World[]> updateWorldAsync(int q) {
         final int size = Math.min(500, Math.max(1, q));
-        final Random random = rands.get();
+        final Random random = ThreadLocalRandom.current();
         final CompletableFuture<World>[] futures = new CompletableFuture[size];
         for (int i = 0; i < size; i++) {
             futures[i] = source.findAsync(World.class, randomId(random));
         }
         return CompletableFuture.allOf(futures).thenCompose(v -> {
-            final Random r = rands.get();
+            final Random r = ThreadLocalRandom.current();
             final World[] worlds = new World[size];
             for (int i = 0; i < size; i++) {
                 worlds[i] = futures[i].join().randomNumber(randomId(r));
@@ -80,12 +71,10 @@ public class BenchmarkService extends AbstractService {
     }
 
     @RestMapping(name = "fortunes")
-    public CompletableFuture<HttpResult<byte[]>> queryFortunes() {
+    public CompletableFuture<HttpScope> queryFortunes() {
         return source.queryListAsync(Fortune.class).thenApply(fortunes -> {
             fortunes.add(new Fortune(0, "Additional fortune added at request time."));
-            RockerOutput out = FortunesTemplate.template(Fortune.sort(fortunes)).render();
-            byte[] bs = ((ArrayOfByteArraysOutput) out).toByteArray();
-            return new HttpResult("text/html; charset=utf-8", bs);
+            return HttpScope.refer("").attr("fortunes", Fortune.sort(fortunes));
         });
     }
 
@@ -99,7 +88,7 @@ public class BenchmarkService extends AbstractService {
             }
         }
         final int size = Math.min(500, Math.max(1, q));
-        return cache.random(rands.get(), size);
+        return cache.random(ThreadLocalRandom.current(), size);
     }
 
     protected int randomId(Random rand) {

+ 63 - 0
frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/FortuneRender.java

@@ -0,0 +1,63 @@
+/*
+ * 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 org.redkalex.benchmark;
+
+import java.util.List;
+import org.redkale.convert.Convert;
+import org.redkale.net.http.*;
+import org.redkale.util.AnyValue;
+
+/**
+ *
+ * @author zhangjx
+ */
+public class FortuneRender implements org.redkale.net.http.HttpRender {
+
+    @Override
+    public void init(HttpContext context, AnyValue config) {
+    }
+
+    @Override
+    public void renderTo(HttpRequest request, HttpResponse response, Convert convert, HttpScope scope) {
+        StringBuilder sb = new StringBuilder(1200);
+        sb.append("<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>");
+        for (Fortune item : (List<Fortune>) scope.find("fortunes")) {
+            sb.append("<tr><td>").append(item.getId()).append("</td><td>").append(escape(item.getMessage())).append("</td></tr>");
+        }
+        sb.append("</table></body></html>");
+        response.setContentType("text/html; charset=utf-8").finish(sb.toString());
+    }
+
+    private static CharSequence escape(CharSequence value) {
+        if (value == null || value.length() == 0) return "";
+        CharSequence cs = value;
+        StringBuilder sb = new StringBuilder(value.length() + 16);
+        for (int i = 0; i < cs.length(); i++) {
+            char ch = cs.charAt(i);
+            switch (ch) {
+                case '<':
+                    sb.append("&lt;");
+                    break;
+                case '>':
+                    sb.append("&gt;");
+                    break;
+                case '"':
+                    sb.append("&quot;");
+                    break;
+                case '\'':
+                    sb.append("&#39;");
+                    break;
+                case '&':
+                    sb.append("&amp;");
+                    break;
+                default:
+                    sb.append(ch);
+                    break;
+            }
+        }
+        return sb;
+    }
+}

+ 0 - 45
frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/RedRandom.java

@@ -1,45 +0,0 @@
-/*
- * 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 org.redkalex.benchmark;
-
-import java.util.Random;
-
-/**
- *
- * @author zhangjx
- */
-public class RedRandom extends Random {
-
-    private long s0, s1;
-
-    public RedRandom() {
-        this.s0 = super.nextLong();
-        this.s1 = super.nextLong();
-    }
-
-    @Override
-    public long nextLong() {
-        final long s0 = this.s0;
-        long s1 = this.s1;
-        final long result = s0 + s1;
-        s1 ^= s0;
-        this.s0 = Long.rotateLeft(s0, 24) ^ s1 ^ s1 << 16;
-        this.s1 = Long.rotateLeft(s1, 37);
-        return result;
-    }
-
-    @Override
-    public int nextInt() {
-        return (int) nextLong();
-    }
-
-    @Override
-    public int nextInt(int bound) {
-        long s = nextLong();
-        return (int) (s < 0 ? -s : s) % bound;
-    }
-
-}

+ 0 - 9
frameworks/Java/redkale/src/main/templates/org/redkalex/benchmark/FortunesTemplate.rocker.html

@@ -1,9 +0,0 @@
-@import org.redkalex.benchmark.Fortune
-@import java.util.List
-@args(List<Fortune> fortunes)
-<!DOCTYPE html><html>
-<head><title>Fortunes</title></head>
-<body><table>
-<tr><th>id</th><th>message</th></tr>@for (fortune : fortunes) {
-<tr><td>@fortune.getId()</td><td>@fortune.getMessage()</td></tr>} 
-</table></body></html>