package jetbrains.mps.smodel.persistence.def.v4;
/*Generated by MPS */
import jetbrains.mps.smodel.persistence.def.IReferencePersister;
import jetbrains.mps.logging.Logger;
import org.apache.log4j.LogManager;
import org.jetbrains.mps.openapi.model.SNode;
import org.jdom.Element;
import jetbrains.mps.smodel.SModelVersionsInfo;
import jetbrains.mps.vcspersistence.VCSPersistenceSupport;
import org.jetbrains.mps.openapi.model.SReference;
import jetbrains.mps.smodel.SModel;
import jetbrains.mps.smodel.persistence.def.VisibleModelElements;
import org.jetbrains.mps.openapi.model.SModelReference;
import jetbrains.mps.vcspersistence.VCSPersistenceUtil;
import jetbrains.mps.util.SNodeOperations;
import jetbrains.mps.smodel.DynamicReference;
import jetbrains.mps.smodel.StaticReference;
import jetbrains.mps.smodel.SNodeId;
import org.jetbrains.annotations.Nullable;
public class ReferencePersister4 implements IReferencePersister {
private static final Logger LOG = Logger.wrap(LogManager.getLogger(ReferencePersister4.class));
protected SNode mySourceNode;
protected String myRole;
protected String myTargetId;
protected String myResolveInfo;
protected String myImportedModelInfo = "-1";
protected boolean myUseUIDs;
private boolean myNotImported;
@Override
public void fillFields(Element linkElement, SNode sourceNode, boolean useUIDs) {
fillFields(linkElement, sourceNode, useUIDs, new SModelVersionsInfo());
}
public void fillFields(Element linkElement, SNode sourceNode, boolean useUIDs, SModelVersionsInfo versionsInfo) {
fillFields(linkElement.getAttributeValue(VCSPersistenceSupport.ROLE), linkElement.getAttributeValue(VCSPersistenceSupport.RESOLVE_INFO), linkElement.getAttributeValue(VCSPersistenceSupport.TARGET_NODE_ID), sourceNode, useUIDs, versionsInfo);
}
public void fillFields(String role_, String resolveInfo, String targetNodeId_, SNode sourceNode, boolean useUIDs, SModelVersionsInfo versionsInfo) {
String role = VersionUtil.getLinkRole(role_, sourceNode, versionsInfo);
String attTargetNodeId = VersionUtil.getTargetNodeId(targetNodeId_, role, sourceNode, versionsInfo);
this.myUseUIDs = useUIDs;
this.mySourceNode = sourceNode;
this.myRole = role;
if (attTargetNodeId != null) {
ReferencePersister4.ReferenceTargetDescriptor targetDescriptor = parseAttTargetNodeId(attTargetNodeId, useUIDs);
this.myTargetId = targetDescriptor.targetInfo;
this.myImportedModelInfo = targetDescriptor.importedModelInfo;
this.myNotImported = targetDescriptor.notImported;
}
this.myResolveInfo = resolveInfo;
}
private ReferencePersister4.ReferenceTargetDescriptor parseAttTargetNodeId(String attTargetNodeId, boolean useUIDs) {
ReferencePersister4.ReferenceTargetDescriptor referenceTargetDescriptor = new ReferencePersister4.ReferenceTargetDescriptor();
int i;
if (useUIDs) {
i = attTargetNodeId.indexOf('#');
} else {
i = attTargetNodeId.indexOf('.');
}
if (i > 0) {
referenceTargetDescriptor.importedModelInfo = attTargetNodeId.substring(0, i);
String info = referenceTargetDescriptor.importedModelInfo;
if (info.endsWith("v")) {
referenceTargetDescriptor.notImported = true;
referenceTargetDescriptor.importedModelInfo = info.substring(0, info.length() - 1);
}
referenceTargetDescriptor.targetInfo = attTargetNodeId.substring(i + 1);
} else {
referenceTargetDescriptor.importedModelInfo = "-1";
referenceTargetDescriptor.targetInfo = attTargetNodeId;
}
return referenceTargetDescriptor;
}
@Override
public SNode getSourceNode() {
return mySourceNode;
}
@Override
public String getRole() {
return myRole;
}
@Override
public String getTargetId() {
return myTargetId;
}
@Override
public String getResolveInfo() {
return myResolveInfo;
}
@Override
public String getExtResolveInfo() {
return null;
}
private SReference createReferenceInModelDoNotAddToSourceNode(SModel model, VisibleModelElements visibleModelElements) {
SModelReference importedModelReference = model.getReference();
if (myUseUIDs) {
if (!(myImportedModelInfo.equals("-1"))) {
importedModelReference = VCSPersistenceUtil.createModelReference(myImportedModelInfo);
}
} else
if (getImportIndex() > -1) {
if (myNotImported) {
importedModelReference = visibleModelElements.getModelUID(getImportIndex());
} else {
importedModelReference = getImportedModelUID(model, getImportIndex());
}
if (importedModelReference == null) {
LOG.error("couldn't create reference '" + this.getRole() + "' from " + SNodeOperations.getDebugText(this.getSourceNode()) + " : import for index [" + getImportIndex() + "] not found");
return null;
}
}
if (this.getTargetId() == null) {
LOG.error("couldn't create reference '" + this.getRole() + "' from " + SNodeOperations.getDebugText(this.getSourceNode()) + " : target node id is null");
return null;
}
if (this.getTargetId().equals("^")) {
return new DynamicReference(this.getRole(), this.getSourceNode(), importedModelReference, this.getResolveInfo());
}
return new StaticReference(this.getRole(), this.getSourceNode(), importedModelReference, SNodeId.fromString(this.getTargetId()), this.getResolveInfo());
}
@Nullable
private static SModelReference getImportedModelUID(SModel sModel, int referenceID) {
for (SModel.ImportElement importElement : sModel.importedModels()) {
if (importElement.getReferenceID() == referenceID) {
return importElement.getModelReference();
}
}
return null;
}
@Override
public void createReferenceInModel(SModel model, VisibleModelElements visibleModelElements) {
SReference reference = createReferenceInModelDoNotAddToSourceNode(model, visibleModelElements);
if (reference != null) {
this.getSourceNode().setReference(reference.getRole(), reference);
}
}
@Override
public void saveReference(Element parentElement, SReference reference, boolean useUIDs, VisibleModelElements visibleModelElements) {
// no-op, we do not support serialization in old formats
}
@Override
public int getImportIndex() {
try {
return Integer.parseInt(myImportedModelInfo);
} catch (NumberFormatException e) {
return -1;
}
}
@SuppressWarnings(value = {"InstanceVariableNamingConvention"})
public static class ReferenceTargetDescriptor {
public boolean notImported = false;
public String targetInfo;
public String importedModelInfo;
}
@SuppressWarnings(value = {"InstanceVariableNamingConvention"})
protected static class ReferenceDescriptor {
public SNode sourceNode;
public String role;
public String resolveInfo;
public String targetNodeId;
}
}