]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbTemplatesTreeView.java
Add order on trees.
[gpl/argeo-slc.git] / plugins / org.argeo.slc.akb.ui / src / main / java / org / argeo / slc / akb / ui / views / AkbTemplatesTreeView.java
index 9e82b4bebcfbeed546fbcdc79eadaa870dad1c57..7028663b54e9aa0ae95585442372df4da5f0491a 100644 (file)
  */\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
+import javax.jcr.observation.EventListener;\r
+import javax.jcr.observation.ObservationManager;\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.AkbItemsComparator;\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
@@ -41,46 +56,36 @@ import org.eclipse.jface.viewers.TreeViewer;
 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
-/** SLC generic JCR Result tree view. */\r
-public class AkbTemplatesTreeView extends ViewPart {\r
+/** AKB template tree view. */\r
+public class AkbTemplatesTreeView extends ViewPart implements Refreshable {\r
        // private final static Log log =\r
-       // LogFactory.getLog(JcrResultTreeView.class);\r
+       // LogFactory.getLog(AkbTemplatesTreeView.class);\r
 \r
        public final static String ID = AkbUiPlugin.PLUGIN_ID\r
                        + ".akbTemplatesTreeView";\r
 \r
        /* DEPENDENCY INJECTION */\r
        private Session session;\r
+       private AkbService akbService;\r
 \r
        // This page widgets\r
-       private TreeViewer resultTreeViewer;\r
+       private TreeViewer envTreeViewer;\r
 \r
        // Usefull business objects\r
        private Node templatesParentNode;\r
 \r
-       // private EventListener myResultsObserver = null;\r
-       // private EventListener allResultsObserver = null;\r
-       //\r
-       // // under My Results\r
-       // private final static String[] observedNodeTypesUnderMyResult = {\r
-       // SlcTypes.SLC_TEST_RESULT, SlcTypes.SLC_RESULT_FOLDER,\r
-       // SlcTypes.SLC_MY_RESULT_ROOT_FOLDER };\r
-       //\r
-       // private final static String[] observedNodeTypesUnderAllResults = {\r
-       // SlcTypes.SLC_TEST_RESULT, NodeType.NT_UNSTRUCTURED };\r
-       //\r
-       // private boolean isResultFolder = false;\r
-\r
-       // /**\r
-       // * To be overridden to adapt size of form and result frames.\r
-       // */\r
-       // protected int[] getWeights() {\r
-       // return new int[] { 70, 30 };\r
-       // }\r
+       // Observer\r
+       private EventListener akbNodesObserver = null;\r
+       private final static String[] observedNodeTypes = {\r
+                       AkbTypes.AKB_ENV_TEMPLATE, AkbTypes.AKB_CONNECTOR_ALIAS,\r
+                       AkbTypes.AKB_ITEM, AkbTypes.AKB_ITEM_FOLDER,\r
+                       AkbTypes.AKB_CONNECTOR_FOLDER };\r
 \r
        private void initialize() {\r
                try {\r
@@ -95,67 +100,14 @@ public class AkbTemplatesTreeView extends ViewPart {
        public void createPartControl(Composite parent) {\r
                initialize();\r
 \r
-               createResultsTreeViewer(parent);\r
-\r
-               // parent.setLayout(new FillLayout());\r
-               // // Main layout\r
-               // SashForm sashForm = new SashForm(parent, SWT.VERTICAL);\r
-               // sashForm.setSashWidth(4);\r
-               // sashForm.setLayout(new FillLayout());\r
-\r
-               // Create the tree on top of the view\r
-               // Composite top = new Composite(sashForm, SWT.NONE);\r
-               // GridLayout gl = new GridLayout(1, false);\r
-               // top.setLayout(gl);\r
-               // resultTreeViewer = createResultsTreeViewer(top);\r
-\r
-               // // Create the property viewer on the bottom\r
-               // Composite bottom = new Composite(sashForm, SWT.NONE);\r
-               // bottom.setLayout(new GridLayout(1, false));\r
-               // propertiesViewer = createPropertiesViewer(bottom);\r
-               //\r
-               // sashForm.setWeights(getWeights());\r
-\r
-               // setOrderedInput(resultTreeViewer);\r
-\r
-               // Initialize observer\r
-               // try {\r
-               // ObservationManager observationManager = session.getWorkspace()\r
-               // .getObservationManager();\r
-               // myResultsObserver = new MyResultsObserver(resultTreeViewer\r
-               // .getTree().getDisplay());\r
-               // allResultsObserver = new AllResultsObserver(resultTreeViewer\r
-               // .getTree().getDisplay());\r
-               //\r
-               // // observe tree changes under MyResults\r
-               // observationManager.addEventListener(myResultsObserver,\r
-               // Event.NODE_ADDED | Event.NODE_REMOVED,\r
-               // SlcJcrResultUtils.getMyResultsBasePath(session), true,\r
-               // null, observedNodeTypesUnderMyResult, false);\r
-               // // observe tree changes under All results\r
-               // observationManager.addEventListener(allResultsObserver,\r
-               // Event.NODE_ADDED | Event.NODE_REMOVED,\r
-               // SlcJcrResultUtils.getSlcResultsBasePath(session), true,\r
-               // null, observedNodeTypesUnderAllResults, false);\r
-               // } catch (RepositoryException e) {\r
-               // throw new SlcException("Cannot register listeners", e);\r
-               // }\r
+               envTreeViewer = createTreeViewer(parent);\r
+               envTreeViewer.setInput(initializeTree());\r
+               envTreeViewer.setComparator(new AkbItemsComparator());\r
        }\r
 \r
-       /**\r
-        * Override default behaviour so that default defined order remains\r
-        * unchanged on first level of the tree\r
-        */\r
-       // private void setOrderedInput(TreeViewer viewer) {\r
-       // // Add specific ordering\r
-       // viewer.setInput(null);\r
-       // viewer.setComparator(null);\r
-       // viewer.setInput(initializeResultTree());\r
-       // viewer.setComparator(new ResultItemsComparator());\r
-       // }\r
-\r
        // The main tree viewer\r
-       protected TreeViewer createResultsTreeViewer(Composite parent) {\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
@@ -173,12 +125,6 @@ public class AkbTemplatesTreeView extends ViewPart {
                // .getDecoratorManager().getLabelDecorator();\r
                // viewer.setLabelProvider(new DecoratingLabelProvider(rtLblProvider,\r
                // decorator));\r
-               // viewer.addDoubleClickListener(new ViewDoubleClickListener());\r
-\r
-               // Override default behaviour to insure that 2 distincts results that\r
-               // have the same name will be correctly and distincly returned by\r
-               // corresponding TreeViewer.getSelection() method.\r
-               // viewer.setComparer(new ResultItemsComparer());\r
 \r
                getSite().setSelectionProvider(viewer);\r
 \r
@@ -201,81 +147,52 @@ public class AkbTemplatesTreeView extends ViewPart {
 \r
                getSite().registerContextMenu(menuManager, viewer);\r
 \r
-               // add change listener to display TestResult information in the property\r
-               // viewer\r
-               // viewer.addSelectionChangedListener(new MySelectionChangedListener());\r
+               // Initialize observer\r
+               try {\r
+                       ObservationManager observationManager = session.getWorkspace()\r
+                                       .getObservationManager();\r
+\r
+                       akbNodesObserver = new AkbNodesObserver(viewer.getTree()\r
+                                       .getDisplay());\r
+                       observationManager.addEventListener(akbNodesObserver,\r
+                                       Event.NODE_ADDED | Event.NODE_REMOVED,\r
+                                       templatesParentNode.getPath(), true, null,\r
+                                       observedNodeTypes, false);\r
+               } catch (RepositoryException e) {\r
+                       throw new AkbException("Cannot register listeners", e);\r
+               }\r
                return viewer;\r
        }\r
 \r
-       // Detailed property viewer\r
-       // protected TableViewer createPropertiesViewer(Composite parent) {\r
-       // }\r
-\r
        @Override\r
        public void setFocus() {\r
        }\r
 \r
-       // private ResultParent[] initializeResultTree() {\r
-       // try {\r
-       // // Force initialization of the tree structure if needed\r
-       // SlcJcrResultUtils.getSlcResultsParentNode(session);\r
-       // SlcJcrResultUtils.getMyResultParentNode(session);\r
-       // // Remove yesterday and last 7 days virtual folders\r
-       // // ResultParent[] roots = new ResultParent[5];\r
-       // ResultParent[] roots = new ResultParent[3];\r
-       //\r
-       // // My results\r
-       // roots[0] = new ParentNodeFolder(null,\r
-       // SlcJcrResultUtils.getMyResultParentNode(session),\r
-       // SlcUiConstants.DEFAULT_MY_RESULTS_FOLDER_LABEL);\r
-       //\r
-       // // today\r
-       // Calendar cal = Calendar.getInstance();\r
-       // String relPath = JcrUtils.dateAsPath(cal);\r
-       // List<String> datePathes = new ArrayList<String>();\r
-       // datePathes.add(relPath);\r
-       // roots[1] = new VirtualFolder(null,\r
-       // ResultParentUtils.getResultsForDates(session, datePathes),\r
-       // "Today");\r
-       //\r
-       // // // Yesterday\r
-       // // cal = Calendar.getInstance();\r
-       // // cal.add(Calendar.DAY_OF_YEAR, -1);\r
-       // // relPath = JcrUtils.dateAsPath(cal);\r
-       // // datePathes = new ArrayList<String>();\r
-       // // datePathes.add(relPath);\r
-       // // roots[2] = new VirtualFolder(null,\r
-       // // ResultParentUtils.getResultsForDates(session, datePathes),\r
-       // // "Yesterday");\r
-       // // // Last 7 days\r
-       // //\r
-       // // cal = Calendar.getInstance();\r
-       // // datePathes = new ArrayList<String>();\r
-       // //\r
-       // // for (int i = 0; i < 7; i++) {\r
-       // // cal.add(Calendar.DAY_OF_YEAR, -i);\r
-       // // relPath = JcrUtils.dateAsPath(cal);\r
-       // // datePathes.add(relPath);\r
-       // // }\r
-       // // roots[3] = new VirtualFolder(null,\r
-       // // ResultParentUtils.getResultsForDates(session, datePathes),\r
-       // // "Last 7 days");\r
-       //\r
-       // // All results\r
-       // Node otherResultsPar = session.getNode(SlcJcrResultUtils\r
-       // .getSlcResultsBasePath(session));\r
-       // // roots[4] = new ParentNodeFolder(null, otherResultsPar,\r
-       // // "All results");\r
-       // roots[2] = new ParentNodeFolder(null, otherResultsPar,\r
-       // "All results");\r
-       // return roots;\r
-       // } catch (RepositoryException re) {\r
-       // throw new ArgeoException(\r
-       // "Unexpected error while initializing ResultTree.", re);\r
-       // }\r
-       // }\r
+       private Node[] initializeTree() {\r
+               try {\r
+                       NodeIterator ni = templatesParentNode.getNodes();\r
+                       List<Node> templates = new ArrayList<Node>();\r
+                       while (ni.hasNext()) {\r
+                               Node currNode = ni.nextNode();\r
+                               if (currNode.isNodeType(AkbTypes.AKB_ENV_TEMPLATE))\r
+                                       templates.add(currNode);\r
+                       }\r
+                       Node[] templateArr = templates.toArray(new Node[templates.size()]);\r
+                       return templateArr;\r
+               } catch (RepositoryException re) {\r
+                       throw new AkbException("Error while initializing templates Tree.",\r
+                                       re);\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public void forceRefresh(Object object) {\r
+               envTreeViewer.setInput(initializeTree());\r
+       }\r
+\r
+       // ///////////////////////////\r
+       // CONTEXT MENU MANAGEMENT\r
 \r
-       // Manage context menu\r
        /**\r
         * Defines the commands that will pop up in the context menu.\r
         **/\r
@@ -283,104 +200,275 @@ public class AkbTemplatesTreeView extends ViewPart {
                IWorkbenchWindow window = AkbUiPlugin.getDefault().getWorkbench()\r
                                .getActiveWorkbenchWindow();\r
                try {\r
-                       // IStructuredSelection selection = (IStructuredSelection)\r
-                       // resultTreeViewer\r
-                       // .getSelection();\r
-                       // boolean canAddSubfolder = false;\r
-                       // boolean canRenamefolder = false;\r
-                       // boolean isSingleResultNode = false;\r
-                       // boolean isUnderMyResult = false;\r
-                       // boolean validMultipleDelete = false;\r
-                       //\r
-                       // // Building conditions\r
-                       // if (selection.size() == 1) {\r
-                       // Object obj = selection.getFirstElement();\r
-                       // if (obj instanceof SingleResultNode)\r
-                       // isSingleResultNode = true;\r
-                       // else if (obj instanceof ParentNodeFolder) {\r
-                       // Node cNode = ((ParentNodeFolder) obj).getNode();\r
-                       // if (cNode.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) {\r
-                       // canAddSubfolder = true;\r
-                       // canRenamefolder = true;\r
-                       // isUnderMyResult = true;\r
-                       // } else if (cNode\r
-                       // .isNodeType(SlcTypes.SLC_MY_RESULT_ROOT_FOLDER)) {\r
-                       // canAddSubfolder = true;\r
-                       // }\r
-                       // }\r
-                       // } else {\r
-                       // @SuppressWarnings("rawtypes")\r
-                       // Iterator it = selection.iterator();\r
-                       // multicheck: while (it.hasNext()) {\r
-                       // validMultipleDelete = true;\r
-                       // Object obj = it.next();\r
-                       // if (obj instanceof SingleResultNode)\r
-                       // continue multicheck;\r
-                       // else if (obj instanceof ParentNodeFolder) {\r
-                       // Node cNode = ((ParentNodeFolder) obj).getNode();\r
-                       // if (cNode.isNodeType(SlcTypes.SLC_RESULT_FOLDER))\r
-                       // continue multicheck;\r
-                       // else {\r
-                       // validMultipleDelete = false;\r
-                       // break multicheck;\r
-                       // }\r
-                       // } else {\r
-                       // validMultipleDelete = false;\r
-                       // break multicheck;\r
-                       // }\r
-                       // }\r
-                       // }\r
 \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
                                        templatesParentNode.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
-                       // Effective Refresh\r
-                       CommandUtils.refreshParametrizedCommand(menuManager, window,\r
-                                       OpenAkbNodeEditor.ID, "Create new template...", null, true,\r
-                                       params);\r
-\r
-                       //\r
-                       // CommandUtils.refreshCommand(menuManager, window, DeleteItems.ID,\r
-                       // DeleteItems.DEFAULT_LABEL, DeleteItems.DEFAULT_IMG_DESCRIPTOR,\r
-                       // isUnderMyResult || isSingleResultNode || validMultipleDelete);\r
-                       //\r
-                       // CommandUtils.refreshCommand(menuManager, window,\r
-                       // AddResultFolder.ID,\r
-                       // AddResultFolder.DEFAULT_LABEL,\r
-                       // ClientUiPlugin.getDefault().getWorkbench().getSharedImages()\r
-                       // .getImageDescriptor(ISharedImages.IMG_OBJ_ADD),\r
-                       // canAddSubfolder);\r
-                       //\r
-                       // CommandUtils.refreshCommand(menuManager, window,\r
-                       // RenameResultFolder.ID,\r
-                       // RenameResultFolder.DEFAULT_LABEL,\r
-                       // RenameResultFolder.DEFAULT_IMG_DESCRIPTOR, canRenamefolder);\r
-                       //\r
-                       // // Command removed for the time being.\r
-                       // CommandUtils.refreshCommand(menuManager, window,\r
-                       // RenameResultNode.ID,\r
-                       // RenameResultNode.DEFAULT_LABEL,\r
-                       // RenameResultNode.DEFAULT_IMG_DESCRIPTOR, false);\r
-                       //\r
-                       // // Test to be removed\r
-                       // // If you use this pattern, do not forget to call\r
-                       // // menuManager.setRemoveAllWhenShown(true);\r
-                       // // when creating the menuManager\r
-                       //\r
-                       // // menuManager.add(new Action("Test") {\r
-                       // // public void run() {\r
-                       // // log.debug("do something");\r
-                       // // }\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
+       // private class MyCompoundCI extends CompoundContributionItem {\r
+       // private IMenuManager menuManager;\r
+       // private IServiceLocator locator;\r
+       //\r
+       // public MyCompoundCI(IMenuManager menuManager, IServiceLocator locator,\r
+       // String itemId) {\r
+       // super(itemId);\r
+       // this.menuManager = menuManager;\r
+       // this.locator = locator;\r
+       // }\r
+       //\r
+       // @Override\r
+       // protected IContributionItem[] getContributionItems() {\r
+       //\r
+       // CommandContributionItem[] submenu = new CommandContributionItem[2];\r
+       // submenu[0] = createContributionItem(menuManager, locator, "uid.1",\r
+       // OpenAkbNodeEditor.ID, "test1" + System.currentTimeMillis(),\r
+       // null, null);\r
+       // submenu[1] = createContributionItem(menuManager, locator, "uid.2",\r
+       // OpenAkbNodeEditor.ID, "test2", null, null);\r
+       // return submenu;\r
+       // }\r
+       // }\r
+\r
        /* INNER CLASSES */\r
+       private class AkbNodesObserver extends AsyncUiEventListener {\r
+\r
+               public AkbNodesObserver(Display display) {\r
+                       super(display);\r
+               }\r
+\r
+               @Override\r
+               protected Boolean willProcessInUiThread(List<Event> events)\r
+                               throws RepositoryException {\r
+                       // unfiltered for the time being\r
+                       return true;\r
+               }\r
+\r
+               protected void onEventInUiThread(List<Event> events)\r
+                               throws RepositoryException {\r
+                       boolean fullRefresh = false;\r
+\r
+                       eventLoop: for (Event event : events) {\r
+                               String currPath = event.getPath();\r
+                               if (session.nodeExists(currPath)) {\r
+                                       Node node = session.getNode(currPath);\r
+                                       if (node.isNodeType(AkbTypes.AKB_ENV_TEMPLATE)) {\r
+                                               fullRefresh = true;\r
+                                               break eventLoop;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       Object[] visibles = envTreeViewer.getExpandedElements();\r
+                       if (fullRefresh)\r
+                               envTreeViewer.setInput(initializeTree());\r
+                       else\r
+                               envTreeViewer.refresh();\r
+\r
+                       envTreeViewer.setExpandedElements(visibles);\r
+               }\r
+       }\r
+\r
        class ViewDoubleClickListener implements IDoubleClickListener {\r
                public void doubleClick(DoubleClickEvent evt) {\r
                        Object obj = ((IStructuredSelection) evt.getSelection())\r
@@ -388,9 +476,16 @@ public class AkbTemplatesTreeView extends ViewPart {
                        try {\r
                                if (obj instanceof Node) {\r
                                        Node node = (Node) obj;\r
-                                       CommandUtils.callCommand(OpenAkbNodeEditor.ID,\r
-                                                       OpenAkbNodeEditor.PARAM_NODE_JCR_ID,\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
@@ -398,60 +493,11 @@ public class AkbTemplatesTreeView extends ViewPart {
                }\r
        }\r
 \r
-       // class MyResultsObserver extends AsyncUiEventListener {\r
-       //\r
-       // public MyResultsObserver(Display display) {\r
-       // super(display);\r
-       // }\r
-       //\r
-       // @Override\r
-       // protected Boolean willProcessInUiThread(List<Event> events)\r
-       // throws RepositoryException {\r
-       // // unfiltered for the time being\r
-       // return true;\r
-       // }\r
-       //\r
-       // protected void onEventInUiThread(List<Event> events)\r
-       // throws RepositoryException {\r
-       // List<Node> nodesToRefresh = new ArrayList<Node>();\r
-       //\r
-       // for (Event event : events) {\r
-       // String parPath = JcrUtils.parentPath(event.getPath());\r
-       // if (session.nodeExists(parPath)) {\r
-       // Node node = session.getNode(parPath);\r
-       // if (!nodesToRefresh.contains(node)) {\r
-       // nodesToRefresh.add(node);\r
-       // }\r
-       // }\r
-       // }\r
-       //\r
-       // // Update check nodes\r
-       // for (Node node : nodesToRefresh)\r
-       // jcrRefresh(node);\r
-       // refresh(null);\r
-       // }\r
-       // }\r
-\r
-       // class AllResultsObserver extends AsyncUiEventListener {\r
-       //\r
-       // public AllResultsObserver(Display display) {\r
-       // super(display);\r
-       // }\r
-       //\r
-       // @Override\r
-       // protected Boolean willProcessInUiThread(List<Event> events)\r
-       // throws RepositoryException {\r
-       // // unfiltered for the time being\r
-       // return true;\r
-       // }\r
-       //\r
-       // protected void onEventInUiThread(List<Event> events)\r
-       // throws RepositoryException {\r
-       // refresh(null);\r
-       // // if (lastSelectedSourceElementParent != null)\r
-       // // refresh(lastSelectedSourceElementParent);\r
-       // }\r
-       // }\r
+       @Override\r
+       public void dispose() {\r
+               JcrUtils.logoutQuietly(session);\r
+               super.dispose();\r
+       }\r
 \r
        /* DEPENDENCY INJECTION */\r
        public void setRepository(Repository repository) {\r
@@ -461,4 +507,9 @@ public class AkbTemplatesTreeView extends ViewPart {
                        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