blob: 5029b04f9d3dc68b14c9e75ea227d73d6311c53e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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.update.internal.core;
import java.io.*;
import java.util.jar.*;
import org.eclipse.core.runtime.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.update.core.*;
import org.eclipse.update.core.JarContentReference.*;
import org.eclipse.update.core.model.*;
/**
* Default Implementation of InstallHandler
*/
public class DefaultInstallHandler extends BaseInstallHandler {
/*
* @see IInstallHandler#nonPluginDataDownloaded(INonPluginEntry[], IVerificationListener)
*/
public void nonPluginDataDownloaded(
INonPluginEntry[] nonPluginData,
IVerificationListener listener)
throws CoreException {
// verify non-plugin archives. The DefaultInstallHandler assumes
// the verifier associated with the feature is able to verify the
// data archives.
if (nonPluginData == null || nonPluginData.length == 0)
return;
this.nonPluginEntries = nonPluginData;
IFeatureContentProvider provider = this.feature.getFeatureContentProvider();
IVerifier verifier = provider.getVerifier();
if (verifier == null)
return;
for (int i = 0; i < this.nonPluginEntries.length; i++) {
ContentReference[] archives =
provider.getNonPluginEntryArchiveReferences(nonPluginEntries[i], this.monitor);
IVerificationResult result;
for (int j = 0; j < archives.length; j++) {
// see if the data entry is a jar
ContentReference archive = archives[j];
if (!(archives[j] instanceof JarContentReference)
&& archives[j].getIdentifier().endsWith(".jar")) { //$NON-NLS-1$
try {
archive =
new JarContentReference(archives[j].getIdentifier(), archives[j].asFile());
} catch (IOException e) {
}
}
result = verifier.verify(this.feature, archive, false, this.monitor);
if (result != null)
promptForVerification(result, listener);
}
}
}
/*
* @see IInstallHandler#completeInstall(IFeatureContentConsumer)
*/
public void completeInstall(IFeatureContentConsumer consumer)
throws CoreException {
// plugins have been installed. Check to see if we have any
// non-plugin entries that need to be handled.
if (this.nonPluginEntries == null || this.nonPluginEntries.length == 0)
return;
// install non-plugin archives
IFeatureContentProvider provider = this.feature.getFeatureContentProvider();
for (int i = 0; i < this.nonPluginEntries.length; i++) {
ContentReference[] archive =
provider.getNonPluginEntryArchiveReferences(nonPluginEntries[i], this.monitor);
IContentConsumer nonPluginConsumer = consumer.open(nonPluginEntries[i]);
for (int j = 0; j < archive.length; j++) {
String id = archive[j].getIdentifier();
if (id.endsWith(".jar")) { //$NON-NLS-1$
// the non-plugin archive is a jar. Unpack it into
// a directory constructed using the archive id
try {
final String prefix = id.substring(0, id.length() - 4) + "/"; //$NON-NLS-1$
JarContentReference jarRef = new JarContentReference("", archive[j].asFile()); //$NON-NLS-1$
ContentSelector selector = new ContentSelector() {
public String defineIdentifier(JarEntry entry) {
if (entry == null)
return null;
else
return prefix + entry.getName();
}
};
ContentReference[] entries = jarRef.peek(selector, this.monitor);
for (int k = 0; k < entries.length; k++) {
nonPluginConsumer.store(entries[k], this.monitor);
}
} catch (IOException e) {
throw Utilities
.newCoreException(NLS.bind(Messages.JarVerificationService_CancelInstall, (new String[] { id })),
e);
}
} else {
// the non-plugin archive is not a jar. Install it asis.
nonPluginConsumer.store(archive[j], this.monitor);
}
}
nonPluginConsumer.close();
}
}
/*
*
*/
private void promptForVerification(
IVerificationResult verificationResult,
IVerificationListener listener)
throws CoreException {
if (listener == null)
return;
int result = listener.prompt(verificationResult);
if (result == IVerificationListener.CHOICE_ABORT) {
Exception e = verificationResult.getVerificationException();
throw new InstallAbortedException(Messages.JarVerificationService_CancelInstall,e);
}
if (result == IVerificationListener.CHOICE_ERROR) {
throw Utilities
.newCoreException(Messages.JarVerificationService_UnsucessfulVerification,
verificationResult.getVerificationException());
}
return;
}
}