/**
* Copyright (C) 2009 BonitaSoft S.A.
* BonitaSoft, 31 rue Gustave Eiffel - 38000 Grenoble
*/
package org.bonitasoft.forms.server.accessor.widget.impl;
import java.util.ArrayList;
import java.util.List;
import org.bonitasoft.forms.client.model.Expression;
import org.bonitasoft.forms.server.accessor.impl.util.XPathUtil;
import org.bonitasoft.forms.server.api.impl.util.FormFieldValuesUtil;
import org.bonitasoft.forms.server.constants.XMLForms;
import org.bonitasoft.forms.server.exception.InvalidFormDefinitionException;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Parse an XML node to return one/several expressions
*
* @author Anthony Birembaut
*
*/
public class XMLExpressionsUtil extends XPathUtil {
/**
* Instance attribute
*/
protected static XMLExpressionsUtil INSTANCE = null;
public static String NON_APPLICABLE_PREFIX = "n/a";
/**
* @return the XMLExpressionsUtil instance
*/
public static synchronized XMLExpressionsUtil getInstance() {
if (INSTANCE == null) {
INSTANCE = new XMLExpressionsUtil();
}
return INSTANCE;
}
/**
* Constructor
*/
protected XMLExpressionsUtil() {
}
/**
* Parse an expression Array node, put expressionParentName as "n/a" as default value.
*
* @param expressionsNode
* the expression node
*
* @return a list of list of expressions
* @throws InvalidFormDefinitionException
*/
public List<List<Expression>> parseExpressionsArray(final Node expressionsNode) throws InvalidFormDefinitionException {
return parseExpressionsArray(NON_APPLICABLE_PREFIX, expressionsNode);
}
/**
* Parse an expression Array node
*
* @param expressionParentName
* name of the parent widget
*
* @param expressionsNode
* the expression node
* @return a list of list of expressions
* @throws InvalidFormDefinitionException
*/
public List<List<Expression>> parseExpressionsArray(final String expressionParentName, final Node expressionsNode) throws InvalidFormDefinitionException {
final List<List<Expression>> expressions = new ArrayList<List<Expression>>();
final NodeList rowNodes = getNodeListByXpath(expressionsNode, XMLForms.ROW);
for (int i = 0; i < rowNodes.getLength(); i++) {
final Node rowNode = rowNodes.item(i);
if (rowNode != null) {
expressions.add(parseExpressionsList(expressionParentName, rowNode));
}
}
return expressions;
}
/**
* Parse a expression list node, put expressionParentName as "n/a" as default value.
*
* @param expressionsNode
* the expression node
* @return a list of expressions
* @throws InvalidFormDefinitionException
*/
public List<Expression> parseExpressionsList(final Node expressionsNode) throws InvalidFormDefinitionException {
return parseExpressionsList(NON_APPLICABLE_PREFIX, expressionsNode);
}
/**
* Parse a expression list node
*
* @param expressionParentName
* name of the parent widget
*
* @param expressionsNode
* the expression node
* @return a list of expressions
* @throws InvalidFormDefinitionException
*/
public List<Expression> parseExpressionsList(final String expressionParentName, final Node expressionsNode) throws InvalidFormDefinitionException {
final List<Expression> expressions = new ArrayList<Expression>();
final NodeList expressionNodes = getNodeListByXpath(expressionsNode, XMLForms.EXPRESSION);
for (int i = 0; i < expressionNodes.getLength(); i++) {
final Node expressionNode = expressionNodes.item(i);
if (expressionNode != null) {
expressions.add(parseExpressionContent(expressionParentName, expressionNode));
}
}
return expressions;
}
/**
* Parse a expression list node
*
* @param dependenciesNode
* the dependencies node
* @return a list of expressions
* @throws InvalidFormDefinitionException
*/
public List<Expression> parseExpressionsDependenciesList(final Node dependenciesNode) throws InvalidFormDefinitionException {
final List<Expression> expressions = new ArrayList<Expression>();
final NodeList expressionNodes = getNodeListByXpath(dependenciesNode, XMLForms.EXPRESSION);
for (int i = 0; i < expressionNodes.getLength(); i++) {
final Node expressionNode = expressionNodes.item(i);
if (expressionNode != null) {
final String name = getStringByXpath(expressionNode, XMLForms.NAME);
expressions.add(buildExpression(expressionNode, name) );
}
}
return expressions;
}
/**
* Parse an expression parent node, put expressionParentName as "n/a" as default value.
*
* @param expressionParentNode
* the expression parent node
* @return an Expression
* @throws InvalidFormDefinitionException
*/
public Expression parseExpression(final Node expressionParentNode) throws InvalidFormDefinitionException {
return parseExpression(NON_APPLICABLE_PREFIX, expressionParentNode);
}
/**
* Parse an expression parent node
*
* @param expressionParentName
* name of the parent widget
*
* @param expressionParentNode
* the expression parent node
* @return an Expression
* @throws InvalidFormDefinitionException
*/
public Expression parseExpression(final String expressionParentName, final Node expressionParentNode) throws InvalidFormDefinitionException {
final Node expressionNode = getNodeByXpath(expressionParentNode, XMLForms.EXPRESSION);
if (expressionNode != null) {
return parseExpressionContent(expressionParentName, expressionNode);
} else {
return null;
}
}
/**
* Parse an expression node, put expressionParentName as "n/a" as default value.
*
* @param expressionNode
* the expression node
* @return an Expression
* @throws InvalidFormDefinitionException
*/
protected Expression parseExpressionContent(final Node expressionNode) throws InvalidFormDefinitionException {
return parseExpressionContent(NON_APPLICABLE_PREFIX, expressionNode);
}
/**
* Parse an expression node
*
* @param expressionParentName
* name of the parent widget
*
* @param expressionNode
* the expression node
* @return an Expression
* @throws InvalidFormDefinitionException
*/
protected Expression parseExpressionContent(final String expressionParentName, final Node expressionNode) throws InvalidFormDefinitionException {
final String name = expressionParentName + FormFieldValuesUtil.EXPRESSION_KEY_SEPARATOR + getStringByXpath(expressionNode, XMLForms.NAME);
return buildExpression(expressionNode, name);
}
private Expression buildExpression(final Node expressionNode, final String name)
throws InvalidFormDefinitionException {
final String returnType = getStringByXpath(expressionNode, XMLForms.EXPRESSION_RETURN_TYPE);
final String expressionType = getStringByXpath(expressionNode, XMLForms.EXPRESSION_TYPE);
final String interpreter = getStringByXpath(expressionNode, XMLForms.EXPRESSION_INTERPRETER);
final String content = getStringByXpath(expressionNode, XMLForms.EXPRESSION_CONTENT);
final Node expressionDependenciesNode = getNodeByXpath(expressionNode, XMLForms.DEPENDENCIES);
final List<Expression> dependencies;
if (expressionDependenciesNode != null) {
dependencies = parseExpressionsDependenciesList(expressionDependenciesNode);
} else {
dependencies = new ArrayList<Expression>();
}
return new Expression(name, content, expressionType, returnType, interpreter, dependencies);
}
}