/*
* 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<EObject> _referenceSerializer;
private final JsonSerializer<Resource> _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<Object> keySerializer, TypeSerializer elementTypeSerializer, JsonSerializer<Object> 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<Object> 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);
}
}