package com.faforever.client.map; import com.faforever.client.preferences.gson.PropertyTypeAdapter; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.InstanceCreator; import javafx.beans.property.Property; import org.apache.lucene.search.suggest.InputIterator; import org.apache.lucene.util.BytesRef; import org.apache.maven.artifact.versioning.ComparableVersion; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; import java.nio.charset.StandardCharsets; import java.util.Iterator; import java.util.Set; public class MapInfoBeanIterator implements InputIterator { private final Gson gson; private MapBean currentMapBean; private Iterator<MapBean> mapIterator; public MapInfoBeanIterator(Iterator<MapBean> mapIterator) { this.mapIterator = mapIterator; this.gson = new GsonBuilder() .registerTypeHierarchyAdapter(Property.class, PropertyTypeAdapter.INSTANCE) .registerTypeAdapter(ComparableVersion.Item.class, (InstanceCreator<ComparableVersion.Item>) type -> new ComparableVersion.Item() { @Override public int compareTo(ComparableVersion.Item item) { return 0; } @Override public int getType() { return 0; } @Override public boolean isNull() { return false; } }) .registerTypeAdapter(ComparableVersion.class, (InstanceCreator<ComparableVersion>) type -> new ComparableVersion("0")) .registerTypeAdapter(MapSize.class, (InstanceCreator<MapSize>) type -> new MapSize(0, 0)) .create(); } @Override public long weight() { return (long) (currentMapBean.getDownloads() * currentMapBean.getPlays() * currentMapBean.getRating()); } @Override public BytesRef payload() { try { return new BytesRef(serialize(currentMapBean)); } catch (IOException e) { throw new RuntimeException(e); } } @Override public boolean hasPayloads() { return true; } @Override public Set<BytesRef> contexts() { return null; } @Override public boolean hasContexts() { return false; } private byte[] serialize(MapBean mapBean) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); try (Writer writer = new OutputStreamWriter(byteArrayOutputStream, StandardCharsets.UTF_8)) { gson.toJson(mapBean, writer); } return byteArrayOutputStream.toByteArray(); } public BytesRef next() { if (!mapIterator.hasNext()) { return null; } currentMapBean = mapIterator.next(); return new BytesRef((currentMapBean.getDisplayName() + currentMapBean.getFolderName()).getBytes(StandardCharsets.UTF_8)); } public MapBean deserialize(byte[] bytes) { try (Reader reader = new InputStreamReader(new ByteArrayInputStream(bytes), StandardCharsets.UTF_8)) { return gson.fromJson(reader, MapBean.class); } catch (IOException e) { throw new RuntimeException(e); } } }