package jetbrains.mps.smodel.persistence.def.v7;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import org.jetbrains.mps.openapi.model.SModelReference;
import java.util.Map;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import java.util.HashMap;
import jetbrains.mps.smodel.SModel;
import org.apache.log4j.Level;
import jetbrains.mps.vcspersistence.VCSPersistenceUtil;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.util.Pair;
import org.jetbrains.mps.openapi.model.SNodeReference;
import org.jetbrains.mps.openapi.model.SNodeId;
import jetbrains.mps.smodel.SNodePointer;
public class ReadHelper {
private static final Logger LOG = LogManager.getLogger(ReadHelper.class);
public static final char MODEL_SEPARATOR_CHAR = '.';
public static final String DYNAMIC_REFERENCE_ID = "^";
private SModelReference myModelRef;
private Map<String, SModelReference> myModelByIx;
private int myMaxImportIndex = 0;
public ReadHelper(SModelReference modelRef) {
myModelByIx = MapSequence.fromMap(new HashMap<String, SModelReference>());
myModelRef = modelRef;
}
public void addModelRef(String index, SModelReference modelRef) {
MapSequence.fromMap(myModelByIx).put(index, modelRef);
}
public void addImportToModel(SModel model, String index, String modelUID, int version, boolean implicit) {
if (modelUID == null) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Error loading import element for index " + index + " in " + myModelRef);
}
return;
}
SModelReference modelRef = VCSPersistenceUtil.createModelReference(modelUID);
SModel.ImportElement elem = new SModel.ImportElement(modelRef, ++myMaxImportIndex, version);
if (implicit) {
model.getImplicitImportsSupport().addAdditionalModelVersion(elem);
} else {
model.addModelImport(elem);
}
addModelRef(index, modelRef);
}
public SModelReference getSModelReference(@NotNull String ix) {
return ((ix == null || ix.length() == 0) ? myModelRef : MapSequence.fromMap(myModelByIx).get(ix));
}
@NotNull
public Pair<Boolean, SNodeReference> readLink_internal(String src) {
// returns <true, xxx> - if src is Dynamic Reference
// [modelID.]nodeID | [modelID.]^
Pair<Boolean, SNodeReference> result = new Pair<Boolean, SNodeReference>(false, null);
if (src == null) {
return result;
}
int dotIndex = src.indexOf(MODEL_SEPARATOR_CHAR);
String text = decode(src.substring(dotIndex + 1, src.length()));
result.o1 = DYNAMIC_REFERENCE_ID.equals(text);
SModelReference modelRef = getSModelReference((dotIndex < 0 ? "" : src.substring(0, dotIndex)));
SNodeId nodeId = (result.o1 ? null : jetbrains.mps.smodel.SNodeId.fromString(text));
result.o2 = new SNodePointer(modelRef, nodeId);
return result;
}
public SNodeReference readLinkId(String src) {
// [modelID.]nodeID[:version] | [modelID.]^[:version]
return readLink_internal(src).o2;
}
public String getStubConceptQualifiedName(String type) {
String originalConcept = readType(type);
int lastDot = originalConcept.lastIndexOf('.');
if (lastDot == -1) {
return null;
}
return originalConcept.substring(0, lastDot + 1) + "Stub" + originalConcept.substring(lastDot + 1);
}
public String readType(String s) {
int ix = s.indexOf(MODEL_SEPARATOR_CHAR);
if (ix <= 0) {
// no model ID - fqName is here
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Broken reference to type=" + s + " in model " + myModelRef);
}
return s.substring(ix + 1);
}
SModelReference modelRef = getSModelReference(s.substring(0, ix));
if (modelRef == null) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("couldn't create node '" + s.substring(ix + 1) + "' : import for index [" + s.substring(0, ix) + "] not found");
}
return s.substring(ix + 1);
} else {
return modelRef.getName().getLongName() + '.' + s.substring(ix + 1);
}
}
public String readRole(String s) {
return s;
}
public String readName(String s) {
return s;
}
public static String decode(String s) {
return s.replace("%d", ".").replace("%c", ":").replace("%p", "%");
}
}