/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.event.xml;
import com.espertech.esper.epl.generated.EsperEPL2GrammarParser;
import com.espertech.esper.epl.parse.ASTUtil;
import com.espertech.esper.type.IntValue;
import com.espertech.esper.util.ExecutionPathDebugLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* Parses event property names and transforms to XPath expressions. Supports
* nested, indexed and mapped event properties.
*/
public class SimpleXMLPropertyParser {
/**
* Return the xPath corresponding to the given property.
* The propertyName String may be simple, nested, indexed or mapped.
*
* @param ast is the property tree AST
* @param propertyName is the property name to parse
* @param rootElementName is the name of the root element for generating the XPath expression
* @param defaultNamespacePrefix is the prefix of the default namespace
* @param isResolvePropertiesAbsolute is true to indicate to resolve XPath properties as absolute props
* or relative props
* @return xpath expression
*/
public static String walk(EsperEPL2GrammarParser.StartEventPropertyRuleContext ast, String propertyName, String rootElementName, String defaultNamespacePrefix, boolean isResolvePropertiesAbsolute) {
StringBuilder xPathBuf = new StringBuilder();
xPathBuf.append('/');
if (isResolvePropertiesAbsolute) {
if (defaultNamespacePrefix != null) {
xPathBuf.append(defaultNamespacePrefix);
xPathBuf.append(':');
}
xPathBuf.append(rootElementName);
}
List<EsperEPL2GrammarParser.EventPropertyAtomicContext> ctxs = ast.eventProperty().eventPropertyAtomic();
if (ctxs.size() == 1) {
xPathBuf.append(makeProperty(ctxs.get(0), defaultNamespacePrefix));
} else {
for (EsperEPL2GrammarParser.EventPropertyAtomicContext ctx : ctxs) {
xPathBuf.append(makeProperty(ctx, defaultNamespacePrefix));
}
}
String xPath = xPathBuf.toString();
if ((ExecutionPathDebugLog.isDebugEnabled) && (log.isDebugEnabled())) {
log.debug(".parse For property '" + propertyName + "' the xpath is '" + xPath + '\'');
}
return xPath;
}
private static String makeProperty(EsperEPL2GrammarParser.EventPropertyAtomicContext ctx, String defaultNamespacePrefix) {
String prefix = "";
if (defaultNamespacePrefix != null) {
prefix = defaultNamespacePrefix + ":";
}
String unescapedIdent = ASTUtil.unescapeDot(ctx.eventPropertyIdent().getText());
if (ctx.lb != null) {
int index = IntValue.parseString(ctx.number().getText());
int xPathPosition = index + 1;
return '/' + prefix + unescapedIdent + "[position() = " + xPathPosition + ']';
}
if (ctx.lp != null) {
String key = com.espertech.esper.type.StringValue.parseString(ctx.s.getText());
return '/' + prefix + unescapedIdent + "[@id='" + key + "']";
}
return '/' + prefix + unescapedIdent;
}
private static final Logger log = LoggerFactory.getLogger(SimpleXMLPropertyParser.class);
}