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; } }