Skip to content

Commit

Permalink
feat: Simplify syntax error message for scenario loader
Browse files Browse the repository at this point in the history
  • Loading branch information
PeyaPeyaPeyang committed Sep 29, 2024
1 parent 2e47334 commit 179d2a3
Show file tree
Hide file tree
Showing 14 changed files with 141 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
package org.kunlab.scenamatica.exceptions.scenariofile;

import lombok.Getter;
import org.jetbrains.annotations.Nullable;

/**
* 無効なシナリオファイルを読み込んだ場合にスローされる例外です。
*/
public class InvalidScenarioFileException extends Exception
{
@Getter
@Nullable
private final String fileName;

public InvalidScenarioFileException(String message, IllegalArgumentException e)
public InvalidScenarioFileException(String message, String fileName, Throwable exception)
{
super("Invalid scenario file syntax: " + message, e);
super(message, exception);

this.fileName = fileName;
}

public InvalidScenarioFileException(String message)
public InvalidScenarioFileException(String message, String fileName)
{
super(message);
this.fileName = fileName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ public class NotAScenarioFileException extends InvalidScenarioFileException
{
public NotAScenarioFileException(String fileName)
{
super("The file is not a scenario file(missing 'scenamatica' property?): " + fileName);
super("The file is not a scenario file(missing 'scenamatica' property?)", fileName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ default void queueScenario(@NotNull Plugin plugin,
*
* @param plugin ロードするプラグイン
*/
void loadPluginScenarios(@NotNull Plugin plugin);
boolean loadPluginScenarios(@NotNull Plugin plugin);

/**
* プラグインのシナリオをリロードします。
Expand All @@ -218,7 +218,7 @@ default void queueScenario(@NotNull Plugin plugin,
* @see #unloadPluginScenarios(Plugin)
* @see #loadPluginScenarios(Plugin)
*/
void reloadPluginScenarios(@NotNull Plugin plugin);
boolean reloadPluginScenarios(@NotNull Plugin plugin);

/**
* 現在実行中のシナリオを返します。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,11 +273,11 @@ public void unloadPluginScenarios(@NotNull Plugin plugin)
}

@Override
public void loadPluginScenarios(@NotNull Plugin plugin)
public boolean loadPluginScenarios(@NotNull Plugin plugin)
{
// 内部でリロードを呼び出す(やることは同じなので)
if (!this.registry.getScenarioFileManager().reloadPluginScenarios(plugin))
throw new IllegalStateException("Failed to reload plugin scenarios.");
return false;

// エンジンのコンパイルも行う。
Map<String, ScenarioFileStructure> scenarios = this.registry.getScenarioFileManager().getPluginScenarios(plugin);
Expand All @@ -286,6 +286,8 @@ public void loadPluginScenarios(@NotNull Plugin plugin)
List<ScenarioEngine> engines = this.createEnginesByFile(plugin, scenarios.values());

this.registry.getTriggerManager().performTriggerFire(engines, TriggerType.ON_LOAD);

return true;
}

private List<ScenarioEngine> createEnginesByFile(@NotNull Plugin owningPlugin, @NotNull Collection<ScenarioFileStructure> files)
Expand Down Expand Up @@ -326,6 +328,7 @@ private List<ScenarioEngine> createEnginesByFile(@NotNull Plugin owningPlugin, @
logger.warning(LangProvider.get(
"scenario.compile.error",
MsgArgs.of("pluginName", owningPlugin.getName())
.add("scenarioName", e.getScenarioName())
.add("message", message)
));

Expand Down Expand Up @@ -358,10 +361,10 @@ private List<ScenarioEngine> createEnginesByFile(@NotNull Plugin owningPlugin, @
}

@Override
public void reloadPluginScenarios(@NotNull Plugin plugin)
public boolean reloadPluginScenarios(@NotNull Plugin plugin)
{
this.unloadPluginScenarios(plugin);
this.loadPluginScenarios(plugin);
return this.loadPluginScenarios(plugin);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ scenario.compile.start=Starting scenario compilation for scenario %%scenarioName
scenario.compile.end=Scenario compilations of %%total%% scenarios have been completed.
scenario.compile.child=[%%compiled%%/%%total%%] Compiling %%triggerType%%:%%type%% scenario %%scenarioName%%
scenario.compile.main=[%%compiled%%/%%total%%] Compiling main scenario %%scenarioName%%
scenario.compile.error=!!!ERROR!!! Failed to compile scenario: %%message%%
scenario.compile.error=[!!!ERROR!!!] Failed to compile scenario %%scenarioName%% of plugin %%pluginName%%: %%message%%
scenario.load.success=Successfully loaded scenarios for plugin %%pluginName%%
scenario.load.cancel=Canceled loading scenarios for plugin %%pluginName%%

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ scenario.compile.start=シナリオ %%scenarioName%% のコンパイルを開始
scenario.compile.end=合計 %%total%% 個のシナリオのコンパイルが完了しました。
scenario.compile.child=[%%compiled%%/%%total%%] シナリオ %%scenarioName%% の %%triggerType%%:%%type%% をコンパイル中 …
scenario.compile.main=[%%compiled%%/%%total%%] シナリオ %%scenarioName%% のメインシナリオをコンパイル中 …
scenario.compile.error=!!!ERROR!!! シナリオのコンパイルに失敗しました:%%message%%
scenario.compile.error=[!!!ERROR!!!] プラグイン %%pluginName%% のシナリオ %%scenarioName%% のコンパイルに失敗しました: %%message%%
scenario.load.success=プラグイン %%pluginName%% のシナリオを正常に読み込みました。
scenario.load.cancel=プラグイン %%pluginName%% のシナリオの読み込みをキャンセルしました。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ scenario.compile.start=シナリオ %%scenarioName%% のコンパイルを始め
scenario.compile.prepare=合計 %%total%% 個のシナリオをコンパイルしたで。
scenario.compile.child=[%%compiled%%/%%total%%] シナリオ %%scenarioName%% の %%triggerType%%:%%type%% をコンパイルしとるで …
scenario.compile.main=[%%compiled%%/%%total%%] シナリオ %%scenarioName%% のメインシナリオをコンパイルしとるで …
scenario.compile.error=!!!ERROR!!! シナリオのコンパイルに失敗したで:%%message%%
scenario.compile.error=[!!!ERROR!!!] プラグイン %%pluginName%% のシナリオ %%scenarioName%% のコンパイルに失敗したで: %%message%%
scenario.load.success=プラグイン %%pluginName%% のシナリオを正常に読み込んだで。
scenario.load.cancel=プラグイン %%pluginName%% のシナリオの読み込みをキャンセルしたで。

Expand Down
36 changes: 36 additions & 0 deletions Scenamatica/ScenamaticaScenarioFile/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,42 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<minimizeJar>true</minimizeJar>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.properties.PropertiesTransformer">
<resource>lang/ja_JP.lang</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.properties.PropertiesTransformer">
<resource>lang/en_US.lang</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.properties.PropertiesTransformer">
<resource>lang/ja_KS.lang</resource>
</transformer>
</transformers>
</configuration>
</plugin>
</plugins>
</build>

<dependencies>
<dependency>
<groupId>org.kunlab.scenamatica</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.kunlab.scenamatica.scenariofile;

import net.kunmc.lab.peyangpaperutils.lang.LangProvider;
import net.kunmc.lab.peyangpaperutils.lang.MsgArgs;
import net.kunmc.lab.peyangpaperutils.versioning.Version;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
Expand All @@ -17,6 +19,7 @@
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class ScenarioFileManagerImpl implements ScenarioFileManager
{
Expand Down Expand Up @@ -67,6 +70,7 @@ private static Path getPluginFilePath(Plugin plugin)
@Override
public boolean loadPluginScenarios(@NotNull Plugin plugin)
{
boolean result;
try
{
Path pluginJarPath = getPluginFilePath(plugin);
Expand All @@ -76,18 +80,37 @@ public boolean loadPluginScenarios(@NotNull Plugin plugin)

this.scenarios.put(plugin.getName(), pluginScenarios);

return true;
result = true;
}
catch (InvalidScenarioFileException e)
{
this.registry.getLogger().warning("The plugin " + plugin.getName() + " has invalid scenario files: " + e.getMessage());
return false;
String message = e.getMessage();
if (!(e.getCause() == null || Objects.equals(e.getMessage(), e.getCause().getMessage())))
message += "(caused by " + e.getCause().getMessage() + ")";

this.registry.getLogger().warning(LangProvider.get(
"scenario.file.parser.invalidScenarioFile",
MsgArgs.of("pluginName", plugin.getName())
.add("fileName", e.getFileName())
.add("message", message)
));
result = false;
}
catch (IOException e)
{
this.registry.getExceptionHandler().report(e);
return false;
result = false;
}

if (!result)
{
this.registry.getLogger().warning(LangProvider.get(
"scenario.file.manager.pluginLoadingFailed",
MsgArgs.of("pluginName", plugin.getName())
));
}

return result;
}

private boolean canLoadScenario(@NotNull ScenarioFileStructure scenario)
Expand All @@ -96,10 +119,12 @@ private boolean canLoadScenario(@NotNull ScenarioFileStructure scenario)
Version fileVersion = scenario.getScenamaticaVersion();
if (scenario.getScenamaticaVersion().isNewerThan(baseVersion))
{
this.registry.getLogger().warning(
"The scenario file " + scenario.getName() + " is newer than running Scenamatica daemon version." +
" (File version: " + fileVersion + ", Scenamatica version: " + baseVersion + ")"
);
this.registry.getLogger().warning(LangProvider.get(
"scenario.file.parser.versionMismatch",
MsgArgs.of("scenarioName", scenario.getName())
.add("currentScenamaticaVersion", fileVersion)
.add("fileScenamaticaVersion", baseVersion)
));
return false;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import javax.annotation.Nullable;
import lombok.AllArgsConstructor;
import net.kunmc.lab.peyangpaperutils.lang.LangProvider;
import net.kunmc.lab.peyangpaperutils.lang.MsgArgs;
import net.kunmc.lab.peyangpaperutils.versioning.Version;
import org.apache.commons.lang.StringUtils;
import org.kunlab.scenamatica.enums.MinecraftVersion;
Expand All @@ -12,6 +14,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.error.YAMLException;

import java.io.FileNotFoundException;
import java.io.IOException;
Expand Down Expand Up @@ -47,17 +50,23 @@ public static ScenarioFileStructure fromMap(Map<String, Object> map, @Nullable S
}
catch (IllegalArgumentException e)
{
String fileNameStr = fileName == null ? "": " in file " + fileName;

throw new InvalidScenarioFileException(e.getMessage() + fileNameStr, e);
throw new InvalidScenarioFileException(e.getMessage(), fileName, e);
}
}

public static ScenarioFileStructure fromInputStream(InputStream inputStream, @Nullable String fileName)
throws InvalidScenarioFileException
{
Yaml sYaml = new Yaml();
Map<Object, Object> map = sYaml.load(inputStream);
Map<Object, Object> map;
try
{
map = sYaml.load(inputStream);
}
catch (YAMLException e)
{
throw new InvalidScenarioFileException(e.getMessage(), fileName, e);
}

return fromMap(injectTriggers(map), fileName);
}
Expand Down Expand Up @@ -118,11 +127,11 @@ public static Map<String, ScenarioFileStructure> loadAllFromJar(Path jarPath)
{
String descA = map.get(scenario.getName()).getDescription();
String descB = scenario.getDescription();
throw new IllegalStateException(String.format(
"Duplicated scenario name: %s(%s, %s)",
scenario.getName(),
descA == null ? "N/A": descA,
descB == null ? "N/A": descB
throw new IllegalStateException(LangProvider.get(
"scenario.file.manager.duplicated",
MsgArgs.of("scenarioName", scenario.getName())
.add("descriptionA", descA)
.add("descriptionB", descB)
));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.kunlab.scenamatica.interfaces.structures.scenario.ActionStructure;
import org.kunlab.scenamatica.interfaces.structures.scenario.ScenarioStructure;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

Expand Down Expand Up @@ -61,7 +62,13 @@ public static void validate(@NotNull Map<String, Object> map, @NotNull Structure
{
MapUtils.checkType(map, KEY_SCENARIO_TYPE, String.class);
if (ScenarioType.fromKey((String) map.get(KEY_SCENARIO_TYPE)) == null)
throw new IllegalArgumentException("Invalid scenario type");
throw new IllegalArgumentException("Invalid scenario type found, expected one of " +
Arrays.stream(ScenarioType.values())
.map(ScenarioType::getKey)
.map(String::toLowerCase)
.reduce((a, b) -> a + ", " + b)
.orElse("")
+ " but found " + map.get(KEY_SCENARIO_TYPE));

MapUtils.checkNumberIfContains(map, KEY_TIMEOUT);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
scenario.file.parser.invalidScenarioFile=Plugin %%pluginName%% has an broken scenario file(%%fileName%%): %%message%%
scenario.file.parser.versionMismatch=Scenario %%scenarioName%% requires a newer version of Scenamatica(%%currentScenamaticaVersion%%) than the one currently running Scenamatica(%%fileScenamaticaVersion%%).
scenario.file.parser.notAScenarioFIle=File %%scenarioName%% is not a scenario file (missing 'scenamatica' key?).
scenario.file.parser.invalidScenarioFileException=Invalid scenario file: %%message%%
scenario.file.parser.invalidYamlSyntax=Scenario file %%scenarioName%% contains invalid YAML syntax: %%message%%
scenario.file.manager.duplicated=Duplicated scenario files found: %%scenarioName%%(A: %%descriptionA%%, B: %%descriptionB%%)
scenario.file.manager.pluginLoadingFailed=Failed to load scenarios of plugin %%pluginName%%.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
scenario.file.parser.invalidScenarioFile=プラグイン %%pluginName%% は壊れているシナリオファイルを持っています(%%fileName%%):%%message%%
scenario.file.parser.versionMismatch=シナリオ %%scenarioName%% には, 現在実行している Scenamatica(%%currentScenamaticaVersion%%)よりも新しいバージョンの Scenamatica(%%fileScenamaticaVersion%%) が必要です。
scenario.file.parser.invalidScenarioFileException=間違ったシナリオファイル:%%message%%
scenario.file.parser.notAScenarioFIle=ファイル %%scenarioName%% はシナリオファイルではありません('scenamatica' キーが無い可能性があります)。
scenario.file.parser.invalidYamlSyntax=シナリオファイル %%scenarioName%% には無効なYAML構文が含まれています:%%message%%
scenario.file.manager.duplicated=重複したシナリオファイルが見つかりました: %%scenarioName%%(A: %%descriptionA%%, B: %%descriptionB%%)
scenario.file.manager.pluginLoadingFailed=プラグイン %%pluginName%% のシナリオの読み込みに失敗しました。
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
scenario.file.parser.invalidScenarioFile=プラグイン %%pluginName%% はようわからんシナリオファイルを持ってるで(%%fileName%%):%%message%%
scenario.file.parser.versionMismatch=シナリオ %%scenarioName%% には, 現在実行している Scenamatica(%%currentScenamaticaVersion%%)よりも新しいバージョンの Scenamatica(%%fileScenamaticaVersion%%) が必要やで。
scenario.file.parser.notAScenarioFIle=ファイル %%scenarioName%% はシナリオファイルじゃないっぽいで('scenamatica' キーが無いかもしれんで)。
scenario.file.parser.invalidScenarioFileException=ようわからんシナリオファイルやで:%%message%%
scenario.file.parser.invalidYamlSyntax=シナリオファイル %%scenarioName%% には無効なYAML構文が含まれてるで:%%message%%
scenario.file.manager.duplicated=重複したシナリオファイルが見つかったで: %%scenarioName%%(A: %%descriptionA%%, B: %%descriptionB%%)
scenario.file.manager.pluginLoadingFailed=プラグイン %%pluginName%% のシナリオの読み込みに失敗したで。

0 comments on commit 179d2a3

Please sign in to comment.