Skip to content

[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

  1. git checkout 29c41241 (on "psychology" branch)
  2. mvn clean
  3. mvn -Dmaven.test.skip=true package
  4. java -jar VadereGui/target/vadere-gui.jar &
  5. 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)

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information