From 407d9998367512ef7742863c437d782e80fb6681 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Sat, 29 Oct 2011 15:31:27 -0700 Subject: [PATCH] Further work on making JMustache work in GWT. I've ironed out most of the kinks, but the GWT unit test still fails because we're forced to do some sneaky things with java.io.Reader/Writer. I think it will all work when compiled to JavaScript, so I need to check it in a real project. --- build.sbt | 2 +- pom.xml | 27 +++++++++++- src/main/java/com/samskivert/Mustache.gwt.xml | 5 +++ .../samskivert/mustache/DefaultCollector.java | 4 +- .../com/samskivert/gwt/java/io/Reader.java | 12 ++++++ .../samskivert/gwt/java/io/StringReader.java | 21 +++++++++ .../samskivert/gwt/java/io/StringWriter.java | 20 +++++++++ .../com/samskivert/gwt/java/io/Writer.java | 12 ++++++ .../samskivert/mustache/GwtTestMustache.java | 43 +++++++++++++++++++ 9 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/samskivert/Mustache.gwt.xml rename src/main/java/com/samskivert/{mustache => }/gwt/com/samskivert/mustache/DefaultCollector.java (75%) create mode 100644 src/main/java/com/samskivert/gwt/java/io/Reader.java create mode 100644 src/main/java/com/samskivert/gwt/java/io/StringReader.java create mode 100644 src/main/java/com/samskivert/gwt/java/io/StringWriter.java create mode 100644 src/main/java/com/samskivert/gwt/java/io/Writer.java create mode 100644 src/test/java/com/samskivert/mustache/GwtTestMustache.java diff --git a/build.sbt b/build.sbt index 65845ba..b090782 100644 --- a/build.sbt +++ b/build.sbt @@ -18,7 +18,7 @@ libraryDependencies ++= Seq( ) // filter the super-source directory from the build -unmanagedSources in Compile ~= (_.filterNot(_.getPath.indexOf("com/samskivert/mustache/gwt") != -1)) +unmanagedSources in Compile ~= (_.filterNot(_.getPath.indexOf("com/samskivert/gwt") != -1)) // add our sources to the main jar file (including super-sources) unmanagedResourceDirectories in Compile <+= baseDirectory / "src/main/java" diff --git a/pom.xml b/pom.xml index 99dc06d..667a9ba 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,12 @@ + + com.google.gwt + gwt-user + 2.4.0 + test + junit junit @@ -59,6 +65,7 @@ + org.apache.maven.plugins @@ -73,10 +80,25 @@ -Xlint" "-Xlint:-serial" "-Xlint:-path - com/samskivert/mustache/gwt/** + com/samskivert/gwt/** + + org.codehaus.mojo + gwt-maven-plugin + 2.4.0 + + htmlunit + + + + + test + + + + org.apache.maven.plugins maven-resources-plugin @@ -89,6 +111,9 @@ org.apache.maven.plugins maven-surefire-plugin 2.6 + + **/*Test.java + org.apache.maven.plugins diff --git a/src/main/java/com/samskivert/Mustache.gwt.xml b/src/main/java/com/samskivert/Mustache.gwt.xml new file mode 100644 index 0000000..9945785 --- /dev/null +++ b/src/main/java/com/samskivert/Mustache.gwt.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/java/com/samskivert/mustache/gwt/com/samskivert/mustache/DefaultCollector.java b/src/main/java/com/samskivert/gwt/com/samskivert/mustache/DefaultCollector.java similarity index 75% rename from src/main/java/com/samskivert/mustache/gwt/com/samskivert/mustache/DefaultCollector.java rename to src/main/java/com/samskivert/gwt/com/samskivert/mustache/DefaultCollector.java index 474974f..c7011a8 100644 --- a/src/main/java/com/samskivert/mustache/gwt/com/samskivert/mustache/DefaultCollector.java +++ b/src/main/java/com/samskivert/gwt/com/samskivert/mustache/DefaultCollector.java @@ -17,8 +17,10 @@ public class DefaultCollector extends BasicCollector if (iter != null) return iter; if (value.getClass().isArray()) { - return Arrays.asList((Object[])value); + return Arrays.asList((Object[])value).iterator(); } return null; } + + // TODO: override createFetcher and do some magic for JavaScript/JSON objects } diff --git a/src/main/java/com/samskivert/gwt/java/io/Reader.java b/src/main/java/com/samskivert/gwt/java/io/Reader.java new file mode 100644 index 0000000..e5db421 --- /dev/null +++ b/src/main/java/com/samskivert/gwt/java/io/Reader.java @@ -0,0 +1,12 @@ +// +// $Id$ + +package java.io; + +/** + * A minimal version of {@code Reader} to satisfy GWT. + */ +public interface Reader +{ + int read () throws IOException; +} diff --git a/src/main/java/com/samskivert/gwt/java/io/StringReader.java b/src/main/java/com/samskivert/gwt/java/io/StringReader.java new file mode 100644 index 0000000..4f9e099 --- /dev/null +++ b/src/main/java/com/samskivert/gwt/java/io/StringReader.java @@ -0,0 +1,21 @@ +// +// $Id$ + +package java.io; + +/** + * A basic implementation of {@code StringReader} for use in GWT. + */ +public class StringReader implements Reader +{ + public StringReader (String data) { + _data = data; + } + + public int read () throws IOException { + return (_pos >= _data.length()) ? -1 : _data.charAt(_pos++); + } + + protected final String _data; + protected int _pos; +} diff --git a/src/main/java/com/samskivert/gwt/java/io/StringWriter.java b/src/main/java/com/samskivert/gwt/java/io/StringWriter.java new file mode 100644 index 0000000..a3e9891 --- /dev/null +++ b/src/main/java/com/samskivert/gwt/java/io/StringWriter.java @@ -0,0 +1,20 @@ +// +// $Id$ + +package java.io; + +/** + * A basic implementation of {@code StringReader} for use in GWT. + */ +public class StringWriter implements Writer +{ + public void write (String text) throws IOException { + _buf.append(text); + } + + @Override public String toString () { + return _buf.toString(); + } + + protected final StringBuilder _buf = new StringBuilder(); +} diff --git a/src/main/java/com/samskivert/gwt/java/io/Writer.java b/src/main/java/com/samskivert/gwt/java/io/Writer.java new file mode 100644 index 0000000..24d3d4b --- /dev/null +++ b/src/main/java/com/samskivert/gwt/java/io/Writer.java @@ -0,0 +1,12 @@ +// +// $Id$ + +package java.io; + +/** + * A minimal version of {@code Writer} to satisfy GWT. + */ +public interface Writer +{ + void write (String text) throws IOException; +} diff --git a/src/test/java/com/samskivert/mustache/GwtTestMustache.java b/src/test/java/com/samskivert/mustache/GwtTestMustache.java new file mode 100644 index 0000000..1f8e659 --- /dev/null +++ b/src/test/java/com/samskivert/mustache/GwtTestMustache.java @@ -0,0 +1,43 @@ +// +// JMustache - A Java implementation of the Mustache templating language +// http://github.com/samskivert/jmustache/blob/master/LICENSE + +package com.samskivert.mustache; + +import java.util.HashMap; +import java.util.Map; + +import com.google.gwt.junit.client.GWTTestCase; + +import org.junit.*; +import static org.junit.Assert.*; + +/** + * Tests basic Mustache operation in GWT. + */ +public class GwtTestMustache extends GWTTestCase +{ + public String getModuleName () { + return "com.samskivert.Mustache"; + } + + @Test public void testSimpleVariable () { + test("bar", "{{foo}}", context("foo", "bar")); + } + + protected void test (String expected, String template, Object ctx) { + test(Mustache.compiler(), expected, template, ctx); + } + + protected void test (Mustache.Compiler compiler, String expected, String template, Object ctx) { + assertEquals(expected, compiler.compile(template).execute(ctx)); + } + + protected Object context (Object... data) { + Map ctx = new HashMap(); + for (int ii = 0; ii < data.length; ii += 2) { + ctx.put(data[ii].toString(), data[ii+1]); + } + return ctx; + } +}