]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/dao/TreeTestResultDaoJcr.java
Adapt to changes in Argeo Commons
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.jcr / src / main / java / org / argeo / slc / jcr / dao / TreeTestResultDaoJcr.java
index 61a5b757369d99da03de5db8f6245f66cac9d269..154c3c7bc96bf224ffdebe26e933add58eff3e5c 100644 (file)
@@ -1,3 +1,18 @@
+/*\r
+ * Copyright (C) 2007-2012 Mathieu Baudier\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *         http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
 package org.argeo.slc.jcr.dao;\r
 \r
 import java.util.ArrayList;\r
@@ -6,12 +21,12 @@ import java.util.Date;
 import java.util.GregorianCalendar;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.SortedMap;\r
 \r
 import javax.jcr.Node;\r
 import javax.jcr.NodeIterator;\r
 import javax.jcr.RepositoryException;\r
 import javax.jcr.Session;\r
-import javax.jcr.Workspace;\r
 import javax.jcr.query.Query;\r
 import javax.jcr.query.QueryManager;\r
 import javax.jcr.query.QueryResult;\r
@@ -19,7 +34,6 @@ import javax.jcr.query.QueryResult;
 import org.apache.commons.logging.Log;\r
 import org.apache.commons.logging.LogFactory;\r
 import org.argeo.jcr.JcrUtils;\r
-import org.argeo.jcr.NodeMapper;\r
 import org.argeo.slc.SlcException;\r
 import org.argeo.slc.core.attachment.SimpleAttachment;\r
 import org.argeo.slc.core.structure.tree.TreeSPath;\r
@@ -41,35 +55,16 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
        private final static Log log = LogFactory\r
                        .getLog(TreeTestResultDaoJcr.class);\r
 \r
-       private Workspace workspace;\r
-       private QueryManager queryManager;\r
-       private NodeMapper nodeMapper;\r
-\r
-       \r
-       public TreeTestResultDaoJcr() {\r
-       }\r
-\r
-       public void init() {\r
-               try {\r
-                       workspace = getSession().getWorkspace();\r
-                       queryManager = workspace.getQueryManager();\r
-                       nodeMapper = getNodeMapperProvider().findNodeMapper(null);\r
-               } catch (RepositoryException e) {\r
-                       throw new SlcException("Cannot initialize DAO", e);\r
-               }\r
-       }\r
-\r
-       public void create(TestResult testResult) {\r
+       public synchronized void create(TestResult testResult) {\r
                try {\r
                        nodeMapper.save(getSession(), basePath(testResult), testResult);\r
                        getSession().save();\r
-                       //JcrUtils.debug(getSession().getRootNode());\r
                } catch (Exception e) {\r
                        throw new SlcException("Cannot create testResult " + testResult, e);\r
                }\r
        }\r
 \r
-       public void update(TestResult testResult) {\r
+       public synchronized void update(TestResult testResult) {\r
                try {\r
                        nodeMapper.save(getSession(), basePath(testResult), testResult);\r
                        getSession().save();\r
@@ -79,18 +74,12 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
        }\r
 \r
        public TreeTestResult getTestResult(String uuid) {\r
-\r
-               try {\r
-                       String queryString = "//testresult[@uuid='" + uuid + "']";\r
-                       Query query = queryManager.createQuery(queryString, Query.XPATH);\r
-                       Node node = JcrUtils.querySingleNode(query);\r
-                       if (node == null)\r
-                               return null;\r
-                       return (TreeTestResult) nodeMapper.load(node);\r
-\r
-               } catch (Exception e) {\r
-                       throw new SlcException("Cannot load TestResult with ID " + uuid, e);\r
-               }\r
+               String queryString = "//testresult[@uuid='" + uuid + "']";\r
+               Query query = createQuery(queryString, Query.XPATH);\r
+               Node node = JcrUtils.querySingleNode(query);\r
+               if (node == null)\r
+                       return null;\r
+               return (TreeTestResult) nodeMapper.load(node);\r
 \r
        }\r
 \r
@@ -98,7 +87,7 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
                try {\r
                        // TODO: optimize query\r
                        String queryString = "//testresult";\r
-                       Query query = queryManager.createQuery(queryString, Query.XPATH);\r
+                       Query query = createQuery(queryString, Query.XPATH);\r
                        QueryResult queryResult = query.execute();\r
                        NodeIterator nodeIterator = queryResult.getNodes();\r
                        if (nodeIterator.hasNext()) {\r
@@ -116,7 +105,7 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
                        } else\r
                                return null;\r
 \r
-               } catch (Exception e) {\r
+               } catch (RepositoryException e) {\r
                        throw new SlcException("Cannot load list of TestResult ", e);\r
                }\r
        }\r
@@ -125,7 +114,7 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
                try {\r
                        // TODO: optimize query\r
                        String queryString = "//testresult" + path.getAsUniqueString();\r
-                       Query query = queryManager.createQuery(queryString, Query.XPATH);\r
+                       Query query = createQuery(queryString, Query.XPATH);\r
                        QueryResult queryResult = query.execute();\r
                        NodeIterator nodeIterator = queryResult.getNodes();\r
                        if (nodeIterator.hasNext()) {\r
@@ -138,22 +127,27 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
                        } else\r
                                return null;\r
 \r
-               } catch (Exception e) {\r
+               } catch (RepositoryException e) {\r
                        throw new SlcException("Cannot load list of TestResult ", e);\r
                }\r
        }\r
 \r
-       public void close(final String testResultId, final Date closeDate) {\r
+       public synchronized void close(final String testResultId,\r
+                       final Date closeDate) {\r
                try {\r
                        // TODO: optimize query\r
-                       String queryString = "//testresult[@uiid='" + testResultId + "']";\r
-                       Query query = queryManager.createQuery(queryString, Query.XPATH);\r
+                       String queryString = "//testresult[@uuid='" + testResultId + "']";\r
+                       Query query = createQuery(queryString, Query.XPATH);\r
                        Node resNode = JcrUtils.querySingleNode(query);\r
                        Calendar cal = new GregorianCalendar();\r
                        cal.setTime(closeDate);\r
-                       resNode.setProperty("closeDate", cal);\r
+                       if (resNode != null)\r
+                               resNode.setProperty("closeDate", cal);\r
+                       else if (log.isDebugEnabled())\r
+                               log.debug("Cannot close because a node for test result # "\r
+                                               + testResultId + " was not found");\r
                        getSession().save();\r
-               } catch (Exception e) {\r
+               } catch (RepositoryException e) {\r
                        throw new SlcException("Cannot close TestResult " + testResultId, e);\r
                }\r
 \r
@@ -168,14 +162,14 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
         */\r
        // TODO do we load objects, do treatment and persist them or do we work\r
        // directly in JCR\r
-       public void addResultPart(final String testResultId, final TreeSPath path,\r
-                       final SimpleResultPart resultPart,\r
+       public synchronized void addResultPart(final String testResultId,\r
+                       final TreeSPath path, final SimpleResultPart resultPart,\r
                        final Map<TreeSPath, StructureElement> relatedElements) {\r
 \r
                try {\r
                        // TODO: optimize query\r
-                       String queryString = "//*[@uuid='" + testResultId + "']";\r
-                       Query query = queryManager.createQuery(queryString, Query.XPATH);\r
+                       String queryString = "//testresult[@uuid='" + testResultId + "']";\r
+                       Query query = createQuery(queryString, Query.XPATH);\r
                        Node resNode = JcrUtils.querySingleNode(query);\r
 \r
                        Node curNode;\r
@@ -225,9 +219,41 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
                                        // We add the tags\r
                                        Map<String, String> tags = relatedElements.get(key)\r
                                                        .getTags();\r
+\r
                                        for (String tag : tags.keySet()) {\r
-                                               curNode.setProperty(tag, tags.get(tag));\r
+                                               NodeIterator tagIt = curNode.getNodes("tag");\r
+                                               Node tagNode = null;\r
+                                               while (tagIt.hasNext()) {\r
+                                                       Node n = tagIt.nextNode();\r
+                                                       if (n.getProperty("name").getString().equals(tag)) {\r
+                                                               tagNode = n;\r
+                                                       }\r
+                                               }\r
+\r
+                                               if (tagNode == null) {\r
+                                                       tagNode = curNode.addNode("tag");\r
+                                                       tagNode.setProperty("name", tag);\r
+                                               }\r
+\r
+                                               tagNode.setProperty("value", tags.get(tag));\r
+\r
+                                               // remove forbidden characters\r
+                                               // String cleanTag =\r
+                                               // JcrUtils.removeForbiddenCharacters(tag);\r
+                                               // if (!cleanTag.equals(tag))\r
+                                               // log.warn("Tag '" + tag + "' persisted as '" +\r
+                                               // cleanTag\r
+                                               // + "'");\r
+                                               // childNode.setProperty(cleanTag, tags.get(tag));\r
                                        }\r
+                                       // for (String tag : tags.keySet()) {\r
+                                       // String cleanTag = JcrUtils\r
+                                       // .removeForbiddenCharacters(tag);\r
+                                       // if (!cleanTag.equals(tag))\r
+                                       // log.warn("Tag '" + tag + "' persisted as '"\r
+                                       // + cleanTag + "'");\r
+                                       // curNode.setProperty(cleanTag, tags.get(tag));\r
+                                       // }\r
 \r
                                        // We set the class in order to be able to retrieve\r
                                        curNode.setProperty("class", StructureElement.class\r
@@ -236,12 +262,12 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
                        }\r
                        getSession().save();\r
 \r
-               } catch (Exception e) {\r
+               } catch (RepositoryException e) {\r
                        throw new SlcException("Cannot add resultPart", e);\r
                }\r
        }\r
 \r
-       public void addAttachment(final String testResultId,\r
+       public synchronized void addAttachment(final String testResultId,\r
                        final SimpleAttachment attachment) {\r
 \r
                try {\r
@@ -252,11 +278,11 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
 \r
                        // Check if attachment already exists\r
                        String queryString = "//testresult[@uuid='" + testResultId + "']";\r
-                       Query query = queryManager.createQuery(queryString, Query.XPATH);\r
+                       Query query = createQuery(queryString, Query.XPATH);\r
                        Node resNode = JcrUtils.querySingleNode(query);\r
 \r
                        queryString = ".//*[@uuid='" + attachment.getUuid() + "']";\r
-                       query = queryManager.createQuery(queryString, Query.XPATH);\r
+                       query = createQuery(queryString, Query.XPATH);\r
                        Node atNode = JcrUtils.querySingleNode(query);\r
 \r
                        if (atNode != null) {\r
@@ -276,7 +302,7 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
                                getSession().save();\r
                        }\r
 \r
-               } catch (Exception e) {\r
+               } catch (RepositoryException e) {\r
                        throw new SlcException("Cannot Add Attachment to " + testResultId,\r
                                        e);\r
                }\r
@@ -293,30 +319,28 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
                                return null;\r
                        return (TreeTestResult) nodeMapper.load(node);\r
 \r
-               } catch (Exception e) {\r
+               } catch (RepositoryException e) {\r
                        throw new SlcException("Cannot load TestResult with ID "\r
                                        + testResultId + " For Session " + session, e);\r
                }\r
        }\r
 \r
-       public void updateAttributes(final String testResultId,\r
-                       final Map<String, String> attributes) {\r
+       public synchronized void updateAttributes(final String testResultId,\r
+                       final SortedMap<String, String> attributes) {\r
                try {\r
                        String queryString = "//testresult[@uuid='" + testResultId + "']";\r
-                       Query query = queryManager.createQuery(queryString, Query.XPATH);\r
+                       Query query = createQuery(queryString, Query.XPATH);\r
                        Node node = JcrUtils.querySingleNode(query);\r
 \r
-                       for (String key: attributes.keySet()){\r
-                                       node.setProperty(key, attributes.get(key));\r
+                       for (String key : attributes.keySet()) {\r
+                               node.setProperty(key, attributes.get(key));\r
                        }\r
                        getSession().save();\r
-               } catch (Exception e) {\r
-                       throw new SlcException("Cannot update Attributes on TestResult with ID "\r
-                                       + testResultId , e);\r
+               } catch (RepositoryException e) {\r
+                       throw new SlcException(\r
+                                       "Cannot update Attributes on TestResult with ID "\r
+                                                       + testResultId, e);\r
                }\r
        }\r
 \r
-       \r
-       \r
-\r
 }\r