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.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 }