package com.constellio.model.services.contents;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.constellio.data.utils.KeyListMap;
import com.constellio.model.entities.records.ParsedContent;
public class ParsedContentConverter {
private static String SEPARATOR = "----------";
public String convertToString(ParsedContent parsedContent) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(parsedContent.getLanguage() + "\n");
stringBuilder.append(parsedContent.getLength() + "\n");
stringBuilder.append(parsedContent.getMimeType() + "\n");
for (Entry<String, Object> mapEntry : parsedContent.getProperties().entrySet()) {
String parameterKey = encodeString("" + mapEntry.getKey());
String parameterValue = encodeString("" + mapEntry.getValue());
stringBuilder.append(parameterKey + "=" + parameterValue + "\n");
}
for (Entry<String, List<String>> mapEntry : parsedContent.getStyles().entrySet()) {
for (String value : mapEntry.getValue()) {
String parameterKey = "style_" + encodeString("" + mapEntry.getKey());
String parameterValue = encodeString("" + value);
stringBuilder.append(parameterKey + "=" + parameterValue + "\n");
}
}
stringBuilder.append(SEPARATOR);
stringBuilder.append(encodeString(parsedContent.getParsedContent()));
return stringBuilder.toString();
}
private String encodeString(String value) {
return value == null ? null : value.replace("\n", "__<LB>__").replace("\r", "__<CR>__");
}
private String decodeString(String value) {
return value == null ? null : value.replace("__<LB>__", "\n").replace("__<CR>__", "\r");
}
public ParsedContent convertToParsedContent(String string) {
int separatorIndex = string.indexOf(SEPARATOR);
KeyListMap<String, String> styles = new KeyListMap<>();
Map<String, Object> parameters = new HashMap<>();
String[] attributeLines = string.substring(0, separatorIndex).split("\n");
String lang = attributeLines[0];
long length = Long.valueOf(attributeLines[1]);
String mime = attributeLines[2];
for (int i = 3; i < attributeLines.length; i++) {
String attributeLine = attributeLines[i];
int equalSignIndex = attributeLine.indexOf("=");
String key = decodeString(attributeLine.substring(0, equalSignIndex));
String value = decodeString(attributeLine.substring(equalSignIndex + 1));
if (key.startsWith("style_")) {
styles.add(key.substring(6), value);
} else if (key.contains("List:")) {
putStringListInHashMap(parameters, key, value);
} else {
parameters.put(key, value);
}
}
String parsedContent = decodeString(string.substring(separatorIndex + SEPARATOR.length()));
return new ParsedContent(parsedContent, lang, mime, length, parameters, styles.getNestedMap());
}
private void putStringListInHashMap(Map<String, Object> parameters, String key, String value) {
value = value.substring(1, value.length() - 1);
String[] valuesAfterSplit = value.split(",");
List<String> valueList = new ArrayList<String>();
for (String aValue : valuesAfterSplit) {
valueList.add(aValue.trim());
}
parameters.put(key, valueList);
}
}