Skip to content

Commit

Permalink
Added New Search Endpoint and Test. Adjust deserializer to handle new…
Browse files Browse the repository at this point in the history
… endpoint result.
  • Loading branch information
blad committed Dec 29, 2014
1 parent a67418b commit 43e8971
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 6 deletions.
1 change: 1 addition & 0 deletions app/src/androidTest/assets/search_results.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.btellez.solidandroid.test.model;

import android.test.InstrumentationTestCase;

import com.btellez.solidandroid.model.Icon;
import com.btellez.solidandroid.model.IconParser;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class DeserializeTest extends InstrumentationTestCase {

public void testSearchResultDeserialization() throws Exception {
String jsonString = readFileFromAssets("search_results.json");
IconParser.GsonIconParser parser = new IconParser.GsonIconParser();
List<Icon> icons = parser.fromJson(jsonString, null);
assertEquals(72, icons.size());
}

private String readFileFromAssets(String fileName) {
try {
InputStream is = getInstrumentation().getContext().getAssets().open(fileName);
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
return new String(buffer);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
34 changes: 31 additions & 3 deletions app/src/main/java/com/btellez/solidandroid/model/IconParser.java
Original file line number Diff line number Diff line change
@@ -1,32 +1,60 @@
package com.btellez.solidandroid.model;

import com.btellez.solidandroid.utility.Strings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import hugo.weaving.DebugLog;

public interface IconParser {
public List<Icon> fromJson(String jsonString, String dataKey);

/**
* Google Gson Implementation of our Icon Parser
*/
public static class GsonIconParser implements IconParser {
Gson gson = new Gson();
Gson gson = new GsonBuilder().registerTypeAdapter(Icon.class, new IconDeserializer()).create();
JsonParser parser = new JsonParser();

@Override
@Override @DebugLog
public List<Icon> fromJson(String jsonString, String dataKey) {
JsonElement json = parser.parse(jsonString);
JsonArray iconList = json.getAsJsonObject().getAsJsonArray(dataKey);
JsonArray iconList;
if (Strings.isEmpty(dataKey)) {
iconList = json.getAsJsonArray();
} else {
iconList = json.getAsJsonObject().getAsJsonArray(dataKey);
}

List<Icon> icons = new ArrayList<Icon>(iconList.size());
for (JsonElement item : iconList) {
icons.add(gson.fromJson(item, Icon.class));
}
return icons;
}

private class IconDeserializer implements JsonDeserializer<Icon> {
Gson defaultGson = new Gson();
@Override
public Icon deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonElement uploader = json.getAsJsonObject().get("uploader");
if (!uploader.isJsonObject()) {
json.getAsJsonObject().remove("uploader");
json.getAsJsonObject().add("uploader", new JsonObject());
}
return defaultGson.fromJson(json, Icon.class);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public interface NounProjectApi {

public static class EndpointBuilder {
public String buildSearchUrl(Configuration config, String term) {
return config.getNounProjectBaseApiUrl() + "collection/" + term + "/icons";
return config.getNounProjectBaseUrl() + "/json_icon_list/" + term + "/?page=1&limit=100&offset=0";
}

public String buildRecentUrl(Configuration config) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public OkNounProjectApi(Configuration configuration, IconParser iconParser) {
public void search(String term, final Callback callback) {
String endpoint = new EndpointBuilder().buildSearchUrl(configuration, term);
Request request = buildRequest(endpoint, NounProjectOAuth.RequestType.GET);
client.newCall(request).enqueue(new OkHttpCallback(callback, "icons"));
client.newCall(request).enqueue(new OkHttpCallback(callback));
}

@Override
Expand Down Expand Up @@ -71,6 +71,10 @@ private class OkHttpCallback implements com.squareup.okhttp.Callback {
public String dataKey;
private Handler uiHandler = new Handler(Looper.getMainLooper());

private OkHttpCallback(Callback callback) {
this(callback, null);
}

private OkHttpCallback(Callback callback, String dataKey) {
this.callback = callback;
this.dataKey = dataKey;
Expand All @@ -87,7 +91,8 @@ public void run() {
}

@Override public void onResponse(final Response response) throws IOException {
final List<Icon> result = iconParser.fromJson(response.body().string(), dataKey);
String jsonString = response.body().string();
final List<Icon> result = iconParser.fromJson(jsonString, dataKey);
// We need to post update to the UI thread.
uiHandler.post(new Runnable() {
@Override
Expand Down

0 comments on commit 43e8971

Please sign in to comment.