X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=eclipse%2Fplugins%2Forg.argeo.eclipse.ui.jcr%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Feclipse%2Fui%2Fjcr%2Fviews%2FGenericJcrBrowser.java;h=e39bc56599e130d8fc01258826ff81e14bf990ea;hb=fea161ce3d77b81ae6ee0a7895f7bd64b4cb618e;hp=850786a03a3ebe13c079c44236e40a721a1be885;hpb=114840dc6535875a732925ced88b889000deb2f4;p=lgpl%2Fargeo-commons.git diff --git a/eclipse/plugins/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java b/eclipse/plugins/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java index 850786a03..e39bc5659 100644 --- a/eclipse/plugins/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java +++ b/eclipse/plugins/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java @@ -4,23 +4,28 @@ 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.jcr.RepositoryRegister; 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; @@ -29,6 +34,7 @@ import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; 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; @@ -40,12 +46,14 @@ import org.eclipse.swt.widgets.Composite; 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 TreeViewer nodesViewer; private TableViewer propertiesViewer; - private Session jcrSession; + // private Session jcrSession; + private RepositoryRegister repositoryRegister; private Comparator itemComparator = new Comparator() { public int compare(Item o1, Item o2) { @@ -82,18 +90,25 @@ public class GenericJcrBrowser extends ViewPart { if (!event.getSelection().isEmpty()) { IStructuredSelection sel = (IStructuredSelection) event .getSelection(); - log.debug(sel.getFirstElement().getClass()); propertiesViewer.setInput(sel.getFirstElement()); } else { propertiesViewer.setInput(getViewSite()); } } }); - try { - nodesViewer.setInput(jcrSession.getRootNode()); - } catch (RepositoryException e) { - throw new ArgeoException("Cannot initialize view", e); - } + nodesViewer.addDoubleClickListener(new IDoubleClickListener() { + public void doubleClick(DoubleClickEvent event) { + Object obj = ((IStructuredSelection) event.getSelection()) + .getFirstElement(); + if (obj instanceof RepositoryNode) { + ((RepositoryNode) obj).login(); + } else if (obj instanceof WorkspaceNode) { + ((WorkspaceNode) obj).login(); + } + + } + }); + nodesViewer.setInput(repositoryRegister); Composite bottom = new Composite(sashForm, SWT.NONE); bottom.setLayout(new GridLayout(1, false)); @@ -170,13 +185,29 @@ public class GenericJcrBrowser extends ViewPart { return new int[] { 70, 30 }; } - public void setJcrSession(Session jcrSession) { - this.jcrSession = jcrSession; + public void setRepositoryRegister(RepositoryRegister repositoryRegister) { + this.repositoryRegister = repositoryRegister; } /* * NODES */ + protected Object[] childrenNodes(Node parentNode) { + try { + List children = new ArrayList(); + 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); + } + } + private class NodeContentProvider implements ITreeContentProvider { public Object[] getElements(Object inputElement) { @@ -184,19 +215,32 @@ public class GenericJcrBrowser extends ViewPart { } public Object[] getChildren(Object parentElement) { - try { - if (parentElement instanceof Node) { - Set children = new TreeSet(itemComparator); - NodeIterator nit = ((Node) parentElement).getNodes(); - while (nit.hasNext()) - children.add(nit.nextNode()); - return children.toArray(); - } else { - return null; + 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); } - } catch (RepositoryException e) { - throw new ArgeoException("Cannot retrieve children for " - + parentElement, e); + } else if (parentElement instanceof RepositoryRegister) { + RepositoryRegister repositoryRegister = (RepositoryRegister) parentElement; + List nodes = new ArrayList(); + Map repositories = repositoryRegister + .getRepositories(); + for (String name : repositories.keySet()) { + nodes.add(new RepositoryNode(name, repositories.get(name))); + } + return nodes.toArray(); + } else { + return new Object[0]; } } @@ -216,6 +260,10 @@ public class GenericJcrBrowser extends ViewPart { 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) { @@ -238,13 +286,24 @@ public class GenericJcrBrowser extends ViewPart { 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 node.getName() + " [" - + node.getPrimaryNodeType().getName() + mixins - + "]"; + return label + " [" + node.getPrimaryNodeType().getName() + + mixins + "]"; } return element.toString(); } catch (RepositoryException e) { @@ -284,4 +343,78 @@ public class GenericJcrBrowser extends ViewPart { } } + + 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); + } + } + } + + 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); + } + } + + } }