]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java
Add dep folder
[lgpl/argeo-commons.git] / server / plugins / org.argeo.jcr.ui.explorer / src / main / java / org / argeo / jcr / ui / explorer / views / GenericJcrBrowser.java
index 3af60844c907be7d5be60de784f354f30b5dfbce..f401ae8fe3a352967e0a1b979d2b6abaa8d88e72 100644 (file)
@@ -1,12 +1,29 @@
+/*
+ * 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;
@@ -17,14 +34,14 @@ import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
 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;
@@ -48,16 +65,20 @@ import org.eclipse.swt.widgets.Menu;
  * 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 = false;
+       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;
@@ -65,36 +86,8 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
        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);
@@ -105,8 +98,14 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
                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);
@@ -124,64 +123,27 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
                // 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.
         */
@@ -206,9 +168,9 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
                                                        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());
@@ -217,9 +179,9 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
                                });
 
                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, "/",
@@ -234,11 +196,95 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
                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:
@@ -247,7 +293,7 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
                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);
@@ -287,10 +333,6 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
 
        }
 
-       public void setSortChildNodes(boolean sortChildNodes) {
-               this.sortChildNodes = sortChildNodes;
-       }
-
        public boolean getSortChildNodes() {
                return sortChildNodes;
        }
@@ -300,8 +342,16 @@ public class GenericJcrBrowser extends AbstractJcrBrowser {
                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;
        }
 
 }