/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.frontend.js.loader.modules.extender.internal;
import com.liferay.portal.kernel.util.Portal;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.felix.utils.log.Logger;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.metatype.annotations.Designate;
/**
* @author Raymond Augé
*/
@Component(
configurationPid = "com.liferay.frontend.js.loader.modules.extender.internal.Details",
immediate = true,
property = {
"osgi.http.whiteboard.servlet.name=com.liferay.frontend.js.loader.modules.extender.internal.JSLoaderModulesServlet",
"osgi.http.whiteboard.servlet.pattern=/js_loader_modules",
"service.ranking:Integer=" + Details.MAX_VALUE_LESS_1K
},
service = {JSLoaderModulesServlet.class, Servlet.class}
)
@Designate(ocd = Details.class)
public class JSLoaderModulesServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
_componentContext.enableComponent(
JSLoaderModulesPortalWebResources.class.getName());
}
@Activate
@Modified
protected void activate(ComponentContext componentContext, Details details)
throws Exception {
_details = details;
_logger = new Logger(componentContext.getBundleContext());
_componentContext = componentContext;
}
protected JSLoaderModulesTracker getJSLoaderModulesTracker() {
return _jsLoaderModulesTracker;
}
@Override
protected void service(
HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType(Details.CONTENT_TYPE);
ServletOutputStream servletOutputStream = response.getOutputStream();
PrintWriter printWriter = new PrintWriter(servletOutputStream, true);
printWriter.println("(function() {");
printWriter.println("Liferay.PATHS = {");
String delimiter = "";
Set<String> processedNames = new HashSet<>();
Collection<JSLoaderModule> jsLoaderModules =
_jsLoaderModulesTracker.getJSLoaderModules();
for (JSLoaderModule jsLoaderModule : jsLoaderModules) {
printWriter.write(delimiter);
printWriter.write("'");
printWriter.write(jsLoaderModule.getName());
printWriter.write('@');
printWriter.write(jsLoaderModule.getVersion());
printWriter.write("': '");
printWriter.write(_portal.getPathProxy());
printWriter.write(jsLoaderModule.getContextPath());
printWriter.write("'");
if (!processedNames.contains(jsLoaderModule.getName())) {
processedNames.add(jsLoaderModule.getName());
printWriter.println(",");
printWriter.write("'");
printWriter.write(jsLoaderModule.getName());
printWriter.write("': '");
printWriter.write(_portal.getPathProxy());
printWriter.write(jsLoaderModule.getContextPath());
printWriter.write("'");
}
delimiter = ",\n";
}
printWriter.println("\n};");
printWriter.println("Liferay.MODULES = {");
delimiter = "";
processedNames.clear();
for (JSLoaderModule jsLoaderModule : jsLoaderModules) {
String unversionedConfiguration =
jsLoaderModule.getUnversionedConfiguration();
if (unversionedConfiguration.length() == 0) {
continue;
}
if (!processedNames.contains(jsLoaderModule.getName())) {
processedNames.add(jsLoaderModule.getName());
printWriter.write(delimiter);
printWriter.write(unversionedConfiguration);
delimiter = ",\n";
}
String versionedConfiguration =
jsLoaderModule.getVersionedConfiguration();
if (versionedConfiguration.length() > 0) {
printWriter.write(delimiter);
printWriter.write(versionedConfiguration);
delimiter = ",\n";
}
}
printWriter.println("\n};");
printWriter.println("Liferay.MAPS = {");
delimiter = "";
processedNames.clear();
for (JSLoaderModule jsLoaderModule : jsLoaderModules) {
if (processedNames.contains(jsLoaderModule.getName())) {
continue;
}
processedNames.add(jsLoaderModule.getName());
printWriter.write(delimiter);
printWriter.write("'");
printWriter.write(jsLoaderModule.getName());
printWriter.write("': '");
printWriter.write(jsLoaderModule.getName());
printWriter.write('@');
printWriter.write(jsLoaderModule.getVersion());
printWriter.write("'");
delimiter = ",\n";
String unversionedMapsConfiguration =
jsLoaderModule.getUnversionedMapsConfiguration();
if (!unversionedMapsConfiguration.equals("")) {
printWriter.write(delimiter);
printWriter.write(unversionedMapsConfiguration);
}
}
printWriter.println("\n};");
printWriter.println(
"Liferay.EXPOSE_GLOBAL = " + _details.exposeGlobal() + ";\n");
printWriter.println("}());");
printWriter.close();
}
protected void setDetails(Details details) {
_details = details;
}
@Reference(unbind = "-")
protected void setJSLoaderModulesTracker(
JSLoaderModulesTracker jsLoaderModulesTracker) {
_jsLoaderModulesTracker = jsLoaderModulesTracker;
}
private ComponentContext _componentContext;
private volatile Details _details;
private JSLoaderModulesTracker _jsLoaderModulesTracker;
private Logger _logger;
@Reference
private Portal _portal;
}