| /******************************************************************************* |
| * 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.update.internal.core; |
| |
| |
| import java.io.*; |
| import java.net.*; |
| import java.util.ArrayList; |
| import java.util.List; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.update.core.*; |
| |
| /** |
| * Default implementation of a Executable Feature Content Provider |
| */ |
| |
| public class FeatureExecutableContentProvider extends FeatureContentProvider { |
| |
| /* |
| * Constructor |
| */ |
| public FeatureExecutableContentProvider(URL url) { |
| super(url); |
| } |
| |
| /* |
| * Return the path for a pluginEntry |
| */ |
| private String getPath(IPluginEntry pluginEntry) |
| throws IOException, CoreException { |
| |
| // get the URL of the Archive file that contains the plugin entry |
| ISiteContentProvider provider = getFeature().getSite().getSiteContentProvider(); |
| URL fileURL = provider.getArchiveReference(getPathID(pluginEntry)); |
| String result = fileURL.getFile(); |
| |
| if (!result.endsWith(".jar") && !result.endsWith("/") && !result.endsWith(File.separator)) //$NON-NLS-1$ //$NON-NLS-2$ |
| result += File.separator; |
| File pluginPath = new File(result); |
| if (!pluginPath.exists()) |
| throw new IOException( |
| NLS.bind(Messages.FeatureExecutableContentProvider_FileDoesNotExist, (new String[] { result }))); |
| |
| return result; |
| } |
| |
| /* |
| * Returns the path for the Feature |
| */ |
| private String getFeaturePath() throws IOException { |
| String result = getFeature().getURL().getFile(); |
| |
| // return the list of all subdirectories |
| if (!(result.endsWith(File.separator) || result.endsWith("/"))) //$NON-NLS-1$ |
| result += File.separator; |
| File pluginDir = new File(result); |
| if (!pluginDir.exists()) |
| throw new IOException( |
| NLS.bind(Messages.FeatureExecutableContentProvider_FileDoesNotExist, (new String[] { result }))); |
| |
| return result; |
| } |
| |
| /* |
| * Returns all the files under the directory |
| * Recursive call |
| */ |
| private List getFiles(File dir) throws IOException { |
| List result = new ArrayList(); |
| |
| if (!dir.isDirectory()) { |
| String msg = |
| NLS.bind(Messages.FeatureExecutableContentProvider_InvalidDirectory, (new String[] { dir.getAbsolutePath() })); |
| |
| throw new IOException(msg); |
| |
| } |
| |
| File[] files = dir.listFiles(); |
| if (files != null) |
| for (int i = 0; i < files.length; ++i) { |
| if (files[i].isDirectory()) { |
| result.addAll(getFiles(files[i])); |
| } else { |
| result.add(files[i]); |
| } |
| } |
| |
| return result; |
| } |
| |
| /* |
| * @see IFeatureContentProvider#getVerifier() |
| */ |
| public IVerifier getVerifier() throws CoreException { |
| return null; |
| } |
| |
| /* |
| * @see IFeatureContentProvider#getFeatureManifestReference() |
| */ |
| public ContentReference getFeatureManifestReference(InstallMonitor monitor) |
| throws CoreException { |
| ContentReference result = null; |
| try { |
| result = new ContentReference(Feature.FEATURE_XML, new URL(getURL(), Feature.FEATURE_XML)); |
| |
| } catch (MalformedURLException e) { |
| throw Utilities.newCoreException( |
| NLS.bind(Messages.FeatureExecutableContentProvider_UnableToCreateURLFor, (new String[] { getURL().toExternalForm() + " " + Feature.FEATURE_XML })), //$NON-NLS-1$ |
| e); |
| } |
| return result; |
| } |
| |
| /* |
| * @see IFeatureContentProvider#getArchiveReferences() |
| */ |
| public ContentReference[] getArchiveReferences(InstallMonitor monitor) |
| throws CoreException { |
| // executable feature does not contain archives |
| return new ContentReference[0]; |
| } |
| |
| /* |
| * @see IFeatureContentProvider#getPluginEntryArchiveReferences(IPluginEntry) |
| */ |
| public ContentReference[] getPluginEntryArchiveReferences( |
| IPluginEntry pluginEntry, |
| InstallMonitor monitor) |
| throws CoreException { |
| ContentReference[] result = new ContentReference[1]; |
| String archiveID = getPathID(pluginEntry); |
| try { |
| File archiveFile = new File(getPath(pluginEntry)); |
| if(!archiveFile.isDirectory() && archiveFile.getName().endsWith(".jar")){ //$NON-NLS-1$ |
| result[0] = new JarContentReference(archiveID, archiveFile); |
| } else { |
| result[0] = |
| new ContentReference(archiveID, archiveFile); |
| } |
| } catch (IOException e) { |
| throw Utilities.newCoreException( |
| NLS.bind(Messages.FeatureExecutableContentProvider_UnableToRetrievePluginEntry, (new String[] { pluginEntry.getVersionedIdentifier().toString() })), |
| e); |
| } |
| return result; |
| } |
| |
| /* |
| * @see IFeatureContentProvider#getNonPluginEntryArchiveReferences(INonPluginEntry) |
| */ |
| public ContentReference[] getNonPluginEntryArchiveReferences( |
| INonPluginEntry nonPluginEntry, |
| InstallMonitor monitor) |
| throws CoreException { |
| |
| ContentReference[] result = new ContentReference[1]; |
| URL fileURL; |
| |
| //try { |
| // get the URL of the Archive file that contains the plugin entry |
| ISiteContentProvider provider = getFeature().getSite().getSiteContentProvider(); |
| fileURL = provider.getArchiveReference(getPathID(nonPluginEntry)); |
| |
| String fileString = fileURL.getFile(); |
| File nonPluginData = new File(fileString); |
| if (!nonPluginData.exists()) |
| throw Utilities.newCoreException( |
| NLS.bind(Messages.FeatureExecutableContentProvider_FileDoesNotExist, (new String[] { fileString })), |
| null); |
| |
| try { |
| result[0] = |
| new ContentReference(nonPluginEntry.getIdentifier(), nonPluginData.toURL()); |
| } catch (MalformedURLException e) { |
| throw Utilities.newCoreException( |
| NLS.bind(Messages.FeatureExecutableContentProvider_UnableToRetrieveNonPluginEntry, (new String[] { nonPluginEntry.getIdentifier().toString() })), |
| e); |
| } |
| return result; |
| } |
| |
| /* |
| * @see IFeatureContentProvider#getFeatureEntryArchiveReferences() |
| */ |
| public ContentReference[] getFeatureEntryArchiveReferences(InstallMonitor monitor) |
| throws CoreException { |
| ContentReference[] contentReferences = new ContentReference[1]; |
| contentReferences[0] = new ContentReference(null, getURL()); |
| return contentReferences; |
| } |
| |
| /* |
| * @see IFeatureContentProvider#getFeatureEntryArchivesContentReferences() |
| */ |
| public ContentReference[] getFeatureEntryContentReferences(InstallMonitor monitor) |
| throws CoreException { |
| ContentReference[] result = new ContentReference[0]; |
| try { |
| File featureDir = new File(getFeaturePath()); |
| List files = getFiles(featureDir); |
| result = new ContentReference[files.size()]; |
| for (int i = 0; i < result.length; i++) { |
| File currentFile = (File) files.get(i); |
| result[i] = new ContentReference(currentFile.getName(), currentFile.toURL()); |
| } |
| } catch (IOException e) { |
| throw Utilities.newCoreException( |
| NLS.bind(Messages.FeatureExecutableContentProvider_UnableToRetrieveFeatureEntry, (new String[] { getFeature().getVersionedIdentifier().toString() })), |
| e); |
| } |
| return result; |
| } |
| |
| /* |
| * @see IFeatureContentProvider#getPluginEntryContentReferences(IPluginEntry) |
| */ |
| public ContentReference[] getPluginEntryContentReferences( |
| IPluginEntry pluginEntry, |
| InstallMonitor monitor) |
| throws CoreException { |
| |
| ContentReference[] references = getPluginEntryArchiveReferences(pluginEntry, monitor); |
| ContentReference[] result = new ContentReference[0]; |
| |
| try { |
| if (references[0] instanceof JarContentReference) { |
| result = ((JarContentReference)references[0]).peek(null, monitor); |
| } else { |
| // return the list of all subdirectories |
| File pluginDir = new File(getPath(pluginEntry)); |
| URL pluginURL = pluginDir.toURL(); |
| List files = getFiles(pluginDir); |
| result = new ContentReference[files.size()]; |
| for (int i = 0; i < result.length; i++) { |
| File currentFile = (File) files.get(i); |
| String relativeString = UpdateManagerUtils.getURLAsString(pluginURL, currentFile.toURL()); |
| result[i] = new ContentReference(relativeString, currentFile.toURL()); |
| } |
| } |
| } catch (IOException e) { |
| throw Utilities.newCoreException( |
| Messages.FeatureExecutableContentProvider_UnableToRetriveArchiveContentRef |
| + pluginEntry.getVersionedIdentifier().toString(), |
| e); |
| } |
| |
| //[20866] we did not preserve executable bit |
| validatePermissions(result); |
| |
| return result; |
| } |
| } |