Pārlūkot izejas kodu

Started to implement SQlite local db for thing lists.... WIP

pull/2/head
veronie pirms 4 gadiem
vecāks
revīzija
36ffe5e052
9 mainītis faili ar 307 papildinājumiem un 136 dzēšanām
  1. +1
    -0
      xyz.veronie.bgg.ui/Application.e4xmi
  2. Binārs
      xyz.veronie.bgg.ui/icons/folder-symbol.png
  3. +38
    -0
      xyz.veronie.bgg.ui/src/xyz/veronie/bgg/localdb/LocalDbAdapterService.java
  4. +134
    -0
      xyz.veronie.bgg.ui/src/xyz/veronie/bgg/localdb/SqliteController.java
  5. +17
    -26
      xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingProvider.java
  6. +6
    -2
      xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/handlers/HandleSaveGamelist.java
  7. +5
    -6
      xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/BggResultPart.java
  8. +97
    -97
      xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/DownloadThingDetailsPart.java
  9. +9
    -5
      xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/PreparePart.java

+ 1
- 0
xyz.veronie.bgg.ui/Application.e4xmi Parādīt failu

@@ -11,6 +11,7 @@
<children xsi:type="basic:Part" xmi:id="_97XbwEqTEeqT5sxfmvJ5Tg" elementId="xyz.veronie.bgg.ui.part.resulttable" contributionURI="bundleclass://xyz.veronie.bgg.ui/xyz.veronie.bgg.ui.parts.BggResultPart" label="BGG Result">
<toolbar xmi:id="_ZZOF8J3AEeqjssfAjxHZ-w" elementId="xyz.veronie.bgg.ui.toolbar.0">
<children xsi:type="menu:DirectToolItem" xmi:id="_c42V4J29EeqjssfAjxHZ-w" elementId="xyz.veronie.bgg.ui.directtoolitem.saveResult" label="save result" iconURI="platform:/plugin/xyz.veronie.bgg.ui/icons/save-button.png" contributionURI="bundleclass://xyz.veronie.bgg.ui/xyz.veronie.bgg.ui.handlers.HandleSaveGamelist"/>
<children xsi:type="menu:DirectToolItem" xmi:id="_VeUlQFZdEeu8-NdCRpPGXA" elementId="xyz.veronie.bgg.ui.directtoolitem.openlist" label="open list" iconURI="platform:/plugin/xyz.veronie.bgg.ui/icons/folder-symbol.png"/>
</toolbar>
</children>
</children>


Binārs
xyz.veronie.bgg.ui/icons/folder-symbol.png Parādīt failu

Pirms Pēc
Platums: 512  |  Augstums: 512  |  Izmērs: 2.2KB

+ 38
- 0
xyz.veronie.bgg.ui/src/xyz/veronie/bgg/localdb/LocalDbAdapterService.java Parādīt failu

@@ -0,0 +1,38 @@
package xyz.veronie.bgg.localdb;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import xyz.veronie.bgg.result.ThingMetaData;
public class LocalDbAdapterService {
private SqliteController sqliteController;
public LocalDbAdapterService() {
initDb();
}
private void initDb() {
File dbFile = new File(SqliteController.DB_PATH);
if(!dbFile.exists()) {
SqliteController.getInstance().createSchema();
}
sqliteController = SqliteController.getInstance();
}
/// add a list of things with the given name
public void storeThingList(List<ThingMetaData> things, String name) {
sqliteController.openThingList(name);
sqliteController.addToThingList(name, things);
}
/// retrieve a list of things with the given name
public List<ThingMetaData> retrieveThingList(String name) {
// TODO: implement retrieve thing list
return new ArrayList<ThingMetaData>();
}
}

+ 134
- 0
xyz.veronie.bgg.ui/src/xyz/veronie/bgg/localdb/SqliteController.java Parādīt failu

@@ -0,0 +1,134 @@
package xyz.veronie.bgg.localdb;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import xyz.veronie.bgg.result.ThingMetaData;
public class SqliteController {
private static final SqliteController dbcontroller = new SqliteController();
private static Connection connection;
public static final String DB_PATH = System.getProperty("user.home") + "/" + "bggtool.db";
static {
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
System.err.println("Error while loading JDBC driver");
e.printStackTrace();
}
}
private SqliteController() {
initDBConnection();
}
public static SqliteController getInstance() {
return dbcontroller;
}
private void initDBConnection() {
try {
if (connection != null)
return;
System.out.println("Creating Connection to Database...");
String filename = System.getProperty("user.home") + "/bggtool.db";
connection = DriverManager.getConnection("jdbc:sqlite:" + filename);
if (!connection.isClosed())
System.out.println("...Connection established");
} catch (SQLException e) {
throw new RuntimeException(e);
}
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
if (!connection.isClosed() && connection != null) {
connection.close();
if (connection.isClosed())
System.out.println("Connection to Database closed");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
});
}
public void createSchema() {
try {
Statement stmt = connection.createStatement();
stmt.executeUpdate("DROP TABLE IF EXISTS Thing;");
stmt.executeUpdate("DROP TABLE IF EXISTS ThingList");
stmt.executeUpdate("DROP TABLE IF EXISTS ThingListToThing");
stmt.executeUpdate("CREATE TABLE Thing (ThingId INTEGER PRIMARY KEY, Name, ImgUrl, ThumbUrl, Comment, NumPlays);");
stmt.executeUpdate("CREATE TABLE ThingList (ListId INTEGER PRIMARY KEY, Name) ON DELETE CASCADE;");
stmt.executeUpdate("CREATE UNIQUE INDEX idx1 ON ThingList(Name)");
stmt.executeUpdate("CREATE TABLE ThingListToThing (ListId, ThingId, FOREIGN KEY (ListId) REFERENCES ThingList(ListId), FOREIGN KEY (ThingId) REFERENCES Thing(ThingId));");
stmt.executeUpdate("CREATE UNIQUE INDEX idx2 ON ThingListToThing(ListId, ThingId)");
} catch (SQLException e) {
System.err.println("Couldn't create Schema");
e.printStackTrace();
}
}
public void openThingList(String name) {
try {
Statement stmt = connection.createStatement();
// insert new thing list if one with that name does not exist already
stmt.executeQuery("INSERT INTO ThingList (name) VALUES ('" + name + "');");
} catch (SQLException e) {
System.err.println("Couldn't add to thing list with handle " + name);
e.printStackTrace();
}
}
public void addToThingList(String name, List<ThingMetaData> things) {
try {
Statement stmt = connection.createStatement();
ResultSet res = stmt.executeQuery("SELECT ListId from ThingList where name = '" + name + "'");
int listId = res.getInt(0);
PreparedStatement thingStatement = connection
.prepareStatement("INSERT INTO Thing VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT REPLACE;");
PreparedStatement listToThingStatement = connection
.prepareStatement("INSERT INTO ThingListToThing VALUES (?, ?)");
for (ThingMetaData thing : things) {
thingStatement.setInt(1, thing.getId());
thingStatement.setString(2, thing.getName());
thingStatement.setString(3, thing.getImgURL());
thingStatement.setString(4, thing.getThumbURL());
thingStatement.setString(5, thing.getComment());
thingStatement.setInt(6, thing.getNumPlays());
thingStatement.addBatch();
// get generated id
ResultSet keys = thingStatement.getGeneratedKeys();
int thingId = keys.getInt(0);
listToThingStatement.setInt(0, listId);
listToThingStatement.setInt(1, thingId);
listToThingStatement.addBatch();
}
connection.setAutoCommit(false);
thingStatement.executeBatch();
connection.setAutoCommit(true);
} catch (SQLException e) {
System.err.println("Couldn't add to thing list with handle " + name);
e.printStackTrace();
}
}
}

+ 17
- 26
xyz.veronie.bgg.ui/src/xyz/veronie/bgg/result/ThingProvider.java Parādīt failu

@@ -1,24 +1,29 @@
package xyz.veronie.bgg.result;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import xyz.veronie.bgg.result.ThingMetaData;
import org.eclipse.core.runtime.Path;
import javax.annotation.PostConstruct;
import javax.inject.Singleton;
//import com.google.gson.Gson;
import org.eclipse.e4.core.di.annotations.Creatable;
public enum ThingProvider {
INSTANCE;
import xyz.veronie.bgg.localdb.LocalDbAdapterService;
@Creatable
@Singleton
public class ThingProvider {
private LocalDbAdapterService localDbAdapterService;
/// list of things. Each ID is expected to exist exactly once.
private List<ThingMetaData> thingMetas;
public ThingProvider() {}
private ThingProvider() {
@PostConstruct
public void init() {
localDbAdapterService = new LocalDbAdapterService();
thingMetas = new ArrayList<ThingMetaData>();
}
@@ -69,23 +74,9 @@ public enum ThingProvider {
}
}
/// create a tag of the current list
public void tagResult() {
// Gson gson = new Gson();
// String resultList = gson.toJson(this.thingMetas);
try {
Path filesPath = new Path("result_" + Long.toString(System.currentTimeMillis()));
System.out.println("File output path: " + filesPath);
BufferedWriter writer = new BufferedWriter(
new FileWriter(filesPath.toString()));
// writer.write(resultList);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
/// store current list in DB
public void storeList() {
localDbAdapterService.storeThingList(this.thingMetas, "TestList");
}


+ 6
- 2
xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/handlers/HandleSaveGamelist.java Parādīt failu

@@ -1,6 +1,8 @@
package xyz.veronie.bgg.ui.handlers;
import javax.inject.Inject;
import org.eclipse.e4.core.di.annotations.CanExecute;
import org.eclipse.e4.core.di.annotations.Execute;
@@ -8,15 +10,17 @@ import xyz.veronie.bgg.result.ThingProvider;
public class HandleSaveGamelist {
@Inject
ThingProvider thingProvider;
@Execute
public void execute() {
ThingProvider.INSTANCE.tagResult();
thingProvider.storeList();
}
@CanExecute
public boolean canExecute() {
// TODO
return true;
}


+ 5
- 6
xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/BggResultPart.java Parādīt failu

@@ -6,18 +6,14 @@ import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.di.UIEventTopic;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
@@ -31,6 +27,9 @@ public class BggResultPart {
private TableViewer viewer;
private Label statsLabel;
@Inject
private ThingProvider thingProvider;
@PostConstruct
public void createControls(Composite parent) {
Composite main = new Composite(parent, SWT.FILL);
@@ -62,7 +61,7 @@ public class BggResultPart {
viewer.setContentProvider(new ArrayContentProvider());
// Get the content for the viewer, setInput will call getElements in the
// contentProvider
viewer.setInput(ThingProvider.INSTANCE.getThingMetas());
viewer.setInput(thingProvider.getThingMetas());
// make the selection available to other views
// TODO: getSite().setSelectionProvider(viewer);
// Set the sorter for the table
@@ -125,7 +124,7 @@ public class BggResultPart {
(@UIEventTopic(EventConstants.TOPIC_RESULT_CHANGED)
String empty) {
System.out.println("TOPIC_RESULT_CHANGED");
List<ThingMetaData> thingMetas = ThingProvider.INSTANCE.getThingMetas();
List<ThingMetaData> thingMetas = thingProvider.getThingMetas();
viewer.setInput(thingMetas);
viewer.refresh();


+ 97
- 97
xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/DownloadThingDetailsPart.java Parādīt failu

@@ -92,103 +92,103 @@ public class DownloadThingDetailsPart {
Button onlyNewCheck = new Button(optionsGroup, SWT.CHECK);
onlyNewCheck.setText("Only new");
Button usePersNamesCheck = new Button(optionsGroup, SWT.CHECK);
usePersNamesCheck.setText("Use pers. names");
usePersNamesCheck.setEnabled(false);
Button only1DesignerCheck = new Button(optionsGroup, SWT.CHECK);
only1DesignerCheck.setText("Only one designer");
only1DesignerCheck.setEnabled(false);
Button withDescCheck = new Button(optionsGroup, SWT.CHECK);
withDescCheck.setText("With description");
Button usePersImagesCheck = new Button(optionsGroup, SWT.CHECK);
usePersImagesCheck.setText("Use pers. images");
usePersImagesCheck.setEnabled(false);
Button only1PublisherCheck = new Button(optionsGroup, SWT.CHECK);
only1PublisherCheck.setText("Only one publisher");
only1PublisherCheck.setEnabled(false);
Button limitDescCheck = new Button(optionsGroup, SWT.CHECK);
limitDescCheck.setText("Limit description");
Button useRecBestInfoCheck = new Button(optionsGroup, SWT.CHECK);
useRecBestInfoCheck.setText("Use rec./best info");
useRecBestInfoCheck.setEnabled(false);
Button only1ArtistCheck = new Button(optionsGroup, SWT.CHECK);
only1ArtistCheck.setText("Only one artist");
only1ArtistCheck.setEnabled(false);
Button downloadVotesCheck = new Button(optionsGroup, SWT.CHECK);
downloadVotesCheck.setText("Download votes");
downloadVotesCheck.setEnabled(false);
downloadVotesCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
extendedInfoCheck.setEnabled(true);
}
});
Button brnDetailCheck = new Button(optionsGroup, SWT.CHECK);
brnDetailCheck.setText("B/R/N detail");
brnDetailCheck.setEnabled(false);
Button reloadDataCheck = new Button(optionsGroup, SWT.CHECK);
reloadDataCheck.setText("Reload data");
reloadDataCheck.setEnabled(false);
extendedInfoCheck = new Button(optionsGroup, SWT.CHECK);
extendedInfoCheck.setText(" Extended info");
extendedInfoCheck.setEnabled(false); // enabled when download votes is checked
Button downloadPlaysCheck = new Button(optionsGroup, SWT.CHECK);
downloadPlaysCheck.setText("Download plays");
downloadPlaysCheck.setEnabled(false);
downloadPlaysCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
downloadAllPlaysCheck.setEnabled(true);
}
});
Button reloadImagesCheck = new Button(optionsGroup, SWT.CHECK);
reloadImagesCheck.setText("Reload images");
reloadImagesCheck.setEnabled(false);
Button downloadLangCheck = new Button(optionsGroup, SWT.CHECK);
downloadLangCheck.setText("Download lang.");
downloadLangCheck.setEnabled(false);
downloadAllPlaysCheck = new Button(optionsGroup, SWT.CHECK);
downloadAllPlaysCheck.setText(" Download plays (all)");
downloadAllPlaysCheck.setEnabled(false); // enabled when download plays checked
Button ReloadQRCodesCheck = new Button(optionsGroup, SWT.CHECK);
ReloadQRCodesCheck.setText("Reload QR codes");
ReloadQRCodesCheck.setEnabled(false);
Button namesImgCheck = new Button(optionsGroup, SWT.CHECK);
namesImgCheck.setText("Names in images");
namesImgCheck.setEnabled(false);
Button useQrCodesCheck = new Button(optionsGroup, SWT.CHECK);
useQrCodesCheck.setText("Use QR codes");
useQrCodesCheck.setEnabled(false);
// Button onlyNewCheck = new Button(optionsGroup, SWT.CHECK);
// onlyNewCheck.setText("Only new");
//
// Button usePersNamesCheck = new Button(optionsGroup, SWT.CHECK);
// usePersNamesCheck.setText("Use pers. names");
// usePersNamesCheck.setEnabled(false);
//
// Button only1DesignerCheck = new Button(optionsGroup, SWT.CHECK);
// only1DesignerCheck.setText("Only one designer");
// only1DesignerCheck.setEnabled(false);
//
//
// Button withDescCheck = new Button(optionsGroup, SWT.CHECK);
// withDescCheck.setText("With description");
//
// Button usePersImagesCheck = new Button(optionsGroup, SWT.CHECK);
// usePersImagesCheck.setText("Use pers. images");
// usePersImagesCheck.setEnabled(false);
//
// Button only1PublisherCheck = new Button(optionsGroup, SWT.CHECK);
// only1PublisherCheck.setText("Only one publisher");
// only1PublisherCheck.setEnabled(false);
//
//
// Button limitDescCheck = new Button(optionsGroup, SWT.CHECK);
// limitDescCheck.setText("Limit description");
//
// Button useRecBestInfoCheck = new Button(optionsGroup, SWT.CHECK);
// useRecBestInfoCheck.setText("Use rec./best info");
// useRecBestInfoCheck.setEnabled(false);
//
// Button only1ArtistCheck = new Button(optionsGroup, SWT.CHECK);
// only1ArtistCheck.setText("Only one artist");
// only1ArtistCheck.setEnabled(false);
//
//
//
// Button downloadVotesCheck = new Button(optionsGroup, SWT.CHECK);
// downloadVotesCheck.setText("Download votes");
// downloadVotesCheck.setEnabled(false);
// downloadVotesCheck.addSelectionListener(new SelectionAdapter() {
// @Override
// public void widgetSelected(SelectionEvent e) {
// extendedInfoCheck.setEnabled(true);
// }
// });
//
// Button brnDetailCheck = new Button(optionsGroup, SWT.CHECK);
// brnDetailCheck.setText("B/R/N detail");
// brnDetailCheck.setEnabled(false);
//
// Button reloadDataCheck = new Button(optionsGroup, SWT.CHECK);
// reloadDataCheck.setText("Reload data");
// reloadDataCheck.setEnabled(false);
//
//
//
// extendedInfoCheck = new Button(optionsGroup, SWT.CHECK);
// extendedInfoCheck.setText(" Extended info");
// extendedInfoCheck.setEnabled(false); // enabled when download votes is checked
//
// Button downloadPlaysCheck = new Button(optionsGroup, SWT.CHECK);
// downloadPlaysCheck.setText("Download plays");
// downloadPlaysCheck.setEnabled(false);
// downloadPlaysCheck.addSelectionListener(new SelectionAdapter() {
// @Override
// public void widgetSelected(SelectionEvent e) {
// downloadAllPlaysCheck.setEnabled(true);
// }
// });
//
// Button reloadImagesCheck = new Button(optionsGroup, SWT.CHECK);
// reloadImagesCheck.setText("Reload images");
// reloadImagesCheck.setEnabled(false);
//
//
//
// Button downloadLangCheck = new Button(optionsGroup, SWT.CHECK);
// downloadLangCheck.setText("Download lang.");
// downloadLangCheck.setEnabled(false);
//
// downloadAllPlaysCheck = new Button(optionsGroup, SWT.CHECK);
// downloadAllPlaysCheck.setText(" Download plays (all)");
// downloadAllPlaysCheck.setEnabled(false); // enabled when download plays checked
//
// Button ReloadQRCodesCheck = new Button(optionsGroup, SWT.CHECK);
// ReloadQRCodesCheck.setText("Reload QR codes");
// ReloadQRCodesCheck.setEnabled(false);
//
//
// Button namesImgCheck = new Button(optionsGroup, SWT.CHECK);
// namesImgCheck.setText("Names in images");
// namesImgCheck.setEnabled(false);
//
// Button useQrCodesCheck = new Button(optionsGroup, SWT.CHECK);
// useQrCodesCheck.setText("Use QR codes");
// useQrCodesCheck.setEnabled(false);
}


+ 9
- 5
xyz.veronie.bgg.ui/src/xyz/veronie/bgg/ui/parts/PreparePart.java Parādīt failu

@@ -56,7 +56,11 @@ public class PreparePart {
@Inject
private ResultConfigManager configManager;
@Inject private IEventBroker eventBroker;
@Inject
private IEventBroker eventBroker;
@Inject
private ThingProvider thingProvider;
// inject all source filter composites
@Inject private BggUserSourceFilter bggUserSourceFilter;
@@ -196,16 +200,16 @@ public class PreparePart {
private void useThingsOnResult(ArrayList<ThingMetaData> thingMetas) {
switch(configManager.getResultConfig().action) {
case REP:
ThingProvider.INSTANCE.replaceThingMetas(thingMetas);
thingProvider.replaceThingMetas(thingMetas);
break;
case ADD:
ThingProvider.INSTANCE.addThingMetas(thingMetas);
thingProvider.addThingMetas(thingMetas);
break;
case SUB:
ThingProvider.INSTANCE.subtractThingMetas(thingMetas);
thingProvider.subtractThingMetas(thingMetas);
break;
case AND:
ThingProvider.INSTANCE.intersectThingMetas(thingMetas);
thingProvider.intersectThingMetas(thingMetas);
break;
}
eventBroker.send(EventConstants.TOPIC_RESULT_CHANGED, "");


Notiek ielāde…
Atcelt
Saglabāt