Skip to content

Commit

Permalink
#2063 download missing world details (#2070)
Browse files Browse the repository at this point in the history
* #2063 download missing world details

* #2063 download missing world details

* #2063 download missing world details

* #2063 fix database error on matches reload
  • Loading branch information
wsbrenk committed May 21, 2024
1 parent a551ca4 commit 2728464
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 105 deletions.
17 changes: 13 additions & 4 deletions src/main/java/core/db/DBManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down Expand Up @@ -1560,7 +1560,6 @@ public void setTransferType(TransferType type) {
*
* @return the world detail league [ ]
*/
// WorldDetail
public List<WorldDetailLeague> getAllWorldDetailLeagues() {
return ((WorldDetailsTable) getTable(WorldDetailsTable.TABLENAME))
.getAllWorldDetailLeagues();
Expand All @@ -1571,14 +1570,24 @@ public List<WorldDetailLeague> getAllWorldDetailLeagues() {
*
* @param leagues the leagues
*/
public void saveWorldDetailLeagues(List<WorldDetailLeague> leagues) {
public void storeWorldDetailLeagues(List<WorldDetailLeague> 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
// --------------------------------
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/core/db/IfaMatchTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/core/db/WorldDetailsTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected String createSelectStatement() {
return createSelectStatement("");
}

void insertWorldDetailsLeague(WorldDetailLeague league){
void storeWorldDetailsLeague(WorldDetailLeague league){
if(league == null)
return;
store(league);
Expand All @@ -44,7 +44,7 @@ List<WorldDetailLeague> getAllWorldDetailLeagues(){
@Override
protected void insertDefaultValues(){
for ( var league : WorldDetailLeague.allLeagues){
insertWorldDetailsLeague(league);
storeWorldDetailsLeague(league);
}
}
}
46 changes: 41 additions & 5 deletions src/main/java/core/model/WorldDetailsManager.java
Original file line number Diff line number Diff line change
@@ -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<WorldDetailLeague> leagues;
private HashMap<Integer, WorldDetailLeague> countryMap = new HashMap<Integer, WorldDetailLeague>();
private HashMap<Integer, WorldDetailLeague> leagueMap = new HashMap<Integer, WorldDetailLeague>();
private final HashMap<Integer, WorldDetailLeague> countryMap = new HashMap<>();
private final HashMap<Integer, WorldDetailLeague> leagueMap = new HashMap<>();
private int totalUsers;

public static WorldDetailsManager instance() {
Expand Down Expand Up @@ -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<WorldDetailLeague> getLeagues() {
Expand Down
17 changes: 5 additions & 12 deletions src/main/java/core/net/MyConnector.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
// //////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -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
Expand Down
116 changes: 41 additions & 75 deletions src/main/java/module/ifa/RightPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -42,6 +37,7 @@

public class RightPanel extends JPanel {

@Serial
private static final long serialVersionUID = -5038012557489983903L;
private JButton updateButton;
private JButton saveImageButton;
Expand All @@ -56,21 +52,17 @@ public RightPanel(IfaModel model) {
addListeners();
}

public ImageDesignPanel getImageDesignPanel() {
return this.imageDesignPanel;
}

private void initComponents() {
setLayout(new GridBagLayout());
setBorder(BorderFactory.createTitledBorder(HOVerwaltung.instance().getLanguageString(
"ifa.imageBuilder.title")));

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);
Expand All @@ -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);

Expand All @@ -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<WorldDetailLeague> 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<WorldDetailLeague> 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 {
Expand Down
8 changes: 5 additions & 3 deletions src/main/resources/release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 2728464

Please sign in to comment.