Przeglądaj źródła

2024-11-16 commit

Axel Nordh 1 rok temu
rodzic
commit
28c840e824
28 zmienionych plików z 756 dodań i 143 usunięć
  1. 72 27
      Odds/src/mysql/Mysql.java
  2. 1 1
      OddsJavaFx/.settings/org.eclipse.jdt.core.prefs
  3. 29 7
      OddsJavaFx/pom.xml
  4. 6 14
      OddsJavaFx/src/controllers/MainController.java
  5. 6 1
      OddsJavaFx/src/controllers/StryktipsetController.java
  6. 0 2
      OddsJavaFx/src/controllers/TestsController.java
  7. 1 1
      OddsJavaFx/src/data/BetStrategyMysql/BetStrategyMysql.java
  8. 12 1
      OddsJavaFx/src/data/DTO/FibonacciDTO/FibonacciDTO.java
  9. 169 65
      OddsJavaFx/src/data/GuiMysql.java
  10. 12 0
      OddsJavaFx/src/objects/SoccerMatchAnalysis.java
  11. 1 1
      OddsJavaFx/src/objects/visual/FibonacciBets.java
  12. 3 3
      OddsJavaFx/src/parser/OddsPortal.java
  13. 36 5
      OddsJavaFx/src/parser/Svenskaspel.java
  14. 7 2
      OddsStrategyWeb/src/main/java/MainPage.html
  15. 13 4
      OddsStrategyWeb/src/main/java/MainPage.java
  16. 3 0
      OddsStrategyWeb/src/main/java/components/AjaxButtonPanel.html
  17. 36 0
      OddsStrategyWeb/src/main/java/components/AjaxButtonPanel.java
  18. 10 0
      OddsStrategyWeb/src/main/java/components/betsequences/BetSequencesTable.css
  19. 6 0
      OddsStrategyWeb/src/main/java/components/betsequences/BetSequencesTable.html
  20. 105 0
      OddsStrategyWeb/src/main/java/components/betsequences/BetSequencesTable.java
  21. 4 0
      OddsStrategyWeb/src/main/java/components/matchtable/MatchTable.css
  22. 0 2
      OddsStrategyWeb/src/main/java/components/matchtable/MatchTable.html
  23. 23 6
      OddsStrategyWeb/src/main/java/components/matchtable/MatchTable.java
  24. 24 1
      OddsStrategyWeb/src/main/java/components/matchtable/SortableSoccerMatchAnalysisDataProvider.java
  25. 0 0
      OddsStrategyWeb/src/main/java/components/newBetForm/NewBetForm.css
  26. 21 0
      OddsStrategyWeb/src/main/java/components/newBetForm/NewBetForm.html
  27. 103 0
      OddsStrategyWeb/src/main/java/components/newBetForm/NewBetForm.java
  28. 53 0
      OddsStrategyWeb/src/main/java/events/MatchSelectedEvent.java

+ 72 - 27
Odds/src/mysql/Mysql.java

@@ -27,7 +27,6 @@ public class Mysql implements Serializable {
     protected transient Connection conn;
 
     protected Mysql() {
-        conn = getConnection();
     }
 
     public static Mysql getInstance() {
@@ -38,10 +37,12 @@ public class Mysql implements Serializable {
         name = name.replace(" ", "-");
         name = name.replace("\\.", "");
         final String sql = "INSERT INTO Country (name) VALUES (?) ON DUPLICATE KEY UPDATE name = ?";
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
             stat.setString(1, name);
             stat.setString(2, name);
             stat.executeUpdate();
+        } finally {
+            closeConnection();
         }
 
         return getId("Country", name, -1, -1);
@@ -57,7 +58,7 @@ public class Mysql implements Serializable {
             countryId = addCountry(country);
             final String sql = "INSERT INTO League (name, sportId, countryId) VALUES (?, ?, ?) "
                     + "ON DUPLICATE KEY UPDATE name = ?";
-            try (PreparedStatement stat = conn.prepareStatement(sql)) {
+            try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
                 stat.setString(1, leagueName);
                 stat.setInt(2, sportId);
                 stat.setInt(3, countryId);
@@ -67,6 +68,8 @@ public class Mysql implements Serializable {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
         return getId("League", leagueName, countryId, -1);
     }
@@ -88,7 +91,7 @@ public class Mysql implements Serializable {
             final ResultSet rs;
             int gameId = -1;
             final String date = result.getGameDate().format(DateTimeFormatter.ISO_DATE);
-            try (PreparedStatement stat = conn.prepareStatement(selectSql)) {
+            try (PreparedStatement stat = getConnection().prepareStatement(selectSql)) {
                 stat.setInt(1, homeTeamId);
                 stat.setInt(2, awayTeamId);
                 stat.setString(3, date);
@@ -97,6 +100,8 @@ public class Mysql implements Serializable {
                 while (rs.next()) {
                     gameId = rs.getInt("id");
                 }
+            } finally {
+                closeConnection();
             }
 
             if (gameId != -1) {
@@ -104,7 +109,7 @@ public class Mysql implements Serializable {
                         + " SET homeScore = ?, awayScore = ?, overtime = ?, odds1 = ?, oddsX = ?, odds2 = ? "
                         + "WHERE homeTeamId = ? AND awayTeamId = ? AND DATE(gameDate) = ?";
 
-                try (PreparedStatement stat = conn.prepareStatement(sql)) {
+                try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
                     stat.setInt(1, result.getHomeScore());
                     stat.setInt(2, result.getAwayScore());
                     stat.setBoolean(3, result.isOvertime());
@@ -122,7 +127,7 @@ public class Mysql implements Serializable {
                 final String sql = "INSERT INTO " + result.getTableName()
                         + " (homeTeamId, awayTeamId, homeScore, awayScore, overtime, odds1, oddsX, odds2, countryId, gameDate, season, leagueId) "
                         + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE homeScore = ?, awayScore = ?, odds1 = ?, oddsX = ?, odds2 = ?";
-                try (PreparedStatement stat = conn.prepareStatement(sql)) {
+                try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
                     stat.setInt(1, homeTeamId);
                     stat.setInt(2, awayTeamId);
                     stat.setInt(3, result.getHomeScore());
@@ -146,6 +151,8 @@ public class Mysql implements Serializable {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
     }
 
@@ -153,7 +160,7 @@ public class Mysql implements Serializable {
 
         final String sql = "INSERT INTO SoccerResults (homeTeamId, awayTeamId, homeScore, awayScore, overtime, odds1, oddsX, odds2, countryId, gameDate, season, leagueId) "
                 + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE homeScore = ?, awayScore = ?, odds1 = ?, oddsX = ?, odds2 = ?";
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
 
             for (ResultDTO resultDTO : resultsToInsert) {
 
@@ -187,6 +194,8 @@ public class Mysql implements Serializable {
             stat.executeBatch();
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
     }
 
@@ -194,10 +203,12 @@ public class Mysql implements Serializable {
         sport = sport.replace(" ", "-");
         sport = sport.replace("\\.", "");
         final String sql = "INSERT INTO Sport (name) VALUES (?) ON DUPLICATE KEY UPDATE name = ?";
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
             stat.setString(1, sport);
             stat.setString(2, sport);
             stat.executeUpdate();
+        } finally {
+            closeConnection();
         }
         return getId("Sport", sport, -1, -1);
     }
@@ -205,7 +216,7 @@ public class Mysql implements Serializable {
     public int getCountryId(String country) {
         final String sql = "SELECT id from Country WHERE name = ?";
         int id = -1;
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
             stat.setString(1, country.trim());
 
             final ResultSet rs = stat.executeQuery();
@@ -214,6 +225,8 @@ public class Mysql implements Serializable {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
         return id;
     }
@@ -221,7 +234,7 @@ public class Mysql implements Serializable {
     public CurrentParsing getCurrentParsing() {
         final CurrentParsing returnValue = new CurrentParsing();
         final String sql = "SELECT * FROM parsing";
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
             final ResultSet rs = stat.executeQuery();
             while (rs.next()) {
                 returnValue.setDone(rs.getBoolean("done"));
@@ -232,13 +245,19 @@ public class Mysql implements Serializable {
             }
         } catch (final SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
         return returnValue;
     }
 
     public Connection getDbConnection() {
-        if (conn == null) {
-            conn = getConnection();
+        try {
+            if (conn == null || conn.isClosed()) {
+                conn = getConnection();
+            }
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
         }
         return conn;
     }
@@ -247,7 +266,7 @@ public class Mysql implements Serializable {
         String returnValue = "";
 
         final String sql = "SELECT parsedYear FROM League WHERE name = ? AND countryId = ?";
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
             stat.setString(1, leagueName);
             stat.setInt(2, countryId);
 
@@ -258,6 +277,8 @@ public class Mysql implements Serializable {
             }
         } catch (final SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
 
         return returnValue;
@@ -278,6 +299,8 @@ public class Mysql implements Serializable {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
 
         return result;
@@ -286,7 +309,7 @@ public class Mysql implements Serializable {
     public String getLastSeason(String leagueName, int countryId) {
         String sql = "SELECT season FROM SoccerResults WHERE leagueId = (SELECT id FROM League WHERE name = ? AND countryId = ?) ORDER BY gameDate DESC limit 1";
         String result = null;
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
             stat.setString(1, leagueName);
             stat.setInt(2, countryId);
 
@@ -297,6 +320,8 @@ public class Mysql implements Serializable {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
 
         if (Strings.isNullOrEmpty(result)) {
@@ -308,7 +333,7 @@ public class Mysql implements Serializable {
     public int getLeagueId(int sportId, int countryId, String leagueName) {
         final String sql = "SELECT id FROM League WHERE name = ? AND countryId = ? AND sportId = ?";
         int id = -1;
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
             stat.setString(1, leagueName.trim());
             stat.setInt(2, countryId);
             stat.setInt(3, sportId);
@@ -320,6 +345,8 @@ public class Mysql implements Serializable {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
         if (id == -1) {
             String message = "Cound not find league " + leagueName + " countryId " + countryId + " sportId " + sportId;
@@ -336,7 +363,7 @@ public class Mysql implements Serializable {
             teamId = getId("Team", teamName, countryId, leagueId);
             if (teamId <= 0) {
                 final String insertSql = "INSERT INTO Team (name, sportId, countryId, leagueId) VALUES (? ,? ,? ,?)";
-                try (PreparedStatement stat = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS)) {
+                try (PreparedStatement stat = getConnection().prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS)) {
                     stat.setString(1, teamName.trim());
                     stat.setInt(2, sportId);
                     stat.setInt(3, countryId);
@@ -348,6 +375,8 @@ public class Mysql implements Serializable {
                     teamId = generatedKeys.getInt(1);
                 } catch (SQLException e) {
                     e.printStackTrace();
+                } finally {
+                    closeConnection();
                 }
             }
         } else {
@@ -360,7 +389,7 @@ public class Mysql implements Serializable {
     public int getSportId(String sportName) {
         final String sql = "SELECT id from Sport WHERE name = ?";
         int id = 0;
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
             stat.setString(1, sportName.trim());
 
             final ResultSet rs = stat.executeQuery();
@@ -369,14 +398,16 @@ public class Mysql implements Serializable {
             }
         } catch (final SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
         return id;
     }
 
     public void setParsingForLeague(int leagueId, int sportId, int countryId, LocalDateTime gameDate,
-            int currentParsePage, String parsedYear) {
+                                    int currentParsePage, String parsedYear) {
         final String sql = "UPDATE League SET parsedYear = ?, parsedPage = ?, lastParsedGameDate = ? WHERE sportId = ? AND countryId = ? AND id = ?";
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
             stat.setString(1, parsedYear);
             stat.setInt(2, currentParsePage);
             stat.setString(3, gameDate.toString());
@@ -387,24 +418,26 @@ public class Mysql implements Serializable {
             stat.executeUpdate();
         } catch (final SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
     }
 
     protected Connection getConnection() {
-        if (conn == null) {
-            try {
+        try {
+            if (conn == null || conn.isClosed()) {
                 Class.forName("com.mysql.cj.jdbc.Driver");
                 Properties prop = new Properties();
                 prop.put("user", USERNAME);
                 prop.put("password", PASSWORD);
                 prop.put("useSSL", "false");
                 conn = DriverManager.getConnection(URL + DATABASE + TIMEZONE_FIX, prop);
-            } catch (final SQLException e) {
-                throw new RuntimeException(e.getMessage(), e);
-            } catch (ClassNotFoundException e) {
-                System.out.println("ClassNotFoundException: " + e.getMessage());
-                throw new RuntimeException(e);
             }
+        } catch (final SQLException e) {
+            throw new RuntimeException(e.getMessage(), e);
+        } catch (ClassNotFoundException e) {
+            System.out.println("ClassNotFoundException: " + e.getMessage());
+            throw new RuntimeException(e);
         }
         return conn;
     }
@@ -418,7 +451,7 @@ public class Mysql implements Serializable {
         if (leagueId > -1) {
             sql += " AND leagueId = ?";
         }
-        try (PreparedStatement stat = conn.prepareStatement(sql)) {
+        try (PreparedStatement stat = getConnection().prepareStatement(sql)) {
             stat.setString(1, name.trim());
             if (countryId > -1 && leagueId > -1) {
                 stat.setInt(2, countryId);
@@ -434,7 +467,19 @@ public class Mysql implements Serializable {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            closeConnection();
         }
         return id;
     }
+
+    public void closeConnection() {
+        try {
+            if (!conn.isClosed()) {
+                conn.close();
+            }
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }

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

@@ -168,7 +168,7 @@ org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.processAnnotations=disabled
-org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.release=enabled
 org.eclipse.jdt.core.compiler.source=17
 org.eclipse.jdt.core.compiler.storeAnnotations=disabled
 org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled

+ 29 - 7
OddsJavaFx/pom.xml

@@ -19,6 +19,26 @@
     <build>
         <sourceDirectory>src</sourceDirectory>
         <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>3.6.0</version>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <transformers>
+                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                    <mainClass>application.Main</mainClass>
+                                </transformer>
+                            </transformers>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
@@ -27,7 +47,7 @@
             <plugin>
                 <groupId>org.openjfx</groupId>
                 <artifactId>javafx-maven-plugin</artifactId>
-                <version>0.0.6</version>
+                <version>0.0.8</version>
                 <executions>
                     <execution>
                         <!-- Default configuration for running -->
@@ -61,12 +81,14 @@
         </resources>
     </build>
     <dependencies>
+        <!-- https://mvnrepository.com/artifact/org.htmlunit/htmlunit -->
         <dependency>
-            <groupId>net.sourceforge.htmlunit</groupId>
+            <groupId>org.htmlunit</groupId>
             <artifactId>htmlunit</artifactId>
-            <version>2.70.0</version>
+            <version>4.5.0</version>
         </dependency>
 
+
         <dependency>
             <groupId>com.github.jbytecode</groupId>
             <artifactId>RCaller</artifactId>
@@ -80,12 +102,12 @@
         <dependency>
             <groupId>org.openjfx</groupId>
             <artifactId>javafx-controls</artifactId>
-            <version>22.0.1</version>
+            <version>23.0.1</version>
         </dependency>
         <dependency>
             <groupId>org.openjfx</groupId>
             <artifactId>javafx-fxml</artifactId>
-            <version>22.0.1</version>
+            <version>23.0.1</version>
         </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
@@ -100,13 +122,13 @@
         <dependency>
             <groupId>org.seleniumhq.selenium</groupId>
             <artifactId>selenium-java</artifactId>
-            <version>4.19.1</version>
+            <version>4.26.0</version>
         </dependency>
         <!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager -->
         <dependency>
             <groupId>io.github.bonigarcia</groupId>
             <artifactId>webdrivermanager</artifactId>
-            <version>5.8.0</version>
+            <version>5.9.2</version>
         </dependency>
       <!--  <dependency>
             <groupId>com.mysql</groupId>

+ 6 - 14
OddsJavaFx/src/controllers/MainController.java

@@ -1,19 +1,7 @@
 package controllers;
 
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.util.AbstractMap.SimpleEntry;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.ResourceBundle;
-
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-
 import data.GuiMysql;
 import exceptions.SportSelectionException;
 import javafx.collections.FXCollections;
@@ -27,9 +15,14 @@ import javafx.scene.control.ComboBox;
 import javafx.scene.control.TextField;
 import javafx.scene.layout.Pane;
 import objects.SoccerMatch;
-import org.eclipse.jetty.util.log.Log;
 import parser.OddsPortal;
 
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.AbstractMap.SimpleEntry;
+import java.util.*;
+
 public class MainController implements Initializable {
 
 	public static final String SPORT = "Sport";
@@ -245,7 +238,6 @@ public class MainController implements Initializable {
 			val--;
 			nextParseYear = String.valueOf(val);
 		} else {
-			Log.getLogger("getMoreLeagueInfo").info("Fail to get More league info for %s", lastParsedYear);
 			return;
 		}
 

+ 6 - 1
OddsJavaFx/src/controllers/StryktipsetController.java

@@ -16,6 +16,7 @@ import objects.SoccerMatchAnalysis;
 import parser.Svenskaspel;
 
 import java.math.RoundingMode;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
@@ -160,7 +161,11 @@ public class StryktipsetController implements Initializable {
 
         if (matches.isEmpty()) {
             Svenskaspel parser = new parser.Svenskaspel();
-            matches = parser.GetStryktipsetSelenium(date.getValue().toString());
+            try {
+                matches = parser.GetStryktipsetSelenium(date.getValue().toString());
+            } catch (MalformedURLException e) {
+                throw new RuntimeException(e);
+            }
         }
 
         for (SoccerMatchAnalysis match : matches) {

+ 0 - 2
OddsJavaFx/src/controllers/TestsController.java

@@ -14,7 +14,6 @@ import javafx.scene.layout.AnchorPane;
 import javafx.scene.layout.Priority;
 import javafx.scene.layout.VBox;
 import objects.League;
-import org.eclipse.jetty.util.log.Log;
 import parser.OddsPortal;
 import tests.*;
 
@@ -264,7 +263,6 @@ public class TestsController implements Initializable {
             val--;
             nextParseYear = String.valueOf(val);
         } else {
-            Log.getLog().info("Fail to get More league info for %s", lastParsedYear);
             return;
         }
 

+ 1 - 1
OddsJavaFx/src/data/BetStrategyMysql/BetStrategyMysql.java

@@ -94,7 +94,7 @@ public class BetStrategyMysql extends GuiMysql {
         return fibonacciDTOList;
     }
 
-    public void removeFibonacciBet(int sequenceNumber) {
+    public void closeFibonacciSequence(int sequenceNumber) {
         String sql = "UPDATE FibonacciBets SET status = ? WHERE betSequence = ? ";
         try (PreparedStatement statement = getConnection().prepareStatement(sql);) {
             statement.setString(1, "CLOSED");

+ 12 - 1
OddsJavaFx/src/data/DTO/FibonacciDTO/FibonacciDTO.java

@@ -1,6 +1,13 @@
 package data.DTO.FibonacciDTO;
 
-public class FibonacciDTO {
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+
+public class FibonacciDTO implements Serializable {
+
+    private static final List<Integer> fibonacciSequence = Arrays.asList(1,1,2,3,5,8,13,21,34,55);
+
     private int matchId;
     private float odds;
     private float betAmount;
@@ -74,4 +81,8 @@ public class FibonacciDTO {
     public String getGameDate() {
         return gameDate;
     }
+
+    public int getNextSequenceNumber(int currentSequenceNumber) {
+        return fibonacciSequence.get(currentSequenceNumber);
+    }
 }

Plik diff jest za duży
+ 169 - 65
OddsJavaFx/src/data/GuiMysql.java


+ 12 - 0
OddsJavaFx/src/objects/SoccerMatchAnalysis.java

@@ -115,6 +115,8 @@ public class SoccerMatchAnalysis extends SoccerMatch  {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            database.closeConnection();
         }
         scoringDiffValue = homeRes - awayRes;
         return scoringDiffValue;
@@ -180,6 +182,8 @@ public class SoccerMatchAnalysis extends SoccerMatch  {
 
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            database.closeConnection();
         }
         return result;
     }
@@ -279,6 +283,8 @@ public class SoccerMatchAnalysis extends SoccerMatch  {
 
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            database.closeConnection();
         }
         return result;
     }
@@ -339,6 +345,8 @@ public class SoccerMatchAnalysis extends SoccerMatch  {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            database.closeConnection();
         }
 
         return result;
@@ -395,6 +403,8 @@ public class SoccerMatchAnalysis extends SoccerMatch  {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            database.closeConnection();
         }
         // TODO Think Should the result be divided by lookback??
         // NEW TEST, devide by lookback (OR SIZE IF LESS THAN LOOKBACK?
@@ -426,6 +436,8 @@ public class SoccerMatchAnalysis extends SoccerMatch  {
             }
         } catch (SQLException e) {
             e.printStackTrace();
+        } finally {
+            database.closeConnection();
         }
         return result;
     }

+ 1 - 1
OddsJavaFx/src/objects/visual/FibonacciBets.java

@@ -68,7 +68,7 @@ public class FibonacciBets extends VBox {
             Button removeButton = new Button("X");
             removeButton.setStyle("-fx-background-color: darkred; -fx-text-fill: white; -fx-font-weight: bold;");
             removeButton.setOnAction(event -> {
-                database.removeFibonacciBet(sequenceNumber);
+                database.closeFibonacciSequence(sequenceNumber);
                 allOpenFibonacciSequences.removeIf(m -> m.getSequenceNumber() == sequenceNumber);
                 panel.getChildren().remove(fibonacciSequencePanel);
             });

+ 3 - 3
OddsJavaFx/src/parser/OddsPortal.java

@@ -1,11 +1,11 @@
 package parser;
 
-import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
-import com.gargoylesoftware.htmlunit.WebClient;
-import com.gargoylesoftware.htmlunit.html.*;
 import com.google.common.base.Strings;
 import mysql.Mysql;
 import object.ResultDTO;
+import org.htmlunit.FailingHttpStatusCodeException;
+import org.htmlunit.WebClient;
+import org.htmlunit.html.*;
 
 import java.io.IOException;
 import java.sql.SQLException;

+ 36 - 5
OddsJavaFx/src/parser/Svenskaspel.java

@@ -1,15 +1,16 @@
 package parser;
 
 import data.GuiMysql;
-import io.github.bonigarcia.wdm.WebDriverManager;
 import objects.SoccerMatch;
 import objects.SoccerMatchAnalysis;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
-import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.remote.RemoteWebDriver;
 
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.*;
 
 public class Svenskaspel {
@@ -25,15 +26,40 @@ public class Svenskaspel {
             new AbstractMap.SimpleEntry<String, String>("nottingham forest", "Nottingham"),
             new AbstractMap.SimpleEntry<String, String>("wolverhampton", "Wolves"));
 
-    public List<SoccerMatchAnalysis> GetStryktipsetSelenium(String date) {
+    public List<SoccerMatchAnalysis> GetStryktipsetSelenium(String date) throws MalformedURLException {
         this.date = date;
         String url = "https://spela.svenskaspel.se/stryktipset/resultat/" + date + "/statistik";
 
         // RemoteWebDriver seleniumDriver = getSeleniumDriver();
         // seleniumDriver.get(url);
 
-        WebDriverManager.chromedriver().driverVersion("124.0.6367.60").setup();
-        ChromeDriver driver = new ChromeDriver(getChromeOptions());
+//        WebDriverManager.chromedriver().driverVersion("124.0.6367.60").setup();
+//        ChromeDriver driver = new ChromeDriver(getChromeOptions());
+
+        ChromeOptions options = new ChromeOptions();
+        // Fixing 255 Error crashes
+        // options.addArguments("--no-sandbox");
+        options.addArguments("--disable-dev-shm-usage");
+
+        // Options to trick bot detection
+        // Removing webdriver property
+        options.addArguments("--disable-blink-features=AutomationControlled");
+        options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
+        options.setExperimentalOption("useAutomationExtension", null);
+
+        // Changing the user agent / browser fingerprint
+        options.addArguments("window-size=1920,1080");
+        options.addArguments("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like " +
+                "Gecko) " + "Chrome/74.0.3729.169 Safari/537.36");
+
+        // Other
+        options.addArguments("disable-infobars");
+
+
+        System.out.println("Getting page");
+
+        RemoteWebDriver driver = new RemoteWebDriver(new URL("http://nordh.xyz:14444/wd/hub"), options);
+
         driver.get(url);
 
         CloseCookiePopup(driver);
@@ -108,6 +134,11 @@ public class Svenskaspel {
     }
 
     private void CloseCookiePopup(WebDriver driver) {
+        try {
+            Thread.sleep(1000);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
         WebElement acceptButton = driver.findElement(By.xpath("//button[@id='onetrust-accept-btn-handler']"));
         acceptButton.click();
     }

+ 7 - 2
OddsStrategyWeb/src/main/java/MainPage.html

@@ -2,11 +2,16 @@
 
 <body>
     <h2 wicket:id="todaysLabel">[Toaday Label]</h2>
-    <div wicket:id="todaysMatches"> </div>
+    <div wicket:id="todaysMatches"></div>
 
     <h2 wicket:id="tomorrowsLabel">[Toaday Label]</h2>
-    <div wicket:id="tomorrowsMatches"> </div>
+    <div wicket:id="tomorrowsMatches"></div>
 
+    <h2 wicket:id="currentBetSequencesLabel">[Current Bet Sequences]</h2>
+    <div wicket:id="currentBetSequences"></div>
+
+    <h2 wicket:id="newBetLabel">[New Bet header] </h2>
+    <div wicket:id="newBetForm"></div>
 </body>
 
 </html>

+ 13 - 4
OddsStrategyWeb/src/main/java/MainPage.java

@@ -1,4 +1,6 @@
+import components.betsequences.BetSequencesTable;
 import components.matchtable.MatchTable;
+import components.newBetForm.NewBetForm;
 import data.GuiMysql;
 import objects.SoccerMatch;
 import org.apache.wicket.markup.html.WebPage;
@@ -18,17 +20,24 @@ public class MainPage extends WebPage {
         List<SoccerMatch> tomorrowsMatches = GuiMysql.getInstance()
                 .getPrioMatchesOfDate(LocalDateTime.now().toLocalDate().plusDays(1).toString());
 
-        // Tables of
         // List of todays matches with calculated percentages
 
-        add(new Label("todaysLabel"));
+        Label todaysLabel = new Label("todaysLabel", "Todays matches");
+        add(todaysLabel);
         add(new MatchTable("todaysMatches", todaysMatches));
 
-        add(new Label("tomorrowsLabel"));
+        // List of tomorrows matches with calculated percentages
+        add(new Label("tomorrowsLabel", "Tomorrows matches"));
         add(new MatchTable("tomorrowsMatches", tomorrowsMatches));
 
-        // List of tomorrows matches with calculated percentages
+        // Current bet sequences
+        add(new Label("currentBetSequencesLabel"));
+        add(new BetSequencesTable("currentBetSequences"));
 
         // A way to add bets
+        add(new Label("newBetLabel", "New bet"));
+        add(new NewBetForm("newBetForm"));
     }
+
+
 }

+ 3 - 0
OddsStrategyWeb/src/main/java/components/AjaxButtonPanel.html

@@ -0,0 +1,3 @@
+<wicket:panel>
+    <button wicket:id="button">Click Me</button>
+</wicket:panel>

+ 36 - 0
OddsStrategyWeb/src/main/java/components/AjaxButtonPanel.java

@@ -0,0 +1,36 @@
+package components;
+
+import data.BetStrategyMysql.BetStrategyMysql;
+import data.DTO.FibonacciDTO.FibonacciDTO;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+public class AjaxButtonPanel extends Panel {
+    public AjaxButtonPanel(String id, IModel<FibonacciDTO> rowModel) {
+        super(id, rowModel);
+        setOutputMarkupId(true);
+
+        // Add an AjaxButton with an event
+        add(new AjaxButton("button", Model.of("Close Sequence")) {
+            @Override
+            protected void onSubmit(AjaxRequestTarget target) {
+                // Handle the button click here
+                FibonacciDTO rowObject = rowModel.getObject();
+
+                // Your button logic for the row here
+                // TODO kanse en bekräfta dialog?
+                BetStrategyMysql.getInstance().closeFibonacciSequence(rowObject.getSequenceNumber());
+
+                target.getPage().renderPage();
+            }
+
+            @Override
+            protected void onError(AjaxRequestTarget target) {
+                // Handle errors here if needed
+            }
+        });
+    }
+}

+ 10 - 0
OddsStrategyWeb/src/main/java/components/betsequences/BetSequencesTable.css

@@ -0,0 +1,10 @@
+table {
+    border-collapse: collapse;
+    width: 100%;
+    border: 1px solid #ddd;
+}
+
+table td, table th {
+    border: 1px solid #ddd;
+    padding: 8px;
+}

+ 6 - 0
OddsStrategyWeb/src/main/java/components/betsequences/BetSequencesTable.html

@@ -0,0 +1,6 @@
+<wicket:panel xmlns:wicket="http://www.w3.org/1999/xhtml">
+    <h2 wicket:id="betSequencesLabel">[Bet Sequences]</h2>
+    <form wicket:id="form">
+        <table wicket:id="betSequencesTable" class="betSequencesTable">[TABLE]</table>
+    </form>
+</wicket:panel>

+ 105 - 0
OddsStrategyWeb/src/main/java/components/betsequences/BetSequencesTable.java

@@ -0,0 +1,105 @@
+package components.betsequences;
+
+import components.AjaxButtonPanel;
+import data.BetStrategyMysql.BetStrategyMysql;
+import data.DTO.FibonacciDTO.FibonacciDTO;
+import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.*;
+import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
+import org.apache.wicket.markup.head.CssHeaderItem;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.request.resource.PackageResourceReference;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class BetSequencesTable extends Panel {
+    List<FibonacciDTO> allOpenFibonacciSequences;
+
+    List<IColumn<FibonacciDTO, String>> tableColumns = new ArrayList<>();
+    public BetSequencesTable(String id) {
+        super(id);
+
+        Label label = new Label("betSequencesLabel", "Current bet sequences");
+        add(label);
+        getData();
+        
+        buildGui();
+    }
+
+    @Override
+    public void renderHead(IHeaderResponse response) {
+        super.renderHead(response);
+
+        PackageResourceReference cssFile = new PackageResourceReference(this.getClass(), "BetSequencesTable.css");
+        CssHeaderItem cssItem = CssHeaderItem.forReference(cssFile);
+
+        response.render(cssItem);
+    }
+
+    private void buildGui() {
+        SortableDataProvider<FibonacciDTO, String> dataProvider = new SortableDataProvider<FibonacciDTO, String>() {
+            @Override
+            public Iterator<FibonacciDTO> iterator(long first, long count) {
+                return allOpenFibonacciSequences.stream()
+                        .collect(Collectors.collectingAndThen(
+                            Collectors.toMap(FibonacciDTO::getSequenceNumber,
+                                    allOpen -> allOpen, (existing, replacement) -> existing),
+                                map -> new ArrayList<>(map.values())
+                                        .stream()
+                                        .sorted(Comparator.comparingInt(FibonacciDTO::getSequenceNumber))
+                                        .iterator()));
+            }
+
+            @Override
+            public long size() {
+                return allOpenFibonacciSequences.size();
+            }
+
+            @Override
+            public IModel<FibonacciDTO> model(FibonacciDTO object) {
+                return Model.of(object);
+            }
+        };
+        Form<?> form = new Form<>("form");
+        add(form);
+
+        DataTable<FibonacciDTO, String> dataTable = new DataTable<>("betSequencesTable", tableColumns, dataProvider, 10);
+
+        dataTable.addTopToolbar(new HeadersToolbar<>(dataTable, dataProvider));
+        form.add(dataTable);
+        add(form);
+    }
+
+    private void getData() {
+        allOpenFibonacciSequences = BetStrategyMysql.getInstance().getAllOpenFibonacciSequences();
+
+        tableColumns.add(new PropertyColumn<>(Model.of("Sequence Number"), "sequenceNumber", "sequenceNumber"));
+        tableColumns.add(new LambdaColumn<>(Model.of("Match Sequence"), fibonacciDTO -> {
+            List<FibonacciDTO> matches = allOpenFibonacciSequences.stream().filter(ao -> ao.getSequenceNumber() == fibonacciDTO.getSequenceNumber()).collect(Collectors.toList());
+            return matches.stream().map(m -> m.getHomeTeamName() + " - " + m.getAwayTeamName()).collect(Collectors.joining(", "));
+                }));
+        tableColumns.add(new LambdaColumn<>(Model.of("Sequence length"), "match", fibonacciDTO -> {
+            List<FibonacciDTO> matches = allOpenFibonacciSequences.stream().filter(ao -> ao.getSequenceNumber() == fibonacciDTO.getSequenceNumber()).collect(Collectors.toList());
+            return matches.size();
+        }));
+        tableColumns.add(new LambdaColumn<>(Model.of("Next bet size"), "sequenceNumber",  f -> f.getNextSequenceNumber((int)allOpenFibonacciSequences.stream().filter(ao -> ao.getSequenceNumber() == f.getSequenceNumber()).count())));
+
+        tableColumns.add(new LambdaColumn<FibonacciDTO, String>(Model.of("Action"), rowModel -> "action") {
+            @Override
+            public void populateItem(Item<ICellPopulator<FibonacciDTO>> cellItem, String componentId, IModel<FibonacciDTO> rowModel) {
+                cellItem.add(new AjaxButtonPanel(componentId, rowModel));
+            }
+        });
+
+    }
+}

+ 4 - 0
OddsStrategyWeb/src/main/java/components/matchtable/MatchTable.css

@@ -12,4 +12,8 @@ table.alternate tr:nth-child(odd) {
 
 table.alternate tr:nth-child(even) {
     background-color: #BBBBBB;
+}
+
+table tr {
+    text-align: center;
 }

+ 0 - 2
OddsStrategyWeb/src/main/java/components/matchtable/MatchTable.html

@@ -1,6 +1,4 @@
 <wicket:panel xmlns:wicket="http://www.w3.org/1999/xhtml">
-    <!-- <table id="jqGrid1" style="width:100%;height:200px">
-        </table> -->
     <div wicket:id="matchesCount"></div>
     <p></p>
     <table wicket:id="matchesTable" class="matchTable">

+ 23 - 6
OddsStrategyWeb/src/main/java/components/matchtable/MatchTable.java

@@ -1,7 +1,11 @@
 package components.matchtable;
 
+import events.MatchSelectedEvent;
 import objects.SoccerMatch;
 import objects.SoccerMatchAnalysis;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.*;
 import org.apache.wicket.markup.head.CssHeaderItem;
@@ -50,7 +54,19 @@ public class MatchTable extends Panel {
                         m1.getCalculatedPercentages().getDrawPercentage()));
         SortableSoccerMatchAnalysisDataProvider dataProvider = new SortableSoccerMatchAnalysisDataProvider(todaysMatchAnalysis);
 
-        DataTable<SoccerMatchAnalysis, String> dataTable = new DataTable<>("matchesTable", tableColumns, dataProvider, 10);
+        DataTable<SoccerMatchAnalysis, String> dataTable = new DataTable<>("matchesTable", tableColumns, dataProvider, 10) {
+            @Override
+            protected Item<SoccerMatchAnalysis> newRowItem(String id, int index, IModel<SoccerMatchAnalysis> model) {
+                Item<SoccerMatchAnalysis> item = super.newRowItem(id, index, model);
+                item.add(new AjaxEventBehavior("click") {
+                    @Override
+                    protected void onEvent(AjaxRequestTarget target) {
+                        send(getPage(), Broadcast.BREADTH, new MatchSelectedEvent(item.getModelObject()));
+                    }
+                });
+                return item;
+            }
+        };
 
         dataTable.addTopToolbar(new HeadersToolbar<>(dataTable, dataProvider));
 
@@ -58,13 +74,12 @@ public class MatchTable extends Panel {
     }
 
     private void buildMatchesTable() {
-
-        tableColumns.add(new LambdaColumn<>(Model.of("Match"), "matchTeams", SoccerMatchAnalysis::toString));
+        tableColumns.add(new LambdaColumn<>(Model.of("Match"), "toString",  s -> "(" +s.getMatchId() + ") " +  s.toString()));
         tableColumns.add(new PropertyColumn<>(Model.of("Odds 1"), "odds1", "odds1"));
         tableColumns.add(new PropertyColumn<>(Model.of("Odds X"), "oddsX", "oddsX"));
         tableColumns.add(new PropertyColumn<>(Model.of("Odds 2"), "odds2", "odds2"));
 
-        tableColumns.add(new AbstractColumn<>(Model.of("Calculated Percent 1")) {
+        tableColumns.add(new AbstractColumn<>(Model.of("Calculated Percent 1"), "calculatedPercentages.homeWinPercentage") {
 
             @Override
             public void populateItem(Item<ICellPopulator<SoccerMatchAnalysis>> cellItem, String componentId,
@@ -72,7 +87,7 @@ public class MatchTable extends Panel {
                 cellItem.add(new Label(componentId, model.getObject().getCalculatedPercentages().getHomeWinPercentage()));
             }
         });
-        tableColumns.add(new AbstractColumn<>(Model.of("Calculated Percent X")) {
+        tableColumns.add(new AbstractColumn<>(Model.of("Calculated Percent X"), "calculatedPercentages.drawPercentage") {
 
             @Override
             public void populateItem(Item<ICellPopulator<SoccerMatchAnalysis>> cellItem, String componentId,
@@ -80,13 +95,15 @@ public class MatchTable extends Panel {
                 cellItem.add(new Label(componentId, model.getObject().getCalculatedPercentages().getDrawPercentage()));
             }
         });
-        tableColumns.add(new AbstractColumn<>(Model.of("Calculated Percent 2")) {
+        tableColumns.add(new AbstractColumn<>(Model.of("Calculated Percent 2"), "calculatedPercentages.awayWinPercentage") {
 
             @Override
             public void populateItem(Item<ICellPopulator<SoccerMatchAnalysis>> cellItem, String componentId,
                     IModel<SoccerMatchAnalysis> model) {
                 cellItem.add(new Label(componentId, model.getObject().getCalculatedPercentages().getAwayWinPercentage()));
             }
+
+
         });
     }
 

+ 24 - 1
OddsStrategyWeb/src/main/java/components/matchtable/SortableSoccerMatchAnalysisDataProvider.java

@@ -1,24 +1,47 @@
 package components.matchtable;
 
 import objects.SoccerMatchAnalysis;
+import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
 
+import java.io.Serializable;
+import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
 public class SortableSoccerMatchAnalysisDataProvider extends SortableDataProvider<SoccerMatchAnalysis, String> {
 
+    class SortableDataProviderComparator implements Comparator<SoccerMatchAnalysis>, Serializable {
+
+        @Override
+        public int compare(SoccerMatchAnalysis o1, SoccerMatchAnalysis o2) {
+            PropertyModel<Comparable> model1 = new PropertyModel<>(o1, getSort().getProperty());
+            PropertyModel<Comparable> model2 = new PropertyModel<>(o2, getSort().getProperty());
+
+            int result = model1.getObject().compareTo(model2.getObject());
+            if (!getSort().isAscending()) {
+                result = -result;
+            }
+            return result;
+        }
+    }
     List<SoccerMatchAnalysis> matches;
+    private SortableDataProviderComparator comparator = new SortableDataProviderComparator();
 
     public SortableSoccerMatchAnalysisDataProvider(List<SoccerMatchAnalysis> matches) {
         this.matches = matches;
+        setSort("calculatedPercentages.drawPercentage", SortOrder.DESCENDING);
     }
 
     @Override
     public Iterator<SoccerMatchAnalysis> iterator(long first, long count) {
-        return matches.iterator();
+
+        matches.sort(comparator);
+
+        return matches.subList((int)first, (int)(first + count)).iterator();
     }
 
     @Override

+ 0 - 0
OddsStrategyWeb/src/main/java/components/newBetForm/NewBetForm.css


+ 21 - 0
OddsStrategyWeb/src/main/java/components/newBetForm/NewBetForm.html

@@ -0,0 +1,21 @@
+<wicket:panel xmlns:wicket="http://wicket.apache.org">
+    <span wicket:id="feedback">[Feedback messages]</span>
+
+    Selected team: <div wicket:id="teams">[TEAMS LABEL]</div>
+    <p>Selected Odds: <div wicket:id="calculatedOdds">[calculated odds]</div> </p>
+    <form wicket:id="form">
+        <label>
+            <input type="text" readonly wicket:id="matchId"/>
+        </label>
+        <label>BetSequence
+            <Select wicket:id="betSequences"></Select>
+        </label>
+        <label>Odds
+            <input type="text" wicket:id="betOdds"/>
+        </label>
+        <label>Bet amount
+            <input type="text" wicket:id="betAmount"/>
+        </label>
+        <input wicket:id="submit" type="submit" value="Submit"> </input>
+    </form>
+</wicket:panel>

+ 103 - 0
OddsStrategyWeb/src/main/java/components/newBetForm/NewBetForm.java

@@ -0,0 +1,103 @@
+package components.newBetForm;
+
+import data.BetStrategyMysql.BetStrategyMysql;
+import data.DTO.FibonacciDTO.FibonacciDTO;
+import events.MatchSelectedEvent;
+import objects.SoccerMatchAnalysis;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Button;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.Model;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class NewBetForm extends Panel {
+    TextField<Integer> matchIdText;
+    TextField<Float> betAmount;
+    TextField<Float> odds;
+    DropDownChoice<String> sequenceSelect;
+    Label teamText;
+    Label oddsText;
+
+    public NewBetForm(String id) {
+        super(id);
+
+        FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");
+        add(feedbackPanel);
+
+        Form<?> form = new Form<Void>("form") {
+            @Override
+            protected void onSubmit() {
+                FibonacciDTO fibonacciDTO = new FibonacciDTO();
+                fibonacciDTO.setMatchId(matchIdText.getModelObject());
+                try {
+                    fibonacciDTO.setSequenceNumber(Integer.parseInt(sequenceSelect.getConvertedInput()));
+                } catch (NumberFormatException e) {
+                    fibonacciDTO.setSequenceNumber(BetStrategyMysql.getInstance().getNextSequenceNumber());
+                }
+                fibonacciDTO.setOdds(odds.getModelObject());
+                fibonacciDTO.setBetAmount(betAmount.getModelObject());
+
+                BetStrategyMysql.getInstance().addFibonacciBet(fibonacciDTO);
+            }
+
+            @Override
+            protected void onError() {
+                System.out.println("ERROR Form error");
+                super.onError();
+            }
+        };
+
+        //Label betSequencesLabel = new Label("betSequencesLabel", "Bet sequences");
+        List<FibonacciDTO> allOpenFibonacciSequences = BetStrategyMysql.getInstance().getAllOpenFibonacciSequences();
+        List<String> sequenceNumbers = allOpenFibonacciSequences.stream().map(FibonacciDTO::getSequenceNumber).map(Object::toString).distinct().collect(Collectors.toList());
+        if (sequenceNumbers.size() < 4) {
+            sequenceNumbers.add("New bet sequence");
+        }
+
+        sequenceSelect = new DropDownChoice<>("betSequences", Model.of("Bet Sequence"), sequenceNumbers);
+
+        // Label betOddsLabel = new Label("betOddsLabel", "Odds");
+        odds = new TextField<>("betOdds", Model.of(), Float.class);
+        odds.setRequired(true);
+
+        // Label betAmountLabel = new Label("betAmountLabel", "Bet Amount");
+        betAmount = new TextField<>("betAmount", Model.of(), Float.class);
+        betAmount.setRequired(true);
+        Button submit = new Button("submit", Model.of("Submit"));
+
+        teamText = new Label("teams");
+        teamText.setOutputMarkupId(true);
+        oddsText = new Label("calculatedOdds");
+        oddsText.setOutputMarkupId(true);
+        matchIdText = new TextField<>("matchId", Model.of(), Integer.class);
+        matchIdText.setOutputMarkupId(true);
+
+        form.add(matchIdText, sequenceSelect, odds, betAmount, submit);
+        add(teamText);
+        add(oddsText);
+        add(form);
+    }
+
+    @Override
+    public void onEvent(IEvent<?> event) {
+        if (event.getPayload() instanceof MatchSelectedEvent) {
+            SoccerMatchAnalysis match = ((MatchSelectedEvent) event.getPayload()).getSelectedMatch();
+
+            teamText.setDefaultModel(Model.of(match.getHomeTeamName() + " vs " + match.getAwayTeamName()));
+            oddsText.setDefaultModel(Model.of(match.getCalculatedPercentages().getDrawPercentage()));
+
+            matchIdText.setDefaultModel(Model.of(match.getMatchId()));
+
+            getPage().renderPage();
+        }
+
+        event.stop();
+    }
+}

+ 53 - 0
OddsStrategyWeb/src/main/java/events/MatchSelectedEvent.java

@@ -0,0 +1,53 @@
+package events;
+
+import objects.SoccerMatchAnalysis;
+import org.apache.wicket.behavior.AbstractAjaxBehavior;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.event.IEventSource;
+
+public class MatchSelectedEvent extends AbstractAjaxBehavior implements IEvent {
+    private final SoccerMatchAnalysis selectedMatch;
+
+    public MatchSelectedEvent(SoccerMatchAnalysis selectedMatch) {
+        this.selectedMatch = selectedMatch;
+    }
+
+    public SoccerMatchAnalysis getSelectedMatch() {
+        return selectedMatch;
+    }
+
+    @Override
+    public void onRequest() {
+    }
+
+    @Override
+    public void stop() {
+
+    }
+
+    @Override
+    public boolean isStop() {
+        return false;
+    }
+
+    @Override
+    public void dontBroadcastDeeper() {
+
+    }
+
+    @Override
+    public Broadcast getType() {
+        return null;
+    }
+
+    @Override
+    public IEventSource getSource() {
+        return null;
+    }
+
+    @Override
+    public Object getPayload() {
+        return null;
+    }
+}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików