]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/OpenAkbNodeEditor.java
work on active environments
[gpl/argeo-slc.git] / plugins / org.argeo.slc.akb.ui / src / main / java / org / argeo / slc / akb / ui / commands / OpenAkbNodeEditor.java
index c02f118b69d444444de9ef6a5bd3564ed9670b70..a04bde084265a38f7d51acb2dd80de88b7cf4a45 100644 (file)
@@ -1,20 +1,30 @@
 package org.argeo.slc.akb.ui.commands;
 
 import javax.jcr.Node;
+import javax.jcr.Property;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import org.argeo.eclipse.ui.dialogs.SingleValue;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.slc.akb.AkbException;
+import org.argeo.slc.akb.AkbService;
 import org.argeo.slc.akb.AkbTypes;
+import org.argeo.slc.akb.ui.AkbMessages;
 import org.argeo.slc.akb.ui.AkbUiPlugin;
-import org.argeo.slc.akb.ui.editors.AkbConnectorAliasEditor;
-import org.argeo.slc.akb.ui.editors.AkbEnvTemplateEditor;
+import org.argeo.slc.akb.ui.dialogs.AddItemDialog;
 import org.argeo.slc.akb.ui.editors.AkbNodeEditorInput;
+import org.argeo.slc.akb.ui.editors.ConnectorAliasEditor;
+import org.argeo.slc.akb.ui.editors.EnvTemplateEditor;
+import org.argeo.slc.akb.ui.editors.JdbcQueryTemplateEditor;
+import org.argeo.slc.akb.ui.editors.SshCommandTemplateEditor;
+import org.argeo.slc.akb.ui.editors.SshFileTemplateEditor;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.handlers.HandlerUtil;
 
@@ -35,19 +45,28 @@ public class OpenAkbNodeEditor extends AbstractHandler {
 
        /* DEPENDENCY INJECTION */
        private Repository repository;
+       private AkbService akbService;
 
        public final static String PARAM_NODE_JCR_ID = "param.nodeJcrId";
        public final static String PARAM_NODE_TYPE = "param.nodeType";
+       public final static String PARAM_NODE_SUBTYPE = "param.nodeSubtype";
+       public final static String PARAM_CURR_ENV_JCR_ID = "param.currEnvJcrId";
        public final static String PARAM_PARENT_NODE_JCR_ID = "param.parentNodeJcrId";
 
        public Object execute(ExecutionEvent event) throws ExecutionException {
 
                String nodeType = event.getParameter(PARAM_NODE_TYPE);
+               String nodeSubtype = event.getParameter(PARAM_NODE_SUBTYPE);
+               String currEnvJcrId = event.getParameter(PARAM_CURR_ENV_JCR_ID);
                String nodeJcrId = event.getParameter(PARAM_NODE_JCR_ID);
                String parentNodeJcrId = event.getParameter(PARAM_PARENT_NODE_JCR_ID);
 
                Session session = null;
                try {
+                       // caches current Page
+                       IWorkbenchPage currentPage = HandlerUtil.getActiveWorkbenchWindow(
+                                       event).getActivePage();
+
                        session = repository.login();
                        Node node = null;
 
@@ -56,17 +75,25 @@ public class OpenAkbNodeEditor extends AbstractHandler {
                                        throw new AkbException(
                                                        "Define a parent node to create a new node");
                                else
-                                       node = createNewNode(session, nodeType, parentNodeJcrId);
+                                       node = createNewNode(session, nodeType, nodeSubtype,
+                                                       parentNodeJcrId);
                        else
                                node = session.getNodeByIdentifier(nodeJcrId);
 
+                       // no node has been found or created, return
+                       if (node == null)
+                               return null;
+
                        String editorId = getEditorForNode(node);
 
-                       AkbNodeEditorInput eei = new AkbNodeEditorInput(
+                       // no editor has been found, return silently
+                       if (editorId == null)
+                               return null;
+
+                       AkbNodeEditorInput eei = new AkbNodeEditorInput(currEnvJcrId,
                                        node.getIdentifier());
 
-                       HandlerUtil.getActiveWorkbenchWindow(event).getActivePage()
-                                       .openEditor(eei, editorId);
+                       currentPage.openEditor(eei, editorId);
                } catch (PartInitException pie) {
                        throw new AkbException(
                                        "Unexpected PartInitException while opening akb node editor",
@@ -81,9 +108,42 @@ public class OpenAkbNodeEditor extends AbstractHandler {
        }
 
        private Node createNewNode(Session session, String nodeType,
-                       String parentNodeJcrId) throws RepositoryException {
-               Node parentNode = session.getNodeByIdentifier(parentNodeJcrId);
-               Node node = parentNode.addNode("new", nodeType);
+                       String nodeSubtype, String parentNodeJcrId)
+                       throws RepositoryException {
+               Node node = null;
+
+               if (AkbTypes.AKB_ITEM.equals(nodeType)) {
+                       Node parNode = session.getNodeByIdentifier(parentNodeJcrId);
+                       AddItemDialog dialog = new AddItemDialog(Display.getDefault()
+                                       .getActiveShell(), "Add new item", parNode);
+                       dialog.open();
+                       node = dialog.getNewNode();
+               } else {
+                       String name = SingleValue
+                                       .ask("Create "
+                                                       + AkbMessages
+                                                                       .getLabelForType(nodeSubtype == null ? nodeType
+                                                                                       : nodeSubtype),
+                                                       "Please enter a name for the corresponding "
+                                                                       + AkbMessages
+                                                                                       .getLabelForType(nodeSubtype == null ? nodeType
+                                                                                                       : nodeSubtype));
+                       if (name == null)
+                               return null;
+                       if (AkbTypes.AKB_ENV_TEMPLATE.equals(nodeType)) {
+                               node = akbService.createAkbTemplate(
+                                               session.getNodeByIdentifier(parentNodeJcrId), name);
+                       } else if (AkbTypes.AKB_CONNECTOR_ALIAS.equals(nodeType)) {
+                               // the Jcr ID of the corresponding template must be passed to
+                               // create a new alias
+                               node = session.getNodeByIdentifier(parentNodeJcrId);
+                               akbService.createConnectorAlias(node, name, nodeSubtype);
+                       } else {
+                               Node parentNode = session.getNodeByIdentifier(parentNodeJcrId);
+                               node = parentNode.addNode(name, nodeType);
+                               node.setProperty(Property.JCR_TITLE, name);
+                       }
+               }
                // corresponding node is saved but not checked in, in order to ease
                // cancel actions.
                session.save();
@@ -92,13 +152,18 @@ public class OpenAkbNodeEditor extends AbstractHandler {
 
        private String getEditorForNode(Node node) throws RepositoryException {
                String editorId = null;
-
                if (node.isNodeType(AkbTypes.AKB_CONNECTOR_ALIAS))
-                       editorId = AkbConnectorAliasEditor.ID;
+                       editorId = ConnectorAliasEditor.ID;
                else if (node.isNodeType(AkbTypes.AKB_ENV_TEMPLATE))
-                       editorId = AkbEnvTemplateEditor.ID;
-               else
-                       throw new AkbException("Editor is undefined for node " + node);
+                       editorId = EnvTemplateEditor.ID;
+               else if (node.isNodeType(AkbTypes.AKB_SSH_FILE))
+                       editorId = SshFileTemplateEditor.ID;
+               else if (node.isNodeType(AkbTypes.AKB_SSH_COMMAND))
+                       editorId = SshCommandTemplateEditor.ID;
+               else if (node.isNodeType(AkbTypes.AKB_JDBC_QUERY))
+                       editorId = JdbcQueryTemplateEditor.ID;
+               // else
+               // throw new AkbException("Editor is undefined for node " + node);
                return editorId;
        }
 
@@ -106,4 +171,8 @@ public class OpenAkbNodeEditor extends AbstractHandler {
        public void setRepository(Repository repository) {
                this.repository = repository;
        }
+
+       public void setAkbService(AkbService akbService) {
+               this.akbService = akbService;
+       }
 }
\ No newline at end of file