From 272846405c2689e19b4b55b01ba1c9266c329f1e Mon Sep 17 00:00:00 2001 From: wsbrenk Date: Tue, 21 May 2024 23:11:03 +0200 Subject: [PATCH] #2063 download missing world details (#2070) * #2063 download missing world details * #2063 download missing world details * #2063 download missing world details * #2063 fix database error on matches reload --- src/main/java/core/db/DBManager.java | 17 ++- src/main/java/core/db/IfaMatchTable.java | 9 +- src/main/java/core/db/WorldDetailsTable.java | 4 +- .../java/core/model/WorldDetailsManager.java | 46 ++++++- src/main/java/core/net/MyConnector.java | 17 +-- src/main/java/module/ifa/RightPanel.java | 116 +++++++----------- src/main/resources/release_notes.md | 8 +- 7 files changed, 112 insertions(+), 105 deletions(-) diff --git a/src/main/java/core/db/DBManager.java b/src/main/java/core/db/DBManager.java index 635dcd69e..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()); @@ -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,14 +1570,24 @@ 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); } } + /** + * 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/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/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..537a30b2d 100644 --- a/src/main/java/core/model/WorldDetailsManager.java +++ b/src/main/java/core/model/WorldDetailsManager.java @@ -1,16 +1,19 @@ 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 { 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() { @@ -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); + DBManager.instance().storeWorldDetailLeague(ret); + initialize(); + } + 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..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; @@ -508,6 +507,11 @@ public String getWorldDetails(int leagueId) throws IOException { return getCHPPWebFile(url); } + public String getWorldDetailsByCountryId(int countryId) { + String url = htUrl + "?file=worlddetails&version=1.9&countryID=" + countryId; + return getCHPPWebFile(url); + } + // /////////////////////////////////////////////////////////////////////////////// // Update Checker // ////////////////////////////////////////////////////////////////////////////// @@ -572,17 +576,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 015f1cddd..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,15 +18,9 @@ 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.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 +37,7 @@ public class RightPanel extends JPanel { + @Serial private static final long serialVersionUID = -5038012557489983903L; private JButton updateButton; private JButton saveImageButton; @@ -56,10 +52,6 @@ public RightPanel(IfaModel model) { addListeners(); } - public ImageDesignPanel getImageDesignPanel() { - return this.imageDesignPanel; - } - private void initComponents() { setLayout(new GridBagLayout()); setBorder(BorderFactory.createTitledBorder(HOVerwaltung.instance().getLanguageString( @@ -67,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); @@ -81,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); @@ -106,67 +98,41 @@ 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().saveWorldDetailLeagues(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) { + HOLogger.instance().warning(getClass(), "Could not download world details: " + e1.getMessage()); + } + PluginIfaUtils.updateMatchesTable(); + RightPanel.this.model.reload(); + }); + + this.saveImageButton.addActionListener(e -> { + try { + saveImage(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + }); - /** - * Convenience method - * - * @param key - * @return - */ - private static String getLangString(String key) { - return HOVerwaltung.instance().getLanguageString(key); } private void saveImage() throws IOException { diff --git a/src/main/resources/release_notes.md b/src/main/resources/release_notes.md index c25fe3996..897658af8 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) @@ -55,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)