package org.argeo.docbook.ui; import javax.jcr.Item; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.RepositoryException; import org.argeo.cms.CmsException; import org.argeo.cms.text.TextInterpreter; /** Based on HTML with a few Wiki-like shortcuts. */ public class DbkTextInterpreter implements TextInterpreter { @Override public void write(Item item, String content) { try { if (item instanceof Node) { Node node = (Node) item; if (node.isNodeType(DocBookTypes.PARA)) { String raw = convertToStorage(node, content); validateBeforeStoring(raw); Node jcrText; if (!node.hasNode(DocBookNames.JCR_XMLTEXT)) jcrText = node.addNode(DocBookNames.JCR_XMLTEXT, DocBookTypes.XMLTEXT); else jcrText = node.getNode(DocBookNames.JCR_XMLTEXT); jcrText.setProperty(DocBookNames.JCR_XMLCHARACTERS, raw); } else { throw new CmsException("Don't know how to interpret " + node); } } else {// property Property property = (Property) item; property.setValue(content); } // item.getSession().save(); } catch (RepositoryException e) { throw new CmsException("Cannot set content on " + item, e); } } @Override public String read(Item item) { try { String raw = raw(item); return convertFromStorage(item, raw); } catch (RepositoryException e) { throw new CmsException("Cannot get " + item + " for edit", e); } } @Override public String raw(Item item) { try { item.getSession().refresh(true); if (item instanceof Node) { Node node = (Node) item; if (node.isNodeType(DocBookTypes.PARA)) { Node jcrText = node.getNode(DocBookNames.JCR_XMLTEXT); String txt = jcrText.getProperty(DocBookNames.JCR_XMLCHARACTERS).getString(); // TODO make it more robust txt = txt.replace("\n", "").replace("\t", ""); return txt; } else { throw new CmsException("Don't know how to interpret " + node); } } else {// property Property property = (Property) item; return property.getString(); } } catch (RepositoryException e) { throw new CmsException("Cannot get " + item + " content", e); } } // EXTENSIBILITY /** * To be overridden, in order to make sure that only valid strings are being * stored. */ protected void validateBeforeStoring(String raw) { } /** To be overridden, in order to support additional formatting. */ protected String convertToStorage(Item item, String content) throws RepositoryException { return content; } /** To be overridden, in order to support additional formatting. */ protected String convertFromStorage(Item item, String content) throws RepositoryException { return content; } }