+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.argeo.jcr.ui.explorer.views;
-import java.util.Arrays;
import java.util.List;
import javax.jcr.Property;
import javax.jcr.PropertyType;
+import javax.jcr.Repository;
import javax.jcr.RepositoryException;
+import javax.jcr.RepositoryFactory;
import javax.jcr.Session;
+import javax.jcr.Value;
import javax.jcr.observation.Event;
import javax.jcr.observation.EventListener;
import javax.jcr.observation.ObservationManager;
import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer;
import org.argeo.eclipse.ui.jcr.views.AbstractJcrBrowser;
import org.argeo.jcr.RepositoryRegister;
-import org.argeo.jcr.security.JcrKeyring;
+import org.argeo.jcr.ui.explorer.JcrExplorerPlugin;
import org.argeo.jcr.ui.explorer.browser.NodeContentProvider;
import org.argeo.jcr.ui.explorer.browser.NodeLabelProvider;
import org.argeo.jcr.ui.explorer.browser.PropertiesContentProvider;
-import org.argeo.jcr.ui.explorer.model.SingleJcrNode;
+import org.argeo.jcr.ui.explorer.model.SingleJcrNodeElem;
import org.argeo.jcr.ui.explorer.utils.GenericNodeDoubleClickListener;
import org.argeo.jcr.ui.explorer.utils.JcrUiUtils;
+import org.argeo.util.security.Keyring;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
* Basic View to display a sash form to browse a JCR compliant multirepository
* environment
*/
-
public class GenericJcrBrowser extends AbstractJcrBrowser {
- // private final static Log log =
- // LogFactory.getLog(GenericJcrBrowser.class);
+ public final static String ID = JcrExplorerPlugin.ID + ".browserView";
+ private boolean sortChildNodes = true;
/* DEPENDENCY INJECTION */
- private JcrKeyring jcrKeyring;
+ private Keyring keyring;
private RepositoryRegister repositoryRegister;
+ private RepositoryFactory repositoryFactory;
+ private Repository nodeRepository;
+ /**
+ * A session of the logged in user on the default workspace of the node
+ * repository.
+ */
+ private Session userSession;
// This page widgets
private TreeViewer nodesViewer;
private TableViewer propertiesViewer;
private EventListener resultsObserver;
- // Manage documents
- // private JcrFileProvider jcrFileProvider;
-
- // private FileHandler fileHandler;
-
@Override
public void createPartControl(Composite parent) {
-
- // look for session
- Session nodeSession = jcrKeyring != null ? jcrKeyring.getSession()
- : null;
- // if (nodeSession == null) {
- // Repository nodeRepository = JcrUtils.getRepositoryByAlias(
- // repositoryRegister, ArgeoJcrConstants.ALIAS_NODE);
- // if (nodeRepository != null)
- // try {
- // nodeSession = nodeRepository.login();
- // // TODO : enhance that to enable multirepository listener.
- // session = nodeSession;
- // } catch (RepositoryException e1) {
- // throw new ArgeoException("Cannot login to node repository");
- // }
- // }
-
- // Instantiate the generic object that fits for
- // both RCP & RAP
- // Note that in RAP, it registers a service handler that provide the
- // access to the files.
- // jcrFileProvider = new JcrFileProvider();
- // fileHandler = new FileHandler(jcrFileProvider);
-
parent.setLayout(new FillLayout());
SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
sashForm.setSashWidth(4);
GridLayout gl = new GridLayout(1, false);
top.setLayout(gl);
- nodeContentProvider = new NodeContentProvider(jcrKeyring,
- repositoryRegister);
+ try {
+ this.userSession = this.nodeRepository.login();
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot open user session", e);
+ }
+
+ nodeContentProvider = new NodeContentProvider(userSession, keyring,
+ repositoryRegister, repositoryFactory, sortChildNodes);
// nodes viewer
nodesViewer = createNodeViewer(top, nodeContentProvider);
// Create the property viewer on the bottom
Composite bottom = new Composite(sashForm, SWT.NONE);
bottom.setLayout(new GridLayout(1, false));
- propertiesViewer = new TableViewer(bottom);
- propertiesViewer.getTable().setLayoutData(
- new GridData(SWT.FILL, SWT.FILL, true, true));
- propertiesViewer.getTable().setHeaderVisible(true);
- propertiesViewer.setContentProvider(new PropertiesContentProvider());
- TableViewerColumn col = new TableViewerColumn(propertiesViewer,
- SWT.NONE);
- col.getColumn().setText("Name");
- col.getColumn().setWidth(200);
- col.setLabelProvider(new ColumnLabelProvider() {
- public String getText(Object element) {
- try {
- return ((Property) element).getName();
- } catch (RepositoryException e) {
- throw new ArgeoException(
- "Unexpected exception in label provider", e);
- }
- }
- });
- col = new TableViewerColumn(propertiesViewer, SWT.NONE);
- col.getColumn().setText("Value");
- col.getColumn().setWidth(400);
- col.setLabelProvider(new ColumnLabelProvider() {
- public String getText(Object element) {
- try {
- Property property = (Property) element;
- if (property.getType() == PropertyType.BINARY)
- return "<binary>";
- else if (property.isMultiple())
- return Arrays.asList(property.getValues()).toString();
- else
- return property.getValue().getString();
- } catch (RepositoryException e) {
- throw new ArgeoException(
- "Unexpected exception in label provider", e);
- }
- }
- });
- col = new TableViewerColumn(propertiesViewer, SWT.NONE);
- col.getColumn().setText("Type");
- col.getColumn().setWidth(200);
- col.setLabelProvider(new ColumnLabelProvider() {
- public String getText(Object element) {
- try {
- return PropertyType.nameFromValue(((Property) element)
- .getType());
- } catch (RepositoryException e) {
- throw new ArgeoException(
- "Unexpected exception in label provider", e);
- }
- }
- });
- propertiesViewer.setInput(getViewSite());
+ propertiesViewer = createPropertiesViewer(bottom);
sashForm.setWeights(getWeights());
nodesViewer.setComparer(new NodeViewerComparer());
}
+ @Override
+ public void refresh(Object obj) {
+ // Enable full refresh from a command when no element of the tree is
+ // selected
+ if (obj == null) {
+ Object[] elements = nodeContentProvider.getElements(null);
+ for (Object el : elements) {
+ if (el instanceof TreeParent)
+ JcrUiUtils.forceRefreshIfNeeded((TreeParent) el);
+ getNodeViewer().refresh(el);
+ }
+ }
+ super.refresh(obj);
+ }
+
/**
* To be overridden to adapt size of form and result frames.
*/
IStructuredSelection sel = (IStructuredSelection) event
.getSelection();
Object firstItem = sel.getFirstElement();
- if (firstItem instanceof SingleJcrNode)
+ if (firstItem instanceof SingleJcrNodeElem)
propertiesViewer
- .setInput(((SingleJcrNode) firstItem)
+ .setInput(((SingleJcrNodeElem) firstItem)
.getNode());
} else {
propertiesViewer.setInput(getViewSite());
});
resultsObserver = new TreeObserver(tmpNodeViewer.getTree().getDisplay());
- if (jcrKeyring != null)
+ if (keyring != null)
try {
- ObservationManager observationManager = jcrKeyring.getSession()
+ ObservationManager observationManager = userSession
.getWorkspace().getObservationManager();
observationManager.addEventListener(resultsObserver,
Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/",
return tmpNodeViewer;
}
+ protected TableViewer createPropertiesViewer(Composite parent) {
+ propertiesViewer = new TableViewer(parent);
+ propertiesViewer.getTable().setLayoutData(
+ new GridData(SWT.FILL, SWT.FILL, true, true));
+ propertiesViewer.getTable().setHeaderVisible(true);
+ propertiesViewer.setContentProvider(new PropertiesContentProvider());
+ TableViewerColumn col = new TableViewerColumn(propertiesViewer,
+ SWT.NONE);
+ col.getColumn().setText("Name");
+ col.getColumn().setWidth(200);
+ col.setLabelProvider(new ColumnLabelProvider() {
+ public String getText(Object element) {
+ try {
+ return ((Property) element).getName();
+ } catch (RepositoryException e) {
+ throw new ArgeoException(
+ "Unexpected exception in label provider", e);
+ }
+ }
+ });
+ col = new TableViewerColumn(propertiesViewer, SWT.NONE);
+ col.getColumn().setText("Value");
+ col.getColumn().setWidth(400);
+ col.setLabelProvider(new ColumnLabelProvider() {
+ public String getText(Object element) {
+ try {
+ Property property = (Property) element;
+ if (property.getType() == PropertyType.BINARY)
+ return "<binary>";
+ else if (property.isMultiple()) {
+ StringBuffer buf = new StringBuffer("[");
+ Value[] values = property.getValues();
+ for (int i = 0; i < values.length; i++) {
+ if (i != 0)
+ buf.append(", ");
+ buf.append(values[i].getString());
+ }
+ buf.append(']');
+ return buf.toString();
+ } else
+ return property.getValue().getString();
+ } catch (RepositoryException e) {
+ throw new ArgeoException(
+ "Unexpected exception in label provider", e);
+ }
+ }
+ });
+ col = new TableViewerColumn(propertiesViewer, SWT.NONE);
+ col.getColumn().setText("Type");
+ col.getColumn().setWidth(200);
+ col.setLabelProvider(new ColumnLabelProvider() {
+ public String getText(Object element) {
+ try {
+ return PropertyType.nameFromValue(((Property) element)
+ .getType());
+ } catch (RepositoryException e) {
+ throw new ArgeoException(
+ "Unexpected exception in label provider", e);
+ }
+ }
+ });
+ propertiesViewer.setInput(getViewSite());
+ return propertiesViewer;
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+
@Override
protected TreeViewer getNodeViewer() {
return nodesViewer;
}
+ /**
+ * Resets the tree content provider
+ *
+ * @param sortChildNodes
+ * if true the content provider will use a comparer to sort nodes
+ * that might slow down the display
+ * */
+ public void setSortChildNodes(boolean sortChildNodes) {
+ this.sortChildNodes = sortChildNodes;
+ ((NodeContentProvider) nodesViewer.getContentProvider())
+ .setSortChildren(sortChildNodes);
+ nodesViewer.setInput(getViewSite());
+ }
+
/** Notifies the current view that a node has been added */
public void nodeAdded(TreeParent parentNode) {
// insure that Ui objects have been correctly created:
getNodeViewer().expandToLevel(parentNode, 1);
}
- /** Notifies the current view that a node has been added */
+ /** Notifies the current view that a node has been removed */
public void nodeRemoved(TreeParent parentNode) {
IStructuredSelection newSel = new StructuredSelection(parentNode);
getNodeViewer().setSelection(newSel, true);
}
+ public boolean getSortChildNodes() {
+ return sortChildNodes;
+ }
+
/* DEPENDENCY INJECTION */
public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
this.repositoryRegister = repositoryRegister;
}
- public void setJcrKeyring(JcrKeyring jcrKeyring) {
- this.jcrKeyring = jcrKeyring;
+ public void setKeyring(Keyring keyring) {
+ this.keyring = keyring;
+ }
+
+ public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
+ this.repositoryFactory = repositoryFactory;
+ }
+
+ public void setNodeRepository(Repository nodeRepository) {
+ this.nodeRepository = nodeRepository;
}
}