From c02ca30caa06fec46bf6796dbd17c8cdb6d3a077 Mon Sep 17 00:00:00 2001 From: wsbrenk Date: Mon, 20 May 2024 18:10:22 +0200 Subject: [PATCH 1/4] #2063 download missing world details --- src/main/java/core/db/DBManager.java | 5 +-- src/main/java/core/db/WorldDetailsTable.java | 4 +- .../java/core/model/WorldDetailsManager.java | 42 +++++++++++++++++-- src/main/java/core/net/MyConnector.java | 5 +++ src/main/java/module/ifa/RightPanel.java | 2 +- src/main/resources/release_notes.md | 5 ++- 6 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/main/java/core/db/DBManager.java b/src/main/java/core/db/DBManager.java index 635dcd69e..1bbdf8501 100644 --- a/src/main/java/core/db/DBManager.java +++ b/src/main/java/core/db/DBManager.java @@ -1560,7 +1560,6 @@ public void setTransferType(TransferType type) { * * @return the world detail league [ ] */ -// WorldDetail public List getAllWorldDetailLeagues() { return ((WorldDetailsTable) getTable(WorldDetailsTable.TABLENAME)) .getAllWorldDetailLeagues(); @@ -1571,11 +1570,11 @@ public List getAllWorldDetailLeagues() { * * @param leagues the leagues */ - public void saveWorldDetailLeagues(List leagues) { + public void storeWorldDetailLeagues(List leagues) { WorldDetailsTable table = (WorldDetailsTable) getTable(WorldDetailsTable.TABLENAME); table.truncateTable(); for (WorldDetailLeague league : leagues) { - table.insertWorldDetailsLeague(league); + table.storeWorldDetailsLeague(league); } } diff --git a/src/main/java/core/db/WorldDetailsTable.java b/src/main/java/core/db/WorldDetailsTable.java index f4ad8c39d..3fc566447 100644 --- a/src/main/java/core/db/WorldDetailsTable.java +++ b/src/main/java/core/db/WorldDetailsTable.java @@ -26,7 +26,7 @@ protected String createSelectStatement() { return createSelectStatement(""); } - void insertWorldDetailsLeague(WorldDetailLeague league){ + void storeWorldDetailsLeague(WorldDetailLeague league){ if(league == null) return; store(league); @@ -44,7 +44,7 @@ List getAllWorldDetailLeagues(){ @Override protected void insertDefaultValues(){ for ( var league : WorldDetailLeague.allLeagues){ - insertWorldDetailsLeague(league); + storeWorldDetailsLeague(league); } } } diff --git a/src/main/java/core/model/WorldDetailsManager.java b/src/main/java/core/model/WorldDetailsManager.java index f9d3315de..fb02c8030 100644 --- a/src/main/java/core/model/WorldDetailsManager.java +++ b/src/main/java/core/model/WorldDetailsManager.java @@ -1,9 +1,12 @@ package core.model; import core.db.DBManager; +import core.file.xml.XMLManager; +import core.file.xml.XMLWorldDetailsParser; +import core.net.MyConnector; +import core.util.HOLogger; -import java.util.HashMap; -import java.util.List; +import java.util.*; public class WorldDetailsManager { @@ -48,12 +51,45 @@ public WorldDetailLeague getWorldDetailLeagueByLeagueId(Integer leagueId) { return leagueMap.get(leagueId); } + /** + * Get world detail information of country id. + * If cache is empty, it will be initialized by the details stored in the database. + * If this information does not contain the requested country id, the world details will be downloaded + * from hattrick. The downloaded object will be added to the cache and the database. + * @param countryId Country Id + * @return WorldDetailLeague + */ public WorldDetailLeague getWorldDetailLeagueByCountryId(Integer countryId) { if (countryMap.isEmpty()) { initialize(); } + var ret = countryMap.get(countryId); + if (ret == null) { + ret = downloadWorldDetailLeague(countryId); + countryMap.put(countryId, ret); + DBManager.instance().storeWorldDetailLeagues(Collections.singletonList(ret)); + } + return ret; + } - return countryMap.get(countryId); + /** + * Download missing world detail information + * @param countryId Country Id + * @return WorldDetailLeague + */ + private WorldDetailLeague downloadWorldDetailLeague(Integer countryId) { + WorldDetailLeague ret = null; + try { + var worldDetails = MyConnector.instance().getWorldDetailsByCountryId(countryId); + var leagues = XMLWorldDetailsParser.parseDetails(XMLManager.parseString(worldDetails)); + if (!leagues.isEmpty()) { + ret = leagues.get(0); + } + } + catch (Exception e) { + HOLogger.instance().warning(getClass(), "Error downloading world details from " + countryId); + } + return ret; } public final List getLeagues() { diff --git a/src/main/java/core/net/MyConnector.java b/src/main/java/core/net/MyConnector.java index 73034fe4c..d4a7a9e40 100644 --- a/src/main/java/core/net/MyConnector.java +++ b/src/main/java/core/net/MyConnector.java @@ -508,6 +508,11 @@ public String getWorldDetails(int leagueId) throws IOException { return getCHPPWebFile(url); } + public String getWorldDetailsByCountryId(int countryId) throws IOException { + String url = htUrl + "?file=worlddetails&version=1.9&countryID=" + countryId; + return getCHPPWebFile(url); + } + // /////////////////////////////////////////////////////////////////////////////// // Update Checker // ////////////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/module/ifa/RightPanel.java b/src/main/java/module/ifa/RightPanel.java index 015f1cddd..2f613625f 100644 --- a/src/main/java/module/ifa/RightPanel.java +++ b/src/main/java/module/ifa/RightPanel.java @@ -135,7 +135,7 @@ public void actionPerformed(ActionEvent arg0) { worldDetails = MyConnector.instance().getWorldDetails(0); List leagues = XMLWorldDetailsParser.parseDetails(XMLManager .parseString(worldDetails)); - DBManager.instance().saveWorldDetailLeagues(leagues); + DBManager.instance().storeWorldDetailLeagues(leagues); WorldDetailsManager.instance().refresh(); } catch (IOException e1) { e1.printStackTrace(); diff --git a/src/main/resources/release_notes.md b/src/main/resources/release_notes.md index c25fe3996..1298ddef6 100644 --- a/src/main/resources/release_notes.md +++ b/src/main/resources/release_notes.md @@ -18,11 +18,12 @@ ### Squad * Fix length of owner notes in players' database table (#1816) -* player avatar image can be reloaded (#1815) +* Player avatar image can be reloaded (#1815) * Fix error player download nickname null pointer exception (#1938) * Fix initial sorting by player group (#1909) * Show stamina sub skill (#383) -* fix error on player details display after initial download (#2044) +* Fix error on player details display after initial download (#2044) +* Update missing world details in database (#2063) ### Team Analyzer * Restore size of match prediction dialog box (#1898) From 78dc45871b480a6307d22dd1deed921a53dca1e8 Mon Sep 17 00:00:00 2001 From: wsbrenk Date: Mon, 20 May 2024 19:41:30 +0200 Subject: [PATCH 2/4] #2063 download missing world details --- src/main/java/core/db/DBManager.java | 12 ++- .../java/core/model/WorldDetailsManager.java | 8 +- src/main/java/core/net/MyConnector.java | 13 +-- src/main/java/module/ifa/RightPanel.java | 94 +++++++------------ 4 files changed, 52 insertions(+), 75 deletions(-) diff --git a/src/main/java/core/db/DBManager.java b/src/main/java/core/db/DBManager.java index 1bbdf8501..b2115ab1f 100644 --- a/src/main/java/core/db/DBManager.java +++ b/src/main/java/core/db/DBManager.java @@ -328,7 +328,7 @@ public void disconnect() { /** * connect to the database */ - private void connect() throws Exception { + private void connect() { User current_user = UserManager.instance().getCurrentUser(); if (connectionManager != null) { connectionManager.connect(current_user.getDbURL(), current_user.getDbUsername(), current_user.getDbPwd(), UserManager.instance().getDriver()); @@ -1578,6 +1578,16 @@ public void storeWorldDetailLeagues(List leagues) { } } + /** + * Save single world detail league. + * + * @param league The league + */ + public void storeWorldDetailLeague(WorldDetailLeague league) { + WorldDetailsTable table = (WorldDetailsTable) getTable(WorldDetailsTable.TABLENAME); + table.storeWorldDetailsLeague(league); + } + // -------------------------------------------------------------------------------- // -------------------------------- Statistik Part // -------------------------------- diff --git a/src/main/java/core/model/WorldDetailsManager.java b/src/main/java/core/model/WorldDetailsManager.java index fb02c8030..537a30b2d 100644 --- a/src/main/java/core/model/WorldDetailsManager.java +++ b/src/main/java/core/model/WorldDetailsManager.java @@ -12,8 +12,8 @@ public class WorldDetailsManager { private static WorldDetailsManager WMANAGER = null; private List leagues; - private HashMap countryMap = new HashMap(); - private HashMap leagueMap = new HashMap(); + private final HashMap countryMap = new HashMap<>(); + private final HashMap leagueMap = new HashMap<>(); private int totalUsers; public static WorldDetailsManager instance() { @@ -66,8 +66,8 @@ public WorldDetailLeague getWorldDetailLeagueByCountryId(Integer countryId) { var ret = countryMap.get(countryId); if (ret == null) { ret = downloadWorldDetailLeague(countryId); - countryMap.put(countryId, ret); - DBManager.instance().storeWorldDetailLeagues(Collections.singletonList(ret)); + DBManager.instance().storeWorldDetailLeague(ret); + initialize(); } return ret; } diff --git a/src/main/java/core/net/MyConnector.java b/src/main/java/core/net/MyConnector.java index d4a7a9e40..3e21bd631 100644 --- a/src/main/java/core/net/MyConnector.java +++ b/src/main/java/core/net/MyConnector.java @@ -508,7 +508,7 @@ public String getWorldDetails(int leagueId) throws IOException { return getCHPPWebFile(url); } - public String getWorldDetailsByCountryId(int countryId) throws IOException { + public String getWorldDetailsByCountryId(int countryId) { String url = htUrl + "?file=worlddetails&version=1.9&countryID=" + countryId; return getCHPPWebFile(url); } @@ -577,17 +577,6 @@ public void enableProxy(ProxySettings proxySettings) { } } - /** - * Get the region id for a certain team. - */ - public String fetchRegionID(int teamId) { - String xml = getTeamDetails(teamId); - if (!xml.isEmpty()){ - return XMLTeamDetailsParser.fetchRegionID(xml); - } - return "-1"; - } - public InputStream getFileFromWeb(String url, boolean displaysettingsScreen) { if (displaysettingsScreen) { // Show Screen diff --git a/src/main/java/module/ifa/RightPanel.java b/src/main/java/module/ifa/RightPanel.java index 2f613625f..db83915cc 100644 --- a/src/main/java/module/ifa/RightPanel.java +++ b/src/main/java/module/ifa/RightPanel.java @@ -22,10 +22,7 @@ import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import java.io.*; import java.util.List; import javax.swing.BorderFactory; @@ -42,6 +39,7 @@ public class RightPanel extends JPanel { + @Serial private static final long serialVersionUID = -5038012557489983903L; private JButton updateButton; private JButton saveImageButton; @@ -56,10 +54,6 @@ public RightPanel(IfaModel model) { addListeners(); } - public ImageDesignPanel getImageDesignPanel() { - return this.imageDesignPanel; - } - private void initComponents() { setLayout(new GridBagLayout()); setBorder(BorderFactory.createTitledBorder(HOVerwaltung.instance().getLanguageString( @@ -106,56 +100,40 @@ private void initComponents() { } private void addListeners() { - this.awayRadioButton.addItemListener(new ItemListener() { - - @Override - public void itemStateChanged(ItemEvent evt) { - if (evt.getStateChange() == ItemEvent.SELECTED) { - imageDesignPanel.setAway(true); - } - } - }); - - this.homeRadioButton.addItemListener(new ItemListener() { - - @Override - public void itemStateChanged(ItemEvent evt) { - if (evt.getStateChange() == ItemEvent.SELECTED) { - imageDesignPanel.setAway(false); - } - } - }); - - this.updateButton.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - String worldDetails; - try { - worldDetails = MyConnector.instance().getWorldDetails(0); - List leagues = XMLWorldDetailsParser.parseDetails(XMLManager - .parseString(worldDetails)); - DBManager.instance().storeWorldDetailLeagues(leagues); - WorldDetailsManager.instance().refresh(); - } catch (IOException e1) { - e1.printStackTrace(); - } - PluginIfaUtils.updateMatchesTable(); - RightPanel.this.model.reload(); - } - }); - - this.saveImageButton.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - try { - saveImage(); - } catch (IOException ex) { - throw new RuntimeException(ex); - } - } - }); + this.awayRadioButton.addItemListener(evt -> { + if (evt.getStateChange() == ItemEvent.SELECTED) { + imageDesignPanel.setAway(true); + } + }); + + this.homeRadioButton.addItemListener(evt -> { + if (evt.getStateChange() == ItemEvent.SELECTED) { + imageDesignPanel.setAway(false); + } + }); + + this.updateButton.addActionListener(arg0 -> { + String worldDetails; + try { + worldDetails = MyConnector.instance().getWorldDetails(0); + List leagues = XMLWorldDetailsParser.parseDetails(XMLManager + .parseString(worldDetails)); + DBManager.instance().storeWorldDetailLeagues(leagues); + WorldDetailsManager.instance().refresh(); + } catch (IOException e1) { + e1.printStackTrace(); + } + PluginIfaUtils.updateMatchesTable(); + RightPanel.this.model.reload(); + }); + + this.saveImageButton.addActionListener(e -> { + try { + saveImage(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + }); } From 301c3a7024b46abe8851de7f79f07a0933d32c29 Mon Sep 17 00:00:00 2001 From: wsbrenk Date: Mon, 20 May 2024 19:48:18 +0200 Subject: [PATCH 3/4] #2063 download missing world details --- src/main/java/core/net/MyConnector.java | 1 - src/main/java/module/ifa/RightPanel.java | 24 ++++++------------------ 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/main/java/core/net/MyConnector.java b/src/main/java/core/net/MyConnector.java index 3e21bd631..e99064cce 100644 --- a/src/main/java/core/net/MyConnector.java +++ b/src/main/java/core/net/MyConnector.java @@ -3,7 +3,6 @@ import com.github.scribejava.core.model.*; import core.file.xml.XMLCHPPPreParser; -import core.file.xml.XMLTeamDetailsParser; import core.gui.CursorToolkit; import core.gui.HOMainFrame; import core.model.HOVerwaltung; diff --git a/src/main/java/module/ifa/RightPanel.java b/src/main/java/module/ifa/RightPanel.java index db83915cc..60e3e86a1 100644 --- a/src/main/java/module/ifa/RightPanel.java +++ b/src/main/java/module/ifa/RightPanel.java @@ -8,6 +8,7 @@ import core.model.WorldDetailsManager; import core.net.MyConnector; import core.util.GUIUtils; +import core.util.HOLogger; import core.util.IOUtils; import module.ifa.gif.Gif89Encoder; import module.ifa.model.IfaModel; @@ -17,10 +18,7 @@ import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.awt.image.BufferedImage; import java.io.*; import java.util.List; @@ -61,10 +59,10 @@ private void initComponents() { JPanel buttonPanel = new JPanel(); GridBagConstraints gbc = new GridBagConstraints(); - this.updateButton = new JButton(getLangString("ls.button.update")); + this.updateButton = new JButton(HOVerwaltung.instance().getLanguageString("ls.button.update")); gbc.anchor = GridBagConstraints.EAST; buttonPanel.add(this.updateButton, gbc); - this.saveImageButton = new JButton(getLangString("ifa.imageBuilder.button.save")); + this.saveImageButton = new JButton(HOVerwaltung.instance().getLanguageString("ifa.imageBuilder.button.save")); gbc.gridx = 1; gbc.anchor = GridBagConstraints.WEST; buttonPanel.add(this.saveImageButton, gbc); @@ -75,13 +73,13 @@ private void initComponents() { gbc.gridwidth = 2; add(buttonPanel, gbc); - this.awayRadioButton = new JRadioButton(getLangString("ifa.imageBuilder.visited"), true); + this.awayRadioButton = new JRadioButton(HOVerwaltung.instance().getLanguageString("ifa.imageBuilder.visited"), true); gbc.insets = new Insets(5, 6, 5, 6); gbc.gridy = 1; gbc.gridwidth = 1; add(this.awayRadioButton, gbc); - this.homeRadioButton = new JRadioButton(getLangString("ifa.imageBuilder.hosted"), false); + this.homeRadioButton = new JRadioButton(HOVerwaltung.instance().getLanguageString("ifa.imageBuilder.hosted"), false); gbc.gridx = 1; add(this.homeRadioButton, gbc); @@ -121,7 +119,7 @@ private void addListeners() { DBManager.instance().storeWorldDetailLeagues(leagues); WorldDetailsManager.instance().refresh(); } catch (IOException e1) { - e1.printStackTrace(); + HOLogger.instance().warning(getClass(), "Could not download world details: " + e1.getMessage()); } PluginIfaUtils.updateMatchesTable(); RightPanel.this.model.reload(); @@ -137,16 +135,6 @@ private void addListeners() { } - /** - * Convenience method - * - * @param key - * @return - */ - private static String getLangString(String key) { - return HOVerwaltung.instance().getLanguageString(key); - } - private void saveImage() throws IOException { boolean away = this.awayRadioButton.isSelected(); From 2dac54468ab738a41d3c0db7d778e58e48a1e588 Mon Sep 17 00:00:00 2001 From: wsbrenk Date: Mon, 20 May 2024 22:16:41 +0200 Subject: [PATCH 4/4] #2063 fix database error on matches reload --- src/main/java/core/db/IfaMatchTable.java | 9 +++++---- src/main/resources/release_notes.md | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/core/db/IfaMatchTable.java b/src/main/java/core/db/IfaMatchTable.java index bbaa88758..b11114a46 100644 --- a/src/main/java/core/db/IfaMatchTable.java +++ b/src/main/java/core/db/IfaMatchTable.java @@ -69,10 +69,11 @@ void insertMatch(IfaMatch match) { store(match); } -// @Override -// protected String createSelectStatement(){ -// return createSelectStatement(""); -// } + @Override + protected String createDeleteStatement() { + return createDeleteStatement(" WHERE TRUE"); + } + void deleteAllMatches() { executePreparedDelete(); } diff --git a/src/main/resources/release_notes.md b/src/main/resources/release_notes.md index 1298ddef6..897658af8 100644 --- a/src/main/resources/release_notes.md +++ b/src/main/resources/release_notes.md @@ -56,7 +56,8 @@ * Change subskill recalculation dialog display (#1556) * Tuning subskill recalculation (#1870) -### League +### International Friendlies +* Fix database error on match reload (#2063) ### Youth * Increase effect of youth friendly match training (#1950, #1994)