2 * Copyright (C) 2007-2012 Argeo GmbH
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org
.argeo
.slc
.akb
.ui
.views
;
18 import java
.util
.ArrayList
;
19 import java
.util
.HashMap
;
20 import java
.util
.List
;
23 import javax
.jcr
.Node
;
24 import javax
.jcr
.NodeIterator
;
25 import javax
.jcr
.Repository
;
26 import javax
.jcr
.RepositoryException
;
27 import javax
.jcr
.Session
;
28 import javax
.jcr
.observation
.Event
;
30 import org
.argeo
.eclipse
.ui
.jcr
.AsyncUiEventListener
;
31 import org
.argeo
.eclipse
.ui
.utils
.CommandUtils
;
32 import org
.argeo
.jcr
.JcrUtils
;
33 import org
.argeo
.slc
.akb
.AkbException
;
34 import org
.argeo
.slc
.akb
.AkbNames
;
35 import org
.argeo
.slc
.akb
.AkbService
;
36 import org
.argeo
.slc
.akb
.AkbTypes
;
37 import org
.argeo
.slc
.akb
.ui
.AkbUiPlugin
;
38 import org
.argeo
.slc
.akb
.ui
.AkbUiUtils
;
39 import org
.argeo
.slc
.akb
.ui
.commands
.DeleteAkbNodes
;
40 import org
.argeo
.slc
.akb
.ui
.commands
.OpenAkbNodeEditor
;
41 import org
.argeo
.slc
.akb
.ui
.providers
.AkbTreeLabelProvider
;
42 import org
.argeo
.slc
.akb
.ui
.providers
.TemplatesTreeContentProvider
;
43 import org
.argeo
.slc
.akb
.ui
.utils
.Refreshable
;
44 import org
.argeo
.slc
.akb
.utils
.AkbJcrUtils
;
45 import org
.eclipse
.jface
.action
.IContributionItem
;
46 import org
.eclipse
.jface
.action
.IMenuListener
;
47 import org
.eclipse
.jface
.action
.IMenuManager
;
48 import org
.eclipse
.jface
.action
.MenuManager
;
49 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
50 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
51 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
52 import org
.eclipse
.jface
.viewers
.TreeViewer
;
53 import org
.eclipse
.swt
.SWT
;
54 import org
.eclipse
.swt
.layout
.GridData
;
55 import org
.eclipse
.swt
.widgets
.Composite
;
56 import org
.eclipse
.swt
.widgets
.Display
;
57 import org
.eclipse
.swt
.widgets
.Menu
;
58 import org
.eclipse
.ui
.IWorkbenchWindow
;
59 import org
.eclipse
.ui
.part
.ViewPart
;
60 import org
.eclipse
.ui
.services
.IServiceLocator
;
62 /** AKB Active environment tree view. */
63 public class AkbActiveEnvsTreeView
extends ViewPart
implements Refreshable
{
65 public final static String ID
= AkbUiPlugin
.PLUGIN_ID
66 + ".akbActiveEnvsTreeView";
68 /* DEPENDENCY INJECTION */
69 private Session session
;
70 private AkbService akbService
;
73 private TreeViewer envTreeViewer
;
75 // Usefull business objects
76 private Node activeEnvsParentNode
;
78 private void initialize() {
80 activeEnvsParentNode
= session
81 .getNode(AkbNames
.AKB_ENVIRONMENTS_BASE_PATH
);
82 } catch (RepositoryException e
) {
83 throw new AkbException("unable to initialize AKB Browser view", e
);
88 public void createPartControl(Composite parent
) {
90 envTreeViewer
= createTreeViewer(parent
);
91 envTreeViewer
.setInput(initializeTree());
94 // The main tree viewer
95 protected TreeViewer
createTreeViewer(Composite parent
) {
96 parent
.setLayout(AkbUiUtils
.gridLayoutNoBorder());
97 int style
= SWT
.BORDER
| SWT
.MULTI
;
99 TreeViewer viewer
= new TreeViewer(parent
, style
);
100 viewer
.getTree().setLayoutData(
101 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
103 viewer
.setContentProvider(new TemplatesTreeContentProvider());
104 viewer
.setLabelProvider(new AkbTreeLabelProvider());
105 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
107 getSite().setSelectionProvider(viewer
);
110 MenuManager menuManager
= new MenuManager();
111 Menu menu
= menuManager
.createContextMenu(viewer
.getTree());
112 menuManager
.addMenuListener(new IMenuListener() {
113 public void menuAboutToShow(IMenuManager manager
) {
114 contextMenuAboutToShow(manager
);
117 viewer
.getTree().setMenu(menu
);
118 menuManager
.setRemoveAllWhenShown(true);
119 getSite().registerContextMenu(menuManager
, viewer
);
124 private Node
[] initializeTree() {
126 NodeIterator ni
= activeEnvsParentNode
.getNodes();
127 List
<Node
> envs
= new ArrayList
<Node
>();
128 while (ni
.hasNext()) {
129 Node currNode
= ni
.nextNode();
130 if (currNode
.isNodeType(AkbTypes
.AKB_ENV
))
133 Node
[] envArr
= envs
.toArray(new Node
[envs
.size()]);
135 } catch (RepositoryException re
) {
136 throw new AkbException("Error while initializing the "
137 + "tree of active environments.", re
);
141 //////////////////////
145 public void forceRefresh(Object object
) {
146 envTreeViewer
.setInput(initializeTree());
150 public void setFocus() {
154 public void dispose() {
155 JcrUtils
.logoutQuietly(session
);
159 // ///////////////////////////
160 // CONTEXT MENU MANAGEMENT
162 * Defines the commands that will pop up in the context menu.
164 protected void contextMenuAboutToShow(IMenuManager menuManager
) {
165 IWorkbenchWindow window
= AkbUiPlugin
.getDefault().getWorkbench()
166 .getActiveWorkbenchWindow();
169 IStructuredSelection selection
= (IStructuredSelection
) envTreeViewer
172 Node selected
= (Node
) selection
.getFirstElement();
175 boolean hasSelection
= selected
!= null;
178 currEnv
= AkbJcrUtils
.getCurrentTemplate(selected
);
180 boolean isTemplate
= hasSelection ? selected
181 .isNodeType(AkbTypes
.AKB_ENV_TEMPLATE
) : false;
182 boolean isParentItemsFolder
= hasSelection ? selected
183 .isNodeType(AkbTypes
.AKB_ITEM_FOLDER
) : false;
184 // boolean isParentConnectorsFolder = hasSelection ? selected
185 // .isNodeType(AkbTypes.AKB_CONNECTOR_FOLDER) : false;
186 boolean isDeletable
= hasSelection ?
true : false;
188 // Add Connector Alias
189 Map
<String
, String
> params
= new HashMap
<String
, String
>();
190 if (hasSelection
&& isTemplate
) {
191 params
.put(OpenAkbNodeEditor
.PARAM_PARENT_NODE_JCR_ID
,
192 selected
.getIdentifier());
193 params
.put(OpenAkbNodeEditor
.PARAM_CURR_ENV_JCR_ID
,
194 currEnv
.getIdentifier());
196 params
.put(OpenAkbNodeEditor
.PARAM_NODE_TYPE
,
197 AkbTypes
.AKB_CONNECTOR_ALIAS
);
199 // Connector Alias submenu
200 refreshAliasesSubmenu(menuManager
, window
, "menu.aliasesSubmenu",
201 "Add Connector Alias", isTemplate
, params
);
204 params
= new HashMap
<String
, String
>();
206 params
.put(OpenAkbNodeEditor
.PARAM_PARENT_NODE_JCR_ID
,
207 selected
.getIdentifier());
208 params
.put(OpenAkbNodeEditor
.PARAM_CURR_ENV_JCR_ID
,
209 currEnv
.getIdentifier());
211 refreshItemsSubmenu(menuManager
, window
, "menu.itemsSubmenu",
212 "Add Item", isParentItemsFolder
|| isTemplate
, params
);
215 params
= new HashMap
<String
, String
>();
217 params
.put(OpenAkbNodeEditor
.PARAM_PARENT_NODE_JCR_ID
,
218 selected
.getIdentifier());
219 params
.put(OpenAkbNodeEditor
.PARAM_CURR_ENV_JCR_ID
,
220 currEnv
.getIdentifier());
222 params
.put(OpenAkbNodeEditor
.PARAM_NODE_TYPE
,
223 AkbTypes
.AKB_ITEM_FOLDER
);
225 AkbUiUtils
.refreshParameterizedCommand(menuManager
, window
,
226 "cmd.addItemFolder", OpenAkbNodeEditor
.ID
,
227 "Add item folder", null, isParentItemsFolder
|| isTemplate
,
231 params
= new HashMap
<String
, String
>();
233 params
.put(DeleteAkbNodes
.PARAM_NODE_JCR_ID
,
234 selected
.getIdentifier());
235 AkbUiUtils
.refreshParameterizedCommand(menuManager
, window
,
236 "cmd.deleteItem", DeleteAkbNodes
.ID
,
237 "Delete selected item(s)", null, isDeletable
, params
);
240 params
= new HashMap
<String
, String
>();
241 params
.put(OpenAkbNodeEditor
.PARAM_PARENT_NODE_JCR_ID
,
242 activeEnvsParentNode
.getIdentifier());
243 params
.put(OpenAkbNodeEditor
.PARAM_NODE_TYPE
,
244 AkbTypes
.AKB_ENV_TEMPLATE
);
245 AkbUiUtils
.refreshParameterizedCommand(menuManager
, window
,
246 "cmd.createTemplate", OpenAkbNodeEditor
.ID
,
247 "Create new template...", null,
248 !hasSelection
|| isTemplate
, params
);
250 } catch (RepositoryException re
) {
251 throw new AkbException("Error while refreshing context menu", re
);
257 * refreshes submenu with various connector types
266 private void refreshItemsSubmenu(IMenuManager menuManager
,
267 IServiceLocator locator
, String itemId
, String label
,
268 boolean isVisible
, Map
<String
, String
> params
) {
271 IContributionItem ici
= menuManager
.find(itemId
);
273 menuManager
.remove(ici
);
275 MenuManager subMenu
= new MenuManager(label
, itemId
);
278 Map
<String
, String
> tmpParams
= new HashMap
<String
, String
>();
279 tmpParams
.putAll(params
);
280 tmpParams
.put(OpenAkbNodeEditor
.PARAM_NODE_TYPE
,
281 AkbTypes
.AKB_JDBC_QUERY
);
282 String currItemId
= "cmd.createJDBCQuery";
283 IContributionItem currItem
= subMenu
.find(currItemId
);
284 if (currItem
!= null)
285 subMenu
.remove(currItem
);
286 subMenu
.add(AkbUiUtils
.createContributionItem(menuManager
, locator
,
287 currItemId
, OpenAkbNodeEditor
.ID
, "JDBC", null, tmpParams
));
290 tmpParams
= new HashMap
<String
, String
>();
291 tmpParams
.putAll(params
);
292 tmpParams
.put(OpenAkbNodeEditor
.PARAM_NODE_TYPE
,
293 AkbTypes
.AKB_SSH_COMMAND
);
294 currItemId
= "cmd.createSSHCommand";
295 currItem
= subMenu
.find(currItemId
);
296 if (currItem
!= null)
297 subMenu
.remove(currItem
);
298 subMenu
.add(AkbUiUtils
.createContributionItem(menuManager
, locator
,
299 currItemId
, OpenAkbNodeEditor
.ID
, "SSH Command", null,
303 tmpParams
= new HashMap
<String
, String
>();
304 tmpParams
.putAll(params
);
305 tmpParams
.put(OpenAkbNodeEditor
.PARAM_NODE_TYPE
, AkbTypes
.AKB_SSH_FILE
);
306 currItemId
= "cmd.createSSHFile";
307 currItem
= subMenu
.find(currItemId
);
308 if (currItem
!= null)
309 subMenu
.remove(currItem
);
310 subMenu
.add(AkbUiUtils
.createContributionItem(menuManager
, locator
,
311 currItemId
, OpenAkbNodeEditor
.ID
, "SSH File", null, tmpParams
));
314 menuManager
.add(subMenu
);
315 subMenu
.setVisible(isVisible
);
320 * refreshes submenu with various connector types
329 private void refreshAliasesSubmenu(IMenuManager menuManager
,
330 IServiceLocator locator
, String itemId
, String label
,
331 boolean isVisible
, Map
<String
, String
> params
) {
334 IContributionItem ici
= menuManager
.find(itemId
);
336 menuManager
.remove(ici
);
338 // TODO use dynamic contribution to dynamically retrieve specific
340 // CompoundContributionItem comConI = new MyCompoundCI(menuManager,
342 MenuManager subMenu
= new MenuManager(label
, itemId
);
345 Map
<String
, String
> tmpParams
= new HashMap
<String
, String
>();
346 tmpParams
.putAll(params
);
347 tmpParams
.put(OpenAkbNodeEditor
.PARAM_NODE_SUBTYPE
,
348 AkbTypes
.AKB_JDBC_CONNECTOR
);
349 String currItemId
= "cmd.createJDBCAlias";
350 IContributionItem currItem
= subMenu
.find(currItemId
);
351 if (currItem
!= null)
352 subMenu
.remove(currItem
);
353 subMenu
.add(AkbUiUtils
.createContributionItem(menuManager
, locator
,
354 currItemId
, OpenAkbNodeEditor
.ID
, "JDBC", null, tmpParams
));
357 tmpParams
= new HashMap
<String
, String
>();
358 tmpParams
.putAll(params
);
359 tmpParams
.put(OpenAkbNodeEditor
.PARAM_NODE_SUBTYPE
,
360 AkbTypes
.AKB_SSH_CONNECTOR
);
361 currItemId
= "cmd.createSSHAlias";
362 currItem
= subMenu
.find(currItemId
);
363 if (currItem
!= null)
364 subMenu
.remove(currItem
);
365 subMenu
.add(AkbUiUtils
.createContributionItem(menuManager
, locator
,
366 currItemId
, OpenAkbNodeEditor
.ID
, "SSH", null, tmpParams
));
369 menuManager
.add(subMenu
);
370 subMenu
.setVisible(isVisible
);
374 class ViewDoubleClickListener
implements IDoubleClickListener
{
375 public void doubleClick(DoubleClickEvent evt
) {
376 Object obj
= ((IStructuredSelection
) evt
.getSelection())
379 if (obj
instanceof Node
) {
380 Node node
= (Node
) obj
;
381 Node currEnv
= AkbJcrUtils
.getCurrentTemplate(node
);
383 // Add Connector Alias
384 Map
<String
, String
> params
= new HashMap
<String
, String
>();
385 params
.put(OpenAkbNodeEditor
.PARAM_NODE_JCR_ID
,
386 node
.getIdentifier());
387 params
.put(OpenAkbNodeEditor
.PARAM_CURR_ENV_JCR_ID
,
388 currEnv
.getIdentifier());
390 CommandUtils
.callCommand(OpenAkbNodeEditor
.ID
, params
);
392 } catch (RepositoryException e
) {
393 throw new AkbException("Cannot open " + obj
, e
);
398 /* DEPENDENCY INJECTION */
399 public void setRepository(Repository repository
) {
401 session
= repository
.login();
402 } catch (RepositoryException e
) {
403 throw new AkbException("unable to log in for " + ID
+ " view");
407 public void setAkbService(AkbService akbService
) {
408 this.akbService
= akbService
;