package org.argeo.eclipse.ui.jcr.views;
-import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-import javax.jcr.Item;
-import javax.jcr.LoginException;
+
import javax.jcr.Node;
-import javax.jcr.NodeIterator;
import javax.jcr.Property;
-import javax.jcr.PropertyIterator;
import javax.jcr.PropertyType;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.argeo.ArgeoException;
-import org.argeo.eclipse.ui.TreeParent;
+import org.argeo.eclipse.ui.jcr.browser.NodeContentProvider;
+import org.argeo.eclipse.ui.jcr.browser.NodeLabelProvider;
+import org.argeo.eclipse.ui.jcr.browser.PropertiesContentProvider;
+import org.argeo.eclipse.ui.jcr.browser.RepositoryNode;
+import org.argeo.eclipse.ui.jcr.browser.WorkspaceNode;
+import org.argeo.eclipse.ui.jcr.utils.JcrFileProvider;
+import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer;
+import org.argeo.eclipse.ui.specific.FileHandler;
+import org.argeo.jcr.ArgeoJcrConstants;
+import org.argeo.jcr.JcrUtils;
import org.argeo.jcr.RepositoryRegister;
+import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TreeNode;
import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.part.ViewPart;
public class GenericJcrBrowser extends ViewPart {
- // private final static Log log =
- // LogFactory.getLog(GenericJcrBrowser.class);
+ private final static Log log = LogFactory.getLog(GenericJcrBrowser.class);
+
+ private Session session;
private TreeViewer nodesViewer;
+ private NodeContentProvider nodeContentProvider;
private TableViewer propertiesViewer;
- // private Session jcrSession;
private RepositoryRegister repositoryRegister;
- private Comparator<Item> itemComparator = new Comparator<Item>() {
- public int compare(Item o1, Item o2) {
- try {
- return o1.getName().compareTo(o2.getName());
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot compare " + o1 + " and " + o2,
- e);
- }
- }
- };
-
@Override
public void createPartControl(Composite parent) {
+
+ // Instantiate the generic object that fits for
+ // both RCP & RAP, must be final to be accessed in the double click
+ // listener.
+ // Not that in RAP, it registers a service handler that provide the
+ // access to the files.
+
+ final JcrFileProvider jfp = new JcrFileProvider();
+ final FileHandler fh = new FileHandler(jfp);
+
parent.setLayout(new FillLayout());
SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
GridLayout gl = new GridLayout(1, false);
top.setLayout(gl);
+ // nodes viewer
nodesViewer = new TreeViewer(top, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL);
nodesViewer.getTree().setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
- nodesViewer.setContentProvider(new NodeContentProvider());
+
+ // look for session
+ Session nodeSession = session;
+ if (nodeSession == null) {
+ Repository nodeRepository = JcrUtils.getRepositoryByAlias(
+ repositoryRegister, ArgeoJcrConstants.ALIAS_NODE);
+ if (nodeRepository != null)
+ try {
+ nodeSession = nodeRepository.login();
+ } catch (RepositoryException e1) {
+ throw new ArgeoException("Cannot login to node repository");
+ }
+ }
+ nodeContentProvider = new NodeContentProvider(nodeSession,
+ repositoryRegister);
+ nodesViewer.setContentProvider(nodeContentProvider);
nodesViewer.setLabelProvider(new NodeLabelProvider());
nodesViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
}
}
});
+
nodesViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
+ if (event.getSelection() == null
+ || event.getSelection().isEmpty())
+ return;
Object obj = ((IStructuredSelection) event.getSelection())
.getFirstElement();
if (obj instanceof RepositoryNode) {
- ((RepositoryNode) obj).login();
+ RepositoryNode rpNode = (RepositoryNode) obj;
+ rpNode.login();
+ nodesViewer.refresh(obj);
} else if (obj instanceof WorkspaceNode) {
((WorkspaceNode) obj).login();
+ nodesViewer.refresh(obj);
+ } else if (obj instanceof Node) {
+ Node node = (Node) obj;
+
+ // double clic on a file node triggers its opening
+ try {
+ if (node.isNodeType(NodeType.NT_FILE)) {
+ String name = node.getName();
+ String id = node.getIdentifier();
+ // For the file provider to be able to browse the
+ // various
+ // repository.
+ // TODO : enhanced that.
+ jfp.setRootNodes((Object[]) nodeContentProvider
+ .getElements(null));
+
+ fh.openFile(name, id);
+ }
+ } catch (RepositoryException re) {
+ throw new ArgeoException(
+ "Repository error while getting Node file info",
+ re);
+ }
}
-
}
});
- nodesViewer.setInput(repositoryRegister);
+
+ // context menu
+ MenuManager menuManager = new MenuManager();
+ Menu menu = menuManager.createContextMenu(nodesViewer.getTree());
+ nodesViewer.getTree().setMenu(menu);
+ getSite().registerContextMenu(menuManager, nodesViewer);
+ getSite().setSelectionProvider(nodesViewer);
+
+ nodesViewer.setInput(getViewSite());
Composite bottom = new Composite(sashForm, SWT.NONE);
bottom.setLayout(new GridLayout(1, false));
+ // properties viewer
propertiesViewer = new TableViewer(bottom);
propertiesViewer.getTable().setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
sashForm.setWeights(getWeights());
+ nodesViewer.setComparer(new NodeViewerComparer());
+
}
@Override
return new int[] { 70, 30 };
}
- public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
- this.repositoryRegister = repositoryRegister;
- }
-
/*
- * NODES
+ * NOTIFICATION
*/
- protected Object[] childrenNodes(Node parentNode) {
- try {
- List<Node> children = new ArrayList<Node>();
- NodeIterator nit = parentNode.getNodes();
- while (nit.hasNext()) {
- Node node = nit.nextNode();
- children.add(node);
- }
- Node[] arr = children.toArray(new Node[children.size()]);
- Arrays.sort(arr, itemComparator);
- return arr;
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot list children of " + parentNode, e);
- }
+ public void refresh(Object obj) {
+ nodesViewer.refresh(obj);
}
- private class NodeContentProvider implements ITreeContentProvider {
-
- public Object[] getElements(Object inputElement) {
- return getChildren(inputElement);
- }
-
- public Object[] getChildren(Object parentElement) {
- if (parentElement instanceof Node) {
- return childrenNodes((Node) parentElement);
- } else if (parentElement instanceof RepositoryNode) {
- return ((RepositoryNode) parentElement).getChildren();
- } else if (parentElement instanceof WorkspaceNode) {
- Session session = ((WorkspaceNode) parentElement).getSession();
- if (session == null)
- return new Object[0];
-
- try {
- return childrenNodes(session.getRootNode());
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot retrieve root node of "
- + session, e);
- }
- } else if (parentElement instanceof RepositoryRegister) {
- RepositoryRegister repositoryRegister = (RepositoryRegister) parentElement;
- List<RepositoryNode> nodes = new ArrayList<RepositoryNode>();
- Map<String, Repository> repositories = repositoryRegister
- .getRepositories();
- for (String name : repositories.keySet()) {
- nodes.add(new RepositoryNode(name, repositories.get(name)));
- }
- return nodes.toArray();
- } else {
- return new Object[0];
- }
- }
-
- public Object getParent(Object element) {
- try {
- if (element instanceof Node) {
- return ((Node) element).getParent();
- }
- return null;
- } catch (RepositoryException e) {
- throw new ArgeoException(
- "Cannot retrieve parent of " + element, e);
- }
- }
-
- public boolean hasChildren(Object element) {
- try {
- if (element instanceof Node) {
- return ((Node) element).hasNodes();
- } else if (element instanceof RepositoryNode) {
- return ((RepositoryNode) element).hasChildren();
- } else if (element instanceof WorkspaceNode) {
- return ((WorkspaceNode) element).getSession() != null;
- }
- return false;
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot check children of " + element,
- e);
- }
- }
-
- public void dispose() {
- }
-
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- }
-
+ public void nodeAdded(Node parentNode, Node newNode) {
+ nodesViewer.refresh(parentNode);
+ nodesViewer.expandToLevel(newNode, 0);
}
- class NodeLabelProvider extends LabelProvider {
-
- public String getText(Object element) {
- try {
- if (element instanceof Node) {
- Node node = (Node) element;
- String label = node.getName();
- // try {
- // Item primaryItem = node.getPrimaryItem();
- // label = primaryItem instanceof Property ? ((Property)
- // primaryItem)
- // .getValue().getString()
- // + " ("
- // + node.getName()
- // + ")" : node.getName();
- // } catch (RepositoryException e) {
- // label = node.getName();
- // }
- StringBuffer mixins = new StringBuffer("");
- for (NodeType type : node.getMixinNodeTypes())
- mixins.append(' ').append(type.getName());
-
- return label + " [" + node.getPrimaryNodeType().getName()
- + mixins + "]";
- }
- return element.toString();
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot get text for of " + element, e);
- }
- }
+ public void nodeRemoved(Node parentNode) {
+ IStructuredSelection newSel = new StructuredSelection(parentNode);
+ nodesViewer.setSelection(newSel, true);
+ // Force refresh
+ IStructuredSelection tmpSel = (IStructuredSelection) nodesViewer
+ .getSelection();
+ nodesViewer.refresh(tmpSel.getFirstElement());
}
- /*
- * PROPERTIES
- */
- private class PropertiesContentProvider implements
- IStructuredContentProvider {
-
- public void dispose() {
- }
-
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- }
-
- public Object[] getElements(Object inputElement) {
- try {
- if (inputElement instanceof Node) {
- Set<Property> props = new TreeSet<Property>(itemComparator);
- PropertyIterator pit = ((Node) inputElement)
- .getProperties();
- while (pit.hasNext())
- props.add(pit.nextProperty());
- return props.toArray();
- }
- return new Object[] {};
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot get element for "
- + inputElement, e);
- }
- }
-
+ // IoC
+ public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
+ this.repositoryRegister = repositoryRegister;
}
- private class RepositoryNode extends TreeParent {
- private final String name;
- private final Repository repository;
- private Session defaultSession = null;
-
- public RepositoryNode(String name, Repository repository) {
- super(name);
- this.name = name;
- this.repository = repository;
- }
-
- public Repository getRepository() {
- return repository;
- }
-
- public Session getDefaultSession() {
- return defaultSession;
- }
-
- public void login() {
- try {
- defaultSession = repository.login();
- String[] wkpNames = defaultSession.getWorkspace()
- .getAccessibleWorkspaceNames();
- for (String wkpName : wkpNames) {
- if (wkpName.equals(defaultSession.getWorkspace().getName()))
- addChild(new WorkspaceNode(repository, wkpName,
- defaultSession));
- else
- addChild(new WorkspaceNode(repository, wkpName));
- }
- nodesViewer.refresh(this);
- } catch (RepositoryException e) {
- throw new ArgeoException(
- "Cannot connect to repository " + name, e);
- }
- }
+ public void setSession(Session session) {
+ this.session = session;
}
- private class WorkspaceNode extends TreeParent {
- private final String name;
- private final Repository repository;
- private Session session = null;
-
- public WorkspaceNode(Repository repository, String name) {
- this(repository, name, null);
- }
-
- public WorkspaceNode(Repository repository, String name, Session session) {
- super(name);
- this.name = name;
- this.repository = repository;
- this.session = session;
- }
-
- public Session getSession() {
- return session;
- }
-
- public void login() {
- try {
- if (session != null)
- session.logout();
-
- session = repository.login(name);
- nodesViewer.refresh(this);
- } catch (RepositoryException e) {
- throw new ArgeoException(
- "Cannot connect to repository " + name, e);
- }
- }
-
- }
}