+/*\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