package org.erlide.backend.debug.model;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.eclipse.debug.core.sourcelookup.ISourceContainerType;
import org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer;
import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
public class ErlangOtpSourceContainer extends CompositeSourceContainer {
private final IPath otpHome;
public ErlangOtpSourceContainer(final IPath otpHome) {
this.otpHome = otpHome;
}
@Override
public String getName() {
return otpHome.toString();
}
private int versionFromName(final String name) {
final String[] parts = name.split("-");
if (parts.length < 2) {
return 0;
}
final String[] digits = parts[parts.length - 1].split("\\.");
int r = 0, f = 100000000;
for (final String d : digits) {
r += Integer.parseInt(d) * f;
f /= 100;
}
return r;
}
private String highestVersion(final File directory, final String prefix) {
final String candidates[] = directory.list(new FilenameFilter() {
@Override
public boolean accept(final File dir, final String name) {
return name.startsWith(prefix);
}
});
if (candidates.length == 0) {
return null;
}
String r = candidates[0];
int v = 0;
for (final String candidate : candidates) {
final int version = versionFromName(candidate);
if (version > v) {
v = version;
r = candidate;
}
}
return r;
}
private Set<String> modules(final File directory) {
final Set<String> r = new TreeSet<>();
final String n[] = directory.list();
for (final String f : n) {
final String[] parts = f.split("-");
if (parts.length > 1) {
r.add(parts[0]);
}
}
return r;
}
@Override
public ISourceContainerType getType() {
// FIXME implement this properly!
return new ISourceContainerType() {
@Override
public String getMemento(final ISourceContainer container)
throws CoreException {
return null;
}
@Override
public ISourceContainer createSourceContainer(final String memento)
throws CoreException {
return null;
}
@Override
public String getName() {
return null;
}
@Override
public String getId() {
return null;
}
@Override
public String getDescription() {
return null;
}
};
}
@Override
protected ISourceContainer[] createSourceContainers() throws CoreException {
final IPath lib = otpHome.addTrailingSeparator().append("lib")
.addTrailingSeparator();
final Set<String> moduleNames = modules(lib.toFile());
final List<IPath> moduleDirs = new ArrayList<>();
for (final String moduleName : moduleNames) {
final String h = highestVersion(lib.toFile(), moduleName);
if (h != null) {
moduleDirs.add(lib.addTrailingSeparator().append(h));
}
}
final List<ISourceContainer> r = new ArrayList<>();
for (final IPath dir : moduleDirs) {
r.add(new DirectorySourceContainer(dir.addTrailingSeparator().append("src"),
false));
}
return r.toArray(new ISourceContainer[r.size()]);
}
}