]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/dao/SlcExecutionDaoJcr.java
Improve JCR DAO
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.jcr / src / main / java / org / argeo / slc / jcr / dao / SlcExecutionDaoJcr.java
1 package org.argeo.slc.jcr.dao;
2
3 import java.util.ArrayList;
4 import java.util.Calendar;
5 import java.util.Date;
6 import java.util.GregorianCalendar;
7 import java.util.List;
8
9 import javax.jcr.Node;
10 import javax.jcr.NodeIterator;
11 import javax.jcr.RepositoryException;
12 import javax.jcr.Session;
13 import javax.jcr.Workspace;
14 import javax.jcr.query.Query;
15 import javax.jcr.query.QueryManager;
16 import javax.jcr.query.QueryResult;
17
18 import org.argeo.jcr.BeanNodeMapper;
19 import org.argeo.jcr.JcrUtils;
20 import org.argeo.slc.SlcException;
21 import org.argeo.slc.dao.process.SlcExecutionDao;
22 import org.argeo.slc.process.SlcExecution;
23 import org.argeo.slc.process.SlcExecutionStep;
24
25 public class SlcExecutionDaoJcr implements SlcExecutionDao {
26 private Session session;
27 private Workspace workspace;
28 private QueryManager queryManager;
29
30 private BeanNodeMapper beanNodeMapper = new BeanNodeMapper();
31
32 public void init() {
33 try {
34 workspace = session.getWorkspace();
35 queryManager = workspace.getQueryManager();
36 } catch (RepositoryException e) {
37 throw new SlcException("Cannot initialize DAO", e);
38 }
39 }
40
41 public void addSteps(String slcExecutionId,
42 List<SlcExecutionStep> additionalSteps) {
43 // TODO: optimize, do one single query
44 SlcExecution slcExecution = getSlcExecution(slcExecutionId);
45 slcExecution.getSteps().addAll(additionalSteps);
46 update(slcExecution);
47
48 }
49
50 public void create(SlcExecution slcExecution) {
51 try {
52 beanNodeMapper.save(getSession(), basePath(slcExecution),
53 slcExecution);
54 session.save();
55 } catch (Exception e) {
56 throw new SlcException("Cannot import " + slcExecution, e);
57 }
58 }
59
60 protected String basePath(SlcExecution slcExecution) {
61 Calendar cal = new GregorianCalendar();
62 cal.setTime(new Date());
63 // cal.setTime(slcExecution.getStartDate());
64 return "/slc/processes/" + slcExecution.getHost().replace('.', '/')
65 + '/' + JcrUtils.dateAsPath(cal) + "process";
66 }
67
68 public SlcExecution getSlcExecution(String uuid) {
69 try {
70 // TODO: optimize query
71 String queryString = "//process[@uuid='" + uuid + "']";
72 Query query = queryManager.createQuery(queryString, Query.XPATH);
73 Node node = JcrUtils.querySingleNode(query);
74 if (node == null)
75 return null;
76 return (SlcExecution) beanNodeMapper.nodeToBean(node);
77 } catch (Exception e) {
78 throw new SlcException("Cannot load SLC execution " + uuid, e);
79 }
80 }
81
82 public List<SlcExecution> listSlcExecutions() {
83 List<SlcExecution> res = new ArrayList<SlcExecution>();
84 // TODO: optimize query
85 String queryString = "//process";
86 try {
87 Query query = queryManager.createQuery(queryString, Query.XPATH);
88 QueryResult qr = query.execute();
89 NodeIterator iterator = qr.getNodes();
90 while (iterator.hasNext()) {
91 Node node = iterator.nextNode();
92 SlcExecution slcExecution = (SlcExecution) beanNodeMapper
93 .nodeToBean(node);
94 res.add(slcExecution);
95 }
96 return res;
97 } catch (Exception e) {
98 throw new SlcException("Cannot list SLC executions", e);
99 }
100 }
101
102 public void merge(SlcExecution slcExecution) {
103 throw new UnsupportedOperationException();
104 }
105
106 public void update(SlcExecution slcExecution) {
107 // TODO: optimize query
108 String queryString = "//process[@uuid='" + slcExecution.getUuid()
109 + "']";
110 try {
111 Query query = queryManager.createQuery(queryString, Query.XPATH);
112 Node node = JcrUtils.querySingleNode(query);
113 beanNodeMapper.update(node, slcExecution);
114 } catch (Exception e) {
115 throw new SlcException("Cannot update " + slcExecution, e);
116 }
117 }
118
119 public void setSession(Session session) {
120 this.session = session;
121 }
122
123 protected Session getSession() {
124 return session;
125 }
126
127 public void setBeanNodeMapper(BeanNodeMapper beanNodeMapper) {
128 this.beanNodeMapper = beanNodeMapper;
129 }
130
131 }