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.action;
35
36 import info.magnolia.i18nsystem.SimpleTranslator;
37 import info.magnolia.jcr.predicate.AbstractPredicate;
38 import info.magnolia.jcr.util.NodeTypes;
39 import info.magnolia.jcr.util.NodeUtil;
40 import info.magnolia.ui.api.action.ActionExecutor;
41 import info.magnolia.ui.api.context.UiContext;
42 import info.magnolia.ui.vaadin.integration.contentconnector.ContentConnector;
43 import info.magnolia.ui.vaadin.integration.contentconnector.JcrContentConnector;
44 import info.magnolia.ui.vaadin.integration.contentconnector.NodeTypeDefinition;
45 import info.magnolia.ui.vaadin.integration.jcr.JcrItemAdapter;
46
47 import java.util.List;
48
49 import javax.inject.Inject;
50 import javax.jcr.Node;
51 import javax.jcr.RepositoryException;
52
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
59
60
61
62
63
64
65 @Deprecated
66 public class DeleteConfirmationAction<D extends DeleteConfirmationActionDefinition> extends ConfirmationAction<D> {
67
68 private static final Logger log = LoggerFactory.getLogger(DeleteConfirmationAction.class);
69 private static final String NL = "<br />";
70
71 private ModifiedSubNodesWithNodeTypePredicate predicate = null;
72
73 @Inject
74 public DeleteConfirmationAction(D definition, List<? extends JcrItemAdapter> items, UiContext uiContext, ActionExecutor actionExecutor, SimpleTranslator i18n, ContentConnector contentConnector) {
75 super(definition, items, uiContext, actionExecutor, i18n, contentConnector);
76 if (contentConnector instanceof JcrContentConnector) {
77 this.predicate = new ModifiedSubNodesWithNodeTypePredicate(((JcrContentConnector) contentConnector).getContentConnectorDefinition().getNodeTypes());
78 }
79 }
80
81 @Override
82 protected String getConfirmationMessage() throws Exception {
83 if (predicate == null) {
84 return super.getConfirmationMessage();
85 }
86 StringBuilder label = new StringBuilder();
87
88
89 label.append(super.getConfirmationMessage());
90
91 boolean warningAlreadySet = false;
92 for (Item item : getItems()) {
93 JcrItemAdapter jcrItemAdapter = (JcrItemAdapter) item;
94 if (!jcrItemAdapter.isNode()) {
95 continue;
96 }
97 Node node = (Node) jcrItemAdapter.getJcrItem();
98 String modifiedSubNodesPaths = getModifiedSubNodesMessage(node);
99 if (StringUtils.isNotEmpty(modifiedSubNodesPaths)) {
100 if (!warningAlreadySet) {
101 label.append(NL).append(NL);
102 label.append(getSimpleTranslator().translate("confirmation.delete.modified.message"));
103 label.append(NL);
104 warningAlreadySet = true;
105 }
106 label.append(modifiedSubNodesPaths);
107 }
108 }
109 return label.toString();
110 }
111
112 private String getModifiedSubNodesMessage(Node parent) throws RepositoryException {
113 StringBuilder stringBuilder = new StringBuilder();
114 Iterable<Node> nodes = NodeUtil.collectAllChildren(parent, predicate);
115 for (Node node : nodes) {
116 stringBuilder.append(node.getPath());
117 stringBuilder.append(NL);
118 }
119 return stringBuilder.toString();
120 }
121
122 private class ModifiedSubNodesWithNodeTypePredicate extends AbstractPredicate<Node> {
123
124 private final List<NodeTypeDefinition> nodeTypes;
125
126 private ModifiedSubNodesWithNodeTypePredicate(List<NodeTypeDefinition> nodeTypes) {
127 this.nodeTypes = nodeTypes;
128 }
129
130 @Override
131 public boolean evaluateTyped(Node node) {
132 try {
133 for (NodeTypeDefinition nodeType : nodeTypes) {
134 if (node.isNodeType(nodeType.getName())) {
135 return NodeTypes.Activatable.ACTIVATION_STATUS_MODIFIED == NodeTypes.Activatable.getActivationStatus(node);
136 }
137 }
138 } catch (RepositoryException e) {
139 log.error("Unable to read nodeType for node {}", node);
140 }
141 return false;
142 }
143 }
144 }