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.ui.chooser.definition.SingleItemWorkbenchChooserDefinition;
37 import info.magnolia.ui.datasource.jcr.JcrDatasource;
38 import info.magnolia.ui.editor.converter.JcrNodeToIdentifierConverter;
39 import info.magnolia.ui.field.LinkFieldDefinition;
40 import info.magnolia.ui.form.field.converter.BaseIdentifierToPathConverter;
41 import info.magnolia.ui.form.field.converter.IdentifierToPathConverter;
42
43 import java.util.HashMap;
44 import java.util.Map;
45 import java.util.Optional;
46 import java.util.regex.Matcher;
47 import java.util.regex.Pattern;
48
49 import javax.jcr.Node;
50
51 import org.apache.commons.lang3.StringUtils;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
54
55 import com.vaadin.data.Converter;
56 import com.vaadin.data.Result;
57 import com.vaadin.data.ValueContext;
58
59
60
61
62
63 public class LinkFieldDefinitionConverter<T> extends AbstractConfiguredFieldDefinitionConverter<T, LinkFieldDefinition<T>, info.magnolia.ui.form.field.definition.LinkFieldDefinition> {
64
65 private final Logger log = LoggerFactory.getLogger(LinkFieldDefinitionConverter.class);
66
67 private Map<String, String> APP_MAPPING = new HashMap<String, String>() {{
68 put("pages", "pages-app");
69 put("segmentation", "segmentation-app");
70 put("personas", "personas-app");
71 }};
72
73 @Override
74 public LinkFieldDefinition<T> convert(info.magnolia.ui.form.field.definition.LinkFieldDefinition oldDefinition) {
75 LinkFieldDefinition<T> newDefinition = super.convert(oldDefinition);
76 newDefinition.setButtonSelectOtherLabel(convertButtonLabel(oldDefinition.getButtonSelectOtherLabel(), oldDefinition));
77 newDefinition.setButtonSelectNewLabel(convertButtonLabel(oldDefinition.getButtonSelectNewLabel(), oldDefinition));
78 newDefinition.setEditable(oldDefinition.isFieldEditable());
79 newDefinition.setPlaceholder(oldDefinition.getPlaceholder());
80 newDefinition.setChooser(createSingleItemWorkbenchChooser(oldDefinition));
81 if (oldDefinition.getIdentifierToPathConverter() != null) {
82 newDefinition.setConverterClass((Class<? extends Converter<T, ?>>) convertIdentifierToPathConverter(oldDefinition.getIdentifierToPathConverter()));
83 }
84 return newDefinition;
85 }
86
87 private String convertButtonLabel(String buttonSelectLabel, info.magnolia.ui.form.field.definition.LinkFieldDefinition oldDefinition) {
88 return Optional.ofNullable(buttonSelectLabel)
89 .map(label -> label.endsWith("buttonSelectOtherLabel") ? oldDefinition.getButtonSelectOtherDefaultLabel() : label)
90 .map(label -> label.endsWith("buttonSelectNewLabel") ? oldDefinition.getButtonSelectNewDefaultLabel() : label)
91 .orElse(buttonSelectLabel);
92 }
93
94 @Override
95 LinkFieldDefinition<T> createNewDefinition(info.magnolia.ui.form.field.definition.LinkFieldDefinition oldDefinition) {
96 return new LinkFieldDefinition<>();
97 }
98
99 @Override
100 T convertDefaultValue(info.magnolia.ui.form.field.definition.LinkFieldDefinition oldDefinition, LinkFieldDefinition<T> newDefinition) {
101 return (T) oldDefinition.getDefaultValue();
102 }
103
104 private SingleItemWorkbenchChooserDefinition<T> createSingleItemWorkbenchChooser(info.magnolia.ui.form.field.definition.LinkFieldDefinition oldDefinition) {
105 CompatibilityAppAwareWorkbenchChooserDefinition<T> appAwareWorkbenchChooserDefinition = new CompatibilityAppAwareWorkbenchChooserDefinition<>();
106 appAwareWorkbenchChooserDefinition.setAppName(APP_MAPPING.getOrDefault(oldDefinition.getAppName(), oldDefinition.getAppName()));
107
108 SingleItemWorkbenchChooserDefinition<T> chooserDefinition = new SingleItemWorkbenchChooserDefinition<>();
109 chooserDefinition.setWorkbenchChooser(appAwareWorkbenchChooserDefinition);
110 return chooserDefinition;
111 }
112
113 private Class<? extends Converter<Node, ?>> convertIdentifierToPathConverter(IdentifierToPathConverter identifierToPathConverter) {
114 if (identifierToPathConverter instanceof BaseIdentifierToPathConverter) {
115 return JcrNodeToIdentifierConverter.class;
116 }
117 if ("info.magnolia.dam.app.assets.field.translator.AssetCompositeIdKeyTranslator".equals(identifierToPathConverter.getClass().getName())) {
118 return AssetCompositeIdKeyTranslator.class;
119 }
120 log.error("Can't convert {}, because there's no replacement in new ui framework", identifierToPathConverter);
121 return null;
122 }
123
124 @Override
125 public boolean supports(info.magnolia.ui.form.field.definition.LinkFieldDefinition oldDefinition) {
126 if (oldDefinition.getIdentifierToPathConverter() == null ||
127 convertIdentifierToPathConverter(oldDefinition.getIdentifierToPathConverter()) != null) {
128 return super.supports(oldDefinition);
129 }
130 return false;
131 }
132
133
134
135
136
137
138 @Deprecated
139 public static class AssetCompositeIdKeyTranslator extends JcrNodeToIdentifierConverter {
140
141 private final Logger log = LoggerFactory.getLogger(AssetCompositeIdKeyTranslator.class);
142
143 private static final Pattern ASSET_ITEM_KEY_PATTERN = Pattern.compile("^(.+?):(.+)$");
144
145 public AssetCompositeIdKeyTranslator(JcrDatasource datasource) {
146 super(datasource);
147 }
148
149 @Override
150 public Result<String> convertToModel(Node node, ValueContext context) {
151 Result<String> result = super.convertToModel(node, context);
152 return result.flatMap(value -> {
153 if (StringUtils.isBlank(value)) {
154 return Result.ok(null);
155 }
156 return Result.ok("jcr:" + value);
157 });
158 }
159
160 @Override
161 public Node convertToPresentation(String compositeId, ValueContext context) {
162 if (StringUtils.isBlank(compositeId)) {
163 return null;
164 }
165 Matcher matcher = ASSET_ITEM_KEY_PATTERN.matcher(compositeId);
166 if (!matcher.matches()) {
167 log.error("[{}] is not a valid ItemKey", compositeId);
168 return null;
169 }
170 return super.convertToPresentation(matcher.group(2), context);
171 }
172 }
173 }