/* * Created on Dec 23, 2004 */ package org.openedit.links; import java.io.StringWriter; import java.io.Writer; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import com.openedit.OpenEditException; import com.openedit.page.Page; import com.openedit.util.FileUtils; import com.openedit.util.XmlUtil; /** * @author cburkey * */ public class XmlLinkLoader { protected XmlUtil fieldXmlUtil; public XmlUtil getXmlUtil() { if (fieldXmlUtil == null) { fieldXmlUtil = new XmlUtil(); } return fieldXmlUtil; } public void setXmlUtil(XmlUtil xmlUtil) { fieldXmlUtil = xmlUtil; } public LinkTree loadLinks(Page inPage, LinkTree inTree) throws OpenEditException { //take in this XML file and use it to sync up to root node and below if( inTree == null) { inTree = new LinkTree(); } Element root = getXmlUtil().getXml(inPage.getReader(),inPage.getCharacterEncoding()); readElementsInto(root, inTree, inPage); return inTree; } /** * @param inRoot * @param inTree * @throws OpenEditException */ protected void readElementsInto(Element element, LinkTree inTree, Page inPage) throws OpenEditException { for (Iterator iter = element.elementIterator("a"); iter.hasNext();) { Element child = (Element) iter.next(); String parentId = element.attributeValue("id"); Link link = readElement(child, inPage); inTree.addLink( parentId, link ); readElementsInto(child, inTree, inPage); } } protected Link readElement(Element element, Page inPage) throws OpenEditException { String id = element.attributeValue("id"); String userdata = element.attributeValue("userdata"); Link link = new Link(); link.setId(id); link.setUserData(userdata); link.setText(element.attributeValue("text")); String href = element.attributeValue("href"); href = inPage.getPageSettings().replaceProperty(href); link.setPath(href); link.setRedirectPath(element.attributeValue("redirectpath")); link.setAccessKey(element.attributeValue("accesskey")); link.setAutoLoadChildren(Boolean.parseBoolean(element.attributeValue("autoloadchildren"))); link.setConfirmText(element.attributeValue("confirm")); checkLink(element, link); return link; } protected void checkLink(Element inElement, Link inLink) throws OpenEditException { //may be overriden } /** * Returns the link information as an XML string in the specified encoding. * * @param inTree The link tree * @param inEncoding The encoding * * @return An XML document representing the link tree * * @throws Exception */ public String saveLinks(LinkTree inTree, String inEncoding) throws Exception { StringWriter out = new StringWriter(); saveLinks(inTree, out, inEncoding); return out.toString(); } public void saveLinks(LinkTree inTree, Writer inXmlOutput, String inEncoding) throws OpenEditException { Document doc = DocumentHelper.createDocument(); Element root = DocumentHelper.createElement("linktree"); // root.addAttribute("textprefix", inTree.getTextPrefix()); // root.addAttribute("textpostfix", inTree.getTextPostfix()); // root.addAttribute("linkprefix", inTree.getLinkPrefix()); // root.addAttribute("linkpostfix", inTree.getLinkPostfix()); if (inTree.getRootLink() != null) { readLinkInto(inTree.getRootLink(), root); } doc.setRootElement(root); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding(inEncoding); try { new XMLWriter(inXmlOutput, format).write(doc); } catch (Exception ex) { throw new OpenEditException(ex); } finally { FileUtils.safeClose(inXmlOutput); } } /** * @param inTree * @param inRoot */ private void readLinkInto(Link inLink, Element inElement) { Element element = inElement.addElement("a"); element.addAttribute("href", inLink.getHref()); element.addAttribute("userdata", inLink.getUserData()); element.addAttribute("id", inLink.getId()); element.addAttribute("text", inLink.getText()); element.addAttribute( "redirectpath", inLink.getRedirectPath()); if( inLink.isAutoLoadChildren()) { element.addAttribute( "autoloadchildren", "true"); } if (inLink.hasChildren()) { for (Iterator iter = inLink.getChildren().iterator(); iter.hasNext();) { Link link = (Link) iter.next(); readLinkInto(link, element); } } } }