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.apache.syncope.core.persistence.api.dao.search.SearchCond;
31  
32  /**
33   * Converts FIQL expressions to Syncope's {@link SearchCond}.
34   */
35  public final class SearchCondConverter {
36  
37      /**
38       * Parses a FIQL expression into Syncope's {@link SearchCond}, using {@link SyncopeFiqlParser}.
39       *
40       * @param visitor visitor instance
41       * @param fiql FIQL string
42       * @param realms optional realm to provide to {@link SearchCondVisitor}
43       * @return {@link SearchCond} instance for given FIQL expression
44       */
45      public static SearchCond convert(final SearchCondVisitor visitor, final String fiql, final String... realms) {
46          SyncopeFiqlParser<SearchBean> parser = new SyncopeFiqlParser<>(
47                  SearchBean.class, AbstractFiqlSearchConditionBuilder.CONTEXTUAL_PROPERTIES);
48  
49          try {
50              if (realms != null && realms.length > 0) {
51                  visitor.setRealm(realms[0]);
52              }
53              SearchCondition<SearchBean> sc = parser.parse(URLDecoder.decode(fiql, StandardCharsets.UTF_8));
54              sc.accept(visitor);
55  
56              return visitor.getQuery();
57          } catch (Exception e) {
58              SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
59              sce.getElements().add(fiql);
60              sce.getElements().add(ExceptionUtils.getRootCauseMessage(e));
61              throw sce;
62          }
63      }
64  
65      private SearchCondConverter() {
66          // empty constructor for static utility class        
67      }
68  }