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.transformer.multi;
35
36 import info.magnolia.jcr.util.NodeTypes;
37 import info.magnolia.jcr.util.NodeUtil;
38 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
39 import info.magnolia.ui.form.field.definition.ConfiguredFieldDefinition;
40 import info.magnolia.ui.form.field.definition.MultiValueFieldDefinition;
41 import info.magnolia.ui.vaadin.integration.jcr.AbstractJcrNodeAdapter;
42 import info.magnolia.ui.vaadin.integration.jcr.JcrNewNodeAdapter;
43 import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter;
44
45 import java.util.Collections;
46 import java.util.List;
47
48 import javax.jcr.Node;
49 import javax.jcr.RepositoryException;
50
51 import org.apache.commons.beanutils.BeanUtils;
52 import org.apache.commons.beanutils.PropertyUtils;
53 import org.apache.commons.lang3.StringUtils;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57 import com.vaadin.v7.data.Item;
58 import com.vaadin.v7.data.util.PropertysetItem;
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 public class DelegatingMultiValueSubnodeTransformer extends DelegatingMultiValueFieldTransformer {
78
79 private static final Logger log = LoggerFactory.getLogger(DelegatingMultiValueSubnodeTransformer.class);
80
81 private JcrNodeAdapter childNode;
82
83 public DelegatingMultiValueSubnodeTransformer(Item relatedFormItem, ConfiguredFieldDefinition definition, Class<PropertysetItem> type, I18NAuthoringSupport i18NAuthoringSupport) {
84 super(relatedFormItem, definition, type, i18NAuthoringSupport);
85 detectsChildNodeType((MultiValueFieldDefinition) definition);
86 }
87
88
89
90
91 @Override
92 protected String getSubItemBaseName() {
93 return "";
94 }
95
96
97
98
99
100
101 @Override
102 protected JcrNodeAdapter getRootItem() {
103 if (childNode == null) {
104 JcrNodeAdapter rootItem = super.getRootItem();
105 Node rootJcrItem = rootItem.getJcrItem();
106 try {
107 final String childNodeName = getChildNodeName();
108 if (rootJcrItem.hasNode(childNodeName)) {
109 final AbstractJcrNodeAdapter alreadyExistingChildItem = rootItem.getChild(childNodeName);
110 if (alreadyExistingChildItem instanceof JcrNodeAdapter) {
111 childNode = (JcrNodeAdapter) alreadyExistingChildItem;
112 } else {
113 childNode = new JcrNodeAdapter(rootJcrItem.getNode(childNodeName));
114 }
115 } else if (rootItem.getChildren().containsKey(childNodeName)) {
116
117 Object childItem = rootItem.getChildren().get(childNodeName);
118 if (childItem instanceof JcrNodeAdapter) {
119 childNode = (JcrNodeAdapter) childItem;
120 }
121 } else {
122 childNode = new JcrNewNodeAdapter(rootJcrItem, NodeTypes.ContentNode.NAME, childNodeName);
123 }
124 rootItem.addChild(childNode);
125 } catch (RepositoryException e) {
126 log.warn(String.format("Could not determine whether form item '%s' had a child node named '%s'", rootJcrItem, definition.getName()), e);
127 }
128 }
129 return childNode;
130 }
131
132 @Override
133 protected List<Node> getStoredChildNodes(JcrNodeAdapter parent) {
134 try {
135 if (!(parent instanceof JcrNewNodeAdapter) && parent.getJcrItem().hasNodes()) {
136 return NodeUtil.asList(NodeUtil.getNodes(parent.getJcrItem(), childNodeType));
137 }
138 } catch (RepositoryException re) {
139 log.warn("Not able to access the Child Nodes of the following Node Identifier {}", parent.getItemId(), re);
140 }
141 return Collections.emptyList();
142 }
143
144 protected String getChildNodeName() {
145 return definition.getName();
146 }
147
148 private void detectsChildNodeType(MultiValueFieldDefinition definition) {
149 try {
150 if (definition.getField() != null && PropertyUtils.isReadable(definition.getField(), "nodeType")) {
151 childNodeType = StringUtils.defaultIfBlank(BeanUtils.getProperty(definition.getField(), "nodeType"), childNodeType);
152 }
153 } catch (Exception ex) {
154 log.error("Can't read nodeType property from the definition");
155 }
156 }
157 }