[MigrationAssistant] Class "JsonMigrationAssistant" uses "StateJsonConverter" which causes an exception
Summary
The class JsonMigrationAssistant
uses class StateJsonConverter
to deserialize a JSON scenario description. This can cause exceptions if methods provided by StateJsonConverter
cannot read old scenario descriptions anymore.
What is the current bug behavior?
From stack trace, I see following migration steps when opening an existing project:
AbstractJsonTransformation.addNewMembersWithDefaultValues(AbstractJsonTransformatioJsonMigrationAssistant.migrateScenario(JsonMigrationAssistant.java:282)
JsonMigrationAssistant.migrateDirectory(JsonMigrationAssistant.java:198)
JsonMigrationAssistant.analyzeProject(JsonMigrationAssistant.java:66)
The problem is the method addNewMembersWithDefaultValues()
which uses StateJsonConverter
to read the JSON scenario file.
In my specific case, I use Jackson
annotations to de/-serialize events/stimuli. For example in class Stimulus
,
@JsonSubTypes({
@Type(value = Bang.class, name = "Bang"), // "Bang" was previously named "BangEvent" but renamed from version 1.5 on! I.e., old versions cannot be read anymore.
...
})
public abstract class Stimulus {
}
Since addNewMembersWithDefaultValues()
uses StateJsonConverter
to read the JSON file, old scenario files (which use still "BangEvent") cannot be read anymore.
What is the expected correct behavior?
The migration assistant should not rely on StateJsonConvert
. Our scenario files are plain JSON files. So, we only need a JSON library to read and traverse the JSON tree for migration.
Steps to reproduce
- git checkout 29c41241 (on "psychology" branch)
- mvn clean
- mvn -Dmaven.test.skip=true package
- java -jar VadereGui/target/vadere-gui.jar &
- Open project: Scenarios/ModelTests/TestPsychology/BangEvent/
Relevant data
- Git branch name and commit hash: psychology/29c41241
- Scenarios/ModelTests/TestPsychology/BangEvent/ (on "psychology" branch)
Logs and outputs
Stack trace when migration assistant uses addNewMembersWithDefaultValues()
14:20:46,986 ERROR ActionLoadProject:175 - could not loadFromFilesystem project: Could not resolve type id 'WaitEvent' as a subtype of [simple type, class org.vadere.state.psychology.stimuli.types.Stimulus]: known type ids = [Bang, ChangeTarget, ElapsedTime, Wait, WaitInArea] (for POJO property 'stimuli') at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: org.vadere.state.psychology.stimuli.json.StimulusInfo["stimuli"]->java.util.ArrayList[0]) java.lang.IllegalArgumentException: Could not resolve type id 'WaitEvent' as a subtype of [simple type, class org.vadere.state.psychology.stimuli.types.Stimulus]: known type ids = [Bang, ChangeTarget, ElapsedTime, Wait, WaitInArea] (for POJO property 'stimuli') at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: org.vadere.state.psychology.stimuli.json.StimulusInfo["stimuli"]->java.util.ArrayList[0]) at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3750) at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:3668) at org.vadere.state.util.StateJsonConverter.lambda$deserializeStimuliFromArrayNode$7(StateJsonConverter.java:183) at java.base/java.lang.Iterable.forEach(Iterable.java:75) at org.vadere.state.util.StateJsonConverter.deserializeStimuliFromArrayNode(StateJsonConverter.java:183) at org.vadere.simulator.projects.io.JsonConverter.deserializeScenarioRunManagerFromNode(JsonConverter.java:56) at org.vadere.simulator.projects.migration.jsontranformation.AbstractJsonTransformation.addNewMembersWithDefaultValues(AbstractJsonTransformation.java:194) at org.vadere.simulator.projects.migration.jsontranformation.JsonMigrationAssistant.migrateScenario(JsonMigrationAssistant.java:282) at org.vadere.simulator.projects.migration.jsontranformation.JsonMigrationAssistant.migrateDirectory(JsonMigrationAssistant.java:198) at org.vadere.simulator.projects.migration.jsontranformation.JsonMigrationAssistant.analyzeProject(JsonMigrationAssistant.java:66) at org.vadere.simulator.projects.io.IOVadere.readProject(IOVadere.java:66) at org.vadere.simulator.projects.io.IOVadere.readProjectJson(IOVadere.java:47) at org.vadere.gui.projectview.control.ActionLoadProject.loadProjectByPath(ActionLoadProject.java:114) at org.vadere.gui.projectview.control.ActionLoadProject.loadProjectByPath(ActionLoadProject.java:109) at org.vadere.gui.projectview.control.ActionLoadProject.loadProject(ActionLoadProject.java:83) at org.vadere.gui.projectview.control.ActionLoadProject.actionPerformed(ActionLoadProject.java:44) at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
Starting point
AbstractJsonTransformation.addNewMembersWithDefaultValues(AbstractJsonTransformation.java:194)