2 * Copyright (C) 2007-2012 Mathieu Baudier
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
.ArrayList
;
19 import java
.util
.HashMap
;
20 import java
.util
.List
;
23 import javax
.jcr
.Credentials
;
24 import javax
.jcr
.GuestCredentials
;
25 import javax
.jcr
.Repository
;
26 import javax
.jcr
.RepositoryException
;
27 import javax
.jcr
.RepositoryFactory
;
28 import javax
.jcr
.Session
;
29 import javax
.jcr
.SimpleCredentials
;
31 import org
.apache
.commons
.logging
.Log
;
32 import org
.apache
.commons
.logging
.LogFactory
;
33 import org
.argeo
.eclipse
.ui
.AbstractTreeContentProvider
;
34 import org
.argeo
.eclipse
.ui
.ErrorFeedback
;
35 import org
.argeo
.eclipse
.ui
.TreeParent
;
36 import org
.argeo
.jcr
.ArgeoJcrUtils
;
37 import org
.argeo
.jcr
.JcrUtils
;
38 import org
.argeo
.slc
.client
.ui
.dist
.DistPlugin
;
39 import org
.argeo
.slc
.client
.ui
.dist
.commands
.CopyWorkspace
;
40 import org
.argeo
.slc
.client
.ui
.dist
.commands
.CreateWorkspace
;
41 import org
.argeo
.slc
.client
.ui
.dist
.commands
.DeleteWorkspace
;
42 import org
.argeo
.slc
.client
.ui
.dist
.commands
.ManageWorkspaceAuth
;
43 import org
.argeo
.slc
.client
.ui
.dist
.commands
.NormalizeDistribution
;
44 import org
.argeo
.slc
.client
.ui
.dist
.editors
.DistributionEditor
;
45 import org
.argeo
.slc
.client
.ui
.dist
.editors
.DistributionEditorInput
;
46 import org
.argeo
.slc
.client
.ui
.dist
.utils
.CommandHelpers
;
47 import org
.argeo
.slc
.jcr
.SlcNames
;
48 import org
.eclipse
.jface
.action
.IMenuListener
;
49 import org
.eclipse
.jface
.action
.IMenuManager
;
50 import org
.eclipse
.jface
.action
.MenuManager
;
51 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
52 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
53 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
54 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
55 import org
.eclipse
.jface
.viewers
.TreeViewer
;
56 import org
.eclipse
.jface
.viewers
.TreeViewerColumn
;
57 import org
.eclipse
.swt
.SWT
;
58 import org
.eclipse
.swt
.widgets
.Composite
;
59 import org
.eclipse
.swt
.widgets
.Menu
;
60 import org
.eclipse
.swt
.widgets
.Tree
;
61 import org
.eclipse
.ui
.IWorkbenchWindow
;
62 import org
.eclipse
.ui
.PartInitException
;
63 import org
.eclipse
.ui
.part
.ViewPart
;
66 * Browse and manipulate distributions (like merge, rename, etc.). Only support
67 * one single repository currently.
70 public class DistributionsView
extends ViewPart
implements SlcNames
{
71 private final static Log log
= LogFactory
.getLog(DistributionsView
.class);
72 public final static String ID
= DistPlugin
.ID
+ ".distributionsView";
74 private Repository repository
;
75 private RepositoryFactory repositoryFactory
;
77 private TreeViewer viewer
;
79 private List
<RepositoryElem
> repositories
= new ArrayList
<DistributionsView
.RepositoryElem
>();
82 public void createPartControl(Composite parent
) {
83 // Define the TableViewer
84 viewer
= new TreeViewer(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
85 | SWT
.FULL_SELECTION
| SWT
.BORDER
);
87 TreeViewerColumn col
= new TreeViewerColumn(viewer
, SWT
.NONE
);
88 col
.getColumn().setWidth(200);
89 col
.getColumn().setText("Workspace");
90 col
.setLabelProvider(new ColumnLabelProvider() {
92 public String
getText(Object element
) {
93 return element
.toString();
97 final Tree table
= viewer
.getTree();
98 table
.setHeaderVisible(true);
99 table
.setLinesVisible(true);
101 viewer
.setContentProvider(new DistributionsContentProvider());
102 viewer
.addDoubleClickListener(new DistributionsDCL());
104 MenuManager menuManager
= new MenuManager();
105 Menu menu
= menuManager
.createContextMenu(viewer
.getTree());
106 menuManager
.addMenuListener(new IMenuListener() {
107 public void menuAboutToShow(IMenuManager manager
) {
108 contextMenuAboutToShow(manager
);
111 viewer
.getTree().setMenu(menu
);
112 getSite().registerContextMenu(menuManager
, viewer
);
114 // Initializes repositories
115 // TODO make it more generic, with remote repositories etc.
116 repositories
.add(new RepositoryElem("java", repository
, null));
120 Credentials credentials
= null;
121 Repository remoteRepository
= null;
123 uri
= "http://dev.argeo.org/org.argeo.jcr.webapp/pub/java";
124 credentials
= new GuestCredentials();
125 remoteRepository
= ArgeoJcrUtils
.getRepositoryByUri(repositoryFactory
, uri
);
126 repositories
.add(new RepositoryElem("anonymous@dev.argeo.org//java",
127 remoteRepository
, credentials
));
129 uri
= "http://localhost:7070/org.argeo.jcr.webapp/pub/java";
130 credentials
= new GuestCredentials();
131 remoteRepository
= ArgeoJcrUtils
.getRepositoryByUri(repositoryFactory
, uri
);
132 repositories
.add(new RepositoryElem("anonymous@localhost//java",
133 remoteRepository
, credentials
));
135 uri
= "http://localhost:7070/org.argeo.jcr.webapp/remoting/java";
136 credentials
= new SimpleCredentials(System
.getProperty("user.name"),
138 remoteRepository
= ArgeoJcrUtils
.getRepositoryByUri(repositoryFactory
, uri
);
139 repositories
.add(new RepositoryElem("@localhost//java",
140 remoteRepository
, credentials
));
142 viewer
.setInput(getSite());
147 public void setFocus() {
148 viewer
.getTree().setFocus();
152 * Force refresh of the whole view
154 public void refresh() {
155 viewer
.setContentProvider(new DistributionsContentProvider());
158 public void setRepository(Repository repository
) {
159 this.repository
= repository
;
162 public void setRepositoryFactory(RepositoryFactory repositoryFactory
) {
163 this.repositoryFactory
= repositoryFactory
;
166 /** Programatically configure the context menu */
167 protected void contextMenuAboutToShow(IMenuManager menuManager
) {
168 IWorkbenchWindow window
= DistPlugin
.getDefault().getWorkbench()
169 .getActiveWorkbenchWindow();
170 // Get Current selected item :
171 Object firstElement
= ((IStructuredSelection
) viewer
.getSelection())
174 if (firstElement
instanceof TreeParent
) {
175 TreeParent tp
= (TreeParent
) firstElement
;
176 String wsName
= tp
.getName();
178 // Build conditions depending on element type (repo or distribution
179 // for the time being)
180 boolean isDistribElem
= false; // , isRepoElem = false;
182 // if (tp instanceof RepositoryElem){
183 // isRepoElem = true;
185 if (tp
instanceof DistributionElem
) {
186 isDistribElem
= true;
190 CommandHelpers
.refreshCommand(menuManager
, window
,
191 CreateWorkspace
.ID
, CreateWorkspace
.DEFAULT_LABEL
,
192 CreateWorkspace
.DEFAULT_ICON_PATH
,
193 tp
instanceof RepositoryElem
);
195 // Normalize workspace
196 Map
<String
, String
> params
= new HashMap
<String
, String
>();
197 params
.put(NormalizeDistribution
.PARAM_WORKSPACE
, wsName
);
198 CommandHelpers
.refreshParameterizedCommand(menuManager
, window
,
199 NormalizeDistribution
.ID
,
200 NormalizeDistribution
.DEFAULT_LABEL
,
201 NormalizeDistribution
.DEFAULT_ICON_PATH
, isDistribElem
,
205 params
= new HashMap
<String
, String
>();
206 params
.put(CopyWorkspace
.PARAM_WORKSPACE_NAME
, wsName
);
207 CommandHelpers
.refreshParameterizedCommand(menuManager
, window
,
208 CopyWorkspace
.ID
, CopyWorkspace
.DEFAULT_LABEL
,
209 CopyWorkspace
.DEFAULT_ICON_PATH
, isDistribElem
, params
);
212 params
= new HashMap
<String
, String
>();
213 params
.put(DeleteWorkspace
.PARAM_WORKSPACE_NAME
, wsName
);
214 CommandHelpers
.refreshParameterizedCommand(menuManager
, window
,
215 DeleteWorkspace
.ID
, DeleteWorkspace
.DEFAULT_LABEL
,
216 DeleteWorkspace
.DEFAULT_ICON_PATH
, isDistribElem
, params
);
218 // Manage workspace authorizations
219 params
= new HashMap
<String
, String
>();
220 params
.put(ManageWorkspaceAuth
.PARAM_WORKSPACE_NAME
, wsName
);
221 CommandHelpers
.refreshParameterizedCommand(menuManager
, window
,
222 ManageWorkspaceAuth
.ID
, ManageWorkspaceAuth
.DEFAULT_LABEL
,
223 ManageWorkspaceAuth
.DEFAULT_ICON_PATH
, isDistribElem
,
228 private class DistributionsContentProvider
extends
229 AbstractTreeContentProvider
{
231 public Object
[] getElements(Object arg0
) {
232 return repositories
.toArray();
237 /** Wraps a repository **/
238 private static class RepositoryElem
extends TreeParent
{
239 // private final Repository repository;
240 private Session defaultSession
;
242 public RepositoryElem(String name
, Repository repository
,
243 Credentials credentials
) {
246 defaultSession
= repository
.login(credentials
);
247 String
[] workspaceNames
= defaultSession
.getWorkspace()
248 .getAccessibleWorkspaceNames();
249 for (String workspace
: workspaceNames
)
250 addChild(new DistributionElem(repository
, workspace
,
252 } catch (RepositoryException e
) {
253 ErrorFeedback
.show("Cannot log to repository", e
);
258 public synchronized void dispose() {
259 if (log
.isTraceEnabled())
260 log
.trace("Disposing RepositoryElement");
261 JcrUtils
.logoutQuietly(defaultSession
);
266 private static class DistributionElem
extends TreeParent
{
267 private final String workspaceName
;
268 private final Repository repository
;
269 private final Credentials credentials
;
271 public DistributionElem(Repository repository
, String workspaceName
,
272 Credentials credentials
) {
273 super(workspaceName
);
274 this.workspaceName
= workspaceName
;
275 this.repository
= repository
;
276 this.credentials
= credentials
;
279 public String
getWorkspaceName() {
280 return workspaceName
;
283 public Repository
getRepository() {
287 public Credentials
getCredentials() {
293 public void dispose() {
294 for (RepositoryElem re
: repositories
)
299 private class DistributionsDCL
implements IDoubleClickListener
{
301 public void doubleClick(DoubleClickEvent event
) {
302 if (event
.getSelection() == null || event
.getSelection().isEmpty())
304 Object obj
= ((IStructuredSelection
) event
.getSelection())
306 if (obj
instanceof DistributionElem
) {
307 DistributionElem distributionElem
= (DistributionElem
) obj
;
308 DistributionEditorInput dei
= new DistributionEditorInput(
309 distributionElem
.getName(),
310 distributionElem
.getRepository(),
311 distributionElem
.getWorkspaceName(),
312 distributionElem
.getCredentials());
314 DistPlugin
.getDefault().getWorkbench()
315 .getActiveWorkbenchWindow().getActivePage()
316 .openEditor(dei
, DistributionEditor
.ID
);
317 } catch (PartInitException e
) {
318 ErrorFeedback
.show("Cannot open editor for "
319 + distributionElem
.getWorkspaceName(), e
);