package org.argeo.server.jcr;
+import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
-import java.util.StringTokenizer;
+import javax.activation.MimetypesFileTypeMap;
import javax.jcr.Node;
import javax.jcr.Property;
-import javax.jcr.PropertyIterator;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
-import javax.jcr.Value;
import javax.jcr.version.Version;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionIterator;
+import org.apache.commons.io.FilenameUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.argeo.ArgeoException;
+import org.argeo.jcr.JcrUtils;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.Resource;
// private String restoreBase = "/.restore";
public void mkdirs(String path) {
+ JcrUtils.mkdirs(session(), path, "nt:folder", versioning);
+ }
+
+ public void create(String path, Resource file, String mimeType) {
try {
- StringTokenizer st = new StringTokenizer(path, "/");
- StringBuffer current = new StringBuffer("/");
- Node currentNode = session().getRootNode();
- while (st.hasMoreTokens()) {
- String part = st.nextToken();
- current.append(part).append('/');
- if (!session().itemExists(current.toString())) {
- currentNode = currentNode.addNode(part, "nt:folder");
- if (versioning)
- currentNode.addMixin("mix:versionable");
- if (log.isTraceEnabled())
- log.debug("Added folder " + part + " as " + current);
- } else {
- currentNode = (Node) session().getItem(current.toString());
- }
- }
- session().save();
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot mkdirs " + path, e);
+ create(path, file.getInputStream(), mimeType);
+ } catch (IOException e) {
+ throw new ArgeoException("Cannot read " + file, e);
}
}
- public void create(String path, Resource file, String mimeType) {
+ public void create(String path, InputStream in, String mimeType) {
try {
- if (session().itemExists(path))
+ if (session().itemExists(path)) {
throw new ArgeoException("Node " + path + " already exists.");
+ }
int index = path.lastIndexOf('/');
String parentPath = path.substring(0, index);
+ if (parentPath.equals(""))
+ parentPath = "/";
String fileName = path.substring(index + 1);
if (!session().itemExists(parentPath))
throw new ArgeoException("Parent folder of node " + path
Node fileNode = folderNode.addNode(fileName, "nt:file");
Node contentNode = fileNode.addNode("jcr:content", "nt:resource");
- contentNode.setProperty("jcr:mimeType", mimeType);
+ if (mimeType != null)
+ contentNode.setProperty("jcr:mimeType", mimeType);
contentNode.setProperty("jcr:encoding", defaultEncoding);
- contentNode.setProperty("jcr:data", file.getInputStream());
+ contentNode.setProperty("jcr:data", in);
Calendar lastModified = Calendar.getInstance();
- lastModified.setTimeInMillis(file.lastModified());
+ // lastModified.setTimeInMillis(file.lastModified());
contentNode.setProperty("jcr:lastModified", lastModified);
// resNode.addMixin("mix:referenceable");
fileNode.checkin();
if (log.isDebugEnabled())
- log.debug("Created " + path + " from " + file);
+ log.debug("Created " + path);
} catch (Exception e) {
- throw new ArgeoException("Cannot create node from resource " + file
- + " under " + path, e);
+ throw new ArgeoException("Cannot create node for " + path, e);
}
}
public void update(String path, Resource file) {
try {
+ update(path, file.getInputStream());
+ } catch (IOException e) {
+ throw new ArgeoException("Cannot read " + file, e);
+ }
+ }
+
+ public void update(String path, InputStream in) {
+ try {
+
+ if (!session().itemExists(path)) {
+ String type = new MimetypesFileTypeMap()
+ .getContentType(FilenameUtils.getName(path));
+ create(path, in, type);
+ return;
+ }
+
Node fileNode = (Node) session().getItem(path);
Node contentNode = fileNode.getNode("jcr:content");
fileNode.checkout();
- contentNode.setProperty("jcr:data", file.getInputStream());
+ contentNode.setProperty("jcr:data", in);
Calendar lastModified = Calendar.getInstance();
- lastModified.setTimeInMillis(file.lastModified());
+ // lastModified.setTimeInMillis(file.lastModified());
contentNode.setProperty("jcr:lastModified", lastModified);
session().save();
fileNode.checkin();
if (log.isDebugEnabled())
- log.debug("Updated " + path + " from " + file);
+ log.debug("Updated " + path);
} catch (Exception e) {
- throw new ArgeoException("Cannot update node " + path
- + " from resource" + file, e);
+ throw new ArgeoException("Cannot update node " + path, e);
}
}
try {
Node fileNode = (Node) session().getItem(path);
-
- // if (revision == 0) {
- // InputStream in = fromVersion(fileNode.getBaseVersion());
- // if (log.isDebugEnabled())
- // log.debug("Retrieved " + path + " at base revision ");
- // return in;
- // }
-
VersionHistory history = fileNode.getVersionHistory();
int count = 0;
Version version = null;
return in;
}
- // protected InputStream restoreOrGetRevision(Node fileNode, Version
- // version,
- // Integer revision) throws RepositoryException {
- // Node parentFolder = (Node) fileNode
- // .getAncestor(fileNode.getDepth() - 1);
- // String restoreFolderPath = restoreBase + parentFolder.getPath();
- // mkdirs(restoreFolderPath);
- // String subNodeName = fileNode.getName() + "__" + fill(revision);
- // Node restoreFolder = (Node) session().getItem(restoreFolderPath);
- // if (!restoreFolder.hasNode(subNodeName)) {
- // parentFolder.restore(version, subNodeName, true);
- // }
- // return parentFolder.getNode(subNodeName + "/jcr:content").getProperty(
- // "jcr:data").getStream();
- // }
-
protected Session session() {
return session;
}
this.defaultEncoding = defaultEncoding;
}
- /** Recursively outputs the contents of the given node. */
- public static void debug(Node node) throws RepositoryException {
- // First output the node path
- log.debug(node.getPath());
- // Skip the virtual (and large!) jcr:system subtree
- if (node.getName().equals("jcr:system")) {
- return;
- }
-
- // Then output the properties
- PropertyIterator properties = node.getProperties();
- while (properties.hasNext()) {
- Property property = properties.nextProperty();
- if (property.getDefinition().isMultiple()) {
- // A multi-valued property, print all values
- Value[] values = property.getValues();
- for (int i = 0; i < values.length; i++) {
- log.debug(property.getPath() + " = "
- + values[i].getString());
- }
- } else {
- // A single-valued property
- log.debug(property.getPath() + " = " + property.getString());
- }
- }
-
- }
-
protected String fill(Integer number) {
int size = 4;
String str = number.toString();