You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by up...@apache.org on 2004/04/03 22:41:26 UTC
cvs commit: cocoon-2.1/src/test/org/apache/cocoon/components/treeprocessor/variables PreparedVariableResolverTestCase.java
upayavira 2004/04/03 12:41:26
Modified: src/java/org/apache/cocoon/components/treeprocessor/variables
PreparedVariableResolver.java
src/test/org/apache/cocoon/components/treeprocessor/variables
PreparedVariableResolverTestCase.java
Log:
Fixing colon outside of module reference, and enabling escaping of braces
Revision Changes Path
1.5 +70 -38 cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolver.java
Index: PreparedVariableResolver.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolver.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- PreparedVariableResolver.java 2 Apr 2004 20:22:07 -0000 1.4
+++ PreparedVariableResolver.java 3 Apr 2004 20:41:26 -0000 1.5
@@ -77,51 +77,83 @@
tokens = new ArrayList();
int pos=0;
int i;
+ boolean escape = false;
for (i=0;i< expr.length();i++) {
char c = expr.charAt(i);
- if (c=='{' || c=='}' || c==':') {
+ 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)));
}
- if (c=='{') {
- 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);
- } else 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(PREFIXED_SITEMAP_VAR);
- } else if (module.startsWith("#")) {
- // anchor syntax refering to a name result level
- 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
+ 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);
+ } else 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;
- tokens.add(getNewSitemapToken(expr.substring(i+1, closePos)));
- i = closePos-1;
+ token = new Token(PREFIXED_SITEMAP_VAR);
+ } else if (module.startsWith("#")) {
+ // anchor syntax refering to a name result level
+ 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;
+ }
+ 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 (tokens.size()>0) {
+ int lastTokenType = ((Token)tokens.get(tokens.size()-1)).getType();
+ if (lastTokenType != PREFIXED_SITEMAP_VAR &&
+ lastTokenType != ANCHOR_VAR &&
+ lastTokenType != THREADSAFE_MODULE &&
+ lastTokenType != STATEFUL_MODULE) {
+ continue;
}
- } else if (c=='}') {
- closeCount++;
- tokens.add(CLOSE_TOKEN);
- } else if (c==':') {
- tokens.add(COLON_TOKEN);
}
+ if (i != pos) {
+ // this colon isn't part of a module reference
+ continue;
+ }
+ if (i> pos) {
+ tokens.add(new Token(expr.substring(pos, i)));
+ }
+ tokens.add(COLON_TOKEN);
pos=i+1;
}
}
1.2 +29 -1 cocoon-2.1/src/test/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolverTestCase.java
Index: PreparedVariableResolverTestCase.java
===================================================================
RCS file: /home/cvs/cocoon-2.1/src/test/org/apache/cocoon/components/treeprocessor/variables/PreparedVariableResolverTestCase.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PreparedVariableResolverTestCase.java 2 Apr 2004 20:22:07 -0000 1.1
+++ PreparedVariableResolverTestCase.java 3 Apr 2004 20:41:26 -0000 1.2
@@ -158,4 +158,32 @@
PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
assertEquals("from juliet to oscar", resolver.resolve(context, getObjectModel()));
}
+
+ public void testColonInTextContent() throws PatternException {
+ String expr = "http://cocoon.apache.org";
+
+ InvokeContext context = new InvokeContext(true);
+ context.enableLogging(new LogKitLogger(getLogger()));
+
+ Map sitemapElements;
+ sitemapElements = new HashMap();
+ context.pushMap("label", sitemapElements);
+
+ PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ assertEquals("http://cocoon.apache.org", resolver.resolve(context, getObjectModel()));
+ }
+
+ public void testEscapedBraces() throws PatternException {
+ String expr = "This is a \\{brace\\}";
+
+ InvokeContext context = new InvokeContext(true);
+ context.enableLogging(new LogKitLogger(getLogger()));
+
+ Map sitemapElements;
+ sitemapElements = new HashMap();
+ context.pushMap("label", sitemapElements);
+
+ PreparedVariableResolver resolver = new PreparedVariableResolver(expr, manager);
+ assertEquals("This is a {brace}", resolver.resolve(context, getObjectModel()));
+ }
}