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;
+ }
+ }
}