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.vaadin.integration.jcr;
35
36 import info.magnolia.cms.core.Path;
37
38 import javax.jcr.Item;
39 import javax.jcr.Node;
40 import javax.jcr.RepositoryException;
41
42 import org.apache.commons.lang3.StringUtils;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46 import com.vaadin.data.Property;
47
48
49
50
51
52
53
54 public class JcrNewNodeAdapter extends JcrNodeAdapter {
55
56 private static final Logger log = LoggerFactory.getLogger(JcrNewNodeAdapter.class);
57
58
59
60 private boolean appliedChanges = false;
61
62
63
64
65
66 public JcrNewNodeAdapter(Node parentNode, String nodeType) {
67 this(parentNode, nodeType, null);
68 }
69
70
71
72
73
74
75 public JcrNewNodeAdapter(Node parentNode, String nodeType, String nodeName) {
76 super(parentNode);
77 setPrimaryNodeTypeName(nodeType);
78 setNodeName(nodeName);
79 try {
80 JcrItemId parentId = JcrItemUtil.getItemId(parentNode);
81 setItemId(new JcrNewNodeItemId(parentId.getUuid(), parentId.getWorkspace(), nodeType, nodeName));
82 } catch (RepositoryException e) {
83 log.error("Failed to initialize JcrNewNodeAdapter: " + e.getMessage(), e);
84 }
85 }
86
87
88
89
90
91 @Override
92 public Property getItemProperty(Object propertyId) {
93
94 if (appliedChanges) {
95 return super.getItemProperty(propertyId);
96 }
97 return getChangedProperties().get(propertyId);
98 }
99
100
101
102
103
104
105 @Override
106 public Node applyChanges() throws RepositoryException {
107
108 if (appliedChanges) {
109 return super.applyChanges();
110 }
111
112 Node parent = getJcrItem();
113
114
115 if (StringUtils.isBlank(getNodeName())) {
116 setNodeName(getUniqueNewItemName(parent));
117 }
118
119
120 Node node = parent.addNode(getNodeName(), getPrimaryNodeTypeName());
121 log.debug("create a new node for parent " + parent.getPath() + " with name " + getNodeName());
122
123
124 updateProperties(node);
125
126
127 if (!getChildren().isEmpty()) {
128 for (AbstractJcrNodeAdapter child : getChildren().values()) {
129 if (child instanceof JcrNewNodeAdapter) {
130
131 child.initCommonAttributes(node);
132 }
133 child.applyChanges();
134 }
135 }
136
137
138 setItemId(JcrItemUtil.getItemId(node));
139
140 if (!appliedChanges) {
141 setParent(new JcrNodeAdapter(parent));
142 }
143
144 appliedChanges = true;
145
146 return node;
147 }
148
149 @Override
150 public void setNodeName(String nodeName) {
151 super.setNodeName(nodeName);
152 ((JcrNewNodeItemId)getItemId()).setName(nodeName);
153 }
154
155 @Override
156 public void setItemId(JcrItemId itemId) {
157 JcrItemId actualItemId = itemId;
158 if (!(actualItemId instanceof JcrNewNodeItemId)) {
159 actualItemId = new JcrNewNodeItemId(itemId.getUuid(), itemId.getWorkspace(), getPrimaryNodeTypeName(), getNodeName());
160 }
161 super.setItemId(actualItemId);
162 }
163
164
165
166
167
168 private String getUniqueNewItemName(final Item item) throws RepositoryException {
169 if (item == null) {
170 throw new IllegalArgumentException("Item cannot be null");
171 }
172
173 String nodeName = "";
174 if (getChangedProperties().containsKey(ModelConstants.JCR_NAME)) {
175 nodeName = getChangedProperties().get(ModelConstants.JCR_NAME).toString();
176 getChangedProperties().remove(ModelConstants.JCR_NAME);
177 nodeName = Path.getValidatedLabel(nodeName);
178 }
179
180 return Path.getUniqueLabel(item.getSession(), item.getPath(), nodeName);
181 }
182
183 @Override
184 public boolean isNew() {
185 return true;
186 }
187 }