document = builder.parse(file.getAbsolutePath());
System.setProperty("org.xmldb.common.xml.queries.XPathQueryFactory",
"org.xmldb.common.xml.queries.xalan2.XPathQueryFactoryImpl");
XPathQuery xpath = XPathQueryFactory.newInstance().newXPathQuery();
XUpdateQuery xq = new XUpdateQueryImpl();
String editSelect = null;
String insertSelect = null;
Enumeration params = request.getParameterNames();
while (params.hasMoreElements()) {
String pname = (String) params.nextElement();
getLogger().debug("Parameter: " + pname + " ("
+ request.getParameter(pname) + ")");
// Extract the xpath to edit
if (editSelect == null && pname.indexOf("edit[") >= 0
&& pname.endsWith("].x")) {
editSelect = pname.substring(5, pname.length() - 3);
getLogger().debug("Edit: " + editSelect);
}
// Make sure we are dealing with an xupdate statement,
// else skip
if (pname.indexOf("<xupdate:") == 0) {
String select = pname.substring(pname.indexOf("select") + 8);
select = select.substring(0, select.indexOf("\""));
getLogger().debug(".act() Select Node: " + select);
// Check if node exists
xpath.setQString(select);
XObject result = xpath.execute(document);
NodeList selectionNodeList = result.nodeset();
if (selectionNodeList.getLength() == 0) {
getLogger()
.debug(".act(): Node does not exist (might have been deleted during update): "
+ select);
} else {
String xupdateModifications = null;
// now check for the different xupdate
// statements, and handle appropriately
if (pname.indexOf("xupdate:update-parent") > 0) {
getLogger().debug("UPDATE PARENT Node: " + pname);
// CDATA updates need to be handled
// seperately
if (pname.indexOf("<![CDATA[") > 0) {
xupdateModifications = updateCDATA(request, pname, true);
} else {
xupdateModifications = update(request,
pname,
select,
selectionNodeList,
true);
}
} else if (pname.indexOf("xupdate:update") > 0) {
getLogger().debug("UPDATE Node: " + pname);
// CDATA updates need to be handled
// seperately
if (pname.indexOf("<![CDATA[") > 0) {
xupdateModifications = updateCDATA(request, pname, false);
} else {
xupdateModifications = update(request,
pname,
select,
selectionNodeList,
false);
}
} else if (pname.indexOf("xupdate:append") > 0
&& pname.endsWith(">.x")) {
xupdateModifications = append(pname.substring(0,
pname.length() - 2));
// insert-before: in case of select/option
} else if (pname.indexOf("xupdate:insert-before") > 0
&& pname.endsWith("/>")) {
if (!request.getParameter(pname).equals("null")) {
xupdateModifications = insertBefore(request
.getParameter(pname));
insertSelect = pname.substring(31,pname.length() - 3);
}
// insert-before: in case of image
} else if (pname.indexOf("xupdate:insert-before") > 0
&& pname.endsWith(">.x")) {
xupdateModifications = insertBefore(pname.substring(0, pname
.length() - 2));
// insert-after: in case of select/option
} else if (pname.indexOf("xupdate:insert-after") > 0
&& pname.endsWith("/>")) {
if (!request.getParameter(pname).equals("null")) {
xupdateModifications = insertAfter(request
.getParameter(pname));
insertSelect = pname.substring(30,pname.length() - 3);
}
// insert-after: in case of image
} else if (pname.indexOf("xupdate:insert-after") > 0
&& pname.endsWith(">.x")) {
xupdateModifications = insertAfter(pname.substring(0, pname
.length() - 2));
} else if (pname.indexOf("xupdate:remove") > 0
&& pname.endsWith("/>.x")) {
xupdateModifications = remove(pname.substring(0,
pname.length() - 2));
insertSelect = pname.substring(24,pname.length() - 3);
} else if (pname.endsWith(">.y")) {
getLogger().debug("Don't handle this: " + pname);
} else {
getLogger().debug("Don't handle this either: " + pname);
}
// Get hidden namespaces
String namespaces = request.getParameter("namespaces");
// Add XML declaration
// NOTE: select/option is generating parameter
// which should be considered as null
if (xupdateModifications != null) {
xupdateModifications = "<?xml version=\"1.0\"?>"
+ addHiddenNamespaces(namespaces, xupdateModifications);
}
// now run the assembled xupdate query
if (xupdateModifications != null) {
getLogger().info("Execute XUpdate Modifications: "
+ xupdateModifications);
xq.setQString(xupdateModifications);
xq.execute(document);
} else {
getLogger()
.debug("Parameter did not match any xupdate command: "
+ pname);
}