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