Copyright (c) 2003, 2018 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation
/******************************************************************************* * Copyright (c) 2003, 2018 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
package org.eclipse.debug.internal.core.sourcelookup; import java.io.IOException; import java.util.HashMap; import java.util.zip.ZipFile; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchesListener2;
Utility and supporting methods for source location. Most of these utilities should be migrated to the DebugPlugin and LanuchManager when this facility becomes public API.
See Also:
  • AbstractSourceLookupDirector
Since:3.0
/** * Utility and supporting methods for source location. Most of these * utilities should be migrated to the DebugPlugin and LanuchManager * when this facility becomes public API. * * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector * @since 3.0 */
public class SourceLookupUtils {
Cache of shared zip files. Zip files are closed when this class's plug-in is shutdown, when a project is about to be closed or deleted, when a launch is removed, and when a debug target or process terminates.
/** * Cache of shared zip files. Zip files are closed * when this class's plug-in is shutdown, when a project * is about to be closed or deleted, when a launch is * removed, and when a debug target or process terminates. */
private static HashMap<String, ZipFile> fgZipFileCache = new HashMap<>(5); private static ArchiveCleaner fgCleaner = null;
Returns a zip file with the given name
Params:
  • name – zip file name
Throws:
  • IOException – if unable to create the specified zip file
Returns:The zip file with the given name
/** * Returns a zip file with the given name * * @param name zip file name * @return The zip file with the given name * @exception IOException if unable to create the specified zip * file */
public static ZipFile getZipFile(String name) throws IOException { synchronized (fgZipFileCache) { if (fgCleaner == null) { fgCleaner = new ArchiveCleaner(); DebugPlugin.getDefault().getLaunchManager().addLaunchListener(fgCleaner); ResourcesPlugin.getWorkspace().addResourceChangeListener(fgCleaner, IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.PRE_CLOSE); } ZipFile zip = fgZipFileCache.get(name); if (zip == null) { zip = new ZipFile(name); fgZipFileCache.put(name, zip); } return zip; } }
Closes all zip files that have been opened, and removes them from the zip file cache. This method is only to be called by the debug plug-in.
/** * Closes all zip files that have been opened, * and removes them from the zip file cache. * This method is only to be called by the debug * plug-in. */
public static void closeArchives() { synchronized (fgZipFileCache) { for (ZipFile file : fgZipFileCache.values()) { synchronized (file) { try { file.close(); } catch (IOException e) { DebugPlugin.log(e); } } } fgZipFileCache.clear(); } }
Called when the debug plug-in shuts down.
/** * Called when the debug plug-in shuts down. */
public static void shutdown() { closeArchives(); if (fgCleaner != null) { DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(fgCleaner); ResourcesPlugin.getWorkspace().removeResourceChangeListener(fgCleaner); } }
Clears the cache of open zip files when a launch terminates, is removed, or when a project is about to be deleted or closed.
/** * Clears the cache of open zip files when a launch terminates, * is removed, or when a project is about to be deleted or closed. */
static class ArchiveCleaner implements IResourceChangeListener, ILaunchesListener2 { @Override public void launchesRemoved(ILaunch[] launches) { for (ILaunch launch : launches) { if (!launch.isTerminated()) { SourceLookupUtils.closeArchives(); return; } } } @Override public void launchesAdded(ILaunch[] launches) { } @Override public void launchesChanged(ILaunch[] launches) { } @Override public void resourceChanged(IResourceChangeEvent event) { SourceLookupUtils.closeArchives(); } @Override public void launchesTerminated(ILaunch[] launches) { SourceLookupUtils.closeArchives(); } } }