package uulm.teamname.marvelous.gamelibrary.json; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.InjectableValues; import com.fasterxml.jackson.databind.ObjectMapper; import org.tinylog.Logger; import uulm.teamname.marvelous.gamelibrary.config.CharacterConfig; import uulm.teamname.marvelous.gamelibrary.config.PartyConfig; import uulm.teamname.marvelous.gamelibrary.config.ScenarioConfig; import uulm.teamname.marvelous.gamelibrary.messages.BasicMessage; import uulm.teamname.marvelous.gamelibrary.messages.server.EventMessage; import java.io.File; import java.io.IOException; import java.util.Optional; /** * Class that contains JSON encoding and decoding. It is initiated with the Character configuration. */ public class JSON { // ===================>>>>>> STATIC <<<<<<====================== private static final ObjectMapper staticMapper = new ObjectMapper(); public static Optional parseCharacterConfig (String jsonRepresentingConfig) { Optional result; try { result = Optional.of(staticMapper.readValue(jsonRepresentingConfig, CharacterConfig.class)); } catch (JsonProcessingException e) { Logger.debug("JSON deserialization of CharacterConfig failed. Exception: {}", e.toString()); result = Optional.empty(); } return result; } public static Optional parseCharacterConfig (File jsonRepresentingConfig) { Optional result; try { result = Optional.of(staticMapper.readValue(jsonRepresentingConfig, CharacterConfig.class)); } catch (IOException e) { Logger.debug("JSON deserialization of CharacterConfig failed. Exception: {}", e.toString()); result = Optional.empty(); } return result; } public static Optional parsePartyConfig (String jsonRepresentingConfig) { Optional result; try { result = Optional.of(staticMapper.readValue(jsonRepresentingConfig, PartyConfig.class)); } catch (JsonProcessingException e) { Logger.debug("JSON deserialization of PartyConfig failed. Exception: {}", e.toString()); result = Optional.empty(); } return result; } public static Optional parsePartyConfig (File jsonRepresentingConfig) { Optional result; try { result = Optional.of(staticMapper.readValue(jsonRepresentingConfig, PartyConfig.class)); } catch (IOException e) { Logger.debug("JSON deserialization of PartyConfig failed. Exception: {}", e.toString()); result = Optional.empty(); } return result; } public static Optional parseScenarioConfig (String jsonRepresentingConfig) { Optional result; try { result = Optional.of(staticMapper.readValue(jsonRepresentingConfig, ScenarioConfig.class)); } catch (JsonProcessingException e) { Logger.debug("JSON deserialization of ScenarioConfig failed. Exception: {}", e.toString()); result = Optional.empty(); } return result; } public static Optional parseScenarioConfig (File jsonRepresentingConfig) { Optional result; try { result = Optional.of(staticMapper.readValue(jsonRepresentingConfig, ScenarioConfig.class)); } catch (IOException e) { Logger.debug("JSON deserialization of ScenarioConfig failed. Exception: {}", e.toString()); result = Optional.empty(); } return result; } // =================>>>>>> NON-STATIC <<<<<<==================== private final ObjectMapper mapper = new ObjectMapper(); public JSON (CharacterConfig config) { // add the config to the mappers InjectableValues, where it is later accessed by the EntityDeserializer this.mapper.setInjectableValues(new InjectableValues .Std() .addValue("CharacterConfig", config)); } /** Deserializes an incoming network message into a {@link EventMessage}. * @param input The JSON to deserialize * @return An {@link Optional} containing the parsed message (as {@link BasicMessage}, so typecasting is necessary) * or an empty {@link Optional} if the deserialization failed */ public Optional parse(String input) { try { return Optional.of(mapper.readValue(input, BasicMessage.class)); } catch (JsonProcessingException e) { Logger.debug("JSON deserialization of Message failed. Exception: {}", e.toString()); return Optional.empty(); } } /** Serializes a {@link EventMessage} into a JSON string. * @param input The message to serialize * @return An {@link Optional}<{@link String}> of the message as JSON or * an empty {@link Optional} if the serialization failed */ public Optional stringify(BasicMessage input) { try { return Optional.of(mapper.writeValueAsString(input)); } catch (JsonProcessingException e) { Logger.debug("JSON serialization of Message of type {} failed. Exception: {}", input.messageType.toString(), e.toString()); // e.printStackTrace(); return Optional.empty(); } } }