View Javadoc
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  			// confirmation
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  			// Boolean doRemove =
65  			// MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Confirm
66  			// deletion",
67  			// "Do you want to delete " + buf + "?");
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 }