import java.io.StringReader; import java.io.StringWriter; import java.util.HashMap;

import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.DocumentException; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import org.dom4j.io.SAXReader; import org.dom4j.dom.DOMDocument; import org.dom4j.dom.DOMElement; import groovy.xml.MarkupBuilder

import com.xpn.xwiki.doc.XWikiAttachment;

public class MindMapGroovy {     def xwiki; def context; def deletedDocuments = new java.util.ArrayList(); def createdDocuments = new java.util.ArrayList(); def mmDirty = false;

 public setXWiki(xwiki, context) {         this.xwiki = xwiki; this.context = context; }

 public getDeletedDocuments() {         return deletedDocuments; }

 public getCreatedDocuments() {         return createdDocuments; }

 public handleMindMapAction(action, page) {         def msg; if (action=="view") {             msg = viewMindMapWiki(page); } else if (action=="update") {             msg = updateMindMapWiki(page); } else if (action=="delete") {             msg = deleteMindMapWiki(page); } else if (action=="updateMap") {             msg = updateMindMap(page, context.request.startPage, false); } else if (action=="updateMapRendered") {             msg = updateMindMap(page, context.request.startPage, true); } else {             msg = "mindmap.noaction"; }         return msg; }

 public findMindMapAttachment(page) {         def pagedoc = xwiki.getDocument(page); for (attach in pagedoc.attachmentList) {         if (attach.getFilename().endsWith(".mm")) return attach; }         return null; }

 public findMindMapWikiHomeURL(String xml) {         def reader = new SAXReader(); def domdoc = null;

 try {             domdoc = reader.read(new StringReader(xml)); } catch (DocumentException e) {             throw e; }         if (domdoc==null) return "mindmap.errorreadingmmxml";

 def docroot = domdoc.getRootElement(); def link = findMindMapHomeFromNode(docroot); return link; }          public findMindMapWikiHome(node) {             def link = findMindMapWikiHomeURL(node); if (link==null) return null; else {              return link.substring(link.lastIndexOf("/") + 1); }         }

 public viewMindMapWiki(page) {         def attach = findMindMapAttachment(page); if (attach==null) return "mindmap.notfound"; else {             def link = findMindMapWikiHomeURL(new String(attach.getContent())); if (link==null) return "mindmap.wikihomenotfound"; else {                 context.response.sendRedirect(link); return "mindmap.redirectdone"; }         } }

 public findMindMapWikiHomeFromPage(page) {         def attach = findMindMapAttachment(page); if (attach==null) return "mindmap.notfound"; else {             def wikiPage = findMindMapWikiHome(new String(attach.getContent())); if (wikiPage==null) return "mindmap.wikihomenotfound"; else {                 return wikiPage; }         } }

 public createMindMapWiki(page) {         def attach = findMindMapAttachment(page); if (attach==null) return "mindmap.notfound";

 createMindMapWikiFromAttachment(xwiki.getDocument(page), attach); return "mindmap.createdone"; }

 public updateMindMapWiki(page) {         def attach = findMindMapAttachment(page); if (attach==null) return "mindmap.notfound"; else {             deleteMindMapWiki(page); createMindMapWiki(page); }         return "mindmap.updatedone"; }

public deleteMindMapWiki(page) { def doc = xwiki.getDocument(page); def sql = ", BaseObject as obj, StringProperty as prop where doc.web='MindMap' and obj.name=doc.fullName and obj.className='MindMap.MindMapClass' and obj.id=prop.id.id and prop.id.name='MapName' and prop.value='$page'";

for(pagename in xwiki.searchDocuments(sql)) { def pagedoc = xwiki.getDocument(pagename); if (!pagedoc.isNew()) { pagedoc.delete(); deletedDocuments.add(pagename); } } def attach = findMindMapAttachment(page); def mmcontent = new String(attach.getContent()); def newmmcontent = mmcontent.replaceAll("LINK=
"/xwiki/(.?)
"(.
?>)","$2"); newmmcontent = newmmcontent.replaceAll("link=
"/xwiki/(.?)
"(.
?>)","$2"); attach.getAttachment().setContent(newmmcontent.getBytes()); if (!mmcontent.equals(newmmcontent)) { doc.getDocument().saveAttachmentContent(attach.getAttachment(), context.getContext()); } return "mindmap.deletedone"; }

public createMindMapWikiFromAttachment(doc, attachment) { def reader = new SAXReader(); def domdoc = null;

try { domdoc = reader.read(new StringReader(new String(attachment.getContent()))); } catch (DocumentException e) { throw e; } if (domdoc==null) return "mindmap.errorreadingmmxml";

def docroot = domdoc.getRootElement(); createMindMapWikiFromNode(doc, doc.getFullName(), docroot, 0); attachment.getAttachment().setContent(docroot.asXML().getBytes()); if (mmDirty) { // we need a priviledged API to modify the attachment content doc.getDocument().saveAttachmentContent(attachment.getAttachment(), context.getContext()); return "mindmap.mmupdated"; } }

public findMindMapHomeFromNode(node) { def el = node.elements("node"); def j = 0; while(j < el.size()) { def link = getAttr(el.get(j),"link"); if (link != null && link.matches("^/xwiki/.*")) { return link; } j++; } return null; }

public findMindMapWikiHomeFromNode(node) { def link = findMindMapHomeFromNode(node); if (link==null) return null; else { return link.substring(link.lastIndexOf("/") + 1); } }

public createMindMapWikiFromNode(mmDoc, parent, node, deph) { def el = node.elements("node"); def j = 0; def pages = new java.util.ArrayList(); while(j < el.size()) { def title = getAttr(el.get(j),"text"); title = (title!=null) ? title : el.get(j).attributeValue("text") title = (title==null) ? "notitle" : title.replaceAll(">>", ""); def text = title; def link = getAttr(el.get(j), "link"); link = (link!=null) ? link : el.get(j).attributeValue("link")

// cleaning up to generate a clean page name text = xwiki.clearName(text); text = text.replaceAll(">", ""); text = text.replaceAll("<", "");

if (text.size() > 80) { def i = text.substring(0,80).lastIndexOf(" ", 60); if (i==-1) text = text.substring(0, 80); else text = text.substring(0, i); }

// def tmpEl = el.get(j).elements("icon"); // if(tmpEl && tmpEl.size() > 0) // text = "aaa_" + text; def newDoc = null;

def pagename = xwiki.getUniquePageName(mmDoc.web, text); newDoc = xwiki.getDocument(mmDoc.web, pagename);

def desc = ""; def childWikiPages = new java.util.ArrayList(); /* if (nodeHasChild(el.get(j))) { if (link == null || link.length()==0) { el.get(j).addAttribute("link", xwiki.getURL(newDoc.getFullName(), "view")); mmDirty = true; } if ((!nodeHasChildWithLink(el.get(j)))&&nodeChildIsLastChild(el.get(j))) { desc = el.get(j).elements("node").get(0).attributeValue("text"); desc = (desc==null) ? "" : desc.replaceAll(">>", ""); } } */ if (link == null || link.length()==0) { el.get(j).addAttribute("link", xwiki.getURL(newDoc.getFullName(), "view")); mmDirty = true; } def desc2 = getTextChild(el.get(j)); if (desc2!=null) desc += "rnrn" + desc2; def icon = getIconChild(el.get(j));

//if (!nodeChildIsLastChild(el.get(j))) childWikiPages = createMindMapWikiFromNode(mmDoc, newDoc.getFullName(), el.get(j), deph + 1);

def content = renderNodeContent(el.get(j), 0, -1, childWikiPages, desc); newDoc.setContent(content); newDoc.setParent(parent); newDoc.setTitle(title); newDoc.newObject("MindMap.MindMapClass"); newDoc.use("MindMap.MindMapClass"); newDoc.set("mapname", mmDoc.getFullName()); newDoc.set("title", title); newDoc.set("text", desc); if (icon!=null) newDoc.set("icon", icon); newDoc.saveWithProgrammingRights(); createdDocuments.add(newDoc.getFullName()); pages.add(newDoc.getFullName()); j++; }

return pages; }

protected boolean nodeHasChild(node) { def el = node.elements("node"); def j = 0; if (!el || el.size() == 0) return false; return true; }

protected boolean nodeChildIsLastChild(node) { def el = node.elements("node"); def j = 0; if (!el || el.size() == 0 || el.size() > 1) { return false; } return !nodeHasChild(el.get(0)); }

protected String getTextChild(node) { def el = node.elements("hook"); if (el && el.size() > 0) { def el2 = el.get(0).elements("text"); if (el2 && el2.size() > 0) { return new String(el2.get(0).getText()); } } return null; }

protected String getIconChild(node) { def el = node.elements("icon"); if (el && el.size() > 0) { return getAttr(el.get(0), "builtin"); } return null; }

protected boolean nodeHasChildWithLink(node) { def el = node.elements("node"); def j = 0; while(j < el.size()) { def link = getAttr(el.get(j), "link"); if (link != null && link.length() > 0 && !link.matches("^/xwiki/.*")) { return true; } j++ } return false; } protected getAttr(el, name) { def val = el.attributeValue(name.toLowerCase()); if (val!=null) return val; else return el.attributeValue(name.toUpperCase()); }

protected String renderNodeContent(node, deph, maxDeph, childPages, desc) { if (deph == maxDeph) return ""; def title = getAttr(node, "text"); title = (title==null) ? "" : title.replaceAll(">",""); def link = getAttr(node, "link"); if (link == null || link.length() == 0 || link.matches("^/xwiki/.*")) link = "";

// adding variables to the velocity context def vcontext = context.getContext().get("vcontext"); vcontext.put("mmlink", link); vcontext.put("mmtitle", title); vcontext.put("mmnode", node); vcontext.put("mmdesc", desc); vcontext.put("mmchilds", childPages); def content = xwiki.getDocument("MindMap", "WikiPageTemplate").getRenderedContent() def navigate = xwiki.parseMessage("mindmap.navigatetoparent") def returntomindmap = xwiki.parseMessage("mindmap.returntomindmap") content += "rnrn${navigate} ${returntomindmap}"; return content; }

 protected boolean removeXWikiLinksFromNode(node) {         def el = node.elements("node"); def j = 0; boolean result = false; while(j < el.size()) {            def childNode = el.get(j); def link = getAttr(childNode, "link"); if (link != null && link.matches("^/xwiki/.*")) {                    childNode.remove(childNode.attribute("LINK")); result = true; }            link = childNode.attributeValue("link"); if (link != null && link.matches("^/xwiki/.*")) {                    childNode.remove(childNode.attribute("link")); result = true; }            result |= removeXWikiLinksFromNode(childNode); j++; }         return result; }

 protected generateXmlForChildNode(nodeName, xmlBuilder, rendered) {        def nodeDoc = xwiki.getDocument(nodeName) nodeDoc.use("MindMap.MindMapClass") def title = nodeDoc.getValue("title"); def text = nodeDoc.getValue("text"); def icon = nodeDoc.getValue("icon");

 if ((title==null)||(title=="")) title = nodeDoc.displayTitle;

 if (rendered) text = xwiki.getXMLEncoded(nodeDoc.getRenderedContent(text)); else text = xwiki.getXMLEncoded(text); xmlBuilder.node(link:xwiki.getURL(nodeName, "view"), text:title, id:nodeName) {           if ((text!=null)&&(text!="")) {           xmlBuilder.hook(name:"accessories/plugins/NodeNote.properties") {             xmlBuilder.text(text) }          } if ((icon!=null)&&(icon!="")) {            xmlBuilder.icon(BUILTIN:icon) {           } }         def sql = "select distinct doc.web, doc.name, doc.parent from XWikiDocument as doc where doc.parent='" + xwiki.sqlfilter(nodeName) + "'" def doclist = xwiki.search(sql) for(item in doclist) {            generateXmlForChildNode(item0 + "." + item1, xmlBuilder, rendered) }         } }

 protected updateMindMap(mmPage, startPage, rendered) {                def startDoc = xwiki.getDocument(startPage); if (startDoc.isNew()) return "mindmap.nostartpage" def mmDoc = xwiki.getDocument(mmPage);

 def attach = findMindMapAttachment(mmPage); if (attach==null) {             attach = new XWikiAttachment(mmDoc.getDocument(), "mindmap.mm") mmDoc.getDocument().getAttachmentList().add(attach) }

 def writer = new StringWriter() def xmlBuilder = new MarkupBuilder(writer) xmlBuilder.map() {           generateXmlForChildNode(startPage, xmlBuilder, rendered) } 

 def mmcontent = attach.content def newmmcontent = writer.toString() attach.getAttachment().setContent(newmmcontent.getBytes()); if (!mmcontent.equals(newmmcontent)) {           mmDoc.getDocument().saveAttachmentContent(attach.getAttachment(), context.getContext()); }         return "mindmap.updatemapdone" }

}

Tags:
     
This wiki is licensed under a Creative Commons 2.0 license
XWiki Enterprise 12.10.2 - Documentation