View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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  }