package org.argeo.jcr;
+import java.util.Calendar;
import java.util.StringTokenizer;
+import javax.jcr.NamespaceRegistry;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryResult;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class JcrUtils {
private final static Log log = LogFactory.getLog(JcrUtils.class);
+ public static Node querySingleNode(Query query) {
+ NodeIterator nodeIterator;
+ try {
+ QueryResult queryResult = query.execute();
+ nodeIterator = queryResult.getNodes();
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot execute query " + query, e);
+ }
+ Node node;
+ if (nodeIterator.hasNext())
+ node = nodeIterator.nextNode();
+ else
+ return null;
+
+ if (nodeIterator.hasNext())
+ throw new ArgeoException("Query returned more than one node.");
+ return node;
+ }
+
+ public static String removeForbiddenCharacters(String str) {
+ return str.replace('[', '_').replace(']', '_').replace('/', '_')
+ .replace('*', '_');
+
+ }
+
public static String parentPath(String path) {
if (path.equals("/"))
throw new ArgeoException("Root path '/' has no parent path");
return pathT.substring(0, index);
}
+ public static String dateAsPath(Calendar cal) {
+ StringBuffer buf = new StringBuffer(14);
+ buf.append('Y').append(cal.get(Calendar.YEAR));// 5
+ buf.append('/');// 1
+ int month = cal.get(Calendar.MONTH) + 1;
+ buf.append('M');
+ if (month < 10)
+ buf.append(0);
+ buf.append(month);// 3
+ buf.append('/');// 1
+ int day = cal.get(Calendar.DAY_OF_MONTH);
+ if (day < 10)
+ buf.append(0);
+ buf.append('D').append(day);// 3
+ buf.append('/');// 1
+ return buf.toString();
+
+ }
+
+ public static String hostAsPath(String host) {
+ // TODO : inverse order of the elements (to have org/argeo/test IO
+ // test/argeo/org
+ return host.replace('.', '/');
+ }
+
public static String lastPathElement(String path) {
if (path.charAt(path.length() - 1) == '/')
throw new ArgeoException("Path " + path + " cannot end with '/'");
int index = path.lastIndexOf('/');
- if (index <= 0)
+ if (index < 0)
throw new ArgeoException("Cannot find last path element for "
+ path);
return path.substring(index + 1);
}
+ public static Node mkdirs(Session session, String path) {
+ return mkdirs(session, path, null, false);
+ }
+
public static Node mkdirs(Session session, String path, String type,
Boolean versioning) {
try {
}
}
+ public static void registerNamespaceSafely(Session session, String prefix,
+ String uri) {
+ try {
+ registerNamespaceSafely(session.getWorkspace()
+ .getNamespaceRegistry(), prefix, uri);
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot find namespace registry", e);
+ }
+ }
+
+ public static void registerNamespaceSafely(NamespaceRegistry nr,
+ String prefix, String uri) {
+ try {
+ String[] prefixes = nr.getPrefixes();
+ for (String pref : prefixes)
+ if (pref.equals(prefix)) {
+ String registeredUri = nr.getURI(pref);
+ if (!registeredUri.equals(uri))
+ throw new ArgeoException("Prefix " + pref
+ + " already registered for URI "
+ + registeredUri
+ + " which is different from provided URI "
+ + uri);
+ else
+ return;// skip
+ }
+ nr.registerNamespace(prefix, uri);
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot register namespace " + uri
+ + " under prefix " + prefix, e);
+ }
+ }
+
/** Recursively outputs the contents of the given node. */
public static void debug(Node node) throws RepositoryException {
// First output the node path
// Then output the properties
PropertyIterator properties = node.getProperties();
+ // log.debug("Property are : ");
+
while (properties.hasNext()) {
Property property = properties.nextProperty();
if (property.getDefinition().isMultiple()) {