From 40cdc676d1b9062f7d17cf2ffaa4628c9fd56854 Mon Sep 17 00:00:00 2001 From: Florens Douwes Date: Sun, 10 Aug 2014 15:59:35 +0200 Subject: [PATCH] Update the json readers. Proper exceptions Fixed boardsreader throwing an exception instead of just skiping the key, if the key was not "boards" --- .../floens/chan/core/net/BoardsRequest.java | 35 ++--- .../chan/core/net/ChanReaderRequest.java | 131 ++++++++---------- .../chan/core/net/JsonReaderRequest.java | 49 ++++--- 3 files changed, 99 insertions(+), 116 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/core/net/BoardsRequest.java b/Clover/app/src/main/java/org/floens/chan/core/net/BoardsRequest.java index 4ee2bfa8..f9ca9991 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/net/BoardsRequest.java +++ b/Clover/app/src/main/java/org/floens/chan/core/net/BoardsRequest.java @@ -34,34 +34,25 @@ public class BoardsRequest extends JsonReaderRequest> { } @Override - public List readJson(JsonReader reader) { - return parseJson(reader); - } - - private List parseJson(JsonReader reader) { + public List readJson(JsonReader reader) throws Exception { List list = new ArrayList<>(); - try { - reader.beginObject(); - // Page object - while (reader.hasNext()) { - String key = reader.nextName(); - if (key.equals("boards")) { - reader.beginArray(); - - while (reader.hasNext()) { - list.add(readBoardEntry(reader)); - } + reader.beginObject(); + while (reader.hasNext()) { + String key = reader.nextName(); + if (key.equals("boards")) { + reader.beginArray(); - reader.endArray(); - } else { - throw new IOException("Invalid data received"); + while (reader.hasNext()) { + list.add(readBoardEntry(reader)); } + + reader.endArray(); + } else { + reader.skipValue(); } - reader.endObject(); - } catch (IOException | IllegalStateException | NumberFormatException e) { - e.printStackTrace(); } + reader.endObject(); return list; } diff --git a/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java b/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java index b3d97b07..98117c07 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java +++ b/Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java @@ -19,7 +19,6 @@ package org.floens.chan.core.net; import android.util.JsonReader; -import com.android.volley.ParseError; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; @@ -71,7 +70,7 @@ public class ChanReaderRequest extends JsonReaderRequest> { } @Override - public List readJson(JsonReader reader) { + public List readJson(JsonReader reader) throws Exception { List list; if (loadable.isBoardMode()) { @@ -84,16 +83,10 @@ public class ChanReaderRequest extends JsonReaderRequest> { throw new IllegalArgumentException("Unknown mode"); } - List result = null; - try { - result = processPosts(list); - } catch (IOException e) { - setError(new ParseError(e)); - } - return result; + return processPosts(list); } - private List processPosts(List serverList) throws IOException { + private List processPosts(List serverList) throws Exception { boolean anonymize = ChanPreferences.getAnonymize(); boolean anonymizeIds = ChanPreferences.getAnonymizeIds(); String name = ChanApplication.getInstance().getString(R.string.default_name); @@ -188,113 +181,99 @@ public class ChanReaderRequest extends JsonReaderRequest> { return totalList; } - private List loadThread(JsonReader reader) { + private List loadThread(JsonReader reader) throws Exception { ArrayList list = new ArrayList<>(); - try { - reader.beginObject(); - // Page object - while (reader.hasNext()) { - if (reader.nextName().equals("posts")) { - reader.beginArray(); - // Thread array - while (reader.hasNext()) { - // Thread object - list.add(readPostObject(reader)); - } - reader.endArray(); - } else { - reader.skipValue(); + reader.beginObject(); + // Page object + while (reader.hasNext()) { + String key = reader.nextName(); + if (key.equals("posts")) { + reader.beginArray(); + // Thread array + while (reader.hasNext()) { + // Thread object + list.add(readPostObject(reader)); } + reader.endArray(); + } else { + reader.skipValue(); } - reader.endObject(); - } catch (IOException | IllegalStateException | NumberFormatException e) { - e.printStackTrace(); - setError(new ParseError(e)); } + reader.endObject(); return list; } - private List loadBoard(JsonReader reader) { + private List loadBoard(JsonReader reader) throws Exception { ArrayList list = new ArrayList<>(); - try { - reader.beginObject(); // Threads array - - if (reader.nextName().equals("threads")) { - reader.beginArray(); + reader.beginObject(); // Threads array - while (reader.hasNext()) { - reader.beginObject(); // Thread object + if (reader.nextName().equals("threads")) { + reader.beginArray(); - if (reader.nextName().equals("posts")) { - reader.beginArray(); + while (reader.hasNext()) { + reader.beginObject(); // Thread object - list.add(readPostObject(reader)); + if (reader.nextName().equals("posts")) { + reader.beginArray(); - // Only consume one post - while (reader.hasNext()) - reader.skipValue(); + list.add(readPostObject(reader)); - reader.endArray(); - } else { + // Only consume one post + while (reader.hasNext()) reader.skipValue(); - } - reader.endObject(); + reader.endArray(); + } else { + reader.skipValue(); } - reader.endArray(); - } else { - reader.skipValue(); + reader.endObject(); } - reader.endObject(); - } catch (IOException | IllegalStateException | NumberFormatException e) { - e.printStackTrace(); - setError(new ParseError(e)); + reader.endArray(); + } else { + reader.skipValue(); } + reader.endObject(); + return list; } - private List loadCatalog(JsonReader reader) { + private List loadCatalog(JsonReader reader) throws Exception { ArrayList list = new ArrayList<>(); - try { - reader.beginArray(); // Array of pages + reader.beginArray(); // Array of pages - while (reader.hasNext()) { - reader.beginObject(); // Page object - - while (reader.hasNext()) { - if (reader.nextName().equals("threads")) { - reader.beginArray(); // Threads array + while (reader.hasNext()) { + reader.beginObject(); // Page object - while (reader.hasNext()) { - list.add(readPostObject(reader)); - } + while (reader.hasNext()) { + if (reader.nextName().equals("threads")) { + reader.beginArray(); // Threads array - reader.endArray(); - } else { - reader.skipValue(); + while (reader.hasNext()) { + list.add(readPostObject(reader)); } - } - reader.endObject(); + reader.endArray(); + } else { + reader.skipValue(); + } } - reader.endArray(); - } catch (IOException | IllegalStateException | NumberFormatException e) { - e.printStackTrace(); - setError(new ParseError(e)); + reader.endObject(); } + reader.endArray(); + return list; } - private Post readPostObject(JsonReader reader) throws IllegalStateException, NumberFormatException, IOException { + private Post readPostObject(JsonReader reader) throws Exception { Post post = new Post(); post.board = loadable.board; diff --git a/Clover/app/src/main/java/org/floens/chan/core/net/JsonReaderRequest.java b/Clover/app/src/main/java/org/floens/chan/core/net/JsonReaderRequest.java index 0cc1e970..095e7636 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/net/JsonReaderRequest.java +++ b/Clover/app/src/main/java/org/floens/chan/core/net/JsonReaderRequest.java @@ -20,7 +20,6 @@ package org.floens.chan.core.net; import android.util.JsonReader; import com.android.volley.NetworkResponse; -import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; @@ -35,7 +34,6 @@ import java.io.UnsupportedEncodingException; public abstract class JsonReaderRequest extends Request { protected final Listener listener; - private VolleyError error; public JsonReaderRequest(String url, Listener listener, ErrorListener errorListener) { super(Method.GET, url, errorListener); @@ -48,36 +46,51 @@ public abstract class JsonReaderRequest extends Request { listener.onResponse(response); } - public void setError(VolleyError error) { - this.error = error; - } - @Override protected Response parseNetworkResponse(NetworkResponse response) { - try { - ByteArrayInputStream baos = new ByteArrayInputStream(response.data); + ByteArrayInputStream baos = new ByteArrayInputStream(response.data); - JsonReader reader = new JsonReader(new InputStreamReader(baos, "UTF-8")); + JsonReader reader = null; + try { + reader = new JsonReader(new InputStreamReader(baos, "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } - T read = readJson(reader); + Exception exception = null; + T read = null; + try { + read = readJson(reader); + } catch (Exception e) { + exception = e; + } + if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } + } - if (read == null && error == null) { - return Response.error(new VolleyError()); - } else if (error != null) { - return Response.error(error); + if (read == null) { + if (exception != null) { + return Response.error(new VolleyError(exception)); } else { - return Response.success(read, HttpHeaderParser.parseCacheHeaders(response)); + return Response.error(new VolleyError("Unknown error")); } - } catch (UnsupportedEncodingException e) { - return Response.error(new ParseError(e)); + } else { + return Response.success(read, HttpHeaderParser.parseCacheHeaders(response)); } } - public abstract T readJson(JsonReader reader); + /** + * Read your json. Returning null or throwing something means a Response.error, Response.success is returned otherwise. + * The reader is closed for you. + * + * @param reader A json reader to use + * @return null or the data + * @throws Exception none or an exception + */ + public abstract T readJson(JsonReader reader) throws Exception; }