blob: d92d735621fc0a66b5ef0e588fd20b44a1c9ed8d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2008 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 org.eclipse.core.runtime.IStatus;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Status;
import org.eclipse.update.core.BaseInstallHandler;
import org.eclipse.update.core.ContentReference;
import org.eclipse.update.core.IFeature;
import org.eclipse.update.core.IFeatureContentConsumer;
import org.eclipse.update.core.IPluginEntry;
import org.eclipse.update.core.PluginEntry;
import org.eclipse.update.core.Site;
import org.eclipse.update.internal.operations.UpdateUtils;
/**
* Install handler for partial plugin delivery: copy delta content from old plugin into the new one.
* The new plugin should only contain files that have changed.
*/
public class DeltaInstallHandler extends BaseInstallHandler {
private final static String PLUGIN_XML = "plugin.xml"; //$NON-NLS-1$
private final static String FRAGMENT_XML = "fragment.xml"; //$NON-NLS-1$
private final static String META_MANIFEST = "META-INF/MANIFEST.MF"; //$NON-NLS-1$
protected IFeature oldFeature;
/* (non-Javadoc)
* @see org.eclipse.update.core.IInstallHandler#completeInstall(org.eclipse.update.core.IFeatureContentConsumer)
*/
public void completeInstall(IFeatureContentConsumer consumer)
throws CoreException {
try {
if (pluginEntries == null)
return;
if (!feature.isPatch()) {
// Get the old feature
IFeature[] oldFeatures = UpdateUtils
.getInstalledFeatures(feature);
if (oldFeatures.length == 0)
return;
oldFeature = oldFeatures[0];
} else {
oldFeature = UpdateUtils.getPatchedFeature(feature);
if (oldFeature == null) {
return;
}
}
IPluginEntry[] oldPlugins = oldFeature.getPluginEntries();
for (int i = 0; i < pluginEntries.length; i++) {
IPluginEntry newPlugin = pluginEntries[i];
IPluginEntry oldPlugin =
getPluginEntry(
oldPlugins,
newPlugin.getVersionedIdentifier().getIdentifier());
if (oldPlugin == null)
continue;
try {
overlayPlugin(oldPlugin, newPlugin, consumer);
} catch (IOException e) {
throw new CoreException(
new Status(
IStatus.ERROR,
UpdateUtils.getPluginId(),
1,
"", //$NON-NLS-1$
e));
}
}
} finally {
//if (contentConsumer != null)
// contentConsumer.close();
}
}
protected IPluginEntry getPluginEntry(IPluginEntry[] plugins, String id) {
for (int i = 0; i < plugins.length; i++)
if (plugins[i].getVersionedIdentifier().getIdentifier().equals(id))
return plugins[i];
return null;
}
protected boolean referenceExists(
ContentReference[] references,
ContentReference ref) {
String id = ref.getIdentifier();
if (id == null)
return false;
for (int i = 0; i < references.length; i++)
if (id.equals(references[i].getIdentifier()))
return true;
return false;
}
protected void overlayPlugin(
IPluginEntry oldPlugin,
IPluginEntry newPlugin,
IFeatureContentConsumer consumer)
throws CoreException, IOException {
if(newPlugin instanceof PluginEntry && !((PluginEntry)newPlugin).isUnpack()){
// partial plug-ins (in patches) must always be unpacked
return;
}
// copy the content of the old plugin over the new one, but only
// those files that do not exist on the target
ContentReference[] oldReferences =
oldFeature
.getFeatureContentProvider()
.getPluginEntryContentReferences(
oldPlugin,
null);
ContentReference[] newReferences =
feature
.getFeatureContentProvider()
.getPluginEntryContentReferences(
newPlugin,
null);
URL newURL = new URL(consumer.getFeature().getSite().getURL(),
Site.DEFAULT_PLUGIN_PATH
+ newPlugin.getVersionedIdentifier().toString());
String pluginPath = newURL.getFile();
for (int i = 0; i < oldReferences.length; i++) {
if (isPluginManifest(oldReferences[i])
|| referenceExists(newReferences, oldReferences[i]))
continue;
InputStream input = null;
try {
input = oldReferences[i].getInputStream();
File targetFile =
new File(pluginPath, oldReferences[i].getIdentifier());
UpdateManagerUtils.copyToLocal(
input,
targetFile.getAbsolutePath(),
null);
UpdateManagerUtils.checkPermissions(
oldReferences[i],
pluginPath);
// 20305
} catch (IOException e) {
continue;
} finally {
if(input != null){
try{
input.close();
} catch (IOException ioe) {
}
}
}
}
}
protected boolean isPluginManifest(ContentReference ref) {
String id = ref.getIdentifier();
return PLUGIN_XML.equals(id) || FRAGMENT_XML.equals(id) || META_MANIFEST.equals(id);
}
}