diff --git a/changes.xml b/changes.xml index 912d5cb..4c2bd26 100644 --- a/changes.xml +++ b/changes.xml @@ -27,6 +27,9 @@ Switch to AEM 6.5.17 as minimum version. + + Ignore child resources of parsys without assigned resource type (returning nt:unstructured as resource type). + diff --git a/src/main/java/io/wcm/wcm/parsys/controller/Parsys.java b/src/main/java/io/wcm/wcm/parsys/controller/Parsys.java index 107e67f..ac1dd81 100644 --- a/src/main/java/io/wcm/wcm/parsys/controller/Parsys.java +++ b/src/main/java/io/wcm/wcm/parsys/controller/Parsys.java @@ -27,6 +27,7 @@ import static io.wcm.wcm.parsys.ParsysNameConstants.PN_PARSYS_PARAGRAPH_VALIDATE; import static io.wcm.wcm.parsys.ParsysNameConstants.PN_PARSYS_WRAPPER_CSS; import static io.wcm.wcm.parsys.ParsysNameConstants.PN_PARSYS_WRAPPER_ELEMENT; +import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED; import java.util.ArrayList; import java.util.Arrays; @@ -157,6 +158,9 @@ private void activate() { parsysParentResource = currentResource; } for (Resource childResource : parsysParentResource.getChildren()) { + if (!acceptResource(childResource)) { + continue; + } Item item = createResourceItem(childResource); if (wcmMode != WCMMode.DISABLED || item.isValid()) { items.add(item); @@ -167,6 +171,11 @@ private void activate() { } } + private static boolean acceptResource(Resource resource) { + // skip resources without assigned resource type + return !StringUtils.equals(resource.getResourceType(), NT_UNSTRUCTURED); + } + private static boolean getDecoration(String[] paragraphNoDecorationWcmMode, WCMMode wcmMode) { if (paragraphNoDecorationWcmMode != null && paragraphNoDecorationWcmMode.length > 0) { for (String wcmModeItem : paragraphNoDecorationWcmMode) { @@ -364,6 +373,9 @@ public boolean isWrapperElement() { private Map getChildModels(@NotNull Class modelClass) { Map models = new LinkedHashMap<>(); for (Resource child : slingModelFilter.filterChildResources(currentResource.getChildren())) { + if (!acceptResource(child)) { + continue; + } T model = modelFactory.getModelFromWrappedRequest(request, child, modelClass); if (model != null) { models.put(child.getName(), model); diff --git a/src/test/java/io/wcm/wcm/parsys/controller/ParsysTest.java b/src/test/java/io/wcm/wcm/parsys/controller/ParsysTest.java index 2f26ed0..80afdd6 100644 --- a/src/test/java/io/wcm/wcm/parsys/controller/ParsysTest.java +++ b/src/test/java/io/wcm/wcm/parsys/controller/ParsysTest.java @@ -122,6 +122,9 @@ public Iterable answer(InvocationOnMock invocation) throws Throwable { par2Resource = context.create().resource(parsysResource.getPath() + "/par2", "sling:resourceType", COMPONENT_PATH_2, "valid", false); + // this should be always ignored as it does not contain a resource type + context.create().resource(parsysResource.getPath() + "/ignore1", + "valid", true); context.currentResource(parsysResource); } @@ -315,7 +318,8 @@ void testNewAreaResourceTypeFromSuperComponent() { void testOtherParentParsysResource() { context.create().resource("/apps/" + RESOURCE_TYPE_SAMPLE); parsysResource = context.create().resource(page.getContentResource().getPath() + "/parsysOther"); - par1Resource = context.create().resource(parsysResource.getPath() + "/par1"); + par1Resource = context.create().resource(parsysResource.getPath() + "/par1", + "sling:resourceType", RESOURCE_TYPE_SAMPLE); context.request().setAttribute(RA_PARSYS_PARENT_RESOURCE, parsysResource);