Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/ControlServlet.java')
-rw-r--r--org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/ControlServlet.java317
1 files changed, 317 insertions, 0 deletions
diff --git a/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/ControlServlet.java b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/ControlServlet.java
new file mode 100644
index 000000000..2661db42d
--- /dev/null
+++ b/org.eclipse.help.webapp/src/org/eclipse/help/internal/webapp/servlet/ControlServlet.java
@@ -0,0 +1,317 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 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.servlet;
+
+import java.io.*;
+import java.lang.reflect.*;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.help.internal.base.*;
+import org.eclipse.help.internal.webapp.data.*;
+import org.osgi.framework.*;
+
+/**
+ * Servlet to control Eclipse helpApplication from standalone application.
+ * Accepts the following parameters: command=displayHelp | shutdown
+ * | install | update | enable | disable | uninstall | search | listFeatures
+ * | addSite | removeSite | apply.
+ * href - may be provided if comand==displayHelp.
+ * featureId, version, from, to, verifyOnly may be provided for update commands
+ */
+public class ControlServlet extends HttpServlet {
+ private static final long serialVersionUID = 1L;
+ public static final String UPDATE_PLUGIN_ID = "org.eclipse.update.core"; //$NON-NLS-1$
+
+ public static final String CMD_DISPLAYHELP = "displayHelp"; //$NON-NLS-1$
+
+ public static final String CMD_SHUTDOWN = "shutdown"; //$NON-NLS-1$
+
+ public static final String CMD_INSTALL = "install"; //$NON-NLS-1$
+
+ public static final String CMD_UPDATE = "update"; //$NON-NLS-1$
+
+ public static final String CMD_ENABLE = "enable"; //$NON-NLS-1$
+
+ public static final String CMD_DISABLE = "disable"; //$NON-NLS-1$
+
+ public static final String CMD_UNINSTALL = "uninstall"; //$NON-NLS-1$
+
+ public static final String CMD_SEARCH = "search"; //$NON-NLS-1$
+
+ public static final String CMD_LIST = "listFeatures"; //$NON-NLS-1$
+
+ public static final String CMD_ADDSITE = "addSite"; //$NON-NLS-1$
+
+ public static final String CMD_APPLY = "apply"; //$NON-NLS-1$
+
+ public static final String CMD_REMOVESITE = "removeSite"; //$NON-NLS-1$
+
+ public static final String PACKAGE_PREFIX = "org.eclipse.update.standalone."; //$NON-NLS-1$
+
+ public static final String CLASS_INSTALL = PACKAGE_PREFIX
+ + "InstallCommand"; //$NON-NLS-1$
+
+ public static final String CLASS_UPDATE = PACKAGE_PREFIX + "UpdateCommand"; //$NON-NLS-1$
+
+ public static final String CLASS_ENABLE = PACKAGE_PREFIX + "EnableCommand"; //$NON-NLS-1$
+
+ public static final String CLASS_DISABLE = PACKAGE_PREFIX
+ + "DisableCommand"; //$NON-NLS-1$
+
+ public static final String CLASS_UNINSTALL = PACKAGE_PREFIX
+ + "UninstallCommand"; //$NON-NLS-1$
+
+ public static final String CLASS_SEARCH = PACKAGE_PREFIX + "SearchCommand"; //$NON-NLS-1$
+
+ public static final String CLASS_LIST = PACKAGE_PREFIX
+ + "ListFeaturesCommand"; //$NON-NLS-1$
+
+ public static final String CLASS_ADDSITE = PACKAGE_PREFIX
+ + "AddSiteCommand"; //$NON-NLS-1$
+
+ public static final String CLASS_REMOVESITE = PACKAGE_PREFIX
+ + "RemoveSiteCommand"; //$NON-NLS-1$
+
+ public static final String PARAM_FEATUREID = "featureId"; //$NON-NLS-1$
+
+ public static final String PARAM_VERSION = "version"; //$NON-NLS-1$
+
+ public static final String PARAM_FROM = "from"; //$NON-NLS-1$
+
+ public static final String PARAM_TO = "to"; //$NON-NLS-1$
+
+ public static final String PARAM_VERIFYONLY = "verifyOnly"; //$NON-NLS-1$
+
+ private HelpDisplay helpDisplay = null;
+
+ private boolean shuttingDown = false;
+
+ /**
+ * Called by the servlet container to indicate to a servlet that the servlet
+ * is being placed into service.
+ */
+ public void init() throws ServletException {
+ super.init();
+ if (BaseHelpSystem.getMode() == BaseHelpSystem.MODE_STANDALONE) {
+ helpDisplay = BaseHelpSystem.getHelpDisplay();
+ }
+ }
+
+ /**
+ * Called by the server (via the <code>service</code> method) to allow a
+ * servlet to handle a GET request.
+ */
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ processRequest(req, resp);
+ }
+
+ /**
+ * Called by the server (via the <code>service</code> method) to allow a
+ * servlet to handle a POST request.
+ */
+ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ processRequest(req, resp);
+ }
+
+ private void processRequest(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+
+ req.setCharacterEncoding("UTF-8"); //$NON-NLS-1$
+
+ // for HTTP 1.1
+ resp.setHeader("Cache-Control", "no-cache"); //$NON-NLS-1$ //$NON-NLS-2$
+ // for HTTP 1.0
+ resp.setHeader("Pragma", "no-cache"); //$NON-NLS-1$ //$NON-NLS-2$
+ resp.setDateHeader("Expires", 0); //$NON-NLS-1$
+ //prevents caching at the proxy server
+
+ if (!UrlUtil.isLocalRequest(req)) {
+ // do not allow remote clients to execute this servlet
+ return;
+ }
+ if (!"/helpControl".equals(req.getContextPath()) //$NON-NLS-1$
+ || !"/control.html".equals(req.getServletPath())) { //$NON-NLS-1$
+ // do not allow arbitrary URLs to execute this servlet
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, ""); //$NON-NLS-1$
+ return;
+ }
+
+ if (shuttingDown) {
+ return;
+ }
+
+ String command = req.getParameter("command"); //$NON-NLS-1$
+ if (command == null) {
+ // this should never happen and is invisible to the user
+ resp.getWriter().print("No command."); //$NON-NLS-1$
+ return;
+ }
+
+ if (CMD_SHUTDOWN.equalsIgnoreCase(command)) {
+ shutdown();
+ } else if (CMD_DISPLAYHELP.equalsIgnoreCase(command)) {
+ if (BaseHelpSystem.getMode() == BaseHelpSystem.MODE_STANDALONE) {
+ displayHelp(req);
+ }
+ } else if (CMD_INSTALL.equalsIgnoreCase(command)
+ || CMD_ENABLE.equalsIgnoreCase(command)
+ || CMD_UPDATE.equalsIgnoreCase(command)
+ || CMD_DISABLE.equalsIgnoreCase(command)
+ || CMD_UNINSTALL.equalsIgnoreCase(command)
+ || CMD_SEARCH.equalsIgnoreCase(command)
+ || CMD_LIST.equalsIgnoreCase(command)
+ || CMD_ADDSITE.equalsIgnoreCase(command)
+ || CMD_REMOVESITE.equalsIgnoreCase(command)
+ || CMD_APPLY.equalsIgnoreCase(command)) {
+ updateDocs(command, req);
+ } else {
+ // this should never happen and is invisible to the user
+ resp.getWriter().print("Unrecognized command."); //$NON-NLS-1$
+ }
+ }
+
+ private void updateDocs(String command, HttpServletRequest req) {
+ Bundle bundle = Platform.getBundle(UPDATE_PLUGIN_ID);
+ if (bundle == null) {
+ // no update plugin present
+ return;
+ }
+ try {
+ String className = getStandaloneClassName(command);
+ if (className == null) {
+ System.out.println("No class name for command " + command); //$NON-NLS-1$
+ return;
+ }
+ Class c = bundle.loadClass(className);
+ if (c == null) {
+ System.out.println("No class for command " + command); //$NON-NLS-1$
+ return;
+ }
+ Class[] parameterTypes = getParameterTypes(className);
+ Constructor constr = c.getConstructor(parameterTypes);
+ if (constr == null) {
+ System.out.println("No expected constructor for command " //$NON-NLS-1$
+ + command);
+ return;
+ }
+ Method m;
+ if (!CMD_APPLY.equalsIgnoreCase(command)) {
+ m = c.getMethod("run", new Class[]{}); //$NON-NLS-1$
+ } else {
+ m = c.getMethod("applyChangesNow", new Class[]{}); //$NON-NLS-1$
+ }
+ Object[] initargs = getInitArgs(className, req);
+ Object o = constr.newInstance(initargs);
+ Object ret = m.invoke(o, new Object[]{});
+ if (!CMD_APPLY.equalsIgnoreCase(command) &&((Boolean)ret).equals(Boolean.FALSE)){
+ System.out.println("Command not executed."); //$NON-NLS-1$
+ } else {
+ System.out.println("Command executed."); //$NON-NLS-1$
+ }
+ } catch (Exception e) {
+ Throwable t = e;
+ if (e instanceof InvocationTargetException) {
+ t = ((InvocationTargetException) e).getTargetException();
+ }
+ System.out.println(t.getLocalizedMessage());
+ //t.printStackTrace();
+ }
+ }
+
+ private String getStandaloneClassName(String command) {
+ if (CMD_INSTALL.equalsIgnoreCase(command))
+ return CLASS_INSTALL;
+ else if (CMD_UPDATE.equalsIgnoreCase(command))
+ return CLASS_UPDATE;
+ else if (CMD_ENABLE.equalsIgnoreCase(command))
+ return CLASS_ENABLE;
+ else if (CMD_DISABLE.equalsIgnoreCase(command))
+ return CLASS_DISABLE;
+ else if (CMD_UNINSTALL.equalsIgnoreCase(command))
+ return CLASS_UNINSTALL;
+ else if (CMD_SEARCH.equalsIgnoreCase(command))
+ return CLASS_SEARCH;
+ else if (CMD_LIST.equalsIgnoreCase(command)
+ || CMD_APPLY.equalsIgnoreCase(command))
+ return CLASS_LIST;
+ else if (CMD_ADDSITE.equalsIgnoreCase(command))
+ return CLASS_ADDSITE;
+ else if (CMD_REMOVESITE.equalsIgnoreCase(command))
+ return CLASS_REMOVESITE;
+ else
+ return null;
+ }
+
+ private Class[] getParameterTypes(String className) {
+ if (CLASS_INSTALL.equals(className))
+ return new Class[]{String.class, String.class, String.class,
+ String.class, String.class};
+ else if (CLASS_UPDATE.equals(className))
+ return new Class[]{String.class, String.class, String.class};
+ else if (CLASS_ENABLE.equals(className)
+ || CLASS_DISABLE.equals(className)
+ || CLASS_UNINSTALL.equals(className))
+ return new Class[]{String.class, String.class, String.class,
+ String.class};
+ else
+ return new Class[]{String.class};
+ }
+
+ private Object[] getInitArgs(String className, HttpServletRequest req) {
+ String featureId = req.getParameter(PARAM_FEATUREID);
+ String version = req.getParameter(PARAM_VERSION);
+ String fromSite = req.getParameter(PARAM_FROM);
+ String toSite = req.getParameter(PARAM_TO);
+ String verifyOnly = req.getParameter(PARAM_VERIFYONLY);
+ if (CLASS_INSTALL.equals(className))
+ return new Object[]{featureId, version, fromSite, toSite,
+ verifyOnly};
+ else if (CLASS_UPDATE.equals(className))
+ return new Object[]{featureId, version, verifyOnly};
+ else if (CLASS_ENABLE.equals(className)
+ || CLASS_DISABLE.equals(className)
+ || CLASS_UNINSTALL.equals(className))
+ return new Object[]{featureId, version, toSite, verifyOnly};
+ else if (CLASS_REMOVESITE.equals(className))
+ return new Object[]{toSite};
+ else
+ return new Object[]{fromSite};
+ }
+
+ /**
+ * Shuts-down Eclipse helpApplication.
+ */
+ private void shutdown() {
+ shuttingDown = true;
+ HelpApplication.stopHelp();
+ }
+
+ /**
+ * Displays help.
+ *
+ * @param req
+ * HttpServletRequest that might contain href parameter, which is
+ * the resource to display
+ */
+ private void displayHelp(HttpServletRequest req) {
+ String href = req.getParameter("href"); //$NON-NLS-1$
+ if (href != null) {
+ helpDisplay.displayHelpResource(href, false);
+ } else {
+ helpDisplay.displayHelp(false);
+ }
+ }
+}

Back to the top