added method to read templates from a reader

This commit is contained in:
Sebastian Sdorra
2012-10-29 13:04:00 +01:00
parent 94d8d9f2bf
commit 8d58137bae
9 changed files with 211 additions and 5 deletions

View File

@@ -30,28 +30,30 @@
*/ */
package sonia.scm.template; package sonia.scm.template;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import java.io.IOException; import java.io.IOException;
import java.io.Reader;
/** /**
* The {@link TemplateEngine} searches for {@link Template}s and prepares the * The {@link TemplateEngine} searches for {@link Template}s and prepares the
* template for the rendering process. * template for the rendering process.
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
* @since 1.19 * @since 1.19
* *
* @apiviz.uses sonia.scm.template.Template * @apiviz.uses sonia.scm.template.Template
*/ */
public interface TemplateEngine public interface TemplateEngine
{ {
/** /**
* Returns the template associated with the given path. The template engine * Returns the template associated with the given path. The template engine
* will search the template in the folder of the web application and in * will search the template in the folder of the web application and in
* the classpath. This method will return null, * the classpath. This method will return null,
* if no template could be found for the given path. * if no template could be found for the given path.
* *
* *
@@ -63,6 +65,23 @@ public interface TemplateEngine
*/ */
public Template getTemplate(String templatePath) throws IOException; public Template getTemplate(String templatePath) throws IOException;
/**
* Creates a template of the given reader. Note some template implementations
* will cache the template by its id.
*
*
* @param templateIdentifier id of the template
* @param reader template reader
*
* @return template created from the reader
*
* @throws IOException
*
* @since 1.22
*/
public Template getTemplate(String templateIdentifier, Reader reader)
throws IOException;
/** /**
* Returns the type of this template engine. * Returns the type of this template engine.
* *

View File

@@ -30,6 +30,7 @@
*/ */
package sonia.scm.template; package sonia.scm.template;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
@@ -43,6 +44,7 @@ import static org.junit.Assert.*;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import java.io.IOException; import java.io.IOException;
import java.io.Reader;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
@@ -166,6 +168,24 @@ public class TemplateEngineFactoryTest
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
/**
* Method description
*
*
* @param templateIdentifier
* @param reader
*
* @return
*
* @throws IOException
*/
@Override
public Template getTemplate(String templateIdentifier, Reader reader)
throws IOException
{
throw new UnsupportedOperationException("Not supported yet.");
}
/** /**
* Method description * Method description
* *
@@ -190,6 +210,24 @@ public class TemplateEngineFactoryTest
private static class FakeTemplateEngine2 implements TemplateEngine private static class FakeTemplateEngine2 implements TemplateEngine
{ {
/**
* Method description
*
*
* @param templateIdentifier
* @param reader
*
* @return
*
* @throws IOException
*/
@Override
public Template getTemplate(String templateIdentifier, Reader reader)
throws IOException
{
throw new UnsupportedOperationException("Not supported yet.");
}
/** /**
* Method description * Method description
* *

View File

@@ -51,6 +51,7 @@ import org.slf4j.LoggerFactory;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.Reader;
import java.util.Locale; import java.util.Locale;
@@ -152,6 +153,34 @@ public class FreemarkerTemplateEngine implements TemplateEngine
return template; return template;
} }
/**
* Method description
*
*
* @param templateIdentifier
* @param reader
*
* @return
*
* @throws IOException
*/
@Override
public Template getTemplate(String templateIdentifier, Reader reader)
throws IOException
{
if (logger.isTraceEnabled())
{
logger.trace("try to create freemarker template from reader with id {}",
templateIdentifier);
}
freemarker.template.Template t =
new freemarker.template.Template(templateIdentifier, reader,
configuration, ENCODING);
return new FreemarkerTemplate(t);
}
/** /**
* Method description * Method description
* *

View File

@@ -47,6 +47,7 @@ import org.slf4j.LoggerFactory;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import java.io.IOException; import java.io.IOException;
import java.io.Reader;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
@@ -87,6 +88,32 @@ public class MustacheTemplateEngine implements TemplateEngine
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param templateIdentifier
* @param reader
*
* @return
*
* @throws IOException
*/
@Override
public Template getTemplate(String templateIdentifier, Reader reader)
throws IOException
{
if (logger.isTraceEnabled())
{
logger.trace("try to create mustache template from reader with id {}",
templateIdentifier);
}
Mustache mustache = factory.compile(reader, templateIdentifier);
return new MustacheTemplate(templateIdentifier, mustache);
}
/** /**
* Method description * Method description
* *

View File

@@ -30,10 +30,13 @@
*/ */
package sonia.scm.template; package sonia.scm.template;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import java.io.InputStream;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
/** /**
@@ -82,4 +85,19 @@ public class FreemarkerTemplateEngineTest extends TemplateEngineTestBase
{ {
return "sonia/scm/template/002.ftl"; return "sonia/scm/template/002.ftl";
} }
/**
* Method description
*
*
* @param resource
*
* @return
*/
@Override
protected InputStream getResource(String resource)
{
return FreemarkerTemplateEngineTest.class.getResourceAsStream(
"/sonia/scm/template/".concat(resource).concat(".ftl"));
}
} }

View File

@@ -30,10 +30,13 @@
*/ */
package sonia.scm.template; package sonia.scm.template;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
import java.io.InputStream;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
/** /**
@@ -82,4 +85,19 @@ public class MustacheTemplateEngineTest extends TemplateEngineTestBase
{ {
return "sonia/scm/template/001.mustache"; return "sonia/scm/template/001.mustache";
} }
/**
* Method description
*
*
* @param resource
*
* @return
*/
@Override
protected InputStream getResource(String resource)
{
return MustacheTemplateEngineTest.class.getResourceAsStream(
"/sonia/scm/template/".concat(resource).concat(".mustache"));
}
} }

View File

@@ -30,10 +30,12 @@
*/ */
package sonia.scm.template; package sonia.scm.template;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import com.google.common.collect.Maps;
import com.google.common.io.Closeables; import com.google.common.io.Closeables;
import org.junit.Test; import org.junit.Test;
@@ -46,9 +48,13 @@ import static org.mockito.Mockito.*;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.net.URL; import java.net.URL;
import java.util.Map;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
/** /**
@@ -86,6 +92,16 @@ public abstract class TemplateEngineTestBase
*/ */
public abstract String getTemplateResource(); public abstract String getTemplateResource();
/**
* Method description
*
*
* @param resource
*
* @return
*/
protected abstract InputStream getResource(String resource);
//~--- methods -------------------------------------------------------------- //~--- methods --------------------------------------------------------------
/** /**
@@ -135,6 +151,45 @@ public abstract class TemplateEngineTestBase
assertNotNull(engine.getTemplate(getTemplateResource())); assertNotNull(engine.getTemplate(getTemplateResource()));
} }
/**
* Method description
*
*
* @throws IOException
*/
@Test
public void testGetTemplateFromReader() throws IOException
{
ServletContext context = mock(ServletContext.class);
TemplateEngine engine = createEngine(context);
InputStream input = null;
try
{
input = getResource("007");
Template template = engine.getTemplate("007",
new InputStreamReader(input));
assertNotNull(template);
Map<String, Object> env = Maps.newHashMap();
env.put("time", "Lunchtime");
StringWriter writer = new StringWriter();
template.execute(writer, env);
assertEquals("Time is an illusion. Lunchtime doubly so.",
writer.toString());
}
finally
{
Closeables.closeQuietly(input);
}
}
/** /**
* Method description * Method description
* *

View File

@@ -0,0 +1 @@
Time is an illusion. ${time} doubly so.

View File

@@ -0,0 +1 @@
Time is an illusion. {{time}} doubly so.