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
.client
.ui
.dist
.views
;
18 import java
.util
.HashMap
;
21 import javax
.jcr
.Repository
;
22 import javax
.jcr
.RepositoryException
;
24 import org
.argeo
.cms
.ui
.workbench
.util
.CommandUtils
;
25 import org
.argeo
.eclipse
.ui
.TreeParent
;
26 import org
.argeo
.node
.ArgeoNames
;
27 import org
.argeo
.slc
.SlcException
;
28 import org
.argeo
.slc
.client
.ui
.dist
.DistPlugin
;
29 import org
.argeo
.slc
.client
.ui
.dist
.commands
.CopyLocalJavaWorkspace
;
30 import org
.argeo
.slc
.client
.ui
.dist
.commands
.CopyWorkspace
;
31 import org
.argeo
.slc
.client
.ui
.dist
.commands
.CreateLocalJavaWorkspace
;
32 import org
.argeo
.slc
.client
.ui
.dist
.commands
.CreateWorkspace
;
33 import org
.argeo
.slc
.client
.ui
.dist
.commands
.DeleteWorkspace
;
34 import org
.argeo
.slc
.client
.ui
.dist
.commands
.DisplayRepoInformation
;
35 import org
.argeo
.slc
.client
.ui
.dist
.commands
.Fetch
;
36 import org
.argeo
.slc
.client
.ui
.dist
.commands
.NormalizeDistribution
;
37 import org
.argeo
.slc
.client
.ui
.dist
.commands
.NormalizeWorkspace
;
38 import org
.argeo
.slc
.client
.ui
.dist
.commands
.OpenGenerateBinariesWizard
;
39 import org
.argeo
.slc
.client
.ui
.dist
.commands
.PublishWorkspace
;
40 import org
.argeo
.slc
.client
.ui
.dist
.commands
.RegisterRepository
;
41 import org
.argeo
.slc
.client
.ui
.dist
.commands
.RunInOsgi
;
42 import org
.argeo
.slc
.client
.ui
.dist
.commands
.UnregisterRemoteRepo
;
43 import org
.argeo
.slc
.client
.ui
.dist
.controllers
.DistTreeComparator
;
44 import org
.argeo
.slc
.client
.ui
.dist
.controllers
.DistTreeComparer
;
45 import org
.argeo
.slc
.client
.ui
.dist
.controllers
.DistTreeContentProvider
;
46 import org
.argeo
.slc
.client
.ui
.dist
.controllers
.DistTreeDoubleClickListener
;
47 import org
.argeo
.slc
.client
.ui
.dist
.controllers
.DistTreeLabelProvider
;
48 import org
.argeo
.slc
.client
.ui
.dist
.model
.DistParentElem
;
49 import org
.argeo
.slc
.client
.ui
.dist
.model
.ModularDistVersionBaseElem
;
50 import org
.argeo
.slc
.client
.ui
.dist
.model
.ModularDistVersionElem
;
51 import org
.argeo
.slc
.client
.ui
.dist
.model
.RepoElem
;
52 import org
.argeo
.slc
.client
.ui
.dist
.model
.WkspGroupElem
;
53 import org
.argeo
.slc
.client
.ui
.dist
.model
.WorkspaceElem
;
54 import org
.argeo
.slc
.jcr
.SlcNames
;
55 import org
.eclipse
.jface
.action
.IContributionItem
;
56 import org
.eclipse
.jface
.action
.IMenuListener
;
57 import org
.eclipse
.jface
.action
.IMenuManager
;
58 import org
.eclipse
.jface
.action
.MenuManager
;
59 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
60 import org
.eclipse
.jface
.viewers
.TreeViewer
;
61 import org
.eclipse
.jface
.viewers
.TreeViewerColumn
;
62 import org
.eclipse
.jface
.viewers
.ViewerComparator
;
63 import org
.eclipse
.swt
.SWT
;
64 import org
.eclipse
.swt
.widgets
.Composite
;
65 import org
.eclipse
.swt
.widgets
.Menu
;
66 import org
.eclipse
.swt
.widgets
.Tree
;
67 import org
.eclipse
.ui
.IWorkbenchWindow
;
68 import org
.eclipse
.ui
.part
.ViewPart
;
71 * Browse, manipulate and manage distributions across multiple repositories
72 * (like fetch, merge, publish, etc.).
74 public class DistributionsView
extends ViewPart
implements SlcNames
, ArgeoNames
{
75 // private final static Log log =
76 // LogFactory.getLog(DistributionsView.class);
78 public final static String ID
= DistPlugin
.PLUGIN_ID
+ ".distributionsView";
80 /* DEPENDENCY INJECTION */
81 private Repository nodeRepository
;
82 private DistTreeContentProvider treeContentProvider
;
84 private TreeViewer viewer
;
87 public void createPartControl(Composite parent
) {
88 // Define the TableViewer
89 viewer
= new TreeViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
90 | SWT
.FULL_SELECTION
| SWT
.BORDER
);
92 TreeViewerColumn col
= new TreeViewerColumn(viewer
, SWT
.NONE
);
93 col
.getColumn().setWidth(400);
94 col
.setLabelProvider(new DistTreeLabelProvider());
96 final Tree tree
= viewer
.getTree();
97 tree
.setHeaderVisible(false);
98 tree
.setLinesVisible(false);
100 // viewer.setContentProvider(new DistTreeContentProvider());
101 viewer
.setContentProvider(treeContentProvider
);
102 viewer
.addDoubleClickListener(new DistTreeDoubleClickListener(viewer
));
103 viewer
.setComparer(new DistTreeComparer());
104 viewer
.setComparator(new DistTreeComparator());
106 @SuppressWarnings("unused")
107 ViewerComparator vc
= viewer
.getComparator();
109 // Enable retrieving current tree selected items from outside the view
110 getSite().setSelectionProvider(viewer
);
112 MenuManager menuManager
= new MenuManager();
113 Menu menu
= menuManager
.createContextMenu(viewer
.getTree());
114 menuManager
.addMenuListener(new IMenuListener() {
115 private static final long serialVersionUID
= -1454108001335038652L;
117 public void menuAboutToShow(IMenuManager manager
) {
118 contextMenuAboutToShow(manager
);
121 viewer
.getTree().setMenu(menu
);
122 getSite().registerContextMenu(menuManager
, viewer
);
128 /** Programatically configure the context menu */
129 protected void contextMenuAboutToShow(IMenuManager menuManager
) {
130 IWorkbenchWindow window
= DistPlugin
.getDefault().getWorkbench()
131 .getActiveWorkbenchWindow();
133 // Most of the implemented commands support only one selected
135 boolean singleElement
= ((IStructuredSelection
) viewer
.getSelection())
137 // Get Current selected item :
138 Object firstElement
= ((IStructuredSelection
) viewer
.getSelection())
143 if (firstElement
instanceof TreeParent
144 || firstElement
instanceof DistParentElem
) {
146 String targetRepoPath
= null, workspaceName
= null, workspacePrefix
= null;
147 String modularDistBasePath
= null;
148 String modularDistPath
= null;
149 // String targetRepoUri = null;
150 // Build conditions depending on element type
151 boolean isDistribElem
= false, isModularDistVersionBaseElem
= false, isRepoElem
= false, isDistribGroupElem
= false;
152 boolean isLocal
= false, isReadOnly
= true;
156 if (firstElement
instanceof RepoElem
) {
157 re
= (RepoElem
) firstElement
;
159 isLocal
= re
.inHome();
160 isReadOnly
= re
.isReadOnly();
161 } else if (firstElement
instanceof WkspGroupElem
) {
162 WkspGroupElem wge
= (WkspGroupElem
) firstElement
;
163 isReadOnly
= wge
.isReadOnly();
164 isDistribGroupElem
= true;
165 re
= (RepoElem
) wge
.getParent();
166 workspacePrefix
= wge
.getName();
167 } else if (firstElement
instanceof WorkspaceElem
) {
168 WorkspaceElem we
= (WorkspaceElem
) firstElement
;
169 re
= we
.getRepoElem();
170 isDistribElem
= true;
171 isReadOnly
= we
.isReadOnly();
172 workspaceName
= we
.getWorkspaceName();
173 isLocal
= we
.inHome();
174 } else if (firstElement
instanceof ModularDistVersionBaseElem
) {
175 ModularDistVersionBaseElem mdbe
= (ModularDistVersionBaseElem
) firstElement
;
176 isModularDistVersionBaseElem
= true;
177 re
= mdbe
.getWkspElem().getRepoElem();
178 isLocal
= re
.inHome();
179 isReadOnly
= re
.isReadOnly();
180 workspaceName
= mdbe
.getWkspElem().getWorkspaceName();
181 modularDistBasePath
= mdbe
.getModularDistBase().getPath();
182 } else if (firstElement
instanceof ModularDistVersionElem
) {
183 ModularDistVersionElem mdbe
= (ModularDistVersionElem
) firstElement
;
184 re
= mdbe
.getWorkspaceElem().getRepoElem();
185 isLocal
= re
.inHome();
186 isReadOnly
= re
.isReadOnly();
187 workspaceName
= mdbe
.getWorkspaceElem().getWorkspaceName();
188 modularDistPath
= mdbe
.getModularDistVersionNode()
193 targetRepoPath
= re
.getRepoNodePath();
197 CommandUtils
.refreshCommand(menuManager
, window
,
198 DisplayRepoInformation
.ID
,
199 DisplayRepoInformation
.DEFAULT_LABEL
,
200 DisplayRepoInformation
.DEFAULT_ICON
, isRepoElem
204 Map
<String
, String
> params
= new HashMap
<String
, String
>();
205 params
.put(CreateWorkspace
.PARAM_TARGET_REPO_PATH
,
207 params
.put(CreateWorkspace
.PARAM_WORKSPACE_PREFIX
,
209 CommandUtils
.refreshParameterizedCommand(menuManager
, window
,
210 CreateWorkspace
.ID
, CreateWorkspace
.DEFAULT_LABEL
,
211 CreateWorkspace
.DEFAULT_ICON
,
212 (isRepoElem
|| isDistribGroupElem
) && singleElement
213 && !isReadOnly
&& !isLocal
, params
);
215 // TODO Manage the case where it is not a java workspace
216 params
= new HashMap
<String
, String
>();
217 params
.put(CreateLocalJavaWorkspace
.PARAM_WORKSPACE_PREFIX
,
219 CommandUtils
.refreshParameterizedCommand(menuManager
, window
,
220 CreateLocalJavaWorkspace
.ID
,
221 CreateLocalJavaWorkspace
.DEFAULT_LABEL
,
222 CreateLocalJavaWorkspace
.DEFAULT_ICON
,
223 (isRepoElem
|| isDistribGroupElem
) && singleElement
224 && !isReadOnly
&& isLocal
, params
);
226 // Register a remote repository
227 CommandUtils
.refreshCommand(menuManager
, window
,
228 RegisterRepository
.ID
,
229 RegisterRepository
.DEFAULT_LABEL
,
230 RegisterRepository
.DEFAULT_ICON
, isRepoElem
233 // Unregister a remote repository
234 params
= new HashMap
<String
, String
>();
235 params
.put(UnregisterRemoteRepo
.PARAM_REPO_PATH
, targetRepoPath
);
236 CommandUtils
.refreshParameterizedCommand(menuManager
, window
,
237 UnregisterRemoteRepo
.ID
,
238 UnregisterRemoteRepo
.DEFAULT_LABEL
,
239 UnregisterRemoteRepo
.DEFAULT_ICON
, isRepoElem
240 && !isLocal
&& singleElement
, params
);
243 params
= new HashMap
<String
, String
>();
244 params
.put(Fetch
.PARAM_TARGET_REPO_PATH
, targetRepoPath
);
245 CommandUtils
.refreshParameterizedCommand(menuManager
, window
,
246 Fetch
.ID
, Fetch
.DEFAULT_LABEL
, Fetch
.DEFAULT_ICON
,
247 isRepoElem
&& isLocal
&& singleElement
&& !isReadOnly
,
250 // Normalize workspace
251 params
= new HashMap
<String
, String
>();
252 params
.put(NormalizeWorkspace
.PARAM_TARGET_REPO_PATH
,
254 params
.put(NormalizeWorkspace
.PARAM_WORKSPACE_NAME
,
257 CommandUtils
.refreshParameterizedCommand(menuManager
, window
,
258 NormalizeWorkspace
.ID
, "Normalize...",
259 NormalizeWorkspace
.DEFAULT_ICON
, isDistribElem
260 && singleElement
&& !isReadOnly
, params
);
263 params
= new HashMap
<String
, String
>();
264 params
.put(CopyWorkspace
.PARAM_TARGET_REPO_PATH
, targetRepoPath
);
265 params
.put(CopyWorkspace
.PARAM_SOURCE_WORKSPACE_NAME
,
267 CommandUtils
.refreshParameterizedCommand(menuManager
, window
,
268 CopyWorkspace
.ID
, CopyWorkspace
.DEFAULT_LABEL
,
269 CopyWorkspace
.DEFAULT_ICON
, isDistribElem
270 && singleElement
&& !isLocal
, params
);
272 params
= new HashMap
<String
, String
>();
273 params
.put(CopyLocalJavaWorkspace
.PARAM_SOURCE_WORKSPACE_NAME
,
275 CommandUtils
.refreshParameterizedCommand(menuManager
, window
,
276 CopyLocalJavaWorkspace
.ID
,
277 CopyLocalJavaWorkspace
.DEFAULT_LABEL
,
278 CopyLocalJavaWorkspace
.DEFAULT_ICON
, isDistribElem
279 && singleElement
&& isLocal
, params
);
282 params
= new HashMap
<String
, String
>();
283 params
.put(DeleteWorkspace
.PARAM_TARGET_REPO_PATH
,
285 params
.put(DeleteWorkspace
.PARAM_WORKSPACE_NAME
, workspaceName
);
286 CommandUtils
.refreshParameterizedCommand(menuManager
, window
,
287 DeleteWorkspace
.ID
, DeleteWorkspace
.DEFAULT_LABEL
,
288 DeleteWorkspace
.DEFAULT_ICON
, isDistribElem
289 && singleElement
&& !isReadOnly
, params
);
292 MenuManager submenu
= new MenuManager("Advanced",
293 DistPlugin
.PLUGIN_ID
+ ".advancedSubmenu");
294 IContributionItem ici
= menuManager
.find(DistPlugin
.PLUGIN_ID
295 + ".advancedSubmenu");
297 menuManager
.remove(ici
);
300 params
= new HashMap
<String
, String
>();
301 params
.put(PublishWorkspace
.PARAM_TARGET_REPO_PATH
,
303 params
.put(PublishWorkspace
.PARAM_WORKSPACE_NAME
, workspaceName
);
304 CommandUtils
.refreshParameterizedCommand(submenu
, window
,
305 PublishWorkspace
.ID
, PublishWorkspace
.DEFAULT_LABEL
,
306 PublishWorkspace
.DEFAULT_ICON
, isDistribElem
307 && singleElement
&& !isReadOnly
, params
);
309 // Normalize distribution (Legacy)
310 params
= new HashMap
<String
, String
>();
311 params
.put(NormalizeDistribution
.PARAM_TARGET_REPO_PATH
,
313 params
.put(NormalizeDistribution
.PARAM_WORKSPACE_NAME
,
315 CommandUtils
.refreshParameterizedCommand(submenu
, window
,
316 NormalizeDistribution
.ID
,
317 NormalizeDistribution
.DEFAULT_LABEL
,
318 NormalizeDistribution
.DEFAULT_ICON
, isDistribElem
319 && singleElement
&& !isReadOnly
, params
);
322 params
= new HashMap
<String
, String
>();
323 params
.put(RunInOsgi
.PARAM_MODULE_PATH
, modularDistPath
);
324 params
.put(RunInOsgi
.PARAM_WORKSPACE_NAME
, workspaceName
);
325 CommandUtils
.refreshParameterizedCommand(submenu
, window
,
326 RunInOsgi
.ID
, RunInOsgi
.DEFAULT_LABEL
,
327 RunInOsgi
.DEFAULT_ICON
, modularDistPath
!= null
328 && singleElement
&& isLocal
, params
);
330 // Open generate binaries
331 params
= new HashMap
<String
, String
>();
332 params
.put(OpenGenerateBinariesWizard
.PARAM_REPO_NODE_PATH
,
334 params
.put(OpenGenerateBinariesWizard
.PARAM_MODULE_PATH
,
335 modularDistBasePath
);
336 params
.put(OpenGenerateBinariesWizard
.PARAM_WORKSPACE_NAME
,
339 CommandUtils
.refreshParameterizedCommand(submenu
, window
,
340 OpenGenerateBinariesWizard
.ID
,
341 OpenGenerateBinariesWizard
.DEFAULT_LABEL
,
342 OpenGenerateBinariesWizard
.DEFAULT_ICON
,
343 isModularDistVersionBaseElem
&& !isReadOnly
, params
);
345 if (submenu
.getSize() > 0)
346 menuManager
.add(submenu
);
348 // // Manage workspace authorizations
349 // params = new HashMap<String, String>();
350 // params.put(ManageWorkspaceAuth.PARAM_WORKSPACE_NAME, wsName);
351 // CommandHelpers.refreshParameterizedCommand(menuManager,
353 // ManageWorkspaceAuth.ID, ManageWorkspaceAuth.DEFAULT_LABEL,
354 // ManageWorkspaceAuth.DEFAULT_ICON_PATH, isDistribElem
355 // && singleElement && !isReadOnly, params);
357 } catch (RepositoryException e
) {
358 throw new SlcException("unexpected errror while "
359 + "building context menu for element " + firstElement
, e
);
364 public void setFocus() {
365 viewer
.getTree().setFocus();
369 * Force refresh of the whole view
371 public void refresh() {
372 viewer
.setInput(nodeRepository
);
373 viewer
.expandToLevel(2);
376 /* DEPENDENCY INJECTION */
377 public void setNodeRepository(Repository nodeRepository
) {
378 this.nodeRepository
= nodeRepository
;
381 public void setTreeContentProvider(
382 DistTreeContentProvider treeContentProvider
) {
383 this.treeContentProvider
= treeContentProvider
;