1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 }