]> git.argeo.org Git - gpl/argeo-slc.git/blob - plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/OpenAkbNodeEditor.java
First unfinished drafts for items editors
[gpl/argeo-slc.git] / plugins / org.argeo.slc.akb.ui / src / main / java / org / argeo / slc / akb / ui / commands / OpenAkbNodeEditor.java
1 package org.argeo.slc.akb.ui.commands;
2
3 import javax.jcr.Node;
4 import javax.jcr.Property;
5 import javax.jcr.Repository;
6 import javax.jcr.RepositoryException;
7 import javax.jcr.Session;
8
9 import org.argeo.eclipse.ui.dialogs.SingleValue;
10 import org.argeo.jcr.JcrUtils;
11 import org.argeo.slc.akb.AkbException;
12 import org.argeo.slc.akb.AkbService;
13 import org.argeo.slc.akb.AkbTypes;
14 import org.argeo.slc.akb.ui.AkbUiPlugin;
15 import org.argeo.slc.akb.ui.dialogs.AddItemDialog;
16 import org.argeo.slc.akb.ui.editors.AkbNodeEditorInput;
17 import org.argeo.slc.akb.ui.editors.ConnectorAliasEditor;
18 import org.argeo.slc.akb.ui.editors.EnvTemplateEditor;
19 import org.argeo.slc.akb.ui.editors.JdbcQueryTemplateEditor;
20 import org.argeo.slc.akb.ui.editors.SshCommandTemplateEditor;
21 import org.argeo.slc.akb.ui.editors.SshFileTemplateEditor;
22 import org.eclipse.core.commands.AbstractHandler;
23 import org.eclipse.core.commands.ExecutionEvent;
24 import org.eclipse.core.commands.ExecutionException;
25 import org.eclipse.swt.widgets.Display;
26 import org.eclipse.ui.IWorkbenchPage;
27 import org.eclipse.ui.PartInitException;
28 import org.eclipse.ui.handlers.HandlerUtil;
29
30 /**
31 * Opens or show an AKB specific node in a single repository / single workspace
32 * environment given some parameters, namely :
33 * <ul>
34 * <li>PARAM_NODE_JCR_ID: the corresponding JCR ID might be null to create a new
35 * one</li>
36 * <li>PARAM_NODE_TYPE: jcr type of the node to create</li>
37 * <li>PARAM_PARENT_NODE_JCR_ID: Only used in the case of the creation of a new
38 * node.</li>
39 * </ul>
40 */
41 public class OpenAkbNodeEditor extends AbstractHandler {
42 public final static String ID = AkbUiPlugin.PLUGIN_ID
43 + ".openAkbNodeEditor";
44
45 /* DEPENDENCY INJECTION */
46 private Repository repository;
47 private AkbService akbService;
48
49 public final static String PARAM_NODE_JCR_ID = "param.nodeJcrId";
50 public final static String PARAM_NODE_TYPE = "param.nodeType";
51 public final static String PARAM_PARENT_NODE_JCR_ID = "param.parentNodeJcrId";
52
53 public Object execute(ExecutionEvent event) throws ExecutionException {
54
55 String nodeType = event.getParameter(PARAM_NODE_TYPE);
56 String nodeJcrId = event.getParameter(PARAM_NODE_JCR_ID);
57 String parentNodeJcrId = event.getParameter(PARAM_PARENT_NODE_JCR_ID);
58
59 Session session = null;
60 try {
61 // caches current Page
62 IWorkbenchPage currentPage = HandlerUtil.getActiveWorkbenchWindow(
63 event).getActivePage();
64
65 session = repository.login();
66 Node node = null;
67
68 if (nodeJcrId == null)
69 if (parentNodeJcrId == null)
70 throw new AkbException(
71 "Define a parent node to create a new node");
72 else
73 node = createNewNode(session, nodeType, parentNodeJcrId);
74 else
75 node = session.getNodeByIdentifier(nodeJcrId);
76
77 // no node has been found or created, return
78 if (node == null)
79 return null;
80
81 String editorId = getEditorForNode(node);
82
83 // no editor has been found, return silently
84 if (editorId == null)
85 return null;
86
87 AkbNodeEditorInput eei = new AkbNodeEditorInput(
88 node.getIdentifier());
89
90 currentPage.openEditor(eei, editorId);
91 } catch (PartInitException pie) {
92 throw new AkbException(
93 "Unexpected PartInitException while opening akb node editor",
94 pie);
95 } catch (RepositoryException e) {
96 throw new AkbException("unexpected JCR error while opening "
97 + nodeType + " editor", e);
98 } finally {
99 JcrUtils.logoutQuietly(session);
100 }
101 return null;
102 }
103
104 private Node createNewNode(Session session, String nodeType,
105 String parentNodeJcrId) throws RepositoryException {
106 Node node = null;
107
108 if (AkbTypes.AKB_ITEM.equals(nodeType)) {
109 Node parNode = session.getNodeByIdentifier(parentNodeJcrId);
110 AddItemDialog dialog = new AddItemDialog(Display.getDefault()
111 .getActiveShell(), "Add new item", parNode);
112 dialog.open();
113 node = dialog.getNewNode();
114 } else {
115 String name = SingleValue.ask("New name", "Create AKB item");
116 if (name == null)
117 return null;
118 if (AkbTypes.AKB_ENV_TEMPLATE.equals(nodeType)) {
119 node = akbService.createAkbTemplate(
120 session.getNodeByIdentifier(parentNodeJcrId), name);
121 } else {
122 Node parentNode = session.getNodeByIdentifier(parentNodeJcrId);
123 node = parentNode.addNode(name, nodeType);
124 node.setProperty(Property.JCR_TITLE, name);
125 }
126 }
127 // corresponding node is saved but not checked in, in order to ease
128 // cancel actions.
129 session.save();
130 return node;
131 }
132
133 private String getEditorForNode(Node node) throws RepositoryException {
134 String editorId = null;
135 if (node.isNodeType(AkbTypes.AKB_CONNECTOR_ALIAS))
136 editorId = ConnectorAliasEditor.ID;
137 else if (node.isNodeType(AkbTypes.AKB_ENV_TEMPLATE))
138 editorId = EnvTemplateEditor.ID;
139 else if (node.isNodeType(AkbTypes.AKB_SSH_FILE))
140 editorId = SshFileTemplateEditor.ID;
141 else if (node.isNodeType(AkbTypes.AKB_SSH_COMMAND))
142 editorId = SshCommandTemplateEditor.ID;
143 else if (node.isNodeType(AkbTypes.AKB_JDBC_QUERY))
144 editorId = JdbcQueryTemplateEditor.ID;
145 // else
146 // throw new AkbException("Editor is undefined for node " + node);
147 return editorId;
148 }
149
150 /* DEPENDENCY INJECTION */
151 public void setRepository(Repository repository) {
152 this.repository = repository;
153 }
154
155 public void setAkbService(AkbService akbService) {
156 this.akbService = akbService;
157 }
158 }