blob: 88ebc3a6ff03251baac1f8609186b56f9035d8ea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.update.internal.ui.servlets;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import javax.servlet.*;
import javax.servlet.http.*;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.widgets.*;
import org.eclipse.update.core.*;
import org.eclipse.update.internal.ui.UpdateUI;
import org.eclipse.update.internal.ui.forms.DetailsForm;
import org.eclipse.update.internal.ui.model.PendingChange;
import org.eclipse.update.internal.ui.parts.SWTUtil;
/**
* @author dejan
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class InstallServlet extends HttpServlet {
private ServletConfig servletConfig;
public static final String SERVLET_NAME = "/InstallServlet"; //$NON-NLS-1$
public void init(ServletConfig config) throws ServletException {
this.servletConfig = config;
}
public void destroy() {
}
public ServletConfig getServletConfig() {
return servletConfig;
}
public String getServletInfo() {
return "Eclipse Install servlet"; //$NON-NLS-1$
}
public void service(
HttpServletRequest servletRequest,
HttpServletResponse servletResponse)
throws ServletException, IOException {
PrintWriter writer =
ServletsUtil.createResponsePrologue(servletResponse);
execute(writer, servletRequest);
ServletsUtil.createResponseEpilogue(
servletRequest,
servletResponse,
writer);
}
/**
* Method execute.
* @param servletRequest
*/
private void execute(
PrintWriter writer,
HttpServletRequest servletRequest) {
String serverURL = servletRequest.getParameter("server"); //$NON-NLS-1$
String license = servletRequest.getParameter("license"); //$NON-NLS-1$
boolean needLicensePage = true;
if (license != null && license.equalsIgnoreCase("false")) //$NON-NLS-1$
needLicensePage = false;
String[] versionedIds = servletRequest.getParameterValues("feature"); //$NON-NLS-1$
if (serverURL == null) {
createPageError(writer, UpdateUI.getString("InstallServlet.unknownServerURL")); //$NON-NLS-1$
return;
}
if (versionedIds == null) {
createPageError(writer, UpdateUI.getString("InstallServlet.noFeatures")); //$NON-NLS-1$
return;
}
if (DetailsForm.isInProgress()) {
ServletsUtil.createError(writer, UpdateUI.getString("InstallServlet.inProgress"), null);
return;
}
try {
URL url = new URL(serverURL);
VersionedIdentifier[] vids =
computeVersionedIdentifiers(versionedIds);
boolean success =
executeInstall(writer, url, vids, needLicensePage);
if (success)
ServletsUtil.createInfo(writer);
} catch (MalformedURLException e) {
createPageError(writer, UpdateUI.getFormattedMessage("InstallServlet.incorrectURLFormat", //$NON-NLS-1$
serverURL.toString()));
}
}
private void createPageError(PrintWriter writer, String problem) {
ServletsUtil.createError(writer, problem, UpdateUI.getString("InstallServlet.contactWebmaster")); //$NON-NLS-1$
}
private VersionedIdentifier[] computeVersionedIdentifiers(String[] array) {
ArrayList result = new ArrayList();
for (int i = 0; i < array.length; i++) {
String id_version = array[i];
int sep = id_version.lastIndexOf('_');
if (sep == -1)
continue;
String id = id_version.substring(0, sep);
String version = id_version.substring(sep + 1);
VersionedIdentifier vid = new VersionedIdentifier(id, version);
result.add(vid);
}
return (VersionedIdentifier[]) result.toArray(
new VersionedIdentifier[result.size()]);
}
private boolean executeInstall(
PrintWriter writer,
URL siteURL,
VersionedIdentifier[] vids,
boolean needLicensePage) {
if (vids.length == 1) {
return executeInstall(writer, siteURL, vids[0], needLicensePage);
} else {
ServletsUtil.createError(writer, UpdateUI.getString("InstallServlet.multipleInstall"), null); //$NON-NLS-1$
return false;
}
}
private boolean executeInstall(
final PrintWriter writer,
final URL siteURL,
final VersionedIdentifier vid,
final boolean needLicensePage) {
Display display = SWTUtil.getStandardDisplay();
final boolean[] result = new boolean[] { false };
display.syncExec(new Runnable() {
public void run() {
final Shell shell = UpdateUI.getActiveWorkbenchShell();
BusyIndicator.showWhile(shell.getDisplay(), new Runnable() {
public void run() {
result[0] =
doExecuteInstall(
writer,
shell,
siteURL,
vid,
needLicensePage);
}
});
}
});
return result[0];
}
private boolean doExecuteInstall(
PrintWriter writer,
final Shell shell,
URL siteURL,
VersionedIdentifier vid,
final boolean needLicensePage) {
shell.forceActive();
IFeature feature =
DetailsForm.fetchFeatureFromServer(shell, siteURL, vid);
if (feature == null)
return false;
IFeature latestOldFeature = findLatestOldFeature(feature);
if (latestOldFeature != null) {
if (latestOldFeature
.getVersionedIdentifier()
.equals(feature.getVersionedIdentifier())) {
// Already installed.
ServletsUtil.createError(writer, UpdateUI.getString("InstallServlet.alreadyInstalled"), //$NON-NLS-1$
UpdateUI.getString("InstallServlet.alreadyHaveIt")); //$NON-NLS-1$
return false;
}
if (latestOldFeature
.getVersionedIdentifier()
.getVersion()
.isGreaterThan(feature.getVersionedIdentifier().getVersion())) {
ServletsUtil.createError(writer, UpdateUI.getString("InstallServlet.olderFeature"), //$NON-NLS-1$
UpdateUI.getString("InstallServlet.nothing2")); //$NON-NLS-1$
return false;
}
}
final PendingChange job;
if (latestOldFeature != null)
job = new PendingChange(latestOldFeature, feature);
else
job = new PendingChange(feature, PendingChange.INSTALL);
shell.getDisplay().asyncExec(new Runnable() {
public void run() {
DetailsForm.executeJob(shell, job, needLicensePage);
}
});
return true;
}
private IFeature findLatestOldFeature(IFeature feature) {
IFeature[] oldFeatures = UpdateUI.getInstalledFeatures(feature);
if (oldFeatures.length == 0)
return null;
IFeature latest = null;
for (int i = 0; i < oldFeatures.length; i++) {
IFeature curr = oldFeatures[i];
if (latest == null
|| curr.getVersionedIdentifier().getVersion().isGreaterThan(
latest.getVersionedIdentifier().getVersion())) {
latest = curr;
}
}
return latest;
}
}