X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.jcr%2Fsrc%2Forg%2Fargeo%2Fjcr%2FJcrUtils.java;h=416d035f8b5925555e421c46ede06e21e85dd231;hb=2afabd9e7b225f80b341063e25188314394c9aef;hp=158b52a8f270ace93b58e8e1a4083a686d94cdbf;hpb=1d5ef69cc76d286d59de4f02d90196ca52cbe0f3;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.jcr/src/org/argeo/jcr/JcrUtils.java b/org.argeo.jcr/src/org/argeo/jcr/JcrUtils.java index 158b52a8f..416d035f8 100644 --- a/org.argeo.jcr/src/org/argeo/jcr/JcrUtils.java +++ b/org.argeo.jcr/src/org/argeo/jcr/JcrUtils.java @@ -86,8 +86,7 @@ public class JcrUtils { * Queries one single node. * * @return one single node or null if none was found - * @throws ArgeoJcrException - * if more than one node was found + * @throws ArgeoJcrException if more than one node was found */ public static Node querySingleNode(Query query) { NodeIterator nodeIterator; @@ -236,10 +235,8 @@ public class JcrUtils { /** * The provided data as a path ('/' at the end, not the beginning) * - * @param cal - * the date - * @param addHour - * whether to add hour as well + * @param cal the date + * @param addHour whether to add hour as well */ public static String dateAsPath(Calendar cal, Boolean addHour) { StringBuffer buf = new StringBuffer(14); @@ -363,6 +360,15 @@ public class JcrUtils { } } + /** Concisely get the path of the given node. */ + public static String getPath(Node node) { + try { + return node.getPath(); + } catch (RepositoryException e) { + throw new ArgeoJcrException("Cannot get path of " + node, e); + } + } + /** Concisely get the boolean value of a property */ public static Boolean check(Node node, String propertyName) { try { @@ -395,8 +401,7 @@ public class JcrUtils { /** * Create sub nodes relative to a parent node * - * @param nodeType - * the type of the leaf node + * @param nodeType the type of the leaf node */ public static Node mkdirs(Node parentNode, String relativePath, String nodeType) { return mkdirs(parentNode, relativePath, nodeType, null); @@ -405,8 +410,7 @@ public class JcrUtils { /** * Create sub nodes relative to a parent node * - * @param nodeType - * the type of the leaf node + * @param nodeType the type of the leaf node */ public static Node mkdirs(Node parentNode, String relativePath, String nodeType, String intermediaryNodeType) { List tokens = tokenize(relativePath); @@ -457,8 +461,7 @@ public class JcrUtils { } /** - * @param type - * the type of the leaf node + * @param type the type of the leaf node */ public static Node mkdirs(Session session, String path, String type) { return mkdirs(session, path, type, null, false); @@ -988,16 +991,26 @@ public class JcrUtils { /** Writes a {@link Binary} from a byte array */ public static void setBinaryAsBytes(Node node, String property, byte[] bytes) { - // InputStream in = null; Binary binary = null; try (InputStream in = new ByteArrayInputStream(bytes)) { - // in = new ByteArrayInputStream(bytes); binary = node.getSession().getValueFactory().createBinary(in); node.setProperty(property, binary); } catch (Exception e) { - throw new ArgeoJcrException("Cannot read binary " + property + " as bytes", e); + throw new ArgeoJcrException("Cannot set binary " + property + " as bytes", e); + } finally { + closeQuietly(binary); + } + } + + /** Writes a {@link Binary} from a byte array */ + public static void setBinaryAsBytes(Property prop, byte[] bytes) { + Binary binary = null; + try (InputStream in = new ByteArrayInputStream(bytes)) { + binary = prop.getSession().getValueFactory().createBinary(in); + prop.setValue(binary); + } catch (RepositoryException | IOException e) { + throw new ArgeoJcrException("Cannot set binary " + prop + " as bytes", e); } finally { - // IOUtils.closeQuietly(in); closeQuietly(binary); } } @@ -1071,15 +1084,19 @@ public class JcrUtils { } } - /** Logs out the session, not throwing any exception, even if it is null. */ + /** + * Logs out the session, not throwing any exception, even if it is null. + * {@link Jcr#logout(Session)} should rather be used. + */ public static void logoutQuietly(Session session) { - try { - if (session != null) - if (session.isLive()) - session.logout(); - } catch (Exception e) { - // silent - } + Jcr.logout(session); +// try { +// if (session != null) +// if (session.isLive()) +// session.logout(); +// } catch (Exception e) { +// // silent +// } } /** @@ -1157,10 +1174,8 @@ public class JcrUtils { /** * Update lastModified recursively until this parent. * - * @param node - * the node - * @param untilPath - * the base path, null is equivalent to "/" + * @param node the node + * @param untilPath the base path, null is equivalent to "/" */ public static void updateLastModifiedAndParents(Node node, String untilPath) { try { @@ -1293,23 +1308,30 @@ public class JcrUtils { return true; } - /** Gets access control list for this path, throws exception if not found */ + /** + * Gets the first available access control list for this path, throws exception + * if not found + */ public synchronized static AccessControlList getAccessControlList(AccessControlManager acm, String path) throws RepositoryException { // search for an access control list AccessControlList acl = null; AccessControlPolicyIterator policyIterator = acm.getApplicablePolicies(path); - if (policyIterator.hasNext()) { + applicablePolicies: if (policyIterator.hasNext()) { while (policyIterator.hasNext()) { AccessControlPolicy acp = policyIterator.nextAccessControlPolicy(); - if (acp instanceof AccessControlList) + if (acp instanceof AccessControlList) { acl = ((AccessControlList) acp); + break applicablePolicies; + } } } else { AccessControlPolicy[] existingPolicies = acm.getPolicies(path); - for (AccessControlPolicy acp : existingPolicies) { - if (acp instanceof AccessControlList) + existingPolicies: for (AccessControlPolicy acp : existingPolicies) { + if (acp instanceof AccessControlList) { acl = ((AccessControlList) acp); + break existingPolicies; + } } } if (acl != null) @@ -1347,8 +1369,8 @@ public class JcrUtils { * Copy only nt:folder and nt:file, without their additional types and * properties. * - * @param recursive - * if true copies folders as well, otherwise only first level files + * @param recursive if true copies folders as well, otherwise only first level + * files * @return how many files were copied */ public static Long copyFiles(Node fromNode, Node toNode, Boolean recursive, JcrMonitor monitor, boolean onlyAdd) { @@ -1482,7 +1504,7 @@ public class JcrUtils { contentNode = fileNode.getNode(Node.JCR_CONTENT); } else { fileNode = folderNode.addNode(fileName, NodeType.NT_FILE); - contentNode = fileNode.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE); + contentNode = fileNode.addNode(Node.JCR_CONTENT, NodeType.NT_UNSTRUCTURED); } binary = contentNode.getSession().getValueFactory().createBinary(in); contentNode.setProperty(Property.JCR_DATA, binary); @@ -1494,6 +1516,11 @@ public class JcrUtils { } } + /** Read an an nt:file as an {@link InputStream}. */ + public static InputStream getFileAsStream(Node fileNode) throws RepositoryException { + return fileNode.getNode(Node.JCR_CONTENT).getProperty(Property.JCR_DATA).getBinary().getStream(); + } + /** * Computes the checksum of an nt:file. * @@ -1501,14 +1528,11 @@ public class JcrUtils { */ @Deprecated public static String checksumFile(Node fileNode, String algorithm) { - Binary data = null; try (InputStream in = fileNode.getNode(Node.JCR_CONTENT).getProperty(Property.JCR_DATA).getBinary() .getStream()) { return digest(algorithm, in); } catch (RepositoryException | IOException e) { throw new ArgeoJcrException("Cannot checksum file " + fileNode, e); - } finally { - closeQuietly(data); } }