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.List;
22  import org.apache.commons.lang3.tuple.Pair;
23  import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
24  import org.apache.syncope.core.persistence.api.entity.AnyUtils;
25  import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr;
26  import org.apache.syncope.core.persistence.api.entity.PlainAttr;
27  import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
28  import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
29  import org.apache.syncope.core.persistence.api.entity.PlainSchema;
30  import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
31  
32  public class MyJPAJSONAnyDAO extends AbstractJPAJSONAnyDAO {
33  
34      public MyJPAJSONAnyDAO(final PlainSchemaDAO plainSchemaDAO) {
35          super(plainSchemaDAO);
36      }
37  
38      @Override
39      protected String queryBegin(final String table) {
40          return "SELECT DISTINCT id FROM " + view(table) + ' ';
41      }
42  
43      @Override
44      protected String attrValueMatch(
45              final AnyUtils anyUtils,
46              final PlainSchema schema,
47              final PlainAttrValue attrValue,
48              final boolean ignoreCaseMatch) {
49  
50          Pair<String, Boolean> schemaInfo = schemaInfo(schema.getType(), ignoreCaseMatch);
51          if (schemaInfo.getRight()) {
52              return "plainSchema = ? "
53                      + "AND "
54                      + (schemaInfo.getRight() ? "LOWER(" : "")
55                      + (schema.isUniqueConstraint()
56                      ? "attrUniqueValue ->> '$." + schemaInfo.getLeft() + '\''
57                      : schemaInfo.getLeft())
58                      + (schemaInfo.getRight() ? ")" : "")
59                      + " = "
60                      + (schemaInfo.getRight() ? "LOWER(" : "")
61                      + '?'
62                      + (schemaInfo.getRight() ? ")" : "");
63          } else {
64              PlainAttr<?> container = anyUtils.newPlainAttr();
65              container.setSchema(schema);
66              if (attrValue instanceof PlainAttrUniqueValue) {
67                  container.setUniqueValue((PlainAttrUniqueValue) attrValue);
68              } else {
69                  ((JSONPlainAttr) container).add(attrValue);
70              }
71              return "JSON_CONTAINS(plainAttrs, '" + POJOHelper.serialize(List.of(container)).replace("'", "''") + "')";
72          }
73      }
74  }