You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2022/07/07 17:00:59 UTC

svn commit: r1902536 - in /jackrabbit/branches/2.16: ./ jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java jackrabbit-spi2dav/src/test/java/org/apache/jackrabbit/spi2dav/IdURICacheTest.java

Author: reschke
Date: Thu Jul  7 17:00:59 2022
New Revision: 1902536

URL: http://svn.apache.org/viewvc?rev=1902536&view=rev
Log:
JCR-4749: IdURICache: improve diagnostics when workspaceUri does not match (merged r1895698 and r1895700 into 2.16)

Added:
    jackrabbit/branches/2.16/jackrabbit-spi2dav/src/test/java/org/apache/jackrabbit/spi2dav/IdURICacheTest.java
      - copied unchanged from r1895700, jackrabbit/trunk/jackrabbit-spi2dav/src/test/java/org/apache/jackrabbit/spi2dav/IdURICacheTest.java
Modified:
    jackrabbit/branches/2.16/   (props changed)
    jackrabbit/branches/2.16/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java

Propchange: jackrabbit/branches/2.16/
------------------------------------------------------------------------------
  Merged /jackrabbit/trunk:r1895698,1895700

Modified: jackrabbit/branches/2.16/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.16/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java?rev=1902536&r1=1902535&r2=1902536&view=diff
==============================================================================
--- jackrabbit/branches/2.16/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java (original)
+++ jackrabbit/branches/2.16/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java Thu Jul  7 17:00:59 2022
@@ -39,18 +39,8 @@ class IdURICache {
 
     IdURICache(String workspaceUri) {
         this.workspaceUri = workspaceUri;
-        idToUriCache = new LinkedHashMap<ItemId, String>(CACHESIZE, 1) {
-            @Override
-            protected boolean removeEldestEntry(Map.Entry<ItemId, String> eldest) {
-                return this.size() > CACHESIZE;
-            }
-        };
-        uriToIdCache = new LinkedHashMap<String, ItemId>(CACHESIZE, 1) {
-            @Override
-            protected boolean removeEldestEntry(Map.Entry<String, ItemId> eldest) {
-                return this.size() > CACHESIZE;
-            }
-        };
+        idToUriCache = new LRULinkedHashMap<>(CACHESIZE, 1);
+        uriToIdCache = new LRULinkedHashMap<>(CACHESIZE, 1);
     }
 
     public ItemId getItemId(String uri) {
@@ -70,10 +60,7 @@ class IdURICache {
     }
 
     public void add(String uri, ItemId itemId) {
-        if (!uri.startsWith(workspaceUri)) {
-            throw new IllegalArgumentException("Workspace mismatch: '" + uri + "' not under '" + workspaceUri + "'");
-        }
-        String cleanUri = getCleanUri(uri);
+        String cleanUri = checkedIsUnderWorkspace(getCleanUri(uri));
         uriToIdCache.put(cleanUri, itemId);
         idToUriCache.put(itemId, cleanUri);
         log.debug("Added: ItemId = " + itemId + " URI = " + cleanUri);
@@ -101,6 +88,27 @@ class IdURICache {
         uriToIdCache.clear();
     }
 
+    private String checkedIsUnderWorkspace(String uri) {
+        if (uri.startsWith(workspaceUri)) {
+            return uri;
+        } else {
+            int ml = Math.max(uri.length(), workspaceUri.length());
+            int match = 0;
+            for (int i = 0; i < ml; i++) {
+                if (uri.charAt(i) != workspaceUri.charAt(i)) {
+                    break;
+                }
+                match = i;
+            }
+            String diags = "";
+            if (uri.length() > match) {
+                String expected = (workspaceUri.length() > match) ? String.format(", expected: '%s'", workspaceUri.substring(match + 1)): ""; 
+                diags = String.format(" (position %d: '{%s}%s'%s)", match, uri.substring(0, match + 1), uri.substring(match + 1), expected);
+            }
+            throw new IllegalArgumentException("Workspace mismatch: '" + uri + "' not under workspace '" + workspaceUri + "'" + diags);
+        }
+    }
+
     private static String getCleanUri(String uri) {
         if (uri.endsWith("/")) {
             return uri.substring(0, uri.length() - 1);
@@ -108,4 +116,21 @@ class IdURICache {
             return uri;
         }
     }
+
+    private class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> {
+
+        private static final long serialVersionUID = 4463208266433931306L;
+
+        private int capacity;
+
+        LRULinkedHashMap(int capacity, float loadFactor) {
+            super(capacity, loadFactor);
+            this.capacity = capacity;
+        }
+
+        @Override
+        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
+            return this.size() > this.capacity;
+        }
+    }
 }