]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java
Fix path generation based on date
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jcr / src / main / java / org / argeo / jcr / JcrUtils.java
index f530f170b7fe4a0637d2eb72b75b4470dba07199..c7915d0ed57bb89ed132419247c3eebc18037ff7 100644 (file)
@@ -60,6 +60,17 @@ import org.argeo.ArgeoException;
 public class JcrUtils implements ArgeoJcrConstants {
        private final static Log log = LogFactory.getLog(JcrUtils.class);
 
+       /**
+        * Not complete yet. See
+        * http://www.day.com/specs/jcr/2.0/3_Repository_Model.html#3.2.2%20Local
+        * %20Names
+        */
+       public final static char[] INVALID_NAME_CHARACTERS = { '/', ':', '[', ']',
+                       '|', '*', /*
+                                        * invalid XML chars :
+                                        */
+                       '<', '>', '&' };
+
        /** Prevents instantiation */
        private JcrUtils() {
        }
@@ -90,13 +101,6 @@ public class JcrUtils implements ArgeoJcrConstants {
                return node;
        }
 
-       /** Removes forbidden characters from a path, replacing them with '_' */
-       public static String removeForbiddenCharacters(String str) {
-               return str.replace('[', '_').replace(']', '_').replace('/', '_')
-                               .replace('*', '_');
-
-       }
-
        /** Retrieves the parent path of the provided path */
        public static String parentPath(String path) {
                if (path.equals("/"))
@@ -160,25 +164,31 @@ public class JcrUtils implements ArgeoJcrConstants {
         */
        public static String dateAsPath(Calendar cal, Boolean addHour) {
                StringBuffer buf = new StringBuffer(14);
-               buf.append('Y').append(cal.get(Calendar.YEAR));// 5
-               buf.append('/');// 1
+               buf.append('Y');
+               buf.append(cal.get(Calendar.YEAR));
+               buf.append('/');
+               
                int month = cal.get(Calendar.MONTH) + 1;
                buf.append('M');
                if (month < 10)
                        buf.append(0);
-               buf.append(month);// 3
-               buf.append('/');// 1
+               buf.append(month);
+               buf.append('/');
+
                int day = cal.get(Calendar.DAY_OF_MONTH);
+               buf.append('D');
                if (day < 10)
                        buf.append(0);
-               buf.append('D').append(day);// 3
-               buf.append('/');// 1
+               buf.append(day);
+               buf.append('/');
+
                if (addHour) {
                        int hour = cal.get(Calendar.HOUR_OF_DAY);
+                       buf.append('H');
                        if (hour < 10)
                                buf.append(0);
-                       buf.append('H').append(hour);// 3
-                       buf.append('/');// 1
+                       buf.append(hour);
+                       buf.append('/');
                }
                return buf.toString();
 
@@ -327,6 +337,11 @@ public class JcrUtils implements ArgeoJcrConstants {
 
        /** Recursively outputs the contents of the given node. */
        public static void debug(Node node) {
+               debug(node, log);
+       }
+
+       /** Recursively outputs the contents of the given node. */
+       public static void debug(Node node, Log log) {
                try {
                        // First output the node path
                        log.debug(node.getPath());
@@ -583,13 +598,60 @@ public class JcrUtils implements ArgeoJcrConstants {
        }
 
        /**
-        * Normalize a name so taht it can be stores in contexts not supporting
+        * Normalizes a name so that it can be stored in contexts not supporting
         * names with ':' (typically databases). Replaces ':' by '_'.
         */
        public static String normalize(String name) {
                return name.replace(':', '_');
        }
 
+       /**
+        * Replaces characters which are invalid in a JCR name by '_'. Currently not
+        * exhaustive.
+        * 
+        * @see JcrUtils#INVALID_NAME_CHARACTERS
+        */
+       public static String replaceInvalidChars(String name) {
+               return replaceInvalidChars(name, '_');
+       }
+
+       /**
+        * Replaces characters which are invalid in a JCR name. Currently not
+        * exhaustive.
+        * 
+        * @see JcrUtils#INVALID_NAME_CHARACTERS
+        */
+       public static String replaceInvalidChars(String name, char replacement) {
+               boolean modified = false;
+               char[] arr = name.toCharArray();
+               for (int i = 0; i < arr.length; i++) {
+                       char c = arr[i];
+                       invalid: for (char invalid : INVALID_NAME_CHARACTERS) {
+                               if (c == invalid) {
+                                       arr[i] = replacement;
+                                       modified = true;
+                                       break invalid;
+                               }
+                       }
+               }
+               if (modified)
+                       return new String(arr);
+               else
+                       // do not create new object if unnecessary
+                       return name;
+       }
+
+       /**
+        * Removes forbidden characters from a path, replacing them with '_'
+        * 
+        * @deprecated use {@link #replaceInvalidChars(String)} instead
+        */
+       public static String removeForbiddenCharacters(String str) {
+               return str.replace('[', '_').replace(']', '_').replace('/', '_')
+                               .replace('*', '_');
+
+       }
+
        /** Cleanly disposes a {@link Binary} even if it is null. */
        public static void closeQuietly(Binary binary) {
                if (binary == null)