From bc40c16000253cf213886aacb74d73bf6a047282 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 31 Oct 2018 13:55:03 +0100 Subject: [PATCH] Add possibility to safe site specific data Extend the json serialization to allow to write site specific data for each model. --- src/main/java/ctbrec/AbstractModel.java | 12 ++++ src/main/java/ctbrec/Model.java | 4 ++ src/main/java/ctbrec/io/ModelJsonAdapter.java | 70 +++++++++++-------- src/main/java/ctbrec/ui/JavaFxModel.java | 12 ++++ 4 files changed, 68 insertions(+), 30 deletions(-) diff --git a/src/main/java/ctbrec/AbstractModel.java b/src/main/java/ctbrec/AbstractModel.java index 267f9661..28220312 100644 --- a/src/main/java/ctbrec/AbstractModel.java +++ b/src/main/java/ctbrec/AbstractModel.java @@ -8,6 +8,8 @@ import java.util.concurrent.ExecutionException; import com.iheartradio.m3u8.ParseException; import com.iheartradio.m3u8.PlaylistException; +import com.squareup.moshi.JsonReader; +import com.squareup.moshi.JsonWriter; import ctbrec.recorder.download.StreamSource; @@ -93,6 +95,16 @@ public abstract class AbstractModel implements Model { return url; } + @Override + public void readSiteSpecificData(JsonReader reader) throws IOException { + // noop default implementation, can be overriden by concrete models + } + + @Override + public void writeSiteSpecificData(JsonWriter writer) throws IOException { + // noop default implementation, can be overriden by concrete models + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/ctbrec/Model.java b/src/main/java/ctbrec/Model.java index 68d9646b..2db582a3 100644 --- a/src/main/java/ctbrec/Model.java +++ b/src/main/java/ctbrec/Model.java @@ -6,6 +6,8 @@ import java.util.concurrent.ExecutionException; import com.iheartradio.m3u8.ParseException; import com.iheartradio.m3u8.PlaylistException; +import com.squareup.moshi.JsonReader; +import com.squareup.moshi.JsonWriter; import ctbrec.recorder.download.StreamSource; import ctbrec.sites.Site; @@ -35,4 +37,6 @@ public interface Model { public boolean unfollow() throws IOException; public void setSite(Site site); public Site getSite(); + public void writeSiteSpecificData(JsonWriter writer) throws IOException; + public void readSiteSpecificData(JsonReader reader) throws IOException; } \ No newline at end of file diff --git a/src/main/java/ctbrec/io/ModelJsonAdapter.java b/src/main/java/ctbrec/io/ModelJsonAdapter.java index fdaefc39..804c77fa 100644 --- a/src/main/java/ctbrec/io/ModelJsonAdapter.java +++ b/src/main/java/ctbrec/io/ModelJsonAdapter.java @@ -32,45 +32,51 @@ public class ModelJsonAdapter extends JsonAdapter { String url = null; String type = null; int streamUrlIndex = -1; + + Model model = null; while(reader.hasNext()) { - Token token = reader.peek(); - if(token == Token.NAME) { - String key = reader.nextName(); - if(key.equals("name")) { - name = reader.nextString(); - } else if(key.equals("description")) { - description = reader.nextString(); - } else if(key.equals("url")) { - url = reader.nextString(); - } else if(key.equals("type")) { - type = reader.nextString(); - } else if(key.equals("streamUrlIndex")) { - streamUrlIndex = reader.nextInt(); + try { + Token token = reader.peek(); + if(token == Token.NAME) { + String key = reader.nextName(); + if(key.equals("name")) { + name = reader.nextString(); + model.setName(name); + } else if(key.equals("description")) { + description = reader.nextString(); + model.setDescription(description); + } else if(key.equals("url")) { + url = reader.nextString(); + model.setUrl(url); + } else if(key.equals("type")) { + type = reader.nextString(); + Class modelClass = Class.forName(Optional.ofNullable(type).orElse(ChaturbateModel.class.getName())); + model = (Model) modelClass.newInstance(); + } else if(key.equals("streamUrlIndex")) { + streamUrlIndex = reader.nextInt(); + model.setStreamUrlIndex(streamUrlIndex); + } else if(key.equals("siteSpecific")) { + reader.beginObject(); + model.readSiteSpecificData(reader); + reader.endObject(); + } + } else { + reader.skipValue(); } - } else { - reader.skipValue(); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { + throw new IOException("Couldn't instantiate model class [" + type + "]", e); } } reader.endObject(); - try { - Class modelClass = Class.forName(Optional.ofNullable(type).orElse(ChaturbateModel.class.getName())); - Model model = (Model) modelClass.newInstance(); - model.setName(name); - model.setDescription(description); - model.setUrl(url); - model.setStreamUrlIndex(streamUrlIndex); - if(sites != null) { - for (Site site : sites) { - if(site.isSiteForModel(model)) { - model.setSite(site); - } + if(sites != null) { + for (Site site : sites) { + if(site.isSiteForModel(model)) { + model.setSite(site); } } - return model; - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { - throw new IOException("Couldn't instantiate model class [" + type + "]", e); } + return model; } @Override @@ -81,6 +87,10 @@ public class ModelJsonAdapter extends JsonAdapter { writeValueIfSet(writer, "description", model.getDescription()); writeValueIfSet(writer, "url", model.getUrl()); writer.name("streamUrlIndex").value(model.getStreamUrlIndex()); + writer.name("siteSpecific"); + writer.beginObject(); + model.writeSiteSpecificData(writer); + writer.endObject(); writer.endObject(); } diff --git a/src/main/java/ctbrec/ui/JavaFxModel.java b/src/main/java/ctbrec/ui/JavaFxModel.java index 1ede0c64..105da296 100644 --- a/src/main/java/ctbrec/ui/JavaFxModel.java +++ b/src/main/java/ctbrec/ui/JavaFxModel.java @@ -7,6 +7,8 @@ import java.util.concurrent.ExecutionException; import com.iheartradio.m3u8.ParseException; import com.iheartradio.m3u8.PlaylistException; +import com.squareup.moshi.JsonReader; +import com.squareup.moshi.JsonWriter; import ctbrec.AbstractModel; import ctbrec.Model; @@ -147,4 +149,14 @@ public class JavaFxModel extends AbstractModel { public Site getSite() { return delegate.getSite(); } + + @Override + public void readSiteSpecificData(JsonReader reader) throws IOException { + delegate.readSiteSpecificData(reader); + } + + @Override + public void writeSiteSpecificData(JsonWriter writer) throws IOException { + delegate.writeSiteSpecificData(writer); + } }