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.lang.reflect.Field;
22 import java.util.Collection;
23 import java.util.Collections;
24 import java.util.HashSet;
25 import java.util.Map;
26 import java.util.Set;
27 import java.util.TreeMap;
28 import org.apache.commons.lang3.ArrayUtils;
29 import org.apache.syncope.common.lib.to.AnyObjectTO;
30 import org.apache.syncope.common.lib.to.AnyTO;
31 import org.apache.syncope.common.lib.to.GroupTO;
32 import org.apache.syncope.common.lib.to.UserTO;
33 import org.apache.syncope.common.lib.types.AttrSchemaType;
34
35 public final class SearchableFields {
36
37 private static final String[] ATTRIBUTES_NOTINCLUDED = {
38 "serialVersionUID", "discriminator", "password", "type", "udynMembershipCond", "securityAnswer",
39 "token", "tokenExpireTime"
40 };
41
42 private static final Set<String> ANY_FIELDS = new HashSet<>();
43
44 static {
45 ANY_FIELDS.addAll(get(UserTO.class).keySet());
46 ANY_FIELDS.addAll(get(GroupTO.class).keySet());
47 ANY_FIELDS.addAll(get(AnyObjectTO.class).keySet());
48 }
49
50 public static boolean contains(final String schema) {
51 return ANY_FIELDS.contains(schema);
52 }
53
54 public static Map<String, AttrSchemaType> get(final Class<? extends AnyTO> anyRef) {
55 final Map<String, AttrSchemaType> fields = new TreeMap<>(Collections.reverseOrder());
56
57
58 Class<?> clazz = anyRef;
59 while (clazz != null && clazz != Object.class) {
60 for (Field field : clazz.getDeclaredFields()) {
61 if (!ArrayUtils.contains(ATTRIBUTES_NOTINCLUDED, field.getName())
62 && !Collection.class.isAssignableFrom(field.getType())
63 && !Map.class.isAssignableFrom(field.getType())) {
64
65 fields.put(field.getName(), AttrSchemaType.getAttrSchemaTypeByClass(field.getType()));
66 }
67 }
68 clazz = clazz.getSuperclass();
69 }
70
71 return fields;
72 }
73
74 private SearchableFields() {
75
76 }
77 }