diff --git a/UrbanGame/src/com/blstream/urbangame/webserver/json/JsonParser.java b/UrbanGame/src/com/blstream/urbangame/webserver/json/JsonParser.java new file mode 100644 index 0000000..e93b099 --- /dev/null +++ b/UrbanGame/src/com/blstream/urbangame/webserver/json/JsonParser.java @@ -0,0 +1,105 @@ +package com.blstream.urbangame.webserver.json; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; + +import com.blstream.urbangame.database.entity.Task; +import com.blstream.urbangame.database.entity.UrbanGame; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class JsonParser { + + public static String URBANGAME_URL = "http://urbangame.patronage.blstream.com/"; + + public UrbanGame getUrbanGameFromJSON(String urbanGaneInJSON) { + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(UrbanGame.class, new UrbanGameDeserializer()); + Gson gson = gsonBuilder.create(); + + // Parse JSON to Java + return gson.fromJson(urbanGaneInJSON, UrbanGame.class); + + } + + public List getUrbanGameListFromJSON(String urbanGameListInJSON) { + // Configure GSON + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(UrbanGameContainer.class, new UrbanGameListDeserializer()); + Gson gson = gsonBuilder.create(); + + // Parse JSON to Java + UrbanGameContainer container = gson.fromJson(urbanGameListInJSON, UrbanGameContainer.class); + + return container.getGameList(); + } + + public List getTaskListFromJSON(String taskListInJSON) { + + // Configure GSON + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(TaskContainer.class, new TaskListDeserializer()); + Gson gson = gsonBuilder.create(); + + // Parse JSON to Java + TaskContainer container = gson.fromJson(taskListInJSON, TaskContainer.class); + + return container.getTaskList(); + + } + + public Task getTaskFromJSON(String taskInJSON) { + // Configure GSON + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(Task.class, new TaskDeserializer()); + Gson gson = gsonBuilder.create(); + + // Parse JSON to Java + return gson.fromJson(taskInJSON, Task.class); + } + + //deserializer helper methods + //translates difficulty from string to int + public static int parseDifficulty(String difficulty) { + int result = 0; + if (difficulty.equals("very easy")) { + result = 0; + } + else if (difficulty.equals("easy")) { + result = 1; + } + else if (difficulty.equals("medium")) { + result = 2; + } + else if (difficulty.equals("hard")) { + result = 3; + } + else if (difficulty.equals("very hard")) { + result = 4; + } + else if (difficulty.equals("extremely hard")) { + result = 5; + } + return result; + } + + public static Drawable drawableFromUrl(String url) throws IOException { + Bitmap x; + + HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + connection.connect(); + InputStream input = connection.getInputStream(); + + x = BitmapFactory.decodeStream(input); + return new BitmapDrawable(x); + } + +} diff --git a/UrbanGame/src/com/blstream/urbangame/webserver/json/TaskContainer.java b/UrbanGame/src/com/blstream/urbangame/webserver/json/TaskContainer.java new file mode 100644 index 0000000..c7c5591 --- /dev/null +++ b/UrbanGame/src/com/blstream/urbangame/webserver/json/TaskContainer.java @@ -0,0 +1,23 @@ +package com.blstream.urbangame.webserver.json; + +import java.util.List; + +import com.blstream.urbangame.database.entity.Task; + +public class TaskContainer { + + private List taskList; + + public TaskContainer(List list) { + setTaskList(list); + } + + public List getTaskList() { + return taskList; + } + + public void setTaskList(List taskList) { + this.taskList = taskList; + } + +} diff --git a/UrbanGame/src/com/blstream/urbangame/webserver/json/TaskDeserializer.java b/UrbanGame/src/com/blstream/urbangame/webserver/json/TaskDeserializer.java new file mode 100644 index 0000000..a4fcdce --- /dev/null +++ b/UrbanGame/src/com/blstream/urbangame/webserver/json/TaskDeserializer.java @@ -0,0 +1,60 @@ +package com.blstream.urbangame.webserver.json; + +import java.lang.reflect.Type; + +import com.blstream.urbangame.database.entity.ABCDTask; +import com.blstream.urbangame.database.entity.LocationTask; +import com.blstream.urbangame.database.entity.Task; +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; + +public class TaskDeserializer implements JsonDeserializer { + + @Override + public Task deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) + throws JsonParseException { + + JsonObject jsonTaskObject = json.getAsJsonObject(); + + String category = jsonTaskObject.get("category").getAsString(); + + Task taskResult; + + if (category.equals("ABCTask")) { + taskResult = new ABCDTask(); + taskResult.setType(Task.TASK_TYPE_ABCD); + JsonArray jsonOptions = jsonTaskObject.get("choices").getAsJsonArray(); + + String[] answers = new String[jsonOptions.size()]; + + for (int i = 0; i < jsonOptions.size(); i++) { + JsonObject jsonOption = jsonOptions.get(i).getAsJsonObject(); + + answers[i] = jsonOption.get("answer").getAsString(); + } + ((ABCDTask) taskResult).setAnswers(answers); + //FIXME there is no question in JSON + + } + else { + taskResult = new LocationTask(); + taskResult.setType(Task.TASK_TYPE_LOCATION); + } + + taskResult.setId(jsonTaskObject.get("tid").getAsLong()); + taskResult.setDescription(jsonTaskObject.get("description").getAsString()); + taskResult.setTitle(jsonTaskObject.get("name").getAsString()); + taskResult.setMaxPoints(jsonTaskObject.get("maxpoints").getAsInt()); + + //TODO We don't remember max attempts and it is in JSON + int maxAttempts = jsonTaskObject.get("maxattempts").getAsInt(); + taskResult.setIsRepetable(maxAttempts > 1); + + return taskResult; + } + +} diff --git a/UrbanGame/src/com/blstream/urbangame/webserver/json/TaskListDeserializer.java b/UrbanGame/src/com/blstream/urbangame/webserver/json/TaskListDeserializer.java new file mode 100644 index 0000000..d503647 --- /dev/null +++ b/UrbanGame/src/com/blstream/urbangame/webserver/json/TaskListDeserializer.java @@ -0,0 +1,36 @@ +package com.blstream.urbangame.webserver.json; + +import java.lang.reflect.Type; +import java.util.LinkedList; + +import com.blstream.urbangame.database.entity.Task; +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; + +public class TaskListDeserializer implements JsonDeserializer { + + @Override + public TaskContainer deserialize(final JsonElement json, final Type typeOfT, + final JsonDeserializationContext context) { + + JsonObject jsonObject = json.getAsJsonObject(); + + JsonArray jsonTaskArray = jsonObject.get("_embedded").getAsJsonArray(); + + LinkedList resultList = new LinkedList(); + + for (int i = 0; i < jsonTaskArray.size(); i++) { + JsonObject jsonTask = jsonTaskArray.get(i).getAsJsonObject(); + Task task = new Task() {}; //TODO I don't know what is the task type. I think it shouldn't be like this because we have to now what icon shoud be displayed + + task.setId(jsonTask.get("tid").getAsLong()); + task.setTitle(jsonTask.get("name").getAsString()); + resultList.add(task); + } + + return new TaskContainer(resultList); + } +} diff --git a/UrbanGame/src/com/blstream/urbangame/webserver/json/UrbanGameContainer.java b/UrbanGame/src/com/blstream/urbangame/webserver/json/UrbanGameContainer.java new file mode 100644 index 0000000..0d3cb4b --- /dev/null +++ b/UrbanGame/src/com/blstream/urbangame/webserver/json/UrbanGameContainer.java @@ -0,0 +1,23 @@ +package com.blstream.urbangame.webserver.json; + +import java.util.List; + +import com.blstream.urbangame.database.entity.UrbanGame; + +public class UrbanGameContainer { + + private List gameList; + + public UrbanGameContainer(List list) { + gameList = list; + } + + public List getGameList() { + return gameList; + } + + public void setGameList(List gameList) { + this.gameList = gameList; + } + +} diff --git a/UrbanGame/src/com/blstream/urbangame/webserver/json/UrbanGameDeserializer.java b/UrbanGame/src/com/blstream/urbangame/webserver/json/UrbanGameDeserializer.java new file mode 100644 index 0000000..b28e6af --- /dev/null +++ b/UrbanGame/src/com/blstream/urbangame/webserver/json/UrbanGameDeserializer.java @@ -0,0 +1,51 @@ +package com.blstream.urbangame.webserver.json; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.Date; + +import com.blstream.urbangame.database.entity.UrbanGame; +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; + +public class UrbanGameDeserializer implements JsonDeserializer { + + @Override + public UrbanGame deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) + throws JsonParseException { + + UrbanGame urbanGame = new UrbanGame(); + + JsonObject jsonObject = json.getAsJsonObject(); + urbanGame.setID(jsonObject.get("gid").getAsLong()); + urbanGame.setGameVersion(jsonObject.get("version").getAsDouble()); + urbanGame.setTitle(jsonObject.get("name").getAsString()); + urbanGame.setLocation(jsonObject.get("location").getAsString()); + urbanGame.setOperatorName(jsonObject.get("operatorName").getAsString()); + try { + urbanGame.setGameLogoDrawable(JsonParser.drawableFromUrl(JsonParser.URBANGAME_URL + + jsonObject.get("operatorLogo").getAsString())); + } + catch (IOException e) { + //no internet connection logo stays null + } + urbanGame.setStartDate(new Date(jsonObject.get("startTime").getAsLong())); + urbanGame.setEndDate(new Date(jsonObject.get("endTime").getAsLong())); + urbanGame.setWinningStrategy(jsonObject.get("winning").getAsString()); + urbanGame.setDifficulty(JsonParser.parseDifficulty(jsonObject.get("difficulty").getAsString())); + urbanGame.setPrizesInfo(jsonObject.get("awards").getAsString()); + try { + urbanGame.setGameLogoDrawable(JsonParser.drawableFromUrl(JsonParser.URBANGAME_URL + + jsonObject.get("image").getAsString())); + } + catch (IOException e) { + //no internet connection, image stays null + } + + urbanGame.setReward(!(urbanGame.getPrizesInfo() == null || urbanGame.getPrizesInfo().equals(""))); + return urbanGame; + } +} diff --git a/UrbanGame/src/com/blstream/urbangame/webserver/json/UrbanGameListDeserializer.java b/UrbanGame/src/com/blstream/urbangame/webserver/json/UrbanGameListDeserializer.java new file mode 100644 index 0000000..dd0aae2 --- /dev/null +++ b/UrbanGame/src/com/blstream/urbangame/webserver/json/UrbanGameListDeserializer.java @@ -0,0 +1,66 @@ +package com.blstream.urbangame.webserver.json; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.Date; +import java.util.LinkedList; + +import com.blstream.urbangame.database.entity.UrbanGame; +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; + +public class UrbanGameListDeserializer implements JsonDeserializer { + + @Override + public UrbanGameContainer deserialize(final JsonElement json, final Type typeOfT, + final JsonDeserializationContext context) throws JsonParseException { + + LinkedList resultList = new LinkedList(); + + JsonObject jsonObject = json.getAsJsonObject(); + + JsonArray jsonArray = jsonObject.get("_embedded").getAsJsonArray(); + + for (int i = 0; i < jsonArray.size(); i++) { + UrbanGame urbanGame = new UrbanGame(); + JsonObject jsonObjectArrayElement = jsonArray.get(i).getAsJsonObject(); + + urbanGame.setID(jsonObjectArrayElement.get("gid").getAsLong()); + urbanGame.setGameVersion(jsonObjectArrayElement.get("version").getAsDouble()); + urbanGame.setTitle(jsonObjectArrayElement.get("name").getAsString()); + urbanGame.setStartDate(new Date(jsonObjectArrayElement.get("startTime").getAsLong())); + urbanGame.setEndDate(new Date(jsonObjectArrayElement.get("endTime").getAsLong())); + urbanGame.setDifficulty(JsonParser.parseDifficulty(jsonObjectArrayElement.get("difficulty").getAsString())); + urbanGame.setOperatorName(jsonObjectArrayElement.get("operatorName").getAsString()); + urbanGame.setMaxPlayers(jsonObjectArrayElement.get("maxPlayers").getAsInt()); + urbanGame.setPlayers(jsonObjectArrayElement.get("numberOfPlayers").getAsInt()); + urbanGame.setPrizesInfo(jsonObjectArrayElement.get("awards").getAsString()); + try { + urbanGame.setGameLogoDrawable(JsonParser.drawableFromUrl(JsonParser.URBANGAME_URL + + jsonObjectArrayElement.get("operatorLogo").getAsString())); + } + catch (IOException e) { + //no internet connection logo stays null + } + try { + urbanGame.setGameLogoDrawable(JsonParser.drawableFromUrl(JsonParser.URBANGAME_URL + + jsonObjectArrayElement.get("image").getAsString())); + } + catch (IOException e) { + //no internet connection, image stays null + } + + urbanGame.setReward(!(urbanGame.getPrizesInfo() == null || urbanGame.getPrizesInfo().equals(""))); + + resultList.add(urbanGame); + + } + + return new UrbanGameContainer(resultList); + } + +}