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.migration;
35
36 import info.magnolia.objectfactory.Classes;
37 import info.magnolia.ui.field.ConfiguredFieldDefinition;
38 import info.magnolia.ui.field.EmailValidatorDefinition;
39 import info.magnolia.ui.field.FieldValidatorDefinition;
40 import info.magnolia.ui.field.RegexpValidatorDefinition;
41 import info.magnolia.ui.form.field.converter.FieldValueConverter;
42 import info.magnolia.ui.vaadin.integration.jcr.DefaultPropertyUtil;
43
44 import java.util.ArrayList;
45 import java.util.List;
46
47 import javax.jcr.PropertyType;
48
49 import org.apache.commons.lang3.StringUtils;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52
53 import com.vaadin.data.Converter;
54
55
56
57
58
59
60
61
62 public abstract class AbstractConfiguredFieldDefinitionConverter<T, NEW extends ConfiguredFieldDefinition<T>, OLD extends info.magnolia.ui.form.field.definition.FieldDefinition> implements FieldDefinitionConverter<T, NEW, OLD> {
63
64 private final Logger log = LoggerFactory.getLogger(AbstractConfiguredFieldDefinitionConverter.class);
65
66 @Override
67 public NEW convert(OLD oldDefinition) {
68 NEW newDefinition = createNewDefinition(oldDefinition);
69
70 newDefinition.setName(oldDefinition.getName());
71 newDefinition.setLabel(oldDefinition.getLabel());
72 newDefinition.setI18n(oldDefinition.isI18n());
73 newDefinition.setDescription(oldDefinition.getDescription());
74 if (newDefinition.getType() == String.class) {
75 newDefinition.setType(convertDefinitionType(oldDefinition.getType()));
76 }
77 newDefinition.setRequired(oldDefinition.isRequired());
78 newDefinition.setRequiredErrorMessage(oldDefinition.getRequiredErrorMessage());
79 newDefinition.setReadOnly(oldDefinition.isReadOnly());
80 newDefinition.setDefaultValue(convertDefaultValue(oldDefinition, newDefinition));
81 newDefinition.setStyleName(oldDefinition.getStyleName());
82 newDefinition.setValidators(convertValidators(oldDefinition.getValidators()));
83 newDefinition.setConverterClass(convertConverterClass(oldDefinition.getConverterClass()));
84 return newDefinition;
85 }
86
87 abstract NEW createNewDefinition(OLD oldDefinition);
88
89 abstract T convertDefaultValue(OLD oldDefinition, NEW newDefinition);
90
91 protected Class convertDefinitionType(String type) {
92 if (StringUtils.isNotBlank(type)) {
93 if (DefaultPropertyUtil.isKnownJcrTypeName(type)) {
94 return DefaultPropertyUtil.getFieldTypeClass(type);
95 } else {
96 try {
97 return Classes.getClassFactory().forName(type);
98 } catch (ClassNotFoundException e) {
99 log.debug("Unknown configured type {}", type);
100 }
101 }
102 }
103 return String.class;
104 }
105
106 protected List<FieldValidatorDefinition> convertValidators(List<info.magnolia.ui.form.validator.definition.FieldValidatorDefinition> validators) {
107 List<FieldValidatorDefinition> newValidators = new ArrayList<>();
108 for (info.magnolia.ui.form.validator.definition.FieldValidatorDefinition oldValidator : validators) {
109 if (oldValidator instanceof info.magnolia.ui.form.validator.definition.EmailValidatorDefinition) {
110 EmailValidatorDefinition emailValidatorDefinition = new EmailValidatorDefinition();
111 emailValidatorDefinition.setName(((info.magnolia.ui.form.validator.definition.EmailValidatorDefinition) oldValidator).getName());
112 emailValidatorDefinition.setErrorMessage(oldValidator.getErrorMessage());
113 newValidators.add(emailValidatorDefinition);
114 } else if (oldValidator instanceof info.magnolia.ui.form.validator.definition.RegexpValidatorDefinition) {
115 RegexpValidatorDefinition regexpValidatorDefinition = new RegexpValidatorDefinition();
116 regexpValidatorDefinition.setName(((info.magnolia.ui.form.validator.definition.RegexpValidatorDefinition) oldValidator).getName());
117 regexpValidatorDefinition.setErrorMessage(oldValidator.getErrorMessage());
118 regexpValidatorDefinition.setPattern(((info.magnolia.ui.form.validator.definition.RegexpValidatorDefinition) oldValidator).getPattern());
119 newValidators.add(regexpValidatorDefinition);
120 } else {
121 log.warn(oldValidator.getClass() + " doesn't have replacement in new ui framework. So it can't be converted and as such is skipped.");
122 }
123 }
124 return newValidators;
125 }
126
127 protected Class<? extends Converter<T, ?>> convertConverterClass(Class<?> oldConverterClass) {
128 if (oldConverterClass == null) {
129
130 } else if (com.vaadin.v7.data.util.converter.Converter.class.isAssignableFrom(oldConverterClass)) {
131 try {
132 return (Class<? extends Converter<T, ?>>) Class.forName("com.vaadin.data.converter." + oldConverterClass.getSimpleName());
133 } catch (ReflectiveOperationException e) {
134 log.error("Can't convert " + oldConverterClass + " to Vaadin 8 alternative.", e);
135 }
136 } else if (FieldValueConverter.class.isAssignableFrom(oldConverterClass)) {
137 log.error(FieldValueConverter.class + " are not supported in new ui framework. " + oldConverterClass + " can't be converted.");
138 } else {
139 log.error("Invalid old configuration. Old converter class [{}] does not match with one of the expected types.", oldConverterClass);
140 }
141 return null;
142 }
143
144 @Override
145 public boolean supports(OLD oldDefinition) {
146 if (oldDefinition.getTransformerClass() != null && !supportsTransformerClass(oldDefinition.getTransformerClass())) {
147 log.error("Unsupported transformer class for field definition: " + oldDefinition.getName() + ": " + oldDefinition.getTransformerClass().getName());
148 return false;
149 }
150 if (oldDefinition.getConverterClass() != null && !supportsConverterClass(oldDefinition.getConverterClass())) {
151 log.error("Unsupported converter class for field definition: " + oldDefinition.getName() + ": " + oldDefinition.getConverterClass().getName());
152 }
153 if (oldDefinition.getConverterClass() == null && oldDefinition.getType() != null && !oldDefinition.getType().equals(PropertyType.TYPENAME_STRING)) {
154 if (!supportsType(oldDefinition.getType())) {
155 log.error("No converter set for non-String field:" + oldDefinition.getName() + ": " + oldDefinition.getType());
156 return false;
157 }
158 log.debug(oldDefinition.getType() + " type is used in definition " + oldDefinition.getName() + " without proper converterClass.");
159 }
160 return true;
161 }
162
163 protected boolean supportsTransformerClass(Class transformerClass) {
164 return false;
165 }
166
167 protected boolean supportsConverterClass(Class converterClass) {
168 return convertConverterClass(converterClass) != null;
169 }
170
171 protected boolean supportsType(String type) {
172 return false;
173 }
174 }