This is an automated email from the ASF dual-hosted git repository.
joerghoh pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git
The following commit(s) were added to refs/heads/master by this push:
new 278c4db SLING-10895 implement getPropertyMap() (#52)
278c4db is described below
commit 278c4dbfd8d44d7ff37e585e32a6613cbec239ed
Author: Jörg Hoh <[email protected]>
AuthorDate: Fri Nov 5 12:53:22 2021 +0100
SLING-10895 implement getPropertyMap() (#52)
* SLING-10895 implement getPropertyMap()
---
.../impl/ResourceResolverImpl.java | 28 ++++++++++++++++
.../impl/ResourceResolverImplTest.java | 39 ++++++++++++++++++++++
2 files changed, 67 insertions(+)
diff --git
a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
index 940ac1f..69d53e6 100644
---
a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
+++
b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
@@ -20,6 +20,8 @@ package org.apache.sling.resourceresolver.impl;
import static org.apache.commons.lang3.StringUtils.defaultString;
+import java.io.Closeable;
+import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
@@ -27,6 +29,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import java.util.StringTokenizer;
@@ -96,6 +99,8 @@ public class ResourceResolverImpl extends SlingAdaptable
implements ResourceReso
private final ResourceResolverContext context;
protected final Map<ResourceTypeInformation,Boolean>
resourceTypeLookupCache = new ConcurrentHashMap<>();
+
+ private Map<String,Object> propertyMap;
private volatile Exception closedResolverException;
@@ -180,9 +185,25 @@ public class ResourceResolverImpl extends SlingAdaptable
implements ResourceReso
if (factory.shouldLogResourceResolverClosing()) {
closedResolverException = new Exception("Stack Trace");
}
+ clearPropertyMap();
this.factory.unregister(this, this.control);
}
+ private void clearPropertyMap(){
+ if (propertyMap != null) {
+ for (Entry<String, Object> entry : propertyMap.entrySet()) {
+ if (entry.getValue() instanceof Closeable) {
+ try {
+ ((Closeable) entry.getValue()).close();
+ } catch (Exception e) {
+ logger.warn("ignoring exception while closing the
value for key [{}] ", entry.getKey(),e);
+ }
+ }
+ }
+ propertyMap.clear();
+ }
+ }
+
/**
* Check if the resource resolver is already closed or the factory which
created this resolver is no longer live.
*
@@ -1147,6 +1168,13 @@ public class ResourceResolverImpl extends SlingAdaptable
implements ResourceReso
}
return rsrc;
}
+
+ public Map<String,Object> getPropertyMap() {
+ if (propertyMap == null) {
+ propertyMap = new HashMap<>();
+ }
+ return propertyMap;
+ }
diff --git
a/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
b/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
index 3cba612..2d9bd75 100644
---
a/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
+++
b/src/test/java/org/apache/sling/resourceresolver/impl/ResourceResolverImplTest.java
@@ -30,7 +30,11 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
+import java.io.Closeable;
+import java.io.IOException;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -709,6 +713,41 @@ public class ResourceResolverImplTest {
// this should throw a SlingException when detecting the cyclic
hierarchy
resolver.isResourceType(resource, "/types/unknown");
}
+
+ @Test public void testGetPropertyMap() throws IOException {
+ // not having a map must not change the behavior
+ PathBasedResourceResolverImpl resolver =
getPathBasedResourceResolver();
+ resolver.close();
+
+ // use the propertyMap
+ resolver = getPathBasedResourceResolver();
+ Object value1 = new String("value1");
+ Closeable value2 = Mockito.spy(new Closeable() {
+ @Override
+ public void close() {
+ // do nothing
+ }
+ });
+ Closeable valueWithException = Mockito.spy(new Closeable() {
+ @Override
+ public void close() {
+ throw new RuntimeException ("RuntimeExceptions in close must
be handled");
+ }
+ });
+ assertNotNull(resolver.getPropertyMap());
+ resolver.getPropertyMap().put("key1", value1);
+ resolver.getPropertyMap().put("key2", value2);
+ resolver.getPropertyMap().put("key3", valueWithException);
+
+ resolver.close();
+ assertNotNull(resolver.getPropertyMap());
+ assertTrue(resolver.getPropertyMap().isEmpty());
+ Mockito.verify(value2,Mockito.times(1)).close();
+ Mockito.verify(valueWithException,Mockito.times(1)).close();
+
+ }
+
+
private PathBasedResourceResolverImpl getPathBasedResourceResolver() {
return getPathBasedResourceResolver(new String[] {""});