package jetbrains.mps.jps.project;
import jetbrains.mps.extapi.persistence.FileBasedModelRoot;
import jetbrains.mps.jps.build.MPSCompilerUtil;
import jetbrains.mps.persistence.PersistenceRegistry;
import jetbrains.mps.persistence.java.library.JavaClassStubsModelRoot;
import jetbrains.mps.project.Solution;
import jetbrains.mps.project.structure.modules.SolutionDescriptor;
import org.jetbrains.jps.incremental.CompileContext;
import org.jetbrains.jps.incremental.messages.BuildMessage.Kind;
import org.jetbrains.jps.incremental.messages.CompilerMessage;
import org.jetbrains.jps.model.library.JpsLibrary;
import org.jetbrains.jps.model.library.JpsLibraryRoot;
import org.jetbrains.jps.model.library.JpsOrderRootType;
import org.jetbrains.mps.openapi.persistence.ModelRoot;
import org.jetbrains.mps.openapi.persistence.ModelRootFactory;
import org.jetbrains.mps.openapi.persistence.PersistenceFacade;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* danilla 12/18/12
*/
public class JpsLibSolution extends Solution {
private JpsLibrary myLibrary;
private JpsLibrary myIgnoreRootsFrom;
private CompileContext context;
public static final String JARSCHEME = "jar://";
public static final String FILESCHEME = "file://";
public JpsLibSolution(SolutionDescriptor descriptor, JpsLibrary lib, CompileContext ctx) {
super(descriptor, null);
myLibrary = lib;
context = ctx;
}
public JpsLibSolution(SolutionDescriptor descriptor, JpsLibrary lib, JpsLibrary ignoreRootsFrom, CompileContext ctx) {
super(descriptor, null);
myLibrary = lib;
myIgnoreRootsFrom = ignoreRootsFrom;
context = ctx;
}
@Override
protected Iterable<ModelRoot> loadRoots() {
List<ModelRoot> modelRoots = new ArrayList<ModelRoot>();
ModelRootFactory factory = PersistenceFacade.getInstance().getModelRootFactory(PersistenceRegistry.JAVA_CLASSES_ROOT);
Set<String> ignoredPaths = new HashSet<String>();
if (myIgnoreRootsFrom != null) {
for (JpsLibraryRoot libRoot: myIgnoreRootsFrom.getRoots(JpsOrderRootType.COMPILED)) {
ignoredPaths.add(getPath(libRoot));
}
}
for (JpsLibraryRoot libRoot: myLibrary.getRoots(JpsOrderRootType.COMPILED)) {
ModelRoot modelRoot = factory.create();
if (!(modelRoot instanceof JavaClassStubsModelRoot)) {
// log error
MPSCompilerUtil.debug(context, "@@@@ return null, " + getModuleName());
return null;
}
String path = getPath(libRoot);
if (ignoredPaths.contains(path)) continue;
MPSCompilerUtil.debug(context, "@@@@ path = " + path);
((JavaClassStubsModelRoot)modelRoot).setContentRoot(path);
((JavaClassStubsModelRoot)modelRoot).addFile(FileBasedModelRoot.SOURCE_ROOTS, path);
modelRoots.add(modelRoot);
}
return modelRoots;
}
private String getPath(JpsLibraryRoot libRoot) {
String path = libRoot.getUrl();
if (path.startsWith(JARSCHEME)) {
path = path.substring(JARSCHEME.length());
}
if (path.startsWith(FILESCHEME)) {
path = path.substring(FILESCHEME.length());
}
if (path.endsWith("!/")) {
path = path.substring(0, path.length() - 2);
}
return path;
}
public String toString() {
return getModuleName() + " [ jps_lib_solution]";
}
}