1 package org.argeo.connect.e4.handlers;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.inject.Inject;
7 import javax.inject.Named;
8 import javax.jcr.Node;
9 import javax.jcr.Property;
10 import javax.jcr.RepositoryException;
11 import javax.jcr.Session;
12
13 import org.argeo.cms.ui.dialogs.CmsMessageDialog;
14 import org.argeo.connect.ConnectException;
15 import org.argeo.connect.e4.ConnectE4Constants;
16 import org.argeo.connect.e4.ConnectE4Msg;
17 import org.argeo.connect.e4.parts.AbstractConnectEditor;
18 import org.argeo.jcr.JcrUtils;
19 import org.eclipse.e4.core.di.annotations.CanExecute;
20 import org.eclipse.e4.core.di.annotations.Execute;
21 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
22 import org.eclipse.e4.ui.services.IServiceConstants;
23 import org.eclipse.e4.ui.workbench.modeling.EPartService;
24 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
25
26 public class DeleteSelectedEntity {
27 @Inject
28 EPartService partService;
29
30 @Execute
31 public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part, ESelectionService selectionService) {
32 Session newSession = null;
33 try {
34 @SuppressWarnings("unchecked")
35 List<Object> selection = (List<Object>) selectionService.getSelection();
36 if (selection == null) {
37 if (part.getObject() instanceof AbstractConnectEditor) {
38 Node entity = ((AbstractConnectEditor) part.getObject()).getNode();
39 newSession = entity.getSession().getRepository().login();
40 Node newNode = newSession.getNodeByIdentifier(entity.getIdentifier());
41 selection = new ArrayList<>();
42 selection.add(newNode);
43 } else
44 return;
45 }
46
47 List<String> idsToDelete = new ArrayList<>();
48 StringBuffer buf = new StringBuffer("");
49 for (int i = 0; i < selection.size(); i++) {
50 if (selection.get(i) instanceof Node) {
51 Node sjn = (Node) selection.get(i);
52 idsToDelete.add(sjn.getIdentifier());
53 String name;
54 if (sjn.hasProperty(Property.JCR_TITLE)) {
55 name = sjn.getProperty(Property.JCR_TITLE).getString();
56 } else {
57 name = sjn.getName();
58 }
59 if (i != 0)
60 buf.append(", ");
61 buf.append('\'').append(name).append('\'');
62 }
63 }
64
65
66
67
68 String msg = ConnectE4Msg.confirmEntityDeletion.format(new String[] { buf.toString() });
69 Boolean doRemove = CmsMessageDialog.openConfirm(msg);
70
71 if (doRemove) {
72 closeEditors(idsToDelete);
73 for (Object obj : selection) {
74 if (obj instanceof Node) {
75 Node node = (Node) obj;
76 node.remove();
77 node.getSession().save();
78 }
79 }
80 }
81 } catch (RepositoryException e) {
82 throw new ConnectException("Cannot delete entities", e);
83 } finally {
84 JcrUtils.logoutQuietly(newSession);
85 }
86 }
87
88 @CanExecute
89 public boolean canExecute(@Named(IServiceConstants.ACTIVE_PART) MPart part, ESelectionService selectionService) {
90 return selectionService.getSelection() != null || part.getObject() instanceof AbstractConnectEditor;
91 }
92
93 private void closeEditors(List<String> idsToDelete) {
94 for (MPart part : partService.getParts()) {
95 String id = part.getPersistedState().get(ConnectE4Constants.ENTITY_ID);
96 if (idsToDelete.contains(id)) {
97 partService.hidePart(part, true);
98 }
99 }
100
101 }
102 }