/******************************************************************************* * 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); } }