package bndtools.launch;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.bndtools.api.ILogger;
import org.bndtools.api.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
import org.eclipse.debug.core.sourcelookup.ISourceLookupDirector;
import org.eclipse.debug.core.sourcelookup.containers.ArchiveSourceContainer;
import org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer;
import org.eclipse.debug.core.sourcelookup.containers.ExternalArchiveSourceContainer;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.sourcelookup.containers.JavaProjectSourceContainer;
import aQute.bnd.build.Container;
import aQute.bnd.build.Container.TYPE;
import aQute.bnd.build.Run;
import bndtools.central.Central;
import bndtools.launch.util.LaunchUtils;
public class BndDependencySourceContainer extends CompositeSourceContainer {
private static final ILogger logger = Logger.getLogger(BndDependencySourceContainer.class);
public static final String TYPE_ID = "org.bndtools.core.launch.sourceContainerTypes.bndDependencies";
private Run lastRun = null;
@Override
public boolean equals(Object obj) {
return obj instanceof BndDependencySourceContainer;
}
@Override
public int hashCode() {
return getClass().hashCode();
}
protected ILaunchConfiguration getLaunchConfiguration() {
ISourceLookupDirector director = getDirector();
if (director != null) {
return director.getLaunchConfiguration();
}
return null;
}
@Override
public String getName() {
return "Bnd Dependencies";
}
@Override
public ISourceContainerType getType() {
return getSourceContainerType(TYPE_ID);
}
@Override
protected ISourceContainer[] createSourceContainers() throws CoreException {
List<ISourceContainer> result = new LinkedList<ISourceContainer>();
ILaunchConfiguration config = getLaunchConfiguration();
Set<String> projectsAdded = new HashSet<>();
try {
if (lastRun != null) {
LaunchUtils.endRun(lastRun);
}
Run run = LaunchUtils.createRun(config);
if (run != null) {
Collection<Container> runbundles = run.getRunbundles();
for (Container runbundle : runbundles) {
if (runbundle.getType() == TYPE.PROJECT) {
String targetProjName = runbundle.getProject().getName();
if (projectsAdded.add(targetProjName)) {
IProject targetProj = ResourcesPlugin.getWorkspace().getRoot().getProject(targetProjName);
if (targetProj != null) {
IJavaProject targetJavaProj = JavaCore.create(targetProj);
result.add(new JavaProjectSourceContainer(targetJavaProj));
}
}
} else if (runbundle.getType() == TYPE.REPO) {
IPath bundlePath = Central.toPath(runbundle.getFile());
IFile bundleFile = null;
if (bundlePath != null) {
bundleFile = ResourcesPlugin.getWorkspace().getRoot().getFile(bundlePath);
}
if (bundleFile != null) {
ISourceContainer sourceContainer = null;
// check to see if this archive came from a repo that encodes the source project name
final String sourceProjectName = runbundle.getAttributes().get("sourceProjectName");
if (sourceProjectName != null) {
try {
IProject sourceProject = ResourcesPlugin.getWorkspace().getRoot().getProject(sourceProjectName);
if (sourceProject.exists()) {
IJavaProject javaSourceProject = JavaCore.create(sourceProject);
sourceContainer = new JavaProjectSourceContainer(javaSourceProject);
}
} catch (Exception e) {
logger.logError("Error getting source java project", e);
}
}
if (sourceContainer == null) {
// default to archive source container
sourceContainer = new ArchiveSourceContainer(bundleFile, false);
}
result.add(sourceContainer);
} else {
ExternalArchiveSourceContainer container = new ExternalArchiveSourceContainer(runbundle.getFile().toString(), false);
result.add(container);
}
}
}
lastRun = run;
}
} catch (Exception e) {
logger.logError("Error querying Bnd dependency source containers.", e);
}
return result.toArray(new ISourceContainer[0]);
}
@Override
public void dispose() {
super.dispose();
if (lastRun != null) {
LaunchUtils.endRun(lastRun);
lastRun = null;
}
}
}