fix: Better error handling when importing games

This commit is contained in:
lantzelot-swe 2021-02-15 13:06:28 +01:00
parent 9efacbdd18
commit 238ecd8d23
2 changed files with 157 additions and 168 deletions

View File

@ -27,7 +27,9 @@ public class ImportWorker extends SwingWorker<Void, String>
StringBuilder infoBuilder = new StringBuilder(); StringBuilder infoBuilder = new StringBuilder();
importManager.readGameInfoFiles(infoBuilder); importManager.readGameInfoFiles(infoBuilder);
publish(infoBuilder.toString()); publish(infoBuilder.toString());
importManager.convertIntoDbRows(); infoBuilder = new StringBuilder();
importManager.convertIntoDbRows(infoBuilder);
publish(infoBuilder.toString());
publish("Importing to db..."); publish("Importing to db...");
publish(importManager.insertRowsIntoDb().toString()); publish(importManager.insertRowsIntoDb().toString());
publish("Copy screenshots, covers and game files..."); publish("Copy screenshots, covers and game files...");
@ -49,14 +51,14 @@ public class ImportWorker extends SwingWorker<Void, String>
@Override @Override
protected void done() protected void done()
{ {
try try
{ {
get(); get();
} }
catch (Exception e) catch (Exception e)
{ {
ExceptionHandler.handleException(e, "Error during import"); ExceptionHandler.handleException(e, "Error during import");
} }
dialog.finish(); dialog.finish();
} }
} }

View File

@ -51,21 +51,21 @@ public class ImportManager
{ {
this.selectedOption = option; this.selectedOption = option;
} }
public void setAddAsFavorite(boolean favorite) public void setAddAsFavorite(boolean favorite)
{ {
this.addAsFavorite = favorite; this.addAsFavorite = favorite;
} }
public void setSelectedFolder(Path folder) public void setSelectedFolder(Path folder)
{ {
//Assume games subdirectory //Assume games subdirectory
srcParentFolder = folder.resolve("games"); srcParentFolder = folder.resolve("games");
srcCoversFolder = srcParentFolder.resolve("covers"); srcCoversFolder = srcParentFolder.resolve("covers");
srcGamesFolder = srcParentFolder.resolve("games"); srcGamesFolder = srcParentFolder.resolve("games");
srcScreensFolder = srcParentFolder.resolve("screens"); srcScreensFolder = srcParentFolder.resolve("screens");
if (! (Files.exists(srcParentFolder, LinkOption.NOFOLLOW_LINKS) && if (!(Files.exists(srcParentFolder, LinkOption.NOFOLLOW_LINKS) &&
Files.exists(srcCoversFolder, LinkOption.NOFOLLOW_LINKS) && Files.exists(srcCoversFolder, LinkOption.NOFOLLOW_LINKS) &&
Files.exists(srcGamesFolder, LinkOption.NOFOLLOW_LINKS) && Files.exists(srcGamesFolder, LinkOption.NOFOLLOW_LINKS) &&
Files.exists(srcScreensFolder, LinkOption.NOFOLLOW_LINKS))) Files.exists(srcScreensFolder, LinkOption.NOFOLLOW_LINKS)))
@ -74,8 +74,8 @@ public class ImportManager
srcParentFolder = folder; srcParentFolder = folder;
srcCoversFolder = folder.resolve("covers"); srcCoversFolder = folder.resolve("covers");
srcGamesFolder = folder.resolve("games"); srcGamesFolder = folder.resolve("games");
srcScreensFolder = folder.resolve("screens"); srcScreensFolder = folder.resolve("screens");
} }
} }
public void readGameInfoFiles(StringBuilder infoBuilder) public void readGameInfoFiles(StringBuilder infoBuilder)
@ -118,10 +118,10 @@ public class ImportManager
return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
} }
public void convertIntoDbRows() public void convertIntoDbRows(StringBuilder infoBuilder)
{ {
// Construct a List of comma separated strings with all info correctly added. // Construct a List of comma separated strings with all info correctly added.
gameInfoFilesMap.values().stream().forEach(this::extractInfoIntoRowString); gameInfoFilesMap.values().stream().forEach(list -> extractInfoIntoRowString(list, infoBuilder));
} }
public StringBuilder insertRowsIntoDb() public StringBuilder insertRowsIntoDb()
@ -129,7 +129,7 @@ public class ImportManager
return uiModel.importGameInfo(dbRowDataList, selectedOption, addAsFavorite); return uiModel.importGameInfo(dbRowDataList, selectedOption, addAsFavorite);
} }
private void extractInfoIntoRowString(List<String> fileLines) private void extractInfoIntoRowString(List<String> fileLines, StringBuilder infoBuilder)
{ {
String title = ""; String title = "";
String year = ""; String year = "";
@ -149,168 +149,155 @@ public class ImportManager
String joy2config = ""; String joy2config = "";
String advanced = ""; String advanced = "";
String verticalShift = ""; String verticalShift = "";
try
{
for (String line : fileLines)
{
if (line.startsWith("T:"))
{
title = line.substring(2);
}
else if (line.startsWith("Y:"))
{
year = line.substring(2);
}
else if (line.startsWith("A:"))
{
author = line.substring(2);
}
else if (line.startsWith("M:"))
{
composer = line.substring(2);
}
else if (line.startsWith("E:"))
{
genre = line.substring(2);
}
else if (line.startsWith("D:en:"))
{
description = line.replace("\"", "\"\"").substring(5);
}
else if (line.startsWith("D:de:"))
{
description_de = line.replace("\"", "\"\"").substring(5);
}
else if (line.startsWith("D:fr:"))
{
description_fr = line.replace("\"", "\"\"").substring(5);
}
else if (line.startsWith("D:es:"))
{
description_es = line.replace("\"", "\"\"").substring(5);
}
else if (line.startsWith("D:it:"))
{
description_it = line.replace("\"", "\"\"").substring(5);
}
else if (line.startsWith("F:"))
{
gamefile = line.substring(2);
if (gamefile.lastIndexOf("/") > -1)
{
gamefile = gamefile.substring(gamefile.lastIndexOf("/") + 1);
}
}
else if (line.startsWith("C:"))
{
coverfile = line.substring(2);
if (coverfile.lastIndexOf("/") > -1)
{
coverfile = coverfile.substring(coverfile.lastIndexOf("/") + 1);
}
}
else if (line.startsWith("G:"))
{
if (screen1file.isEmpty())
{
screen1file = line.substring(2);
if (screen1file.lastIndexOf("/") > -1)
{
screen1file = screen1file.substring(screen1file.lastIndexOf("/") + 1);
}
}
else
{
screen2file = line.substring(2);
if (screen2file.lastIndexOf("/") > -1)
{
screen2file = screen2file.substring(screen2file.lastIndexOf("/") + 1);
}
}
}
else if (line.startsWith("J:1"))
{
joy1config = line;
}
else if (line.startsWith("J:2"))
{
joy2config = line;
}
else if (line.startsWith("X:"))
{
advanced = line.substring(2);
//The maxi game tool sets the flag for accurate disk to "truedrive". This is not correct according
//to the The64 manual. Convert to the correct "accuratedisk"
if (advanced.contains("truedrive"))
{
advanced = advanced.replace("truedrive", "accuratedisk");
}
}
else if (line.startsWith("V:"))
{
verticalShift = line.substring(2);
}
}
for (String line : fileLines) //Check if other languages are the same as english. If that's the case don't import it, leave it empty.
{ if (description_de.equals(description))
if (line.startsWith("T:"))
{ {
title = line.substring(2); description_de = "";
} }
else if (line.startsWith("Y:")) if (description_fr.equals(description))
{ {
year = line.substring(2); description_fr = "";
} }
else if (line.startsWith("A:")) if (description_es.equals(description))
{ {
author = line.substring(2); description_es = "";
} }
else if (line.startsWith("M:")) if (description_it.equals(description))
{ {
composer = line.substring(2); description_it = "";
}
else if (line.startsWith("E:"))
{
genre = line.substring(2);
}
else if (line.startsWith("D:en:"))
{
description = line.replace("\"", "\"\"").substring(5);
}
else if (line.startsWith("D:de:"))
{
description_de = line.replace("\"", "\"\"").substring(5);
}
else if (line.startsWith("D:fr:"))
{
description_fr = line.replace("\"", "\"\"").substring(5);
}
else if (line.startsWith("D:es:"))
{
description_es = line.replace("\"", "\"\"").substring(5);
}
else if (line.startsWith("D:it:"))
{
description_it = line.replace("\"", "\"\"").substring(5);
}
else if (line.startsWith("F:"))
{
gamefile = line.substring(2);
if (gamefile.lastIndexOf("/") > -1)
{
gamefile = gamefile.substring(gamefile.lastIndexOf("/") + 1);
}
}
else if (line.startsWith("C:"))
{
coverfile = line.substring(2);
if (coverfile.lastIndexOf("/") > -1)
{
coverfile = coverfile.substring(coverfile.lastIndexOf("/") + 1);
}
}
else if (line.startsWith("G:"))
{
if (screen1file.isEmpty())
{
screen1file = line.substring(2);
if (screen1file.lastIndexOf("/") > -1)
{
screen1file = screen1file.substring(screen1file.lastIndexOf("/") + 1);
}
}
else
{
screen2file = line.substring(2);
if (screen2file.lastIndexOf("/") > -1)
{
screen2file = screen2file.substring(screen2file.lastIndexOf("/") + 1);
}
}
}
else if (line.startsWith("J:1"))
{
joy1config = line;
}
else if (line.startsWith("J:2"))
{
joy2config = line;
}
else if (line.startsWith("X:"))
{
advanced = line.substring(2);
//The maxi game tool sets the flag for accurate disk to "truedrive". This is not correct according
//to the The64 manual. Convert to the correct "accuratedisk"
if (advanced.contains("truedrive"))
{
advanced = advanced.replace("truedrive", "accuratedisk");
}
}
else if (line.startsWith("V:"))
{
verticalShift = line.substring(2);
} }
// Construct a data row
List<String> list = Arrays.asList(title,
year,
author,
composer,
genre,
description,
description_de,
description_fr,
description_es,
description_it,
gamefile,
coverfile,
screen1file,
screen2file,
joy1config,
joy2config,
advanced,
verticalShift);
String result = String.join("\",\"", list);
result = "\"" + result + "\"";
dbRowDataList.add(result);
} }
catch (Exception e)
//Check if other languages are the same as english. If that's the case don't import it, leave it empty.
if (description_de.equals(description))
{ {
description_de = ""; infoBuilder.append("ERROR: Could not read info file for \"" + title + "\"\n");
logger.error("IMPORT: Could not read info file for " + title, e);
} }
if (description_fr.equals(description))
{
description_fr = "";
}
if (description_es.equals(description))
{
description_es = "";
}
if (description_it.equals(description))
{
description_it = "";
}
// //Don't allow same screen file for both entries
// if (screen1file.equals(screen2file))
// {
// if (screen1file.endsWith("-01.png"))
// {
// screen1file = "";
// }
// else
// {
// screen2file = "";
// }
// }
// //Special handling of screens which may have wrong name or missing entry (screen 1 might be named 01.png,
// //handle that as screen2 instead to get names set correctly)
// if (screen1file.endsWith("-01.png") && screen2file.isEmpty())
// {
// screen2file = screen1file;
// screen1file = "";
// }
// Construct a data row
List<String> list = Arrays.asList(title,
year,
author,
composer,
genre,
description,
description_de,
description_fr,
description_es,
description_it,
gamefile,
coverfile,
screen1file,
screen2file,
joy1config,
joy2config,
advanced,
verticalShift);
String result = String.join("\",\"", list);
result = "\"" + result + "\"";
dbRowDataList.add(result);
} }
private List<String> readFileInList(Path filePath, StringBuilder infoBuilder) private List<String> readFileInList(Path filePath, StringBuilder infoBuilder)