Skip to content

Commit

Permalink
Add NULL protection in challenge and level loading.
Browse files Browse the repository at this point in the history
Remove Challenge and Level saving on server stop, as it is done in GUI after editing. Reduce load on database.
Use saveAsync, as saveObject is deprecated.
  • Loading branch information
BONNe committed May 8, 2020
1 parent fdafce0 commit ffac90f
Showing 1 changed file with 44 additions and 16 deletions.
60 changes: 44 additions & 16 deletions src/main/java/world/bentobox/challenges/ChallengesManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -206,11 +206,15 @@ public void load()
}

this.playerCacheData.clear();
loadAndValidate();
this.loadAndValidate();
}


private void loadAndValidate() {
/**
* This method loads and validates all challenges and levels.
*/
private void loadAndValidate()
{
this.challengeDatabase.loadObjects().forEach(this::loadChallenge);
this.levelDatabase.loadObjects().forEach(this::loadLevel);
// this validate challenge levels
Expand All @@ -233,7 +237,7 @@ public void reload()
//this.levelDatabase = new Database<>(addon, ChallengeLevel.class);
//this.playersDatabase = new Database<>(addon, ChallengesPlayerData.class);

loadAndValidate();
this.loadAndValidate();
}


Expand Down Expand Up @@ -263,6 +267,18 @@ public boolean loadChallenge(@NonNull Challenge challenge,
User user,
boolean silent)
{
// This may happen if database somehow failed to load challenge and return
// null as input.
if (challenge == null)
{
if (!silent)
{
user.sendMessage("load-error", "[value]", "NULL");
}

return false;
}

if (this.challengeCacheData.containsKey(challenge.getUniqueId()))
{
if (!overwrite)
Expand Down Expand Up @@ -324,6 +340,18 @@ public boolean loadLevel(@NonNull ChallengeLevel level,
User user,
boolean silent)
{
// This may happen if database somehow failed to load challenge and return
// null as input.
if (level == null)
{
if (!silent)
{
user.sendMessage("load-error", "[value]", "NULL");
}

return false;
}

if (!this.isValidLevel(level))
{
if (user != null)
Expand Down Expand Up @@ -474,11 +502,8 @@ private boolean isValidLevel(@NonNull ChallengeLevel level)
{
if (!this.challengeCacheData.containsKey(uniqueID))
{
if (this.challengeDatabase.objectExists(uniqueID))
{
this.loadChallenge(this.challengeDatabase.loadObject(uniqueID));
}
else
if (!this.challengeDatabase.objectExists(uniqueID) ||
!this.loadChallenge(this.challengeDatabase.loadObject(uniqueID), false, null, true))
{
this.addon.logError("Cannot find " + uniqueID + " challenge for " + level.getUniqueId());
return false;
Expand Down Expand Up @@ -824,8 +849,11 @@ private void migratePlayers(World world)
*/
public void save()
{
this.saveChallenges();
this.saveLevels();
// Challenges and Levels are saved on modifications only to avoid issues with
// NULL's in data after interrupting server while in saving stage.
// this.saveChallenges();
// this.saveLevels();

this.savePlayersData();
}

Expand All @@ -835,7 +863,7 @@ public void save()
*/
private void saveChallenges()
{
this.challengeCacheData.values().forEach(this.challengeDatabase::saveObject);
this.challengeCacheData.values().forEach(this::saveChallenge);
}


Expand All @@ -845,7 +873,7 @@ private void saveChallenges()
*/
public void saveChallenge(Challenge challenge)
{
this.challengeDatabase.saveObject(challenge);
this.challengeDatabase.saveObjectAsync(challenge);
}


Expand All @@ -854,7 +882,7 @@ public void saveChallenge(Challenge challenge)
*/
private void saveLevels()
{
this.levelCacheData.values().forEach(this.levelDatabase::saveObject);
this.levelCacheData.values().forEach(this::saveLevel);
}


Expand All @@ -864,7 +892,7 @@ private void saveLevels()
*/
public void saveLevel(ChallengeLevel level)
{
this.levelDatabase.saveObject(level);
this.levelDatabase.saveObjectAsync(level);
}


Expand All @@ -873,7 +901,7 @@ public void saveLevel(ChallengeLevel level)
*/
private void savePlayersData()
{
this.playerCacheData.values().forEach(this.playersDatabase::saveObject);
this.playerCacheData.values().forEach(this.playersDatabase::saveObjectAsync);
}


Expand Down Expand Up @@ -902,7 +930,7 @@ private void savePlayerData(@NonNull String uniqueID)
}
}

this.playersDatabase.saveObject(cachedData);
this.playersDatabase.saveObjectAsync(cachedData);
}
}

Expand Down

0 comments on commit ffac90f

Please sign in to comment.