1
2
3
4
5
6
7 package ch.colabproject.colab.api.persistence.jpa.document;
8
9 import ch.colabproject.colab.api.exceptions.ColabMergeException;
10 import ch.colabproject.colab.api.model.document.AbstractResource;
11 import ch.colabproject.colab.api.model.document.Resource;
12 import ch.colabproject.colab.api.model.document.ResourceRef;
13 import java.util.List;
14 import java.util.stream.Collectors;
15 import javax.ejb.LocalBean;
16 import javax.ejb.Stateless;
17 import javax.persistence.EntityManager;
18 import javax.persistence.PersistenceContext;
19 import javax.persistence.TypedQuery;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23
24
25
26
27
28
29
30 @Stateless
31 @LocalBean
32 public class ResourceDao {
33
34
35 private static final Logger logger = LoggerFactory.getLogger(ResourceDao.class);
36
37
38
39
40 @PersistenceContext(unitName = "COLAB_PU")
41 private EntityManager em;
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 public AbstractResource findResourceOrRef(Long id) {
77 logger.trace("find abstract resource #{}", id);
78
79 return em.find(AbstractResource.class, id);
80 }
81
82
83
84
85
86
87
88
89 public List<ResourceRef> findDirectReferences(AbstractResource target) {
90 logger.trace("find the direct references of the target {}", target);
91
92 TypedQuery<ResourceRef> query = em.createNamedQuery("ResourceRef.findDirectReferences",
93 ResourceRef.class);
94
95 query.setParameter("targetId", target.getId());
96
97 return query.getResultList();
98 }
99
100
101
102
103
104
105
106
107 public List<ResourceRef> findAllReferences(AbstractResource target) {
108 logger.trace("find all references to the target {}", target);
109
110
111 List<ResourceRef> list = findDirectReferences(target);
112
113
114 list.addAll(list.stream().flatMap(res -> {
115 return findAllReferences(res).stream();
116 }).collect(Collectors.toList()));
117
118 return list;
119 }
120
121
122
123
124
125
126
127
128
129
130
131 public <T extends AbstractResource> T updateResourceOrRef(T resourceOrRef)
132 throws ColabMergeException {
133 logger.trace("update resource or ref {}", resourceOrRef);
134
135 @SuppressWarnings("unchecked")
136 T managedResource = (T) this.findResourceOrRef(resourceOrRef.getId());
137
138 managedResource.mergeToUpdate(resourceOrRef);
139
140 return managedResource;
141 }
142
143
144
145
146
147
148
149
150 public Resource persistResource(Resource resource) {
151 logger.trace("persist resource {}", resource);
152
153 em.persist(resource);
154
155 return resource;
156 }
157
158
159
160
161
162
163
164
165
166 public void deleteResourceOrRef(AbstractResource resourceOrRef) {
167 logger.trace("delete abstract resource {}", resourceOrRef);
168
169
170
171 em.remove(resourceOrRef);
172 }
173
174 }