1 package org
.argeo
.jcr
.ui
.explorer
.views
;
5 import javax
.jcr
.Property
;
6 import javax
.jcr
.PropertyType
;
7 import javax
.jcr
.RepositoryException
;
8 import javax
.jcr
.RepositoryFactory
;
9 import javax
.jcr
.Value
;
10 import javax
.jcr
.observation
.Event
;
11 import javax
.jcr
.observation
.EventListener
;
12 import javax
.jcr
.observation
.ObservationManager
;
14 import org
.argeo
.ArgeoException
;
15 import org
.argeo
.eclipse
.ui
.TreeParent
;
16 import org
.argeo
.eclipse
.ui
.jcr
.AsyncUiEventListener
;
17 import org
.argeo
.eclipse
.ui
.jcr
.utils
.NodeViewerComparer
;
18 import org
.argeo
.eclipse
.ui
.jcr
.views
.AbstractJcrBrowser
;
19 import org
.argeo
.jcr
.RepositoryRegister
;
20 import org
.argeo
.jcr
.security
.JcrKeyring
;
21 import org
.argeo
.jcr
.ui
.explorer
.JcrExplorerPlugin
;
22 import org
.argeo
.jcr
.ui
.explorer
.browser
.NodeContentProvider
;
23 import org
.argeo
.jcr
.ui
.explorer
.browser
.NodeLabelProvider
;
24 import org
.argeo
.jcr
.ui
.explorer
.browser
.PropertiesContentProvider
;
25 import org
.argeo
.jcr
.ui
.explorer
.model
.SingleJcrNode
;
26 import org
.argeo
.jcr
.ui
.explorer
.utils
.GenericNodeDoubleClickListener
;
27 import org
.argeo
.jcr
.ui
.explorer
.utils
.JcrUiUtils
;
28 import org
.eclipse
.jface
.action
.MenuManager
;
29 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
30 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
31 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
32 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
33 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
34 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
35 import org
.eclipse
.jface
.viewers
.TableViewer
;
36 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
37 import org
.eclipse
.jface
.viewers
.TreeViewer
;
38 import org
.eclipse
.swt
.SWT
;
39 import org
.eclipse
.swt
.custom
.SashForm
;
40 import org
.eclipse
.swt
.layout
.FillLayout
;
41 import org
.eclipse
.swt
.layout
.GridData
;
42 import org
.eclipse
.swt
.layout
.GridLayout
;
43 import org
.eclipse
.swt
.widgets
.Composite
;
44 import org
.eclipse
.swt
.widgets
.Display
;
45 import org
.eclipse
.swt
.widgets
.Menu
;
48 * Basic View to display a sash form to browse a JCR compliant multirepository
52 public class GenericJcrBrowser
extends AbstractJcrBrowser
{
53 // private final static Log log =
54 // LogFactory.getLog(GenericJcrBrowser.class);
55 public final static String ID
= JcrExplorerPlugin
.ID
+ ".browserView";
56 private boolean sortChildNodes
= false;
58 /* DEPENDENCY INJECTION */
59 private JcrKeyring jcrKeyring
;
60 private RepositoryRegister repositoryRegister
;
61 private RepositoryFactory repositoryFactory
;
64 private TreeViewer nodesViewer
;
65 private NodeContentProvider nodeContentProvider
;
66 private TableViewer propertiesViewer
;
67 private EventListener resultsObserver
;
70 // private JcrFileProvider jcrFileProvider;
71 // private FileHandler fileHandler;
74 public void createPartControl(Composite parent
) {
77 // Session nodeSession = jcrKeyring != null ? jcrKeyring.getSession()
79 // if (nodeSession == null) {
80 // Repository nodeRepository = JcrUtils.getRepositoryByAlias(
81 // repositoryRegister, ArgeoJcrConstants.ALIAS_NODE);
82 // if (nodeRepository != null)
84 // nodeSession = nodeRepository.login();
85 // // TODO : enhance that to enable multirepository listener.
86 // } catch (RepositoryException e1) {
87 // throw new ArgeoException("Cannot login to node repository");
91 // Instantiate the generic object that fits for
93 // Note that in RAP, it registers a service handler that provide the
94 // access to the files.
95 // jcrFileProvider = new JcrFileProvider();
96 // fileHandler = new FileHandler(jcrFileProvider);
98 parent
.setLayout(new FillLayout());
99 SashForm sashForm
= new SashForm(parent
, SWT
.VERTICAL
);
100 sashForm
.setSashWidth(4);
101 sashForm
.setLayout(new FillLayout());
103 // Create the tree on top of the view
104 Composite top
= new Composite(sashForm
, SWT
.NONE
);
105 GridLayout gl
= new GridLayout(1, false);
108 nodeContentProvider
= new NodeContentProvider(jcrKeyring
,
109 repositoryRegister
, repositoryFactory
, sortChildNodes
);
112 nodesViewer
= createNodeViewer(top
, nodeContentProvider
);
114 // context menu : it is completely defined in the plugin.xml file.
115 MenuManager menuManager
= new MenuManager();
116 Menu menu
= menuManager
.createContextMenu(nodesViewer
.getTree());
118 nodesViewer
.getTree().setMenu(menu
);
119 getSite().registerContextMenu(menuManager
, nodesViewer
);
120 getSite().setSelectionProvider(nodesViewer
);
122 nodesViewer
.setInput(getViewSite());
124 // Create the property viewer on the bottom
125 Composite bottom
= new Composite(sashForm
, SWT
.NONE
);
126 bottom
.setLayout(new GridLayout(1, false));
127 propertiesViewer
= createPropertiesViewer(bottom
);
129 sashForm
.setWeights(getWeights());
130 nodesViewer
.setComparer(new NodeViewerComparer());
134 * To be overridden to adapt size of form and result frames.
136 protected int[] getWeights() {
137 return new int[] { 70, 30 };
140 protected TreeViewer
createNodeViewer(Composite parent
,
141 final ITreeContentProvider nodeContentProvider
) {
143 final TreeViewer tmpNodeViewer
= new TreeViewer(parent
, SWT
.MULTI
);
145 tmpNodeViewer
.getTree().setLayoutData(
146 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
148 tmpNodeViewer
.setContentProvider(nodeContentProvider
);
149 tmpNodeViewer
.setLabelProvider(new NodeLabelProvider());
151 .addSelectionChangedListener(new ISelectionChangedListener() {
152 public void selectionChanged(SelectionChangedEvent event
) {
153 if (!event
.getSelection().isEmpty()) {
154 IStructuredSelection sel
= (IStructuredSelection
) event
156 Object firstItem
= sel
.getFirstElement();
157 if (firstItem
instanceof SingleJcrNode
)
159 .setInput(((SingleJcrNode
) firstItem
)
162 propertiesViewer
.setInput(getViewSite());
167 resultsObserver
= new TreeObserver(tmpNodeViewer
.getTree().getDisplay());
168 if (jcrKeyring
!= null)
170 ObservationManager observationManager
= jcrKeyring
.getSession()
171 .getWorkspace().getObservationManager();
172 observationManager
.addEventListener(resultsObserver
,
173 Event
.PROPERTY_ADDED
| Event
.PROPERTY_CHANGED
, "/",
174 true, null, null, false);
175 } catch (RepositoryException e
) {
176 throw new ArgeoException("Cannot register listeners", e
);
180 .addDoubleClickListener(new GenericNodeDoubleClickListener(
182 return tmpNodeViewer
;
185 protected TableViewer
createPropertiesViewer(Composite parent
) {
186 propertiesViewer
= new TableViewer(parent
);
187 propertiesViewer
.getTable().setLayoutData(
188 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
189 propertiesViewer
.getTable().setHeaderVisible(true);
190 propertiesViewer
.setContentProvider(new PropertiesContentProvider());
191 TableViewerColumn col
= new TableViewerColumn(propertiesViewer
,
193 col
.getColumn().setText("Name");
194 col
.getColumn().setWidth(200);
195 col
.setLabelProvider(new ColumnLabelProvider() {
196 public String
getText(Object element
) {
198 return ((Property
) element
).getName();
199 } catch (RepositoryException e
) {
200 throw new ArgeoException(
201 "Unexpected exception in label provider", e
);
205 col
= new TableViewerColumn(propertiesViewer
, SWT
.NONE
);
206 col
.getColumn().setText("Value");
207 col
.getColumn().setWidth(400);
208 col
.setLabelProvider(new ColumnLabelProvider() {
209 public String
getText(Object element
) {
211 Property property
= (Property
) element
;
212 if (property
.getType() == PropertyType
.BINARY
)
214 else if (property
.isMultiple()) {
215 StringBuffer buf
= new StringBuffer("[");
216 Value
[] values
= property
.getValues();
217 for (int i
= 0; i
< values
.length
; i
++) {
220 buf
.append(values
[i
].getString());
223 return buf
.toString();
225 return property
.getValue().getString();
226 } catch (RepositoryException e
) {
227 throw new ArgeoException(
228 "Unexpected exception in label provider", e
);
232 col
= new TableViewerColumn(propertiesViewer
, SWT
.NONE
);
233 col
.getColumn().setText("Type");
234 col
.getColumn().setWidth(200);
235 col
.setLabelProvider(new ColumnLabelProvider() {
236 public String
getText(Object element
) {
238 return PropertyType
.nameFromValue(((Property
) element
)
240 } catch (RepositoryException e
) {
241 throw new ArgeoException(
242 "Unexpected exception in label provider", e
);
246 propertiesViewer
.setInput(getViewSite());
247 return propertiesViewer
;
251 public void dispose() {
256 protected TreeViewer
getNodeViewer() {
260 /** Notifies the current view that a node has been added */
261 public void nodeAdded(TreeParent parentNode
) {
262 // insure that Ui objects have been correctly created:
263 JcrUiUtils
.forceRefreshIfNeeded(parentNode
);
264 getNodeViewer().refresh(parentNode
);
265 getNodeViewer().expandToLevel(parentNode
, 1);
268 /** Notifies the current view that a node has been added */
269 public void nodeRemoved(TreeParent parentNode
) {
270 IStructuredSelection newSel
= new StructuredSelection(parentNode
);
271 getNodeViewer().setSelection(newSel
, true);
273 IStructuredSelection tmpSel
= (IStructuredSelection
) getNodeViewer()
275 getNodeViewer().refresh(tmpSel
.getFirstElement());
278 class TreeObserver
extends AsyncUiEventListener
{
280 public TreeObserver(Display display
) {
285 protected Boolean
willProcessInUiThread(List
<Event
> events
)
286 throws RepositoryException
{
287 for (Event event
: events
) {
288 if (getLog().isTraceEnabled())
289 getLog().debug("Received event " + event
);
290 String path
= event
.getPath();
291 int index
= path
.lastIndexOf('/');
292 String propertyName
= path
.substring(index
+ 1);
293 if (getLog().isTraceEnabled())
294 getLog().debug("Concerned property " + propertyName
);
299 protected void onEventInUiThread(List
<Event
> events
)
300 throws RepositoryException
{
301 if (getLog().isTraceEnabled())
302 getLog().trace("Refresh result list");
303 nodesViewer
.refresh();
308 public void setSortChildNodes(boolean sortChildNodes
) {
309 this.sortChildNodes
= sortChildNodes
;
312 public boolean getSortChildNodes() {
313 return sortChildNodes
;
316 /* DEPENDENCY INJECTION */
317 public void setRepositoryRegister(RepositoryRegister repositoryRegister
) {
318 this.repositoryRegister
= repositoryRegister
;
321 public void setJcrKeyring(JcrKeyring jcrKeyring
) {
322 this.jcrKeyring
= jcrKeyring
;
325 public void setRepositoryFactory(RepositoryFactory repositoryFactory
) {
326 this.repositoryFactory
= repositoryFactory
;