diff --git a/xyz.veronie.bgg.ui/Application.e4xmi b/xyz.veronie.bgg.ui/Application.e4xmi
index 002cfe8..0d5c9cb 100644
--- a/xyz.veronie.bgg.ui/Application.e4xmi
+++ b/xyz.veronie.bgg.ui/Application.e4xmi
@@ -24,12 +24,14 @@
+
+
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/localdb/SqliteController.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/localdb/SqliteController.java
index fa2e1a7..5670921 100644
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/localdb/SqliteController.java
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/localdb/SqliteController.java
@@ -14,6 +14,7 @@ import java.util.List;
import xyz.veronie.bgg.result.Thing;
import xyz.veronie.bgg.result.ThingMetaData;
+import xyz.veronie.bgg.result.ThingUserData;
import xyz.veronie.bgg.ui.helpers.Resources;
public class SqliteController {
@@ -89,6 +90,41 @@ public class SqliteController {
stmt.executeUpdate("CREATE UNIQUE INDEX IF NOT EXISTS idx1 ON ThingList(Name)");
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ThingListToThing (ListId INTEGER, ThingId INTEGER, FOREIGN KEY (ListId) REFERENCES ThingList(ListId), FOREIGN KEY (ThingId) REFERENCES Thing(ThingId));");
stmt.executeUpdate("CREATE UNIQUE INDEX IF NOT EXISTS idx2 ON ThingListToThing(ListId, ThingId)");
+
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Artist (Id INTEGER PRIMARY KEY, Name);");
+ stmt.executeUpdate("CREATE UNIQUE INDEX IF NOT EXISTS idxArtist ON Artist(Id)");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Designer (Id INTEGER PRIMARY KEY, Name);");
+ stmt.executeUpdate("CREATE UNIQUE INDEX IF NOT EXISTS idDesigner ON Designer(Id)");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Mechanic (Id INTEGER PRIMARY KEY, Name);");
+ stmt.executeUpdate("CREATE UNIQUE INDEX IF NOT EXISTS idxMechanic ON Mechanic(Id)");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Family (Id INTEGER PRIMARY KEY, Name);");
+ stmt.executeUpdate("CREATE UNIQUE INDEX IF NOT EXISTS idxFamily ON Family(Id)");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Category (Id INTEGER PRIMARY KEY, Name);");
+ stmt.executeUpdate("CREATE UNIQUE INDEX IF NOT EXISTS idxCategory ON Category(Id)");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Expansion (Id INTEGER PRIMARY KEY, Name);");
+ stmt.executeUpdate("CREATE UNIQUE INDEX IF NOT EXISTS idxExpansion ON Expansion(Id)");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Domain (Id INTEGER PRIMARY KEY, Name);");
+ stmt.executeUpdate("CREATE UNIQUE INDEX IF NOT EXISTS idxDomain ON Domain(Id)");
+
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ThingDetails ("
+ + "ThingId INTEGER PRIMARY KEY, name, yearpublished INTEGER, "
+ + "minplayers INTEGER, maxplayers INTEGER, playingtime INTEGER, minplaytime INTEGER, maxplaytime INTEGER, "
+ + "age INTEGER, usersrated INTEGER, average FLOAT, bayesaverage FLOAT, "
+ + "owning INTEGER, trading INTEGER, wanting INTEGER, wishing INTEGER, "
+ + "rank INTEGER, rank_wg INTEGER, numcomments INTEGER, numweights INTEGER, "
+ + "averageweight FLOAT, stddev FLOAT, median FLOAT, image, comment,"
+ + "player1,player2,player3,player4,player5,player6,player7,player8,player9,player10,"
+ + "player11, player12, player13, player14, player15, player16, player17, player18, player19, player20,"
+ + "description, numplays INTEGER, price FLOAT, age_poll FLOAT);");
+
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ThingToArtist (ThingId INTEGER, ArtistId INTEGER, FOREIGN KEY (ArtistId) REFERENCES Artist(Id), FOREIGN KEY (ThingId) REFERENCES Thing(ThingId));");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ThingToDesigner (ThingId INTEGER, DesignerId INTEGER, FOREIGN KEY (DesignerId) REFERENCES Designer(Id), FOREIGN KEY (ThingId) REFERENCES Thing(ThingId));");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ThingToMechanic (ThingId INTEGER, MechanicId INTEGER, FOREIGN KEY (MechanicId) REFERENCES Mechanic(Id), FOREIGN KEY (ThingId) REFERENCES Thing(ThingId));");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ThingToFamily (ThingId INTEGER, FamilyId INTEGER, FOREIGN KEY (FamilyId) REFERENCES Family(Id), FOREIGN KEY (ThingId) REFERENCES Thing(ThingId));");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ThingToCategory (ThingId INTEGER, CategoryId INTEGER, FOREIGN KEY (CategoryId) REFERENCES Category(Id), FOREIGN KEY (ThingId) REFERENCES Thing(ThingId));");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ThingToExpansion (ThingId INTEGER, ExpansionId INTEGER, FOREIGN KEY (ExpansionId) REFERENCES Expansion(Id), FOREIGN KEY (ThingId) REFERENCES Thing(ThingId));");
+ stmt.executeUpdate("CREATE TABLE IF NOT EXISTS ThingToDomain (ThingId INTEGER, DomainId INTEGER, FOREIGN KEY (DomainId) REFERENCES Domain(Id), FOREIGN KEY (ThingId) REFERENCES Thing(ThingId));");
+
stmt.close();
} catch (SQLException e) {
System.err.println("Couldn't create Schema");
@@ -181,10 +217,16 @@ public class SqliteController {
thingStatement.setString(2, metaData.getName());
thingStatement.setString(3, metaData.getImgURL());
thingStatement.setString(4, metaData.getThumbURL());
- thingStatement.setString(5, metaData.getComment());
- if(metaData.getNumPlays() != null) {
- thingStatement.setInt(6, metaData.getNumPlays());
+ ThingUserData userData = thing.getUserData();
+ if(userData != null) {
+ thingStatement.setString(5, userData.getComment());
+ if(userData.getNumPlays() != null) {
+ thingStatement.setInt(6, userData.getNumPlays());
+ } else {
+ thingStatement.setNull(6, java.sql.Types.INTEGER);
+ }
} else {
+ thingStatement.setString(5, "");
thingStatement.setNull(6, java.sql.Types.INTEGER);
}
thingStatement.execute();
@@ -254,10 +296,12 @@ public class SqliteController {
ThingMetaData metaData = new ThingMetaData(id,
res.getString(2),
res.getString(3),
- res.getString(4),
- res.getString(5),
- res.getInt(6));
+ res.getString(4));
+ ThingUserData userData = new ThingUserData();
+ userData.setComment(res.getString(5));
+ userData.setNumPlays(res.getInt(6));
Thing thing = new Thing(id, metaData);
+ thing.setUserData(userData);
thingList.add(thing);
}
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/BggApi.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/BggApi.java
index 1785174..7ea23bc 100644
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/BggApi.java
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/BggApi.java
@@ -78,6 +78,21 @@ public class BggApi {
return getThings(urlStr.toString());
}
+ public ArrayList getThingDetails(Set ids) {
+ StringBuilder urlStr = new StringBuilder();
+ urlStr.append(BASE_URL + "thing?id=");
+
+ String sep = "";
+ for (Integer integer : ids) {
+ urlStr.append(sep + integer.toString());
+ if(sep.isEmpty()) {
+ sep = ",";
+ }
+ }
+
+ return getThings(urlStr.toString());
+ }
+
public ArrayList getThingsForUser(String user) throws IllegalArgumentException {
ResultConfig resultConfig = configManager.getResultConfig();
@@ -171,7 +186,7 @@ public class BggApi {
// do something with the content
System.out.println(content.toString());
- ArrayList output = parseThingMetas(content.toString());
+ ArrayList output = parseThings(content.toString());
output.sort((thing1, thing2) -> thing1.getMetaData().getName().compareTo(thing2.getMetaData().getName()));
@@ -198,7 +213,7 @@ public class BggApi {
- private ArrayList parseThingMetas(String content) throws IllegalArgumentException {
+ private ArrayList parseThings(String content) throws IllegalArgumentException {
ArrayList things = new ArrayList();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
@@ -224,87 +239,20 @@ public class BggApi {
if( eElement.hasAttribute("objecttype")
&& eElement.getAttribute("objecttype").equals("thing"))
{
- Integer id = Integer.parseInt(eElement.getAttribute("objectid"));
- if(id != 0) {
- ThingMetaData tmd = new ThingMetaData(
- id,
- getValue(eElement, "name"),
- getValue(eElement, "image"),
- getValue(eElement, "thumbnail"),
- getValue(eElement, "comment"),
- Integer.parseInt(getValue(eElement, "numplays"))
- );
- Thing thing = new Thing(id, tmd);
- things.add(thing);
- }
+ extractThingByUser(things, eElement);
}
// when fetching things by id, type is boardgame
else if(eElement.hasAttribute("type") &&
eElement.getAttribute("type").equals("boardgame"))
{
- Integer id = Integer.parseInt(eElement.getAttribute("id"));
- if(id != 0) {
- String name = "";
- NodeList nameList = eElement.getElementsByTagName("name");
- for(int n = 0; n < nameList.getLength(); n++) {
- Node nameNode = nameList.item(n);
- if (nNode.getNodeType() == Node.ELEMENT_NODE) {
- Element nameElement = (Element) nameNode;
- if(nameElement.hasAttribute("type")
- && nameElement.getAttribute("type").equals("primary"))
- {
- name = nameElement.getAttribute("value");
- break;
- }
- }
- }
-
- ThingMetaData tmd = new ThingMetaData(
- id,
- name,
- getValue(eElement, "image"),
- getValue(eElement, "thumbnail"),
- getValue(eElement, "comment"),
- null
- );
- Thing thing = new Thing(id, tmd);
- things.add(thing);
- }
- }
+ extractThingsById(things, nNode, eElement);
+ }
+
// family has "type"
else if(eElement.hasAttribute("type")
&& eElement.getAttribute("type").equals("boardgamefamily"))
{
- // get name and description
- StringBuilder fInfo = new StringBuilder();
-
- NodeList nListName = eElement.getElementsByTagName("name");
- if(nListName.getLength() > 0) {
- fInfo.append(nListName.item(0).getTextContent() + "\r\n");
- }
-
- NodeList nListDesc = doc.getElementsByTagName("description");
- if(nListDesc.getLength() > 0) {
- fInfo.append(nListDesc.item(0).getTextContent());
- }
- eventBroker.send(EventConstants.TOPIC_FAMILY_INFO, fInfo.toString());
-
- NodeList nLinks = eElement.getElementsByTagName("link");
- for(int l = 0; l < nLinks.getLength(); l++) {
- Node link = nLinks.item(l);
- if (link.getNodeType() == Node.ELEMENT_NODE) {
- Element eLink = (Element) link;
- Integer id = Integer.parseInt(eLink.getAttribute("id"));
- if(id != 0) {
- ThingMetaData tmd = new ThingMetaData(
- id,
- eLink.getAttribute("value"),
- "", "", "", null);
- Thing thing = new Thing(id, tmd);
- things.add(thing);
- }
- }
- }
+ extractThingByFamily(things, doc, eElement);
// because of our input, there shouldn't be more than one family in the result
// but do not iterate over items just to make sure
@@ -315,35 +263,7 @@ public class BggApi {
}
// for geeklist result
else if(root.getTagName() == "geeklist") {
- StringBuilder gInfo = new StringBuilder();
-
- NodeList nListTitle = doc.getElementsByTagName("title");
- if(nListTitle.getLength() > 0) {
- gInfo.append(nListTitle.item(0).getTextContent() + "\r\n");
- }
-
- NodeList nListDesc = doc.getElementsByTagName("description");
- if(nListDesc.getLength() > 0) {
- gInfo.append(nListDesc.item(0).getTextContent());
- }
- eventBroker.send(EventConstants.TOPIC_GEEKLIST_INFO, gInfo.toString());
-
- NodeList nList = doc.getElementsByTagName("item");
- for(int i = 0; i < nList.getLength(); i++) {
- Node nNode = nList.item(i);
- if (nNode.getNodeType() == Node.ELEMENT_NODE) {
- Element eElement = (Element) nNode;
- Integer id = Integer.parseInt(eElement.getAttribute("objectid"));
- if(id != 0) {
- ThingMetaData tmd = new ThingMetaData(
- id,
- eElement.getAttribute("objectname"),
- "", "", "", null);
- Thing thing = new Thing(id, tmd);
- things.add(thing);
- }
- }
- }
+ extractThingByGeeklist(things, doc);
}
return things;
@@ -361,7 +281,299 @@ public class BggApi {
return null;
}
+ private void extractThingByGeeklist(ArrayList things, Document doc) {
+ StringBuilder gInfo = new StringBuilder();
+
+ NodeList nListTitle = doc.getElementsByTagName("title");
+ if(nListTitle.getLength() > 0) {
+ gInfo.append(nListTitle.item(0).getTextContent() + "\r\n");
+ }
+
+ NodeList nListDesc = doc.getElementsByTagName("description");
+ if(nListDesc.getLength() > 0) {
+ gInfo.append(nListDesc.item(0).getTextContent());
+ }
+ eventBroker.send(EventConstants.TOPIC_GEEKLIST_INFO, gInfo.toString());
+
+ NodeList nList = doc.getElementsByTagName("item");
+ for(int i = 0; i < nList.getLength(); i++) {
+ Node nNode = nList.item(i);
+ if (nNode.getNodeType() == Node.ELEMENT_NODE) {
+ Element eElement = (Element) nNode;
+ Integer id = Integer.parseInt(eElement.getAttribute("objectid"));
+ if(id != 0) {
+ ThingMetaData tmd = new ThingMetaData(
+ id,
+ eElement.getAttribute("objectname"),
+ "", "");
+ Thing thing = new Thing(id, tmd);
+ things.add(thing);
+ }
+ }
+ }
+ }
+
+ private void extractThingByFamily(ArrayList things, Document doc, Element eElement) {
+ // get name and description
+ StringBuilder fInfo = new StringBuilder();
+
+ NodeList nListName = eElement.getElementsByTagName("name");
+ if(nListName.getLength() > 0) {
+ fInfo.append(nListName.item(0).getTextContent() + "\r\n");
+ }
+
+ NodeList nListDesc = doc.getElementsByTagName("description");
+ if(nListDesc.getLength() > 0) {
+ fInfo.append(nListDesc.item(0).getTextContent());
+ }
+ eventBroker.send(EventConstants.TOPIC_FAMILY_INFO, fInfo.toString());
+
+ NodeList nLinks = eElement.getElementsByTagName("link");
+ for(int l = 0; l < nLinks.getLength(); l++) {
+ Node link = nLinks.item(l);
+ if (link.getNodeType() == Node.ELEMENT_NODE) {
+ Element eLink = (Element) link;
+ Integer id = Integer.parseInt(eLink.getAttribute("id"));
+ if(id != 0) {
+ ThingMetaData tmd = new ThingMetaData(
+ id,
+ eLink.getAttribute("value"),
+ "", "");
+ Thing thing = new Thing(id, tmd);
+ things.add(thing);
+ }
+ }
+ }
+ }
+ private void extractThingsById(ArrayList things, Node nNode, Element eElement) {
+ Integer id = Integer.parseInt(eElement.getAttribute("id"));
+ if(id != 0) {
+ String name = "";
+ NodeList nameList = eElement.getElementsByTagName("name");
+ for(int n = 0; n < nameList.getLength(); n++) {
+ Node nameNode = nameList.item(n);
+ if (nNode.getNodeType() == Node.ELEMENT_NODE) {
+ Element nameElement = (Element) nameNode;
+ if(nameElement.hasAttribute("type")
+ && nameElement.getAttribute("type").equals("primary"))
+ {
+ name = nameElement.getAttribute("value");
+ break;
+ }
+ }
+ }
+
+ ThingMetaData tmd = new ThingMetaData(
+ id,
+ name,
+ getValue(eElement, "image"),
+ getValue(eElement, "thumbnail"));
+
+ System.out.println("DEBUG: Details for " + id);
+
+ ThingDetails details = new ThingDetails();
+ details.yearpublished = getIntegerFromString(getValueAttribute(eElement, "yearpublished"));
+ details.minplayers = getIntegerFromString(getValueAttribute(eElement, "minplayers"));
+ details.maxplayers = getIntegerFromString(getValueAttribute(eElement, "maxplayers"));
+ details.playingtime = getIntegerFromString(getValueAttribute(eElement, "playingtime"));
+ details.minplaytime = getIntegerFromString(getValueAttribute(eElement, "minplaytime"));
+ details.maxplaytime = getIntegerFromString(getValueAttribute(eElement, "maxplaytime"));
+ details.age = getIntegerFromString(getValueAttribute(eElement, "minage"));
+
+ // number of players recommendations
+ // Only saving up to 20 players
+ NodeList pollList = eElement.getElementsByTagName("poll");
+ for(int n = 0; n < pollList.getLength(); n++) {
+ Node pollNode = pollList.item(n);
+ if (pollNode.getNodeType() == Node.ELEMENT_NODE) {
+ Element pollElement = (Element) pollNode;
+ if(pollElement.hasAttribute("name")) {
+ String pollType = pollElement.getAttribute("name");
+ if(pollType.equals("suggested_numplayers")) {
+ for(int p = 0; p < 20; ++p) {
+ if(p+1 < details.minplayers || p+1 > details.maxplayers) {
+ details.players.add(Recommendation.N);
+ } else {
+ details.players.add(getMajorityRecommendation(pollElement, p+1));
+ }
+ }
+ }
+
+ }
+ } // other polls
+ }
+
+ NodeList linkList = eElement.getElementsByTagName("link");
+ for(int n = 0; n < linkList.getLength(); n++) {
+ Node linkNode = linkList.item(n);
+ if (linkNode.getNodeType() == Node.ELEMENT_NODE) {
+ Element linkElement = (Element) linkNode;
+ if(linkElement.hasAttribute("type")) {
+ String type = linkElement.getAttribute("type");
+ switch(type) {
+ case "boardgamecategory":
+ details.category.add(extractLinkFromElement(linkElement));
+ break;
+ case "boardgamemechanic":
+ details.mechanic.add(extractLinkFromElement(linkElement));
+ break;
+ case "boardgamefamily":
+ details.family.add(extractLinkFromElement(linkElement));
+ break;
+ case "boardgamedesigner":
+ details.designer.add(extractLinkFromElement(linkElement));
+ break;
+ case "boardgameartist":
+ details.artist.add(extractLinkFromElement(linkElement));
+ break;
+ case "boardgamepublisher":
+ details.publisher.add(extractLinkFromElement(linkElement));
+ break;
+ case "boardgameexpansion":
+ details.expansion.add(extractLinkFromElement(linkElement));
+ break;
+ case "boardgamedomain":
+ details.domain.add(extractLinkFromElement(linkElement));
+ break;
+ default:
+ System.out.println("WARN: ignoring link element: " + type);
+ }
+ }
+ }
+ }
+
+ Thing thing = new Thing(id, tmd);
+ thing.setDetails(details);
+ things.add(thing);
+ }
+ }
+
+
+ private IdString extractLinkFromElement(Element linkElement) {
+ if(linkElement.hasAttribute("id") && linkElement.hasAttribute("value")) {
+ return new IdString(Integer.valueOf(linkElement.getAttribute("id")), linkElement.getAttribute("value"));
+ }
+ System.out.println("WARN: Link is missing attributes.");
+ return null;
+ }
+
+ private Recommendation getMajorityRecommendation(Element pollElement, int i) {
+ Recommendation recommendation = null;
+
+ NodeList nodeList = pollElement.getElementsByTagName("results");
+ for(int n = 0; n < nodeList.getLength(); ++n) {
+ Element elem = (Element)nodeList.item(n);
+ if(elem.hasAttribute("numplayers")) {
+ String attr = elem.getAttribute("numplayers");
+ boolean numPlayersDoesMatch = false;
+ // numplayers can be X+ where X is the max number of players...
+ if(attr.endsWith("+")) {
+ attr = attr.substring(0, attr.length()-1);
+ if(Integer.valueOf(attr) <= i) {
+ numPlayersDoesMatch = true;
+ }
+ } else {
+ numPlayersDoesMatch = Integer.valueOf(attr) == i;
+ }
+
+ if(numPlayersDoesMatch) {
+ int lastvotes = 0;
+ NodeList results = elem.getElementsByTagName("result");
+ for(int r = 0; r < results.getLength(); ++r) {
+ Element result = (Element)results.item(r);
+ if(result.hasAttribute("value") && result.hasAttribute("numvotes")) {
+ Integer numvotes = Integer.valueOf(result.getAttribute("numvotes"));
+ if(numvotes > lastvotes) {
+ recommendation = recommendationValueToEnum(result.getAttribute("value"));
+ }
+ }
+
+ }
+ }
+ }
+ }
+
+ return recommendation;
+ }
+
+ private Recommendation recommendationValueToEnum(String attribute) {
+ switch(attribute) {
+ case "Best":
+ return Recommendation.B;
+ case "Recommended":
+ return Recommendation.R;
+ case "Not Recommended":
+ return Recommendation.P;
+ default:
+ return Recommendation.N;
+ }
+ }
+
+ private void extractThingByUser(ArrayList things, Element eElement) {
+ Integer id = Integer.parseInt(eElement.getAttribute("objectid"));
+ if(id != 0) {
+ ThingMetaData tmd = new ThingMetaData(
+ id,
+ getValue(eElement, "name"),
+ getValue(eElement, "image"),
+ getValue(eElement, "thumbnail")
+ );
+ ThingUserData tud = new ThingUserData();
+ tud.setNumPlays(Integer.valueOf(getValue(eElement, "numplays")));
+ tud.setComment(getValue(eElement, "comment"));
+
+ // rating
+ NodeList statsNodes = eElement.getElementsByTagName("stats");
+ if(statsNodes.getLength() > 0) {
+ Node statsNode = statsNodes.item(0);
+ NodeList statsChildren = statsNode.getChildNodes();
+ if(statsChildren.getLength() > 0) {
+ Element ratingNode = (Element)statsChildren.item(0);
+ String ratingValue = ratingNode.getAttribute("value");
+ if(!ratingValue.equals("N/A")) {
+ try {
+ Float rating = Float.valueOf(ratingValue);
+ tud.setRating(rating);
+ }
+ catch(NumberFormatException e) {
+ System.out.println("WARN: rating value is not a float.");
+ }
+ }
+ }
+ }
+
+ NodeList statusNodes = eElement.getElementsByTagName("status");
+ if(statusNodes.getLength() > 0) {
+ Element statusNode = (Element)statusNodes.item(0);
+ tud.setOwn(attributeToBoolean(statusNode, "own"));
+ tud.setPrevowned(attributeToBoolean(statusNode, "prevowned"));
+ tud.setFortrade(attributeToBoolean(statusNode, "fortrade"));
+ tud.setWant(attributeToBoolean(statusNode, "want"));
+ tud.setWanttoplay(attributeToBoolean(statusNode, "wanttoplay"));
+ tud.setWanttobuy(attributeToBoolean(statusNode, "wanttobuy"));
+ tud.setWishlist(attributeToBoolean(statusNode, "wishlist"));
+ if(statusNode.hasAttribute("wishlistpriority")) {
+ tud.setWishlistpriority(Integer.valueOf(statusNode.getAttribute("wishlistpriority")));
+ }
+ tud.setPreordered(attributeToBoolean(statusNode, "preordered"));
+ tud.setLastmodified(statusNode.getAttribute("lastmodified"));
+ }
+
+ Thing thing = new Thing(id, tmd);
+ thing.setUserData(tud);
+ things.add(thing);
+ }
+ }
+
+
+ private Boolean attributeToBoolean(Element statusNode, String attribute) {
+ if(statusNode.hasAttribute(attribute)) {
+ return statusNode.getAttribute(attribute).equals("0") ? false : true;
+ }
+ return null;
+ }
+
private void checkForErrors(Document doc) throws IllegalArgumentException {
NodeList nList = doc.getElementsByTagName("error");
if(nList.getLength() > 0) {
@@ -374,6 +586,12 @@ public class BggApi {
}
}
+ private Integer getIntegerFromString(String s) {
+ if(s != null && !s.isEmpty()) {
+ return Integer.valueOf(s);
+ }
+ return null;
+ }
private String getValue(Element eElement, String key) {
Node node = eElement.getElementsByTagName(key).item(0);
@@ -384,5 +602,15 @@ public class BggApi {
}
}
+ private String getValueAttribute(Element eElement, String key) {
+ Node node = (Element)eElement.getElementsByTagName(key).item(0);
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ Element elem = (Element) node;
+ if(elem.hasAttribute("value")) {
+ return elem.getAttribute("value");
+ }
+ }
+ return null;
+ }
}
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/IdString.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/IdString.java
new file mode 100644
index 0000000..22bb581
--- /dev/null
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/IdString.java
@@ -0,0 +1,12 @@
+package xyz.veronie.bgg.result;
+
+/// Holds an id and its string representation, for example for Family, Extension, Mechanic, or Category.
+public class IdString {
+ public int id;
+ public String string;
+
+ public IdString(int id, String string) {
+ this.id = id;
+ this.string = string;
+ }
+}
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/Recommendation.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/Recommendation.java
new file mode 100644
index 0000000..2fdbede
--- /dev/null
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/Recommendation.java
@@ -0,0 +1,9 @@
+package xyz.veronie.bgg.result;
+
+public enum Recommendation {
+ N, // (N)onplayable
+ P, // (P)layable, not recommended
+ R, // (R)ecommended
+ B // (B)est with...
+}
+
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/Thing.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/Thing.java
index 9308437..bb7fa74 100644
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/Thing.java
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/Thing.java
@@ -14,16 +14,19 @@ import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
+import xyz.veronie.bgg.result.internal.OutputResultHelper;
import xyz.veronie.bgg.ui.helpers.Resources;
public class Thing {
private int id;
private ThingMetaData metaData;
+ private ThingUserData userData;
private ThingDetails details;
// cache
private Image thumbImage;
+ private Path imagePath;
public static final String IdHeader = "ID";
public static final String ThumbHeader = "Thumbnail";
@@ -49,9 +52,19 @@ public class Thing {
public void setMetaData(ThingMetaData metaData) {
this.metaData = metaData;
}
+
+ public void setUserData(ThingUserData userData) {
+ this.userData = userData;
+ }
+
+ public ThingUserData getUserData() {
+ return userData;
+ }
+
public ThingDetails getDetails() {
return details;
}
+
public void setDetails(ThingDetails details) {
this.details = details;
}
@@ -63,14 +76,22 @@ public class Thing {
return thumbImage;
}
+ public String getImagePath() {
+ if(imagePath != null)
+ return imagePath.toString();
+ else
+ return Paths.get(Resources.INSTANCE.getThumbsDir().toString()
+ + File.separator + String.valueOf(id) + ".png").toString();
+ }
+
private void getThumbImage(int thingId) {
Path tmpDir = Resources.INSTANCE.getTmpDir();
if(tmpDir != null) {
- Path imageFile = Paths.get(Resources.INSTANCE.getThumbsDir().toString()
+ imagePath = Paths.get(Resources.INSTANCE.getThumbsDir().toString()
+ File.separator + String.valueOf(thingId) + ".png");
- if(Files.exists(imageFile, LinkOption.NOFOLLOW_LINKS)) {
- String filename = imageFile.toString().replace("\\","/");
+ if(Files.exists(imagePath, LinkOption.NOFOLLOW_LINKS)) {
+ String filename = imagePath.toString().replace("\\","/");
thumbImage = Resources.INSTANCE.getResourceManager().createImage(
ImageDescriptor.createFromFile(null, filename));
} else {
@@ -81,7 +102,7 @@ public class Thing {
ImageLoader saver = new ImageLoader();
saver.data = new ImageData[] { thumbImage.getImageData() };
- saver.save(imageFile.toString(), SWT.IMAGE_PNG);
+ saver.save(imagePath.toString(), SWT.IMAGE_PNG);
} catch (MalformedURLException e) {
System.out.println("INFO: Malformed URL for ThingId " + thingId);
}
@@ -130,4 +151,60 @@ public class Thing {
}
}
+
+ private static String resultHeader() {
+ String header = "id,name,image,";
+ return header;
+ }
+
+ public static String makeResultHeader() {
+ String header = Thing.resultHeader() + ThingUserData.resultHeader() + ThingDetails.resultHeader();
+ return header;
+ }
+
+ /// convert the thing into a comma-separated line for a result.txt file
+ /**
+ * The format is (without line breaks):
+ * id,name,designer,
+ *
+ * owned,trading,wanting,wishing,userrating,comment,numplays,wishpriority
+ *
+ * designer,publisher,artist,yearpublished,minplayers,maxplayers,playingtime,minplaytime,maxplaytime,
+ * age,usersrated,average,bayesaverage,rank,rank_wg,numcomments,numweights,averageweight,stddev,median,
+ * category,mechanic,
+ * 1player,2player,3player,4player,5player,6player,7player,8player,9player,10player,
+ * 11player,12player,13player,14player,15player,16player,17player,18player,19player,20player,
+ * description,exp,basegame,reimplement,reimplement_name,reimplemented,reimplemented_name,
+ * contains,contains_name,iscontained,iscontained_name,integration,integration_name,price,
+ * expansions,domain,family,age_poll
+ *
+ * @return
+ */
+ // TODO: rewrite: order isn't important, column names are
+ public String toResultTxtLine() {
+ StringBuilder str = new StringBuilder();
+
+ // id,name,image,
+ OutputResultHelper.appendToResult(str, id);
+ OutputResultHelper.appendToResult(str, metaData.getName());
+ OutputResultHelper.appendToResult(str, getImagePath());
+
+ if(userData != null) {
+ userData.appendToResult(str);
+ } else {
+ str.append(ThingUserData.emptyReplacerLine());
+ }
+
+ if(details != null) {
+ str.append(details.toResultTextLine());
+ } else {
+ str.append(ThingDetails.emptyReplacerLine());
+ }
+
+ return str.toString();
+ }
+
+
+
+
}
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingDetails.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingDetails.java
index c064164..c3ce92e 100644
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingDetails.java
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingDetails.java
@@ -1,17 +1,44 @@
package xyz.veronie.bgg.result;
+import java.util.ArrayList;
+import java.util.List;
+
+import xyz.veronie.bgg.result.internal.OutputResultHelper;
+
public class ThingDetails {
Integer id;
String name;
- String designer;
- String publisher;
- String artist;
+ String description;
+ String image;
+ String comment;
+
Integer yearpublished;
Integer minplayers;
Integer maxplayers;
+
+ List designer;
+ List publisher;
+ List artist;
+
+ List category;
+ List mechanic;
+ List expansion;
+ List domain;
+ List family;
+
+
Integer playingtime;
Integer minplaytime;
Integer maxplaytime;
+
+ // poll suggested_numplayers
+ // The index in the list indicates the number of players
+ // Recommendation indicates how well it plays based on what the majority thinks
+ List players;
+
+ // poll suggested_playerage
+ Float age_poll;
+
Integer age;
Integer usersrated;
Integer average;
@@ -23,35 +50,127 @@ public class ThingDetails {
Float averageweight;
Float stddev;
Float median;
- Boolean owned;
- Boolean trading;
- Boolean wanting;
- Boolean wishing;
- Float userrating;
- String image;
- Integer category;
- Integer mechanic;
- String comment;
- Integer[] players; // 1 to 20
- String description;
- // exp,
- Integer basegameId;
- Integer reimplementId;
- String reimplement_name;
- Integer reimplementedById;
- String reimplementedByName;
- Integer containsId;
- String containsName;
- Integer iscontained;
- String iscontained_name;
- Integer integration;
- String integration_name;
+
+ Integer owning;
+ Integer trading;
+ Integer wanting;
+ Integer wishing;
+
+
+
+ // Integer basegameId;
+// Integer reimplementId;
+// String reimplement_name;
+// Integer reimplementedById;
+// String reimplementedByName;
+// Integer containsId;
+// String containsName;
+// Integer iscontained;
+// String iscontained_name;
+// Integer integration;
+// String integration_name;
Integer numplays;
Float price;
- Float userweight;
- Integer wishpriority;
Integer expansions;
- String domain;
- String family;
- Float age_poll;
+
+ public ThingDetails() {
+ players = new ArrayList();
+
+ designer = new ArrayList();
+ publisher = new ArrayList();
+ artist = new ArrayList();
+ category = new ArrayList();
+ mechanic = new ArrayList();
+ expansion = new ArrayList();
+ domain = new ArrayList();
+ family = new ArrayList();
+ }
+
+ public String toResultTextLine() {
+ StringBuilder str = new StringBuilder();
+
+ // designer,publisher,artist,yearpublished,minplayers,maxplayers,playingtime,minplaytime,maxplaytime,
+ // age,usersrated,average,bayesaverage,rank,rank_wg,numcomments,numweights,averageweight,stddev,median,
+ // category,mechanic,
+ OutputResultHelper.appendToResult(str, OutputResultHelper.getFirstIdListItem(designer));
+ OutputResultHelper.appendToResult(str, OutputResultHelper.getFirstIdListItem(publisher));
+ OutputResultHelper.appendToResult(str, OutputResultHelper.getFirstIdListItem(artist));
+ OutputResultHelper.appendToResult(str, yearpublished);
+ OutputResultHelper.appendToResult(str, minplayers);
+ OutputResultHelper.appendToResult(str, maxplayers);
+ OutputResultHelper.appendToResult(str, playingtime);
+ OutputResultHelper.appendToResult(str, minplaytime);
+ OutputResultHelper.appendToResult(str, maxplaytime);
+ OutputResultHelper.appendToResult(str, age);
+ OutputResultHelper.appendToResult(str, usersrated);
+ OutputResultHelper.appendToResult(str, average);
+ OutputResultHelper.appendToResult(str, bayesaverage);
+ OutputResultHelper.appendToResult(str, rank);
+ OutputResultHelper.appendToResult(str, rank_wg);
+ OutputResultHelper.appendToResult(str, numcomments);
+ OutputResultHelper.appendToResult(str, numweights);
+ OutputResultHelper.appendToResult(str, averageweight);
+ OutputResultHelper.appendToResult(str, stddev);
+ OutputResultHelper.appendToResult(str, median);
+ OutputResultHelper.appendToResult(str, category);
+ OutputResultHelper.appendToResult(str, mechanic);
+
+ // owned,trading,wanting,wishing
+ OutputResultHelper.appendToResult(str, owning);
+ OutputResultHelper.appendToResult(str, trading);
+ OutputResultHelper.appendToResult(str, wanting);
+ OutputResultHelper.appendToResult(str, wishing);
+
+ // 1player,2player,3player,4player,5player,6player,7player,8player,9player,10player,
+ // 11player,12player,13player,14player,15player,16player,17player,18player,19player,20player,
+ for(int i = 0; i < players.size(); ++i) {
+ Recommendation r = players.get(i);
+ if(r != null) {
+ str.append(r.name());
+ }
+ str.append(",");
+ }
+
+ // description,exp,
+ OutputResultHelper.appendToResult(str, description);
+ OutputResultHelper.appendToResult(str, expansion);
+
+
+ // basegame,reimplement,reimplement_name,reimplemented,reimplemented_name,
+ // contains,contains_name,iscontained,iscontained_name,integration,integration_name,
+ // TODO:
+// str.append(basegameId).append(",");
+// str.append(reimplementId).append(",");
+// str.append(reimplement_name).append(",");
+// str.append(reimplementedById).append(",");
+// str.append(reimplementedByName).append(",");
+// str.append(containsId).append(",");
+// str.append(containsName).append(",");
+// str.append(iscontained).append(",");
+// str.append(iscontained_name).append(",");
+// str.append(integration).append(",");
+// str.append(integration_name).append(",");
+// str.append("0,,\"\",,\"\",,\"\",,\"\",,\"\"");
+
+ // price,expansions,domain,family,age_poll
+ OutputResultHelper.appendToResult(str, price);
+ OutputResultHelper.appendToResult(str, expansions);
+ OutputResultHelper.appendToResult(str, domain);
+ OutputResultHelper.appendToResult(str, family);
+ str.append(OutputResultHelper.floatToResult(age_poll));
+
+ return str.toString();
+ }
+
+
+ public static String emptyReplacerLine() {
+ return ",,,,,,,,,,,0.0,0.0,,,0,0,0.0,0.0,0.0,\"\",\"\",,,,,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\"\",\"\",0.0,,\"\",\"\",0.0";
+ }
+
+ public static String resultHeader() {
+ return "designer,publisher,artist,yearpublished,minplayers,maxplayers,playingtime,minplaytime,maxplaytime,age,usersrated,average,bayesaverage,rank,rank_wg,numcomments,numweights,averageweight,stddev,median,category,mechanic,owned,trading,wanting,wishing,1player,2player,3player,4player,5player,6player,7player,8player,9player,10player,11player,12player,13player,14player,15player,16player,17player,18player,19player,20player,description,exp,price,expansions,domain,family,age_poll";
+ // not doing: basegame,reimplement,reimplement_name,reimplemented,reimplemented_name,contains,contains_name,iscontained,iscontained_name,integration,integration_name,
+ }
+
+
}
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingDetailsComposite.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingDetailsComposite.java
deleted file mode 100644
index 8762ba7..0000000
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingDetailsComposite.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package xyz.veronie.bgg.result;
-
-import java.awt.Label;
-
-import javax.annotation.PostConstruct;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-public class ThingDetailsComposite extends Composite {
- ThingDetails thingDetails;
- private Label nameField;
- private Label designerField;
- private Label publisherField;
- private Label yearField;
-
- public ThingDetailsComposite(Composite parent, int style) {
- super(parent, style);
- }
-
- @PostConstruct
- public void create() {
- setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-
- GridLayout layout = new GridLayout(2, false);
- setLayout(layout);
-
- Label nameLbl = new Label("Name");
- applyLayout(nameLbl);
- nameField = new Label("");
-
- Label designerLbl = new Label("Designer");
- applyLayout(designerLbl);
- designerField = new Label("");
-
- Label publisherLbl = new Label("Publisher");
- applyLayout(publisherLbl);
- publisherField = new Label("");
-
- Label yearLbl = new Label("Publisher");
- applyLayout(yearLbl);
- yearField = new Label("");
-
- this.getParent().layout();
- }
-
-
- private void applyLayout(Label label) {
- label.setAlignment(SWT.RIGHT);
- }
-
- public void selectedThingChanged(Thing thing) {
- System.out.println("TOPIC_THING_SELECTION: " + thing);
- thingDetails = thing.getDetails();
-
- if(thingDetails != null) {
- nameField.setText(thingDetails.name);
- designerField.setText(thingDetails.designer);
- publisherField.setText(thingDetails.publisher);
- yearField.setText(Integer.toString(thingDetails.yearpublished));
- } else {
- nameField.setText("");
- designerField.setText("");
- publisherField.setText("");
- yearField.setText("");
-
- }
- this.getParent().layout();
- }
-
-
-}
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingMetaData.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingMetaData.java
index 7998bca..432773d 100644
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingMetaData.java
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingMetaData.java
@@ -2,7 +2,6 @@ package xyz.veronie.bgg.result;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
-//import com.google.gson.Gson;
public class ThingMetaData implements java.io.Serializable {
private static final long serialVersionUID = -5268898737006538509L;
@@ -11,21 +10,15 @@ public class ThingMetaData implements java.io.Serializable {
private String name;
private String imgURL;
private String thumbURL;
- private String comment;
- private Integer numPlays;
-
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
public ThingMetaData(int id, String name,
- String imgURL, String thumURL,
- String comment, Integer numPlays) {
+ String imgURL, String thumURL) {
this.setId(id);
this.setName(name);
this.setImgURL(imgURL);
this.setThumbURL(thumURL);
- this.setComment(comment);
- this.setNumPlays(numPlays);
}
@@ -78,29 +71,9 @@ public class ThingMetaData implements java.io.Serializable {
this.thumbURL = thumbURL);
}
- public Integer getNumPlays() {
- return numPlays;
- }
-
- public void setNumPlays(Integer numPlays) {
- this.numPlays = numPlays;
- }
-
-
- public String getComment() {
- return comment;
- }
-
- public void setComment(String comment) {
- propertyChangeSupport.firePropertyChange("comment", this.comment,
- this.comment = comment);
- }
-
@Override
public String toString() {
return String.valueOf(id);
-// Gson gson = new Gson();
-// return gson.toJson(this);
}
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingProvider.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingProvider.java
index c5ae7eb..8b2c080 100644
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingProvider.java
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingProvider.java
@@ -2,10 +2,13 @@ package xyz.veronie.bgg.result;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.function.Predicate;
import javax.annotation.PostConstruct;
+import javax.inject.Inject;
import javax.inject.Singleton;
import org.eclipse.e4.core.di.annotations.Creatable;
@@ -15,6 +18,10 @@ import xyz.veronie.bgg.localdb.LocalDbAdapterService;
@Creatable
@Singleton
public class ThingProvider {
+
+ @Inject
+ private BggApi bggApi;
+
private LocalDbAdapterService localDbAdapterService;
/// list of things. Each ID is expected to exist exactly once.
@@ -118,5 +125,21 @@ public class ThingProvider {
return localDbAdapterService.loadThingListNames();
}
+ public void fetchDetails() {
+ // prepare list of ids to retrieve
+ Set ids = new HashSet<>();
+ for (Thing thing : things) {
+ if(thing.getDetails() == null) {
+ ids.add(thing.getId());
+ }
+ }
+
+ System.out.println(Thing.makeResultHeader());
+ ArrayList thingsWithDetails = bggApi.getThingDetails(ids);
+ for (Thing thing : thingsWithDetails) {
+ System.out.println(thing.toResultTxtLine());
+ }
+
+ }
}
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingUserData.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingUserData.java
new file mode 100644
index 0000000..5d6d00d
--- /dev/null
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingUserData.java
@@ -0,0 +1,157 @@
+package xyz.veronie.bgg.result;
+
+import xyz.veronie.bgg.result.internal.OutputResultHelper;
+
+public class ThingUserData {
+ private Integer numplays;
+ private String comment;
+
+ private Float rating;
+ private Boolean own;
+ private Boolean prevowned;
+ private Boolean fortrade;
+ private Boolean want;
+ private Boolean wanttoplay;
+ private Boolean wanttobuy;
+ private Boolean wishlist;
+ private Integer wishlistpriority;
+ private Boolean preordered;
+ private String lastmodified;
+
+ //private Float weight;
+
+ public Integer getNumPlays() {
+ return numplays;
+ }
+
+ public void setNumPlays(Integer numPlays) {
+ this.numplays = numPlays;
+ }
+
+
+ public String getComment() {
+ return comment;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ public Float getRating() {
+ return rating;
+ }
+
+ public void setRating(Float rating) {
+ this.rating = rating;
+ }
+
+ public Boolean getOwn() {
+ return own;
+ }
+
+ public void setOwn(Boolean own) {
+ this.own = own;
+ }
+
+ public Boolean getPrevowned() {
+ return prevowned;
+ }
+
+ public void setPrevowned(Boolean prevowned) {
+ this.prevowned = prevowned;
+ }
+
+ public Boolean getFortrade() {
+ return fortrade;
+ }
+
+ public void setFortrade(Boolean fortrade) {
+ this.fortrade = fortrade;
+ }
+
+ public Boolean getWant() {
+ return want;
+ }
+
+ public void setWant(Boolean want) {
+ this.want = want;
+ }
+
+ public Boolean getWanttoplay() {
+ return wanttoplay;
+ }
+
+ public void setWanttoplay(Boolean wanttoplay) {
+ this.wanttoplay = wanttoplay;
+ }
+
+ public Boolean getWanttobuy() {
+ return wanttobuy;
+ }
+
+ public void setWanttobuy(Boolean wanttobuy) {
+ this.wanttobuy = wanttobuy;
+ }
+
+ public Boolean getWishlist() {
+ return wishlist;
+ }
+
+ public void setWishlist(Boolean wishlist) {
+ this.wishlist = wishlist;
+ }
+
+ public Integer getWishlistpriority() {
+ return wishlistpriority;
+ }
+
+ public void setWishlistpriority(Integer wishlistpriority) {
+ this.wishlistpriority = wishlistpriority;
+ }
+
+ public Boolean getPreordered() {
+ return preordered;
+ }
+
+ public void setPreordered(Boolean preordered) {
+ this.preordered = preordered;
+ }
+
+ public String getLastmodified() {
+ return lastmodified;
+ }
+
+ public void setLastmodified(String lastmodified) {
+ this.lastmodified = lastmodified;
+ }
+
+ public void appendToResult(StringBuilder str) {
+ OutputResultHelper.appendToResult(str, getRating());
+ OutputResultHelper.appendToResult(str, getComment());
+ OutputResultHelper.appendToResult(str, getNumPlays());
+ // TODO: find out how to get userweight...
+ }
+
+ public String toString() {
+ StringBuilder str = new StringBuilder();
+ appendToResult(str);
+ return str.toString();
+ }
+
+ public static String emptyReplacerLine() {
+ return "N/A,\"\",0,";
+ }
+
+ public static String resultHeader() {
+ return "userrating,comment,numplays,";
+ }
+
+// public Float getWeight() {
+// return weight;
+// }
+//
+// public void setWeight(Float weight) {
+// this.weight = weight;
+// }
+
+}
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/internal/OutputResultHelper.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/internal/OutputResultHelper.java
new file mode 100644
index 0000000..f3ed241
--- /dev/null
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/internal/OutputResultHelper.java
@@ -0,0 +1,60 @@
+package xyz.veronie.bgg.result.internal;
+
+import java.util.List;
+
+import xyz.veronie.bgg.result.IdString;
+
+public class OutputResultHelper {
+
+ public static String floatToResult(Float f) {
+ if(f == null) {
+ return "N/A";
+ } else {
+ return Float.toString(f.floatValue());
+ }
+ }
+
+
+ public static String getFirstIdListItem(List list) {
+ if(list != null && list.size() > 0) {
+ return list.get(0).string;
+ }
+ return "";
+ }
+
+ public static void appendToResult(StringBuilder str, String string) {
+ str.append("\"");
+ if(string != null) {
+ str.append(string);
+ }
+ str.append("\",");
+ }
+
+ public static void appendToResult(StringBuilder str, Integer i) {
+ if(i != null) {
+ str.append(Integer.toString(i));
+ }
+ str.append(",");
+ }
+
+ public static void appendToResult(StringBuilder str, Float f) {
+ str.append(OutputResultHelper.floatToResult(f)).append(",");
+ }
+
+ public static void appendToResult(StringBuilder str, List list) {
+ if(list == null) {
+ str.append(",");
+ return;
+ }
+
+ str.append("\"");
+ String nanDeckSeparator = "";
+ for (IdString idString : list) {
+ str.append(nanDeckSeparator);
+ nanDeckSeparator = "\\13\\";
+ str.append(idString.string);
+ }
+ str.append("\",");
+ }
+
+}
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/dialogs/LoadGameListDialog.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/dialogs/LoadGameListDialog.java
index 74a037b..85eb8d5 100644
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/dialogs/LoadGameListDialog.java
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/dialogs/LoadGameListDialog.java
@@ -106,6 +106,8 @@ public class LoadGameListDialog extends Dialog {
tableViewer.setInput(thingLists);
int selection = 0;
tableViewer.setSelection(new StructuredSelection(tableViewer.getElementAt(selection)), true);
+ selectedName = (String)tableViewer.getStructuredSelection().getFirstElement();
+
tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/filters/BggUserSourceFilter.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/filters/BggUserSourceFilter.java
index b3195ba..fc3dc97 100644
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/filters/BggUserSourceFilter.java
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/filters/BggUserSourceFilter.java
@@ -87,7 +87,7 @@ public class BggUserSourceFilter {
bottomComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Label infoLabel = new Label(bottomComposite, SWT.LEFT);
- infoLabel.setText("Select which flags are used as filter. Filters follow 'AND' rule.");
+ infoLabel.setText("Select which flags are used as filter. Filters follow 'AND' rule for each game.");
GridData gdInfo = new GridData(SWT.FILL, SWT.FILL, true, false);
gdInfo.horizontalSpan = 2;
infoLabel.setLayoutData(gdInfo);
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/handlers/ExportResultHandler.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/handlers/ExportResultHandler.java
new file mode 100644
index 0000000..2c6e0fe
--- /dev/null
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/handlers/ExportResultHandler.java
@@ -0,0 +1,41 @@
+
+package xyz.veronie.bgg.ui.handlers;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+
+import xyz.veronie.bgg.result.BggApi;
+import xyz.veronie.bgg.result.Thing;
+import xyz.veronie.bgg.result.ThingProvider;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.eclipse.e4.core.di.annotations.CanExecute;
+
+public class ExportResultHandler {
+
+ @Inject
+ ThingProvider thingProvider;
+
+ @Inject
+ private BggApi bggApi;
+
+ @Execute
+ public void execute() {
+ thingProvider.fetchDetails();
+ }
+
+
+
+
+
+ @CanExecute
+ public boolean canExecute() {
+ return thingProvider != null;
+ }
+
+}
\ No newline at end of file
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/BatMain.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/BatMain.java
index 97c8a03..409bb72 100644
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/BatMain.java
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/BatMain.java
@@ -148,6 +148,16 @@ public class BatMain {
btnUndo.setEnabled(false);
btnExport = new Button(buttonRow, SWT.NONE);
+ btnExport.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseUp(MouseEvent e) {
+ ParameterizedCommand cmd =
+ commandService.createCommand("xyz.veronie.bgg.ui.command.export", null);
+ if (handlerService.canExecute(cmd)){
+ handlerService.executeHandler(cmd);
+ }
+ }
+ });
btnExport.setImage(ResourceManager.getPluginImage("xyz.veronie.bgg.ui", "icons/export_nandeck_60x60.png"));
btnExport.setToolTipText("Export for nanDeck");
btnExport.setEnabled(false);
@@ -222,20 +232,7 @@ public class BatMain {
TableViewerColumn colThumbnail = createTableViewerColumn(Thing.ThumbHeader, 120, 0);
-// colThumbnail.setLabelProvider(new ColumnLabelProvider() {
-// @Override
-// public Image getImage(Object element) {
-// Thing t = (Thing) element;
-// Image img = t.getThumbnail();
-// return img;
-// }
-//
-// @Override
-// public String getText(Object element) {
-// return "";
-// }
-//
-// });
+
colThumbnail.setLabelProvider(new OwnerDrawLabelProvider() {
@Override
protected void measure(Event event, Object element) {
diff --git a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/ThingListPart.java b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/ThingListPart.java
index c2a2cb8..1b8bcf3 100644
--- a/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/ThingListPart.java
+++ b/xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/ThingListPart.java
@@ -11,12 +11,9 @@ import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import xyz.veronie.bgg.result.Thing;
-import xyz.veronie.bgg.result.ThingDetailsComposite;
import xyz.veronie.bgg.types.EventConstants;
public class ThingListPart {
- private ThingDetailsComposite thingDetailsComposite;
-
@PostConstruct
public void createControls(Composite parent) {
Composite main = new Composite(parent, SWT.FILL);
@@ -24,14 +21,11 @@ public class ThingListPart {
GridLayout layout = new GridLayout(2, false);
main.setLayout(layout);
-
- thingDetailsComposite = new ThingDetailsComposite(main, SWT.BORDER);
}
@Inject
@Optional
private void selectedThingChanged(@UIEventTopic(EventConstants.TOPIC_THING_SELECTION) Thing thing) {
- thingDetailsComposite.selectedThingChanged(thing);
}