Author: mck
Date: Mon Aug 27 12:49:37 2012
New Revision: 1377658

URL: http://svn.apache.org/viewvc?rev=1377658&view=rev
Log:
TREQ-16 - Upgrade to mustache java implementation 0.8.1 
 - replace com.github.spullara.mustache.java.core-0.6.2 and 
com.github.spullara.mustache.java.builder-0.6.2 with 
com.github.spullara.mustache.java.compiler-0.8.4
 - remove MustacheScopeMap, mustache replaced its "Scope" class with just a 
Map<String,Object>
 - remove MustacheRenderer.getResourceStream(..). Such behaviour is now defined 
in a custom MustacheFactory passed in through the constructor,
 - design MustacheRenderer for extension,
 - add MustacheRenderer.getThreadLocalRequest() allowing custom MustacheFactory 
implementations access to the current tiles' Request object.

Removed:
    
tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheScopeMap.java
Modified:
    tiles/request/trunk/pom.xml
    tiles/request/trunk/tiles-request-mustache/pom.xml
    
tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheRenderer.java
    
tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheScopeExtractor.java
    
tiles/request/trunk/tiles-request-mustache/src/test/java/org/apache/tiles/request/mustache/MustacheRendererTest.java

Modified: tiles/request/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/tiles/request/trunk/pom.xml?rev=1377658&r1=1377657&r2=1377658&view=diff
==============================================================================
--- tiles/request/trunk/pom.xml (original)
+++ tiles/request/trunk/pom.xml Mon Aug 27 12:49:37 2012
@@ -299,13 +299,8 @@ under the License.
             </dependency>
             <dependency>
                 <groupId>com.github.spullara.mustache.java</groupId>
-                <artifactId>core</artifactId>
-                <version>0.6.2</version>
-            </dependency>
-            <dependency>
-                <groupId>com.github.spullara.mustache.java</groupId>
-                <artifactId>builder</artifactId>
-                <version>0.6.2</version>
+                <artifactId>compiler</artifactId>
+                <version>0.8.4</version>
             </dependency>
         </dependencies>
     </dependencyManagement>

Modified: tiles/request/trunk/tiles-request-mustache/pom.xml
URL: 
http://svn.apache.org/viewvc/tiles/request/trunk/tiles-request-mustache/pom.xml?rev=1377658&r1=1377657&r2=1377658&view=diff
==============================================================================
--- tiles/request/trunk/tiles-request-mustache/pom.xml (original)
+++ tiles/request/trunk/tiles-request-mustache/pom.xml Mon Aug 27 12:49:37 2012
@@ -24,7 +24,7 @@ under the License.
   <parent>
     <artifactId>tiles-request</artifactId>
     <groupId>org.apache.tiles</groupId>
-    <version>1.1-SNAPSHOT</version>
+    <version>1.0.1</version>
   </parent>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-request-mustache</artifactId>
@@ -38,11 +38,8 @@ under the License.
     </dependency>
     <dependency>
         <groupId>com.github.spullara.mustache.java</groupId>
-        <artifactId>core</artifactId>
-    </dependency>
-    <dependency>
-        <groupId>com.github.spullara.mustache.java</groupId>
-        <artifactId>builder</artifactId>
+        <artifactId>compiler</artifactId>
+        <version>0.8.4</version>
     </dependency>
     <dependency>
        <groupId>junit</groupId>

Modified: 
tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheRenderer.java
URL: 
http://svn.apache.org/viewvc/tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheRenderer.java?rev=1377658&r1=1377657&r2=1377658&view=diff
==============================================================================
--- 
tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheRenderer.java
 (original)
+++ 
tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheRenderer.java
 Mon Aug 27 12:49:37 2012
@@ -21,19 +21,16 @@
 
 package org.apache.tiles.request.mustache;
 
-import java.io.BufferedReader;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import com.sampullara.mustache.MustacheBuilder;
-import com.sampullara.mustache.MustacheException;
-import com.sampullara.mustache.Scope;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
+import com.github.mustachejava.MustacheFactory;
+import com.github.mustachejava.DefaultMustacheFactory;
+import com.github.mustachejava.MustacheException;
 import org.apache.tiles.request.Request;
 import org.apache.tiles.request.render.CannotRenderException;
 import org.apache.tiles.request.render.Renderer;
@@ -41,46 +38,59 @@ import org.apache.tiles.request.render.R
 /**
  * The Mustache-specific renderer.
  *
+ * Can be configured to render paths only according to the acceptPattern.
+ *
  * @version $Rev: 1215006 $ $Date: 2011-12-16 01:30:41 +0100 (Fri, 16 Dec 
2011) $
  */
-public final class MustacheRenderer implements Renderer {
+public class MustacheRenderer implements Renderer {
+
+    // hack. exposes the tiles Request for MustacheFactory implementations.
+    private static final ThreadLocal<Request> REQUEST_HOLDER = new 
ThreadLocal<Request>();
 
+    private final MustacheFactory factory;
     private Pattern acceptPattern;
 
+    /** Uses the {@link DefaultMustacheFactory} */
+    public MustacheRenderer(){
+        this.factory = new DefaultMustacheFactory();
+    }
+
+    public MustacheRenderer(MustacheFactory factory) {
+        this.factory = factory;
+    }
+
     @Override
     public void render(String path, Request request) throws IOException {
         if (path == null) {
             throw new CannotRenderException("Cannot dispatch a null path");
         }
 
-        try{
-            new MustacheBuilder()
-                    .build(new BufferedReader(new 
InputStreamReader(getResourceStream(request, path))), path)
+        try {
+            REQUEST_HOLDER.set(request);
+            factory
+                    .compile(path)
                     .execute(request.getWriter(), buildScope(request));
+            REQUEST_HOLDER.remove();
 
-        }catch(MustacheException ex){
+        } catch(MustacheException ex) {
             throw new IOException("failed to MustacheRenderer.render(" + path 
+ ",request)", ex);
         }
     }
 
-    private static InputStream getResourceStream(Request request, String path) 
throws IOException {
-        final ApplicationContext applicationContext = 
request.getApplicationContext();
-        final ApplicationResource resource = 
applicationContext.getResource(path);
-        return resource.getInputStream();
+    public static Request getThreadLocalRequest(){
+        return REQUEST_HOLDER.get();
     }
 
-    private static Scope buildScope(Request request){
-        Scope scope = null;
+    protected Map<String,Object> buildScope(Request request) {
+        Map<String,Object> scope = new HashMap<String,Object>();
         List<String> availableScopes = request.getAvailableScopes();
-        for(int i = availableScopes.size() -1; i >= 0; --i){
-            scope = null == scope
-                    ? new Scope(request.getContext(availableScopes.get(i)))
-                    : new Scope(request.getContext(availableScopes.get(i)), 
scope);
+        for (int i = availableScopes.size() -1; i >= 0; --i) {
+            scope.putAll(request.getContext(availableScopes.get(i)));
         }
         return scope;
     }
 
-    //@Override
+    @Override
     public boolean isRenderable(String path, Request request) {
         if (path == null) {
             return false;
@@ -92,7 +102,7 @@ public final class MustacheRenderer impl
         return true;
     }
 
-    public void setAcceptPattern(Pattern acceptPattern) {
+    public final void setAcceptPattern(Pattern acceptPattern) {
         this.acceptPattern = acceptPattern;
     }
 }

Modified: 
tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheScopeExtractor.java
URL: 
http://svn.apache.org/viewvc/tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheScopeExtractor.java?rev=1377658&r1=1377657&r2=1377658&view=diff
==============================================================================
--- 
tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheScopeExtractor.java
 (original)
+++ 
tiles/request/trunk/tiles-request-mustache/src/main/java/org/apache/tiles/request/mustache/MustacheScopeExtractor.java
 Mon Aug 27 12:49:37 2012
@@ -18,16 +18,16 @@ package org.apache.tiles.request.mustach
 
 import java.util.Collections;
 import java.util.Enumeration;
+import java.util.Map;
 import java.util.Set;
 
-import com.sampullara.mustache.Scope;
 import org.apache.tiles.request.attribute.AttributeExtractor;
 
 
 public final class MustacheScopeExtractor  implements AttributeExtractor {
-    private final Scope scope;
+    private final Map<String,Object> scope;
 
-    public MustacheScopeExtractor(Scope scope){
+    public MustacheScopeExtractor(Map<String,Object> scope){
         this.scope = scope;
     }
 
@@ -48,6 +48,6 @@ public final class MustacheScopeExtracto
 
     @Override
     public void setValue(String key, Object value) {
-        scope.put(value, value);
+        scope.put(key, value);
     }
 }
\ No newline at end of file

Modified: 
tiles/request/trunk/tiles-request-mustache/src/test/java/org/apache/tiles/request/mustache/MustacheRendererTest.java
URL: 
http://svn.apache.org/viewvc/tiles/request/trunk/tiles-request-mustache/src/test/java/org/apache/tiles/request/mustache/MustacheRendererTest.java?rev=1377658&r1=1377657&r2=1377658&view=diff
==============================================================================
--- 
tiles/request/trunk/tiles-request-mustache/src/test/java/org/apache/tiles/request/mustache/MustacheRendererTest.java
 (original)
+++ 
tiles/request/trunk/tiles-request-mustache/src/test/java/org/apache/tiles/request/mustache/MustacheRendererTest.java
 Mon Aug 27 12:49:37 2012
@@ -22,21 +22,25 @@ package org.apache.tiles.request.mustach
 
 
 import java.io.IOException;
-import java.io.Writer;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.nio.charset.Charset;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Map;
 import java.util.regex.Pattern;
 
+import com.github.mustachejava.DefaultMustacheFactory;
 import org.apache.tiles.request.ApplicationContext;
 import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.mustache.MustacheRenderer;
 import org.apache.tiles.request.render.CannotRenderException;
 import org.apache.tiles.request.render.Renderer;
 import org.apache.tiles.request.Request;
 import org.junit.Test;
 
 import static org.easymock.classextension.EasyMock.*;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -54,27 +58,29 @@ public final class MustacheRendererTest 
     @Test
     public void testRender() throws IOException {
         Request request = createMock(Request.class);
-        Writer writer = createMock(Writer.class);
+        StringWriter writer = new StringWriter();
         ApplicationContext applicationContext = 
createMock(ApplicationContext.class);
         ApplicationResource applicationResource = 
createMock(ApplicationResource.class);
-        
expect(applicationResource.getInputStream()).andReturn(getClass().getResource("/test.html").openStream());
 
         Map<String,Object> context = Collections.singletonMap("testKey", 
(Object)"test value");
 
-        expect(request.getApplicationContext()).andReturn(applicationContext);
         
expect(applicationContext.getResource(isA(String.class))).andReturn(applicationResource).anyTimes();
         
expect(request.getAvailableScopes()).andReturn(Arrays.asList(Request.REQUEST_SCOPE,
 "session", Request.APPLICATION_SCOPE));
         expect(request.getContext(Request.REQUEST_SCOPE)).andReturn(context);
         
expect(request.getContext("session")).andReturn(Collections.<String,Object>emptyMap());
         
expect(request.getContext(Request.APPLICATION_SCOPE)).andReturn(Collections.<String,Object>emptyMap());
-        expect(request.getWriter()).andReturn(writer);
-        writer.write("test template with test value");
-        writer.flush();
+        expect(request.getWriter()).andReturn(writer).anyTimes();
 
-        replay(request, applicationContext, applicationResource, writer);
-        Renderer renderer = new MustacheRenderer();
+        replay(request, applicationContext, applicationResource);
+        Renderer renderer = new MustacheRenderer(new DefaultMustacheFactory() {
+                @Override
+                public Reader getReader(String path) {
+                    return new 
InputStreamReader(getClass().getResourceAsStream(path), 
Charset.forName("utf-8"));
+                }
+            });
         renderer.render("/test.html", request);
-        verify(request, applicationContext, applicationResource, writer);
+        verify(request, applicationContext, applicationResource);
+        assertEquals("test template with test value", writer.toString());
     }
 
     /**


Reply via email to