package com.boardgamegeek.model; import android.text.TextUtils; import com.boardgamegeek.util.StringUtils; import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Element; import org.simpleframework.xml.ElementList; import org.simpleframework.xml.Path; import org.simpleframework.xml.Root; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; @Root(name = "item") public class Game { @Root(name = "name") static class Name { @Attribute private String type; @Attribute private int sortindex; @Attribute private String value; } @Root(name = "poll") public static class Poll { @Attribute public String name; @Attribute public String title; @Attribute public int totalvotes; @ElementList(required = false, inline = true, empty = false) public List<Results> results; } @Root(name = "results") public static class Results { @Attribute(required = false) private String numplayers; @ElementList(required = false, inline = true, empty = false) public List<Result> result; public String getKey() { if (TextUtils.isEmpty(numplayers)) { return "X"; } return numplayers; } } @Root(name = "result") public static class Result { @Attribute(required = false) public int level; @Attribute public String value; @Attribute public int numvotes; } public static class Link { @Attribute private String type; @Attribute public int id; @Attribute public String value; @Attribute(required = false) private String inbound; public boolean getInbound() { return "true".equals(inbound); } } @Root(name = "rank") public static class Rank { @Attribute public String type; @Attribute public int id; @Attribute public String name; @Attribute(name = "friendlyname") public String friendlyName; @Attribute private String value; @Attribute private String bayesaverage; public int getValue() { return StringUtils.parseInt(value, Integer.MAX_VALUE); } public double getBayesAverage() { return StringUtils.parseDouble(bayesaverage); } } public static class Statistics { @Attribute private int page; @Path("ratings/usersrated") @Attribute(name = "value") private String usersRated; public int usersRated() { return StringUtils.parseInt(usersRated); } @Path("ratings/average") @Attribute(name = "value") private String average; public double average() { return StringUtils.parseDouble(average); } @Path("ratings/bayesaverage") @Attribute(name = "value") private String bayesAverage; public double bayesAverage() { return StringUtils.parseDouble(bayesAverage); } @Path("ratings") @ElementList public List<Rank> ranks; @Path("ratings/stddev") @Attribute(name = "value") private String standardDeviation; public double standardDeviation() { return StringUtils.parseDouble(standardDeviation); } @Path("ratings/median") @Attribute(name = "value") private String median; public double median() { return StringUtils.parseDouble(median); } @Path("ratings/owned") @Attribute(name = "value") private String owned; public int owned() { return StringUtils.parseInt(owned); } @Path("ratings/trading") @Attribute(name = "value") private String trading; public int trading() { return StringUtils.parseInt(trading); } @Path("ratings/wanting") @Attribute(name = "value") private String wanting; public int wanting() { return StringUtils.parseInt(wanting); } @Path("ratings/wishing") @Attribute(name = "value") private String wishing; public int wishing() { return StringUtils.parseInt(wishing); } @Path("ratings/numcomments") @Attribute(name = "value") private String commenting; public int commenting() { return StringUtils.parseInt(commenting); } @Path("ratings/numweights") @Attribute(name = "value") private String weighting; public int weighting() { return StringUtils.parseInt(weighting); } @Path("ratings/averageweight") @Attribute(name = "value") private String averageWeight; public double averageWeight() { return StringUtils.parseDouble(averageWeight); } } @Root(name = "comment") public static class Comment { private static final DecimalFormat RATING_FORMAT = new DecimalFormat("#0.00"); @Attribute public String username; @Attribute private String rating; public double getRating() { return StringUtils.parseDouble(rating, 0.0); } public String getRatingText() { double rating = getRating(); if (rating < 1.0) { return "N/A"; } return RATING_FORMAT.format(rating); } @Attribute public String value; } @Attribute private String type; public String subtype() { return type; } @Attribute public int id; @Element(required = false) public String thumbnail; @Element(required = false) public String image; @ElementList(inline = true) private List<Name> names; @Element(required = false) private String description; @Path("yearpublished") @Attribute(name = "value") private String yearpublished; public int getYearPublished() { return StringUtils.parseInt(yearpublished, Constants.YEAR_UNKNOWN); } @Path("minplayers") @Attribute(name = "value") private String minplayers; public int getMinPlayers() { return StringUtils.parseInt(minplayers, 0); } @Path("maxplayers") @Attribute(name = "value") private String maxplayers; public int getMaxPlayers() { return StringUtils.parseInt(maxplayers, 0); } @ElementList(inline = true, required = false) public List<Poll> polls; @Path("playingtime") @Attribute(name = "value") private String playingtime; public int getPlayingTime() { return StringUtils.parseInt(playingtime, 0); } @Path("minage") @Attribute(name = "value") private String minage; public int getMinAge() { return StringUtils.parseInt(minage, 0); } @ElementList(inline = true, required = false) private List<Link> links; @Element(name = "statistics", required = false) public Statistics statistics; @Element(required = false) public Comments comments; public static class Comments { @Attribute public int page; @Attribute public int totalitems; @ElementList(inline = true) public List<Comment> comments; } public String getName() { for (Name name : names) { if ("primary".equals(name.type)) { return name.value; } } return ""; } public String getSortName() { for (Name name : names) { if ("primary".equals(name.type)) { return StringUtils.createSortName(name.value, name.sortindex); } } return ""; } public String getDescription() { if (TextUtils.isEmpty(description)) { return ""; } String d = description.replace(" ", "\n"); return d.trim(); } public List<Link> getDesigners() { return getLinks("boardgamedesigner"); } public List<Link> getArtists() { return getLinks("boardgameartist"); } public List<Link> getPublishers() { return getLinks("boardgamepublisher"); } public List<Link> getCategories() { return getLinks("boardgamecategory"); } public List<Link> getMechanics() { return getLinks("boardgamemechanic"); } public List<Link> getExpansions() { return getLinks("boardgameexpansion"); } public List<Link> getFamilies() { return getLinks("boardgamefamily"); } public List<Link> getImplementations() { return getLinks("boardgameimplementation"); } public int getRank() { for (Rank rank : statistics.ranks) { if ("subtype".equals(rank.type)) { return rank.getValue(); } } return Integer.MAX_VALUE; } private List<Link> getLinks(String type) { List<Link> list = new ArrayList<>(); if (!TextUtils.isEmpty(type)) { for (Link link : links) { if (type.equals(link.type)) { list.add(link); } } } return list; } @Override public String toString() { return id + ": " + getName(); } }