All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.conqat.engine.commons.util.ListMapSerializationModule Maven / Gradle / Ivy

/*
 * Copyright (c) CQSE GmbH
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.conqat.engine.commons.util;

import java.io.IOException;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;

import org.conqat.lib.commons.collections.ListMap;
import org.conqat.lib.commons.collections.UnmodifiableSet;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;

/**
 * Jackson module which supports serialization and deserialization of
 * {@link ListMap} object and back.
 */
public class ListMapSerializationModule extends SimpleModule {

	ListMapSerializationModule() {
		addSerializer(ListMap.class, new ListMapSerializer());
		addDeserializer(ListMap.class, new ListMapDeserializer());
	}

	/** Serializer for {@link ListMap} objects. */
	private static class ListMapSerializer extends JsonSerializer {

		@Override
		public void serialize(ListMap value, JsonGenerator generator, SerializerProvider serializers)
				throws IOException {
			UnmodifiableSet keys = value.getKeys();
			SerializableListMapEntry[] entries = new SerializableListMapEntry[keys.size()];
			int i = 0;
			for (Object key : keys) {
				entries[i++] = new SerializableListMapEntry(key, value.getCollection(key));
			}
			generator.writeObject(entries);
		}
	}

	/** Deserializer for {@link ListMap} objects. */
	private static class ListMapDeserializer extends JsonDeserializer {

		@Override
		public ListMap deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {
			SerializableListMapEntry[] root = parser.getCodec().readValue(parser, SerializableListMapEntry[].class);
			ListMap listMap = new ListMap<>();
			for (SerializableListMapEntry serializableListMapEntry : root) {
				listMap.addAll(serializableListMapEntry.key, Arrays.asList(serializableListMapEntry.values));
			}
			return listMap;
		}
	}

	private static class SerializableListMapEntry {

		/** The name of the JSON property name for {@link #key}. */
		private static final String KEY_PROPERTY = "key";

		/** The name of the JSON property name for {@link #values}. */
		private static final String VALUES_PROPERTY = "values";

		@JsonProperty(KEY_PROPERTY)
		private final Object key;

		@JsonProperty(VALUES_PROPERTY)
		private final Serializable[] values;

		@JsonCreator
		private SerializableListMapEntry(@JsonProperty(KEY_PROPERTY) Object key,
				@JsonProperty(VALUES_PROPERTY) Collection values) {
			this.key = key;
			this.values = values.toArray(new Serializable[0]);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy