File unnumberTagsXSL = new File(sitemap.getAbsolutePath() + File.separator
+ parameters.getParameter("unnumberTagsXSL"));
File numberTagsXSL = new File(sitemap.getAbsolutePath() + File.separator
+ parameters.getParameter("numberTagsXSL"));
Request request = ObjectModelHelper.getRequest(objectModel);
if (request.getParameter("cancel") != null) {
getLogger().warn(".act(): Editing has been canceled");
file.delete();
return null;
} else {
if (file.isFile()) {
getLogger().debug(".act(): Save modifications to " + file.getAbsolutePath());
try {
Document document = null;
DocumentBuilderFactory parserFactory = DocumentBuilderFactory.newInstance();
parserFactory.setValidating(false);
parserFactory.setNamespaceAware(true);
parserFactory.setIgnoringElementContentWhitespace(true);
DocumentBuilder builder = parserFactory.newDocumentBuilder();
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);
}
}
}
}
// Uncomment this for debugging
/*
* java.io.StringWriter writer = new java.io.StringWriter();
* org.apache.xml.serialize.OutputFormat OutFormat = new
* org.apache.xml.serialize.OutputFormat("xml", "UTF-8",
* true); org.apache.xml.serialize.XMLSerializer serializer =
* new org.apache.xml.serialize.XMLSerializer(writer,
* OutFormat);
* serializer.asDOMSerializer().serialize((Document)
* document); log.error(".act(): XUpdate Result:
* \n"+writer.toString());
*/
// validate against relax ng after the updates
if (schema.isFile()) {
DocumentHelper.writeDocument(document, new File(file.getCanonicalPath()
+ ".validate"));
String message = validateDocument(schema, new File(file.getCanonicalPath()
+ ".validate"), unnumberTagsXSL);
if (message != null) {
getLogger().error("RELAX NG Validation failed: " + message);
HashMap hmap = new HashMap();
hmap.put("message", "RELAX NG Validation failed: " + message);
return hmap;
}
} else {
getLogger().warn("No such schema: " + schema.getAbsolutePath());
}
Document renumberedDocument = renumberDocument(document,
unnumberTagsXSL,
numberTagsXSL);
DocumentHelper.writeDocument(renumberedDocument, file);
// check to see if we save and exit
if (request.getParameter("save") != null) {
getLogger().info(".act(): Save");
return null;
} else {
/*
* We don't exit