X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=org.argeo.maintenance%2Fsrc%2Forg%2Fargeo%2Fmaintenance%2Fbackup%2FBackupContentHandler.java;h=ef83c1ff9f0f393253d9768be790fd131fd99f4f;hb=46cc2039ac20703c484aa994b830a2da113f2c97;hp=099323833dfe6da23fdfc07a641428ccbf5d15d6;hpb=9e5ea515aa9a855645c9d20c478c14770264a5cb;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.maintenance/src/org/argeo/maintenance/backup/BackupContentHandler.java b/org.argeo.maintenance/src/org/argeo/maintenance/backup/BackupContentHandler.java index 099323833..ef83c1ff9 100644 --- a/org.argeo.maintenance/src/org/argeo/maintenance/backup/BackupContentHandler.java +++ b/org.argeo.maintenance/src/org/argeo/maintenance/backup/BackupContentHandler.java @@ -3,22 +3,28 @@ package org.argeo.maintenance.backup; import java.io.IOException; import java.io.InputStream; import java.io.Writer; +import java.util.Arrays; import java.util.Base64; import java.util.Set; import java.util.TreeSet; import javax.jcr.Binary; +import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.apache.commons.io.IOUtils; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; +/** XML handler serialising a JCR system view. */ public class BackupContentHandler extends DefaultHandler { final static int MAX_DEPTH = 1024; final static String SV_NAMESPACE_URI = "http://www.jcp.org/jcr/sv/1.0"; + final static String SV_PREFIX = "sv"; // elements final static String NODE = "node"; final static String PROPERTY = "property"; @@ -36,10 +42,17 @@ public class BackupContentHandler extends DefaultHandler { private Session session; private Set contentPaths = new TreeSet<>(); - public BackupContentHandler(Writer out, Session session) { + boolean prettyPrint = true; + + private final String parentPath; + +// private boolean inSystem = false; + + public BackupContentHandler(Writer out, Node node) { super(); this.out = out; - this.session = session; + this.session = Jcr.getSession(node); + parentPath = Jcr.getParentPath(node); } private int currentDepth = -1; @@ -70,15 +83,33 @@ public class BackupContentHandler extends DefaultHandler { if (isNode) { String nodeName = attributes.getValue(SV_NAMESPACE_URI, NAME); currentDepth = currentDepth + 1; - if (currentDepth > 0) - currentPath[currentDepth - 1] = nodeName; +// if (currentDepth >= 0) + currentPath[currentDepth] = nodeName; // System.out.println(getCurrentPath() + " , depth=" + currentDepth); +// if ("jcr:system".equals(nodeName)) { +// inSystem = true; +// } } +// if (inSystem) +// return; if (SV_NAMESPACE_URI.equals(uri)) try { + if (prettyPrint) { + if (isNode) { + out.write(spaces()); + out.write("\n"); + out.write(spaces()); + } else if (isProperty) + out.write(spaces()); + else if (currentPropertyIsMultiple) + out.write(spaces()); + } + out.write("<"); - out.write(localName); + out.write(SV_PREFIX + ":" + localName); if (isProperty) currentPropertyIsMultiple = false; // always reset for (int i = 0; i < attributes.getLength(); i++) { @@ -87,7 +118,7 @@ public class BackupContentHandler extends DefaultHandler { String attrName = attributes.getLocalName(i); String attrValue = attributes.getValue(i); out.write(" "); - out.write(attrName); + out.write(SV_PREFIX + ":" + attrName); out.write("="); out.write("\""); out.write(attrValue); @@ -98,9 +129,9 @@ public class BackupContentHandler extends DefaultHandler { else if (TYPE.equals(attrName)) { if (BINARY.equals(attrValue)) { if (JCR_CONTENT.equals(getCurrentName())) { - contentPaths.add(getCurrentPath()); + contentPaths.add(getCurrentJcrPath()); } else { - Binary binary = session.getNode(getCurrentPath()).getProperty(attrName) + Binary binary = session.getNode(getCurrentJcrPath()).getProperty(attrName) .getBinary(); try (InputStream in = binary.getStream()) { currentEncoded = base64encore.encodeToString(IOUtils.toByteArray(in)); @@ -113,29 +144,52 @@ public class BackupContentHandler extends DefaultHandler { } } } - if (currentDepth == 0) { - out.write(" xmlns=\"" + SV_NAMESPACE_URI + "\""); + if (isNode && currentDepth == 0) { + // out.write(" xmlns=\"" + SV_NAMESPACE_URI + "\""); + out.write(" xmlns:" + SV_PREFIX + "=\"" + SV_NAMESPACE_URI + "\""); } out.write(">"); - if (isNode) - out.write("\n"); - else if (isProperty && currentPropertyIsMultiple) - out.write("\n"); - } catch (IOException | RepositoryException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + + if (prettyPrint) + if (isNode) + out.write("\n"); + else if (isProperty && currentPropertyIsMultiple) + out.write("\n"); + } catch (IOException e) { + throw new RuntimeException(e); + } catch (RepositoryException e) { + throw new JcrException(e); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { - if (localName.equals(NODE)) { + boolean isNode = localName.equals(NODE); + boolean isValue = localName.equals(VALUE); + if (prettyPrint) + if (!isValue) + try { + if (isNode || currentPropertyIsMultiple) + out.write(spaces()); + } catch (IOException e1) { + throw new RuntimeException(e1); + } + if (isNode) { // System.out.println("endElement " + getCurrentPath() + " , depth=" + currentDepth); - if (currentDepth > 0) - currentPath[currentDepth - 1] = null; +// if (currentDepth > 0) + currentPath[currentDepth] = null; currentDepth = currentDepth - 1; +// if (inSystem) { +// // System.out.println("Skip " + getCurrentPath()+" , +// // currentDepth="+currentDepth); +// if (currentDepth == 0) { +// inSystem = false; +// return; +// } +// } } - boolean isValue = localName.equals(VALUE); +// if (inSystem) +// return; if (SV_NAMESPACE_URI.equals(uri)) try { if (isValue && currentEncoded != null) { @@ -143,44 +197,54 @@ public class BackupContentHandler extends DefaultHandler { } currentEncoded = null; out.write(""); - if (!isValue) - out.write("\n"); - else { - if (currentPropertyIsMultiple) + if (prettyPrint) + if (!isValue) out.write("\n"); - } + else { + if (currentPropertyIsMultiple) + out.write("\n"); + } + if (currentDepth == 0) + out.flush(); } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + throw new RuntimeException(e); } + + } + + private char[] spaces() { + char[] arr = new char[currentDepth]; + Arrays.fill(arr, ' '); + return arr; } @Override public void characters(char[] ch, int start, int length) throws SAXException { +// if (inSystem) +// return; try { out.write(ch, start, length); } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + throw new RuntimeException(e); } } protected String getCurrentName() { assert currentDepth >= 0; - if (currentDepth == 0) - return "jcr:root"; - return currentPath[currentDepth - 1]; +// if (currentDepth == 0) +// return "jcr:root"; + return currentPath[currentDepth]; } - protected String getCurrentPath() { - if (currentDepth == 0) - return "/"; - StringBuilder sb = new StringBuilder("/"); - for (int i = 0; i < currentDepth; i++) { - if (i != 0) - sb.append('/'); + protected String getCurrentJcrPath() { +// if (currentDepth == 0) +// return "/"; + StringBuilder sb = new StringBuilder(parentPath.equals("/") ? "" : parentPath); + for (int i = 0; i <= currentDepth; i++) { +// if (i != 0) + sb.append('/'); sb.append(currentPath[i]); } return sb.toString(); @@ -190,6 +254,4 @@ public class BackupContentHandler extends DefaultHandler { return contentPaths; } - - }