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.framework.setup;
35
36 import info.magnolia.jcr.util.NodeTypes;
37 import info.magnolia.jcr.util.NodeUtil;
38 import info.magnolia.module.InstallContext;
39 import info.magnolia.module.delta.QueryTask;
40 import info.magnolia.ui.form.field.definition.LinkFieldDefinition;
41 import info.magnolia.ui.form.field.definition.MultiValueFieldDefinition;
42
43 import javax.jcr.Node;
44 import javax.jcr.RepositoryException;
45
46 import org.apache.commons.lang3.StringUtils;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50
51
52
53 public class ReplaceMultiLinkFieldDefinitionTask extends QueryTask {
54
55 private static final Logger log = LoggerFactory.getLogger(ReplaceMultiLinkFieldDefinitionTask.class);
56
57 public ReplaceMultiLinkFieldDefinitionTask(String name, String description, String repositoryName, String query) {
58 super(name, description, repositoryName, query);
59 }
60
61 @Override
62 protected void operateOnNode(InstallContext installContext, Node fieldNodeDefinition) {
63 String nodePath = NodeUtil.getPathIfPossible(fieldNodeDefinition);
64 try {
65 if (StringUtils.contains(nodePath, "fields")) {
66
67
68 Node field = fieldNodeDefinition.addNode("field", NodeTypes.ContentNode.NAME);
69 field.setProperty("class", LinkFieldDefinition.class.getName());
70
71
72 if (fieldNodeDefinition.hasNode("identifierToPathConverter")) {
73 NodeUtil.moveNode(fieldNodeDefinition.getNode("identifierToPathConverter"), field);
74 }
75
76
77 copyAndRemoveProperty(fieldNodeDefinition, field, "appName");
78 copyAndRemoveProperty(fieldNodeDefinition, field, "buttonSelectNewLabel");
79 copyAndRemoveProperty(fieldNodeDefinition, field, "buttonSelectOtherLabel");
80 copyAndRemoveProperty(fieldNodeDefinition, field, "fieldEditable");
81 copyAndRemoveProperty(fieldNodeDefinition, field, "targetWorkspace");
82 copyAndRemoveProperty(fieldNodeDefinition, field, "type");
83
84
85 fieldNodeDefinition.setProperty("class", MultiValueFieldDefinition.class.getName());
86
87 } else {
88 log.debug("The following node {} is not a field definition. ", nodePath);
89 }
90 } catch (RepositoryException re) {
91 log.warn("Could not Migrate 'MultiLinkFieldDefinition' of the following node {}.", nodePath);
92 }
93 }
94
95 private void copyAndRemoveProperty(Node sourceNode, Node targetNode, String propertyName) throws RepositoryException {
96 if (sourceNode.hasProperty(propertyName)) {
97 targetNode.setProperty(propertyName, sourceNode.getProperty(propertyName).getString());
98 sourceNode.getProperty(propertyName).remove();
99 }
100 }
101 }