]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbActiveEnvsTreeView.java
Work on the active environments
[gpl/argeo-slc.git] / plugins / org.argeo.slc.akb.ui / src / main / java / org / argeo / slc / akb / ui / views / AkbActiveEnvsTreeView.java
diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbActiveEnvsTreeView.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbActiveEnvsTreeView.java
new file mode 100644 (file)
index 0000000..281f280
--- /dev/null
@@ -0,0 +1,411 @@
+/*\r
+ * Copyright (C) 2007-2012 Argeo GmbH\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *         http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package org.argeo.slc.akb.ui.views;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import javax.jcr.Node;\r
+import javax.jcr.NodeIterator;\r
+import javax.jcr.Repository;\r
+import javax.jcr.RepositoryException;\r
+import javax.jcr.Session;\r
+import javax.jcr.observation.Event;\r
+\r
+import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;\r
+import org.argeo.eclipse.ui.utils.CommandUtils;\r
+import org.argeo.jcr.JcrUtils;\r
+import org.argeo.slc.akb.AkbException;\r
+import org.argeo.slc.akb.AkbNames;\r
+import org.argeo.slc.akb.AkbService;\r
+import org.argeo.slc.akb.AkbTypes;\r
+import org.argeo.slc.akb.ui.AkbUiPlugin;\r
+import org.argeo.slc.akb.ui.AkbUiUtils;\r
+import org.argeo.slc.akb.ui.commands.DeleteAkbNodes;\r
+import org.argeo.slc.akb.ui.commands.OpenAkbNodeEditor;\r
+import org.argeo.slc.akb.ui.providers.AkbTreeLabelProvider;\r
+import org.argeo.slc.akb.ui.providers.TemplatesTreeContentProvider;\r
+import org.argeo.slc.akb.ui.utils.Refreshable;\r
+import org.argeo.slc.akb.utils.AkbJcrUtils;\r
+import org.eclipse.jface.action.IContributionItem;\r
+import org.eclipse.jface.action.IMenuListener;\r
+import org.eclipse.jface.action.IMenuManager;\r
+import org.eclipse.jface.action.MenuManager;\r
+import org.eclipse.jface.viewers.DoubleClickEvent;\r
+import org.eclipse.jface.viewers.IDoubleClickListener;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.jface.viewers.TreeViewer;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Menu;\r
+import org.eclipse.ui.IWorkbenchWindow;\r
+import org.eclipse.ui.part.ViewPart;\r
+import org.eclipse.ui.services.IServiceLocator;\r
+\r
+/** AKB Active environment tree view. */\r
+public class AkbActiveEnvsTreeView extends ViewPart implements Refreshable {\r
+\r
+       public final static String ID = AkbUiPlugin.PLUGIN_ID\r
+                       + ".akbActiveEnvsTreeView";\r
+\r
+       /* DEPENDENCY INJECTION */\r
+       private Session session;\r
+       private AkbService akbService;\r
+\r
+       // This page widgets\r
+       private TreeViewer envTreeViewer;\r
+\r
+       // Usefull business objects\r
+       private Node activeEnvsParentNode;\r
+\r
+       private void initialize() {\r
+               try {\r
+                       activeEnvsParentNode = session\r
+                                       .getNode(AkbNames.AKB_ENVIRONMENTS_BASE_PATH);\r
+               } catch (RepositoryException e) {\r
+                       throw new AkbException("unable to initialize AKB Browser view", e);\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public void createPartControl(Composite parent) {\r
+               initialize();\r
+               envTreeViewer = createTreeViewer(parent);\r
+               envTreeViewer.setInput(initializeTree());\r
+       }\r
+\r
+       // The main tree viewer\r
+       protected TreeViewer createTreeViewer(Composite parent) {\r
+               parent.setLayout(AkbUiUtils.gridLayoutNoBorder());\r
+               int style = SWT.BORDER | SWT.MULTI;\r
+\r
+               TreeViewer viewer = new TreeViewer(parent, style);\r
+               viewer.getTree().setLayoutData(\r
+                               new GridData(SWT.FILL, SWT.FILL, true, true));\r
+\r
+               viewer.setContentProvider(new TemplatesTreeContentProvider());\r
+               viewer.setLabelProvider(new AkbTreeLabelProvider());\r
+               viewer.addDoubleClickListener(new ViewDoubleClickListener());\r
+\r
+               getSite().setSelectionProvider(viewer);\r
+\r
+               // context menu\r
+               MenuManager menuManager = new MenuManager();\r
+               Menu menu = menuManager.createContextMenu(viewer.getTree());\r
+               menuManager.addMenuListener(new IMenuListener() {\r
+                       public void menuAboutToShow(IMenuManager manager) {\r
+                               contextMenuAboutToShow(manager);\r
+                       }\r
+               });\r
+               viewer.getTree().setMenu(menu);\r
+               menuManager.setRemoveAllWhenShown(true);\r
+               getSite().registerContextMenu(menuManager, viewer);\r
+\r
+               return viewer;\r
+       }\r
+\r
+       private Node[] initializeTree() {\r
+               try {\r
+                       NodeIterator ni = activeEnvsParentNode.getNodes();\r
+                       List<Node> envs = new ArrayList<Node>();\r
+                       while (ni.hasNext()) {\r
+                               Node currNode = ni.nextNode();\r
+                               if (currNode.isNodeType(AkbTypes.AKB_ENV))\r
+                                       envs.add(currNode);\r
+                       }\r
+                       Node[] envArr = envs.toArray(new Node[envs.size()]);\r
+                       return envArr;\r
+               } catch (RepositoryException re) {\r
+                       throw new AkbException("Error while initializing the "\r
+                                       + "tree of active environments.", re);\r
+               }\r
+       }\r
+\r
+       //////////////////////\r
+       /// LIFE CYCLE\r
+       \r
+       @Override\r
+       public void forceRefresh(Object object) {\r
+               envTreeViewer.setInput(initializeTree());\r
+       }\r
+       \r
+       @Override\r
+       public void setFocus() {\r
+       }\r
+\r
+       @Override\r
+       public void dispose() {\r
+               JcrUtils.logoutQuietly(session);\r
+               super.dispose();\r
+       }\r
+       \r
+       // ///////////////////////////\r
+       // CONTEXT MENU MANAGEMENT\r
+       /**\r
+        * Defines the commands that will pop up in the context menu.\r
+        **/\r
+       protected void contextMenuAboutToShow(IMenuManager menuManager) {\r
+               IWorkbenchWindow window = AkbUiPlugin.getDefault().getWorkbench()\r
+                               .getActiveWorkbenchWindow();\r
+               try {\r
+                       // Build conditions\r
+                       IStructuredSelection selection = (IStructuredSelection) envTreeViewer\r
+                                       .getSelection();\r
+\r
+                       Node selected = (Node) selection.getFirstElement();\r
+                       Node currEnv = null;\r
+\r
+                       boolean hasSelection = selected != null;\r
+\r
+                       if (hasSelection)\r
+                               currEnv = AkbJcrUtils.getCurrentTemplate(selected);\r
+\r
+                       boolean isTemplate = hasSelection ? selected\r
+                                       .isNodeType(AkbTypes.AKB_ENV_TEMPLATE) : false;\r
+                       boolean isParentItemsFolder = hasSelection ? selected\r
+                                       .isNodeType(AkbTypes.AKB_ITEM_FOLDER) : false;\r
+                       // boolean isParentConnectorsFolder = hasSelection ? selected\r
+                       // .isNodeType(AkbTypes.AKB_CONNECTOR_FOLDER) : false;\r
+                       boolean isDeletable = hasSelection ? true : false;\r
+\r
+                       // Add Connector Alias\r
+                       Map<String, String> params = new HashMap<String, String>();\r
+                       if (hasSelection && isTemplate) {\r
+                               params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID,\r
+                                               selected.getIdentifier());\r
+                               params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID,\r
+                                               currEnv.getIdentifier());\r
+                       }\r
+                       params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE,\r
+                                       AkbTypes.AKB_CONNECTOR_ALIAS);\r
+\r
+                       // Connector Alias submenu\r
+                       refreshAliasesSubmenu(menuManager, window, "menu.aliasesSubmenu",\r
+                                       "Add Connector Alias", isTemplate, params);\r
+\r
+                       // Item Submenu\r
+                       params = new HashMap<String, String>();\r
+                       if (hasSelection) {\r
+                               params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID,\r
+                                               selected.getIdentifier());\r
+                               params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID,\r
+                                               currEnv.getIdentifier());\r
+                       }\r
+                       refreshItemsSubmenu(menuManager, window, "menu.itemsSubmenu",\r
+                                       "Add Item", isParentItemsFolder || isTemplate, params);\r
+\r
+                       // Add Item Folder\r
+                       params = new HashMap<String, String>();\r
+                       if (hasSelection) {\r
+                               params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID,\r
+                                               selected.getIdentifier());\r
+                               params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID,\r
+                                               currEnv.getIdentifier());\r
+                       }\r
+                       params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE,\r
+                                       AkbTypes.AKB_ITEM_FOLDER);\r
+\r
+                       AkbUiUtils.refreshParameterizedCommand(menuManager, window,\r
+                                       "cmd.addItemFolder", OpenAkbNodeEditor.ID,\r
+                                       "Add item folder", null, isParentItemsFolder || isTemplate,\r
+                                       params);\r
+\r
+                       // Delete Item\r
+                       params = new HashMap<String, String>();\r
+                       if (hasSelection)\r
+                               params.put(DeleteAkbNodes.PARAM_NODE_JCR_ID,\r
+                                               selected.getIdentifier());\r
+                       AkbUiUtils.refreshParameterizedCommand(menuManager, window,\r
+                                       "cmd.deleteItem", DeleteAkbNodes.ID,\r
+                                       "Delete selected item(s)", null, isDeletable, params);\r
+\r
+                       // create template\r
+                       params = new HashMap<String, String>();\r
+                       params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID,\r
+                                       activeEnvsParentNode.getIdentifier());\r
+                       params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE,\r
+                                       AkbTypes.AKB_ENV_TEMPLATE);\r
+                       AkbUiUtils.refreshParameterizedCommand(menuManager, window,\r
+                                       "cmd.createTemplate", OpenAkbNodeEditor.ID,\r
+                                       "Create new template...", null,\r
+                                       !hasSelection || isTemplate, params);\r
+\r
+               } catch (RepositoryException re) {\r
+                       throw new AkbException("Error while refreshing context menu", re);\r
+               }\r
+       }\r
+\r
+       /**\r
+        * \r
+        * refreshes submenu with various connector types\r
+        * \r
+        * @param menuManager\r
+        * @param locator\r
+        * @param itemId\r
+        * @param label\r
+        * @param isVisible\r
+        * @param params\r
+        */\r
+       private void refreshItemsSubmenu(IMenuManager menuManager,\r
+                       IServiceLocator locator, String itemId, String label,\r
+                       boolean isVisible, Map<String, String> params) {\r
+\r
+               // clean\r
+               IContributionItem ici = menuManager.find(itemId);\r
+               if (ici != null)\r
+                       menuManager.remove(ici);\r
+\r
+               MenuManager subMenu = new MenuManager(label, itemId);\r
+\r
+               // JDBC Query\r
+               Map<String, String> tmpParams = new HashMap<String, String>();\r
+               tmpParams.putAll(params);\r
+               tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_TYPE,\r
+                               AkbTypes.AKB_JDBC_QUERY);\r
+               String currItemId = "cmd.createJDBCQuery";\r
+               IContributionItem currItem = subMenu.find(currItemId);\r
+               if (currItem != null)\r
+                       subMenu.remove(currItem);\r
+               subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator,\r
+                               currItemId, OpenAkbNodeEditor.ID, "JDBC", null, tmpParams));\r
+\r
+               // SSH COMMAND\r
+               tmpParams = new HashMap<String, String>();\r
+               tmpParams.putAll(params);\r
+               tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_TYPE,\r
+                               AkbTypes.AKB_SSH_COMMAND);\r
+               currItemId = "cmd.createSSHCommand";\r
+               currItem = subMenu.find(currItemId);\r
+               if (currItem != null)\r
+                       subMenu.remove(currItem);\r
+               subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator,\r
+                               currItemId, OpenAkbNodeEditor.ID, "SSH Command", null,\r
+                               tmpParams));\r
+\r
+               // SSH FILE\r
+               tmpParams = new HashMap<String, String>();\r
+               tmpParams.putAll(params);\r
+               tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, AkbTypes.AKB_SSH_FILE);\r
+               currItemId = "cmd.createSSHFile";\r
+               currItem = subMenu.find(currItemId);\r
+               if (currItem != null)\r
+                       subMenu.remove(currItem);\r
+               subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator,\r
+                               currItemId, OpenAkbNodeEditor.ID, "SSH File", null, tmpParams));\r
+\r
+               // refresh\r
+               menuManager.add(subMenu);\r
+               subMenu.setVisible(isVisible);\r
+       }\r
+\r
+       /**\r
+        * \r
+        * refreshes submenu with various connector types\r
+        * \r
+        * @param menuManager\r
+        * @param locator\r
+        * @param itemId\r
+        * @param label\r
+        * @param isVisible\r
+        * @param params\r
+        */\r
+       private void refreshAliasesSubmenu(IMenuManager menuManager,\r
+                       IServiceLocator locator, String itemId, String label,\r
+                       boolean isVisible, Map<String, String> params) {\r
+\r
+               // clean\r
+               IContributionItem ici = menuManager.find(itemId);\r
+               if (ici != null)\r
+                       menuManager.remove(ici);\r
+\r
+               // TODO use dynamic contribution to dynamically retrieve specific\r
+               // connector types\r
+               // CompoundContributionItem comConI = new MyCompoundCI(menuManager,\r
+               // locator, itemId);\r
+               MenuManager subMenu = new MenuManager(label, itemId);\r
+\r
+               // JDBC\r
+               Map<String, String> tmpParams = new HashMap<String, String>();\r
+               tmpParams.putAll(params);\r
+               tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_SUBTYPE,\r
+                               AkbTypes.AKB_JDBC_CONNECTOR);\r
+               String currItemId = "cmd.createJDBCAlias";\r
+               IContributionItem currItem = subMenu.find(currItemId);\r
+               if (currItem != null)\r
+                       subMenu.remove(currItem);\r
+               subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator,\r
+                               currItemId, OpenAkbNodeEditor.ID, "JDBC", null, tmpParams));\r
+\r
+               // SSH\r
+               tmpParams = new HashMap<String, String>();\r
+               tmpParams.putAll(params);\r
+               tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_SUBTYPE,\r
+                               AkbTypes.AKB_SSH_CONNECTOR);\r
+               currItemId = "cmd.createSSHAlias";\r
+               currItem = subMenu.find(currItemId);\r
+               if (currItem != null)\r
+                       subMenu.remove(currItem);\r
+               subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator,\r
+                               currItemId, OpenAkbNodeEditor.ID, "SSH", null, tmpParams));\r
+\r
+               // refresh\r
+               menuManager.add(subMenu);\r
+               subMenu.setVisible(isVisible);\r
+       }\r
+\r
+       /* INNER CLASSES */\r
+       class ViewDoubleClickListener implements IDoubleClickListener {\r
+               public void doubleClick(DoubleClickEvent evt) {\r
+                       Object obj = ((IStructuredSelection) evt.getSelection())\r
+                                       .getFirstElement();\r
+                       try {\r
+                               if (obj instanceof Node) {\r
+                                       Node node = (Node) obj;\r
+                                       Node currEnv = AkbJcrUtils.getCurrentTemplate(node);\r
+\r
+                                       // Add Connector Alias\r
+                                       Map<String, String> params = new HashMap<String, String>();\r
+                                       params.put(OpenAkbNodeEditor.PARAM_NODE_JCR_ID,\r
+                                                       node.getIdentifier());\r
+                                       params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID,\r
+                                                       currEnv.getIdentifier());\r
+\r
+                                       CommandUtils.callCommand(OpenAkbNodeEditor.ID, params);\r
+                               }\r
+                       } catch (RepositoryException e) {\r
+                               throw new AkbException("Cannot open " + obj, e);\r
+                       }\r
+               }\r
+       }\r
+\r
+       /* DEPENDENCY INJECTION */\r
+       public void setRepository(Repository repository) {\r
+               try {\r
+                       session = repository.login();\r
+               } catch (RepositoryException e) {\r
+                       throw new AkbException("unable to log in for " + ID + " view");\r
+               }\r
+       }\r
+\r
+       public void setAkbService(AkbService akbService) {\r
+               this.akbService = akbService;\r
+\r
+       }\r
+}
\ No newline at end of file