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.List;
22 import javax.persistence.TypedQuery;
23 import org.apache.syncope.common.lib.to.Provision;
24 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
25 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
26 import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
27 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
28 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
29 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
30 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
31 import org.apache.syncope.core.persistence.api.entity.AnyType;
32 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
33 import org.apache.syncope.core.persistence.api.entity.DerSchema;
34 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
35 import org.apache.syncope.core.persistence.api.entity.VirSchema;
36 import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
37 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyTypeClass;
38
39 public class JPAAnyTypeClassDAO extends AbstractDAO<AnyTypeClass> implements AnyTypeClassDAO {
40
41 protected final AnyTypeDAO anyTypeDAO;
42
43 protected final PlainSchemaDAO plainSchemaDAO;
44
45 protected final DerSchemaDAO derSchemaDAO;
46
47 protected final VirSchemaDAO virSchemaDAO;
48
49 protected final GroupDAO groupDAO;
50
51 protected final ExternalResourceDAO resourceDAO;
52
53 public JPAAnyTypeClassDAO(
54 final AnyTypeDAO anyTypeDAO,
55 final PlainSchemaDAO plainSchemaDAO,
56 final DerSchemaDAO derSchemaDAO,
57 final VirSchemaDAO virSchemaDAO,
58 final GroupDAO groupDAO,
59 final ExternalResourceDAO resourceDAO) {
60
61 this.anyTypeDAO = anyTypeDAO;
62 this.plainSchemaDAO = plainSchemaDAO;
63 this.derSchemaDAO = derSchemaDAO;
64 this.virSchemaDAO = virSchemaDAO;
65 this.groupDAO = groupDAO;
66 this.resourceDAO = resourceDAO;
67 }
68
69 @Override
70 public AnyTypeClass find(final String key) {
71 return entityManager().find(JPAAnyTypeClass.class, key);
72 }
73
74 @Override
75 public List<AnyTypeClass> findAll() {
76 TypedQuery<AnyTypeClass> query = entityManager().createQuery(
77 "SELECT e FROM " + JPAAnyTypeClass.class.getSimpleName() + " e ", AnyTypeClass.class);
78 return query.getResultList();
79 }
80
81 @Override
82 public AnyTypeClass save(final AnyTypeClass anyTypeClass) {
83 AnyTypeClass merge = entityManager().merge(anyTypeClass);
84
85 for (PlainSchema schema : merge.getPlainSchemas()) {
86 schema.setAnyTypeClass(merge);
87 }
88 for (DerSchema schema : merge.getDerSchemas()) {
89 schema.setAnyTypeClass(merge);
90 }
91 for (VirSchema schema : merge.getVirSchemas()) {
92 schema.setAnyTypeClass(merge);
93 }
94
95 return merge;
96 }
97
98 @Override
99 public void delete(final String key) {
100 AnyTypeClass anyTypeClass = find(key);
101 if (anyTypeClass == null) {
102 return;
103 }
104
105 for (PlainSchema schema : plainSchemaDAO.findByAnyTypeClasses(List.of(anyTypeClass))) {
106 schema.setAnyTypeClass(null);
107 }
108 for (DerSchema schema : derSchemaDAO.findByAnyTypeClasses(List.of(anyTypeClass))) {
109 schema.setAnyTypeClass(null);
110 }
111 for (VirSchema schema : virSchemaDAO.findByAnyTypeClasses(List.of(anyTypeClass))) {
112 schema.setAnyTypeClass(null);
113 }
114
115 for (AnyType type : anyTypeDAO.findByTypeClass(anyTypeClass)) {
116 type.getClasses().remove(anyTypeClass);
117 }
118
119 for (TypeExtension typeExt : groupDAO.findTypeExtensions(anyTypeClass)) {
120 typeExt.getAuxClasses().remove(anyTypeClass);
121
122 if (typeExt.getAuxClasses().isEmpty()) {
123 typeExt.getGroup().getTypeExtensions().remove(typeExt);
124 typeExt.setGroup(null);
125 }
126 }
127
128 for (Provision provision : resourceDAO.findProvisionsByAuxClass(anyTypeClass)) {
129 provision.getAuxClasses().remove(anyTypeClass.getKey());
130 }
131
132 entityManager().remove(anyTypeClass);
133 }
134 }