"icons/binary.png").createImage();
public final static Image HOME = JcrUiPlugin.getImageDescriptor(
"icons/home.gif").createImage();
+ public final static Image SORT = JcrUiPlugin.getImageDescriptor(
+ "icons/sort.gif").createImage();
public final static Image REPOSITORIES = JcrUiPlugin.getImageDescriptor(
"icons/repositories.gif").createImage();
--- /dev/null
+package org.argeo.eclipse.ui.jcr.utils;
+
+import java.io.InputStream;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.specific.FileProvider;
+
+/**
+ * Implements a FileProvider for UI purposes. Note that it might not be very
+ * reliable as long as we have not fixed login & multi repository issues that
+ * will be addressed in the next version.
+ *
+ * NOTE: id used here is the real id of the JCR Node, not the JCR Path
+ *
+ * Relies on common approach for JCR file handling implementation.
+ *
+ */
+
+public class JcrFileProvider implements FileProvider {
+
+ // private Object[] rootNodes;
+ private Node refNode;
+
+ /**
+ * Must be set in order for the provider to be able to get current session
+ * and thus have the ability to get the file node corresponding to a given
+ * file ID
+ *
+ * FIXME : this introduces some concurrences ISSUES.
+ *
+ * @param repositoryNode
+ */
+ public void setReferenceNode(Node refNode) {
+ this.refNode = refNode;
+ }
+
+ /**
+ * Must be set in order for the provider to be able to search the repository
+ * Provided object might be either JCR Nodes or UI RepositoryNode for the
+ * time being.
+ *
+ * @param repositoryNode
+ */
+ // public void setRootNodes(Object[] rootNodes) {
+ // List<Object> tmpNodes = new ArrayList<Object>();
+ // for (int i = 0; i < rootNodes.length; i++) {
+ // Object obj = rootNodes[i];
+ // if (obj instanceof Node) {
+ // tmpNodes.add(obj);
+ // } else if (obj instanceof RepositoryRegister) {
+ // RepositoryRegister repositoryRegister = (RepositoryRegister) obj;
+ // Map<String, Repository> repositories = repositoryRegister
+ // .getRepositories();
+ // for (String name : repositories.keySet()) {
+ // // tmpNodes.add(new RepositoryNode(name, repositories
+ // // .get(name)));
+ // }
+ //
+ // }
+ // }
+ // this.rootNodes = tmpNodes.toArray();
+ // }
+
+ public byte[] getByteArrayFileFromId(String fileId) {
+ InputStream fis = null;
+ byte[] ba = null;
+ Node child = getFileNodeFromId(fileId);
+ try {
+ fis = (InputStream) child.getProperty(Property.JCR_DATA)
+ .getBinary().getStream();
+ ba = IOUtils.toByteArray(fis);
+
+ } catch (Exception e) {
+ throw new ArgeoException("Stream error while opening file", e);
+ } finally {
+ IOUtils.closeQuietly(fis);
+ }
+ return ba;
+ }
+
+ public InputStream getInputStreamFromFileId(String fileId) {
+ try {
+ InputStream fis = null;
+
+ Node child = getFileNodeFromId(fileId);
+ fis = (InputStream) child.getProperty(Property.JCR_DATA)
+ .getBinary().getStream();
+ return fis;
+ } catch (RepositoryException re) {
+ throw new ArgeoException("Cannot get stream from file node for Id "
+ + fileId, re);
+ }
+ }
+
+ /**
+ * Throws an exception if the node is not found in the current repository (a
+ * bit like a FileNotFoundException)
+ *
+ * @param fileId
+ * @return Returns the child node of the nt:file node. It is the child node
+ * that have the jcr:data property where actual file is stored.
+ * never null
+ */
+ private Node getFileNodeFromId(String fileId) {
+ try {
+ Node result = refNode.getSession().getNodeByIdentifier(fileId);
+
+ // rootNodes: for (int j = 0; j < rootNodes.length; j++) {
+ // // in case we have a classic JCR Node
+ // if (rootNodes[j] instanceof Node) {
+ // Node curNode = (Node) rootNodes[j];
+ // if (result != null)
+ // break rootNodes;
+ // } // Case of a repository Node
+ // else if (rootNodes[j] instanceof RepositoryNode) {
+ // Object[] nodes = ((RepositoryNode) rootNodes[j])
+ // .getChildren();
+ // for (int i = 0; i < nodes.length; i++) {
+ // Node node = (Node) nodes[i];
+ // result = node.getSession().getNodeByIdentifier(fileId);
+ // if (result != null)
+ // break rootNodes;
+ // }
+ // }
+ // }
+
+ // Sanity checks
+ if (result == null)
+ throw new ArgeoException("File node not found for ID" + fileId);
+
+ // Ensure that the node have the correct type.
+ if (!result.isNodeType(NodeType.NT_FILE))
+ throw new ArgeoException(
+ "Cannot open file children Node that are not of '"
+ + NodeType.NT_RESOURCE + "' type.");
+
+ // Get the usefull part of the Node
+ Node child = result.getNodes().nextNode();
+ if (child == null || !child.isNodeType(NodeType.NT_RESOURCE))
+ throw new ArgeoException(
+ "ERROR: IN the current implemented model, '"
+ + NodeType.NT_FILE
+ + "' file node must have one and only one child of the nt:ressource, where actual data is stored");
+ return child;
+
+ } catch (RepositoryException re) {
+ throw new ArgeoException("Erreur while getting file node of ID "
+ + fileId, re);
+ }
+ }
+}
--- /dev/null
+package org.argeo.eclipse.ui.jcr.utils;
+
+import java.util.Comparator;
+
+import javax.jcr.Item;
+import javax.jcr.RepositoryException;
+
+import org.argeo.ArgeoException;
+
+public class JcrItemsComparator implements Comparator<Item> {
+ public int compare(Item o1, Item o2) {
+ try {
+ // TODO: put folder before files
+ return o1.getName().compareTo(o2.getName());
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot compare " + o1 + " and " + o2, e);
+ }
+ }
+
+}
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="openGenericJcrQueryEditor"
- class="org.argeo.jcr.ui.explorer.commands.OpenGenericJcrQueryEditor"
+ class="org.argeo.eclipse.ui.jcr.commands.OpenGenericJcrQueryEditor"
scope="prototype">
<property name="editorId"
- value="org.argeo.slc.client.ui.dist.genericJcrQueryEditor" />
+ value="org.argeo.jcr.ui.explorer.genericJcrQueryEditor" />
</bean>
<bean id="openGenericNodeEditor"
id="org.argeo.jcr.ui.explorer.openFile"
name="Open current file">
</command>
+ <command
+ defaultHandler="org.argeo.jcr.ui.explorer.commands.SortChildNodes"
+ id="org.argeo.jcr.ui.explorer.sortChildNodes"
+ name="Sort node tree">
+ <state
+ id="org.argeo.jcr.ui.explorer.sortChildNodes.toggleState">
+ <class class="org.eclipse.jface.commands.ToggleState">
+ <parameter
+ name="default"
+ value="true" />
+ </class>
+ </state>
+ </command>
</extension>
<!-- Menus -->
<extension point="org.eclipse.ui.menus">
+ <!-- Browser view specific menu -->
<menuContribution
locationURI="menu:org.argeo.jcr.ui.explorer.browserView">
<command
commandId="org.argeo.jcr.ui.explorer.addRemoteRepository"
icon="icons/addRepo.gif"
style="push">
+ </command>
+ <command
+ commandId="org.argeo.jcr.ui.explorer.sortChildNodes"
+ icon="icons/sort.gif"
+ style="toggle"
+ label="Sort child nodes"
+ tooltip="Warning: stopping to sort children nodes might enhance overall performances">
</command>
</menuContribution>
+ <!-- Browser view popup context menu -->
<menuContribution
locationURI="popup:org.argeo.jcr.ui.explorer.browserView">
<command
+++ /dev/null
-package org.argeo.jcr.ui.explorer.browser;
-
-import java.util.Comparator;
-
-import javax.jcr.Item;
-import javax.jcr.RepositoryException;
-
-import org.argeo.ArgeoException;
-
-public class ItemComparator implements Comparator<Item> {
- public int compare(Item o1, Item o2) {
- try {
- // TODO: put folder before files
- return o1.getName().compareTo(o2.getName());
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot compare " + o1 + " and " + o2, e);
- }
- }
-
-}
package org.argeo.jcr.ui.explorer.browser;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.Session;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.argeo.eclipse.ui.TreeParent;
import org.argeo.jcr.ArgeoJcrConstants;
import org.argeo.jcr.JcrUtils;
import org.argeo.jcr.security.JcrKeyring;
import org.argeo.jcr.ui.explorer.model.RepositoriesNode;
import org.argeo.jcr.ui.explorer.model.SingleJcrNode;
+import org.argeo.jcr.ui.explorer.utils.TreeObjectsComparator;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
*
*/
public class NodeContentProvider implements ITreeContentProvider {
- // private final static Log log =
- // LogFactory.getLog(NodeContentProvider.class);
+ private final static Log log = LogFactory.getLog(NodeContentProvider.class);
// Business Objects
private RepositoryRegister repositoryRegister;
private JcrKeyring jcrKeyring;
// Utils
- // private ItemComparator itemComparator = new ItemComparator();
+ private boolean sortChildren = true;
+ private TreeObjectsComparator itemComparator = new TreeObjectsComparator();
public NodeContentProvider(JcrKeyring jcrKeyring,
RepositoryRegister repositoryRegister) {
}
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();
-
- if (parentElement instanceof TreeParent)
- return ((TreeParent) parentElement).getChildren();
- else {
+ if (parentElement instanceof TreeParent) {
+ if (sortChildren) {
+ // TreeParent[] arr = (TreeParent[]) ((TreeParent)
+ // parentElement)
+ // .getChildren();
+ Object[] tmpArr = ((TreeParent) parentElement).getChildren();
+ TreeParent[] arr = new TreeParent[tmpArr.length];
+ for (int i = 0; i < tmpArr.length; i++)
+ arr[i] = (TreeParent) tmpArr[i];
+
+ Arrays.sort(arr, itemComparator);
+ return arr;
+ } else
+ return ((TreeParent) parentElement).getChildren();
+
+ } else {
return new Object[0];
}
}
} else if (element instanceof TreeParent) {
TreeParent tp = (TreeParent) element;
return tp.hasChildren();
- // } 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) {
}
-
- // 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);
- // }
- // }
-
}
import javax.jcr.RepositoryException;
import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.jcr.utils.JcrItemsComparator;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
public class PropertiesContentProvider implements IStructuredContentProvider {
- private ItemComparator itemComparator = new ItemComparator();
+ private JcrItemsComparator itemComparator = new JcrItemsComparator();
public void dispose() {
}
--- /dev/null
+package org.argeo.jcr.ui.explorer.commands;
+
+import org.argeo.jcr.ui.explorer.JcrExplorerPlugin;
+import org.argeo.jcr.ui.explorer.views.GenericJcrBrowser;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.State;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Change isSorted state of the JcrExplorer Browser
+ */
+public class SortChildNodes extends AbstractHandler {
+ public final static String ID = JcrExplorerPlugin.ID + ".sortChildNodes";
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ GenericJcrBrowser view = (GenericJcrBrowser) HandlerUtil
+ .getActiveWorkbenchWindow(event).getActivePage()
+ .findView(GenericJcrBrowser.ID);
+
+ ICommandService service = (ICommandService) PlatformUI.getWorkbench()
+ .getService(ICommandService.class);
+ Command command = service.getCommand(ID);
+ State state = command.getState(ID + ".toggleState");
+
+ boolean wasSorted = (Boolean) state.getValue();
+ view.setSortChildNodes(!wasSorted);
+ state.setValue(!wasSorted);
+ return null;
+ }
+}
import javax.jcr.RepositoryException;
import org.argeo.ArgeoException;
-import org.argeo.jcr.ui.explorer.browser.ItemComparator;
+import org.argeo.eclipse.ui.jcr.utils.JcrItemsComparator;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
*/
public class SingleNodeAsTreeContentProvider implements ITreeContentProvider {
// private Node rootNode;
- private ItemComparator itemComparator = new ItemComparator();
+ private JcrItemsComparator itemComparator = new JcrItemsComparator();
/**
* Sends back the first level of the Tree. input element must be a single
import javax.jcr.nodetype.NodeType;
import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.jcr.utils.JcrFileProvider;
import org.argeo.eclipse.ui.specific.FileHandler;
import org.argeo.jcr.ui.explorer.JcrExplorerPlugin;
import org.argeo.jcr.ui.explorer.editors.GenericNodeEditor;
// ITreeContentProvider itcp = (ITreeContentProvider)
// nodeViewer
// .getContentProvider();
- // jfp.setRootNodes((Object[]) itcp.getElements(null));
+ jfp.setReferenceNode(node);
fileHandler.openFile(name, id);
}
GenericNodeEditorInput gnei = new GenericNodeEditorInput(node);
+++ /dev/null
-package org.argeo.jcr.ui.explorer.utils;
-
-import java.io.InputStream;
-
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-import javax.jcr.nodetype.NodeType;
-
-import org.apache.commons.io.IOUtils;
-import org.argeo.ArgeoException;
-import org.argeo.eclipse.ui.specific.FileProvider;
-import org.argeo.jcr.ui.explorer.model.RepositoryNode;
-
-/**
- * Implements a FileProvider for UI purposes. Note that it might not be very
- * reliable as long as we have not fixed login & multi repository issues that
- * will be addressed in the next version.
- *
- * NOTE: id used here is the real id of the JCR Node, not the JCR Path
- *
- * Relies on common approach for JCR file handling implementation.
- *
- */
-
-public class JcrFileProvider implements FileProvider {
-
- private Object[] rootNodes;
-
- /**
- * Must be set in order for the provider to be able to search the repository
- * Provided object might be either JCR Nodes or UI RepositoryNode for the
- * time being.
- *
- * @param repositoryNode
- */
- // public void setRootNodes(Object[] rootNodes) {
- // List<Object> tmpNodes = new ArrayList<Object>();
- // for (int i = 0; i < rootNodes.length; i++) {
- // Object obj = rootNodes[i];
- // if (obj instanceof Node) {
- // tmpNodes.add(obj);
- // } else if (obj instanceof RepositoryRegister) {
- // RepositoryRegister repositoryRegister = (RepositoryRegister) obj;
- // Map<String, Repository> repositories = repositoryRegister
- // .getRepositories();
- // for (String name : repositories.keySet()) {
- // tmpNodes.add(new RepositoryNode(name, repositories
- // .get(name)));
- // }
- //
- // }
- // }
- // this.rootNodes = tmpNodes.toArray();
- // }
-
- public byte[] getByteArrayFileFromId(String fileId) {
- InputStream fis = null;
- byte[] ba = null;
- Node child = getFileNodeFromId(fileId);
- try {
- fis = (InputStream) child.getProperty(Property.JCR_DATA)
- .getBinary().getStream();
- ba = IOUtils.toByteArray(fis);
-
- } catch (Exception e) {
- throw new ArgeoException("Stream error while opening file", e);
- } finally {
- IOUtils.closeQuietly(fis);
- }
- return ba;
- }
-
- public InputStream getInputStreamFromFileId(String fileId) {
- try {
- InputStream fis = null;
-
- Node child = getFileNodeFromId(fileId);
- fis = (InputStream) child.getProperty(Property.JCR_DATA)
- .getBinary().getStream();
- return fis;
- } catch (RepositoryException re) {
- throw new ArgeoException("Cannot get stream from file node for Id "
- + fileId, re);
- }
- }
-
- /**
- * Throws an exception if the node is not found in the current repository (a
- * bit like a FileNotFoundException)
- *
- * @param fileId
- * @return Returns the child node of the nt:file node. It is the child node
- * that have the jcr:data property where actual file is stored.
- * never null
- */
- private Node getFileNodeFromId(String fileId) {
- try {
- Node result = null;
-
- rootNodes: for (int j = 0; j < rootNodes.length; j++) {
- // in case we have a classic JCR Node
- if (rootNodes[j] instanceof Node) {
- Node curNode = (Node) rootNodes[j];
- result = curNode.getSession().getNodeByIdentifier(fileId);
- if (result != null)
- break rootNodes;
- } // Case of a repository Node
- else if (rootNodes[j] instanceof RepositoryNode) {
- Object[] nodes = ((RepositoryNode) rootNodes[j])
- .getChildren();
- for (int i = 0; i < nodes.length; i++) {
- Node node = (Node) nodes[i];
- result = node.getSession().getNodeByIdentifier(fileId);
- if (result != null)
- break rootNodes;
- }
- }
- }
-
- // Sanity checks
- if (result == null)
- throw new ArgeoException("File node not found for ID" + fileId);
-
- // Ensure that the node have the correct type.
- if (!result.isNodeType(NodeType.NT_FILE))
- throw new ArgeoException(
- "Cannot open file children Node that are not of '"
- + NodeType.NT_RESOURCE + "' type.");
-
- // Get the usefull part of the Node
- Node child = result.getNodes().nextNode();
- if (child == null || !child.isNodeType(NodeType.NT_RESOURCE))
- throw new ArgeoException(
- "ERROR: IN the current implemented model, '"
- + NodeType.NT_FILE
- + "' file node must have one and only one child of the nt:ressource, where actual data is stored");
- return child;
-
- } catch (RepositoryException re) {
- throw new ArgeoException("Erreur while getting file node of ID "
- + fileId, re);
- }
- }
-}
--- /dev/null
+package org.argeo.jcr.ui.explorer.utils;
+
+import java.util.Comparator;
+
+import org.argeo.eclipse.ui.TreeParent;
+
+public class TreeObjectsComparator implements Comparator<TreeParent> {
+ public int compare(TreeParent o1, TreeParent o2) {
+ return o1.getName().compareTo(o2.getName());
+ }
+}
\ No newline at end of file
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;
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;
/* DEPENDENCY INJECTION */
private JcrKeyring jcrKeyring;
}
+ public void setSortChildNodes(boolean sortChildNodes) {
+ this.sortChildNodes = sortChildNodes;
+ }
+
+ public boolean getSortChildNodes() {
+ return sortChildNodes;
+ }
+
/* DEPENDENCY INJECTION */
public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
this.repositoryRegister = repositoryRegister;