You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by vg...@apache.org on 2004/09/24 15:32:05 UTC
svn commit: rev 47154 - cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/variables
Author: vgritsenko
Date: Fri Sep 24 06:32:05 2004
New Revision: 47154
Added:
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/variables/VariableExpressionTokenizer.java
- copied unchanged from rev 47153, cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/treeprocessor/variables/VariableExpressionTokenizer.java
Modified:
cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolver.java
Log:
Extract expression parser out of variable resolver (for reuse)
Modified: cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolver.java
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolver.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolver.java Fri Sep 24 06:32:05 2004
@@ -62,120 +62,53 @@
private static Token EMPTY_TOKEN = new Token(EXPR);
public PreparedVariableResolver(String expr, ServiceManager manager) throws PatternException {
-
super(expr);
this.manager = manager;
- this.selector = null;
-
- int openCount = 0;
- int closeCount = 0;
-
- needsMapStack = false;
-
- tokens = new ArrayList();
- int pos = 0;
- int i;
- boolean escape = false;
-
- for (i = 0; i < expr.length(); i++) {
- char c = expr.charAt(i);
- if (escape) {
- escape = false;
- } else if (c == '\\' && i < expr.length()) {
- char nextChar = expr.charAt(i + 1);
- if (nextChar == '{' || nextChar == '}') {
- expr = expr.substring(0, i) + expr.substring(i + 1);
- escape = true;
- i--;
- }
- } else if (c == '{') {
- if (i > pos) {
- tokens.add(new Token(expr.substring(pos, i)));
- }
+ this.tokens = new ArrayList();
- openCount++;
- tokens.add(OPEN_TOKEN);
-
- int colonPos = indexOf(expr, ":", i);
- int closePos = indexOf(expr, "}", i);
- int openPos = indexOf(expr, "{", i);
-
- if (openPos < colonPos && openPos < closePos) {
- throw new PatternException("Invalid '{' at position " + i + " in expression \"" + expr + "\"");
- }
-
- if (colonPos < closePos) {
- // we've found a module
- Token token;
- String module = expr.substring(i + 1, colonPos);
-
- if (module.equals("sitemap")) {
- // Explicit prefix for sitemap variable
- needsMapStack = true;
- token = new Token(SITEMAP_VAR);
- } else if (module.startsWith("#")) {
- // anchor syntax refering to a name result level
+ VariableExpressionTokenizer.tokenize(expr, new VariableExpressionTokenizer.TokenReciever() {
+ public void addToken(int type, String value) throws PatternException {
+ switch (type) {
+ case VariableExpressionTokenizer.TokenReciever.COLON:
+ tokens.add(COLON_TOKEN);
+ break;
+ case VariableExpressionTokenizer.TokenReciever.OPEN:
+ tokens.add(OPEN_TOKEN);
+ break;
+ case VariableExpressionTokenizer.TokenReciever.CLOSE:
+ tokens.add(CLOSE_TOKEN);
+ break;
+ case VariableExpressionTokenizer.TokenReciever.TEXT:
+ tokens.add(new Token(value));
+ break;
+ case VariableExpressionTokenizer.TokenReciever.MODULE:
+ Token token;
+ if (value.equals("sitemap")) {
+ // Explicit prefix for sitemap variable
+ needsMapStack = true;
+ token = new Token(SITEMAP_VAR);
+ } else if (value.startsWith("#")) {
+ // anchor syntax refering to a name result level
+ needsMapStack = true;
+ token = new Token(ANCHOR_VAR, value.substring(1));
+ } else {
+ // Module used
+ token = getNewModuleToken(value);
+ }
+ tokens.add(token);
+ break;
+ case VariableExpressionTokenizer.TokenReciever.VARIABLE:
needsMapStack = true;
- token = new Token(ANCHOR_VAR, module.substring(1));
- } else {
- // Module used
- token = getNewModuleToken(module);
- }
- tokens.add(token);
- i = colonPos - 1;
- } else {
- // Unprefixed name : sitemap variable
- needsMapStack = true;
- tokens.add(getNewSitemapToken(expr.substring(i + 1, closePos)));
- i = closePos - 1;
+ tokens.add(getNewVariableToken(value));
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown token type: " + type);
}
-
- pos = i + 1;
- } else if (c == '}') {
- if (i > 0 && expr.charAt(i - 1) == '\\') {
- continue;
- }
- if (i > pos) {
- tokens.add(new Token(expr.substring(pos, i)));
- }
-
- closeCount++;
- tokens.add(CLOSE_TOKEN);
- pos = i + 1;
- } else if (c == ':') {
- if (i != pos || tokens.size() == 0) {
- // this colon isn't part of a module reference
- continue;
- }
-
- int lastTokenType = ((Token) tokens.get(tokens.size() - 1)).getType();
- if (lastTokenType != SITEMAP_VAR &&
- lastTokenType != ANCHOR_VAR &&
- lastTokenType != THREADSAFE_MODULE &&
- lastTokenType != STATEFUL_MODULE) {
- continue;
- }
-
- tokens.add(COLON_TOKEN);
- pos = i + 1;
}
- }
-
- if (i > pos) {
- tokens.add(new Token(expr.substring(pos, i)));
- }
-
- if (openCount != closeCount) {
- throw new PatternException("Mismatching braces in expression: " + expr);
- }
- }
-
- private int indexOf(String expr, String chr, int pos) {
- int location;
- return (location = expr.indexOf(chr, pos+1))!=-1 ? location : expr.length();
+ });
}
- private Token getNewSitemapToken(String variable) {
+ private Token getNewVariableToken(String variable) {
if (variable.startsWith("/")) {
return new Token(ROOT_SITEMAP_VARIABLE, variable.substring(1));
} else {