Copyright (c) 2004, 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) 2004, 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 org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainer;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.launching.LaunchingPlugin;
Package fragment root source container. Represents an archive
or folder in the Java model containing class files, with a possible
source attachment.
This class may be instantiated.
Since: 3.0 @noextend This class is not intended to be subclassed by clients.
/**
* Package fragment root source container. Represents an archive
* or folder in the Java model containing class files, with a possible
* source attachment.
* <p>
* This class may be instantiated.
* </p>
*
* @since 3.0
* @noextend This class is not intended to be subclassed by clients.
*/
public class PackageFragmentRootSourceContainer extends AbstractSourceContainer {
private IPackageFragmentRoot fRoot;
Unique identifier for Java project source container type
(value org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot
).
/**
* Unique identifier for Java project source container type
* (value <code>org.eclipse.jdt.launching.sourceContainer.packageFragmentRoot</code>).
*/
public static final String TYPE_ID = LaunchingPlugin.getUniqueIdentifier() + ".sourceContainer.packageFragmentRoot"; //$NON-NLS-1$
Constructs a new package fragment root source container on the
given root. The root must be of kind K_BINARY
.
Params: - root – package fragment root
/**
* Constructs a new package fragment root source container on the
* given root. The root must be of kind <code>K_BINARY</code>.
*
* @param root package fragment root
*/
public PackageFragmentRootSourceContainer(IPackageFragmentRoot root) {
fRoot = root;
}
/* (non-Javadoc)
* @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#findSourceElements(java.lang.String)
*/
@Override
public Object[] findSourceElements(String name) throws CoreException {
// look for a class file
int index = name.lastIndexOf('.');
String typeName = name;
if (index >= 0) {
// remove file type suffix
typeName = typeName.substring(0, index);
}
typeName = typeName.replace('/', '.');
typeName = typeName.replace('\\', '.');
index = typeName.lastIndexOf('.');
String packageName = ""; //$NON-NLS-1$
if (index >= 0) {
packageName = typeName.substring(0, index);
typeName = typeName.substring(index + 1);
}
IPackageFragment fragment = fRoot.getPackageFragment(packageName);
if (fragment.exists()) {
switch (fragment.getKind()) {
case IPackageFragmentRoot.K_BINARY:
IClassFile file = fragment.getClassFile(typeName + ".class"); //$NON-NLS-1$
if (file.exists()) {
return new Object[]{file};
}
break;
case IPackageFragmentRoot.K_SOURCE:
String[] extensions = JavaCore.getJavaLikeExtensions();
for (int i = 0; i < extensions.length; i++) {
String ext = extensions[i];
ICompilationUnit unit = fragment.getCompilationUnit(typeName + '.' + ext);
if (unit.exists()) {
return new Object[]{unit};
}
}
break;
}
}
return EMPTY;
}
/* (non-Javadoc)
* @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#getName()
*/
@Override
public String getName() {
return fRoot.getElementName();
}
/* (non-Javadoc)
* @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#getType()
*/
@Override
public ISourceContainerType getType() {
return getSourceContainerType(TYPE_ID);
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
return obj instanceof PackageFragmentRootSourceContainer &&
((PackageFragmentRootSourceContainer)obj).getPackageFragmentRoot().equals(getPackageFragmentRoot());
}
Returns the package fragment root this container searches for source.
Returns: the package fragment root this container searches for source
/**
* Returns the package fragment root this container searches for source.
*
* @return the package fragment root this container searches for source
*/
public IPackageFragmentRoot getPackageFragmentRoot() {
return fRoot;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return fRoot.hashCode();
}
/* (non-Javadoc)
* @see org.eclipse.debug.internal.core.sourcelookup.ISourceContainer#getPath()
*/
public IPath getPath() {
return getPackageFragmentRoot().getPath();
}
}