package jetbrains.mps.smodel.search;
/*Generated by MPS */
import jetbrains.mps.cache.AbstractCache;
import jetbrains.mps.cache.KeyProducer;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import jetbrains.mps.cache.CachesManager;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.annotations.NotNull;
import java.util.Set;
import org.jetbrains.mps.openapi.model.SModel;
import java.util.HashSet;
import java.util.List;
/**
* * Should be thread safe.
*/
/*package*/ class ConceptAndSuperConceptsCache extends AbstractCache {
private static final KeyProducer keyProducer = new KeyProducer();
private static final Logger LOG = LogManager.getLogger(ConceptAndSuperConceptsCache.class);
private static final CachesManager.CacheCreator<SNode> CREATOR = new CachesManager.CacheCreator<SNode>() {
@Override
public AbstractCache create(Object key, SNode element) {
return new ConceptAndSuperConceptsCache(key, element);
}
};
@NotNull
private SNode myTopConcept;
protected ConceptAndSuperConceptsCache(Object key, SNode topConcept) {
super(key);
myTopConcept = topConcept;
}
@Override
public Set<SModel> getDependsOnModels(Object element) {
Set<SModel> dependsOnModel = new HashSet<SModel>();
for (SNode concept : getConcepts()) {
// http://youtrack.jetbrains.net/issue/MPS-8362
// http://youtrack.jetbrains.net/issue/MPS-8556
SModel descriptor = concept.getModel();
assert descriptor != null;
dependsOnModel.add(descriptor);
}
return dependsOnModel;
}
@NotNull
public SNode getTopConcept() {
return myTopConcept;
}
public SNode[] getConcepts() {
Datasets.ConceptsDataSet dataSet = (Datasets.ConceptsDataSet) getDataSet(Datasets.ConceptsDataSet.ID, Datasets.CONCEPTS_CACHE_CREATOR);
return dataSet.getConcepts();
}
public SNode getPropertyDeclarationByName(String name) {
Datasets.PropertyDeclarationsDataSet dataSet = (Datasets.PropertyDeclarationsDataSet) getDataSet(Datasets.PropertyDeclarationsDataSet.ID, Datasets.PROPDECL_CACHE_CREATOR);
return dataSet.getPropertyDeclarationByName(name);
}
public List<SNode> getPropertyDeclarations() {
Datasets.PropertyDeclarationsDataSet dataSet = (Datasets.PropertyDeclarationsDataSet) getDataSet(Datasets.PropertyDeclarationsDataSet.ID, Datasets.PROPDECL_CACHE_CREATOR);
return dataSet.getPropertyDeclarations();
}
public SNode getLinkDeclarationByRole(String role) {
Datasets.LinkDeclarationsDataSet dataSet = (Datasets.LinkDeclarationsDataSet) getDataSet(Datasets.LinkDeclarationsDataSet.ID, Datasets.LINKDECL_CACHE_CREATOR);
return dataSet.getLinkDeclarationByRole(role);
}
public SNode getMostSpecificLinkDeclarationByRole(String role) {
Datasets.LinkDeclarationsDataSet dataSet = (Datasets.LinkDeclarationsDataSet) getDataSet(Datasets.LinkDeclarationsDataSet.ID, Datasets.LINKDECL_CACHE_CREATOR);
return dataSet.getMostSpecificLinkDeclarationByRole(role);
}
public List<SNode> getLinkDeclarationsExcludingOverridden() {
Datasets.LinkDeclarationsDataSet dataSet = (Datasets.LinkDeclarationsDataSet) getDataSet(Datasets.LinkDeclarationsDataSet.ID, Datasets.LINKDECL_CACHE_CREATOR);
return dataSet.getLinkDeclarationsExcludingOverridden();
}
public static ConceptAndSuperConceptsCache getInstance(SNode topConcept) {
if (topConcept == null) {
return null;
}
Object key = keyProducer.createKey(topConcept);
return (ConceptAndSuperConceptsCache) CachesManager.getInstance().getCache(key, topConcept, CREATOR);
}
}