blob: 2e72397fcedf322b8ae188546a1a524d53e5a71b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2016 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.internal.webapp.service;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.help.internal.webapp.HelpWebappPlugin;
import org.eclipse.help.internal.webapp.WebappResources;
import org.eclipse.help.internal.webapp.data.UrlUtil;
import org.eclipse.help.internal.webapp.parser.AboutParser;
import org.eclipse.help.internal.webapp.servlet.AboutServlet;
import org.eclipse.help.internal.webapp.servlet.PreferenceWriter;
import org.eclipse.help.internal.webapp.servlet.XMLGenerator;
import org.eclipse.help.internal.webapp.utils.Utils;
import org.osgi.framework.Bundle;
/**
* Generates either xml, json or html page having informations about either
* <code>User-Agent</code>, Help system <code>preferences</code> or the available
* plug-ins in Help system like Provider, Plugin name, Version and PluginId.
*
* <p>Extends the {@link org.eclipse.help.internal.webapp.servlet.AboutServlet}
* servlet.
*
* @param show - (Optional) specifying either <code>agent</code>
* to view the request's <code>User-Agent</code> info, else
* <code>preferences</code> to view the Help system preferences.
* Do not specify any value to show the available plugins in
* Help web application.
* @param sortColumn - (Optional) specifying the column number of the available
* plug-ins in Help system over which displayed output needs
* to be sorted. Applicable only if <code>show</code> parameter
* is <code>null</code>.
* @param returnType - (Optional) specifies the return type of the servlet.
* Accepts either <code>xml</code> (default) or <code>html</code>
* or <code>json</code>
*
* @return Informations about either <code>User-Agent</code>, <code>preferences</code>
* or the available plug-ins, either as <code>xml</code> (default) or
* <code>html</code> or <code>json</code>
*
* @version $Version$
*
**/
public class AboutService extends AboutServlet {
private static final long serialVersionUID = 1L;
private long service;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); //$NON-NLS-1$
String returnType = req.getParameter(Utils.RETURN_TYPE);
boolean boolIsHTML = (returnType != null
&& returnType.equalsIgnoreCase(Utils.HTML));
// If HTML output is required, call AboutServlet class
if (boolIsHTML) {
super.doGet(req, resp);
return;
}
// Set standard HTTP/1.1 no-cache headers.
resp.setHeader("Cache-Control", //$NON-NLS-1$
"no-store, no-cache, must-revalidate"); //$NON-NLS-1$
resp.setContentType("application/xml; charset=UTF-8"); //$NON-NLS-1$
locale = UrlUtil.getLocaleObj(req, resp);
// create XML response
String response = processRequest(req, resp);
boolean boolIsJSON = (returnType != null
&& returnType.equalsIgnoreCase(Utils.JSON));
// If JSON output is required
if (boolIsJSON) {
resp.setContentType("text/plain"); //$NON-NLS-1$
response = getJSONResponse(response);
}
resp.getWriter().write(response);
}
protected String getJSONResponse(String response)
throws IOException {
AboutParser aboutParser = new AboutParser(service);
if (response != null) {
try (InputStream is = new ByteArrayInputStream(response.getBytes(StandardCharsets.UTF_8))) {
aboutParser.parse(is);
} catch (Exception e) {
e.printStackTrace();
}
}
// Call after the catch.
// An empty JSON is created if any Exception is thrown
// Else returns the complete JSON
return aboutParser.toJSON();
}
private String processRequest(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
StringBuffer buf = new StringBuffer();
buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); //$NON-NLS-1$
String showParam = req.getParameter("show"); //$NON-NLS-1$
if ("agent".equalsIgnoreCase(showParam)) { //$NON-NLS-1$
getAgent(buf, req, resp);
} else if ("preferences".equalsIgnoreCase(showParam)) { //$NON-NLS-1$
getPreferences(buf, resp);
} else {
getAboutPlugins(buf, req, resp);
}
return buf.toString();
}
private void getAgent(StringBuffer buf, HttpServletRequest req, HttpServletResponse resp)
throws IOException {
service = Utils.AGENT;
String title = WebappResources.getString("userAgent", locale); //$NON-NLS-1$
String agent = req.getHeader("User-Agent"); //$NON-NLS-1$
buf.append("<userAgent\n title=\""); //$NON-NLS-1$
buf.append(XMLGenerator.xmlEscape(title));
buf.append("\">"); //$NON-NLS-1$
buf.append(agent);
buf.append("</userAgent>"); //$NON-NLS-1$
}
private void getPreferences(StringBuffer buf, HttpServletResponse resp)
throws IOException {
service = Utils.PREFERENCE;
String title = WebappResources.getString("preferences", locale); //$NON-NLS-1$
buf.append("<preferences\n title=\""); //$NON-NLS-1$
buf.append(XMLGenerator.xmlEscape(title));
buf.append("\">"); //$NON-NLS-1$
PreferenceWriter writer = new PreferenceWriter(buf, locale, true);
writer.writePreferences();
buf.append("\n</preferences>"); //$NON-NLS-1$
}
private void getAboutPlugins(StringBuffer buf, HttpServletRequest req, HttpServletResponse resp)
throws IOException {
service = Utils.ABOUT_PLUGIN;
String sortParam = req.getParameter("sortColumn"); //$NON-NLS-1$
int sortColumn = 3;
if (sortParam != null) {
try {
sortColumn = Integer.parseInt(sortParam);
} catch (NumberFormatException e) {}
}
String title = WebappResources.getString("aboutPlugins", locale); //$NON-NLS-1$
buf.append("<aboutPlugins\n title=\""); //$NON-NLS-1$
buf.append(XMLGenerator.xmlEscape(title));
buf.append("\""); //$NON-NLS-1$
List<PluginDetails> plugins = new ArrayList<>();
Bundle[] bundles = HelpWebappPlugin.getContext().getBundles();
for (Bundle bundle : bundles) {
plugins.add(pluginDetails(bundle));
}
Comparator<PluginDetails> pluginComparator = new PluginComparator(sortColumn);
Collections.sort(plugins, pluginComparator );
String[] headerColumns = new String[]{
"provider", //$NON-NLS-1$
"pluginName", //$NON-NLS-1$
"version", //$NON-NLS-1$
"pluginId" //$NON-NLS-1$
};
for (String headerColumn : headerColumns) {
buf.append("\n "); //$NON-NLS-1$
buf.append(headerColumn);
buf.append("=\""); //$NON-NLS-1$
buf.append(XMLGenerator.xmlEscape(WebappResources.getString(headerColumn, locale)));
buf.append("\""); //$NON-NLS-1$
}
buf.append(">"); //$NON-NLS-1$
for (PluginDetails details : plugins) {
buf.append("\n <plugin"); //$NON-NLS-1$
for (int i = 0; i < headerColumns.length; i++) {
buf.append("\n "); //$NON-NLS-1$
buf.append(headerColumns[i]);
buf.append("=\""); //$NON-NLS-1$
buf.append(XMLGenerator.xmlEscape(details.columns[i]));
buf.append("\""); //$NON-NLS-1$
}
buf.append(">\n </plugin>"); //$NON-NLS-1$
}
buf.append("\n</aboutPlugins>"); //$NON-NLS-1$
}
}