package org.argeo.jcr;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.StringTokenizer;
import java.util.TreeMap;
+import javax.jcr.Binary;
import javax.jcr.NamespaceRegistry;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
+import javax.jcr.nodetype.NodeType;
import javax.jcr.query.Query;
import javax.jcr.query.QueryResult;
return dateAsPath(cal, false);
}
+ /**
+ * Creates a deep path based on a URL:
+ * http://subdomain.example.com/to/content?args =>
+ * com/example/subdomain/to/content
+ */
+ public static String urlAsPath(String url) {
+ try {
+ URL u = new URL(url);
+ StringBuffer path = new StringBuffer(url.length());
+ // invert host
+ String[] hostTokens = u.getHost().split("\\.");
+ for (int i = hostTokens.length - 1; i >= 0; i--)
+ path.append(hostTokens[i]).append('/');
+ // we don't put port since it may not always be there and may change
+ path.append(u.getPath());
+ return path.toString();
+ } catch (MalformedURLException e) {
+ throw new ArgeoException("Cannot generate URL path for " + url, e);
+ }
+ }
+
/**
* The provided data as a path ('/' at the end, not the beginning)
*
/** Creates the nodes making path, if they don't exist. */
public static Node mkdirs(Session session, String path) {
- return mkdirs(session, path, null, false);
+ return mkdirs(session, path, null, null, false);
}
- /** Creates the nodes making path, if they don't exist. */
+ /**
+ * @deprecated use {@link #mkdirs(Session, String, String, String, Boolean)}
+ * instead.
+ */
+ @Deprecated
public static Node mkdirs(Session session, String path, String type,
Boolean versioning) {
+ return mkdirs(session, path, type, type, false);
+ }
+
+ /**
+ * @param type
+ * the type of the leaf node
+ */
+ public static Node mkdirs(Session session, String path, String type) {
+ return mkdirs(session, path, type, null, false);
+ }
+
+ /** Creates the nodes making path, if they don't exist. */
+ public static Node mkdirs(Session session, String path, String type,
+ String intermediaryNodeType, Boolean versioning) {
try {
if (path.equals('/'))
return session.getRootNode();
String part = st.nextToken();
current.append(part).append('/');
if (!session.itemExists(current.toString())) {
- if (type != null)
+ if (!st.hasMoreTokens() && type != null)
currentNode = currentNode.addNode(part, type);
+ else if (st.hasMoreTokens() && intermediaryNodeType != null)
+ currentNode = currentNode.addNode(part,
+ intermediaryNodeType);
else
currentNode = currentNode.addNode(part);
if (versioning)
- currentNode.addMixin(ArgeoJcrConstants.MIX_VERSIONABLE);
+ currentNode.addMixin(NodeType.MIX_VERSIONABLE);
if (log.isTraceEnabled())
log.debug("Added folder " + part + " as " + current);
} else {
// First output the node path
log.debug(node.getPath());
// Skip the virtual (and large!) jcr:system subtree
- if (node.getName().equals(ArgeoJcrConstants.JCR_SYSTEM)) {
+ if (node.getName().equals("jcr:system")) {
return;
}
else
return baseRelPath + '/' + propertyName;
}
+
+ /**
+ * Normalize a name so taht it can be stores in contexts not supporting
+ * names with ':' (typically databases). Replaces ':' by '_'.
+ */
+ public static String normalize(String name) {
+ return name.replace(':', '_');
+ }
+
+ public static void closeQuietly(Binary binary) {
+ if (binary == null)
+ return;
+ binary.dispose();
+ }
}