Hi All,
anyone know how to get the source code of XF
below i tried but its giving an null pointer error .
private String getExperienceFragmentHtml(SlingHttpServletRequest request) throws ServletException, IOException {
ResourceResolver resourceResolver = request.getResourceResolver();
Resource xfResource = request.getResource();
String xfPath = xfResource.getPath();
Page xfPage = resourceResolver.getResource(xfPath).adaptTo(Page.class);
String html = "";
if (xfPage != null) {
try {
// Create a StringWriter to capture the HTML source code
StringWriter writer = new StringWriter();
// Create a PrintWriter with the StringWriter
PrintWriter printWriter = new PrintWriter(writer);
// Create a new HtmlLibraryManager instance
HtmlLibraryManager htmlLibraryManager = resourceResolver.adaptTo(HtmlLibraryManager.class);
HtmlLibrary xfHtmlLibrary = htmlLibraryManager.getLibrary(xfPage, request);
xfHtmlLibrary.include(request, printWriter, true);
// Get the HTML source code from the StringWriter
html = writer.toString();
} catch (Exception e) {
// Handle any exceptions
e.printStackTrace();
}
}
LOG.info("HTML" + html);
return html;
}
Solved! Go to Solution.
Views
Replies
Total Likes
Hi @test566 ,
You can use service user to get the session so that resource can able access path, we had the same issue.
Thank,
Sanjay
Views
Replies
Total Likes
@test566 You can try like below
public class AemResourceResolutionServlet extends SlingSafeMethodsServlet {
/** Service to create HTTP Servlet requests and responses */
@Reference
private RequestResponseFactory requestResponseFactory;
/** Service to process requests through Sling */
@Reference
private SlingRequestProcessor requestProcessor;
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
/* The resource path to resolve. Use any selectors or extension. */
String requestPath = "<XF path>";
/* Setup request */
HttpServletRequest req = requestResponseFactory.createRequest("GET", requestPath);
WCMMode.DISABLED.toRequest(req);
/* Setup response */
ByteArrayOutputStream out = new ByteArrayOutputStream();
HttpServletResponse resp = requestResponseFactory.createResponse(out);
/* Process request through Sling */
requestProcessor.processRequest(req, resp, request.getResourceResolver());
String html = out.toString();
}
}
Hi @Saravanan_Dharmaraj ,
Thanks for your input.
I tried but it is not working gives below WARN and nothing in the response
org.apache.sling.engine.impl.request.RequestData SlingRequestProgressTracker not found in request attributes
code snippet
import com.day.cq.contentsync.handler.util.RequestResponseFactory;
import com.day.cq.wcm.api.NameConstants;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.WCMMode;
import org.apache.commons.io.output.ByteArrayOutputStream;
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.ResourceResolver;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.apache.sling.engine.SlingRequestProcessor;
import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.propertytypes.ServiceDescription;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
@Component(service = {Servlet.class}, name = "MFE Servlet", immediate = true)
@SlingServletResourceTypes(
resourceTypes = "poc/components/structure/xfpage",
methods = {HttpConstants.METHOD_GET},
extensions = "js",
selectors = "public.mfe")
public class MFEServlet extends SlingAllMethodsServlet {
private static final Logger LOG = LoggerFactory.getLogger(MFEServlet.class);
@Reference
private RequestResponseFactory requestResponseFactory;
@Reference
private SlingRequestProcessor requestProcessor;
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
// Get the HTML source code of the Experience Fragment
String html = getExperienceFragmentHtml(request);
LOG.info("HTML in do get method" + html);
// Set the response content type to JavaScript
response.setContentType("application/javascript");
// Write the HTML source code to the response output stream
PrintWriter out = response.getWriter();
out.write(html);
out.flush();
out.close();
}
private String getExperienceFragmentHtml(SlingHttpServletRequest request) throws ServletException, IOException {
ResourceResolver resourceResolver = request.getResourceResolver();
Resource xfResource = request.getResource();
String xfPath = xfResource.getPath();
Page xfPage = resourceResolver.getResource(xfPath).adaptTo(Page.class);
String html = "";
HttpServletRequest req = requestResponseFactory.createRequest("GET", xfPath);
WCMMode.DISABLED.toRequest(req);
/* Setup response */
ByteArrayOutputStream out = new ByteArrayOutputStream();
HttpServletResponse resp = requestResponseFactory.createResponse(out);
/* Process request through Sling */
requestProcessor.processRequest(req, resp, request.getResourceResolver());
html = out.toString();
LOG.info("HTML" + html);
return html;
}
}
Hi @test566 ,
You can use service user to get the session so that resource can able access path, we had the same issue.
Thank,
Sanjay
Views
Replies
Total Likes