]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java
Improve logging
[lgpl/argeo-commons.git] / eclipse / runtime / org.argeo.eclipse.ui.jcr / src / main / java / org / argeo / eclipse / ui / jcr / views / GenericJcrBrowser.java
index 414cb010ac71d4a6974429c16d9ad8104477b78e..f949be319d74eba1ee693a257a5f8c68dbb1d379 100644 (file)
@@ -1,26 +1,28 @@
 package org.argeo.eclipse.ui.jcr.views;
 
-import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.Property;
 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.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
-import org.argeo.eclipse.ui.dialogs.Error;
 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;
@@ -28,8 +30,8 @@ import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
 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.TreeViewer;
@@ -40,101 +42,59 @@ 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 static Log log = LogFactory.getLog(GenericJcrBrowser.class);
+public class GenericJcrBrowser extends AbstractJcrBrowser {
+       private final static Log log = LogFactory.getLog(GenericJcrBrowser.class);
+
+       private Session session;
 
        private TreeViewer nodesViewer;
+       private NodeContentProvider nodeContentProvider;
        private TableViewer propertiesViewer;
 
+       private JcrFileProvider jcrFileProvider;
+       private FileHandler fileHandler;
+
        private RepositoryRegister repositoryRegister;
 
        @Override
        public void createPartControl(Composite parent) {
-               parent.setLayout(new FillLayout());
 
+               // 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");
+                               }
+               }
+
+               // 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);
                sashForm.setLayout(new FillLayout());
 
+               // Create the tree on top of the view
                Composite top = new Composite(sashForm, SWT.NONE);
                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());
-               nodesViewer.setLabelProvider(new NodeLabelProvider());
-               nodesViewer
-                               .addSelectionChangedListener(new ISelectionChangedListener() {
-                                       public void selectionChanged(SelectionChangedEvent event) {
-                                               if (!event.getSelection().isEmpty()) {
-                                                       IStructuredSelection sel = (IStructuredSelection) event
-                                                                       .getSelection();
-                                                       propertiesViewer.setInput(sel.getFirstElement());
-                                               } else {
-                                                       propertiesViewer.setInput(getViewSite());
-                                               }
-                                       }
-                               });
-               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();
-                                       nodesViewer.refresh(obj);
-                               } else if (obj instanceof WorkspaceNode) {
-                                       ((WorkspaceNode) obj).login();
-                                       nodesViewer.refresh(obj);
-                               } // call the openFile commands on node
-                               else if (obj instanceof Node) {
-                                       Node node = (Node) obj;
-                                       try {
-                                               if (node.isNodeType("nt:file")) {
-
-                                                       Node child = node.getNodes().nextNode();
-                                                       if (!child.isNodeType("nt:resource")) {
-                                                               Error.show("Cannot open file children Node that are not of 'nt:resource' type.");
-                                                               return;
-                                                       }
-                                                       InputStream fis = null;
-
-                                                       try {
-                                                               fis = (InputStream) child
-                                                                               .getProperty("jcr:data").getBinary()
-                                                                               .getStream();
-
-                                                               String name = node.getName();
-
-                                                               // Instantiate the generic object that fits for
-                                                               // both
-                                                               // RCP & RAP.
-                                                               FileHandler fh = new FileHandler();
-                                                               fh.openFile(name, fis);
-                                                               // fh.openFile(file);
-                                                       } catch (Exception e) {
-                                                               throw new ArgeoException(
-                                                                               "Stream error while opening file", e);
-                                                       } finally {
-                                                               IOUtils.closeQuietly(fis);
-                                                       }
-                                               }
-                                       } catch (RepositoryException re) {
-                                               re.printStackTrace();
-
-                                       }
-                               }
+               nodeContentProvider = new NodeContentProvider(nodeSession,
+                               repositoryRegister);
 
-                       }
-               });
+               // nodes viewer
+               nodesViewer = createNodeViewer(top, nodeContentProvider);
 
                // context menu
                MenuManager menuManager = new MenuManager();
@@ -142,13 +102,11 @@ public class GenericJcrBrowser extends ViewPart {
                nodesViewer.getTree().setMenu(menu);
                getSite().registerContextMenu(menuManager, nodesViewer);
                getSite().setSelectionProvider(nodesViewer);
+               nodesViewer.setInput(getViewSite());
 
-               nodesViewer.setInput(repositoryRegister);
-
+               // Create the property viewer on the bottom
                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));
@@ -204,102 +162,129 @@ public class GenericJcrBrowser extends ViewPart {
                propertiesViewer.setInput(getViewSite());
 
                sashForm.setWeights(getWeights());
-
-       }
-
-       @Override
-       public void setFocus() {
-               nodesViewer.getTree().setFocus();
+               nodesViewer.setComparer(new NodeViewerComparer());
        }
 
        /**
-        * To be overidden to adapt size of form and result frames.
-        * 
-        * @return
+        * To be overridden to adapt size of form and result frames.
         */
        protected int[] getWeights() {
                return new int[] { 70, 30 };
        }
 
-       /*
-        * NOTIFICATION
-        */
-       public void refresh(Object obj) {
-               nodesViewer.refresh(obj);
+       // @Override
+       // public void setFocus() {
+       // nodesViewer.getTree().setFocus();
+       // }
+       //
+       // /*
+       // * NOTIFICATION
+       // */
+       // public void refresh(Object obj) {
+       // nodesViewer.refresh(obj);
+       // }
+       //
+       // public void nodeAdded(Node parentNode, Node newNode) {
+       // nodesViewer.refresh(parentNode);
+       // nodesViewer.expandToLevel(newNode, 0);
+       // }
+       //
+       // 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());
+       // }
+
+       private JcrFileProvider getJcrFileProvider() {
+               return jcrFileProvider;
        }
 
-       public void nodeAdded(Node parentNode, Node newNode) {
-               nodesViewer.refresh(parentNode);
-               nodesViewer.expandToLevel(newNode, 0);
+       private FileHandler getFileHandler() {
+               return fileHandler;
        }
 
-       public void nodeRemoved(Node parentNode) {
-
-               List<Node> al = new ArrayList<Node>();
-               al.add(parentNode);
-
-               IStructuredSelection newSel = new StructuredSelection(al);
-               // IStructuredSelection newSel = new StructuredSelection(parentNode);
-
-               if (log.isDebugEnabled())
-                       log.debug("new selection size = " + newSel.size());
-
-               nodesViewer.setSelection(newSel, true);
-               IStructuredSelection tmpSel = (IStructuredSelection) nodesViewer
-                               .getSelection();
-
-               if (log.isDebugEnabled())
-                       log.debug("set selection size = " + tmpSel.size());
-
-               nodesViewer.refresh();
-
-               //
-               // log.debug(" Class selected (Parent 1ST element) : "
-               // + tmpSel.getFirstElement().getClass());
-               // setFocus();
-               //
-               // nodesViewer.refresh(parentNode);
-
-               // // Call the refresh node command
-               // try {
-               // IWorkbench iw = JcrUiPlugin.getDefault().getWorkbench();
-               // IHandlerService handlerService = (IHandlerService) iw
-               // .getService(IHandlerService.class);
-               //
-               // // get the command from plugin.xml
-               // IWorkbenchWindow window = iw.getActiveWorkbenchWindow();
-               // ICommandService cmdService = (ICommandService) window
-               // .getService(ICommandService.class);
-               // Command cmd = cmdService
-               // .getCommand(OpenEbiDetailsEditor.COMMAND_NAME);
-               //
-               // // log.debug("cmd : " + cmd);
-               // ArrayList<Parameterization> parameters = new
-               // ArrayList<Parameterization>();
-               //
-               // // get the parameter
-               // IParameter iparam = cmd
-               // .getParameter(OpenEbiDetailsEditor.PARAM_UUID);
-               //
-               // Parameterization params = new Parameterization(iparam,
-               // ((String[]) obj)[0]);
-               // parameters.add(params);
-               //
-               // // build the parameterized command
-               // ParameterizedCommand pc = new ParameterizedCommand(cmd,
-               // parameters.toArray(new Parameterization[parameters.size()]));
-               //
-               // // execute the command
-               // handlerService = (IHandlerService) window
-               // .getService(IHandlerService.class);
-               // handlerService.executeCommand(pc, null);
-               //
-               // } catch (Exception e) {
-               // throw new ArgeoException("Error opening EBI", e);
-               // }
+       protected TreeViewer createNodeViewer(Composite parent,
+                       final ITreeContentProvider nodeContentProvider) {
+
+               final TreeViewer tmpNodeViewer = new TreeViewer(parent, SWT.MULTI);
+
+               tmpNodeViewer.getTree().setLayoutData(
+                               new GridData(SWT.FILL, SWT.FILL, true, true));
+
+               tmpNodeViewer.setContentProvider(nodeContentProvider);
+               tmpNodeViewer.setLabelProvider(new NodeLabelProvider());
+               tmpNodeViewer
+                               .addSelectionChangedListener(new ISelectionChangedListener() {
+                                       public void selectionChanged(SelectionChangedEvent event) {
+                                               if (!event.getSelection().isEmpty()) {
+                                                       IStructuredSelection sel = (IStructuredSelection) event
+                                                                       .getSelection();
+                                                       propertiesViewer.setInput(sel.getFirstElement());
+                                               } else {
+                                                       propertiesViewer.setInput(getViewSite());
+                                               }
+                                       }
+                               });
+
+               tmpNodeViewer.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 rpNode = (RepositoryNode) obj;
+                                       rpNode.login();
+                                       tmpNodeViewer.refresh(obj);
+                               } else if (obj instanceof WorkspaceNode) {
+                                       ((WorkspaceNode) obj).login();
+                                       tmpNodeViewer.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.
+                                                       getJcrFileProvider().setRootNodes(
+                                                                       (Object[]) nodeContentProvider
+                                                                                       .getElements(null));
+
+                                                       getFileHandler().openFile(name, id);
+                                               }
+                                       } catch (RepositoryException re) {
+                                               throw new ArgeoException(
+                                                               "Repository error while getting Node file info",
+                                                               re);
+                                       }
+                               }
+                       }
+               });
+               return tmpNodeViewer;
+       }
+
+       @Override
+       protected TreeViewer getNodeViewer() {
+               return nodesViewer;
        }
 
+       // IoC
        public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
                this.repositoryRegister = repositoryRegister;
        }
+
+       public void setSession(Session session) {
+               this.session = session;
+       }
+
 }