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

org.emfjson.jackson.databind.ser.EMFSerializers Maven / Gradle / Ivy

There is a newer version: 1.3.0
Show newest version
/*
 * Copyright (c) 2015 Guillaume Hillairet.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Guillaume Hillairet - initial API and implementation
 *
 */
package org.emfjson.jackson.databind.ser;

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.ser.Serializers;
import com.fasterxml.jackson.databind.ser.std.CollectionSerializer;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.MapLikeType;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.impl.EEnumLiteralImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.emfjson.jackson.databind.deser.ReferenceEntry;
import org.emfjson.jackson.databind.property.EObjectPropertyMap;
import org.emfjson.jackson.databind.type.EcoreType;
import org.emfjson.jackson.module.EMFModule;

public class EMFSerializers extends Serializers.Base {

	private final EObjectPropertyMap.Builder propertiesBuilder;
	private final JsonSerializer _referenceSerializer;
	private final JsonSerializer _resourceSerializer = new ResourceSerializer();
	private final JsonSerializer _dataTypeSerializer = new EDataTypeSerializer();
	private final JsonSerializer _mapSerializer = new EMapStringSerializer();
	private final JsonSerializer _enumeratorSerializer = new EnumeratorSerializer();

	public EMFSerializers(EMFModule module) {
		this.propertiesBuilder = EObjectPropertyMap.Builder.from(module, module.getFeatures());
		this._referenceSerializer = module.getReferenceSerializer();
	}

	@Override
	public JsonSerializer findMapLikeSerializer(SerializationConfig config, MapLikeType type, BeanDescription beanDesc, JsonSerializer keySerializer, TypeSerializer elementTypeSerializer, JsonSerializer elementValueSerializer) {
		if (type.isTypeOrSubTypeOf(EMap.class)) {
			if (type.getKeyType().isTypeOrSubTypeOf(String.class)) {
				return _mapSerializer;
			}
		}

		return super.findMapLikeSerializer(config, type, beanDesc, keySerializer, elementTypeSerializer, elementValueSerializer);
	}

	@Override
	public JsonSerializer findCollectionSerializer(SerializationConfig config, CollectionType type, BeanDescription beanDesc, TypeSerializer elementTypeSerializer, JsonSerializer elementValueSerializer) {
		if (type.getContentType().isReferenceType()) {
			return new CollectionSerializer(type.getContentType(), false, null, (JsonSerializer) _referenceSerializer);
		}
		return super.findCollectionSerializer(config, type, beanDesc, elementTypeSerializer, elementValueSerializer);
	}

	@Override
	public JsonSerializer findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc) {
		if (type.isTypeOrSubTypeOf(Resource.class)) {
			return _resourceSerializer;
		}

		if (type.isTypeOrSubTypeOf(Enumerator.class) && !type.isReferenceType()) {
			if (type.getRawClass() != EEnumLiteralImpl.class) {
				return _enumeratorSerializer;
			}
		}

		if (type.isReferenceType() || type.isTypeOrSubTypeOf(ReferenceEntry.class)) {
			return _referenceSerializer;
		}

		if (type.isTypeOrSubTypeOf(EcoreType.DataType.class)) {
			return _dataTypeSerializer;
		}

		if (type.isTypeOrSubTypeOf(EObject.class)) {
			return new EObjectSerializer(propertiesBuilder, _referenceSerializer);
		}

		return super.findSerializer(config, type, beanDesc);
	}

}