Author: nbelaevski
Date: 2007-06-20 18:22:11 -0400 (Wed, 20 Jun 2007)
New Revision: 1243
Added:
trunk/richfaces/common/src/main/antlr/
trunk/richfaces/common/src/main/antlr/RichMacroDefinition.g
trunk/richfaces/common/src/main/java/org/richfaces/renderkit/ExpressionHolder.java
Modified:
trunk/richfaces/common/pom.xml
trunk/richfaces/common/src/test/java/org/richfaces/renderkit/TemplateUtilTest.java
Log:
- ANTLR grammar describing macrodefinitions syntax added
- Enabled generation of lexer & parser classes by ANTLR
- TemplateUtilTest updated
Modified: trunk/richfaces/common/pom.xml
===================================================================
--- trunk/richfaces/common/pom.xml 2007-06-20 17:33:24 UTC (rev 1242)
+++ trunk/richfaces/common/pom.xml 2007-06-20 22:22:11 UTC (rev 1243)
@@ -7,6 +7,54 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.richfaces</groupId>
<artifactId>common</artifactId>
- <name>common classes</name>
+ <name>common classes</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.antlr</groupId>
+ <artifactId>stringtemplate</artifactId>
+ <version>3.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr</artifactId>
+ <version>3.0</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <!-- temporary solution, until maven-antlr-plugin will not become mature
-->
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>generate-sources</phase>
+ <configuration>
+ <tasks>
+ <java classname="org.antlr.Tool"
+ classpathref="maven.plugin.classpath"
+ fork="true"
+ dir="src/main/antlr">
+ <arg value="RichMacroDefinition.g"/>
+ <arg line="-o
${project.build.directory}/generated-sources/antlr/org/richfaces"/>
+ </java>
+ </tasks>
+
<sourceRoot>${project.build.directory}/generated-sources/antlr</sourceRoot>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ <dependencies>
+ <dependency>
+ <groupId>org.antlr</groupId>
+ <artifactId>antlr</artifactId>
+ <version>3.0</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+ </build>
</project>
\ No newline at end of file
Added: trunk/richfaces/common/src/main/antlr/RichMacroDefinition.g
===================================================================
--- trunk/richfaces/common/src/main/antlr/RichMacroDefinition.g
(rev 0)
+++ trunk/richfaces/common/src/main/antlr/RichMacroDefinition.g 2007-06-20 22:22:11 UTC
(rev 1243)
@@ -0,0 +1,59 @@
+grammar RichMacroDefinition;
+
+options {
+ output = AST;
+}
+
+tokens {
+ SLASH = '\\';
+ LEFT_BRACKET = '{';
+ RIGHT_BRACKET = '}';
+}
+
+@header {
+ package org.richfaces;
+}
+
+@lexer::header {
+ package org.richfaces;
+}
+
+@members {
+ private String unescape(String arg) {
+ StringBuffer result = new StringBuffer(arg);
+ int idx = 0;
+ while ((idx = result.indexOf("\\", idx)) != -1) {
+ char ch = result.charAt(idx + 1);
+ result.replace(idx, idx + 2, String.valueOf(ch));
+
+ idx ++;
+ }
+
+ return result.toString();
+ }
+
+ private String stripBraces(String arg) {
+ return arg.substring(1, arg.length() - 1);
+ }
+}
+
+expression returns [List result] @init { $result = new ArrayList(); }:
+ (m = macrodef
+ {$result.add(new org.richfaces.renderkit.ExpressionHolder(
+ unescape(stripBraces($m.text))));}
+
+ | t = text
+ {$result.add(unescape($t.text));}
+
+ )* EOF;
+
+
+text : TEXT+;
+
+TEXT : ~(LEFT_BRACKET | SLASH | RIGHT_BRACKET)* | SLASH (LEFT_BRACKET | SLASH |
RIGHT_BRACKET);
+
+macrodef:
+ LEFT_BRACKET (macrodefpart | text)+ RIGHT_BRACKET;
+
+macrodefpart:
+ LEFT_BRACKET (macrodefpart | text)+ RIGHT_BRACKET;
Added: trunk/richfaces/common/src/main/java/org/richfaces/renderkit/ExpressionHolder.java
===================================================================
--- trunk/richfaces/common/src/main/java/org/richfaces/renderkit/ExpressionHolder.java
(rev 0)
+++
trunk/richfaces/common/src/main/java/org/richfaces/renderkit/ExpressionHolder.java 2007-06-20
22:22:11 UTC (rev 1243)
@@ -0,0 +1,26 @@
+/**
+ *
+ */
+package org.richfaces.renderkit;
+
+/**
+ * @author Nick Belaevski - mailto:nbelaevski@exadel.com
+ * created 20.06.2007
+ *
+ */
+public class ExpressionHolder {
+ private Object expression;
+
+ public ExpressionHolder(Object expression) {
+ super();
+ this.expression = expression;
+ }
+
+ public Object getExpression() {
+ return expression;
+ }
+
+ public String toString() {
+ return super.toString() + "[" + expression + "]";
+ }
+}
Modified:
trunk/richfaces/common/src/test/java/org/richfaces/renderkit/TemplateUtilTest.java
===================================================================
---
trunk/richfaces/common/src/test/java/org/richfaces/renderkit/TemplateUtilTest.java 2007-06-20
17:33:24 UTC (rev 1242)
+++
trunk/richfaces/common/src/test/java/org/richfaces/renderkit/TemplateUtilTest.java 2007-06-20
22:22:11 UTC (rev 1243)
@@ -22,21 +22,28 @@
package org.richfaces.renderkit;
import java.io.IOException;
+import java.util.List;
+import junit.framework.TestCase;
+
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.tree.Tree;
+import org.richfaces.RichMacroDefinitionLexer;
+import org.richfaces.RichMacroDefinitionParser;
+import org.richfaces.RichMacroDefinitionParser.expression_return;
import org.richfaces.renderkit.TemplateUtil.MacroTemplateHandler;
-import junit.framework.TestCase;
-
/**
* @author Nick Belaevski - mailto:nbelaevski@exadel.com
* created 17.06.2007
*
*/
public class TemplateUtilTest extends TestCase {
-
+
private static class MacroTemplateHandlerImpl implements MacroTemplateHandler {
private boolean handled = false;
-
+
public String handle(String body) {
handled = true;
return "#" + body + "#";
@@ -46,7 +53,7 @@
return handled;
}
};
-
+
private String doWrite(String in) throws IOException {
MacroTemplateHandlerImpl templateHandlerImpl = new MacroTemplateHandlerImpl();
TemplateUtil testWriter = new TemplateUtil(templateHandlerImpl);
@@ -54,28 +61,52 @@
String result = testWriter.getResult();
return result;
}
-
+
+ private void printTree(Tree tree, int indent) {
+ int childCount = tree.getChildCount();
+ for (int i = 0; i < indent; i++) {
+ System.out.print('\t');
+ System.out.print(tree.getText() + " : " + tree.getType());
+ System.out.println();
+ }
+ for (int j = 1; j < childCount; j++) {
+ printTree(tree.getChild(j), ++indent);
+ }
+ }
+
+
+ public void testAntlr() throws Exception {
+ ANTLRStringStream stream = new ANTLRStringStream("{aa{b\\}}a}\\\\
a\\}b\\{c");
+ RichMacroDefinitionLexer lexer = new RichMacroDefinitionLexer(stream);
+ RichMacroDefinitionParser macroParser = new RichMacroDefinitionParser(new
CommonTokenStream(lexer));
+ expression_return expression = macroParser.expression();
+ List result = expression.result;
+ ExpressionHolder holder = (ExpressionHolder) result.get(0);
+ assertEquals("aa{b}}a", holder.getExpression());
+ assertEquals("\\ a}b{c", result.get(1));
+ }
+
public void testWriting() throws Exception {
String[][] testStrings = new String[][] {
- {"\"a\" + #bcd# + \"e\"", "a{bcd}e"},
- {"\"a{bcd}e\"", "a\\{bcd}e"},
- {"\"a\\\\{bcd}e\"", "a\\\\{bcd}e"},
- {"\"a{bc}d\"", "a{bc\\}d"},
- {"\"a\" + #bc\\d# + \"e\"", "a{bc\\d}e"},
- {"\"a\" + #bc\\\\d# + \"e\"", "a{bc\\\\d}e"},
- {"\"a{bc\\\\}d\"", "a{bc\\\\}d"},
- {"#ab}# + \"c\"", "{ab\\}}c"},
- {"\"a\" + #{bc#", "a{\\{bc}"},
- {"#{aa}#", "{{aa}}"},
- {"\"aa\\\\}\"", "aa\\}"},
- {"\"{aa\\\\\"", "{aa\\"}
+ {"\'a\' + #bcd# + \'e\'", "a{bcd}e"},
+ {"\'a{bcd}e\'", "a\\{bcd}e"},
+ {"\'a\\\\{bcd}e\'", "a\\\\{bcd}e"},
+ {"\'a{bc}d\'", "a{bc\\}d"},
+ {"\'a\' + #bc\\d# + \'e\'", "a{bc\\d}e"},
+ {"\'a\' + #bc\\\\d# + \'e\'", "a{bc\\\\d}e"},
+ {"\'a{bc\\\\}d\'", "a{bc\\\\}d"},
+ {"#ab}# + \'c\'", "{ab\\}}c"},
+ {"\'a\' + #{bc#", "a{\\{bc}"},
+ {"#{aa}#", "{{aa}}"},
+ {"\'aa\\\\}\'", "aa\\}"},
+ {"\'{aa\\\\\'", "{aa\\"}
};
for (int i = 0; i < testStrings.length; i++) {
String[] strings = testStrings[i];
-
+
String written = doWrite(strings[1]);
- System.out.println(strings[0] + " : " + strings[1] + " : " +
written);
+ //System.out.println(strings[0] + " : " + strings[1] + " : " +
written);
assertEquals(strings[0], written);
}
}