/******************************************************************************* * Copyright (c) 2011, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * 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$ } }