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.api.search;
20  
21  import java.net.URLDecoder;
22  import java.nio.charset.StandardCharsets;
23  import org.apache.commons.lang3.exception.ExceptionUtils;
24  import org.apache.cxf.jaxrs.ext.search.SearchBean;
25  import org.apache.cxf.jaxrs.ext.search.SearchCondition;
26  import org.apache.syncope.common.lib.SyncopeClientException;
27  import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
28  import org.apache.syncope.common.lib.search.SyncopeFiqlParser;
29  import org.apache.syncope.common.lib.types.ClientExceptionType;
30  import org.identityconnectors.framework.common.objects.filter.Filter;
31  
32  /**
33   * Converts FIQL expressions to ConnId's {@link Filter}.
34   */
35  public final class FilterConverter {
36  
37      /**
38       * Parses a FIQL expression into ConnId's {@link Filter}, using {@link SyncopeFiqlParser}.
39       *
40       * @param fiql FIQL string
41       * @return {@link Filter} instance for given FIQL expression
42       */
43      public static Filter convert(final String fiql) {
44          SyncopeFiqlParser<SearchBean> parser = new SyncopeFiqlParser<>(
45                  SearchBean.class, AbstractFiqlSearchConditionBuilder.CONTEXTUAL_PROPERTIES);
46  
47          try {
48              FilterVisitor visitor = new FilterVisitor();
49              SearchCondition<SearchBean> sc = parser.parse(URLDecoder.decode(fiql, StandardCharsets.UTF_8));
50              sc.accept(visitor);
51  
52              return visitor.getQuery();
53          } catch (Exception e) {
54              SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
55              sce.getElements().add(fiql);
56              sce.getElements().add(ExceptionUtils.getRootCauseMessage(e));
57              throw sce;
58          }
59      }
60  
61      private FilterConverter() {
62          // empty constructor for static utility class        
63      }
64  }