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.ArrayList;
22 import java.util.Collection;
23 import java.util.List;
24 import javax.persistence.TypedQuery;
25 import org.apache.syncope.core.persistence.api.dao.RelationshipTypeDAO;
26 import org.apache.syncope.core.persistence.api.entity.Relationship;
27 import org.apache.syncope.core.persistence.api.entity.RelationshipType;
28 import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
29 import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
30 import org.apache.syncope.core.persistence.api.entity.user.UMembership;
31 import org.apache.syncope.core.persistence.api.entity.user.URelationship;
32 import org.apache.syncope.core.persistence.jpa.entity.JPARelationshipType;
33 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAARelationship;
34 import org.apache.syncope.core.persistence.jpa.entity.user.JPAURelationship;
35
36 public class JPARelationshipTypeDAO extends AbstractDAO<RelationshipType> implements RelationshipTypeDAO {
37
38 @Override
39 public RelationshipType find(final String key) {
40 return entityManager().find(JPARelationshipType.class, key);
41 }
42
43 @Override
44 public List<RelationshipType> findAll() {
45 TypedQuery<RelationshipType> query = entityManager().createQuery(
46 "SELECT e FROM " + JPARelationshipType.class.getSimpleName() + " e ", RelationshipType.class);
47 return query.getResultList();
48 }
49
50 @Override
51 public RelationshipType save(final RelationshipType anyType) {
52 return entityManager().merge(anyType);
53 }
54
55 private Collection<? extends Relationship<?, ?>> findRelationshipsByType(final RelationshipType type) {
56 TypedQuery<ARelationship> aquery = entityManager().createQuery(
57 "SELECT e FROM " + JPAARelationship.class.getSimpleName() + " e WHERE e.type=:type",
58 ARelationship.class);
59 aquery.setParameter("type", type);
60 TypedQuery<URelationship> uquery = entityManager().createQuery(
61 "SELECT e FROM " + JPAURelationship.class.getSimpleName() + " e WHERE e.type=:type",
62 URelationship.class);
63 uquery.setParameter("type", type);
64
65 List<Relationship<?, ?>> result = new ArrayList<>();
66 result.addAll(aquery.getResultList());
67 result.addAll(uquery.getResultList());
68
69 return result;
70 }
71
72 @Override
73 public void delete(final String key) {
74 RelationshipType type = find(key);
75 if (type == null) {
76 return;
77 }
78
79 findRelationshipsByType(type).stream().map(relationship -> {
80 if (relationship instanceof URelationship) {
81 ((URelationship) relationship).getLeftEnd().getRelationships().remove((URelationship) relationship);
82 } else if (relationship instanceof UMembership) {
83 ((UMembership) relationship).getLeftEnd().remove((UMembership) relationship);
84 } else if (relationship instanceof ARelationship) {
85 ((ARelationship) relationship).getLeftEnd().getRelationships().remove((ARelationship) relationship);
86 } else if (relationship instanceof AMembership) {
87 ((AMembership) relationship).getLeftEnd().remove((AMembership) relationship);
88 }
89 relationship.setLeftEnd(null);
90 return relationship;
91 }).forEach(entityManager()::remove);
92
93 entityManager().remove(type);
94 }
95 }