package jetbrains.mps.build.mps.util;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import java.util.List;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.Queue;
import jetbrains.mps.internal.collections.runtime.QueueSequence;
import java.util.LinkedList;
import java.util.Set;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.HashSet;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import org.jetbrains.mps.openapi.model.SReference;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import org.apache.log4j.Level;
import org.jetbrains.mps.openapi.language.SLanguage;
import org.jetbrains.mps.openapi.module.SModuleReference;
import org.jetbrains.mps.openapi.model.SModelReference;
public class VisibleModules {
private static final Logger LOG = LogManager.getLogger(VisibleModules.class);
private List<SNode> allModules = new ArrayList<SNode>();
private Map<String, SNode> moduleByName = new HashMap<String, SNode>();
private Map<String, SNode> moduleById = new HashMap<String, SNode>();
private SNode project;
public VisibleModules(SNode project) {
this.project = project;
}
public void collect() {
Queue<SNode> queue = QueueSequence.fromQueue(new LinkedList<SNode>());
QueueSequence.fromQueue(queue).addLastElement(project);
Set<SNode> seen = SetSequence.fromSet(new HashSet<SNode>());
while (QueueSequence.fromQueue(queue).isNotEmpty()) {
SNode project = QueueSequence.fromQueue(queue).removeFirstElement();
for (SNode dep : SLinkOperations.getChildren(project, MetaAdapterFactory.getContainmentLink(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x4df58c6f18f84a13L, 0x4df58c6f18f84a25L, "dependencies"))) {
SNode projectDependency = SNodeOperations.as(dep, MetaAdapterFactory.getConcept(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x454b730dd908c220L, "jetbrains.mps.build.structure.BuildProjectDependency"));
if (projectDependency == null) {
continue;
}
SNode depproj = SLinkOperations.getTarget(projectDependency, MetaAdapterFactory.getReferenceLink(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x454b730dd908c220L, 0x4df58c6f18f84a24L, "script"));
if ((depproj == null)) {
SReference ref = SNodeOperations.getReference(projectDependency, MetaAdapterFactory.getReferenceLink(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x454b730dd908c220L, 0x4df58c6f18f84a24L, "script"));
report("cannot find dependency build script " + SLinkOperations.getResolveInfo(ref) + " in model " + check_xuwpka_a0a1a4a1a3a5(ref.getTargetSModelReference()), projectDependency);
}
if (depproj != null && seen.add(depproj)) {
QueueSequence.fromQueue(queue).addLastElement(depproj);
}
}
ListSequence.fromList(allModules).addSequence(ListSequence.fromList(SNodeOperations.getNodeDescendants(project, MetaAdapterFactory.getConcept(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, "jetbrains.mps.build.mps.structure.BuildMps_AbstractModule"), false, new SAbstractConcept[]{})));
}
for (SNode module : allModules) {
SNode currProj = SNodeOperations.getNodeAncestor(module, MetaAdapterFactory.getConcept(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x4df58c6f18f84a13L, "jetbrains.mps.build.structure.BuildProject"), false, false);
if (moduleById.containsKey(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")))) {
SNode other = moduleById.get(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")));
SNode otherProj = SNodeOperations.getNodeAncestor(other, MetaAdapterFactory.getConcept(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x4df58c6f18f84a13L, "jetbrains.mps.build.structure.BuildProject"), false, false);
report("found two modules with the same id: " + SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")) + ". First module " + SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")) + " from project " + currProj + ", second module " + SPropertyOperations.getString(other, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")) + " from project " + otherProj, module);
}
moduleById.put(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")), module);
if (moduleByName.containsKey(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")))) {
SNode other = moduleByName.get(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")));
SNode otherProj = SNodeOperations.getNodeAncestor(other, MetaAdapterFactory.getConcept(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x4df58c6f18f84a13L, "jetbrains.mps.build.structure.BuildProject"), false, false);
report("found two modules with the same name: " + SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")) + ". First module " + SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")) + " from project " + currProj + ", second module " + SPropertyOperations.getString(other, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")) + " from project " + otherProj, other);
}
moduleByName.put(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")), module);
}
}
protected void report(String message, SNode anchor) {
// FIXME use (share) reported interface from ModuleChecker to report directly to gencontext, if available
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error(message);
}
}
public SNode resolve(SLanguage language) {
return resolve(language.getQualifiedName(), null);
}
public SNode resolve(SModuleReference moduleRef) {
String targetName = moduleRef.getModuleName();
return this.resolve(targetName, moduleRef.getModuleId().toString());
}
public SNode resolveLanguage(SModuleReference moduleRef) {
return SNodeOperations.as(resolve(moduleRef), MetaAdapterFactory.getConcept(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x2c446791464290f8L, "jetbrains.mps.build.mps.structure.BuildMps_Language"));
}
public SNode resolveGenerator(SModuleReference moduleRef) {
return SNodeOperations.as(resolve(moduleRef), MetaAdapterFactory.getConcept(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4c6db07d2e56a8b4L, "jetbrains.mps.build.mps.structure.BuildMps_Generator"));
}
public SNode resolve(String moduleName, String moduleId) {
SNode result = null;
if (moduleId != null) {
result = moduleById.get(moduleId);
}
if (result == null && moduleName != null) {
result = moduleByName.get(moduleName);
}
return result;
}
private static String check_xuwpka_a0a1a4a1a3a5(SModelReference checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getModelName();
}
return null;
}
}