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.fieldtype.registry;
35
36 import static info.magnolia.config.registry.DefinitionProvider.Problem.DefaultTypes.*;
37 import static info.magnolia.config.registry.DefinitionProvider.Problem.*;
38 import static info.magnolia.util.DeprecationUtil.getDeprecationMessage;
39
40 import info.magnolia.config.registry.DefinitionMetadata;
41 import info.magnolia.config.registry.DefinitionProvider;
42 import info.magnolia.config.registry.validator.DefinitionValidator;
43 import info.magnolia.ui.form.field.definition.ConfiguredFieldDefinition;
44 import info.magnolia.ui.form.field.definition.FieldDefinition;
45 import info.magnolia.ui.form.fieldtype.definition.FieldTypeDefinition;
46
47 import java.util.ArrayList;
48 import java.util.Collection;
49 import java.util.Optional;
50
51 import javax.inject.Inject;
52
53 import org.apache.commons.lang3.StringUtils;
54
55 import lombok.Getter;
56 import net.sf.cglib.proxy.Enhancer;
57
58
59
60
61
62
63 public abstract class AbstractFieldTypeDefinitionValidator<T> implements DefinitionValidator<T> {
64
65 @Getter
66 private final FieldTypeDefinitionRegistry fieldTypeDefinitionRegistry;
67
68 @Inject
69 public AbstractFieldTypeDefinitionValidator(FieldTypeDefinitionRegistry fieldTypeDefinitionRegistry) {
70 this.fieldTypeDefinitionRegistry = fieldTypeDefinitionRegistry;
71 }
72
73 @Override
74 public Collection<DefinitionProvider.Problem> validate(DefinitionProvider<T> provider) {
75 final Collection<DefinitionProvider.Problem> problems = new ArrayList<>();
76 if (provider.isValid()) {
77 validateDefinition(problems, provider);
78 }
79 return problems;
80 }
81
82 protected abstract void validateDefinition(Collection<DefinitionProvider.Problem> problems, DefinitionProvider<T> provider);
83
84 protected void validateFieldDefinition(Collection<DefinitionProvider.Problem> problems, FieldDefinition fieldDefinition, String path, DefinitionMetadata dialogMetadata) {
85 Optional<DefinitionProvider<FieldTypeDefinition>> fieldTypeDefinitionDefinitionProvider = fieldTypeDefinitionRegistry
86 .getAllProviders()
87 .stream()
88 .filter(provider -> provider.isValid() && provider.get().getDefinitionClass() != null && provider.get().getDefinitionClass().equals(Enhancer.isEnhanced(fieldDefinition.getClass()) ? fieldDefinition.getClass().getSuperclass() : fieldDefinition.getClass()))
89 .findAny();
90 if (!fieldTypeDefinitionDefinitionProvider.isPresent()) {
91 reportMissingFieldTypeDefinition(problems, fieldDefinition, path);
92 } else {
93 validateFieldDefinition(problems, fieldTypeDefinitionDefinitionProvider.get(), path, dialogMetadata);
94 }
95 }
96
97 protected void validateFieldDefinition(Collection<DefinitionProvider.Problem> problems, DefinitionProvider<FieldTypeDefinition> fieldTypeDefinitionDefinitionProvider, String path, DefinitionMetadata dialogMetadata) {
98 if (!dialogMetadata.getDeprecation().isPresent() && Optional.ofNullable(fieldTypeDefinitionDefinitionProvider.getMetadata()).flatMap(DefinitionMetadata::getDeprecation).isPresent()) {
99 DefinitionMetadata fieldTypeMetadata = fieldTypeDefinitionDefinitionProvider.getMetadata();
100 fieldTypeMetadata.getDeprecation().ifPresent(deprecation -> {
101 String deprecationMessage = getDeprecationMessage(fieldTypeDefinitionRegistry.type().getName(), fieldTypeMetadata.getName(), deprecation.since(), deprecation.description());
102
103 problems.add(deprecated()
104 .withTitle("Deprecated definition usage")
105 .withDetails(deprecationMessage)
106 .withLocation(path)
107 .withType(RESOLUTION)
108 .build());
109 });
110 }
111 }
112
113 protected void reportMissingFieldTypeDefinition(Collection<DefinitionProvider.Problem> problems, FieldDefinition fieldDefinition, String path) {
114 problems.add(major()
115 .withTitle("No field type definition found")
116 .withDetails(getDetails(fieldDefinition))
117 .withLocation(path)
118 .withType(REFERENCES)
119 .build());
120 }
121
122 private String getDetails(FieldDefinition fieldDefinition) {
123 if (fieldDefinition instanceof ConfiguredFieldDefinition) {
124 ConfiguredFieldDefinition configuredFieldDefinition = (ConfiguredFieldDefinition) fieldDefinition;
125 if (StringUtils.isNotBlank(configuredFieldDefinition.getFieldType())) {
126 return "Could not find fieldType for name " + configuredFieldDefinition.getFieldType();
127 }
128 }
129 return "Could not find fieldType for definition " + fieldDefinition.getClass().getName();
130 }
131 }