Improve JCR mapper
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jackrabbit / src / main / java / org / argeo / jcr / JcrUtils.java
index 274d149dcd8c3d5dc1a39f843bf73423f2981e90..91ca780b132b6d2eccaeb784e41f3340b2be4020 100644 (file)
@@ -10,6 +10,8 @@ import javax.jcr.PropertyIterator;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Value;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryResult;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -18,6 +20,25 @@ import org.argeo.ArgeoException;
 public class JcrUtils {
        private final static Log log = LogFactory.getLog(JcrUtils.class);
 
+       public static Node querySingleNode(Query query) {
+               NodeIterator nodeIterator;
+               try {
+                       QueryResult queryResult = query.execute();
+                       nodeIterator = queryResult.getNodes();
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot execute query " + query, e);
+               }
+               Node node;
+               if (nodeIterator.hasNext())
+                       node = nodeIterator.nextNode();
+               else
+                       return null;
+
+               if (nodeIterator.hasNext())
+                       throw new ArgeoException("Query returned more than one node.");
+               return node;
+       }
+
        public static String parentPath(String path) {
                if (path.equals("/"))
                        throw new ArgeoException("Root path '/' has no parent path");