Skip to content

Commit

Permalink
Add XPathProcessor
Browse files Browse the repository at this point in the history
  • Loading branch information
seadowg committed Nov 3, 2023
1 parent 390d203 commit 358e23d
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
14 changes: 14 additions & 0 deletions src/main/java/org/javarosa/xform/parse/XFormParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
import org.javarosa.xml.util.UnfullfilledRequirementsException;
import org.javarosa.xpath.XPathConditional;
import org.javarosa.xpath.XPathParseTool;
import org.javarosa.xpath.expr.XPathExpression;
import org.javarosa.xpath.expr.XPathFuncExpr;
import org.javarosa.xpath.expr.XPathNumericLiteral;
import org.javarosa.xpath.expr.XPathPathExpr;
Expand Down Expand Up @@ -182,6 +183,9 @@ public class XFormParser implements IXFormParserFunctions {
private final List<FormDefProcessor> formDefProcessors = new ArrayList<>();
private final List<ModelAttributeProcessor> modelAttributeProcessors = new ArrayList<>();
private final List<QuestionProcessor> questionProcessors = new ArrayList<>();
private final List<XPathProcessor> xpathProcessors = new ArrayList<>();

public static final List<XPathProcessor> tempXPathProcessors = new ArrayList<>();

/**
* The string IDs of all instances that are referenced in a instance() function call in the primary instance
Expand Down Expand Up @@ -396,6 +400,7 @@ public FormDef parse(String formXmlSrc, String lastSavedSrc) throws ParseExcepti
throw new IllegalStateException("Another XForm is being parsed!");
}

tempXPathProcessors.addAll(xpathProcessors);

if (_f == null) {
logger.info("Parsing form...");
Expand Down Expand Up @@ -428,6 +433,7 @@ public FormDef parse(String formXmlSrc, String lastSavedSrc) throws ParseExcepti

return _f;
} finally {
tempXPathProcessors.clear();
parseLock.unlock();
}
}
Expand All @@ -448,6 +454,10 @@ public void addProcessor(Processor processor) {
if (processor instanceof QuestionProcessor) {
questionProcessors.add((QuestionProcessor) processor);
}

if (processor instanceof XPathProcessor) {
xpathProcessors.add((XPathProcessor) processor);
}
}

public void addBindAttributeProcessor(BindAttributeProcessor bindAttributeProcessor) {
Expand Down Expand Up @@ -2451,6 +2461,10 @@ public interface Processor {

}

public interface XPathProcessor extends Processor {
void processXPath(@NotNull XPathExpression xPathExpression);
}

public interface FormDefProcessor extends Processor {
void processFormDef(FormDef formDef) throws ParseException;
}
Expand Down
8 changes: 7 additions & 1 deletion src/main/java/org/javarosa/xpath/XPathParseTool.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package org.javarosa.xpath;

import org.javarosa.xform.parse.XFormParser;
import org.javarosa.xpath.expr.XPathExpression;
import org.javarosa.xpath.parser.Lexer;
import org.javarosa.xpath.parser.Parser;
Expand All @@ -38,6 +39,11 @@ public class XPathParseTool {
};

public static XPathExpression parseXPath (String xpath) throws XPathSyntaxException {
return Parser.parse(Lexer.lex(xpath));
XPathExpression expression = Parser.parse(Lexer.lex(xpath));
for (XFormParser.XPathProcessor processor : XFormParser.tempXPathProcessors) {
processor.processXPath(expression);
}

return expression;
}
}

0 comments on commit 358e23d

Please sign in to comment.