]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/JcrFileProvider.java
Introduce Tabular Content
[lgpl/argeo-commons.git] / server / plugins / org.argeo.jcr.ui.explorer / src / main / java / org / argeo / jcr / ui / explorer / utils / JcrFileProvider.java
1 package org.argeo.jcr.ui.explorer.utils;
2
3 import java.io.InputStream;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.Map;
7
8 import javax.jcr.Node;
9 import javax.jcr.Property;
10 import javax.jcr.Repository;
11 import javax.jcr.RepositoryException;
12 import javax.jcr.nodetype.NodeType;
13
14 import org.apache.commons.io.IOUtils;
15 import org.argeo.ArgeoException;
16 import org.argeo.eclipse.ui.specific.FileProvider;
17 import org.argeo.jcr.RepositoryRegister;
18 import org.argeo.jcr.ui.explorer.browser.RepositoryNode;
19
20 /**
21 * Implements a FileProvider for UI purposes. Note that it might not be very
22 * reliable as long as we have not fixed login & multi repository issues that
23 * will be addressed in the next version.
24 *
25 * NOTE: id used here is the real id of the JCR Node, not the JCR Path
26 *
27 * Relies on common approach for JCR file handling implementation.
28 *
29 */
30
31 public class JcrFileProvider implements FileProvider {
32
33 private Object[] rootNodes;
34
35 /**
36 * Must be set in order for the provider to be able to search the repository
37 * Provided object might be either JCR Nodes or UI RepositoryNode for the
38 * time being.
39 *
40 * @param repositoryNode
41 */
42 public void setRootNodes(Object[] rootNodes) {
43 List<Object> tmpNodes = new ArrayList<Object>();
44 for (int i = 0; i < rootNodes.length; i++) {
45 Object obj = rootNodes[i];
46 if (obj instanceof Node) {
47 tmpNodes.add(obj);
48 } else if (obj instanceof RepositoryRegister) {
49 RepositoryRegister repositoryRegister = (RepositoryRegister) obj;
50 Map<String, Repository> repositories = repositoryRegister
51 .getRepositories();
52 for (String name : repositories.keySet()) {
53 tmpNodes.add(new RepositoryNode(name, repositories
54 .get(name)));
55 }
56
57 }
58 }
59 this.rootNodes = tmpNodes.toArray();
60 }
61
62 public byte[] getByteArrayFileFromId(String fileId) {
63 InputStream fis = null;
64 byte[] ba = null;
65 Node child = getFileNodeFromId(fileId);
66 try {
67 fis = (InputStream) child.getProperty(Property.JCR_DATA)
68 .getBinary().getStream();
69 ba = IOUtils.toByteArray(fis);
70
71 } catch (Exception e) {
72 throw new ArgeoException("Stream error while opening file", e);
73 } finally {
74 IOUtils.closeQuietly(fis);
75 }
76 return ba;
77 }
78
79 public InputStream getInputStreamFromFileId(String fileId) {
80 try {
81 InputStream fis = null;
82
83 Node child = getFileNodeFromId(fileId);
84 fis = (InputStream) child.getProperty(Property.JCR_DATA)
85 .getBinary().getStream();
86 return fis;
87 } catch (RepositoryException re) {
88 throw new ArgeoException("Cannot get stream from file node for Id "
89 + fileId, re);
90 }
91 }
92
93 /**
94 * Throws an exception if the node is not found in the current repository (a
95 * bit like a FileNotFoundException)
96 *
97 * @param fileId
98 * @return Returns the child node of the nt:file node. It is the child node
99 * that have the jcr:data property where actual file is stored.
100 * never null
101 */
102 private Node getFileNodeFromId(String fileId) {
103 try {
104 Node result = null;
105
106 rootNodes: for (int j = 0; j < rootNodes.length; j++) {
107 // in case we have a classic JCR Node
108 if (rootNodes[j] instanceof Node) {
109 Node curNode = (Node) rootNodes[j];
110 result = curNode.getSession().getNodeByIdentifier(fileId);
111 if (result != null)
112 break rootNodes;
113 } // Case of a repository Node
114 else if (rootNodes[j] instanceof RepositoryNode) {
115 Object[] nodes = ((RepositoryNode) rootNodes[j])
116 .getChildren();
117 for (int i = 0; i < nodes.length; i++) {
118 Node node = (Node) nodes[i];
119 result = node.getSession().getNodeByIdentifier(fileId);
120 if (result != null)
121 break rootNodes;
122 }
123 }
124 }
125
126 // Sanity checks
127 if (result == null)
128 throw new ArgeoException("File node not found for ID" + fileId);
129
130 // Ensure that the node have the correct type.
131 if (!result.isNodeType(NodeType.NT_FILE))
132 throw new ArgeoException(
133 "Cannot open file children Node that are not of '"
134 + NodeType.NT_RESOURCE + "' type.");
135
136 // Get the usefull part of the Node
137 Node child = result.getNodes().nextNode();
138 if (child == null || !child.isNodeType(NodeType.NT_RESOURCE))
139 throw new ArgeoException(
140 "ERROR: IN the current implemented model, '"
141 + NodeType.NT_FILE
142 + "' file node must have one and only one child of the nt:ressource, where actual data is stored");
143 return child;
144
145 } catch (RepositoryException re) {
146 throw new ArgeoException("Erreur while getting file node of ID "
147 + fileId, re);
148 }
149 }
150 }