--- /dev/null
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.slc.akb.ui.providers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.argeo.slc.akb.AkbException;
+import org.argeo.slc.akb.AkbNames;
+import org.argeo.slc.akb.AkbTypes;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * Content provider for a tree of active AKB environments. Displays
+ * <CODE>ActiveTreeItem</CODE> to be able to display subtrees of item without
+ * duplicating the information from the corresponding template.
+ */
+public class ActiveEnvsTreeContentProvider implements ITreeContentProvider {
+ // private final static Log log = LogFactory
+ // .getLog(ActiveEnvsTreeContentProvider.class);
+
+ /**
+ * @param parent
+ * Pass current user home as parameter
+ *
+ */
+ public Object[] getElements(Object parent) {
+ if (parent instanceof Object[])
+ return (Object[]) parent;
+ else
+ return null;
+ }
+
+ public Object getParent(Object child) {
+ return ((ActiveTreeItem) child).getParent();
+ }
+
+ public Object[] getChildren(Object parent) {
+ try {
+ ActiveTreeItem currItem = (ActiveTreeItem) parent;
+ Node parNode = currItem.getNode();
+ Node envNode = currItem.getEnvironment();
+
+ if (parNode.isNodeType(AkbTypes.AKB_ENV)) {
+ Session session = parNode.getSession();
+ if (parNode.hasProperty(AkbNames.AKB_ENV_TEMPLATE_PATH)
+ && session.nodeExists(parNode.getProperty(
+ AkbNames.AKB_ENV_TEMPLATE_PATH).getString()))
+ parNode = session.getNode(parNode.getProperty(
+ AkbNames.AKB_ENV_TEMPLATE_PATH).getString());
+ else
+ return null;
+ }
+
+ NodeIterator ni = parNode.getNodes();
+ List<ActiveTreeItem> children = new ArrayList<ActiveTreeItem>();
+ while (ni.hasNext()) {
+ Node currNode = ni.nextNode();
+ if (!currNode.isNodeType(AkbTypes.AKB_CONNECTOR_FOLDER)) {
+ ActiveTreeItem currChild = new ActiveTreeItem(currItem,
+ currNode, envNode);
+ children.add(currChild);
+ }
+ }
+ return children.toArray();
+ } catch (RepositoryException e) {
+ throw new AkbException("Error while getting children nodes", e);
+ }
+ }
+
+ public boolean hasChildren(Object parent) {
+ try {
+ ActiveTreeItem currItem = (ActiveTreeItem) parent;
+ Node parNode = currItem.getNode();
+
+ if (parNode.isNodeType(AkbTypes.AKB_ENV)) {
+ Session session = parNode.getSession();
+ if (parNode.hasProperty(AkbNames.AKB_ENV_TEMPLATE_PATH)
+ && session.nodeExists(parNode.getProperty(
+ AkbNames.AKB_ENV_TEMPLATE_PATH).getString()))
+ parNode = session.getNode(parNode.getProperty(
+ AkbNames.AKB_ENV_TEMPLATE_PATH).getString());
+ else
+ return false;
+ }
+
+ return parNode.hasNodes();
+ } catch (RepositoryException e) {
+ throw new AkbException("Error while checking children nodes", e);
+ }
+ }
+
+ public void dispose() {
+ // FIXME implement if needed
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+}
\ No newline at end of file
--- /dev/null
+/*\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