+/*\r
+ * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>\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
+\r
package org.argeo.slc.jcr.dao;\r
\r
import java.util.ArrayList;\r
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
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
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
}\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
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
} 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
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
} 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
*/\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
// 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
}\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
\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
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
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