package com.constellio.app.ui.pages.search.criteria;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
import com.constellio.model.entities.schemas.ModifiableStructure;
import com.constellio.model.entities.schemas.StructureFactory;
public class FacetSelectionsFactory implements StructureFactory {
private static final String NULL = "~null~";
@Override
public ModifiableStructure build(String string) {
StringTokenizer stringTokenizer = new StringTokenizer(string, ":");
FacetSelections facetSelections = new FacetSelections();
facetSelections.setFacetField(readString(stringTokenizer));
facetSelections.setSelectedValues(readSet(stringTokenizer));
facetSelections.dirty = false;
return facetSelections;
}
@Override
public String toString(ModifiableStructure structure) {
FacetSelections facetSelections = (FacetSelections) structure;
StringBuilder stringBuilder = new StringBuilder();
writeString(stringBuilder, facetSelections.getFacetField() == null ?
NULL :
facetSelections.getFacetField());
if (facetSelections.getSelectedValues() != null) {
for (String selectedValue : facetSelections.getSelectedValues()) {
writeString(stringBuilder, selectedValue == null ?
NULL :
selectedValue);
}
} else {
writeString(stringBuilder, null);
}
return stringBuilder.toString();
}
private String readString(StringTokenizer stringTokenizer) {
String value = stringTokenizer.nextToken();
if (NULL.equals(value)) {
return null;
} else {
return value.replace("~~~", ":");
}
}
private Set<String> readSet(StringTokenizer stringTokenizer) {
Set<String> selectedValues = new HashSet<>();
while (stringTokenizer.hasMoreTokens()) {
try {
String value = stringTokenizer.nextToken();
if (NULL.equals(value)) {
return selectedValues;
} else {
selectedValues.add(value.replace("~~~", ":"));
}
} catch (Exception e) {
return selectedValues;
}
}
return selectedValues;
}
private void writeString(StringBuilder stringBuilder, String value) {
if (stringBuilder.length() != 0) {
stringBuilder.append(":");
}
if (value == null) {
stringBuilder.append(NULL);
} else {
stringBuilder.append(value.replace(":", "~~~"));
}
}
}