Skip to content

Commit

Permalink
fix: improve handling of missing message files (#3718)
Browse files Browse the repository at this point in the history
* improve handling of missing message files

* fix javadoc

Co-authored-by: Alexander Brandes <[email protected]>
  • Loading branch information
SirYwell and NotMyFault authored Jul 25, 2022
1 parent 9870811 commit ae59c74
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -732,6 +732,11 @@ public void shutdown() {
this.getServer().getPluginManager().disablePlugin(this);
}

@Override
public void shutdownServer() {
getServer().shutdown();
}

private void registerCommands() {
final BukkitCommand bukkitCommand = new BukkitCommand();
final PluginCommand plotCommand = getCommand("plots");
Expand Down
5 changes: 5 additions & 0 deletions Core/src/main/java/com/plotsquared/core/PlotPlatform.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ public interface PlotPlatform<P> extends LocaleHolder {
*/
void shutdown();

/**
* Completely shuts down the server.
*/
void shutdownServer();

/**
* Get the name of the plugin
*
Expand Down
5 changes: 4 additions & 1 deletion Core/src/main/java/com/plotsquared/core/PlotSquared.java
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,9 @@ public PlotSquared(
this.loadCaptionMap();
} catch (final Exception e) {
LOGGER.error("Failed to load caption map", e);
LOGGER.error("Shutting down server to prevent further issues");
this.platform.shutdownServer();
throw new RuntimeException("Abort loading PlotSquared");
}

// Setup the global flag container
Expand Down Expand Up @@ -267,7 +270,7 @@ public void loadCaptionMap() throws Exception {
captionMap = this.captionLoader.loadAll(this.platform.getDirectory().toPath().resolve("lang"));
} else {
String fileName = "messages_" + Settings.Enabled_Components.DEFAULT_LOCALE + ".json";
captionMap = this.captionLoader.loadSingle(this.platform.getDirectory().toPath().resolve("lang").resolve(fileName));
captionMap = this.captionLoader.loadOrCreateSingle(this.platform.getDirectory().toPath().resolve("lang").resolve(fileName));
}
this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap);
LOGGER.info(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,13 +190,14 @@ private static void save(final Path file, final Map<String, String> content) {

/**
* Load a message file into a new CaptionMap. The file name must match
* the pattern {@code messages_<locale>.json} where {@code <locale>}
* is a valid {@link Locale} string.
* the pattern expected by the {@link #localeExtractor}.
* Note that this method does not attempt to create a new file.
*
* @param file The file to load
* @return A new CaptionMap containing the loaded messages
* @throws IOException if the file couldn't be accessed or read successfully.
* @throws IllegalArgumentException if the file name doesn't match the specified format.
* @see #loadOrCreateSingle(Path)
*/
public @NonNull CaptionMap loadSingle(final @NonNull Path file) throws IOException {
final Locale locale = this.localeExtractor.apply(file);
Expand All @@ -205,15 +206,43 @@ private static void save(final Path file, final Map<String, String> content) {
if (patch(map, locale)) {
save(file, map); // update the file using the modified map
}
return new LocalizedCaptionMap(locale, map.entrySet().stream()
.collect(Collectors.toMap(
entry -> TranslatableCaption.of(this.namespace, entry.getKey()),
Map.Entry::getValue
)
));
return new LocalizedCaptionMap(locale, mapToCaptions(map));
}
}

/**
* Load a message file into a new CaptionMap. The file name must match
* the pattern expected by the {@link #localeExtractor}.
* If no file exists at the given path, this method will
* attempt to create one and fill it with default values.
*
* @param file The file to load
* @return A new CaptionMap containing the loaded messages
* @throws IOException if the file couldn't be accessed or read successfully.
* @throws IllegalArgumentException if the file name doesn't match the specified format.
* @see #loadSingle(Path)
* @since TODO
*/
public @NonNull CaptionMap loadOrCreateSingle(final @NonNull Path file) throws IOException {
final Locale locale = this.localeExtractor.apply(file);
if (!Files.exists(file) ) {
Map<String, String> map = new LinkedHashMap<>();
patch(map, locale);
save(file, map);
return new LocalizedCaptionMap(locale, mapToCaptions(map));
} else {
return loadSingle(file);
}
}

private @NonNull Map<TranslatableCaption, String> mapToCaptions(Map<String, String> map) {
return map.entrySet().stream().collect(
Collectors.toMap(
entry -> TranslatableCaption.of(this.namespace, entry.getKey()),
Map.Entry::getValue
));
}

/**
* Add missing entries to the given map.
* Entries are missing if the key exists in {@link #defaultLocale} but isn't present
Expand Down

0 comments on commit ae59c74

Please sign in to comment.