return null;
}
// Get creator
ParentChildCreatorInterface creator = null;
String absoluteDoctypesPath = sitemapParentPath + doctypesPath;
Document doctypesDoc = new SAXReader().read("file:" + absoluteDoctypesPath +
"doctypes.xconf");
Attribute creator_src = (Attribute) doctypesDoc.selectSingleNode("/doctypes/doc[@type='" +
doctype + "']/creator/@src");
if (creator_src != null) {
getLogger().info(".act(): Creator found for \"" + doctype + "\": " +
creator_src.getName() + " " + creator_src.getPath() + " " +
creator_src.getValue());
// now get the constructor that accepts the configuration
Class creatorClass = Class.forName(creator_src.getValue());
creator = (ParentChildCreatorInterface) creatorClass.newInstance();
} else {
getLogger().warn(".act(): No creator found for \"" + doctype +
"\". DefaultParentChildreator will be taken.");
creator = new org.apache.lenya.cms.authoring.DefaultCreator();
}
getLogger().debug(".act(): Creator : " + creator.getClass().getName());
// Init creator
// "Read" the configuration from the DOM node
DefaultConfigurationBuilder defaultConfigBuilder = new DefaultConfigurationBuilder();
Configuration[] docTypeConfigs =
defaultConfigBuilder.buildFromFile(absoluteDoctypesPath +
"doctypes.xconf").getChildren();
Configuration doctypeConf = null;
for (int i = 0; i < docTypeConfigs.length; i++) {
String typeName = docTypeConfigs[i].getAttribute("type");
if (typeName.equals(doctype)) {
doctypeConf = docTypeConfigs[i].getChild("creator", false);
}
}
creator.init(doctypeConf);
// Transaction should actually be started here!
// Read tree
String treefilename = sitemapParentPath + treeAuthoringPath;
getLogger().debug("FILENAME OF TREE: " + treefilename);
if (!new File(treefilename).exists()) {
getLogger().error("No such file (453): " + treefilename);
return null;
}
Document doc = new SAXReader().read("file:" + treefilename);
// Get parent element
StringTokenizer st = new StringTokenizer(parentid, "/");
String xpath_string = "/tree/branch"; // Trunk of tree
while (st.hasMoreTokens()) {
xpath_string = xpath_string + "/branch[@relURI='" + st.nextToken() + "']";
}
getLogger().debug("XPATH: " + xpath_string);
XPath xpathSelector = DocumentHelper.createXPath(xpath_string);
List nodes = xpathSelector.selectNodes(doc);
if (nodes.isEmpty()) {
getLogger().error(".act(): No nodes: " + xpath_string);
getLogger().error(".act(): No child added!");
return null;
}
Element parent_element = (Element) nodes.get(0);
getLogger().debug("PARENT ELEMENT: " + parent_element.getPath());
// Set child type: branch or leaf
childType = creator.getChildType(childType);
if (childType == ParentChildCreatorInterface.BRANCH_NODE) {
childtype = "branch";
} else {
childtype = "leaf";
}
// Check if child already exists
String newChildXPath = xpath_string + "/" + childtype;
getLogger().debug("CHECK: " + newChildXPath);
if (doc.selectSingleNode(newChildXPath + "[@relURI='" +
creator.generateTreeId(childid, childType) + "']") != null) {
getLogger().error("Exception: XPath exists: " + newChildXPath + "[@relURI='" +
creator.generateTreeId(childid, childType) + "']");
getLogger().error("No child added");
return null;
}
// Add node: branch or leaf
parent_element.addElement(childtype)
.addAttribute("relURI", creator.generateTreeId(childid, childType))
.addAttribute("doctype", doctype).addAttribute("menuName",
creator.getChildName(childname));
getLogger().debug("Tree has been modified: " + doc.asXML());
// Write new tree
java.io.FileWriter fileWriter = new java.io.FileWriter(treefilename);
doc.write(fileWriter);
fileWriter.close();
// Transaction should actually be finished here!
// Create actual document
// grab all the parameters from session, request params and
// sitemap params
HashMap allParameters = new HashMap();
String[] names = parameters.getNames();
for( int i = 0; i < names.length; i++ ) {
String name = names[ i ];
String value = null;
try {
value = parameters.getParameter( name );
} catch (ParameterException pe) {
value = null;
}
allParameters.put(name, value);
}
Enumeration requestParameters = request.getParameterNames();
while (requestParameters.hasMoreElements()) {
String requestParameterName = (String) requestParameters.nextElement();
if (allParameters.containsKey(requestParameterName)) {
// we do not allow name clashes
throw new ProcessingException("Name clash in request parameter " +
"and sitemap parameter: " +
requestParameterName);
}
allParameters.put(requestParameterName,
request.getParameter(requestParameterName));
}
Enumeration sessionAttributeNames = session.getAttributeNames();
while (sessionAttributeNames.hasMoreElements()) {
String sessionAttributeName = (String) sessionAttributeNames.nextElement();
if (allParameters.containsKey(sessionAttributeName)) {
// we do not allow name clashes
throw new ProcessingException("Name clash in session attribute " +
"and request parameter or sitemap parameter: " +
sessionAttributeName);
}
allParameters.put(sessionAttributeName, session.getAttribute(sessionAttributeName));
}
try {
creator.create(new File(absoluteDoctypesPath + "samples"),
new File(sitemapParentPath + docsPath + parentid),
childid, childType, childname, allParameters);
} catch (Exception e) {
getLogger().error(".act(): Creator threw exception: " + e);
}