OwnStatisticsPlugin calculates the figures with concurrency service

This commit is contained in:
frosch95
2013-10-01 23:14:37 +02:00
parent 6d28263f63
commit 2b6e9a925c

View File

@@ -1,5 +1,9 @@
import de.frosch95.geofrogger.plugins.Plugin import de.frosch95.geofrogger.plugins.Plugin
import javafx.collections.FXCollections import javafx.collections.FXCollections
import javafx.concurrent.Service
import javafx.concurrent.Task
import javafx.concurrent.WorkerStateEvent
import javafx.event.EventHandler
import javafx.geometry.Insets import javafx.geometry.Insets
import javafx.scene.chart.PieChart import javafx.scene.chart.PieChart
import javafx.scene.control.Label import javafx.scene.control.Label
@@ -17,13 +21,20 @@ class OwnStatisticsPlugin implements Plugin {
final String name = "Own Statistic" final String name = "Own Statistic"
final String version = "0.0.1" final String version = "0.0.1"
final CalculateService service = new CalculateService();
OwnStatisticsPlugin() {
service.onSucceeded = {
showDialog(createHeader(), createContent(it.source.value))
} as EventHandler<WorkerStateEvent>;
}
@Override @Override
void run(final Map context) { void run(final Map context) {
showDialog(createHeader(context.sessionContext), createContent(context.sessionContext)) calculateStats(context.sessionContext)
} }
private javafx.scene.Node createHeader(sessionContext) { private javafx.scene.Node createHeader() {
def pane = new Pane() def pane = new Pane()
def Label label = new Label() def Label label = new Label()
label.text = "This example plugin shows some stats based on the current list.\nThese statistics are found statistics, based on all found caches in the list." label.text = "This example plugin shows some stats based on the current list.\nThese statistics are found statistics, based on all found caches in the list."
@@ -36,59 +47,48 @@ class OwnStatisticsPlugin implements Plugin {
* @param sessionContext context with the cache list in it * @param sessionContext context with the cache list in it
* @return * @return
*/ */
private javafx.scene.Node createContent(sessionContext) { private void calculateStats(sessionContext) {
// get the cache list out of the context // get the cache list out of the context
def cacheList = sessionContext.getData("cache-list") def cacheList = sessionContext.getData("cache-list")
service.cacheList = cacheList;
service.restart();
}
/**
* creates the statistic charts to show
* @param sessionContext context with the cache list in it
* @return
*/
private javafx.scene.Node createContent(result) {
// create a vbox as layout container // create a vbox as layout container
VBox contenPane = new VBox() VBox contenPane = new VBox()
contenPane.prefWidth = 600 contenPane.prefWidth = 600
VBox.setVgrow(contenPane, Priority.ALWAYS); VBox.setVgrow(contenPane, Priority.ALWAYS);
// groovy maps for selecting the statistic numbers
def typeStats = [:]
def difficultyStats = [:]
def terrainStats = [:]
def foundCount = 0
println cacheList.size()
// iterate over all the caches and count the data
for (def cache in cacheList) {
if (cache.found) {
foundCount++
incrementStats(typeStats, cache.type)
incrementStats(difficultyStats, cache.difficulty)
incrementStats(terrainStats, cache.terrain)
}
}
// create javafx chart // create javafx chart
def typeData = FXCollections.observableArrayList() def typeData = FXCollections.observableArrayList()
typeStats.each() { key, value -> typeData.add(new Data(key.toString() + ' (' + value + ')', value as double)) } result.typeStats.each() { key, value -> typeData.add(new Data(key.toString() + ' (' + value + ')', value as double)) }
def typeChart = new PieChart(typeData); def typeChart = new PieChart(typeData);
typeChart.setTitle("Spreading of cache types found (${foundCount})."); typeChart.setTitle("Spreading of cache types found (${result.foundCount}).");
// create javafx chart // create javafx chart
def difficultyData = FXCollections.observableArrayList() def difficultyData = FXCollections.observableArrayList()
difficultyTerrainValues.each { difficultyTerrainValues.each {
def value = difficultyStats[it] def value = result.difficultyStats[it]
if (value) difficultyData.add(new Data(it+ ' (' + value + ')', value)) if (value) difficultyData.add(new Data(it+ ' (' + value + ')', value))
} }
def difficultyChart = new PieChart(difficultyData); def difficultyChart = new PieChart(difficultyData);
difficultyChart.setTitle("Spreading of difficulties found (${foundCount})."); difficultyChart.setTitle("Spreading of difficulties found (${result.foundCount}).");
// create javafx chart // create javafx chart
def terrainData = FXCollections.observableArrayList() def terrainData = FXCollections.observableArrayList()
difficultyTerrainValues.each { difficultyTerrainValues.each {
def value = terrainStats[it] def value = result.terrainStats[it]
if (value) terrainData.add(new Data(it+ ' (' + value + ')', value)) if (value) terrainData.add(new Data(it+ ' (' + value + ')', value))
} }
def terrainChart = new PieChart(terrainData); def terrainChart = new PieChart(terrainData);
terrainChart.setTitle("Spreeading of terrain found (${foundCount})."); terrainChart.setTitle("Spreeading of terrain found (${result.foundCount}).");
// add charts to layout container // add charts to layout container
contenPane.children.addAll(typeChart, difficultyChart, terrainChart) contenPane.children.addAll(typeChart, difficultyChart, terrainChart)
@@ -100,10 +100,6 @@ class OwnStatisticsPlugin implements Plugin {
scrollPane scrollPane
} }
private void incrementStats(map, key) {
map[key] = map[key] ? map[key] + 1 : 1
}
private void showDialog(header, content) { private void showDialog(header, content) {
Dialog dialog = new Dialog(null, name+" ("+version+")", true) Dialog dialog = new Dialog(null, name+" ("+version+")", true)
dialog.setMasthead(header) dialog.setMasthead(header)
@@ -111,3 +107,38 @@ class OwnStatisticsPlugin implements Plugin {
dialog.show() dialog.show()
} }
} }
class CalculateService extends Service {
def cacheList
@Override
protected Task createTask() {
return new Task() {
@Override
protected LinkedHashMap call() throws Exception {
def typeStats = [:]
def difficultyStats = [:]
def terrainStats = [:]
def foundCount = 0
for (def cache in cacheList) {
if (cache.found) {
foundCount++
incrementStats(typeStats, cache.type)
incrementStats(difficultyStats, cache.difficulty)
incrementStats(terrainStats, cache.terrain)
}
}
['foundCount': foundCount, 'typeStats': typeStats, 'difficultyStats': difficultyStats, 'terrainStats': terrainStats]
}
};
}
private void incrementStats(map, key) {
map[key] = map[key] ? map[key] + 1 : 1
}
}