1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.persistence.jpa.dao;
20
21 import java.util.Collection;
22 import java.util.List;
23 import java.util.Objects;
24 import java.util.stream.Collectors;
25 import javax.persistence.Query;
26 import javax.persistence.TypedQuery;
27 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
28 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
29 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
30 import org.apache.syncope.core.persistence.api.entity.ExternalResource;
31 import org.apache.syncope.core.persistence.api.entity.VirSchema;
32 import org.apache.syncope.core.persistence.jpa.entity.JPAVirSchema;
33
34 public class JPAVirSchemaDAO extends AbstractDAO<VirSchema> implements VirSchemaDAO {
35
36 protected final ExternalResourceDAO resourceDAO;
37
38 public JPAVirSchemaDAO(final ExternalResourceDAO resourceDAO) {
39 this.resourceDAO = resourceDAO;
40 }
41
42 @Override
43 public VirSchema find(final String key) {
44 return entityManager().find(JPAVirSchema.class, key);
45 }
46
47 @Override
48 public List<VirSchema> findByAnyTypeClasses(final Collection<AnyTypeClass> anyTypeClasses) {
49 StringBuilder queryString = new StringBuilder("SELECT e FROM ").
50 append(JPAVirSchema.class.getSimpleName()).
51 append(" e WHERE ");
52 anyTypeClasses.forEach(anyTypeClass -> queryString.
53 append("e.anyTypeClass.id='").
54 append(anyTypeClass.getKey()).append("' OR "));
55
56 TypedQuery<VirSchema> query = entityManager().createQuery(
57 queryString.substring(0, queryString.length() - 4), VirSchema.class);
58
59 return query.getResultList();
60 }
61
62 @Override
63 public List<String> find(final ExternalResource resource) {
64 Query query = entityManager().createNativeQuery(
65 "SELECT id FROM " + JPAVirSchema.TABLE + " e WHERE e.resource_id=?");
66 query.setParameter(1, resource.getKey());
67
68 @SuppressWarnings("unchecked")
69 List<Object> results = query.getResultList();
70 return results.stream().
71 map(Object::toString).
72 collect(Collectors.toList());
73 }
74
75 @Override
76 public List<VirSchema> find(final String resource, final String anyType) {
77 Query query = entityManager().createNativeQuery(
78 "SELECT id FROM " + JPAVirSchema.TABLE + " e WHERE e.resource_id=? AND e.anyType_id=?");
79 query.setParameter(1, resource);
80 query.setParameter(2, anyType);
81
82 @SuppressWarnings("unchecked")
83 List<Object> results = query.getResultList();
84 return results.stream().
85 map(row -> find(row.toString())).
86 filter(Objects::nonNull).
87 collect(Collectors.toList());
88 }
89
90 @Override
91 public List<VirSchema> findByKeyword(final String keyword) {
92 TypedQuery<VirSchema> query = entityManager().createQuery(
93 "SELECT e FROM " + JPAVirSchema.class.getSimpleName() + " e"
94 + " WHERE e.id LIKE :keyword", VirSchema.class);
95 query.setParameter("keyword", keyword);
96 return query.getResultList();
97 }
98
99 @Override
100 public List<VirSchema> findAll() {
101 TypedQuery<VirSchema> query = entityManager().createQuery(
102 "SELECT e FROM " + JPAVirSchema.class.getSimpleName() + " e", VirSchema.class);
103 return query.getResultList();
104 }
105
106 @Override
107 public VirSchema save(final VirSchema schema) {
108 ((JPAVirSchema) schema).map2json();
109 return entityManager().merge(schema);
110 }
111
112 @Override
113 public void delete(final String key) {
114 VirSchema schema = find(key);
115 if (schema == null) {
116 return;
117 }
118
119 resourceDAO.deleteMapping(key);
120
121 if (schema.getAnyTypeClass() != null) {
122 schema.getAnyTypeClass().getVirSchemas().remove(schema);
123 }
124
125 entityManager().remove(schema);
126 }
127 }