package com.faforever.client.mod; import com.faforever.client.preferences.gson.PropertyTypeAdapter; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import javafx.beans.property.Property; import org.apache.lucene.search.suggest.InputIterator; import org.apache.lucene.util.BytesRef; 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 ModInfoBeanIterator implements InputIterator { private final Gson gson; private ModInfoBean currentMod; private Iterator<ModInfoBean> modIterator; public ModInfoBeanIterator(Iterator<ModInfoBean> modIterator) { this.modIterator = modIterator; this.gson = new GsonBuilder() .registerTypeHierarchyAdapter(Property.class, PropertyTypeAdapter.INSTANCE) .create(); } @Override public long weight() { return currentMod.getDownloads() * currentMod.getLikes(); } @Override public BytesRef payload() { try { return new BytesRef(serialize(currentMod)); } 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(ModInfoBean modInfoBean) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); try (Writer writer = new OutputStreamWriter(byteArrayOutputStream, StandardCharsets.UTF_8)) { gson.toJson(modInfoBean, writer); } return byteArrayOutputStream.toByteArray(); } public BytesRef next() { if (!modIterator.hasNext()) { return null; } currentMod = modIterator.next(); return new BytesRef(currentMod.getName().getBytes(StandardCharsets.UTF_8)); } public ModInfoBean deserialize(byte[] bytes) { try (Reader reader = new InputStreamReader(new ByteArrayInputStream(bytes), StandardCharsets.UTF_8)) { return gson.fromJson(reader, ModInfoBean.class); } catch (IOException e) { throw new RuntimeException(e); } } }