package jetbrains.mps.ide.java.sourceStubs;
/*Generated by MPS */
import jetbrains.mps.extapi.persistence.FileBasedModelRoot;
import jetbrains.mps.extapi.persistence.CopyableModelRoot;
import org.apache.log4j.Logger;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SModelId;
import jetbrains.mps.vfs.IFile;
import org.jetbrains.mps.openapi.persistence.Memento;
import jetbrains.mps.util.FileUtil;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import java.util.Collection;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.Set;
import java.util.HashSet;
import jetbrains.mps.java.stub.JavaPackageNameStub;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.extapi.persistence.CopyNotSupportedException;
public class JavaSourceStubModelRoot extends FileBasedModelRoot implements CopyableModelRoot<JavaSourceStubModelRoot> {
private static final Logger LOG = Logger.getLogger(JavaSourceStubModelRoot.class);
private static final String PATH_KEY = "path";
public JavaSourceStubModelRoot() {
super(new String[]{SOURCE_ROOTS});
}
@Override
public String getType() {
return "java_source_stubs";
}
@Override
public SModel getModel(SModelId id) {
// TODO
return null;
}
protected MPSJavaSrcDataSource newDataSource(IFile dir) {
return new MPSJavaSrcDataSource(dir, this);
}
@Override
public void load(Memento memento) {
super.load(memento);
if (memento.get("path") == null) {
return;
}
String path = FileUtil.stripLastSlashes(memento.get("path"));
assert path != null;
IFile file = getFileSystem().getFile(path);
if (file.getParent() != null) {
path = file.getParent().getPath();
}
setContentRoot(path);
addFile(SOURCE_ROOTS, memento.get(PATH_KEY));
}
@Override
@NotNull
public Iterable<SModel> loadModels() {
List<SModel> result = ListSequence.fromList(new ArrayList<SModel>());
final Collection<String> files = getFiles(SOURCE_ROOTS);
for (String file : files) {
ListSequence.fromList(result).addSequence(SetSequence.fromSet(getModels(getFileSystem().getFile(file))));
}
return result;
}
private Set<SModel> getModels(IFile dir) {
Set<SModel> models = SetSequence.fromSet(new HashSet<SModel>());
MPSJavaSrcDataSource dataSource = newDataSource(dir);
if (dataSource.hasJavaFiles()) {
String pkg = dataSource.guessPackage();
if (pkg != null) {
JavaPackageNameStub packStub = new JavaPackageNameStub(pkg);
// default package is not handled by MPS; classes in default pkg can be referenced only
// from the default pkg as well, but there are no models that correspond to it
if (!(packStub.isDefaultPackage())) {
JavaSourceStubModelDescriptor model = new JavaSourceStubModelDescriptor(packStub.asModelReference(getModule().getModuleReference()), dataSource);
SetSequence.fromSet(models).addElement(model);
}
} else {
LOG.error("Could not create java source stub model for directory " + dir.getPath() + " (failed to guess package name)");
}
}
// should be one line: dir.getChildren().where cannot be entered...
Iterable<IFile> children = dir.getChildren();
Iterable<IFile> subDirs = Sequence.fromIterable(children).where(new IWhereFilter<IFile>() {
public boolean accept(IFile it) {
return it.isDirectory();
}
});
for (IFile subDir : Sequence.fromIterable(subDirs)) {
Set<SModel> set = getModels(subDir);
SetSequence.fromSet(models).addSequence(SetSequence.fromSet(set));
}
return models;
}
@Override
public void copyTo(@NotNull JavaSourceStubModelRoot root) throws CopyNotSupportedException {
super.copyContentRootAndFiles(root);
}
@Override
public boolean canCreateModel(String string) {
return false;
}
@Override
public SModel createModel(String string) {
return null;
}
}