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.contentapp.browser.action;
35
36 import info.magnolia.ui.api.action.AbstractAction;
37 import info.magnolia.ui.api.action.ActionDefinition;
38 import info.magnolia.ui.api.action.ActionExecutionException;
39 import info.magnolia.ui.api.action.ActionExecutor;
40 import info.magnolia.ui.api.availability.AvailabilityChecker;
41 import info.magnolia.ui.api.availability.AvailabilityDefinition;
42 import info.magnolia.ui.vaadin.integration.contentconnector.ContentConnector;
43 import info.magnolia.ui.vaadin.integration.jcr.JcrItemAdapter;
44 import org.apache.commons.lang3.StringUtils;
45
46 import javax.inject.Inject;
47 import javax.jcr.Node;
48 import javax.jcr.RepositoryException;
49 import java.util.Arrays;
50 import java.util.List;
51
52
53
54
55 public class DelegateByNodeTypeAction extends AbstractAction<DelegateByNodeTypeActionDefinition> {
56
57 private final JcrItemAdapter item;
58 private final ActionExecutor actionExecutor;
59 private final AvailabilityChecker availabilityChecker;
60 private final ContentConnector contentConnector;
61
62 @Inject
63 public DelegateByNodeTypeAction(DelegateByNodeTypeActionDefinition definition, ActionExecutor actionExecutor, JcrItemAdapter item, AvailabilityChecker availabilityChecker, ContentConnector contentConnector) {
64 super(definition);
65 this.item = item;
66 this.actionExecutor = actionExecutor;
67 this.availabilityChecker = availabilityChecker;
68 this.contentConnector = contentConnector;
69 }
70
71 @Override
72 public void execute() throws ActionExecutionException {
73 if (item.getJcrItem().isNode()) {
74 Node node = (Node) item.getJcrItem();
75 try {
76 String nodeType = node.getPrimaryNodeType().getName();
77 String action = resolveActionForNodeType(nodeType);
78 if (StringUtils.isNotBlank(action)) {
79 executeAction(action);
80 }
81 } catch (RepositoryException e) {
82 throw new ActionExecutionException("Failed to determine type of action for " + node + ".\n" + e.getMessage(), e);
83 }
84 }
85 }
86
87 private void executeAction(String actionName) throws ActionExecutionException {
88 ActionDefinition actionDefinition = actionExecutor.getActionDefinition(actionName);
89 if (actionDefinition != null) {
90 AvailabilityDefinition availability = actionDefinition.getAvailability();
91 List<Object> itemIdAsList = Arrays.<Object>asList(item.getItemId());
92 if (availabilityChecker.isAvailable(availability, itemIdAsList)) {
93 Object[] args = new Object[]{contentConnector.getItem(item.getItemId())};
94 actionExecutor.execute(actionName, args);
95 }
96 }
97 }
98
99 private String resolveActionForNodeType(String nodeType) {
100 for (DelegateByNodeTypeActionDefinition.NodeTypeToActionMapping nodeTypeToActionMapping : getDefinition().getNodeTypeToActionMappings()) {
101 if (nodeType.equals(nodeTypeToActionMapping.getNodeType())) {
102 return nodeTypeToActionMapping.getAction();
103 }
104 }
105 return null;
106 }
107
108 }