Skip to content

Commit

Permalink
Removing Templater: TemplateFactory is now the only way to create tem…
Browse files Browse the repository at this point in the history
…plates
  • Loading branch information
mmastrac committed Sep 20, 2011
1 parent c74e517 commit 2ecf281
Show file tree
Hide file tree
Showing 19 changed files with 234 additions and 429 deletions.
@@ -1,5 +1,6 @@
package net.stencilproject.template;


import org.antlr.runtime.CharStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.RecognizerSharedState;
Expand Down
@@ -1,5 +1,6 @@
package net.stencilproject.template;


import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
Expand Down
2 changes: 1 addition & 1 deletion stencil/src/net/stencilproject/template/IteratorUtils.java
Expand Up @@ -7,7 +7,7 @@

class IteratorUtils {
/**
* Returns the null iterator - one that has no values.
* Represents the null iterator - one that has no values.
*/
public static final Iterator<Object> NULL_ITERATOR = new Iterator<Object>() {
@Override
Expand Down
Expand Up @@ -6,22 +6,26 @@
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.CharBuffer;
import java.util.Date;
import java.util.List;
import java.util.Stack;

import net.stencilproject.template.ProgramBuilder.Label;
import net.stencilproject.template.TemplateParserException.TemplateError;
import net.stencilproject.template.TemplateTreeBuilder.EventHandler;

import org.antlr.runtime.tree.Tree;
import org.xml.sax.InputSource;

import com.google.common.base.Charsets;
import com.google.common.collect.Lists;

public class TemplateParserBuilder extends BaseParser implements EventHandler {
import com.google.common.io.CharStreams;

/**
* Builds a template from a given template file, invoking
* {@link TemplateTreeBuilder} and handling {@link TemplateBuilderEvents} callbacks as
* needed.
*/
public class TemplateBuilder extends BaseParser implements TemplateBuilderEvents {
private ProgramBuilder program = new ProgramBuilder();
private Stack<BlockContext> blockStack = new Stack<BlockContext>();
private final TemplateRootScope rootScope;
Expand Down Expand Up @@ -65,7 +69,7 @@ class ContentBlockContext extends BlockContext {

}

private TemplateParserBuilder(TemplateRootScope rootScope, TemplateFile templateFile, TemplateMode mode, TemplateOptions options) {
private TemplateBuilder(TemplateRootScope rootScope, TemplateFile templateFile, TemplateMode mode, TemplateOptions options) {
super(new TemplateFileSourceInfo(templateFile, null));

this.rootScope = rootScope;
Expand All @@ -74,9 +78,9 @@ private TemplateParserBuilder(TemplateRootScope rootScope, TemplateFile template
program.setEscapingMode(mode == TemplateMode.TEXT ? EscapingMode.TEXT : EscapingMode.XML);
}

public static TemplateParserBuilder parse(TemplateRootScope rootScope, TemplateFile templateFile, TemplateMode mode,
TemplateOptions options) throws TemplateParserException, IOException {
TemplateParserBuilder templateParserBuilder = new TemplateParserBuilder(rootScope, templateFile, mode, options);
public static TemplateBuilder parse(TemplateRootScope rootScope, TemplateFile templateFile, TemplateMode mode, TemplateOptions options)
throws TemplateParserException, IOException {
TemplateBuilder templateParserBuilder = new TemplateBuilder(rootScope, templateFile, mode, options);
templateParserBuilder.parse();
return templateParserBuilder;
}
Expand All @@ -91,8 +95,6 @@ public void parse() throws TemplateParserException, IOException {
}

protected String toString(InputSource source) throws TemplateParserException, IOException {
StringBuilder builder = new StringBuilder();
CharBuffer buffer = CharBuffer.allocate(4096);
Reader reader = source.getCharacterStream();
if (reader == null) {
final InputStream inputStream = source.getByteStream();
Expand All @@ -104,14 +106,7 @@ protected String toString(InputSource source) throws TemplateParserException, IO
reader = new InputStreamReader(inputStream, Charsets.UTF_8);
}

while (reader.read(buffer) > 0) {
buffer.flip();
builder.append(buffer);
}

reader.close();

return builder.toString();
return CharStreams.toString(reader);
}

@Override
Expand Down
14 changes: 14 additions & 0 deletions stencil/src/net/stencilproject/template/TemplateBuilderEvents.java
@@ -0,0 +1,14 @@
package net.stencilproject.template;

import org.antlr.runtime.tree.Tree;

/**
* Events that {@link TemplateBuilder} handles.
*/
interface TemplateBuilderEvents {
void text(TemplateFileSourceInfo source, String text) throws TemplateParserException;

void tree(TemplateFileSourceInfo source, Tree tree) throws TemplateParserException;

void done() throws TemplateParserException;
}
34 changes: 28 additions & 6 deletions stencil/src/net/stencilproject/template/TemplateFactory.java
Expand Up @@ -4,9 +4,11 @@
import java.io.IOException;
import java.net.URL;

import net.stencilproject.template.TemplateParserException.TemplateError;

/**
* Creates templates from various sources, allowing them to be re-read without restarting the application in development
* mode.
* Creates templates from various sources, allowing them to be re-read without
* restarting the application in development mode.
*/
public class TemplateFactory {
private final TemplateOptions options;
Expand All @@ -15,6 +17,15 @@ public TemplateFactory(TemplateOptions options) {
this.options = options.clone();
}

public TemplateSource getTemplateSourceFromString(final TemplateMode mode, final String string) {
return new TemplateSource() {
@Override
public Template readTemplate(final TemplateRootScope rootScope) throws TemplateParserException, IOException {
return readTemplateInternal(mode, rootScope, TemplateFile.fromString(string));
}
};
}

public TemplateSource getTemplateSource(final TemplateMode mode, final File file) {
if (mode == null) {
throw new NullPointerException("mode is null");
Expand Down Expand Up @@ -65,6 +76,15 @@ public TemplateSource getTemplateSource(TemplateMode mode, Class<?> clazz, Strin
return getTemplateSource(mode, resource);
}

public Template parseString(TemplateMode mode, TemplateRootScope rootScope, String template) throws TemplateParserException {
try {
return parse(getTemplateSourceFromString(mode, template), rootScope);
} catch (IOException e) {
// This shouldn't happen
throw new TemplateParserException(TemplateError.UNEXPECTED_ERROR, e, null);
}
}

public Template parse(TemplateMode mode, TemplateRootScope rootScope, Class<?> clazz, String resourceName)
throws TemplateParserException, IOException {
return parse(getTemplateSource(mode, clazz, resourceName), rootScope);
Expand All @@ -86,12 +106,14 @@ public Template parse(TemplateSource source, TemplateRootScope rootScope) throws

private Template readTemplateInternal(TemplateMode mode, TemplateRootScope rootScope, TemplateFile templateFile)
throws TemplateParserException, IOException {
Templater templater = new Templater(rootScope, options);

if (mode == TemplateMode.TEXT) {
return templater.parseText(templateFile);
TemplateBuilder templateParser = TemplateBuilder.parse(rootScope, templateFile, TemplateMode.TEXT, options);
return templateParser.toTemplate();
} else {
return templater.parseXml(mode == TemplateMode.HTML, templateFile);
TemplateBuilder templateParser = TemplateBuilder.parse(rootScope, templateFile, mode == TemplateMode.HTML ? TemplateMode.HTML
: TemplateMode.XML, options);

return templateParser.toTemplate();
}
}
}
@@ -1,6 +1,7 @@
// $ANTLR 3.2 Sep 23, 2009 12:02:23 /Users/matthew/Documents/twitrants/stencil/src/com/dotspots/templating/Template.g 2010-12-06 14:34:39
package net.stencilproject.template;


import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
Expand Down
23 changes: 7 additions & 16 deletions stencil/src/net/stencilproject/template/TemplateTreeBuilder.java
Expand Up @@ -17,13 +17,12 @@
import org.antlr.runtime.TokenStream;
import org.antlr.runtime.tree.Tree;


/**
* Parses a template, passing back the structure to an EventHandler.
*/
class TemplateTreeBuilder extends BaseParser {
private StringBuilder builder = new StringBuilder();
private final EventHandler eventHandler;
private final TemplateBuilderEvents eventHandler;
private final TemplateMode mode;
private TextState textState = TextState.TEXT;

Expand All @@ -36,21 +35,13 @@ enum TextState {
ESCAPE,
}

TemplateTreeBuilder(TemplateFileSourceInfo source, TemplateMode mode, EventHandler eventHandler) {
TemplateTreeBuilder(TemplateFileSourceInfo source, TemplateMode mode, TemplateBuilderEvents eventHandler) {
super(source);
this.mode = mode;
this.eventHandler = eventHandler;
}

interface EventHandler {
void text(TemplateFileSourceInfo source, String text) throws TemplateParserException;

void tree(TemplateFileSourceInfo source, Tree tree) throws TemplateParserException;

void done() throws TemplateParserException;
}

private class TextEventHandler implements EventHandler {
private class TextEventHandler implements TemplateBuilderEvents {
@Override
public void text(TemplateFileSourceInfo source, String text) throws TemplateParserException {
emit(text);
Expand All @@ -66,7 +57,7 @@ public void done() {
}
}

private class XmlEventHandler implements EventHandler, XmlTokenHandler {
private class XmlEventHandler implements TemplateBuilderEvents, XmlTokenHandler {
private XmlPushLexer pushLexer = new XmlPushLexer(this);
// TODO: Use something more efficient here
private ArrayList<Tree> trees = new ArrayList<Tree>();
Expand Down Expand Up @@ -165,7 +156,7 @@ public void done() throws TemplateParserException {
};
}

private void processTree(EventHandler eventHandler, Tree templateTree) throws TemplateParserException {
private void processTree(TemplateBuilderEvents eventHandler, Tree templateTree) throws TemplateParserException {
for (int i = 0; i < templateTree.getChildCount(); i++) {
Tree tree = templateTree.getChild(i);
switch (tree.getType()) {
Expand Down Expand Up @@ -196,7 +187,7 @@ private void parseDirectives(Tree tree) throws TemplateParserException {
eventHandler.tree(source, tree);
}

private Tree parseTree(String string, EventHandler eventHandler) throws TemplateParserException {
private Tree parseTree(String string, TemplateBuilderEvents eventHandler) throws TemplateParserException {
final Exception[] stashed = new Exception[1];

final ANTLRStringStream stringStream = new ANTLRStringStream(string);
Expand Down Expand Up @@ -238,7 +229,7 @@ public void reportError(RecognitionException e) {
}

public void parse() throws TemplateParserException, IOException {
EventHandler eventHandler = mode == TemplateMode.TEXT ? new TextEventHandler() : new XmlEventHandler();
TemplateBuilderEvents eventHandler = mode == TemplateMode.TEXT ? new TextEventHandler() : new XmlEventHandler();
Tree tree = parseTree(templateFile.read(), eventHandler);
processTree(eventHandler, tree);
flushText();
Expand Down
64 changes: 0 additions & 64 deletions stencil/src/net/stencilproject/template/Templater.java

This file was deleted.

30 changes: 30 additions & 0 deletions stencil/test/net/stencilproject/template/AbstractTemplateTest.java
@@ -0,0 +1,30 @@
package net.stencilproject.template;

import java.io.IOException;

public abstract class AbstractTemplateTest {
protected Template parse(String text) throws TemplateParserException {
return new TemplateFactory(new TemplateOptions()).parseString(TemplateMode.TEXT, null, text);
}

protected Template parseResource(String filename) throws TemplateParserException, IOException {
return new TemplateFactory(new TemplateOptions()).parse(TemplateMode.TEXT, null, getClass(), filename);
}

protected Template parse(TemplateRootScope rootScope, String text) throws TemplateParserException {
return new TemplateFactory(new TemplateOptions()).parseString(TemplateMode.TEXT, rootScope, text);
}

protected Template parseHtml(String text) throws TemplateParserException {
return new TemplateFactory(new TemplateOptions()).parseString(TemplateMode.HTML, null, text);
}

protected Template parseXml(String text) throws TemplateParserException {
return new TemplateFactory(new TemplateOptions()).parseString(TemplateMode.XML, null, text);
}

protected Template parseResourceXml(String filename) throws TemplateParserException, IOException {
return new TemplateFactory(new TemplateOptions()).parse(TemplateMode.XML, null, getClass(), filename);
}

}
Expand Up @@ -11,8 +11,8 @@
public class TestErrorHandling {
@Test
public void testNestedError() throws TemplateParserException, IOException {
Templater templater = createTemplater();
Template template = templater.parse(TemplateMode.TEXT, TemplateFile.fromResource(TestErrorHandling.class, "nestedErrorOuter.txt"));
TemplateFactory templater = createTemplater();
Template template = templater.parse(TemplateMode.TEXT, null, TestErrorHandling.class, "nestedErrorOuter.txt");

ByteArrayOutputStream errStream = new ByteArrayOutputStream();

Expand All @@ -39,10 +39,10 @@ public void testNestedError() throws TemplateParserException, IOException {
}
}

private Templater createTemplater() {
private TemplateFactory createTemplater() {
TemplateOptions options = new TemplateOptions();
options.setDumpTemplate(true);
options.setTraceExecution(true);
return new Templater(null, options);
return new TemplateFactory(options);
}
}

0 comments on commit 2ecf281

Please sign in to comment.