package jetbrains.mps.smodel.persistence.def.v8;
/*Generated by MPS */
import jetbrains.mps.smodel.persistence.def.IHashProvider;
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import jetbrains.mps.generator.ModelDigestUtil;
import java.util.Map;
import java.util.HashMap;
import jetbrains.mps.smodel.persistence.def.XmlFastScanner;
import jetbrains.mps.extapi.model.GeneratableSModel;
public class HashProvider8 extends IHashProvider {
private static final Logger LOG = LogManager.getLogger(HashProvider8.class);
@Override
public String getHash(String content) {
return ModelDigestUtil.hashText(content);
}
@Override
public Map<String, String> getRootHashes(String content) {
Map<String, String> result = new HashMap<String, String>();
extractRootHashes(content, result);
return result;
}
private static void extractRootHashes(String content, Map<String, String> rootHashes) {
XmlFastScanner scanner = new XmlFastScanner(content.toCharArray());
int depth = 0;
int token;
int rootStart = -1;
String rootId = null;
boolean isEmpty = true;
while ((token = scanner.next()) != XmlFastScanner.EOI) {
switch (token) {
case XmlFastScanner.OPEN_TAG:
depth++;
if (depth == 2 && ModelPersistence8.ROOT_NODE.equals(scanner.getName())) {
rootStart = scanner.getTokenOffset();
rootId = IHashProvider.extractId(scanner.token());
if (rootId != null && isEmpty) {
rootHashes.put(GeneratableSModel.HEADER, ModelDigestUtil.hashText(scanner.getText(0, rootStart)));
isEmpty = false;
}
}
break;
case XmlFastScanner.SIMPLE_TAG:
if (depth == 1 && ModelPersistence8.ROOT_NODE.equals(scanner.getName())) {
rootId = IHashProvider.extractId(scanner.token());
if (rootId != null) {
String s = scanner.getText(scanner.getTokenOffset(), scanner.getOffset());
rootHashes.put(rootId, ModelDigestUtil.hashText(s));
}
}
break;
case XmlFastScanner.CLOSE_TAG:
if (depth == 2) {
if (rootId != null && ModelPersistence8.ROOT_NODE.equals(scanner.getName())) {
String s = scanner.getText(rootStart, scanner.getOffset());
rootHashes.put(rootId, ModelDigestUtil.hashText(s));
}
rootStart = -1;
rootId = null;
}
depth--;
break;
default:
}
}
if (depth != 0) {
LOG.error("xml: bad data");
}
if (isEmpty) {
rootHashes.put(GeneratableSModel.HEADER, ModelDigestUtil.hashText(content));
}
}
}