Fix remove empty paragraphs.
[gpl/argeo-suite.git] / publishing / org.argeo.publishing.ui / src / org / argeo / docbook / DbkUtils.java
index 19f7cd40fd905dd46c543785e3d292cb655caf34..151bf10db690a0ae538e95ab061fc10d42996892 100644 (file)
@@ -3,13 +3,17 @@ package org.argeo.docbook;
 import static org.argeo.docbook.DbkType.para;
 
 import java.io.IOException;
 import static org.argeo.docbook.DbkType.para;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 
 import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 
+import javax.jcr.ImportUUIDBehavior;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
+import javax.jcr.PathNotFoundException;
 import javax.jcr.RepositoryException;
 import javax.jcr.RepositoryException;
+import javax.jcr.ValueFormatException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -51,6 +55,16 @@ public class DbkUtils {
                return Jcr.getName(node).equals(type.get());
        }
 
                return Jcr.getName(node).equals(type.get());
        }
 
+       /** Whether this node is a DocBook type. */
+       public static boolean isDbk(Node node) {
+               String name = Jcr.getName(node);
+               for (DbkType type : DbkType.values()) {
+                       if (name.equals(type.get()))
+                               return true;
+               }
+               return false;
+       }
+
        public static String getTitle(Node node) {
                return JcrxApi.getXmlValue(node, DbkType.title.get());
        }
        public static String getTitle(Node node) {
                return JcrxApi.getXmlValue(node, DbkType.title.get());
        }
@@ -94,13 +108,40 @@ public class DbkUtils {
                return p;
        }
 
                return p;
        }
 
-       public static Node insertImageAfter(Node sibling) {
+       /**
+        * Removes a paragraph if it empty. The sesison is not saved.
+        * 
+        * @return true if the paragraph was empty and it was removed
+        */
+       public static boolean removeIfEmptyParagraph(Node node) {
                try {
                try {
-
-                       // FIXME make it more robust
-                       if (DbkType.imagedata.get().equals(sibling.getName())) {
-                               sibling = sibling.getParent().getParent();
+                       if (isDbk(node, DbkType.para)) {
+                               NodeIterator nit = node.getNodes();
+                               if (!nit.hasNext()) {
+                                       node.remove();
+                                       return true;
+                               }
+                               Node first = nit.nextNode();
+                               if (nit.hasNext())
+                                       return false;
+                               if (first.getName().equals(Jcr.JCR_XMLTEXT)) {
+                                       String str = Jcr.get(first, Jcr.JCR_XMLCHARACTERS);
+                                       if (str != null && str.trim().equals("")) {
+                                               node.remove();
+                                               return true;
+                                       }
+                               } else {
+                                       return false;
+                               }
                        }
                        }
+                       return false;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot remove possibly empty paragraph", e);
+               }
+       }
+
+       public static Node insertImageAfter(Node sibling) {
+               try {
 
                        Node parent = sibling.getParent();
                        Node mediaNode = addDbk(parent, DbkType.mediaobject);
 
                        Node parent = sibling.getParent();
                        Node mediaNode = addDbk(parent, DbkType.mediaobject);
@@ -123,12 +164,52 @@ public class DbkUtils {
 //                     // TODO make it more robust and generic
 //                     String fileRef = mediaNode.getName();
 //                     imageDataNode.setProperty(DocBookNames.DBK_FILEREF, fileRef);
 //                     // TODO make it more robust and generic
 //                     String fileRef = mediaNode.getName();
 //                     imageDataNode.setProperty(DocBookNames.DBK_FILEREF, fileRef);
-                       return imageDataNode;
+                       return mediaNode;
                } catch (RepositoryException e) {
                        throw new JcrException("Cannot insert empty image after " + sibling, e);
                }
        }
 
                } catch (RepositoryException e) {
                        throw new JcrException("Cannot insert empty image after " + sibling, e);
                }
        }
 
+       public static Node insertVideoAfter(Node sibling) {
+               try {
+
+                       Node parent = sibling.getParent();
+                       Node mediaNode = addDbk(parent, DbkType.mediaobject);
+                       // TODO optimise?
+                       parent.orderBefore(mediaNode.getName() + "[" + mediaNode.getIndex() + "]",
+                                       sibling.getName() + "[" + sibling.getIndex() + "]");
+                       parent.orderBefore(sibling.getName() + "[" + sibling.getIndex() + "]",
+                                       mediaNode.getName() + "[" + mediaNode.getIndex() + "]");
+
+                       Node videoNode = addDbk(mediaNode, DbkType.videoobject);
+                       Node videoDataNode = addDbk(videoNode, DbkType.videodata);
+                       return mediaNode;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot insert empty image after " + sibling, e);
+               }
+       }
+
+       public static String getMediaFileref(Node node) {
+               try {
+                       Node mediadata;
+                       if (node.hasNode(DbkType.imageobject.get())) {
+                               mediadata = node.getNode(DbkType.imageobject.get()).getNode(DbkType.imagedata.get());
+                       } else if (node.hasNode(DbkType.videoobject.get())) {
+                               mediadata = node.getNode(DbkType.videoobject.get()).getNode(DbkType.videodata.get());
+                       } else {
+                               throw new IllegalArgumentException("Fileref not found in " + node);
+                       }
+
+                       if (mediadata.hasProperty(DbkAttr.fileref.name())) {
+                               return mediadata.getProperty(DbkAttr.fileref.name()).getString();
+                       } else {
+                               return null;
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot retrieve file ref from " + node, e);
+               }
+       }
+
        public static void exportXml(Node node, OutputStream out) throws IOException {
                try {
                        node.getSession().exportDocumentView(node.getPath(), out, false, false);
        public static void exportXml(Node node, OutputStream out) throws IOException {
                try {
                        node.getSession().exportDocumentView(node.getPath(), out, false, false);
@@ -156,6 +237,16 @@ public class DbkUtils {
                }
        }
 
                }
        }
 
+       public static void importXml(Node baseNode, InputStream in) throws IOException {
+               try {
+                       baseNode.getSession().importXML(baseNode.getPath(), in,
+                                       ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot import XML to " + baseNode, e);
+               }
+
+       }
+
        /** Singleton. */
        private DbkUtils() {
        }
        /** Singleton. */
        private DbkUtils() {
        }