* Add allowDeepMacros property which must be set to "true" in order to allow

macros with deep paths.
* Issue an error message if a macro isn't terminated properly.
This commit is contained in:
hns 2007-03-20 11:02:23 +00:00
parent 984c6a62a4
commit b6d72d79af
2 changed files with 19 additions and 6 deletions

View file

@ -173,6 +173,8 @@ public final class Application implements Runnable {
// Field to cache unmapped java classes // Field to cache unmapped java classes
private final static String CLASS_NOT_MAPPED = "(unmapped)"; private final static String CLASS_NOT_MAPPED = "(unmapped)";
protected boolean allowDeepMacros = false;
/** /**
* Simple constructor for dead application instances. * Simple constructor for dead application instances.
*/ */
@ -1871,6 +1873,8 @@ public final class Application implements Runnable {
((Logger) eventLog).setLogLevel(debug ? Logger.DEBUG : Logger.INFO); ((Logger) eventLog).setLogLevel(debug ? Logger.DEBUG : Logger.INFO);
} }
allowDeepMacros = "true".equalsIgnoreCase(props.getProperty("allowDeepMacros"));
// set prop read timestamp // set prop read timestamp
lastPropertyRead = props.lastModified(); lastPropertyRead = props.lastModified();
} }

View file

@ -35,6 +35,7 @@ import java.io.IOException;
public final class Skin { public final class Skin {
static private final int PARSE_MACRONAME = 0; static private final int PARSE_MACRONAME = 0;
static private final int PARSE_PARAM = 1; static private final int PARSE_PARAM = 1;
static private final int PARSE_DONE = 2;
static private final int ENCODE_NONE = 0; static private final int ENCODE_NONE = 0;
static private final int ENCODE_HTML = 1; static private final int ENCODE_HTML = 1;
@ -314,6 +315,7 @@ public final class Skin {
case '%': case '%':
if ((state != PARSE_PARAM || quotechar == '\u0000') && source[i + 1] == '>') { if ((state != PARSE_PARAM || quotechar == '\u0000') && source[i + 1] == '>') {
state = PARSE_DONE;
break loop; break loop;
} }
b.append(source[i]); b.append(source[i]);
@ -332,10 +334,9 @@ public final class Skin {
(source[i] != '%' || source[i + 1] != '>')) { (source[i] != '%' || source[i + 1] != '>')) {
i++; i++;
} }
state = PARSE_DONE;
break loop; break loop;
} }
break; break;
case '|': case '|':
@ -345,6 +346,7 @@ public final class Skin {
i = filterChain.end - 2; i = filterChain.end - 2;
lastParamName = null; lastParamName = null;
b.setLength(0); b.setLength(0);
state = PARSE_DONE;
break loop; break loop;
} }
b.append(source[i]); b.append(source[i]);
@ -432,14 +434,17 @@ public final class Skin {
this.end = Math.min(sourceLength, i + 2); this.end = Math.min(sourceLength, i + 2);
if (b.length() > 0) { if (b.length() > 0) {
if (lastParamName != null) { if (name == null) {
// add parameter
addParameter(lastParamName, b.toString());
} else if (state == PARSE_MACRONAME) {
name = b.toString().trim(); name = b.toString().trim();
} else {
addParameter(lastParamName, b.toString());
} }
} }
if (state != PARSE_DONE) {
app.logError("Unterminated Macro Tag: " +this);
}
path = StringUtils.split(name, "."); path = StringUtils.split(name, ".");
if (path.length <= 1) { if (path.length <= 1) {
handler = HANDLER_GLOBAL; handler = HANDLER_GLOBAL;
@ -765,6 +770,10 @@ public final class Skin {
} }
private Object resolvePath(Object handler, RequestEvaluator reval) { private Object resolvePath(Object handler, RequestEvaluator reval) {
if (!app.allowDeepMacros && path.length > 2) {
throw new RuntimeException("allowDeepMacros property must be true " +
"in order to enable deep macro paths.");
}
for (int i = 1; i < path.length - 1; i++) { for (int i = 1; i < path.length - 1; i++) {
handler = getProperty(handler, path[i], reval); handler = getProperty(handler, path[i], reval);
if (handler == null) { if (handler == null) {