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.common.lib.search;
20  
21  import java.util.HashMap;
22  import java.util.List;
23  import java.util.Map;
24  import org.apache.cxf.jaxrs.ext.search.SearchUtils;
25  import org.apache.cxf.jaxrs.ext.search.client.CompleteCondition;
26  import org.apache.cxf.jaxrs.ext.search.client.FiqlSearchConditionBuilder;
27  import org.apache.cxf.jaxrs.ext.search.fiql.FiqlParser;
28  import org.apache.syncope.common.lib.BaseBean;
29  
30  public abstract class AbstractFiqlSearchConditionBuilder<
31          P extends SyncopeProperty<C>,
32          PA extends SyncopePartialCondition<P, C>, 
33          C extends SyncopeCompleteCondition<PA, P>>
34          extends FiqlSearchConditionBuilder implements BaseBean {
35  
36      private static final long serialVersionUID = 9043884238032703381L;
37  
38      public static final Map<String, String> CONTEXTUAL_PROPERTIES = new HashMap<>() {
39  
40          private static final long serialVersionUID = 3109256773218160485L;
41  
42          {
43              put(SearchUtils.LAX_PROPERTY_MATCH, "true");
44          }
45      };
46  
47      protected AbstractFiqlSearchConditionBuilder() {
48          super();
49      }
50  
51      protected AbstractFiqlSearchConditionBuilder(final Map<String, String> properties) {
52          super(properties);
53      }
54  
55      @Override
56      protected Builder<P, PA, C> newBuilderInstance() {
57          return new Builder<>(properties);
58      }
59  
60      @Override
61      public P is(final String property) {
62          return newBuilderInstance().is(property);
63      }
64  
65      public C isNull(final String property) {
66          return newBuilderInstance().is(property).nullValue();
67      }
68  
69      public C isNotNull(final String property) {
70          return newBuilderInstance().is(property).notNullValue();
71      }
72  
73      public C inDynRealms(final String dynRealm, final String... moreDynRealms) {
74          return newBuilderInstance().
75                  is(SpecialAttr.DYNREALMS.toString()).
76                  inDynRealms(dynRealm, moreDynRealms);
77      }
78  
79      public C notInDynRealms(final String dynRealm, final String... moreDynRealms) {
80          return newBuilderInstance().
81                  is(SpecialAttr.DYNREALMS.toString()).
82                  notInDynRealms(dynRealm, moreDynRealms);
83      }
84  
85      public C hasAuxClasses(final String auxClass, final String... moreAuxClasses) {
86          return newBuilderInstance().is(SpecialAttr.AUX_CLASSES.toString()).hasAuxClasses(auxClass, moreAuxClasses);
87      }
88  
89      public C hasNotAuxClasses(final String auxClass, final String... moreAuxClasses) {
90          return newBuilderInstance().is(SpecialAttr.AUX_CLASSES.toString()).hasNotAuxClasses(auxClass, moreAuxClasses);
91      }
92  
93      public C hasResources(final String resource, final String... moreResources) {
94          return newBuilderInstance().is(SpecialAttr.RESOURCES.toString()).hasResources(resource, moreResources);
95      }
96  
97      public C hasNotResources(final String resource, final String... moreResources) {
98          return newBuilderInstance().is(SpecialAttr.RESOURCES.toString()).hasNotResources(resource, moreResources);
99      }
100 
101     @SuppressWarnings("unchecked")
102     protected static class Builder<
103             P extends SyncopeProperty<C>,
104             PA extends SyncopePartialCondition<P, C>,
105             C extends SyncopeCompleteCondition<PA, P>>
106             extends FiqlSearchConditionBuilder.Builder
107             implements SyncopeProperty<C>, SyncopeCompleteCondition<PA, P>, SyncopePartialCondition<P, C> {
108 
109         protected Builder(final Map<String, String> properties) {
110             super(properties);
111         }
112 
113         protected Builder(final Builder<P, PA, C> parent) {
114             super(parent);
115         }
116 
117         @Override
118         public P is(final String property) {
119             Builder<P, PA, C> b = new Builder<>(this);
120             b.result = property;
121             return (P) b;
122         }
123 
124         @Override
125         protected C condition(
126                 final String operator, final Object value, final Object... moreValues) {
127 
128             super.condition(operator, value, moreValues);
129             return (C) this;
130         }
131 
132         @Override
133         public C equalToIgnoreCase(final String value, final String... moreValues) {
134             return condition(SyncopeFiqlParser.IEQ, value, (Object[]) moreValues);
135         }
136 
137         @Override
138         public C notEqualTolIgnoreCase(final String literalOrPattern) {
139             return condition(SyncopeFiqlParser.NIEQ, literalOrPattern);
140         }
141 
142         @Override
143         public C nullValue() {
144             return condition(FiqlParser.EQ, SpecialAttr.NULL);
145         }
146 
147         @Override
148         public C notNullValue() {
149             return condition(FiqlParser.NEQ, SpecialAttr.NULL);
150         }
151 
152         @Override
153         public C hasAuxClasses(final String auxClass, final String... moreAuxClasses) {
154             this.result = SpecialAttr.AUX_CLASSES.toString();
155             return condition(FiqlParser.EQ, auxClass, (Object[]) moreAuxClasses);
156         }
157 
158         @Override
159         public C hasNotAuxClasses(final String auxClass, final String... moreAuxClasses) {
160             this.result = SpecialAttr.AUX_CLASSES.toString();
161             return condition(FiqlParser.NEQ, auxClass, (Object[]) moreAuxClasses);
162         }
163 
164         @Override
165         public C hasResources(final String resource, final String... moreResources) {
166             this.result = SpecialAttr.RESOURCES.toString();
167             return condition(FiqlParser.EQ, resource, (Object[]) moreResources);
168         }
169 
170         @Override
171         public C hasNotResources(final String resource, final String... moreResources) {
172             this.result = SpecialAttr.RESOURCES.toString();
173             return condition(FiqlParser.NEQ, resource, (Object[]) moreResources);
174         }
175 
176         @Override
177         public C inDynRealms(final String dynRealm, final String... moreDynRealms) {
178             this.result = SpecialAttr.DYNREALMS.toString();
179             return condition(FiqlParser.EQ, dynRealm, (Object[]) moreDynRealms);
180         }
181 
182         @Override
183         public C notInDynRealms(final String dynRealm, final String... moreDynRealms) {
184             this.result = SpecialAttr.DYNREALMS.toString();
185             return condition(FiqlParser.NEQ, dynRealm, (Object[]) moreDynRealms);
186         }
187 
188         @Override
189         public PA and() {
190             super.and();
191             return (PA) this;
192         }
193 
194         @Override
195         public P and(final String name) {
196             return and().is(name);
197         }
198 
199         @Override
200         public PA or() {
201             super.or();
202             return (PA) this;
203         }
204 
205         @Override
206         public P or(final String name) {
207             return or().is(name);
208         }
209 
210         @Override
211         public C and(final CompleteCondition cc, final CompleteCondition cc1, final CompleteCondition... cn) {
212             super.and(cc1, cc, cn);
213             return (C) this;
214         }
215 
216         @Override
217         public C or(final CompleteCondition cc, final CompleteCondition cc1, final CompleteCondition... cn) {
218             super.or(cc1, cc, cn);
219             return (C) this;
220         }
221 
222         @Override
223         public C and(final List<CompleteCondition> conditions) {
224             super.and(conditions);
225             return (C) this;
226         }
227 
228         @Override
229         public C or(final List<CompleteCondition> conditions) {
230             super.or(conditions);
231             return (C) this;
232         }
233     }
234 }