@Component(
immediate = true,
service = Servlet.class,
property = {
"service.description=Simple Servlet",
"service.vendor=Site.com",
SLING_SERVLET_RESOURCE_TYPES + "=site-com/page/xf",
SLING_SERVLET_EXTENSIONS + "=js"
}
)
@Designate(ocd = XFJSServlet.XFJSServletConfig.class)
public class XFJSServlet extends SlingSafeMethodsServlet {
private static final String JQUERY_LIB = "/etc.clientlibs/clientlibs/granite/jquery.js";
@ObjectClassDefinition(name = "XF JS Servlet")
public @interface XFtJSServletConfig {
}
@Reference
private RequestResponseFactory requestResponseFactory;
@Reference
private SlingRequestProcessor requestProcessor;
@Reference
private HtmlLibraryManager htmlLibraryManager;
@Reference
private Externalizer externalizer;
@Reference
private SlingSettingsService settingsService;
private boolean isPublish = false;
@Activate
protected void activate(ExperienceFragmentJSServletConfig config) {
if(settingsService.getRunModes().contains(Externalizer.PUBLISH)) {
this.isPublish = true;
}
}
@Override
protected void doGet(@Nonnull SlingHttpServletRequest request, @Nonnull SlingHttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
response.setContentType("application/javascript");
JsonObject xfJson = new JsonObject();
xfJson.addProperty("reqJquery", getLink(request, JQUERY_LIB));
// get page clientlibs
xfJson.add("cssLibs", getMainLibraries(request, LibraryType.CSS, "pagelibs", "pagelibs-critical"));
xfJson.add("jsLibs", getMainLibraries(request, LibraryType.JS, "pagelibs"));
getPageClientLibsContent(request);
// get html
String contentHtml = getPageContentHtml(request);
contentHtml = contentHtml.replace(""/content", String.format(""%1$s", getLink(request, "/content")));
String formattedString = new String(Base64.getEncoder().encode(contentHtml.getBytes()));
xfJson.addProperty("content", formattedString);
out.print("var xfDeliveryObj = " + xfJson + ";");
out.print(getXfDeliveryJs());
}
private JsonElement getMainLibraries(SlingHttpServletRequest request, LibraryType libraryType, String ... categories) {
Collection<clientlibrary> libraries = htmlLibraryManager.getLibraries(categories, libraryType, true, true);
JsonArray cssLibs = new JsonArray();
for (ClientLibrary library : libraries) {
cssLibs.add(new JsonPrimitive(getLink(request, library.getPath() + libraryType.extension)));
}
return cssLibs;
}
private void getPageClientLibsContent(SlingHttpServletRequest request) {
Page page = request.getResource().adaptTo(Page.class);
Designer designer = request.getResourceResolver().adaptTo(Designer.class);
Design pageDesign = null;
// traverse up to find design path
while (page != null && (pageDesign = designer.getDesign(page)) == null) {
page = page.getParent();
}
// default if not design path is set
if (pageDesign == null) {
pageDesign = designer.getDesign(Designer.DEFAULT_DESIGN_PATH);
}
}
private String getPageContentHtml(SlingHttpServletRequest request) throws ServletException, IOException {
Resource xfResource = request.getResource();
String resourcePath = xfResource.getPath() + ".min.html";
HttpServletRequest req = requestResponseFactory.createRequest("GET", resourcePath);
WCMMode.DISABLED.toRequest(req);
ByteArrayOutputStream reqOut = new ByteArrayOutputStream();
HttpServletResponse resp = requestResponseFactory.createResponse(reqOut);
requestProcessor.processRequest(req, resp, request.getResourceResolver());
return reqOut.toString();
}
private String getXfDeliveryJs() {
Collection<clientlibrary> libraries = htmlLibraryManager.getLibraries(new String[]{"site.xf-js"}, LibraryType.JS, true, true);
StringWriter jsContentString = new StringWriter();
for (ClientLibrary library : libraries) {
HtmlLibrary htmlLib = htmlLibraryManager.getLibrary(LibraryType.JS, library.getPath());
try {
IOUtils.copy(htmlLib.getInputStream(), jsContentString, "UTF-8");
} catch (IOException e) {
}
}
return jsContentString.toString();
}
private String getLink(SlingHttpServletRequest request, String relativePath) {
return isPublish() ? externalizer.publishLink(request.getResourceResolver(), relativePath) :
externalizer.authorLink(request.getResourceResolver(), relativePath);
}
public boolean isPublish() {
return isPublish;
}
}
</clientlibrary></clientlibrary>