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
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
public void createPartControl(Composite parent) {\r
initialize();\r
\r
- resultTreeViewer = createResultsTreeViewer(parent);\r
- resultTreeViewer.setInput(initializeResultTree());\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
\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 Node[] initializeResultTree() {\r
+ private Node[] initializeTree() {\r
try {\r
-\r
NodeIterator ni = templatesParentNode.getNodes();\r
List<Node> templates = new ArrayList<Node>();\r
-\r
while (ni.hasNext()) {\r
Node currNode = ni.nextNode();\r
if (currNode.isNodeType(AkbTypes.AKB_ENV_TEMPLATE))\r
templates.add(currNode);\r
}\r
-\r
Node[] templateArr = templates.toArray(new Node[templates.size()]);\r
-\r
return templateArr;\r
} catch (RepositoryException re) {\r
throw new AkbException("Error while initializing templates Tree.",\r
}\r
}\r
\r
- // Manage context menu\r
+ @Override\r
+ public void forceRefresh(Object object) {\r
+ envTreeViewer.setInput(initializeTree());\r
+ }\r
+\r
+ // ///////////////////////////\r
+ // CONTEXT MENU MANAGEMENT\r
+\r
/**\r
* Defines the commands that will pop up in the context menu.\r
**/\r
IWorkbenchWindow window = AkbUiPlugin.getDefault().getWorkbench()\r
.getActiveWorkbenchWindow();\r
try {\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
-\r
- // Effective Refresh\r
- CommandUtils.refreshParametrizedCommand(menuManager, window,\r
- OpenAkbNodeEditor.ID, "Create new template...", null, true,\r
- params);\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 Query", 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
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
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