You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2009/08/12 09:03:32 UTC

svn commit: r803385 - in /sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event: EventUtil.java impl/EventHelper.java impl/JobEventHandler.java

Author: cziegeler
Date: Wed Aug 12 07:03:31 2009
New Revision: 803385

URL: http://svn.apache.org/viewvc?rev=803385&view=rev
Log:
SLING-1071 - Create hierarchy of child nodes to avoid too many child nodes.

Modified:
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/EventUtil.java
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/EventHelper.java
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/EventUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/EventUtil.java?rev=803385&r1=803384&r2=803385&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/EventUtil.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/EventUtil.java Wed Aug 12 07:03:31 2009
@@ -613,7 +613,7 @@
         if ( e == null ) {
             return "<null>";
         }
-        final StringBuffer buffer =new StringBuffer(e.getClass().getName());
+        final StringBuilder buffer = new StringBuilder(e.getClass().getName());
         buffer.append(" [topic=");
         buffer.append(e.getTopic());
         buffer.append(", properties=");

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/EventHelper.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/EventHelper.java?rev=803385&r1=803384&r2=803385&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/EventHelper.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/EventHelper.java Wed Aug 12 07:03:31 2009
@@ -18,6 +18,10 @@
  */
 package org.apache.sling.event.impl;
 
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
 
 /**
  * Helper class defining some constants and utility methods.
@@ -91,4 +95,47 @@
         return sb.toString();
     }
 
+    /**
+     * used for the md5
+     */
+    public static final char[] hexTable = "0123456789abcdef".toCharArray();
+
+    /**
+     * Calculate an MD5 hash of the string given using 'utf-8' encoding.
+     *
+     * @param data the data to encode
+     * @return a hex encoded string of the md5 digested input
+     */
+    public static String md5(String data) {
+        try {
+            return digest("MD5", data.getBytes("utf-8"));
+        } catch (NoSuchAlgorithmException e) {
+            throw new InternalError("MD5 digest not available???");
+        } catch (UnsupportedEncodingException e) {
+            throw new InternalError("UTF8 digest not available???");
+        }
+    }
+
+    /**
+     * Digest the plain string using the given algorithm.
+     *
+     * @param algorithm The alogrithm for the digest. This algorithm must be
+     *                  supported by the MessageDigest class.
+     * @param data      the data to digest with the given algorithm
+     * @return The digested plain text String represented as Hex digits.
+     * @throws java.security.NoSuchAlgorithmException if the desired algorithm is not supported by
+     *                                  the MessageDigest class.
+     */
+    private static String digest(String algorithm, byte[] data)
+    throws NoSuchAlgorithmException {
+        MessageDigest md = MessageDigest.getInstance(algorithm);
+        byte[] digest = md.digest(data);
+        StringBuffer res = new StringBuffer(digest.length * 2);
+        for (int i = 0; i < digest.length; i++) {
+            byte b = digest[i];
+            res.append(hexTable[(b >> 4) & 15]);
+            res.append(hexTable[b & 15]);
+        }
+        return res.toString();
+    }
 }

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java?rev=803385&r1=803384&r2=803385&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java Wed Aug 12 07:03:31 2009
@@ -225,7 +225,7 @@
         deleteBefore.add(Calendar.MINUTE, -this.cleanupPeriod);
         final String dateString = ISO8601.format(deleteBefore);
 
-        final StringBuffer buffer = new StringBuffer("/jcr:root");
+        final StringBuilder buffer = new StringBuilder("/jcr:root");
         buffer.append(this.repositoryPath);
         buffer.append("//element(*, ");
         buffer.append(getEventNodeType());
@@ -861,10 +861,32 @@
      * Create a unique node path (folder and name) for the job.
      */
     private String getNodePath(final String jobTopic, final String jobId) {
+        final StringBuilder sb = new StringBuilder(jobTopic.replace('/', '.'));
+        sb.append('/');
         if ( jobId != null ) {
-            return jobTopic.replace('/', '.') + "/" + EventHelper.filter(jobId);
+            // we create an md from the job id - we use the first 6 bytes to
+            // create sub directories
+            final String md5 = EventHelper.md5(jobId);
+            sb.append(md5.substring(0, 2));
+            sb.append('/');
+            sb.append(md5.substring(2, 4));
+            sb.append('/');
+            sb.append(md5.substring(4, 6));
+            sb.append('/');
+            sb.append(EventHelper.filter(jobId));
+        } else {
+            // create a path from the uuid - we use the first 6 bytes to
+            // create sub directories
+            final String uuid = UUID.randomUUID().toString();
+            sb.append(uuid.substring(0, 2));
+            sb.append('/');
+            sb.append(uuid.substring(2, 4));
+            sb.append('/');
+            sb.append(uuid.substring(5, 7));
+            sb.append("/Job_");
+            sb.append(uuid.substring(8, 17));
         }
-        return jobTopic.replace('/', '.') + "/Job " + UUID.randomUUID().toString();
+        return sb.toString();
     }
 
     /**
@@ -1046,7 +1068,7 @@
     private void loadJobs() {
         try {
             final QueryManager qManager = this.backgroundSession.getWorkspace().getQueryManager();
-            final StringBuffer buffer = new StringBuffer("/jcr:root");
+            final StringBuilder buffer = new StringBuilder("/jcr:root");
             buffer.append(this.repositoryPath);
             buffer.append("//element(*, ");
             buffer.append(this.getEventNodeType());
@@ -1312,7 +1334,7 @@
         try {
             s = this.createSession();
             final QueryManager qManager = s.getWorkspace().getQueryManager();
-            final StringBuffer buffer = new StringBuffer("/jcr:root");
+            final StringBuilder buffer = new StringBuilder("/jcr:root");
             buffer.append(this.repositoryPath);
             if ( topic != null ) {
                 buffer.append('/');