SLING-11969 a few minor improvements to make the limits more explicit (#10)
diff --git a/src/main/java/org/apache/sling/models/jacksonexporter/impl/ConfigurableSerializationModuleProvider.java b/src/main/java/org/apache/sling/models/jacksonexporter/impl/ConfigurableSerializationModuleProvider.java
index d9cf2b9..afd4b40 100644
--- a/src/main/java/org/apache/sling/models/jacksonexporter/impl/ConfigurableSerializationModuleProvider.java
+++ b/src/main/java/org/apache/sling/models/jacksonexporter/impl/ConfigurableSerializationModuleProvider.java
@@ -26,6 +26,8 @@
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.Designate;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.module.SimpleModule;
@@ -39,36 +41,48 @@
static @interface Config {
@AttributeDefinition(name ="disable serialization",
- description = "provide a list of the full classnames which should not get serialized")
+ description = "provide a list of the full classnames which should not get serialized; currently only \"" + RESOURCERESOLVER + "\" is supported")
String[] disable_serialization() default {};
@AttributeDefinition(name ="warn on serialization",
- description = "provide a list of the full classnames for which a warning should be written when serialized")
+ description = "provide a list of the full classnames for which a warning should be written when serialized; currently only \"" + RESOURCERESOLVER + "\" is supported")
String[] enable_warn_logging() default {ConfigurableSerializationModuleProvider.RESOURCERESOLVER};
}
+ private static final Logger LOG = LoggerFactory.getLogger(ConfigurableSerializationModuleProvider.class);
protected static final String RESOURCERESOLVER = "org.apache.sling.api.resource.ResourceResolver";
+ boolean ignoringRR = false;
SimpleModule moduleInstance;
-
-
-
@Activate
private void activate(Config config) {
this.moduleInstance = new SimpleModule();
-
- // Currently only the Sling ResourceResolver is supported to be disabled, other classes tbd.
+
List<String> disabled = Arrays.asList(config.disable_serialization());
List<String> logging = Arrays.asList(config.enable_warn_logging());
- if (disabled.contains(RESOURCERESOLVER)) {
- moduleInstance.setMixInAnnotation(ResourceResolver.class, IgnoringResourceResolverMixin.class);
- } else if (logging.contains(RESOURCERESOLVER)) {
- moduleInstance.setMixInAnnotation(ResourceResolver.class, WarningResourceResolverMixin.class);
+ // Currently only the Sling ResourceResolver is supported
+ for (String type: disabled) {
+ if (RESOURCERESOLVER.equals(type)) {
+ moduleInstance.setMixInAnnotation(ResourceResolver.class, IgnoringResourceResolverMixin.class);
+ ignoringRR = true;
+ } else {
+ LOG.warn("Support to disable the serialization of type {} is not implemented", type);
+ }
+ }
+
+ for (String type: logging) {
+ if (RESOURCERESOLVER.equals(type)) {
+ if (!ignoringRR) {
+ moduleInstance.setMixInAnnotation(ResourceResolver.class, WarningResourceResolverMixin.class);
+ }
+ } else {
+ LOG.warn("Support to log any serialization of type {} is not implemented", type);
+ }
}
}
diff --git a/src/test/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporterLimitSerializationTest.java b/src/test/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporterLimitSerializationTest.java
index 016ccc9..3e9b944 100644
--- a/src/test/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporterLimitSerializationTest.java
+++ b/src/test/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporterLimitSerializationTest.java
@@ -18,9 +18,11 @@
*/
package org.apache.sling.models.jacksonexporter.impl;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -30,6 +32,7 @@
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.models.factory.ExportException;
import org.apache.sling.models.jacksonexporter.impl.example.PojoWithResourceResolver;
import org.apache.sling.models.jacksonexporter.impl.util.LogCapture;
import org.apache.sling.testing.mock.osgi.junit5.OsgiContext;
@@ -71,17 +74,40 @@
@Test
void testNotSerializingResourceResolverWhenDisabled() throws Exception {
+ LogCapture capture = new LogCapture(ConfigurableSerializationModuleProvider.class.getName(),false);
+
PojoWithResourceResolver pojo = new PojoWithResourceResolver("text",new EmptyResourceResolver());
Map<String,Object> config = Collections.singletonMap("disable.serialization", ResourceResolver.class.getName());
context.registerInjectActivateService(new ConfigurableSerializationModuleProvider(),config);
JacksonExporter underTest = context.registerInjectActivateService(JacksonExporter.class);
Map<String,String> options = Collections.emptyMap();
+
+ String expectedJson = "{\"msg\":\"text\"}";
+ assertEquals(expectedJson, underTest.export(pojo, String.class, options));
+ // no log is written in this case
+ assertEquals(0,capture.list.size());
+ }
+
+
+ @Test
+ void test_givenInvalidTypes_whenActivate_thenWarnLogStatements() throws ExportException {
+ LogCapture capture = new LogCapture(ConfigurableSerializationModuleProvider.class.getName(),false);
- String json = underTest.export(pojo, String.class, options);
- ObjectMapper mapper = new ObjectMapper();
- JsonNode result = mapper.readTree(json);
- assertTrue(result.path("resolver").isMissingNode());
+ Map<String,Object> config = new HashMap<>();
+ config.put("disable.serialization", "foo.bar.disable");
+ config.put("enable.warn.logging", "foo.bar.logging");
+
+ context.registerInjectActivateService(new ConfigurableSerializationModuleProvider(),config);
+
+ assertTrue(capture.anyMatch(event -> {
+ return event.getFormattedMessage().equals("Support to disable the serialization of type foo.bar.disable is not implemented") &&
+ event.getLevel().equals(Level.WARN);
+ }));
+ assertTrue(capture.anyMatch(event -> {
+ return event.getFormattedMessage().equals("Support to log any serialization of type foo.bar.logging is not implemented") &&
+ event.getLevel().equals(Level.WARN);
+ }));
}
@@ -90,181 +116,147 @@
* when trying to export it with Jackson.
*/
public class EmptyResourceResolver implements ResourceResolver {
-
-// public static final String SERIALIZED_STRING = "\"resolver\":{\"live\":false,\"userID\":null,\"searchPath\":null,\"propertyMap\":null,\"userID\":false}";
-
@Override
public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
- // TODO Auto-generated method stub
return null;
}
@Override
public Resource resolve(HttpServletRequest request, String absPath) {
- // TODO Auto-generated method stub
return null;
}
@Override
public Resource resolve(String absPath) {
- // TODO Auto-generated method stub
return null;
}
@Override
public Resource resolve(HttpServletRequest request) {
- // TODO Auto-generated method stub
return null;
}
@Override
public String map(String resourcePath) {
- // TODO Auto-generated method stub
return null;
}
@Override
public String map(HttpServletRequest request, String resourcePath) {
- // TODO Auto-generated method stub
return null;
}
@Override
public Resource getResource(String path) {
- // TODO Auto-generated method stub
return null;
}
@Override
public Resource getResource(Resource base, String path) {
- // TODO Auto-generated method stub
return null;
}
@Override
public String[] getSearchPath() {
- // TODO Auto-generated method stub
return null;
}
@Override
public Iterator<Resource> listChildren(Resource parent) {
- // TODO Auto-generated method stub
return null;
}
@Override
public Iterable<Resource> getChildren(Resource parent) {
- // TODO Auto-generated method stub
return null;
}
@Override
public Iterator<Resource> findResources(String query, String language) {
- // TODO Auto-generated method stub
return null;
}
@Override
public Iterator<Map<String, Object>> queryResources(String query, String language) {
- // TODO Auto-generated method stub
return null;
}
@Override
public ResourceResolver clone(Map<String, Object> authenticationInfo) throws LoginException {
- // TODO Auto-generated method stub
return null;
}
@Override
public boolean isLive() {
- // TODO Auto-generated method stub
return false;
}
@Override
public void close() {
- // TODO Auto-generated method stub
-
+ // do nothing
}
@Override
public String getUserID() {
- // TODO Auto-generated method stub
return null;
}
@Override
public Iterator<String> getAttributeNames() {
- // TODO Auto-generated method stub
return null;
}
@Override
public Object getAttribute(String name) {
- // TODO Auto-generated method stub
return null;
}
@Override
public void delete(Resource resource) throws PersistenceException {
- // TODO Auto-generated method stub
-
+ // do nothing
}
@Override
public Resource create(Resource parent, String name, Map<String, Object> properties)
throws PersistenceException {
- // TODO Auto-generated method stub
return null;
}
@Override
public void revert() {
- // TODO Auto-generated method stub
-
+ // do nothing
}
@Override
public void commit() throws PersistenceException {
- // TODO Auto-generated method stub
-
+ // do nothing
}
@Override
public boolean hasChanges() {
- // TODO Auto-generated method stub
return false;
}
@Override
public String getParentResourceType(Resource resource) {
- // TODO Auto-generated method stub
return null;
}
@Override
public String getParentResourceType(String resourceType) {
- // TODO Auto-generated method stub
return null;
}
@Override
public boolean isResourceType(Resource resource, String resourceType) {
- // TODO Auto-generated method stub
return false;
}
@Override
public void refresh() {
- // TODO Auto-generated method stub
-
+ // do nothing
}
-
}
-
-
}