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