Convert a Component into Experience Fragment with custom sling:resourceType | Community
Skip to main content
rsundaram
Level 2
February 9, 2022
Solved

Convert a Component into Experience Fragment with custom sling:resourceType

  • February 9, 2022
  • 1 reply
  • 1823 views

Hello Team,

 

When I convert a component into Experience fragment using 'convert to experience fragment variation', the experience fragment is getting created with 'sling:resourceType: cq/experience-fragments/editor/components/experiencefragment'.

 

But I want to replace the sling:resourceType with our custom Experience Fragment component path.

As checked, a servlet call has been posted to 'http://localhost:4502/libs/cq/experience-fragments/content/v2/conversion/converter'.

It calls a servlet 'ConvertToExperienceFragmentVariation' from 'com.adobe.cq.cq-experience-fragments' bundle.

But I could not extend the servlet as it is not part of the uber jar file. 

 

Can anyone guide me how to proceed with the requirement? Thanks in advance.

 

 

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by mayanks21529814
package com.demo.core.filters;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import static org.apache.sling.engine.EngineConstants.*;

import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.Resource;
import org.osgi.service.component.annotations.Component;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

@Component(service = Filter.class, name = "Custom Experience Fragment Path Update Filter", property = {
		SLING_FILTER_SCOPE + "=" + FILTER_SCOPE_REQUEST, Constants.SERVICE_RANKING + ":Integer=-100",
		SLING_FILTER_PATTERN + "=/libs/cq/experience-fragments/content/v2/conversion/converter" })

public class ExperienceFragmentFilter implements Filter {
	private static final Logger log = LoggerFactory.getLogger(ExperienceFragmentFilter.class.getName());

	// Called by the web container to indicate to a filter that it is being placed
	// into service.

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

	// Called by the web container to indicate to a filter that it is being taken
	// out of service.
	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		chain.doFilter(request, response);
		if (request instanceof SlingHttpServletRequest && response instanceof SlingHttpServletResponse) {

			// Do work before sending the request down the Filter AND Sling processing chain
			final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
			String componentPath = slingRequest.getParameter("componentPaths");
			log.info("Component path in filter is  ---->"+componentPath);
			Resource componentRes = slingRequest.getResourceResolver().resolve(componentPath);
			if(componentRes!=null)
			{
				ModifiableValueMap map = componentRes.adaptTo(ModifiableValueMap.class);
				log.info("current resource type --->"+map.get("sling:resourceType"));
				map.put("sling:resourceType", "<custom_component_path>");
				componentRes.getResourceResolver().commit();
				log.info("Successfully updated component path");
			}
			// The Request/Response have now been fully processed by Sling/AEM

		} else {
			// Else process the chain as usual.
			chain.doFilter(request, response);
			return;
		}

	}

}

 This can be achieved by implementing custom sling filter and updating sling:resourceType value. Above code does that, just update <custom_component_path> with your component path and this should work. I have tested this code on 6.5.10 version

1 reply

mayanks21529814Accepted solution
Level 2
February 9, 2022
package com.demo.core.filters;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import static org.apache.sling.engine.EngineConstants.*;

import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.Resource;
import org.osgi.service.component.annotations.Component;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

@Component(service = Filter.class, name = "Custom Experience Fragment Path Update Filter", property = {
		SLING_FILTER_SCOPE + "=" + FILTER_SCOPE_REQUEST, Constants.SERVICE_RANKING + ":Integer=-100",
		SLING_FILTER_PATTERN + "=/libs/cq/experience-fragments/content/v2/conversion/converter" })

public class ExperienceFragmentFilter implements Filter {
	private static final Logger log = LoggerFactory.getLogger(ExperienceFragmentFilter.class.getName());

	// Called by the web container to indicate to a filter that it is being placed
	// into service.

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

	// Called by the web container to indicate to a filter that it is being taken
	// out of service.
	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		chain.doFilter(request, response);
		if (request instanceof SlingHttpServletRequest && response instanceof SlingHttpServletResponse) {

			// Do work before sending the request down the Filter AND Sling processing chain
			final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
			String componentPath = slingRequest.getParameter("componentPaths");
			log.info("Component path in filter is  ---->"+componentPath);
			Resource componentRes = slingRequest.getResourceResolver().resolve(componentPath);
			if(componentRes!=null)
			{
				ModifiableValueMap map = componentRes.adaptTo(ModifiableValueMap.class);
				log.info("current resource type --->"+map.get("sling:resourceType"));
				map.put("sling:resourceType", "<custom_component_path>");
				componentRes.getResourceResolver().commit();
				log.info("Successfully updated component path");
			}
			// The Request/Response have now been fully processed by Sling/AEM

		} else {
			// Else process the chain as usual.
			chain.doFilter(request, response);
			return;
		}

	}

}

 This can be achieved by implementing custom sling filter and updating sling:resourceType value. Above code does that, just update <custom_component_path> with your component path and this should work. I have tested this code on 6.5.10 version

rsundaram
rsundaramAuthor
Level 2
February 10, 2022

Hi @mayanks21529814 - Thanks a lot. it works as expected.