AEM Cloud Service - Filter Assets Navigation Collection to Remove Jobs Card | AEM Community Blog Seeding | Community
Skip to main content
kautuk_sahni
Community Manager
Community Manager
April 11, 2023

AEM Cloud Service - Filter Assets Navigation Collection to Remove Jobs Card | AEM Community Blog Seeding

  • April 11, 2023
  • 0 replies
  • 224 views

BlogImage.jpg

AEM Cloud Service - Filter Assets Navigation Collection to Remove Jobs Card by Sreekanth Choudry Nalabotu

Abstract

Goal
Adobe Experience Manager 2023.3.11332.20230305T153954Z-230100

ACLs might be the way to Hide Navigation Links in AEM Start. If you are looking for another way to handle it, the following fix might help. Here we filter out the Jobs card in Assets Nav Collection...


Solution
Create a servlet filter apps.experienceaem.platform.core.servlets.NavItemsDataSourceFilter to filter out the nav items. Here we remove the Jobs card /mnt/overlay/cq/core/content/nav/assets/asyncjobs in Assets Nav Collection

package apps.experienceaem.platform.core.servlets;

import com.adobe.granite.ui.components.ds.DataSource;
import com.adobe.granite.ui.components.ds.SimpleDataSource;
import org.apache.commons.collections4.iterators.TransformIterator;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceWrapper;
import com.adobe.granite.ui.components.Config;
import org.apache.sling.api.resource.ValueMap;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.collections4.Transformer;

import javax.servlet.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

@Component(
service = Filter.class,
immediate = true,
property = {
Constants.SERVICE_RANKING + ":Integer=-99",
"sling.filter.scope=COMPONENT",
"sling.filter.resourceTypes=granite/ui/components/shell/globalnav/datasources/navitems"
}
)
public class NavItemsDataSourceFilter implements Filter {
private final Logger logger = LoggerFactory.getLogger(getClass());

private static final String NAV_ASSETS_PATH = "/mnt/overlay/cq/core/content/nav/assets";

private static final List EXCLUDE_ITEMS = Arrays.asList(new String[]{"/mnt/overlay/cq/core/content/nav/assets/asyncjobs"});

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;

try {
if (!slingRequest.getPathInfo().endsWith(NAV_ASSETS_PATH)) {
chain.doFilter(slingRequest, slingResponse);
return;
}

Resource slingRequestResource = slingRequest.getResource();
Resource repConfigRes = slingRequestResource.getChild(Config.DATASOURCE);

if (repConfigRes == null) {
chain.doFilter(slingRequest, slingResponse);
return;
}

chain.doFilter(slingRequest, slingResponse);

ValueMap repConfigVM = repConfigRes.getValueMap();
final String itemRT = repConfigVM.get("itemResourceType", "");

SimpleDataSource ds = (SimpleDataSource) request.getAttribute(DataSource.class.getName());

if (ds == null) {
return;
}

final List dsList = new ArrayList();
Iterator items = ds.iterator();
Resource resource = null;

while (items.hasNext()) {
resource = (Resource) items.next();

if (EXCLUDE_ITEMS.contains(resource.getPath())) {
continue;
}

dsList.add(resource);
}

ds = new SimpleDataSource(new TransformIterator(dsList.iterator(), new Transformer<Resource, Resource>() {
public Resource transform(Resource r) {
return new ResourceWrapper(r) {
public String getResourceType() {
return r.getValueMap().get("itemResourceType", itemRT);
}

public Iterable getChildren() {
return new ArrayList();
}
};
}
}));

request.setAttribute(DataSource.class.getName(), ds);
} catch (Exception e) {
logger.error("Error working with nav items list", e);
}

}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void destroy() {
}

}

Read Full Blog

AEM Cloud Service - Filter Assets Navigation Collection to Remove Jobs Card

Q&A

Please use this thread to ask the related questions.

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.