Skip to content

Commit

Permalink
Parsing optimizations (#363)
Browse files Browse the repository at this point in the history
  • Loading branch information
Katsute authored Feb 10, 2023
1 parent bf3dcd6 commit b6517ca
Show file tree
Hide file tree
Showing 18 changed files with 408 additions and 305 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>dev.katsute</groupId>
<artifactId>mal4j</artifactId>
<version>3.0.1</version>
<version>3.0.2-SNAPSHOT</version>

<profiles>
<profile>
Expand Down
87 changes: 68 additions & 19 deletions src/main/java/dev/katsute/mal4j/Json.java
Original file line number Diff line number Diff line change
Expand Up @@ -265,45 +265,93 @@ public final Object get(final String key){

public final String getString(final String key){
final Object value = map.get(key);
return
value == null
? null
: value instanceof String
? (String) value
: value.toString();
return value == null ? null : value instanceof String ? (String) value : value.toString();
}

public final int getInt(final String key){
public final Integer getInt(final String key){
final Object value = map.get(key);
return value instanceof String ? Integer.parseInt((String) value) : ((Number) value).intValue();
if(value instanceof String)
try{
return Integer.valueOf((String) value);
}catch(final NumberFormatException ignored){
return null;
}
else if(value instanceof Number)
return ((Number) value).intValue();
else
return null;
}

public final double getDouble(final String key){
public final Double getDouble(final String key){
final Object value = map.get(key);
return value instanceof String ? Double.parseDouble((String) value) : ((Number) value).doubleValue();
if(value instanceof String)
try{
return Double.valueOf((String) value);
}catch(final NumberFormatException ignored){
return null;
}
else if(value instanceof Number)
return ((Number) value).doubleValue();
else
return null;
}

public final float getFloat(final String key){
public final Float getFloat(final String key){
final Object value = map.get(key);
return value instanceof String ? Float.parseFloat((String) value) : ((Number) value).floatValue();
if(value instanceof String)
try{
return Float.valueOf((String) value);
}catch(final NumberFormatException ignored){
return null;
}
else if(value instanceof Number)
return ((Number) value).floatValue();
else
return null;
}

public final long getLong(final String key){
public final Long getLong(final String key){
final Object value = map.get(key);
return value instanceof String ? Long.parseLong((String) value) : ((Number) value).longValue();
if(value instanceof String)
try{
return Long.valueOf((String) value);
}catch(final NumberFormatException ignored){
return null;
}
else if(value instanceof Number)
return ((Number) value).longValue();
else
return null;
}

public final boolean getBoolean(final String key){
public final Boolean getBoolean(final String key){
final Object value = map.get(key);
return value instanceof String ? Boolean.parseBoolean((String) value) : (boolean) value;
if(value instanceof String)
// manual equality check is required
// parseBoolean and valueOf always fallsback to false on invalid inputs (which is the WRONG value)
if(((String) value).equalsIgnoreCase("true"))
return true;
else if(((String) value).equalsIgnoreCase("false"))
return false;
else
return null;
else if(value instanceof Boolean)
return (Boolean) value;
else
return null;
}

public final JsonObject getJsonObject(final String key){
return (JsonObject) map.get(key);
final Object value = map.get(key);
if(value instanceof JsonObject)
return (JsonObject) value;
else
return new JsonObject(); // never return null, this prevents chained NPE
}

public final String[] getStringArray(final String key){
final List<?> list = (List<?>) map.get(key);
if(list == null) return null;
final List<String> arr = new ArrayList<>();
for(final Object o : list)
arr.add(o == null ? null : o instanceof String ? (String) o : o.toString());
Expand All @@ -312,9 +360,10 @@ public final String[] getStringArray(final String key){

public final JsonObject[] getJsonArray(final String key){
final List<?> list = (List<?>) map.get(key);
if(list == null) return null;
final List<JsonObject> arr = new ArrayList<>();
for(final Object o : list)
arr.add((JsonObject) o);
arr.add(o instanceof JsonObject ? (JsonObject) o : new JsonObject());
return arr.toArray(new JsonObject[0]);
}

Expand All @@ -331,7 +380,7 @@ private void set(final String key, final Object value){
}

@Override
public String toString(){
public final String toString(){
return "JsonObject{" +
"map=" + map +
'}';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -501,6 +501,7 @@ public static boolean canOpenBrowser(){
return new String[]{handler.getAuth(), verify};
}

@SuppressWarnings("DataFlowIssue")
private AccessToken parseToken(final Response<JsonObject> response){
final JsonObject body = response.body();
if(response.code() == HttpURLConnection.HTTP_OK)
Expand Down
45 changes: 34 additions & 11 deletions src/main/java/dev/katsute/mal4j/MyAnimeListImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,9 @@ public final List<Anime> search(){
if(response == null) return null;

final List<Anime> anime = new ArrayList<>();
for(final JsonObject iterator : response.getJsonArray("data"))
final JsonObject[] arr = response.getJsonArray("data");
if(arr == null) return null;
for(final JsonObject iterator : arr)
anime.add(asAnimePreview(MyAnimeListImpl.this, iterator.getJsonObject("node")));
return anime;
}
Expand Down Expand Up @@ -198,7 +200,9 @@ public final List<AnimeRanking> search(){
if(response == null) return null;

final List<AnimeRanking> anime = new ArrayList<>();
for(final JsonObject iterator : response.getJsonArray("data"))
final JsonObject[] arr = response.getJsonArray("data");
if(arr == null) return null;
for(final JsonObject iterator : arr)
anime.add(asAnimeRanking(MyAnimeListImpl.this, iterator));
return anime;
}
Expand Down Expand Up @@ -244,7 +248,9 @@ public final List<Anime> search(){
if(response == null) return null;

final List<Anime> anime = new ArrayList<>();
for(final JsonObject iterator : response.getJsonArray("data"))
final JsonObject[] arr = response.getJsonArray("data");
if(arr == null) return null;
for(final JsonObject iterator : arr)
anime.add(asAnimePreview(MyAnimeListImpl.this, iterator.getJsonObject("node")));
return anime;
}
Expand Down Expand Up @@ -289,7 +295,9 @@ public final List<Anime> search(){
if(response == null) return null;

final List<Anime> anime = new ArrayList<>();
for(final JsonObject iterator : response.getJsonArray("data"))
final JsonObject[] arr = response.getJsonArray("data");
if(arr == null) return null;
for(final JsonObject iterator : arr)
anime.add(asAnimePreview(MyAnimeListImpl.this, iterator.getJsonObject("node")));
return anime;
}
Expand Down Expand Up @@ -385,7 +393,9 @@ public final List<AnimeListStatus> search(){
if(response == null) return null;

final List<AnimeListStatus> anime = new ArrayList<>();
for(final JsonObject iterator : response.getJsonArray("data"))
final JsonObject[] arr = response.getJsonArray("data");
if(arr == null) return null;
for(final JsonObject iterator : arr)
anime.add(asAnimeListStatus(MyAnimeListImpl.this, iterator.getJsonObject("list_status"), asAnimePreview(MyAnimeListImpl.this, iterator.getJsonObject("node"))));
return anime;
}
Expand Down Expand Up @@ -423,7 +433,9 @@ public final List<ForumCategory> getForumBoards(){
if(response == null) return null;

final List<ForumCategory> categories = new ArrayList<>();
for(final JsonObject iterator : response.getJsonArray("categories"))
final JsonObject[] arr = response.getJsonArray("categories");
if(arr == null) return null;
for(final JsonObject iterator : arr)
categories.add(asForumCategory(MyAnimeListImpl.this, iterator));
return categories;
}
Expand Down Expand Up @@ -472,7 +484,9 @@ public final List<Post> search(){
if(response == null) return null;

final List<Post> posts = new ArrayList<>();
for(final JsonObject iterator : response.getJsonObject("data").getJsonArray("posts"))
final JsonObject[] arr = response.getJsonObject("data").getJsonArray("posts");
if(arr == null) return null;
for(final JsonObject iterator : arr)
posts.add(asPost(MyAnimeListImpl.this, iterator, id));
return posts;
}
Expand Down Expand Up @@ -518,7 +532,9 @@ public final List<ForumTopic> search(){
if(response == null) return null;

final List<ForumTopic> topics = new ArrayList<>();
for(final JsonObject iterator : response.getJsonArray("data"))
final JsonObject[] arr = response.getJsonArray("data");
if(arr == null) return null;
for(final JsonObject iterator : arr)
topics.add(asForumTopicDetail(MyAnimeListImpl.this, iterator, boardId, subboardId));
return topics;
}
Expand Down Expand Up @@ -566,7 +582,9 @@ public final List<Manga> search(){
if(response == null) return null;

final List<Manga> manga = new ArrayList<>();
for(final JsonObject iterator : response.getJsonArray("data"))
final JsonObject[] arr = response.getJsonArray("data");
if(arr == null) return null;
for(final JsonObject iterator : arr)
manga.add(asMangaPreview(MyAnimeListImpl.this, iterator.getJsonObject("node")));
return manga;
}
Expand Down Expand Up @@ -634,7 +652,9 @@ public final List<MangaRanking> search(){
if(response == null) return null;

final List<MangaRanking> manga = new ArrayList<>();
for(final JsonObject iterator : response.getJsonArray("data"))
final JsonObject[] arr = response.getJsonArray("data");
if(arr == null) return null;
for(final JsonObject iterator : arr)
manga.add(asMangaRanking(MyAnimeListImpl.this, iterator));
return manga;
}
Expand Down Expand Up @@ -733,7 +753,9 @@ public final List<MangaListStatus> search(){
if(response == null) return null;

final List<MangaListStatus> manga = new ArrayList<>();
for(final JsonObject iterator : response.getJsonArray("data"))
final JsonObject[] arr = response.getJsonArray("data");
if(arr == null) return null;
for(final JsonObject iterator : arr)
manga.add(asMangaListStatus(MyAnimeListImpl.this, iterator.getJsonObject("list_status"), asMangaPreview(MyAnimeListImpl.this, iterator.getJsonObject("node"))));
return manga;
}
Expand Down Expand Up @@ -861,6 +883,7 @@ final boolean hasNextPage(){
return nextOffset.get() != -1;
}

@SuppressWarnings("DataFlowIssue")
@Override
synchronized final List<T> getNextPage(){
final JsonObject response = handleResponse(() -> fullPageSupplier.apply(nextOffset.get()));
Expand Down
39 changes: 17 additions & 22 deletions src/main/java/dev/katsute/mal4j/MyAnimeListSchema.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.function.Function;
import java.util.function.Supplier;

@SuppressWarnings("unused")
abstract class MyAnimeListSchema {
Expand Down Expand Up @@ -65,19 +64,25 @@ protected static NullableDate parseNullableDate(final String date){

final int len = date.length();
final String[] parts = date.split("-");

final long t;
final Integer y, m, d;
try{
t = new SimpleDateFormat(len == 10 ? YMD : len == 7 ? YM : Y).parse(date).getTime();
y = parts.length >= 1 ? Integer.valueOf(parts[0]) : null;
m = parts.length >= 2 ? Integer.valueOf(parts[1]) : null;
d = parts.length >= 3 ? Integer.valueOf(parts[2]) : null;
}catch(final NumberFormatException | ParseException ignored){
return null;
}

return new NullableDate() {

private final Long time = requireNonNull(() -> {
try{
return new SimpleDateFormat(len == 10 ? YMD : len == 7 ? YM : Y).parse(date).getTime();
}catch(ParseException e){
return null;
}
});
private final Long time = t;

private final Integer year = requireNonNull(() -> parts.length < 1 ? null : Integer.valueOf(parts[0]));
private final Integer month = requireNonNull(() -> parts.length < 2 ? null : Integer.valueOf(parts[1]));
private final Integer day = requireNonNull(() -> parts.length < 3 ? null : Integer.valueOf(parts[2]));
private final Integer year = y;
private final Integer month = m;
private final Integer day = d;

@Override
public final Integer getYear(){
Expand All @@ -101,7 +106,7 @@ public final Long getMillis(){

@Override
public final Date getDate(){
return time != null ? new Date(time) : null;
return new Date(time);
}

//
Expand Down Expand Up @@ -195,14 +200,4 @@ public final String toString(){
};
}

//

protected static <T> T requireNonNull(final Supplier<T> supplier){
try{
return supplier.get();
}catch(final NullPointerException ignored){
return null;
}
}

}
Loading

0 comments on commit b6517ca

Please sign in to comment.