1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.form.field.definition;
35
36 import info.magnolia.ui.api.app.AppDescriptor;
37 import info.magnolia.ui.form.AbstractFormKeyGenerator;
38 import info.magnolia.ui.form.definition.FormDefinition;
39 import info.magnolia.ui.form.definition.TabDefinition;
40
41 import java.lang.reflect.AnnotatedElement;
42 import java.lang.reflect.Method;
43 import java.util.Deque;
44 import java.util.LinkedList;
45 import java.util.List;
46 import java.util.Optional;
47
48 import org.apache.commons.lang3.StringUtils;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51
52
53
54
55 public class FieldDefinitionKeyGenerator extends AbstractFormKeyGenerator<FieldDefinition> {
56
57 private static final Logger log = LoggerFactory.getLogger(FieldDefinitionKeyGenerator.class);
58
59 private static final String CHOOSE_DIALOG_DEFINITION = "ChooseDialogDefinition";
60
61 @Override
62 protected void keysFor(List<String> list, FieldDefinition field, AnnotatedElement el) {
63 Object parent = getParentViaCast(field);
64 final String fieldName = field.getName().replace(':', '-');
65 final String fieldOrGetterName = fieldOrGetterName(el);
66
67 if (parent != null && isChooseDialog(parent.getClass())) {
68
69 final AppDescriptor app = (AppDescriptor) getRoot(field);
70 addKey(list, app.getName(), CHOOSE_DIALOG, FIELDS, fieldName, fieldOrGetterName);
71 } else {
72 final Deque<String> parentNames = new LinkedList<>();
73 while (parent != null && !(parent instanceof TabDefinition)) {
74 getParentName(parent).ifPresent(parentNames::addFirst);
75 parent = getParentViaCast(parent);
76 }
77 final String parentKeyPart = StringUtils.join(parentNames, '.').replace(':', '-');
78
79 if (parent instanceof TabDefinition) {
80
81 TabDefinition tab = (TabDefinition) parent;
82 final String tabName = tab.getName();
83 final FormDefinition formDef = getParentViaCast(tab);
84 final String rawDialogID = getIdOrNameForUnknownRoot(formDef, false);
85 final String dialogID = keyify(rawDialogID);
86
87
88 if (parentNames.size() > 0) {
89
90
91 addKey(list, true, dialogID, tabName, parentKeyPart, fieldName, fieldOrGetterName);
92 }
93
94
95 addKey(list, dialogID, tabName, fieldName, fieldOrGetterName);
96
97 addKey(list, tabName, fieldName, fieldOrGetterName);
98
99
100 addKey(list, dialogID, fieldName, fieldOrGetterName);
101 String[] parts = StringUtils.split(dialogID, ".");
102 if (parts.length > 1) {
103 String dialogIDNoModuleName = parts[parts.length - 1];
104 addKey(list, dialogIDNoModuleName, fieldName, fieldOrGetterName);
105 addKey(list, dialogIDNoModuleName, tabName, fieldName, fieldOrGetterName);
106 }
107 } else {
108
109 addKey(list, parentKeyPart, fieldName, fieldOrGetterName);
110 }
111 }
112 addKey(list, FIELDS, fieldName, fieldOrGetterName);
113 }
114
115
116
117
118 private boolean isChooseDialog(Class<?> clazz) {
119
120
121
122
123
124
125 return clazz.getSimpleName().contains(CHOOSE_DIALOG_DEFINITION);
126 }
127
128
129
130
131
132
133 private Optional<String> getParentName(Object parent) {
134 try {
135 Method getNameMethod = parent.getClass().getMethod("getName");
136 return Optional.of((String) getNameMethod.invoke(parent));
137 } catch (NoSuchMethodException e) {
138
139 log.debug("Failed to obtain the name property value of an object [{}]: {}", parent, e.getMessage());
140 } catch (ReflectiveOperationException e) {
141 log.warn("Failed to obtain the name property value of an object [{}]: {}", parent, e.getMessage());
142 }
143 return Optional.empty();
144 }
145 }