Copyright (c) 2000, 2015 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) 2000, 2015 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.jdt.launching.sourcelookup.containers; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant; import org.eclipse.debug.core.sourcelookup.ISourceContainer; import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector; import org.eclipse.debug.core.sourcelookup.containers.ArchiveSourceContainer; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.debug.core.JavaDebugUtils;
A source lookup participant that searches for Java source code.

This class may be instantiated.

Since:3.0
@noextendThis class is not intended to be sub-classed by clients.
/** * A source lookup participant that searches for Java source code. * <p> * This class may be instantiated. * </p> * @since 3.0 * @noextend This class is not intended to be sub-classed by clients. */
public class JavaSourceLookupParticipant extends AbstractSourceLookupParticipant {
Map of delegate source containers for internal jars. Internal jars are translated to package fragment roots if possible.
/** * Map of delegate source containers for internal jars. * Internal jars are translated to package fragment roots * if possible. */
private Map<ISourceContainer, PackageFragmentRootSourceContainer> fDelegateContainers;
Returns the source name associated with the given object, or null if none.
Params:
  • object – an object with an IJavaStackFrame adapter, an IJavaValue or an IJavaType
Throws:
Returns:the source name associated with the given object, or null if none
/** * Returns the source name associated with the given object, or <code>null</code> * if none. * * @param object an object with an <code>IJavaStackFrame</code> adapter, an IJavaValue * or an IJavaType * @return the source name associated with the given object, or <code>null</code> * if none * @exception CoreException if unable to retrieve the source name */
@Override public String getSourceName(Object object) throws CoreException { return JavaDebugUtils.getSourceName(object); } /* (non-Javadoc) * @see org.eclipse.debug.internal.core.sourcelookup.ISourceLookupParticipant#dispose() */ @Override public void dispose() { Iterator<PackageFragmentRootSourceContainer> iterator = fDelegateContainers.values().iterator(); while (iterator.hasNext()) { ISourceContainer container = iterator.next(); container.dispose(); } fDelegateContainers = null; super.dispose(); } /* (non-Javadoc) * @see org.eclipse.debug.internal.core.sourcelookup.AbstractSourceLookupParticipant#getDelegateContainer(org.eclipse.debug.internal.core.sourcelookup.ISourceContainer) */ @Override protected ISourceContainer getDelegateContainer(ISourceContainer container) { ISourceContainer delegate = fDelegateContainers.get(container); if (delegate == null) { return container; } return delegate; } /* (non-Javadoc) * @see org.eclipse.debug.internal.core.sourcelookup.ISourceLookupParticipant#init(org.eclipse.debug.internal.core.sourcelookup.ISourceLookupDirector) */ @Override public void init(ISourceLookupDirector director) { super.init(director); fDelegateContainers = new HashMap<>(); } /* (non-Javadoc) * @see org.eclipse.debug.internal.core.sourcelookup.ISourceLookupParticipant#sourceContainersChanged(org.eclipse.debug.internal.core.sourcelookup.ISourceLookupDirector) */ @Override public void sourceContainersChanged(ISourceLookupDirector director) { // use package fragment roots in place of local archives, where they exist fDelegateContainers.clear(); ISourceContainer[] containers = director.getSourceContainers(); for (int i = 0; i < containers.length; i++) { ISourceContainer container = containers[i]; if (container.getType().getId().equals(ArchiveSourceContainer.TYPE_ID)) { IFile file = ((ArchiveSourceContainer)container).getFile(); IProject project = file.getProject(); IJavaProject javaProject = JavaCore.create(project); if (javaProject.exists()) { try { IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots(); for (int j = 0; j < roots.length; j++) { IPackageFragmentRoot root = roots[j]; if (file.equals(root.getUnderlyingResource())) { // the root was specified fDelegateContainers.put(container, new PackageFragmentRootSourceContainer(root)); } else { IPath path = root.getSourceAttachmentPath(); if (path != null) { if (file.getFullPath().equals(path)) { // a source attachment to a root was specified fDelegateContainers.put(container, new PackageFragmentRootSourceContainer(root)); } } } } } catch (JavaModelException e) { } } } } } }