Parcourir la source

Fixed Sonar errors (Not in test)

Axel Nordh il y a 3 ans
Parent
commit
daa36e7e0a

+ 3 - 3
Odds/.classpath

@@ -6,13 +6,13 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+	<classpathentry kind="lib" path="F:/Resources/JAVA/MysqlConnector/mysql-connector-java-8.0.17.jar"/>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="lib" path="F:/Resources/JAVA/MysqlConnector/mysql-connector-java-8.0.17.jar"/>
-	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-18">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>

+ 4 - 11
Odds/.settings/org.eclipse.jdt.core.prefs

@@ -1,15 +1,8 @@
 eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=18
+org.eclipse.jdt.core.compiler.compliance=18
 org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
 org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.source=18

+ 6 - 0
Odds/.settings/org.sonarlint.eclipse.core.prefs

@@ -0,0 +1,6 @@
+autoEnabled=true
+eclipse.preferences.version=1
+idePrefixKey=
+projectKey=Odds
+serverId=OddsFx
+sqPrefixKey=

+ 2 - 2
Odds/pom.xml

@@ -10,8 +10,8 @@
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.8.1</version>
         <configuration>
-          <source>1.8</source>
-          <target>1.8</target>
+          <source>18</source>
+          <target>18</target>
         </configuration>
       </plugin>
     </plugins>

+ 4 - 4
OddsJavaFx/.classpath

@@ -6,18 +6,18 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
+	<classpathentry combineaccessrules="false" kind="src" path="/Odds"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-18">
 		<attributes>
-			<attribute name="module" value="true"/>
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JavaFX"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/Odds"/>
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.fx.ide.jdt.core.JAVAFX_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JavaFx"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>

+ 3 - 3
OddsJavaFx/.settings/org.eclipse.jdt.core.prefs

@@ -1,9 +1,9 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=18
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=18
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -13,4 +13,4 @@ org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
 org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.source=18

+ 6 - 0
OddsJavaFx/.settings/org.sonarlint.eclipse.core.prefs

@@ -0,0 +1,6 @@
+autoEnabled=true
+eclipse.preferences.version=1
+idePrefixKey=
+projectKey=Odds
+serverId=OddsFx
+sqPrefixKey=

+ 5 - 7
OddsJavaFx/pom.xml

@@ -3,20 +3,19 @@
   <groupId>Odds</groupId>
   <artifactId>Odds</artifactId>
   <version>0.0.1-SNAPSHOT</version>
+    <properties>
+    <maven.compiler.source>18</maven.compiler.source>
+    <maven.compiler.target>18</maven.compiler.target>
+  </properties>
   <build>
     <sourceDirectory>src</sourceDirectory>
     <plugins>
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.8.1</version>
-        <configuration>
-          <source>1.8</source>
-          <target>1.8</target>
-        </configuration>
+        <version>3.10.1</version>
       </plugin>
     </plugins>
   </build>
-
    <dependencies>
    <dependency>
 	 <groupId>com.google.guava</groupId>
@@ -33,6 +32,5 @@
 	    <artifactId>RCaller</artifactId>
 	    <version>3.0</version>
 	</dependency>
-
    </dependencies>
 </project>

+ 69 - 82
OddsJavaFx/src/controllers/MainController.java

@@ -1,21 +1,20 @@
 package controllers;
 
-import java.io.IOException;
-import java.math.BigDecimal;
 import java.net.URL;
-import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.util.AbstractMap.SimpleEntry;
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.ResourceBundle;
 
+import org.eclipse.jetty.util.log.Log;
+
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
 import data.GuiMysql;
+import exceptions.SportSelectionException;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.event.ActionEvent;
@@ -31,8 +30,9 @@ import parser.OddsPortal;
 
 public class MainController implements Initializable {
 
-	public static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
-
+	public static final String SPORT = "Sport";
+	public static final String SOCCER = "soccer";
+	public static final String LEAGUE = "League";
 	@FXML private MatchTabController matchTabController;
 	@FXML private StatisticsTabController statTabController;
 	@FXML private MatchStatTabController matchStatTabController;
@@ -66,99 +66,94 @@ public class MainController implements Initializable {
 
 	@FXML private Pane glass;
 
-	private ArrayList<SimpleEntry<Integer, String>> sportsList = Lists.newArrayList();
-	private final ArrayList<SimpleEntry<Integer, String>> countriesList = Lists.newArrayList();
-	private ArrayList<SimpleEntry<Integer, String>> leaguesList = Lists.newArrayList();
+	private List<SimpleEntry<Integer, String>> sportsList = Lists.newArrayList();
+	private final List<SimpleEntry<Integer, String>> countriesList = Lists.newArrayList();
+	private List<SimpleEntry<Integer, String>> leaguesList = Lists.newArrayList();
 
 	@SuppressWarnings("unchecked")
-	@Override
-	public void initialize(URL arg0, ResourceBundle arg1) {
+	@Override public void initialize(URL arg0, ResourceBundle arg1) {
 		sportsList = GuiMysql.getInstance().getSports();
-		sports.add("Sport");
-		for (final SimpleEntry<Integer, String>  entry : sportsList) {
-			if (entry.getValue().equals("soccer")) { // Använder just nu bara Soccer
+		sports.add(SPORT);
+		for (final SimpleEntry<Integer, String> entry : sportsList) {
+			if (entry.getValue().equals(SOCCER)) { // Anv�nder just nu bara Soccer
 				sports.add(entry.getValue());
 			}
 		}
 
-		matchTabController.getTable().getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
-			if (newSelection != null) {
-				showMatchStatsButton.setDisable(false);
-				final Object selectedItem = matchTabController.getTable().getSelectionModel().getSelectedItem();
-				System.out.println(selectedItem.toString());
-			} else {
-				showMatchStatsButton.setDisable(true);
-			}
-		});
+		matchTabController.getTable().getSelectionModel().selectedItemProperty().addListener(
+				(obs, oldSelection, newSelection) -> showMatchStatsButton.setDisable(newSelection == null));
 
 		sportSelector.setItems(sports);
 		countrySelector.setItems(countries);
 		leagueSelector.setItems(leagues);
 	}
 
-	@FXML
-	private void SportSelected(ActionEvent event) throws IOException {
-		if (sportSelector.getValue() != null && !sportSelector.getValue().equals("Sport")) {
+	@FXML private void sportSelected(ActionEvent event) {
+		if (sportSelector.getValue() != null && !sportSelector.getValue().equals(SPORT)) {
 			countrySelector.setDisable(false);
-			final int sportId = sportsList.stream().filter(p -> p.getValue().equals(sportSelector.getValue())).findFirst().get().getKey();
-			final ArrayList<SoccerMatch> upcomingMatches = GuiMysql.getInstance().getUpcomingMatches("SoccerResults", sportId);
+			List<SoccerMatch> upcomingMatches = GuiMysql.getInstance().getUpcomingMatches("SoccerResults");
+
+			matchTabController.setUpcomingMatches(upcomingMatches);
 
-			matchTabController.setMatches(upcomingMatches, matchStatTabController);
 			countriesList.clear();
 			for (final SoccerMatch soccerMatch : upcomingMatches) {
 				homeTeams.add(soccerMatch.getHomeTeam().getTeamName());
 				awayTeams.add(soccerMatch.getAwayTeam().getTeamName());
 
-				if (countriesList.stream().noneMatch(p -> p != null && p.getValue().equals(soccerMatch.getHomeTeam().getCountryName()))) {
-					countriesList.add(new SimpleEntry<>(soccerMatch.getHomeTeam().getCountryId(), soccerMatch.getHomeTeam().getCountryName()));
+				if (countriesList.stream()
+						.noneMatch(p -> p != null && p.getValue().equals(soccerMatch.getHomeTeam().getCountryName()))) {
+					countriesList.add(new SimpleEntry<>(soccerMatch.getHomeTeam().getCountryId(),
+							soccerMatch.getHomeTeam().getCountryName()));
 				}
 			}
 
-			//			countriesList.sort((c1, c2) -> c1.getValue().compareTo(c2.getValue()));
 			countriesList.forEach(c -> countries.add(c.getValue()));
 
 			homeTeamSelector.setItems(homeTeams);
 			awayTeamSelector.setItems(awayTeams);
-
 		}
 	}
 
-	@FXML
-	private void CountrySelected(ActionEvent event) {
+	@FXML private void countrySelected(ActionEvent event) {
 		if (countrySelector.getValue() != null && !countrySelector.getValue().equals("Country")) {
 			leagueSelector.setDisable(false);
 			final int countryId = getCountryIdFromSelector();
-			final int sportId = sportsList.stream().filter(p -> p.getValue().equals(sportSelector.getValue())).findFirst().get().getKey();
-			matchTabController.filterCountryMatches(countrySelector.getValue());
-
-			leaguesList = GuiMysql.getInstance().getLeagues(sportId, countryId);
-			final List<String> leaguesInTable = Lists.newArrayList();
-			matchTabController.getTableMatches().forEach(tr -> leaguesInTable.add((String) tr.get("league")));
-			final HashSet<String> newHashSet = Sets.newHashSet(leaguesInTable);
-
-			leagues.clear();
-			leagues.add("League");
-			leagues.addAll(newHashSet);
+			Optional<SimpleEntry<Integer, String>> selectedSport = sportsList.stream()
+					.filter(p -> p.getValue().equals(sportSelector.getValue())).findFirst();
+			if (selectedSport.isPresent()) {
+				final int sportId = selectedSport.get().getKey();
+				matchTabController.filterCountryMatches(countrySelector.getValue());
+
+				leaguesList = GuiMysql.getInstance().getLeagues(sportId, countryId);
+				final List<String> leaguesInTable = Lists.newArrayList();
+				matchTabController.getTableMatches().forEach(tr -> leaguesInTable.add((String) tr.get("league")));
+				final HashSet<String> newHashSet = Sets.newHashSet(leaguesInTable);
+
+				leagues.clear();
+				leagues.add(LEAGUE);
+				leagues.addAll(newHashSet);
+			} else {
+				throw new SportSelectionException("No sport found");
+			}
 
 		}
 	}
 
-	//	private Integer getSportIdFromSelector() {
-	//		return sportsList.stream().filter(p -> p.getValue().equals(sportSelector.getValue())).findFirst().get().getKey();
-	//	}
-
 	private Integer getCountryIdFromSelector() {
-		return countriesList.stream().filter(p -> p.getValue().equals(countrySelector.getValue())).findFirst().get().getKey();
+		Optional<SimpleEntry<Integer, String>> o = countriesList.stream()
+				.filter(p -> p.getValue().equals(countrySelector.getValue())).findFirst();
+		return o.isPresent() ? o.get().getKey() : null;
 	}
 
 	private Integer getLeagueIdFromSelector() {
-		return leaguesList.stream().filter(p -> p.getValue().equals(leagueSelector.getValue())).findFirst().get().getKey();
+		Optional<SimpleEntry<Integer, String>> o = leaguesList.stream()
+				.filter(p -> p.getValue().equals(leagueSelector.getValue())).findFirst();
+		return o.isPresent() ? o.get().getKey() : null;
 	}
 
-	@FXML
-	private void LeagueSelected(ActionEvent event) {
+	@FXML private void leagueSelected(ActionEvent event) {
 
-		if (leagueSelector.getValue() != null && !leagueSelector.getValue().equals("League")) {
+		if (leagueSelector.getValue() != null && !leagueSelector.getValue().equals(LEAGUE)) {
 			homeTeamSelector.setDisable(false);
 			awayTeamSelector.setDisable(false);
 			showMatchStatsButton.setDisable(false);
@@ -171,7 +166,8 @@ public class MainController implements Initializable {
 			}
 			matchTabController.filterLeagueMatches(leagueSelector.getValue());
 			updateStatsTableButton.setDisable(false);
-			final ArrayList<Float> leagueAvareges = GuiMysql.getInstance().getLeagueAvarages(getLeagueIdFromSelector(), getCountryIdFromSelector());
+			final List<Float> leagueAvareges = GuiMysql.getInstance().getLeagueAvarages(getLeagueIdFromSelector(),
+					getCountryIdFromSelector());
 
 			avgLeagueHomeScoreTxt.setText(leagueAvareges.get(0).toString());
 			avgLeagueAwayScoreTxt.setText(leagueAvareges.get(1).toString());
@@ -184,11 +180,10 @@ public class MainController implements Initializable {
 		}
 	}
 
-	@FXML
-	private void ResetFilter() {
-		sportSelector.setValue("Sport");
+	@FXML private void resetFilter() {
+		sportSelector.setValue(SPORT);
 		countrySelector.setValue("Country");
-		leagueSelector.setValue("League");
+		leagueSelector.setValue(LEAGUE);
 		leagueSelector.setDisable(true);
 		countrySelector.setDisable(true);
 		matchTabController.resetFilter();
@@ -201,25 +196,25 @@ public class MainController implements Initializable {
 		glass.setVisible(true);
 		glass.setOpacity(0.8);
 		final OddsPortal op = new OddsPortal();
-		op.getHistoricMatches(sportSelector.getValue().trim(), country, league, String.valueOf(LocalDate.now().getYear()));
+		op.getHistoricMatches(sportSelector.getValue().trim(), country, league,
+				String.valueOf(LocalDate.now().getYear()));
 		glass.setOpacity(0.0);
 		glass.setVisible(false);
 		glass.setDisable(true);
 	}
 
-	@FXML
-	private void UpdateStatsTable() {
+	@FXML private void updateStatsTable() {
 		statTabController.setOverUnderTable(getLeagueIdFromSelector());
 	}
 
-	@FXML
-	private void getMoreLeagueInfo() {
-		final String lastParsedYear = GuiMysql.getInstance().getLastParsedYear(leagueSelector.getValue().trim(), getCountryIdFromSelector());
+	@FXML private void getMoreLeagueInfo() {
+		final String lastParsedYear = GuiMysql.getInstance().getLastParsedYear(leagueSelector.getValue().trim(),
+				getCountryIdFromSelector());
 		final String nextParseYear;
 		if (lastParsedYear.contains("-")) {
 			final String[] years = lastParsedYear.split("-");
-			int firstYear = Integer.valueOf(years[0]);
-			int lastYear = Integer.valueOf(years[1]);
+			int firstYear = Integer.parseInt(years[0]);
+			int lastYear = Integer.parseInt(years[1]);
 			firstYear--;
 			lastYear--;
 			nextParseYear = firstYear + "-" + lastYear;
@@ -228,29 +223,21 @@ public class MainController implements Initializable {
 			val--;
 			nextParseYear = String.valueOf(val);
 		} else {
-			System.out.println("Fail to get More league info for " + lastParsedYear);
+			Log.getLog().info("Fail to get More league info for %s", lastParsedYear);
 			return;
 		}
 
 		final String country = countrySelector.getValue().trim();
 		final String league = leagueSelector.getValue().trim();
 
-
 		final OddsPortal op = new OddsPortal();
-		op.getHistoricMatches("soccer", country, league, nextParseYear);
+		op.getHistoricMatches(SOCCER, country, league, nextParseYear);
 	}
 
-	@FXML
-	private void setMatchStatInfo() {
-		final HashMap<?, ?> selectedItem = (HashMap<?, ?>) matchTabController.getTable().getSelectionModel().getSelectedItem();
-		final String season = GuiMysql.getInstance().getLastSeason(getCountryIdFromSelector(), getLeagueIdFromSelector());
+	@FXML private void setMatchStatInfo() {
+		final String season = GuiMysql.getInstance().getLastSeason(getCountryIdFromSelector(),
+				getLeagueIdFromSelector());
 		matchStatTabController.setLeagueStandingsTable(getLeagueIdFromSelector(), season, getCountryIdFromSelector());
-		matchStatTabController.updateTab((String)selectedItem.get("homeTeam"), (String)selectedItem.get("awayTeam"),
-				((BigDecimal)selectedItem.get("goalDiff")).floatValue(),
-				((Float) selectedItem.get("avgScoreHome")),
-				((Float)selectedItem.get("avgConcededHome")),
-				((Float)selectedItem.get("avgScoreAway")),
-				((Float)selectedItem.get("avgConcededAway")));
 	}
 
 }

+ 4 - 9
OddsJavaFx/src/controllers/MatchResultTabController.java

@@ -1,8 +1,8 @@
 package controllers;
 
 import java.net.URL;
-import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.ResourceBundle;
 
@@ -15,8 +15,7 @@ import javafx.scene.control.TableView;
 import javafx.scene.control.cell.MapValueFactory;
 import objects.SoccerMatch;
 
-@SuppressWarnings("rawtypes")
-public class MatchResultTabController implements Initializable {
+@SuppressWarnings("rawtypes") public class MatchResultTabController implements Initializable {
 
 	@FXML TableColumn<Map, String> homeTeamColumn = new TableColumn<>("Home Team");
 	@FXML TableColumn<Map, String> awayTeamColumn = new TableColumn<>("Away Team");
@@ -29,11 +28,7 @@ public class MatchResultTabController implements Initializable {
 
 	private ObservableList<Map<String, Object>> matches;
 
-	public MatchResultTabController() {
-	}
-
-	@Override
-	public void initialize(URL arg0, ResourceBundle arg1) {
+	@Override public void initialize(URL arg0, ResourceBundle arg1) {
 		homeTeamColumn.setCellValueFactory(new MapValueFactory<>("homeTeam"));
 		awayTeamColumn.setCellValueFactory(new MapValueFactory<>("awayTeam"));
 		goalsHomeColumn.setCellValueFactory(new MapValueFactory<>("goalsHome"));
@@ -45,7 +40,7 @@ public class MatchResultTabController implements Initializable {
 
 	}
 
-	public void setMatches(ArrayList<SoccerMatch> upcomingMatches) {
+	public void setMatches(List<SoccerMatch> upcomingMatches) {
 
 		for (final SoccerMatch soccerMatch : upcomingMatches) {
 			final Map<String, Object> match = new HashMap<>();

+ 25 - 28
OddsJavaFx/src/controllers/MatchStatTabController.java

@@ -1,7 +1,7 @@
 package controllers;
 
 import java.net.URL;
-import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.ResourceBundle;
 
@@ -15,57 +15,54 @@ import javafx.scene.control.TableView;
 import javafx.scene.control.cell.MapValueFactory;
 import objects.TeamStanding;
 
-@SuppressWarnings("rawtypes")
-public class MatchStatTabController implements Initializable {
+@SuppressWarnings("rawtypes") public class MatchStatTabController implements Initializable {
+
+	private static final String GOALS_CONCEDED = "goalsConceded";
+
+	private static final String GOALS_SCORED = "goalsScored";
+
+	private static final String POINTS_STRING = "points";
+
+	private static final String GAMES_PLAYED = "gamesPlayed";
 
 	@FXML TableView<Map<String, Object>> matchStatTable;
 
 	@FXML TableColumn<Map, String> team = new TableColumn<>("team");
-	@FXML TableColumn<Map, Integer> gamesPlayed = new TableColumn<>("gamesPlayed");
+	@FXML TableColumn<Map, Integer> gamesPlayed = new TableColumn<>(GAMES_PLAYED);
 	@FXML TableColumn<Map, Integer> win = new TableColumn<>("win");
 	@FXML TableColumn<Map, Integer> draw = new TableColumn<>("draw");
 	@FXML TableColumn<Map, Integer> loss = new TableColumn<>("loss");
-	@FXML TableColumn<Map, Integer> points = new TableColumn<>("points");
-	@FXML TableColumn<Map, Float> goalsScored = new TableColumn<>("goalsScored");
-	@FXML TableColumn<Map, Float> goalsConceded = new TableColumn<>("goalsConceded");
+	@FXML TableColumn<Map, Integer> points = new TableColumn<>(POINTS_STRING);
+	@FXML TableColumn<Map, Float> goalsScored = new TableColumn<>(GOALS_SCORED);
+	@FXML TableColumn<Map, Float> goalsConceded = new TableColumn<>(GOALS_CONCEDED);
 	@FXML TableColumn<Map, Float> diff = new TableColumn<>("diff");
 
-	public MatchStatTabController() {
-	}
-
-	@Override
-	public void initialize(URL arg0, ResourceBundle arg1) {
+	@Override public void initialize(URL arg0, ResourceBundle arg1) {
 		team.setCellValueFactory(new MapValueFactory<>("team"));
-		gamesPlayed.setCellValueFactory(new MapValueFactory<>("gamesPlayed"));
+		gamesPlayed.setCellValueFactory(new MapValueFactory<>(GAMES_PLAYED));
 		win.setCellValueFactory(new MapValueFactory<>("win"));
 		draw.setCellValueFactory(new MapValueFactory<>("draw"));
 		loss.setCellValueFactory(new MapValueFactory<>("loss"));
-		points.setCellValueFactory(new MapValueFactory<>("points"));
-		goalsScored.setCellValueFactory(new MapValueFactory<>("goalsScored"));
-		goalsConceded.setCellValueFactory(new MapValueFactory<>("goalsConceded"));
+		points.setCellValueFactory(new MapValueFactory<>(POINTS_STRING));
+		goalsScored.setCellValueFactory(new MapValueFactory<>(GOALS_SCORED));
+		goalsConceded.setCellValueFactory(new MapValueFactory<>(GOALS_CONCEDED));
 		diff.setCellValueFactory(new MapValueFactory<>("diff"));
 	}
 
-
-
-	public void updateTab(String homeTeam, String awayTeam, Float goalDiff, Float homeScore, Float homeConcede, Float awayScore, Float awayConceded) {
-
-	}
-
 	public void setLeagueStandingsTable(int leagueId, String season, int countryId) {
-		final ArrayList<TeamStanding> res = GuiMysql.getInstance().getLeagueTable(leagueId, season, countryId);
+		final List<TeamStanding> res = GuiMysql.getInstance().getLeagueTable(leagueId, season, countryId);
 		matchStatTable.getItems().clear();
 		for (final TeamStanding ts : res) {
 			final Map<String, Object> line = Maps.newHashMap();
-			final int gamesPlayed = ts.getWins() + ts.getDraws() + ts.getLosses();
+			final int numGamesPlayed = ts.getWins() + ts.getDraws() + ts.getLosses();
 			line.put("team", ts.getTeamName());
-			line.put("gamesPlayed", gamesPlayed);
+			line.put(GAMES_PLAYED, numGamesPlayed);
 			line.put("win", ts.getWins());
 			line.put("draw", ts.getDraws());
 			line.put("loss", ts.getLosses());
-			line.put("points", ts.getPoints());
-			line.put("goalsScored", ts.getGoalsScored() / gamesPlayed);
-			line.put("goalsConceded", ts.getGoalsConceded() / gamesPlayed);
+			line.put(POINTS_STRING, ts.getPoints());
+			line.put(GOALS_SCORED, ts.getGoalsScored() / numGamesPlayed);
+			line.put(GOALS_CONCEDED, ts.getGoalsConceded() / numGamesPlayed);
 
 			matchStatTable.getItems().add(line);
 		}

+ 59 - 64
OddsJavaFx/src/controllers/MatchTabController.java

@@ -7,12 +7,12 @@ import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 import java.util.function.Predicate;
-import java.util.stream.Collectors;
 
 import com.google.common.collect.Lists;
 
@@ -28,9 +28,11 @@ import objects.League;
 import objects.SoccerMatch;
 import objects.TeamResults;
 
-@SuppressWarnings("rawtypes")
-public class MatchTabController implements Initializable {
+@SuppressWarnings("rawtypes") public class MatchTabController implements Initializable {
 
+	private static final String LEAGUE = "league";
+	private static final String HOME_WIN = "homeWin";
+	private static final String AWAY_WIN = "awayWin";
 	@FXML TableColumn<Map, String> gameDateColumn = new TableColumn<>("Gamedate");
 	@FXML TableColumn<Map, String> homeTeamColumn = new TableColumn<>("Home Team");
 	@FXML TableColumn<Map, String> awayTeamColumn = new TableColumn<>("Away Team");
@@ -47,21 +49,17 @@ public class MatchTabController implements Initializable {
 	@FXML TableColumn<Map, String> countryColumn = new TableColumn<>("Country");
 	@FXML TableColumn<Map, String> leagueColumn = new TableColumn<>("League");
 
-	@FXML TableColumn<Map, String> homeWinColumn = new TableColumn<>("homeWin");
+	@FXML TableColumn<Map, String> homeWinColumn = new TableColumn<>(HOME_WIN);
 	@FXML TableColumn<Map, String> drawColumn = new TableColumn<>("draw");
-	@FXML TableColumn<Map, String> awayWinColumn = new TableColumn<>("awayWin");
+	@FXML TableColumn<Map, String> awayWinColumn = new TableColumn<>(AWAY_WIN);
 
 	@FXML private TableView<Map<String, Object>> matchTable;
 
-	private ObservableList<Map<String, Object>> matches;
-	private ObservableList<Map<String, Object>> originalMatches;
 	private ObservableList<Map<String, Object>> coutryFilteredMatches;
+	private List<SoccerMatch> upcomingMatches;
+	private static final String FLOAT_FORMAT = "%.02f";
 
-	public MatchTabController() {
-	}
-
-	@Override
-	public void initialize(URL arg0, ResourceBundle arg1) {
+	@Override public void initialize(URL arg0, ResourceBundle arg1) {
 		gameDateColumn.setCellValueFactory(new MapValueFactory<>("gameDate"));
 		homeTeamColumn.setCellValueFactory(new MapValueFactory<>("homeTeam"));
 		awayTeamColumn.setCellValueFactory(new MapValueFactory<>("awayTeam"));
@@ -76,21 +74,17 @@ public class MatchTabController implements Initializable {
 		avgScoreAwayColumn.setCellValueFactory(new MapValueFactory<>("avgScoreAway"));
 		avgConcededAwayColumn.setCellValueFactory(new MapValueFactory<>("avgConcededAway"));
 		countryColumn.setCellValueFactory(new MapValueFactory<>("country"));
-		leagueColumn.setCellValueFactory(new MapValueFactory<>("league"));
+		leagueColumn.setCellValueFactory(new MapValueFactory<>(LEAGUE));
 
-		homeWinColumn.setCellValueFactory(new MapValueFactory<>("homeWin"));
+		homeWinColumn.setCellValueFactory(new MapValueFactory<>(HOME_WIN));
 		drawColumn.setCellValueFactory(new MapValueFactory<>("draw"));
-		awayWinColumn.setCellValueFactory(new MapValueFactory<>("awayWin"));
-
-		matches = FXCollections.<Map<String, Object>>observableArrayList();
-
+		awayWinColumn.setCellValueFactory(new MapValueFactory<>(AWAY_WIN));
 	}
 
-	public void setMatches(ArrayList<SoccerMatch> upcomingMatches, MatchStatTabController matchStatController) {
-		matches = FXCollections.<Map<String, Object>>observableArrayList();
+	public void setMatches(List<SoccerMatch> upcomingMatches) {
+		ObservableList<Map<String, Object>> matches = FXCollections.<Map<String, Object>>observableArrayList();
 		for (final SoccerMatch soccerMatch : upcomingMatches) {
 
-
 			final Map<String, Object> match = new HashMap<>();
 			match.put("homeTeam", soccerMatch.getHomeTeam().getTeamName());
 			match.put("awayTeam", soccerMatch.getAwayTeam().getTeamName());
@@ -98,8 +92,8 @@ public class MatchTabController implements Initializable {
 			match.put("oddsX", soccerMatch.getOddsX());
 			match.put("odds2", soccerMatch.getOdds2());
 
-			final ArrayList<Float> avgHomeTeamGoals = calculateAvgHomeScore(soccerMatch.getHomeTeam().getTeamId());
-			final ArrayList<Float> avgAwayTeamGoals = calculateAvgAwayScore(soccerMatch.getAwayTeam().getTeamId());
+			final List<Float> avgHomeTeamGoals = calculateAvgHomeScore(soccerMatch.getHomeTeam().getTeamId());
+			final List<Float> avgAwayTeamGoals = calculateAvgAwayScore(soccerMatch.getAwayTeam().getTeamId());
 
 			match.put("gameDate", soccerMatch.getGameDate().toString());
 			match.put("avgScoreHome", avgHomeTeamGoals.get(0));
@@ -107,18 +101,18 @@ public class MatchTabController implements Initializable {
 			match.put("avgScoreAway", avgAwayTeamGoals.get(0));
 			match.put("avgConcededAway", avgAwayTeamGoals.get(1));
 			match.put("goalsHome",
-					GuiMysql.getInstance().round(new BigDecimal(avgHomeTeamGoals.get(0) + avgAwayTeamGoals.get(1)),
+					GuiMysql.getInstance().round(BigDecimal.valueOf(avgHomeTeamGoals.get(0) + avgAwayTeamGoals.get(1)),
 							GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
 			match.put("goalsAway",
-					GuiMysql.getInstance().round(new BigDecimal(avgAwayTeamGoals.get(0) + avgHomeTeamGoals.get(1)),
+					GuiMysql.getInstance().round(BigDecimal.valueOf(avgAwayTeamGoals.get(0) + avgHomeTeamGoals.get(1)),
 							GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
 			match.put("goalDiff",
 					GuiMysql.getInstance()
-					.round(new BigDecimal((avgHomeTeamGoals.get(0) + avgAwayTeamGoals.get(1))
-							- (avgAwayTeamGoals.get(0) + avgHomeTeamGoals.get(1))),
-							GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
+							.round(BigDecimal.valueOf((avgHomeTeamGoals.get(0) + avgAwayTeamGoals.get(1))
+									- (avgAwayTeamGoals.get(0) + avgHomeTeamGoals.get(1))),
+									GuiMysql.getInstance().getIncrement(), RoundingMode.HALF_UP));
 			match.put("country", soccerMatch.getHomeTeam().getCountryName());
-			match.put("league", soccerMatch.getHomeTeam().getTeamLeague());
+			match.put(LEAGUE, soccerMatch.getHomeTeam().getTeamLeague());
 
 			final DecimalFormat df = new DecimalFormat("#.##");
 			df.setRoundingMode(RoundingMode.CEILING);
@@ -134,66 +128,63 @@ public class MatchTabController implements Initializable {
 
 			final float betMargin;
 			if (leagueInfo.getBetMargin() != 0) {
-				betMargin = 1 + (leagueInfo.getBetMargin() / (float)100);
+				betMargin = 1 + (leagueInfo.getBetMargin() / (float) 100);
 			} else {
 				betMargin = 1.1f; // Default value???
 			}
 
-			final TeamResults homeTeamResults = GuiMysql.getInstance().getTeamResults(soccerMatch.getHomeTeam().getTeamId(), lookBack, true);
-			final TeamResults awayTeamResults = GuiMysql.getInstance().getTeamResults(soccerMatch.getAwayTeam().getTeamId(), lookBack, false);
-
-			if (soccerMatch.getHomeTeam().getCountryName().equals("finland")) {
-				System.out.println("HomeTeam " + soccerMatch.getHomeTeam().getTeamName() + " " + homeTeamResults);
-				System.out.println("AwayTeam " + soccerMatch.getAwayTeam().getTeamName() + " "  + homeTeamResults);
-			}
-
-			final float homeWinPercent = (homeTeamResults.getWins() + awayTeamResults.getLosses()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount())* 100;
-			final float drawPercent = (homeTeamResults.getDraws() + awayTeamResults.getDraws()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
-			final float awayWinPercent = (homeTeamResults.getLosses() + awayTeamResults.getWins()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
-
-			match.put("homeWin", String.format("%.02f", homeWinPercent) + "(" + String.format("%.02f", (100 / homeWinPercent) * betMargin) + ")");
-			match.put("draw", String.format("%.02f", drawPercent) + "(" + String.format("%.02f", (100 / drawPercent ) * betMargin) + ")");
-			match.put("awayWin", String.format("%.02f", awayWinPercent) + "(" + String.format("%.02f", (100 / awayWinPercent) * betMargin) + ")");
+			final TeamResults homeTeamResults = GuiMysql.getInstance()
+					.getTeamResults(soccerMatch.getHomeTeam().getTeamId(), lookBack, true);
+			final TeamResults awayTeamResults = GuiMysql.getInstance()
+					.getTeamResults(soccerMatch.getAwayTeam().getTeamId(), lookBack, false);
+
+			final float homeWinPercent = (homeTeamResults.getWins() + awayTeamResults.getLosses())
+					/ Float.valueOf(homeTeamResults.getCount() + Float.valueOf(awayTeamResults.getCount())) * 100;
+			final float drawPercent = (homeTeamResults.getDraws() + awayTeamResults.getDraws())
+					/ Float.valueOf(homeTeamResults.getCount() + Float.valueOf(awayTeamResults.getCount())) * 100;
+			final float awayWinPercent = (homeTeamResults.getLosses() + awayTeamResults.getWins())
+					/ Float.valueOf(homeTeamResults.getCount() + Float.valueOf(awayTeamResults.getCount())) * 100;
+
+			match.put(HOME_WIN, String.format(FLOAT_FORMAT, homeWinPercent) + "("
+					+ String.format(FLOAT_FORMAT, (100 / homeWinPercent) * betMargin) + ")");
+			match.put("draw", String.format(FLOAT_FORMAT, drawPercent) + "("
+					+ String.format(FLOAT_FORMAT, (100 / drawPercent) * betMargin) + ")");
+			match.put(AWAY_WIN, String.format(FLOAT_FORMAT, awayWinPercent) + "("
+					+ String.format(FLOAT_FORMAT, (100 / awayWinPercent) * betMargin) + ")");
 
 			matches.add(match);
 		}
 
-		originalMatches = matches;
 		matchTable.getItems().addAll(matches);
 
 	}
 
 	public void filterLeagueMatches(String filterByName) {
-		final Collection<Map<String, Object>> filteredMatches = coutryFilteredMatches.stream()
-				.filter(p -> p.get("league").equals(filterByName))
-				.collect(Collectors.toCollection(FXCollections::observableArrayList));
+		List<SoccerMatch> filteredMatches = upcomingMatches.stream()
+				.filter(p -> p.getHomeTeam().getTeamLeague().equals(filterByName)).toList();
 		matchTable.getItems().clear();
-		matchTable.getItems().addAll(filteredMatches);
+		setMatches(new ArrayList<>(filteredMatches));
 	}
 
 	public void filterCountryMatches(String filterByName) {
-		final Collection<Map<String, Object>> filteredMatches = originalMatches.stream()
-				.filter(p -> p.get("country").equals(filterByName))
-				.collect(Collectors.toCollection(FXCollections::observableArrayList));
+
+		List<SoccerMatch> filteredMatches = upcomingMatches.stream()
+				.filter(p -> p.getHomeTeam().getCountryName().equals(filterByName)).toList();
+
 		matchTable.getItems().clear();
-		matchTable.getItems().addAll(filteredMatches);
+		setMatches(new ArrayList<>(filteredMatches));
 		coutryFilteredMatches = matchTable.getItems();
 	}
 
 	public void resetFilter() {
-		// matches = originalMatches;
 		matchTable.getItems().clear();
-		// if (matches != null) {
-		// matchTable.getItems().addAll(matches);
-		// }
-		matches = matchTable.getItems();
 	}
 
-	private ArrayList<Float> calculateAvgHomeScore(int teamId) {
+	private List<Float> calculateAvgHomeScore(int teamId) {
 		return GuiMysql.getInstance().getAvgHomeScore(teamId);
 	}
 
-	private ArrayList<Float> calculateAvgAwayScore(int teamId) {
+	private List<Float> calculateAvgAwayScore(int teamId) {
 		return GuiMysql.getInstance().getAvgAwayScore(teamId);
 	}
 
@@ -201,11 +192,11 @@ public class MatchTabController implements Initializable {
 		return matchTable.getItems();
 	}
 
-	public ArrayList<String> getLeaguesFromSelection(String value) {
+	public List<String> getLeaguesFromSelection() {
 		final ArrayList<String> leagues = Lists.newArrayList();
 		coutryFilteredMatches.forEach(f -> {
-			if (!leagues.contains(f.get("league"))) {
-				leagues.add((String) f.get("league"));
+			if (!leagues.contains(f.get(LEAGUE))) {
+				leagues.add((String) f.get(LEAGUE));
 			}
 		});
 		return leagues;
@@ -220,4 +211,8 @@ public class MatchTabController implements Initializable {
 	public TableView getTable() {
 		return matchTable;
 	}
+
+	public void setUpcomingMatches(List<SoccerMatch> upcomingMatches) {
+		this.upcomingMatches = upcomingMatches;
+	}
 }

+ 19 - 101
OddsJavaFx/src/controllers/PastResultsController.java

@@ -1,12 +1,14 @@
 package controllers;
 
-import java.io.IOException;
 import java.net.URL;
 import java.time.LocalDate;
 import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
+import java.util.Optional;
 import java.util.ResourceBundle;
 
+import org.apache.commons.lang3.NotImplementedException;
+
 import com.google.common.collect.Lists;
 
 import data.GuiMysql;
@@ -37,11 +39,8 @@ public class PastResultsController implements Initializable {
 
 	private final ArrayList<SimpleEntry<Integer, String>> sportsList = Lists.newArrayList();
 	private final ArrayList<SimpleEntry<Integer, String>> countriesList = Lists.newArrayList();
-	private final ArrayList<SimpleEntry<Integer, String>> leaguesList = Lists.newArrayList();
-
 
-	@Override
-	public void initialize(URL arg0, ResourceBundle arg1) {
+	@Override public void initialize(URL arg0, ResourceBundle arg1) {
 
 		getResults.setDisable(true);
 		basePane.setPrefWidth(0.0);
@@ -49,18 +48,13 @@ public class PastResultsController implements Initializable {
 
 		resultsPanel.setPrefHeight(0.0);
 
-		date.valueProperty().addListener((ov, oldValue, newValue) -> {
-			if (newValue == null || newValue.isAfter(LocalDate.now())) {
-				getResults.setDisable(true);
-			} else {
-				getResults.setDisable(false);
-			}
-		});
+		date.valueProperty()
+				.addListener((ov, oldValue, newValue) -> getResults.setDisable(newValue.isAfter(LocalDate.now())));
 
 		sportsList.addAll(GuiMysql.getInstance().getSports());
-		sports.add("Sport");
-		for (final SimpleEntry<Integer, String>  entry : sportsList) {
-			if (entry.getValue().equals("soccer")) { // Använder just nu bara Soccer
+		sports.add(MainController.SPORT);
+		for (final SimpleEntry<Integer, String> entry : sportsList) {
+			if (entry.getValue().equals("soccer")) { // Anv�nder just nu bara Soccer
 				sports.add(entry.getValue());
 			}
 		}
@@ -71,58 +65,15 @@ public class PastResultsController implements Initializable {
 
 	}
 
-
-	@FXML
-	private void getResults() {
-		final String selectedSport = sportSelector.getValue();
-		if (selectedSport != null && !selectedSport.equals("Sport")) {
-			//			countrySelector.setDisable(false);
-			//			final int sportId = sportsList.stream().filter(p -> p.getValue().equals(sportSelector.getValue())).findFirst().get().getKey();
-			//			final ArrayList<SoccerMatch> upcomingMatches = GuiMysql.getInstance().getMatches("SoccerResults", sportId, "");
-			//
-			//			matchTabController.setMatches(upcomingMatches, matchStatTabController);
-			//			countriesList.clear();
-			//			for (final SoccerMatch soccerMatch : upcomingMatches) {
-			//				homeTeams.add(soccerMatch.getHomeTeam().getTeamName());
-			//				awayTeams.add(soccerMatch.getAwayTeam().getTeamName());
-			//
-			//				if (countriesList.stream().noneMatch(p -> p != null && p.getValue().equals(soccerMatch.getHomeTeam().getCountryName()))) {
-			//					countriesList.add(new SimpleEntry<>(soccerMatch.getHomeTeam().getCountryId(), soccerMatch.getHomeTeam().getCountryName()));
-			//				}
-			//			}
-			//
-			//			countriesList.sort((c1, c2) -> c1.getValue().compareTo(c2.getValue()));
-			//			countriesList.forEach(c -> countries.add(c.getValue()));
-			//
-			//			homeTeamSelector.setItems(homeTeams);
-			//			awayTeamSelector.setItems(awayTeams);
-		}
+	@FXML private void getResults() {
+		throw new NotImplementedException();
 	}
 
-	@FXML
-	private void CountrySelected(ActionEvent event) {
-		//		if (countrySelector.getValue() != null && !countrySelector.getValue().equals("Country")) {
-		//			leagueSelector.setDisable(false);
-		//			final int countryId = getCountryIdFromSelector();
-		//			final int sportId = getSportIdFromName(selectedSport);
-		//
-		//			matchTabController.filterCountryMatches(countrySelector.getValue());
-		//
-		//			leaguesList = GuiMysql.getInstance().getLeagues(sportId, countryId);
-		//			final List<String> leaguesInTable = Lists.newArrayList();
-		//			matchTabController.getTableMatches().forEach(tr -> leaguesInTable.add((String) tr.get("league")));
-		//			final HashSet<String> newHashSet = Sets.newHashSet(leaguesInTable);
-		//
-		//			leagues.clear();
-		//			leagues.add("League");
-		//			leagues.addAll(newHashSet);
-		//
-		//			selectedCountry = countrySelector.getValue();
-		//		}
+	@FXML private void countrySelected(ActionEvent event) {
+		throw new NotImplementedException();
 	}
 
-	@FXML
-	private void SportSelected(ActionEvent event) throws IOException {
+	@FXML private void sportSelected(ActionEvent event) {
 		if (sportSelector.getValue() != null && !sportSelector.getValue().equals("Sport")) {
 			countrySelector.setDisable(false);
 			final int sportId = getSportIdFromName(sportSelector.getValue());
@@ -130,51 +81,18 @@ public class PastResultsController implements Initializable {
 			// GetCuntries by Sport needed
 			countriesList.clear();
 			countriesList.addAll(GuiMysql.getInstance().getCountriesBySport(sportId, date.getValue().toString()));
-			//			final ArrayList<SoccerMatch> upcomingMatches = GuiMysql.getInstance().getMatches("SoccerResults", sportId, date.getValue().toString());
-
-			//			for (final SoccerMatch soccerMatch : upcomingMatches) {
-			//				if (countriesList.stream().noneMatch(p -> p != null && p.getValue().equals(soccerMatch.getHomeTeam().getCountryName()))) {
-			//					countriesList.add(new SimpleEntry<>(soccerMatch.getHomeTeam().getCountryId(), soccerMatch.getHomeTeam().getCountryName()));
-			//				}
-			//			}
 
-			//			countriesList.sort((c1, c2) -> c1.getValue().compareTo(c2.getValue()));
 			countriesList.forEach(c -> countries.add(c.getValue()));
 		}
 	}
 
 	private int getSportIdFromName(String value) {
-		return sportsList.stream().filter(p -> p.getValue().equals(value)).findFirst().get().getKey();
+		Optional<SimpleEntry<Integer, String>> o = sportsList.stream().filter(p -> p.getValue().equals(value))
+				.findFirst();
+		return o.isPresent() ? o.get().getKey() : null;
 	}
 
-
-	@FXML
-	private void LeagueSelected(ActionEvent event) {
-
-		//		if (leagueSelector.getValue() != null && !leagueSelector.getValue().equals("League")) {
-		//			homeTeamSelector.setDisable(false);
-		//			awayTeamSelector.setDisable(false);
-		//			showMatchStatsButton.setDisable(false);
-		//			if (GuiMysql.getInstance().getParsingStarted(getCountryIdFromSelector(), getLeagueIdFromSelector())) {
-		//				getLeagueInfoButton.setDisable(true);
-		//				getMoreLeagueInfo.setDisable(false);
-		//			} else {
-		//				getLeagueInfoButton.setDisable(false);
-		//				getMoreLeagueInfo.setDisable(true);
-		//			}
-		//			matchTabController.filterLeagueMatches(leagueSelector.getValue());
-		//			updateStatsTableButton.setDisable(false);
-		//			final ArrayList<Float> leagueAvareges = GuiMysql.getInstance().getLeagueAvarages(getLeagueIdFromSelector(), getCountryIdFromSelector());
-		//
-		//			avgLeagueHomeScoreTxt.setText(leagueAvareges.get(0).toString());
-		//			avgLeagueAwayScoreTxt.setText(leagueAvareges.get(1).toString());
-		//
-		//			selectedLeague = leagueSelector.getValue();
-		//		} else {
-		//			getMoreLeagueInfo.setDisable(true);
-		//			getLeagueInfoButton.setDisable(true);
-		//			updateStatsTableButton.setDisable(true);
-		//			showMatchStatsButton.setDisable(true);
-		//		}
+	@FXML private void leagueSelected(ActionEvent event) {
+		throw new NotImplementedException();
 	}
 }

+ 5 - 9
OddsJavaFx/src/controllers/StatisticsTabController.java

@@ -3,6 +3,7 @@ package controllers;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.ResourceBundle;
 
@@ -16,8 +17,7 @@ import javafx.scene.control.TableView;
 import javafx.scene.control.cell.MapValueFactory;
 import objects.OverUnder;
 
-@SuppressWarnings("rawtypes")
-public class StatisticsTabController implements Initializable {
+@SuppressWarnings("rawtypes") public class StatisticsTabController implements Initializable {
 
 	@FXML private TableView<Map<String, Object>> statsTable;
 
@@ -39,11 +39,7 @@ public class StatisticsTabController implements Initializable {
 
 	private ObservableList<Map<String, Object>> statLines;
 
-	public StatisticsTabController() {
-	}
-
-	@Override
-	public void initialize(URL arg0, ResourceBundle arg1) {
+	@Override public void initialize(URL arg0, ResourceBundle arg1) {
 		diffColumn.setCellValueFactory(new MapValueFactory<>("diff"));
 		u05.setCellValueFactory(new MapValueFactory<>("u05"));
 		o05.setCellValueFactory(new MapValueFactory<>("o05"));
@@ -65,7 +61,7 @@ public class StatisticsTabController implements Initializable {
 	}
 
 	public void setOverUnderTable(int leagueId) {
-		final ArrayList<OverUnder> statsOverUnder = GuiMysql.getInstance().getStatsOverUnder(leagueId);
+		final List<OverUnder> statsOverUnder = GuiMysql.getInstance().getStatsOverUnder(leagueId);
 
 		statLines.clear();
 		for (final OverUnder ou : statsOverUnder) {
@@ -97,7 +93,7 @@ public class StatisticsTabController implements Initializable {
 	private int getUnderStat(OverUnder ou, float atMostXGoals) {
 		final ArrayList<Integer> goals = ou.getGoals();
 		int sum = 0;
-		for (int i = 0; i < (goals.size() < atMostXGoals?goals.size():atMostXGoals); i++) {
+		for (int i = 0; i < (goals.size() < atMostXGoals ? goals.size() : atMostXGoals); i++) {
 			sum += goals.get(i);
 		}
 		return sum;

+ 60 - 93
OddsJavaFx/src/controllers/TestsController.java

@@ -3,9 +3,12 @@ package controllers;
 import java.net.URL;
 import java.time.LocalDate;
 import java.util.AbstractMap.SimpleEntry;
-import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
 import java.util.ResourceBundle;
 
+import org.eclipse.jetty.util.log.Log;
+
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 
@@ -65,38 +68,30 @@ public class TestsController implements Initializable {
 	ObservableList<String> countries = FXCollections.observableArrayList();
 	ObservableList<String> leagues = FXCollections.observableArrayList();
 
-	private final ArrayList<SimpleEntry<Integer, String>> countriesList = Lists.newArrayList();
-	private ArrayList<SimpleEntry<Integer, String>> leaguesList = Lists.newArrayList();
+	private final List<SimpleEntry<Integer, String>> countriesList = Lists.newArrayList();
+	private List<SimpleEntry<Integer, String>> leaguesList = Lists.newArrayList();
 	private int mSportId;
 
-	@Override
-	public void initialize(URL arg0, ResourceBundle arg1) {
+	@Override public void initialize(URL arg0, ResourceBundle arg1) {
 		getResults.setDisable(true);
 		basePane.setPrefWidth(0.0);
 		basePane.setPrefHeight(0.0);
 
-		date.valueProperty().addListener((ov, oldValue, newValue) -> {
-			if (newValue == null || newValue.isAfter(LocalDate.now())) {
-				getResults.setDisable(true);
-			} else {
-				getResults.setDisable(false);
-			}
-		});
+		date.valueProperty()
+				.addListener((ov, oldValue, newValue) -> getResults.setDisable(newValue.isAfter(LocalDate.now())));
 
 		countrySelector.setItems(countries);
 		leagueSelector.setItems(leagues);
 		testSettingsPanel.setVisible(false);
 	}
 
-	@FXML
-	private void getResults() {
+	@FXML private void getResults() {
 		countriesList.clear();
 		leaguesList.clear();
 		initCountries();
 	}
 
-	@FXML
-	private void CountrySelected(ActionEvent event) {
+	@FXML private void countrySelected(ActionEvent event) {
 		if (countrySelector.getValue() != null && !countrySelector.getValue().equals("Country")) {
 			leagueSelector.setDisable(false);
 			final int countryId = getCountryIdFromSelector();
@@ -111,11 +106,15 @@ public class TestsController implements Initializable {
 	}
 
 	private Integer getCountryIdFromSelector() {
-		return countriesList.stream().filter(p -> p.getValue().equals(countrySelector.getValue())).findFirst().get().getKey();
+		Optional<SimpleEntry<Integer, String>> o = countriesList.stream()
+				.filter(p -> p.getValue().equals(countrySelector.getValue())).findFirst();
+		return o.isPresent() ? o.get().getKey() : null;
 	}
 
 	private Integer getLeagueIdFromSelector() {
-		return leaguesList.stream().filter(p -> p.getValue().equals(leagueSelector.getValue())).findFirst().get().getKey();
+		Optional<SimpleEntry<Integer, String>> o = leaguesList.stream()
+				.filter(p -> p.getValue().equals(leagueSelector.getValue())).findFirst();
+		return o.isPresent() ? o.get().getKey() : null;
 	}
 
 	private void initCountries() {
@@ -130,40 +129,13 @@ public class TestsController implements Initializable {
 
 	private int getSoccerId() {
 		if (mSportId <= 0) {
-			mSportId = GuiMysql.getInstance().getSportId("soccer");
+			mSportId = GuiMysql.getInstance().getSportId(MainController.SPORT);
 		}
 
 		return mSportId;
 	}
 
-	@FXML
-	private void LeagueSelected(ActionEvent event) {
-
-		//		if (leagueSelector.getValue() != null && !leagueSelector.getValue().equals("League")) {
-		//			homeTeamSelector.setDisable(false);
-		//			awayTeamSelector.setDisable(false);
-		//			showMatchStatsButton.setDisable(false);
-		//			if (GuiMysql.getInstance().getParsingStarted(getCountryIdFromSelector(), getLeagueIdFromSelector())) {
-		//				getLeagueInfoButton.setDisable(true);
-		//				getMoreLeagueInfo.setDisable(false);
-		//			} else {
-		//				getLeagueInfoButton.setDisable(false);
-		//				getMoreLeagueInfo.setDisable(true);
-		//			}
-		//			matchTabController.filterLeagueMatches(leagueSelector.getValue());
-		//			updateStatsTableButton.setDisable(false);
-		//			final ArrayList<Float> leagueAvareges = GuiMysql.getInstance().getLeagueAvarages(getLeagueIdFromSelector(), getCountryIdFromSelector());
-		//
-		//			avgLeagueHomeScoreTxt.setText(leagueAvareges.get(0).toString());
-		//			avgLeagueAwayScoreTxt.setText(leagueAvareges.get(1).toString());
-		//
-		//			selectedLeague = leagueSelector.getValue();
-		//		} else {
-		//			getMoreLeagueInfo.setDisable(true);
-		//			getLeagueInfoButton.setDisable(true);
-		//			updateStatsTableButton.setDisable(true);
-		//			showMatchStatsButton.setDisable(true);
-		//		}
+	@FXML private void leagueSelected(ActionEvent event) {
 
 		if (GuiMysql.getInstance().getParsingStarted(getCountryIdFromSelector(), getLeagueIdFromSelector())) {
 			getLeagueInfoButton.setDisable(true);
@@ -175,46 +147,41 @@ public class TestsController implements Initializable {
 		testSettingsPanel.setVisible(true);
 	}
 
-	@FXML
-	private void runTestAction() {
-		//		testSettingsPanel.setVisible(false);
-		//		testResultsPanel.setVisible(true);
+	@FXML private void runTestAction() {
 
 		final String betLevel = getBetLevel();
 		final String betM = getBetMargin();
 		final String startBank = getStartingBank();
 		final String lookBackVal = getLookback();
 
-
 		final TestClass test = new LastResultsTest();
-		System.out.println("Running tests");
 		test.setup(date.getValue().toString(), Float.valueOf(startBank), Float.valueOf(betLevel), Float.valueOf(betM),
 				Integer.valueOf(lookBackVal), mSportId, getCountryIdFromSelector(), getLeagueIdFromSelector());
 		test.runTest();
 	}
 
 	private String getLookback() {
-		return Strings.isNullOrEmpty(lookBack.getText())?lookBack.getPromptText():lookBack.getText();
+		return Strings.isNullOrEmpty(lookBack.getText()) ? lookBack.getPromptText() : lookBack.getText();
 	}
 
 	private String getStartingBank() {
-		return Strings.isNullOrEmpty(startingBank.getText())?startingBank.getPromptText():startingBank.getText();
+		return Strings.isNullOrEmpty(startingBank.getText()) ? startingBank.getPromptText() : startingBank.getText();
 	}
 
 	private String getBetMargin() {
-		String betM= Strings.isNullOrEmpty(betMargin.getText())?betMargin.getPromptText():betMargin.getText();
-		betM= betM.replace("%","").trim();
+		String betM = Strings.isNullOrEmpty(betMargin.getText()) ? betMargin.getPromptText() : betMargin.getText();
+		betM = betM.replace("%", "").trim();
 		return betM;
 	}
 
 	private String getBetLevel() {
-		String betLevel = Strings.isNullOrEmpty(bettingLevel.getText())?bettingLevel.getPromptText():bettingLevel.getText();
+		String betLevel = Strings.isNullOrEmpty(bettingLevel.getText()) ? bettingLevel.getPromptText()
+				: bettingLevel.getText();
 		betLevel = betLevel.replace("%", "").trim();
 		return betLevel;
 	}
 
-	@FXML
-	private void calcBestResultsAction() {
+	@FXML private void calcBestResultsAction() {
 		final LastResultsTest test = new LastResultsTest();
 
 		calcBestValues.setDisable(true);
@@ -227,6 +194,7 @@ public class TestsController implements Initializable {
 			calcBestValues.setText(buttonText);
 		});
 	}
+
 	@FXML void getLeagueInfo() {
 		final String country = countrySelector.getValue().trim();
 		final String league = leagueSelector.getValue().trim();
@@ -234,14 +202,14 @@ public class TestsController implements Initializable {
 		op.getHistoricMatches("soccer", country, league, String.valueOf(LocalDate.now().getYear()));
 	}
 
-	@FXML
-	private void getMoreLeagueInfo() {
-		final String lastParsedYear = GuiMysql.getInstance().getLastParsedYear(leagueSelector.getValue().trim(), getCountryIdFromSelector());
+	@FXML private void getMoreLeagueInfo() {
+		final String lastParsedYear = GuiMysql.getInstance().getLastParsedYear(leagueSelector.getValue().trim(),
+				getCountryIdFromSelector());
 		final String nextParseYear;
 		if (lastParsedYear.contains("-")) {
 			final String[] years = lastParsedYear.split("-");
-			int firstYear = Integer.valueOf(years[0]);
-			int lastYear = Integer.valueOf(years[1]);
+			int firstYear = Integer.parseInt(years[0]);
+			int lastYear = Integer.parseInt(years[1]);
 			firstYear--;
 			lastYear--;
 			nextParseYear = firstYear + "-" + lastYear;
@@ -250,91 +218,90 @@ public class TestsController implements Initializable {
 			val--;
 			nextParseYear = String.valueOf(val);
 		} else {
-			System.out.println("Fail to get More league info for " + lastParsedYear);
+			Log.getLog().info("Fail to get More league info for %s", lastParsedYear);
 			return;
 		}
 
 		final String country = countrySelector.getValue().trim();
 		final String league = leagueSelector.getValue().trim();
 
-
 		final OddsPortal op = new OddsPortal();
 		op.getHistoricMatches("soccer", country, league, nextParseYear);
 	}
 
-	@FXML
-	private void topLeaguesTestAction() {
+	@FXML private void topLeaguesTestAction() {
 		final PrioCountriesAll prioCountriesAll = new PrioCountriesAll();
 		prioCountriesAll.runTest();
 	}
 
-	@FXML
-	private void homeTestAction() {
+	@FXML private void homeTestAction() {
 		final HomeTests2 test = new HomeTests2();
 
-		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()), Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
+		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()),
+				Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
 
 		test.runTest();
 	}
 
-	@FXML
-	private void drawTestAction() {
+	@FXML private void drawTestAction() {
 		final DrawTests2 test = new DrawTests2();
 
-		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()), Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
+		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()),
+				Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
 
 		test.runTest();
 	}
 
-	@FXML
-	private void awayTestAction() {
+	@FXML private void awayTestAction() {
 		final AwayTests2 test = new AwayTests2();
 
-		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()), Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
+		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()),
+				Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
 
 		test.runTest();
 	}
 
-	@FXML
-	private void homeDrawAwayTestAction() {
+	@FXML private void homeDrawAwayTestAction() {
 		final HomeDrawAwayTest test = new HomeDrawAwayTest();
 
-		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()), Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
+		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()),
+				Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
 
 		test.runTest();
 	}
 
-	@FXML
-	private void homeTeamTestAction() {
+	@FXML private void homeTeamTestAction() {
 		final HomeTeamWinTest test = new HomeTeamWinTest();
 
-		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()), Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
+		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()),
+				Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
 
 		test.runTest();
 	}
 
-	@FXML
-	private void awayTeamTestAction() {
+	@FXML private void awayTeamTestAction() {
 		final AwayTeamWinTest test = new AwayTeamWinTest();
 
-		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()), Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
+		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()),
+				Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
 
 		test.runTest();
 	}
 
-	@FXML
-	private void addedScoreTestAction() {
+	@FXML private void addedScoreTestAction() {
 		final AddedScoringTest test = new AddedScoringTest();
 
-		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()), Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
+		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()),
+				Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
 
 		test.runTest();
 	}
-	@FXML
-	private void recalcTestAction() {
+
+	@FXML private void recalcTestAction() {
 		final recalcTest test = new recalcTest();
 
-		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()), Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
+		test.setup("", Float.valueOf(getStartingBank()), Float.valueOf(getBetLevel()), Float.valueOf(getBetMargin()),
+				Integer.valueOf(getLookback()), 1, getCountryIdFromSelector(), getLeagueIdFromSelector());
 
 		test.runTest();
 	}

+ 621 - 670
OddsJavaFx/src/data/GuiMysql.java

@@ -11,6 +11,9 @@ import java.time.LocalDateTime;
 import java.util.AbstractMap;
 import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jetty.util.log.Log;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
@@ -25,674 +28,622 @@ import objects.TeamStanding;
 
 public class GuiMysql extends Mysql {
 
-    private static final BigDecimal INCREMENT = new BigDecimal(0.2);
-    private static final GuiMysql instance = new GuiMysql();
-    private final Connection conn;
-
-    private GuiMysql() {
-        super();
-        conn = this.getConnection();
-    }
-
-    public static GuiMysql getInstance() {
-        return instance;
-    }
-
-    public ArrayList<SimpleEntry<Integer, String>> getSports() {
-
-        final ArrayList<AbstractMap.SimpleEntry<Integer, String>> sports = Lists.newArrayList();
-        try {
-            final String sql = "SELECT id, name FROM Sport";
-            PreparedStatement stmt;
-            stmt = conn.prepareStatement(sql);
-
-            final ResultSet rs = stmt.executeQuery();
-
-            while (rs.next()) {
-                final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt("id"), rs.getString("name"));
-                sports.add(entry);
-            }
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-
-        return sports;
-    }
-
-    public ArrayList<SimpleEntry<Integer, String>> getCountries() {
-
-        final ArrayList<AbstractMap.SimpleEntry<Integer, String>> countries = Lists.newArrayList();
-        try {
-            final String sql = "SELECT id, name FROM Country";
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-
-            final ResultSet rs = stmt.executeQuery();
-
-            while (rs.next()) {
-                final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt("id"), rs.getString("name"));
-                countries.add(entry);
-            }
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-        return countries;
-    }
-
-    public ArrayList<SimpleEntry<Integer, String>> getLeagues(int sportId, int countryId) {
-
-        final ArrayList<AbstractMap.SimpleEntry<Integer, String>> leagues = Lists.newArrayList();
-        try {
-            final String sql = "SELECT id, name FROM League WHERE sportId = ? AND countryId = ? ORDER BY name ASC";
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-            stmt.setInt(1, sportId);
-            stmt.setInt(2, countryId);
-
-            final ResultSet rs = stmt.executeQuery();
-
-            while (rs.next()) {
-                final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt("id"), rs.getString("name"));
-                leagues.add(entry);
-            }
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-        return leagues;
-    }
-
-    public ArrayList<SoccerMatch> getUpcomingMatches(String sportResultTable, int sportId) {
-        final ArrayList<SoccerMatch> matches = Lists.newArrayList();
-        final String dateSql;
-        dateSql = " AND DATE(gameDate) >= DATE(now())";
-
-        final String sql
-                = "SELECT res.id, homeTeamId, awayTeamId, homeScore, awayScore, overtime, odds1, oddsX, odds2, gameDate, season, res.leagueId, res.countryId, "
-                        + "hTeam.name as homeTeamName, aTeam.name as awayTeamName, " + "league.name as leagueName, "
-                        + "country.name as countryName, " + "country.prio as prio " + "FROM " + sportResultTable + " as res "
-                        + "Join Team as hTeam ON res.homeTeamId = hTeam.id " + "Join Team as aTeam ON res.awayTeamId = aTeam.id "
-                        + "Join League as league ON res.leagueId = league.id "
-                        + "Join Country as country ON res.countryId = country.id " + "where homeScore = -1 " + dateSql
-                        + "AND league.name NOT LIKE '%cup%' AND league.name NOT LIKE '%group%' "
-                        + "ORDER BY country.prio DESC, country.name ASC";
-
-        try {
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-
-            final ResultSet rs = stmt.executeQuery();
-            while (rs.next()) {
-                final SoccerMatch sm = new SoccerMatch();
-                final Team homeTeam = new Team();
-                final Team awayTeam = new Team();
-
-                homeTeam.setTeamId(rs.getInt("homeTeamId"));
-                awayTeam.setTeamId(rs.getInt("awayTeamId"));
-                homeTeam.setTeamName(rs.getString("homeTeamName"));
-                awayTeam.setTeamName(rs.getString("awayTeamName"));
-                homeTeam.setTeamLeagueId(rs.getInt("leagueId"));
-                awayTeam.setTeamLeagueId(rs.getInt("leagueId"));
-                homeTeam.setTeamLeague(rs.getString("leagueName"));
-                awayTeam.setTeamLeague(rs.getString("leagueName"));
-                homeTeam.setCountryId(rs.getInt("countryId"));
-                awayTeam.setCountryId(rs.getInt("countryId"));
-                homeTeam.setCountryName(rs.getString("countryName"));
-                awayTeam.setCountryName(rs.getString("countryName"));
-
-                sm.setAwayScore(rs.getInt("awayScore"));
-                sm.setHomeScore(rs.getInt("homeScore"));
-                sm.setHomeTeam(homeTeam);
-                sm.setAwayTeam(awayTeam);
-                sm.setMatchId(rs.getInt("id"));
-                sm.setOdds1(rs.getFloat("odds1"));
-                sm.setOddsX(rs.getFloat("oddsX"));
-                sm.setOdds2(rs.getFloat("odds2"));
-                sm.setGameDate(LocalDateTime.parse(rs.getString("gameDate")));
-                sm.setCountryPrio(rs.getBoolean("prio"));
-
-                matches.add(sm);
-            }
-
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-
-        return matches;
-    }
-
-    public ArrayList<Float> getAvgHomeScore(int teamId) {
-        final ArrayList<Float> returnValue = Lists.newArrayList();
-        final String sql
-                = "SELECT AVG(homeScore) as avgScored, AVG(awayScore) as avgConceded FROM SoccerResults WHERE homeScore != -1 && homeTeamId = ?";
-        try {
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-            stmt.setInt(1, teamId);
-
-            final ResultSet rs = stmt.executeQuery();
-
-            while (rs.next()) {
-                returnValue.add(rs.getFloat("avgScored"));
-                returnValue.add(rs.getFloat("avgConceded"));
-            }
-
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-
-        return returnValue;
-    }
-
-    public ArrayList<Float> getAvgAwayScore(int teamId) {
-        final ArrayList<Float> returnValue = Lists.newArrayList();
-        final String sql
-                = "SELECT AVG(homeScore) as avgConceded, AVG(awayScore) as avgScored FROM SoccerResults WHERE awayScore != -1 && awayTeamId = ?";
-        try {
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-            stmt.setInt(1, teamId);
-
-            final ResultSet rs = stmt.executeQuery();
-
-            while (rs.next()) {
-                returnValue.add(rs.getFloat("avgScored"));
-                returnValue.add(rs.getFloat("avgConceded"));
-            }
-
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-
-        return returnValue;
-    }
-
-    public ArrayList<Float> getLeagueAvarages(int leagueId, int countryId) {
-        final ArrayList<Float> returnValue = Lists.newArrayList();
-        final String sql = "SELECT AVG(homeScore) avgHomeScore, AVG(awayScore) as avgAwayScore"
-                + " FROM SoccerResults WHERE leagueId = ? AND countryId = ?";
-
-        final String goalsSql
-                = "SELECT (homeScore + awayScore) as totalGoals, count(*) as count FROM SoccerResults  WHERE leagueId = ? AND countryId = ? AND season = ? GROUP BY totalGoals ORDER BY totalGoals asc";
-        try {
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-            stmt.setInt(1, leagueId);
-            stmt.setInt(2, countryId);
-
-            final ResultSet rs = stmt.executeQuery();
-            while (rs.next()) {
-                returnValue.add(rs.getFloat("avgHomeScore"));
-                returnValue.add(rs.getFloat("avgAwayScore"));
-            }
-
-            final PreparedStatement goalStmt = conn.prepareStatement(goalsSql);
-            goalStmt.setInt(1, leagueId);
-            goalStmt.setInt(2, countryId);
-            goalStmt.setString(3, getLastSeason(countryId, leagueId));
-
-            final ResultSet goalRs = goalStmt.executeQuery();
-            while (goalRs.next()) {
-
-            }
-
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-
-        return returnValue;
-    }
-
-    public ArrayList<OverUnder> getStatsOverUnder(int leagueId) {
-
-        final DecimalFormat df = new DecimalFormat("##.##");
-        df.setRoundingMode(RoundingMode.HALF_DOWN);
-        final ArrayList<OverUnder> result = Lists.newArrayList();
-
-        final String sql
-                = "SELECT ((sHome.avgScored + sAway.avgConceded) - (sAway.avgScored + sHome.avgConceded)) as diff, (homeScore + awayScore) as numGoals "
-                        + "FROM SoccerResults "
-                        + "INNER JOIN (SELECT homeTeamId, AVG(homeScore) as avgScored, AVG(awayScore) as avgConceded FROM SoccerResults WHERE homeScore != -1 && homeTeamId = SoccerResults.homeTeamId GROUP BY homeTeamId) as sHome ON SoccerResults.homeTeamId = sHome.homeTeamId "
-                        + "INNER JOIN (SELECT awayTeamId, AVG(homeScore) as avgConceded, AVG(awayScore) as avgScored FROM SoccerResults WHERE awayScore != -1 && awayTeamId = SoccerResults.awayTeamId GROUP BY awayTeamId) as sAway ON SoccerResults.awayTeamId = sAway.awayTeamId "
-                        + "WHERE homeScore != -1 AND awayScore != -1 AND leagueId = ? " + "ORDER BY diff ASC";
-        try {
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-            stmt.setInt(1, leagueId);
-            final ResultSet rs = stmt.executeQuery();
-
-            while (rs.next()) {
-                final float diff = rs.getFloat("diff");
-                final int numGoals = rs.getInt("numGoals");
-                // final Float formatted = Float.valueOf(df.format(diff));
-                // final Float formatted = BigDecimal.valueOf(diff).setScale(1,
-                // BigDecimal.ROUND_HALF_DOWN).floatValue();
-                final Float formatted = round(new BigDecimal(diff), INCREMENT, RoundingMode.HALF_UP).floatValue();
-
-                final OverUnder entry = result.stream().filter(ou -> ou.getKey().compareTo(formatted) == 0).findFirst()
-                        .orElse(new OverUnder(formatted));
-                entry.addGoalStat(numGoals);
-                result.add(entry);
-            }
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-        return result;
-    }
-
-    public BigDecimal round(BigDecimal value, BigDecimal increment, RoundingMode roundingMode) {
-        if (increment.signum() == 0) {
-            // 0 increment does not make much sense, but prevent division by 0
-            return value;
-        } else {
-            final BigDecimal divided = value.divide(increment, 0, roundingMode);
-            final BigDecimal result = divided.multiply(increment);
-            return result.setScale(2, RoundingMode.HALF_UP);
-        }
-    }
-
-    public BigDecimal getIncrement() {
-        return INCREMENT;
-    }
-
-    public ArrayList<TeamStanding> getLeagueTable(int leagueId, String season, int countryId) {
-        final ArrayList<TeamStanding> result = Lists.newArrayList();
-
-        final String sql
-                = "SELECT teamName.name as teamName, count(*) played, count(case when homeScore > awayScore then 1 end) wins, "
-                        + "count(case when awayScore> homeScore then 1 end) lost, "
-                        + "count(case when homeScore = awayScore then 1 end) draws, " + "sum(homeScore) homeScore, "
-                        + "sum(awayScore) awayScore, " + "sum(homeScore) - sum(awayScore) goal_diff, "
-                        + "sum(case when homeScore > awayScore then 3 else 0 end  + case "
-                        + "WHEN homeScore = awayScore then 1 else 0 end) score, " + "season FROM "
-                        + "(select hometeamId team, homeScore, awayScore, season, leagueId as league, countryId as country FROM SoccerResults "
-                        + "union all SELECT awayteamId, awayScore, homeScore, season, leagueId as league, countryId as country FROM SoccerResults) a "
-                        + "INNER JOIN Team teamName ON team = teamName.id " + "WHERE season = ? " + "AND league = ? "
-                        + "AND country = ? " + "AND homeScore != -1 " + "AND awayScore != -1 " + "group by team "
-                        + "order by score desc, goal_diff desc";
-        try {
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-
-            stmt.setString(1, season);
-            stmt.setInt(2, leagueId);
-            stmt.setInt(3, countryId);
-
-            final String tempSql = sql.replaceAll("\\?", "%s");
-            System.out.println(String.format(tempSql, season, leagueId, countryId));
-
-            final ResultSet rs = stmt.executeQuery();
-            while (rs.next()) {
-                final TeamStanding ts
-                        = new TeamStanding(rs.getString("teamName"), rs.getInt("wins"), rs.getInt("lost"), rs.getInt("draws"),
-                                rs.getInt("score"), rs.getFloat("homeScore"), rs.getFloat("awayScore"), rs.getFloat("goal_diff"));
-                result.add(ts);
-            }
-
-        } catch (final SQLException e) {
-            e.printStackTrace();
-            System.out.println("Sql vid fel: " + sql);
-        }
-
-        return result;
-    }
-
-    public boolean getParsingStarted(int countryId, int leagueId) {
-        boolean returnValue = false;
-        final String sql = "SELECT parsedYear FROM League WHERE id = ? AND countryId = ?";
-        try {
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-            stmt.setInt(1, leagueId);
-            stmt.setInt(2, countryId);
-
-            final ResultSet rs = stmt.executeQuery();
-            while (rs.next()) {
-                final String parsedYear = rs.getString("parsedYear");
-                if (!Strings.isNullOrEmpty(parsedYear)) {
-                    returnValue = true;
-                }
-            }
-        } catch (final SQLException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-
-        return returnValue;
-    }
-
-    public String getLastSeason(Integer countryId, Integer leagueId) {
-        String season = "";
-        final String sql = "SELECT season FROM SoccerResults WHERE leagueId = ? AND countryId = ? ORDER BY season DESC limit 1";
-        try {
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-            stmt.setInt(1, leagueId);
-            stmt.setInt(2, countryId);
-
-            final ResultSet rs = stmt.executeQuery();
-            while (rs.next()) {
-                season = rs.getString("season");
-            }
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-
-        return season;
-    }
-
-    public TeamResults getTeamResults(int teamId, int numResults, boolean isHomeTeam) {
-        final String sql;
-        final TeamResults tr = new TeamResults();
-        if (isHomeTeam) {
-            sql = "SELECT count(case when homeScore > awayScore then 1 end) wins, "
-                    + "count(case when awayScore > homeScore then 1 end) lost, "
-                    + "count(case when homeScore = awayScore then 1 end) draws "
-                    + "FROM (SELECT * FROM SoccerResults WHERE homeTeamId = ? AND "
-                    + "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < DATE(NOW()) ORDER BY gameDate DESC LIMIT ?) as t";
-        } else {
-            sql = "SELECT count(case when homeScore < awayScore then 1 end) wins, "
-                    + "count(case when awayScore < homeScore then 1 end) lost, "
-                    + "count(case when homeScore = awayScore then 1 end) draws "
-                    + "FROM (SELECT * FROM SoccerResults WHERE awayTeamId = ? AND "
-                    + "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < DATE(NOW()) ORDER BY gameDate DESC LIMIT ?) as t";
-        }
-
-        try {
-            final PreparedStatement stat = conn.prepareStatement(sql);
-            stat.setInt(1, teamId);
-            stat.setInt(2, numResults);
-            final ResultSet rs = stat.executeQuery();
-
-            while (rs.next()) {
-                final int draws = rs.getInt("draws");
-                final int wins = rs.getInt("wins");
-                final int lost = rs.getInt("lost");
-                tr.setDraws(draws);
-                tr.setWins(wins);
-                tr.setLosses(lost);
-                tr.setCount(wins + draws + lost);
-            }
-
-            stat.close();
-        } catch (final SQLException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-
-        return tr;
-    }
-
-    public TeamResults getTeamResultsTest(int teamId, int numResults, boolean isHomeTeam, String date) {
-        final String sql;
-        final TeamResults tr = new TeamResults();
-        if (isHomeTeam) {
-            sql = "SELECT count(case when homeScore > awayScore then 1 end) wins, "
-                    + "count(case when awayScore > homeScore then 1 end) lost, "
-                    + "count(case when homeScore = awayScore then 1 end) draws "
-                    + "FROM (SELECT * FROM SoccerResults WHERE homeTeamId = ? AND "
-                    + "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?) as t";
-        } else {
-            sql = "SELECT count(case when homeScore < awayScore then 1 end) wins, "
-                    + "count(case when awayScore < homeScore then 1 end) lost, "
-                    + "count(case when homeScore = awayScore then 1 end) draws "
-                    + "FROM (SELECT * FROM SoccerResults WHERE awayTeamId = ? AND "
-                    + "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?) as t";
-        }
-
-        try {
-            final PreparedStatement stat = conn.prepareStatement(sql);
-            stat.setInt(1, teamId);
-            stat.setString(2, date);
-            stat.setInt(3, numResults);
-            final ResultSet rs = stat.executeQuery();
-
-            while (rs.next()) {
-                final int draws = rs.getInt("draws");
-                final int wins = rs.getInt("wins");
-                final int lost = rs.getInt("lost");
-                tr.setDraws(draws);
-                tr.setWins(wins);
-                tr.setLosses(lost);
-                tr.setCount(wins + draws + lost);
-            }
-
-            stat.close();
-        } catch (final SQLException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-
-        return tr;
-    }
-
-    public ArrayList<SimpleEntry<Integer, String>> getCountriesBySport(int sportId, String date) {
-        final String sql
-                = "SELECT * FROM Country WHERE id IN (SELECT DISTINCT(countryId) FROM SoccerResults WHERE DATE(gameDate) = ?) ORDER BY prio DESC, name ASC";
-        final ArrayList<SimpleEntry<Integer, String>> result = new ArrayList<>();
-        try {
-            final PreparedStatement stat = getConnection().prepareStatement(sql);
-            if (date.equals("")) {
-                stat.setString(1, "DATE(NOW())");
-            } else {
-                stat.setString(1, date);
-            }
-
-            final ResultSet rs = stat.executeQuery();
-
-            while (rs.next()) {
-                result.add(new SimpleEntry<>(rs.getInt("id"), rs.getString("name")));
-            }
-        } catch (final SQLException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-
-        return result;
-    }
-
-    public ArrayList<SimpleEntry<Integer, String>> getLeaguesByDate(int sportId, int countryId, String date) {
-        final ArrayList<AbstractMap.SimpleEntry<Integer, String>> leagues = Lists.newArrayList();
-        try {
-            final String sql
-                    = "SELECT id, name FROM League WHERE id IN (SELECT leagueId FROM SoccerResults WHERE sportId = ? AND countryId = ? AND DATE(gameDate) = ?)";
-            // final String sql = "SELECT id, name FROM League WHERE sportId = ? AND
-            // countryId = ? ORDER BY name ASC";
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-            stmt.setInt(1, sportId);
-            stmt.setInt(2, countryId);
-            stmt.setString(3, date);
-
-            final ResultSet rs = stmt.executeQuery();
-
-            while (rs.next()) {
-                final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt("id"), rs.getString("name"));
-                leagues.add(entry);
-            }
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-        return leagues;
-    }
-
-    public ArrayList<SoccerMatch> getMatches(int sportId, Integer countryId, Integer leagueId, String date, String order) {
-        final ArrayList<SoccerMatch> matches = Lists.newArrayList();
-        final String dateSql;
-        final String orderSql = " ORDER BY gameDate " + order;
-        if (date.equals("")) {
-            dateSql = "DATE(gameDate) = DATE(NOW()) ";
-        } else {
-            dateSql = "DATE(gameDate) <= '" + date + "' ";
-        }
-        final String sql
-                = "SELECT res.*, " + "hTeam.name as homeTeamName, aTeam.name as awayTeamName " + "FROM SoccerResults as res "
-                        + "Join Team as hTeam ON res.homeTeamId = hTeam.id " + "Join Team as aTeam ON res.awayTeam = aTeam.id "
-                        + "WHERE " + dateSql + "AND res.leagueId = ? " + "AND res.countryId = ? " + orderSql;
-
-        try {
-            final PreparedStatement stmt = conn.prepareStatement(sql);
-
-            stmt.setInt(1, leagueId);
-            stmt.setInt(2, countryId);
-
-            final ResultSet rs = stmt.executeQuery();
-            while (rs.next()) {
-                final SoccerMatch sm = new SoccerMatch();
-                final Team homeTeam = new Team();
-                final Team awayTeam = new Team();
-
-                homeTeam.setTeamId(rs.getInt("homeTeamId"));
-                awayTeam.setTeamId(rs.getInt("awayTeamId"));
-                homeTeam.setTeamName(rs.getString("homeTeamName"));
-                awayTeam.setTeamName(rs.getString("awayTeamName"));
-                homeTeam.setTeamLeagueId(rs.getInt("leagueId"));
-                awayTeam.setTeamLeagueId(rs.getInt("leagueId"));
-                homeTeam.setCountryId(rs.getInt("countryId"));
-                awayTeam.setCountryId(rs.getInt("countryId"));
-
-                sm.setAwayScore(rs.getInt("awayScore"));
-                sm.setHomeScore(rs.getInt("homeScore"));
-                sm.setHomeTeam(homeTeam);
-                sm.setAwayTeam(awayTeam);
-                sm.setMatchId(rs.getInt("id"));
-                sm.setOdds1(rs.getFloat("odds1"));
-                sm.setOddsX(rs.getFloat("oddsX"));
-                sm.setOdds2(rs.getFloat("odds2"));
-                sm.setGameDate(LocalDateTime.parse(rs.getString("gameDate")));
-                sm.setSeason(rs.getString("season"));
-
-                matches.add(sm);
-            }
-
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-
-        return matches;
-    }
-
-    public League getLeagueInfo(String teamLeague) {
-        final String sql = "SELECT * FROM League WHERE name = ?";
-        League result = null;
-        try {
-            final PreparedStatement stat = getConnection().prepareStatement(sql);
-            stat.setString(1, teamLeague);
-            final ResultSet rs = stat.executeQuery();
-
-            while (rs.next()) {
-                result = new League(rs.getInt("id"), rs.getString("name"), rs.getInt("lookback"), rs.getInt("betMargin"),
-                        rs.getInt("lookbackHome"), rs.getInt("lookbackDraw"), rs.getInt("lookbackAway"),
-                        rs.getInt("betMarginHome"), rs.getInt("betMarginDraw"), rs.getInt("betMarginAway"));
-            }
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-
-        return result;
-    }
-
-    public League getLeagueInfo(int leagueId) {
-        final String sql = "SELECT * FROM League WHERE id = ?";
-        League result = null;
-        try {
-            final PreparedStatement stat = getConnection().prepareStatement(sql);
-            stat.setInt(1, leagueId);
-            final ResultSet rs = stat.executeQuery();
-
-            while (rs.next()) {
-                result = new League(rs.getInt("id"), rs.getString("name"), rs.getInt("lookback"), rs.getInt("betMargin"),
-                        rs.getInt("lookbackHome"), rs.getInt("lookbackDraw"), rs.getInt("lookbackAway"),
-                        rs.getInt("betMarginHome"), rs.getInt("betMarginDraw"), rs.getInt("betMarginAway"));
-            }
-        } catch (final SQLException e) {
-            e.printStackTrace();
-        }
-
-        return result;
-    }
-
-    public void setTeamMarginHome(int teamId, int marginHome) {
-        final String sql = "UPDATE Team SET marginHome = ? WHERE id = ?";
-
-        try {
-            final PreparedStatement stat = getConnection().prepareStatement(sql);
-            stat.setInt(1, marginHome);
-            stat.setInt(2, teamId);
-
-            stat.executeUpdate();
-
-        } catch (final SQLException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    public void setTeamMarginDraw(int teamId, int marginDraw) {
-        final String sql = "UPDATE Team SET marginDraw = ? WHERE id = ?";
-
-        try {
-            final PreparedStatement stat = getConnection().prepareStatement(sql);
-            stat.setInt(1, marginDraw);
-            stat.setInt(2, teamId);
-
-            stat.executeUpdate();
-
-        } catch (final SQLException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    public void setTeamMarginAway(int teamId, int marginAway) {
-        final String sql = "UPDATE Team SET marginAway = ? WHERE id = ?";
-
-        try {
-            final PreparedStatement stat = getConnection().prepareStatement(sql);
-            stat.setInt(1, marginAway);
-            stat.setInt(2, teamId);
-
-            stat.executeUpdate();
-
-        } catch (final SQLException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    public void setTeamLookbackHome(int teamId, int lookbackHome) {
-        final String sql = "UPDATE Team SET lookbackHome = ? WHERE id = ?";
-
-        try {
-            final PreparedStatement stat = getConnection().prepareStatement(sql);
-            stat.setInt(1, lookbackHome);
-            stat.setInt(2, teamId);
-
-            stat.executeUpdate();
-
-        } catch (final SQLException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    public void setTeamLookbackDraw(int teamId, int lookbackDraw) {
-        final String sql = "UPDATE Team SET lookbackDraw = ? WHERE id = ?";
-
-        try {
-            final PreparedStatement stat = getConnection().prepareStatement(sql);
-            stat.setInt(1, lookbackDraw);
-            stat.setInt(2, teamId);
-
-            stat.executeUpdate();
-
-        } catch (final SQLException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
-
-    public void setTeamLookbackAway(int teamId, int lookbackAway) {
-        final String sql = "UPDATE Team SET lookbackAway = ? WHERE id = ?";
-
-        try {
-            final PreparedStatement stat = getConnection().prepareStatement(sql);
-            stat.setInt(1, lookbackAway);
-            stat.setInt(2, teamId);
-
-            stat.executeUpdate();
-
-        } catch (final SQLException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        }
-    }
+	private static final BigDecimal INCREMENT = BigDecimal.valueOf(0.2);
+	private static final GuiMysql instance = new GuiMysql();
+	private final Connection conn;
+
+	private GuiMysql() {
+		super();
+		conn = this.getConnection();
+	}
+
+	public static GuiMysql getInstance() {
+		return instance;
+	}
+
+	public List<SimpleEntry<Integer, String>> getSports() {
+
+		final ArrayList<AbstractMap.SimpleEntry<Integer, String>> sports = Lists.newArrayList();
+		final String sql = "SELECT id, name FROM Sport";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt("id"), rs.getString("name"));
+				sports.add(entry);
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return sports;
+	}
+
+	public List<SimpleEntry<Integer, String>> getCountries() {
+
+		final ArrayList<AbstractMap.SimpleEntry<Integer, String>> countries = Lists.newArrayList();
+		final String sql = "SELECT id, name FROM Country";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt("id"), rs.getString("name"));
+				countries.add(entry);
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+		return countries;
+	}
+
+	public List<SimpleEntry<Integer, String>> getLeagues(int sportId, int countryId) {
+
+		final ArrayList<AbstractMap.SimpleEntry<Integer, String>> leagues = Lists.newArrayList();
+		final String sql = "SELECT id, name FROM League WHERE sportId = ? AND countryId = ? ORDER BY name ASC";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, sportId);
+			stat.setInt(2, countryId);
+
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt("id"), rs.getString("name"));
+				leagues.add(entry);
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+		return leagues;
+	}
+
+	public List<SoccerMatch> getUpcomingMatches(String sportResultTable) {
+		final ArrayList<SoccerMatch> matches = Lists.newArrayList();
+		final String dateSql;
+		dateSql = " AND DATE(gameDate) >= DATE(now())";
+
+		final String sql = "SELECT res.id, homeTeamId, awayTeamId, homeScore, awayScore, overtime, odds1, oddsX, odds2, gameDate, season, res.leagueId, res.countryId, "
+				+ "hTeam.name as homeTeamName, aTeam.name as awayTeamName, " + "league.name as leagueName, "
+				+ "country.name as countryName, " + "country.prio as prio " + "FROM " + sportResultTable + " as res "
+				+ "Join Team as hTeam ON res.homeTeamId = hTeam.id "
+				+ "Join Team as aTeam ON res.awayTeamId = aTeam.id "
+				+ "Join League as league ON res.leagueId = league.id "
+				+ "Join Country as country ON res.countryId = country.id " + "where homeScore = -1 " + dateSql
+				+ "AND league.name NOT LIKE '%cup%' AND league.name NOT LIKE '%group%' "
+				+ "ORDER BY country.prio DESC, country.name ASC";
+
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+
+			final ResultSet rs = stat.executeQuery();
+			while (rs.next()) {
+				final SoccerMatch sm = new SoccerMatch();
+				final Team homeTeam = new Team();
+				final Team awayTeam = new Team();
+
+				homeTeam.setTeamId(rs.getInt("homeTeamId"));
+				awayTeam.setTeamId(rs.getInt("awayTeamId"));
+				homeTeam.setTeamName(rs.getString("homeTeamName"));
+				awayTeam.setTeamName(rs.getString("awayTeamName"));
+				homeTeam.setTeamLeagueId(rs.getInt("leagueId"));
+				awayTeam.setTeamLeagueId(rs.getInt("leagueId"));
+				homeTeam.setTeamLeague(rs.getString("leagueName"));
+				awayTeam.setTeamLeague(rs.getString("leagueName"));
+				homeTeam.setCountryId(rs.getInt("countryId"));
+				awayTeam.setCountryId(rs.getInt("countryId"));
+				homeTeam.setCountryName(rs.getString("countryName"));
+				awayTeam.setCountryName(rs.getString("countryName"));
+
+				sm.setAwayScore(rs.getInt("awayScore"));
+				sm.setHomeScore(rs.getInt("homeScore"));
+				sm.setHomeTeam(homeTeam);
+				sm.setAwayTeam(awayTeam);
+				sm.setMatchId(rs.getInt("id"));
+				sm.setOdds1(rs.getFloat("odds1"));
+				sm.setOddsX(rs.getFloat("oddsX"));
+				sm.setOdds2(rs.getFloat("odds2"));
+				sm.setGameDate(LocalDateTime.parse(rs.getString("gameDate")));
+				sm.setCountryPrio(rs.getBoolean("prio"));
+
+				matches.add(sm);
+			}
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return matches;
+	}
+
+	public List<Float> getAvgHomeScore(int teamId) {
+		final ArrayList<Float> returnValue = Lists.newArrayList();
+		final String sql = "SELECT AVG(homeScore) as avgScored, AVG(awayScore) as avgConceded FROM SoccerResults WHERE homeScore != -1 && homeTeamId = ?";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, teamId);
+
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				returnValue.add(rs.getFloat("avgScored"));
+				returnValue.add(rs.getFloat("avgConceded"));
+			}
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return returnValue;
+	}
+
+	public List<Float> getAvgAwayScore(int teamId) {
+		final ArrayList<Float> returnValue = Lists.newArrayList();
+		final String sql = "SELECT AVG(homeScore) as avgConceded, AVG(awayScore) as avgScored FROM SoccerResults WHERE awayScore != -1 && awayTeamId = ?";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, teamId);
+
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				returnValue.add(rs.getFloat("avgScored"));
+				returnValue.add(rs.getFloat("avgConceded"));
+			}
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return returnValue;
+	}
+
+	public List<Float> getLeagueAvarages(int leagueId, int countryId) {
+		final ArrayList<Float> returnValue = Lists.newArrayList();
+		final String sql = "SELECT AVG(homeScore) avgHomeScore, AVG(awayScore) as avgAwayScore"
+				+ " FROM SoccerResults WHERE leagueId = ? AND countryId = ?";
+
+		final String goalsSql = "SELECT (homeScore + awayScore) as totalGoals, count(*) as count FROM SoccerResults  WHERE leagueId = ? AND countryId = ? AND season = ? GROUP BY totalGoals ORDER BY totalGoals asc";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, leagueId);
+			stat.setInt(2, countryId);
+
+			final ResultSet rs = stat.executeQuery();
+			while (rs.next()) {
+				returnValue.add(rs.getFloat("avgHomeScore"));
+				returnValue.add(rs.getFloat("avgAwayScore"));
+			}
+
+			final PreparedStatement goalStmt = conn.prepareStatement(goalsSql);
+			goalStmt.setInt(1, leagueId);
+			goalStmt.setInt(2, countryId);
+			goalStmt.setString(3, getLastSeason(countryId, leagueId));
+
+			final ResultSet goalRs = goalStmt.executeQuery();
+			while (goalRs.next()) {
+
+			}
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return returnValue;
+	}
+
+	public List<OverUnder> getStatsOverUnder(int leagueId) {
+
+		final DecimalFormat df = new DecimalFormat("##.##");
+		df.setRoundingMode(RoundingMode.HALF_DOWN);
+		final ArrayList<OverUnder> result = Lists.newArrayList();
+
+		final String sql = "SELECT ((sHome.avgScored + sAway.avgConceded) - (sAway.avgScored + sHome.avgConceded)) as diff, (homeScore + awayScore) as numGoals "
+				+ "FROM SoccerResults "
+				+ "INNER JOIN (SELECT homeTeamId, AVG(homeScore) as avgScored, AVG(awayScore) as avgConceded FROM SoccerResults WHERE homeScore != -1 && homeTeamId = SoccerResults.homeTeamId GROUP BY homeTeamId) as sHome ON SoccerResults.homeTeamId = sHome.homeTeamId "
+				+ "INNER JOIN (SELECT awayTeamId, AVG(homeScore) as avgConceded, AVG(awayScore) as avgScored FROM SoccerResults WHERE awayScore != -1 && awayTeamId = SoccerResults.awayTeamId GROUP BY awayTeamId) as sAway ON SoccerResults.awayTeamId = sAway.awayTeamId "
+				+ "WHERE homeScore != -1 AND awayScore != -1 AND leagueId = ? " + "ORDER BY diff ASC";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, leagueId);
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				final float diff = rs.getFloat("diff");
+				final int numGoals = rs.getInt("numGoals");
+				final Float formatted = round(BigDecimal.valueOf(diff), INCREMENT, RoundingMode.HALF_UP).floatValue();
+
+				final OverUnder entry = result.stream().filter(ou -> ou.getKey().compareTo(formatted) == 0).findFirst()
+						.orElse(new OverUnder(formatted));
+				entry.addGoalStat(numGoals);
+				result.add(entry);
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+
+	public BigDecimal round(BigDecimal value, BigDecimal increment, RoundingMode roundingMode) {
+		if (increment.signum() == 0) {
+			// 0 increment does not make much sense, but prevent division by 0
+			return value;
+		} else {
+			final BigDecimal divided = value.divide(increment, 0, roundingMode);
+			final BigDecimal result = divided.multiply(increment);
+			return result.setScale(2, RoundingMode.HALF_UP);
+		}
+	}
+
+	public BigDecimal getIncrement() {
+		return INCREMENT;
+	}
+
+	public List<TeamStanding> getLeagueTable(int leagueId, String season, int countryId) {
+		final ArrayList<TeamStanding> result = Lists.newArrayList();
+
+		final String sql = "SELECT teamName.name as teamName, count(*) played, count(case when homeScore > awayScore then 1 end) wins, "
+				+ "count(case when awayScore> homeScore then 1 end) lost, "
+				+ "count(case when homeScore = awayScore then 1 end) draws, " + "sum(homeScore) homeScore, "
+				+ "sum(awayScore) awayScore, " + "sum(homeScore) - sum(awayScore) goal_diff, "
+				+ "sum(case when homeScore > awayScore then 3 else 0 end  + case "
+				+ "WHEN homeScore = awayScore then 1 else 0 end) score, " + "season FROM "
+				+ "(select hometeamId team, homeScore, awayScore, season, leagueId as league, countryId as country FROM SoccerResults "
+				+ "union all SELECT awayteamId, awayScore, homeScore, season, leagueId as league, countryId as country FROM SoccerResults) a "
+				+ "INNER JOIN Team teamName ON team = teamName.id " + "WHERE season = ? " + "AND league = ? "
+				+ "AND country = ? " + "AND homeScore != -1 " + "AND awayScore != -1 " + "group by team "
+				+ "order by score desc, goal_diff desc";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+
+			stat.setString(1, season);
+			stat.setInt(2, leagueId);
+			stat.setInt(3, countryId);
+
+			final ResultSet rs = stat.executeQuery();
+			while (rs.next()) {
+				final TeamStanding ts = new TeamStanding(rs.getString("teamName"), rs.getInt("wins"), rs.getInt("lost"),
+						rs.getInt("draws"), rs.getInt("score"), rs.getFloat("homeScore"), rs.getFloat("awayScore"),
+						rs.getFloat("goal_diff"));
+				result.add(ts);
+			}
+
+		} catch (final SQLException e) {
+			Log.getLog().info("Sql vid fel: %s", sql);
+			e.printStackTrace();
+		}
+
+		return result;
+	}
+
+	public boolean getParsingStarted(int countryId, int leagueId) {
+		boolean returnValue = false;
+		final String sql = "SELECT parsedYear FROM League WHERE id = ? AND countryId = ?";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, leagueId);
+			stat.setInt(2, countryId);
+
+			final ResultSet rs = stat.executeQuery();
+			while (rs.next()) {
+				final String parsedYear = rs.getString("parsedYear");
+				if (!Strings.isNullOrEmpty(parsedYear)) {
+					returnValue = true;
+				}
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return returnValue;
+	}
+
+	public String getLastSeason(Integer countryId, Integer leagueId) {
+		String season = "";
+		final String sql = "SELECT season FROM SoccerResults WHERE leagueId = ? AND countryId = ? ORDER BY season DESC limit 1";
+		try (PreparedStatement stmt = conn.prepareStatement(sql)) {
+			stmt.setInt(1, leagueId);
+			stmt.setInt(2, countryId);
+
+			final ResultSet rs = stmt.executeQuery();
+			while (rs.next()) {
+				season = rs.getString("season");
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return season;
+	}
+
+	public TeamResults getTeamResults(int teamId, int numResults, boolean isHomeTeam) {
+		final String sql;
+		final TeamResults tr = new TeamResults();
+		if (isHomeTeam) {
+			sql = "SELECT count(case when homeScore > awayScore then 1 end) wins, "
+					+ "count(case when awayScore > homeScore then 1 end) lost, "
+					+ "count(case when homeScore = awayScore then 1 end) draws "
+					+ "FROM (SELECT * FROM SoccerResults WHERE homeTeamId = ? AND "
+					+ "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < DATE(NOW()) ORDER BY gameDate DESC LIMIT ?) as t";
+		} else {
+			sql = "SELECT count(case when homeScore < awayScore then 1 end) wins, "
+					+ "count(case when awayScore < homeScore then 1 end) lost, "
+					+ "count(case when homeScore = awayScore then 1 end) draws "
+					+ "FROM (SELECT * FROM SoccerResults WHERE awayTeamId = ? AND "
+					+ "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < DATE(NOW()) ORDER BY gameDate DESC LIMIT ?) as t";
+		}
+
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, teamId);
+			stat.setInt(2, numResults);
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				final int draws = rs.getInt("draws");
+				final int wins = rs.getInt("wins");
+				final int lost = rs.getInt("lost");
+				tr.setDraws(draws);
+				tr.setWins(wins);
+				tr.setLosses(lost);
+				tr.setCount(wins + draws + lost);
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return tr;
+	}
+
+	public TeamResults getTeamResultsTest(int teamId, int numResults, boolean isHomeTeam, String date) {
+		final String sql;
+		final TeamResults tr = new TeamResults();
+		if (isHomeTeam) {
+			sql = "SELECT count(case when homeScore > awayScore then 1 end) wins, "
+					+ "count(case when awayScore > homeScore then 1 end) lost, "
+					+ "count(case when homeScore = awayScore then 1 end) draws "
+					+ "FROM (SELECT * FROM SoccerResults WHERE homeTeamId = ? AND "
+					+ "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?) as t";
+		} else {
+			sql = "SELECT count(case when homeScore < awayScore then 1 end) wins, "
+					+ "count(case when awayScore < homeScore then 1 end) lost, "
+					+ "count(case when homeScore = awayScore then 1 end) draws "
+					+ "FROM (SELECT * FROM SoccerResults WHERE awayTeamId = ? AND "
+					+ "HomeScore >= 0 AND awayScore >= 0 AND DATE(gameDate) < ? ORDER BY gameDate DESC LIMIT ?) as t";
+		}
+
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, teamId);
+			stat.setString(2, date);
+			stat.setInt(3, numResults);
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				final int draws = rs.getInt("draws");
+				final int wins = rs.getInt("wins");
+				final int lost = rs.getInt("lost");
+				tr.setDraws(draws);
+				tr.setWins(wins);
+				tr.setLosses(lost);
+				tr.setCount(wins + draws + lost);
+			}
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return tr;
+	}
+
+	public List<SimpleEntry<Integer, String>> getCountriesBySport(int sportId, String date) {
+		final String sql = "SELECT * FROM Country WHERE id IN (SELECT DISTINCT(countryId) FROM SoccerResults WHERE DATE(gameDate) = ?) ORDER BY prio DESC, name ASC";
+		final ArrayList<SimpleEntry<Integer, String>> result = new ArrayList<>();
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			if (date.equals("")) {
+				stat.setString(1, "DATE(NOW())");
+			} else {
+				stat.setString(1, date);
+			}
+
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				result.add(new SimpleEntry<>(rs.getInt("id"), rs.getString("name")));
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return result;
+	}
+
+	public List<SimpleEntry<Integer, String>> getLeaguesByDate(int sportId, int countryId, String date) {
+		final ArrayList<AbstractMap.SimpleEntry<Integer, String>> leagues = Lists.newArrayList();
+		final String sql = "SELECT id, name FROM League WHERE id IN (SELECT leagueId FROM SoccerResults WHERE sportId = ? AND countryId = ? AND DATE(gameDate) = ?)";
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, sportId);
+			stat.setInt(2, countryId);
+			stat.setString(3, date);
+
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				final SimpleEntry<Integer, String> entry = new SimpleEntry<>(rs.getInt("id"), rs.getString("name"));
+				leagues.add(entry);
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+		return leagues;
+	}
+
+	public List<SoccerMatch> getMatches(int sportId, Integer countryId, Integer leagueId, String date, String order) {
+		final ArrayList<SoccerMatch> matches = Lists.newArrayList();
+		final String dateSql;
+		final String orderSql = " ORDER BY gameDate " + order;
+		if (date.equals("")) {
+			dateSql = "DATE(gameDate) = DATE(NOW()) ";
+		} else {
+			dateSql = "DATE(gameDate) <= '" + date + "' ";
+		}
+		final String sql = "SELECT res.*, " + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
+				+ "FROM SoccerResults as res " + "Join Team as hTeam ON res.homeTeamId = hTeam.id "
+				+ "Join Team as aTeam ON res.awayTeam = aTeam.id " + "WHERE " + dateSql + "AND res.leagueId = ? "
+				+ "AND res.countryId = ? " + orderSql;
+
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, leagueId);
+			stat.setInt(2, countryId);
+
+			final ResultSet rs = stat.executeQuery();
+			while (rs.next()) {
+				final SoccerMatch sm = new SoccerMatch();
+				final Team homeTeam = new Team();
+				final Team awayTeam = new Team();
+
+				homeTeam.setTeamId(rs.getInt("homeTeamId"));
+				awayTeam.setTeamId(rs.getInt("awayTeamId"));
+				homeTeam.setTeamName(rs.getString("homeTeamName"));
+				awayTeam.setTeamName(rs.getString("awayTeamName"));
+				homeTeam.setTeamLeagueId(rs.getInt("leagueId"));
+				awayTeam.setTeamLeagueId(rs.getInt("leagueId"));
+				homeTeam.setCountryId(rs.getInt("countryId"));
+				awayTeam.setCountryId(rs.getInt("countryId"));
+
+				sm.setAwayScore(rs.getInt("awayScore"));
+				sm.setHomeScore(rs.getInt("homeScore"));
+				sm.setHomeTeam(homeTeam);
+				sm.setAwayTeam(awayTeam);
+				sm.setMatchId(rs.getInt("id"));
+				sm.setOdds1(rs.getFloat("odds1"));
+				sm.setOddsX(rs.getFloat("oddsX"));
+				sm.setOdds2(rs.getFloat("odds2"));
+				sm.setGameDate(LocalDateTime.parse(rs.getString("gameDate")));
+				sm.setSeason(rs.getString("season"));
+
+				matches.add(sm);
+			}
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return matches;
+	}
+
+	public League getLeagueInfo(String teamLeague) {
+		final String sql = "SELECT * FROM League WHERE name = ?";
+		League result = null;
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setString(1, teamLeague);
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				result = new League(rs.getInt("id"), rs.getString("name"), rs.getInt("lookback"),
+						rs.getInt("betMargin"), rs.getInt("lookbackHome"), rs.getInt("lookbackDraw"),
+						rs.getInt("lookbackAway"), rs.getInt("betMarginHome"), rs.getInt("betMarginDraw"),
+						rs.getInt("betMarginAway"));
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return result;
+	}
+
+	public League getLeagueInfo(int leagueId) {
+		final String sql = "SELECT * FROM League WHERE id = ?";
+		League result = null;
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, leagueId);
+			final ResultSet rs = stat.executeQuery();
+
+			while (rs.next()) {
+				result = new League(rs.getInt("id"), rs.getString("name"), rs.getInt("lookback"),
+						rs.getInt("betMargin"), rs.getInt("lookbackHome"), rs.getInt("lookbackDraw"),
+						rs.getInt("lookbackAway"), rs.getInt("betMarginHome"), rs.getInt("betMarginDraw"),
+						rs.getInt("betMarginAway"));
+			}
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+
+		return result;
+	}
+
+	public void setTeamMarginHome(int teamId, int marginHome) {
+		final String sql = "UPDATE Team SET marginHome = ? WHERE id = ?";
+
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, marginHome);
+			stat.setInt(2, teamId);
+
+			stat.executeUpdate();
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void setTeamMarginDraw(int teamId, int marginDraw) {
+		final String sql = "UPDATE Team SET marginDraw = ? WHERE id = ?";
+
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, marginDraw);
+			stat.setInt(2, teamId);
+
+			stat.executeUpdate();
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void setTeamMarginAway(int teamId, int marginAway) {
+		final String sql = "UPDATE Team SET marginAway = ? WHERE id = ?";
+
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, marginAway);
+			stat.setInt(2, teamId);
+
+			stat.executeUpdate();
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void setTeamLookbackHome(int teamId, int lookbackHome) {
+		final String sql = "UPDATE Team SET lookbackHome = ? WHERE id = ?";
+
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, lookbackHome);
+			stat.setInt(2, teamId);
+
+			stat.executeUpdate();
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void setTeamLookbackDraw(int teamId, int lookbackDraw) {
+		final String sql = "UPDATE Team SET lookbackDraw = ? WHERE id = ?";
+
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, lookbackDraw);
+			stat.setInt(2, teamId);
+
+			stat.executeUpdate();
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void setTeamLookbackAway(int teamId, int lookbackAway) {
+		final String sql = "UPDATE Team SET lookbackAway = ? WHERE id = ?";
+
+		try (PreparedStatement stat = conn.prepareStatement(sql)) {
+			stat.setInt(1, lookbackAway);
+			stat.setInt(2, teamId);
+
+			stat.executeUpdate();
+
+		} catch (final SQLException e) {
+			e.printStackTrace();
+		}
+	}
 }

+ 14 - 0
OddsJavaFx/src/exceptions/SportSelectionException.java

@@ -0,0 +1,14 @@
+package exceptions;
+
+public class SportSelectionException extends RuntimeException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public SportSelectionException(String message) {
+		super(message);
+	}
+
+}

+ 41 - 59
OddsJavaFx/src/tests/AddedScoringTest.java

@@ -4,7 +4,6 @@ import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
 
 import objects.League;
 import objects.SoccerMatch;
@@ -12,10 +11,9 @@ import objects.Team;
 
 public class AddedScoringTest extends TestClass {
 
-	private ArrayList<SoccerMatch> trainMatches;
+	private List<SoccerMatch> trainMatches;
 
-	@Override
-	public void runTest() {
+	@Override public void runTest() {
 		trainMatches = getTrainMatches();
 		final League leagueInfo = getLeagueInfoById();
 
@@ -30,7 +28,6 @@ public class AddedScoringTest extends TestClass {
 		final int lookback = leagueInfo.getLookback();
 		final int margin = leagueInfo.getBetMargin();
 
-
 		final float betLevel = bettingLevel / 100f;
 		float bank = startingBank;
 		float prevBank = startingBank;
@@ -55,12 +52,18 @@ public class AddedScoringTest extends TestClass {
 			final Team homeTeam = soccerMatch.getHomeTeam();
 			final Team awayTeam = soccerMatch.getAwayTeam();
 
-			final List<SoccerMatch> homeMatches = trainMatches.stream().filter(p -> p.getGameDate().isBefore(soccerMatch.getGameDate()) && p.getHomeTeam().getTeamId() == homeTeam.getTeamId()).limit(lookbackHome).collect(Collectors.toList());
-			final List<SoccerMatch> awayMatches = trainMatches.stream().filter(p -> p.getGameDate().isBefore(soccerMatch.getGameDate()) && p.getAwayTeam().getTeamId() == awayTeam.getTeamId()).limit(lookbackAway).collect(Collectors.toList());
+			final List<SoccerMatch> homeMatches = trainMatches.stream()
+					.filter(p -> p.getGameDate().isBefore(soccerMatch.getGameDate())
+							&& p.getHomeTeam().getTeamId() == homeTeam.getTeamId())
+					.limit(lookbackHome).toList();
+			final List<SoccerMatch> awayMatches = trainMatches.stream()
+					.filter(p -> p.getGameDate().isBefore(soccerMatch.getGameDate())
+							&& p.getAwayTeam().getTeamId() == awayTeam.getTeamId())
+					.limit(lookbackAway).toList();
 
 			final long hemmaVinster = homeMatches.stream().filter(p -> p.getHomeScore() > p.getAwayScore()).count();
 			final long hemmaLika = homeMatches.stream().filter(p -> p.getHomeScore() == p.getAwayScore()).count();
-			final long hemmaForluster= homeMatches.stream().filter(p -> p.getHomeScore() < p.getAwayScore()).count();
+			final long hemmaForluster = homeMatches.stream().filter(p -> p.getHomeScore() < p.getAwayScore()).count();
 
 			final long bortaVinster = awayMatches.stream().filter(p -> p.getAwayScore() > p.getHomeScore()).count();
 			final long bortaLika = awayMatches.stream().filter(p -> p.getAwayScore() == p.getHomeScore()).count();
@@ -76,10 +79,12 @@ public class AddedScoringTest extends TestClass {
 				awayGoals += am.getAwayScore() - am.getHomeScore();
 			}
 
-			final float homeWinPercent = (hemmaVinster + bortaForluster) / Float.valueOf(homeMatches.size() + awayMatches.size()) * 100;
-			final float awayWinPercent = (hemmaForluster + bortaVinster) / Float.valueOf(homeMatches.size() + awayMatches.size()) * 100;
-			final float drawWinPercent = (hemmaLika + bortaLika) / Float.valueOf(homeMatches.size() + awayMatches.size()) * 100;
-
+			final float homeWinPercent = (hemmaVinster + bortaForluster)
+					/ Float.valueOf(homeMatches.size() + awayMatches.size()) * 100;
+			final float awayWinPercent = (hemmaForluster + bortaVinster)
+					/ Float.valueOf(homeMatches.size() + awayMatches.size()) * 100;
+			final float drawWinPercent = (hemmaLika + bortaLika)
+					/ Float.valueOf(homeMatches.size() + awayMatches.size()) * 100;
 
 			prevBetAmount = prevBank * betLevel;
 			// check if should bet on home Win before score added
@@ -104,26 +109,11 @@ public class AddedScoringTest extends TestClass {
 				}
 			}
 
-			//			if ((100 / drawWinPercent) * betMarginDecimalDraw <= soccerMatch.getOddsX()) {
-			//				// Bet on Draw
-			//				prevBetOnGameCount++;
-			//				prevBank = prevBank - prevBetAmount;
-			//				if (soccerMatch.getAwayScore() == soccerMatch.getHomeScore()) {
-			//					prevWins++;
-			//					prevBank = prevBank + prevBetAmount * soccerMatch.getOddsX();
-			//				}
-			//			}
-
-
 			final int goalDiff = homeGoals - awayGoals;
 
-			//			if (goalDiff == 0) {
-			//				System.out.println("Ingen goalDiff borde man satsa på lika, faktiskt resultat " + soccerMatch.getHomeScore() + " - " + soccerMatch.getAwayScore());
-			//			}
 			float homeWinPercentGoals = homeWinPercent + ((homeGoals / 2f) * 10);
 			float awayWinPercentGoals = awayWinPercent + ((awayGoals / 2f) * 10);
 
-
 			if (homeWinPercentGoals <= 0) {
 				homeWinPercentGoals = 0.01f;
 			}
@@ -149,7 +139,7 @@ public class AddedScoringTest extends TestClass {
 			}
 
 			// check if should bet on away Win
-			if (awayOdds * betMarginDecimalAway  <= soccerMatch.getOdds2()) {
+			if (awayOdds * betMarginDecimalAway <= soccerMatch.getOdds2()) {
 				// Bet on Home Win
 				betOnGameCount++;
 				bank = bank - betAmount;
@@ -160,8 +150,8 @@ public class AddedScoringTest extends TestClass {
 			}
 
 			if (goalDiff >= -1 && goalDiff <= 1) {
-				System.out.println("Test betting on X odds " + soccerMatch.getOddsX() +
-						" Actual result " + soccerMatch.getHomeScore() + " - " + soccerMatch.getAwayScore());
+				System.out.println("Test betting on X odds " + soccerMatch.getOddsX() + " Actual result "
+						+ soccerMatch.getHomeScore() + " - " + soccerMatch.getAwayScore());
 				betOnX++;
 				final float xBetAmount = xBank * betLevel;
 				xBank -= xBetAmount;
@@ -173,31 +163,28 @@ public class AddedScoringTest extends TestClass {
 			}
 		}
 
-		System.out.println("Test ended with a bank of with score added " + bank + " and with no score added it was " + prevBank);
-		System.out.println("Betted on " + betOnGameCount + " won " + wins + " out of " + trainMatches.size() + " prev bets " + prevBetOnGameCount + " and prev wins " + prevWins);
+		System.out.println(
+				"Test ended with a bank of with score added " + bank + " and with no score added it was " + prevBank);
+		System.out.println("Betted on " + betOnGameCount + " won " + wins + " out of " + trainMatches.size()
+				+ " prev bets " + prevBetOnGameCount + " and prev wins " + prevWins);
 
-		System.out.println("Test with draw ended with betting on " + betOnX + " matches and " + correctX + " correct " + (correctX / (float)betOnX) + " bank " + xBank);
+		System.out.println("Test with draw ended with betting on " + betOnX + " matches and " + correctX + " correct "
+				+ (correctX / (float) betOnX) + " bank " + xBank);
 	}
 
-
 	private ArrayList<SoccerMatch> getMatches() {
 		final ArrayList<SoccerMatch> result = new ArrayList<>();
 
-		final String sql = "SELECT res.*, "
-				+ "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
-				+ "FROM SoccerResults as res "
-				+ "Join Team as hTeam ON res.homeTeam = hTeam.id "
-				+ "Join Team as aTeam ON res.awayTeam = aTeam.id "
-				+ "WHERE "
-				+ "DATE(gameDate) > DATE_SUB(NOW(), INTERVAL 1 YEAR) AND "
-				+ "res.leagueId = ? "
+		final String sql = "SELECT res.*, " + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
+				+ "FROM SoccerResults as res " + "Join Team as hTeam ON res.homeTeam = hTeam.id "
+				+ "Join Team as aTeam ON res.awayTeam = aTeam.id " + "WHERE "
+				+ "DATE(gameDate) > DATE_SUB(NOW(), INTERVAL 1 YEAR) AND " + "res.leagueId = ? "
 				+ "ORDER BY gameDate ASC";
 
-		try {
-			final PreparedStatement stmt = getConnection().prepareStatement(sql);
-			stmt.setInt(1, leagueId);
+		try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
+			stat.setInt(1, leagueId);
 
-			result.addAll(super.getMatches(stmt));
+			result.addAll(super.getMatches(stat));
 		} catch (final SQLException e) {
 			e.printStackTrace();
 		}
@@ -205,24 +192,19 @@ public class AddedScoringTest extends TestClass {
 		return result;
 	}
 
-	private ArrayList<SoccerMatch> getTrainMatches() {
+	private List<SoccerMatch> getTrainMatches() {
 		final ArrayList<SoccerMatch> result = new ArrayList<>();
 
-		final String sql = "SELECT res.*, "
-				+ "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
-				+ "FROM SoccerResults as res "
-				+ "Join Team as hTeam ON res.homeTeam = hTeam.id "
-				+ "Join Team as aTeam ON res.awayTeam = aTeam.id "
-				+ "WHERE "
-				+ "DATE(gameDate) < DATE_SUB(NOW(), INTERVAL 1 YEAR) AND "
-				+ "res.leagueId = ? "
+		final String sql = "SELECT res.*, " + "hTeam.name as homeTeamName, aTeam.name as awayTeamName "
+				+ "FROM SoccerResults as res " + "Join Team as hTeam ON res.homeTeam = hTeam.id "
+				+ "Join Team as aTeam ON res.awayTeam = aTeam.id " + "WHERE "
+				+ "DATE(gameDate) < DATE_SUB(NOW(), INTERVAL 1 YEAR) AND " + "res.leagueId = ? "
 				+ "ORDER BY gameDate DESC";
 
-		try {
-			final PreparedStatement stmt = getConnection().prepareStatement(sql);
-			stmt.setInt(1, leagueId);
+		try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
+			stat.setInt(1, leagueId);
 
-			result.addAll(super.getMatches(stmt));
+			result.addAll(super.getMatches(stat));
 		} catch (final SQLException e) {
 			e.printStackTrace();
 		}

+ 57 - 33
OddsJavaFx/src/tests/LastResultsTest.java

@@ -3,7 +3,7 @@ package tests;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
+import java.util.List;
 
 import data.GuiMysql;
 import objects.SoccerMatch;
@@ -15,13 +15,12 @@ public class LastResultsTest extends TestClass {
 	float betLevel;
 	float betMarginDecimal;
 
-	@Override
-	public void runTest() {
+	@Override public void runTest() {
 
 		bank = startingBank;
 		betLevel = bettingLevel / 100;
 		betMarginDecimal = 1 + (betMargin / 100);
-		final ArrayList<SoccerMatch> matches = getMatches(leagueId);
+		final List<SoccerMatch> matches = getMatches(leagueId);
 
 		final int totalMatchCount = matches.size();
 
@@ -39,12 +38,17 @@ public class LastResultsTest extends TestClass {
 				bank = startingBank;
 				season = soccerMatch.getSeason();
 			}
-			final TeamResults homeTeamResults = GuiMysql.getInstance().getTeamResults(soccerMatch.getHomeTeam().getTeamId(), lookBack, true);
-			final TeamResults awayTeamResults = GuiMysql.getInstance().getTeamResults(soccerMatch.getAwayTeam().getTeamId(), lookBack, false);
-
-			final float homeWinPercent = (homeTeamResults.getWins() + awayTeamResults.getLosses()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount())* 100;
-			final float drawPercent = (homeTeamResults.getDraws() + awayTeamResults.getDraws()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
-			final float awayWinPercent = (homeTeamResults.getLosses() + awayTeamResults.getWins()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
+			final TeamResults homeTeamResults = GuiMysql.getInstance()
+					.getTeamResults(soccerMatch.getHomeTeam().getTeamId(), lookBack, true);
+			final TeamResults awayTeamResults = GuiMysql.getInstance()
+					.getTeamResults(soccerMatch.getAwayTeam().getTeamId(), lookBack, false);
+
+			final float homeWinPercent = (homeTeamResults.getWins() + awayTeamResults.getLosses())
+					/ Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
+			final float drawPercent = (homeTeamResults.getDraws() + awayTeamResults.getDraws())
+					/ Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
+			final float awayWinPercent = (homeTeamResults.getLosses() + awayTeamResults.getWins())
+					/ Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
 
 			final float homeOdds = 100 / homeWinPercent;
 			final float drawOdds = 100 / drawPercent;
@@ -56,36 +60,45 @@ public class LastResultsTest extends TestClass {
 			}
 			if (homeOdds * betMarginDecimal <= soccerMatch.getOdds1()) {
 				betOnGameCount++;
-				//				System.out.print(soccerMatch.getGameDate() + " Bet " + betAmount + " on home team " + soccerMatch.getHomeTeam().getTeamName() + " - " + soccerMatch.getAwayTeam().getTeamName() + " at odds " + soccerMatch.getOdds1()
-				//				+ " Result " + soccerMatch.getHomeScore() + " - " + soccerMatch.getAwayScore());
+				// System.out.print(soccerMatch.getGameDate() + " Bet " + betAmount + " on home
+				// team " + soccerMatch.getHomeTeam().getTeamName() + " - " +
+				// soccerMatch.getAwayTeam().getTeamName() + " at odds " +
+				// soccerMatch.getOdds1()
+				// + " Result " + soccerMatch.getHomeScore() + " - " +
+				// soccerMatch.getAwayScore());
 				bank = bank - betAmount;
 				if (soccerMatch.getHomeScore() > soccerMatch.getAwayScore()) {
 					bank = bank + betAmount * soccerMatch.getOdds1();
-					//					System.out.println(" Win, new Bank " + bank);
+					// System.out.println(" Win, new Bank " + bank);
 				} else {
-					//					System.out.println(" Loss new Bank " + bank);
+					// System.out.println(" Loss new Bank " + bank);
 				}
 			}
 			if (awayOdds * betMarginDecimal <= soccerMatch.getOdds2()) {
 				betOnGameCount++;
-				//				System.out.print(soccerMatch.getGameDate() + " Bet " + betAmount + " on away team " + soccerMatch.getHomeTeam().getTeamName() + " - " + soccerMatch.getAwayTeam().getTeamName() + " at odds " + soccerMatch.getOdds2()
-				//				+ " Result " + soccerMatch.getHomeScore() + " - " + soccerMatch.getAwayScore());
+				// System.out.print(soccerMatch.getGameDate() + " Bet " + betAmount + " on away
+				// team " + soccerMatch.getHomeTeam().getTeamName() + " - " +
+				// soccerMatch.getAwayTeam().getTeamName() + " at odds " +
+				// soccerMatch.getOdds2()
+				// + " Result " + soccerMatch.getHomeScore() + " - " +
+				// soccerMatch.getAwayScore());
 				bank = bank - betAmount;
 				if (soccerMatch.getAwayScore() > soccerMatch.getHomeScore()) {
 					bank = bank + betAmount * soccerMatch.getOdds2();
-					//					System.out.println(" Win, new Bank " + bank);
+					// System.out.println(" Win, new Bank " + bank);
 				} else {
-					//					System.out.println(" Loss new Bank " + bank);
+					// System.out.println(" Loss new Bank " + bank);
 				}
 			}
 
 		}
 
 		System.out.println("season " + season + " ended with " + bank);
-		System.out.println("Match count " + matches.size() + " leagueId " + leagueId + " countryId " + countryId + " bet on " + betOnGameCount + "(" + betOnGameCount / (float)totalMatchCount + ")");
+		System.out.println("Match count " + matches.size() + " leagueId " + leagueId + " countryId " + countryId
+				+ " bet on " + betOnGameCount + "(" + betOnGameCount / (float) totalMatchCount + ")");
 	}
 
-	public void calcBestResults( int sportId, Integer countryId, Integer leagueId) {
+	public void calcBestResults(int sportId, Integer countryId, Integer leagueId) {
 		final float startingBank = 1000f;
 		float bank = startingBank;
 		final float betLevel = 1 / 100f;
@@ -94,7 +107,8 @@ public class LastResultsTest extends TestClass {
 		int bestLookBack = 1;
 		float bestBankResult = 1000f;
 
-		final ArrayList<SoccerMatch> matches = GuiMysql.getInstance().getMatches(sportId, countryId, leagueId, LocalDate.now().atStartOfDay().format(DateTimeFormatter.ISO_DATE), "ASC");
+		final List<SoccerMatch> matches = GuiMysql.getInstance().getMatches(sportId, countryId, leagueId,
+				LocalDate.now().atStartOfDay().format(DateTimeFormatter.ISO_DATE), "ASC");
 
 		final LocalDateTime currentDate = matches.get(0).getGameDate();
 		LocalDate localDate = currentDate.toLocalDate();
@@ -104,18 +118,24 @@ public class LastResultsTest extends TestClass {
 			for (int betMargin = 1; betMargin < 35; betMargin++) {
 				int betOnGameCount = 0;
 				int wins = 0;
-				final float betMarginDecimal = 1 + (betMargin / (float)100);
+				final float betMarginDecimal = 1 + (betMargin / (float) 100);
 				bank = startingBank;
 				for (final SoccerMatch soccerMatch : matches) {
 					if (soccerMatch.getHomeScore() < 0 || soccerMatch.getAwayScore() < 0) {
 						continue;
 					}
 
-					final TeamResults homeTeamResults = GuiMysql.getInstance().getTeamResultsTest(soccerMatch.getHomeTeam().getTeamId(), lookBack, true, soccerMatch.getGameDate().format(DateTimeFormatter.ISO_DATE));
-					final TeamResults awayTeamResults = GuiMysql.getInstance().getTeamResultsTest(soccerMatch.getAwayTeam().getTeamId(), lookBack, false, soccerMatch.getGameDate().format(DateTimeFormatter.ISO_DATE));
+					final TeamResults homeTeamResults = GuiMysql.getInstance().getTeamResultsTest(
+							soccerMatch.getHomeTeam().getTeamId(), lookBack, true,
+							soccerMatch.getGameDate().format(DateTimeFormatter.ISO_DATE));
+					final TeamResults awayTeamResults = GuiMysql.getInstance().getTeamResultsTest(
+							soccerMatch.getAwayTeam().getTeamId(), lookBack, false,
+							soccerMatch.getGameDate().format(DateTimeFormatter.ISO_DATE));
 
-					final float homeWinPercent = (homeTeamResults.getWins() + awayTeamResults.getLosses()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
-					final float awayWinPercent = (homeTeamResults.getLosses() + awayTeamResults.getWins()) / Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
+					final float homeWinPercent = (homeTeamResults.getWins() + awayTeamResults.getLosses())
+							/ Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
+					final float awayWinPercent = (homeTeamResults.getLosses() + awayTeamResults.getWins())
+							/ Float.valueOf(homeTeamResults.getCount() + awayTeamResults.getCount()) * 100;
 
 					final float homeOdds = 100 / homeWinPercent;
 					final float awayOdds = 100 / awayWinPercent;
@@ -143,22 +163,26 @@ public class LastResultsTest extends TestClass {
 				}
 
 				if (bestBankResult < bank) {
-					System.out.println("New best bank " + bank + " with lookback " + lookBack + " and betMargin " + betMargin +
-							" Bet on " + betOnGameCount + " of " + matches.size() + "(" + betOnGameCount / (float)matches.size() + ") wins " + wins + "(" + wins/Float.valueOf(betOnGameCount) + ")" +
-							" Win / game " + (bank - startingBank) / Float.valueOf(wins) + " kr");
+					System.out.println("New best bank " + bank + " with lookback " + lookBack + " and betMargin "
+							+ betMargin + " Bet on " + betOnGameCount + " of " + matches.size() + "("
+							+ betOnGameCount / (float) matches.size() + ") wins " + wins + "("
+							+ wins / Float.valueOf(betOnGameCount) + ")" + " Win / game "
+							+ (bank - startingBank) / Float.valueOf(wins) + " kr");
 					bestBetMargin = betMargin;
 					bestLookBack = lookBack;
 					bestBankResult = bank;
 				} else {
-					System.out.println("NOT BEST bank " + bank + " with lookback " + lookBack + " and betMargin " + betMargin +
-							" Bet on " + betOnGameCount + " of " + matches.size() + "(" + betOnGameCount / (float)matches.size() + ") wins " + wins + "(" + wins/Float.valueOf(betOnGameCount) + ")" +
-							" Win / game " + (bank - startingBank) / Float.valueOf(wins) + " kr");
+					System.out.println("NOT BEST bank " + bank + " with lookback " + lookBack + " and betMargin "
+							+ betMargin + " Bet on " + betOnGameCount + " of " + matches.size() + "("
+							+ betOnGameCount / (float) matches.size() + ") wins " + wins + "("
+							+ wins / Float.valueOf(betOnGameCount) + ")" + " Win / game "
+							+ (bank - startingBank) / Float.valueOf(wins) + " kr");
 				}
 			}
 		}
 	}
 
-	public ArrayList<SoccerMatch> getMatches(int leagueId) {
+	public List<SoccerMatch> getMatches(int leagueId) {
 		return GuiMysql.getInstance().getMatches(sportId, countryId, leagueId, date, "ASC");
 	}
 }