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[] {""});

Reply via email to