}
public class InsertBefore implements XPathFunction {
public Object evaluate(List args) throws XPathFunctionException {
if (args.size() < 2 || args.size() > 3)
throw new XPathFunctionException(new FaultException(new QName(Namespaces.ODE_EXTENSION_NS, "insertBeforeInvalidSource"), "Invalid arguments"));
if (__log.isDebugEnabled()) {
__log.debug("insertBefore call(context=" + _ectx + " args=" + args + ")");
}
Element targetElmt;
List<Node> siblingNodes;
Object childArg = null, siblingsArg = null;
try {
if (args.size() == 2) {
childArg = args.get(0);
siblingsArg = args.get(1);
} else {
childArg = args.get(1);
siblingsArg = args.get(2);
}
if (childArg instanceof List) {
List elmts = (List) childArg;
// allow insertions after a sequence of node items
// if (elmts.size() != 1) throw new XPathFunctionException(
// new FaultException(_oxpath.getOwner().constants.qnSelectionFailure,
// "The bpws:insertBefore function MUST be passed a single " +
// "element node."));
targetElmt = (Element) elmts.get(0);
} else if (childArg instanceof NodeWrapper) {
targetElmt = (Element) ((NodeWrapper) childArg).getUnderlyingNode();
} else if (childArg instanceof Element) {
targetElmt = (Element) childArg;
} else {
throw new XPathFunctionException("Unexpected argument type: " + childArg.getClass());
}
if (siblingsArg instanceof List) {
siblingNodes = (List) siblingsArg;
} else if (siblingsArg instanceof NodeWrapper) {
Node childElmt = (Node) ((NodeWrapper) siblingsArg).getUnderlyingNode();
siblingNodes = new ArrayList<Node>();
siblingNodes.add(childElmt);
} else if (siblingsArg instanceof Element) {
Node childElmt = (Node) siblingsArg;
siblingNodes = new ArrayList<Node>();
siblingNodes.add(childElmt);
} else {
throw new XPathFunctionException("Unexpected argument type: " + siblingsArg.getClass());
}
} catch (IllegalArgumentException e) {
throw new XPathFunctionException(
new FaultException(_oxpath.getOwner().constants.qnInvalidExpressionValue,
"Invalid argument: URI Template expected. " + childArg, e));
} catch (ClassCastException e) {
throw new XPathFunctionException(
new FaultException(_oxpath.getOwner().constants.qnSelectionFailure,
"The bpws:insertBefore function MUST be passed a single " +
"element node."));
}
Element parentElmt = (Element) targetElmt.getParentNode();