Java tutorial
/* * 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.tests.custom; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.emfjson.jackson.annotations.EcoreIdentityInfo; import org.emfjson.jackson.annotations.EcoreReferenceInfo; import org.emfjson.jackson.annotations.EcoreTypeInfo; import org.emfjson.jackson.junit.model.ModelFactory; import org.emfjson.jackson.junit.model.ModelPackage; import org.emfjson.jackson.junit.model.User; import org.emfjson.jackson.module.EMFModule; import org.emfjson.jackson.resource.JsonResource; import org.emfjson.jackson.resource.JsonResourceFactory; import org.emfjson.jackson.utils.ValueWriter; import org.junit.Before; import org.junit.Test; import java.io.IOException; import static org.junit.Assert.assertEquals; public class CustomSerializersTest { private ResourceSet resourceSet; private ObjectMapper mapper; @Before public void setUp() { mapper = new ObjectMapper(); resourceSet = new ResourceSetImpl(); resourceSet.getPackageRegistry().put(ModelPackage.eNS_URI, ModelPackage.eINSTANCE); resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", new JsonResourceFactory(mapper)); } @Test public void testSerializeTypeWithOtherFieldName() { EMFModule module = new EMFModule(); module.setTypeInfo(new EcoreTypeInfo("type")); mapper.registerModule(module); JsonNode expected = mapper.createObjectNode().put("type", "http://www.emfjson.org/jackson/model#//User") .put("userId", "u1"); User u1 = ModelFactory.eINSTANCE.createUser(); u1.setUserId("u1"); Resource resource = resourceSet.createResource(URI.createURI("test")); resource.getContents().add(u1); JsonNode result = mapper.valueToTree(resource); assertEquals(expected, result); } @Test public void testSerializeType() { EMFModule module = new EMFModule(); module.setTypeInfo(new EcoreTypeInfo("type", new ValueWriter<EClass, String>() { @Override public String writeValue(EClass value, SerializerProvider context) { return value.getName(); } })); mapper.registerModule(module); JsonNode expected = mapper.createObjectNode().put("type", "User").put("userId", "u1"); User u1 = ModelFactory.eINSTANCE.createUser(); u1.setUserId("u1"); Resource resource = resourceSet.createResource(URI.createURI("test")); resource.getContents().add(u1); JsonNode result = mapper.valueToTree(resource); assertEquals(expected, result); } @Test public void testSerializeIdWithOtherFieldName() { EMFModule module = new EMFModule(); module.configure(EMFModule.Feature.OPTION_USE_ID, true); module.configure(EMFModule.Feature.OPTION_SERIALIZE_TYPE, false); module.setIdentityInfo(new EcoreIdentityInfo("_id")); mapper.registerModule(module); JsonNode expected = mapper.createObjectNode().put("_id", "1").put("userId", "u1"); User u1 = ModelFactory.eINSTANCE.createUser(); u1.setUserId("u1"); Resource resource = resourceSet.createResource(URI.createURI("test")); resource.getContents().add(u1); ((JsonResource) resource).setID(u1, "1"); JsonNode result = mapper.valueToTree(resource); assertEquals(expected, result); } @Test public void testSerializeId() { EMFModule module = new EMFModule(); module.configure(EMFModule.Feature.OPTION_USE_ID, true); module.configure(EMFModule.Feature.OPTION_SERIALIZE_TYPE, false); module.setIdentityInfo(new EcoreIdentityInfo("_id", new ValueWriter<EObject, Object>() { @Override public Object writeValue(EObject value, SerializerProvider context) { return 1; } })); mapper.registerModule(module); JsonNode expected = mapper.createObjectNode().put("_id", 1).put("userId", "u1"); User u1 = ModelFactory.eINSTANCE.createUser(); u1.setUserId("u1"); Resource resource = resourceSet.createResource(URI.createURI("test")); resource.getContents().add(u1); JsonNode result = mapper.valueToTree(resource); assertEquals(expected, result); } @Test public void testSerializeReferenceWithOtherFieldNames() { EMFModule module = new EMFModule(); module.configure(EMFModule.Feature.OPTION_SERIALIZE_TYPE, false); module.setReferenceInfo(new EcoreReferenceInfo.Base("my_ref", "my_type")); mapper.registerModule(module); JsonNode expected = mapper.createArrayNode() .add(mapper.createObjectNode().put("name", "Paul") .set("uniqueFriend", mapper.createObjectNode() .put("my_type", "http://www.emfjson.org/jackson/model#//User").put("my_ref", "/1"))) .add(mapper.createObjectNode().put("name", "Franck")); User u1 = ModelFactory.eINSTANCE.createUser(); u1.setName("Paul"); User u2 = ModelFactory.eINSTANCE.createUser(); u2.setName("Franck"); u1.setUniqueFriend(u2); Resource resource = resourceSet.createResource(URI.createURI("test")); resource.getContents().add(u1); resource.getContents().add(u2); JsonNode result = mapper.valueToTree(resource); assertEquals(expected, result); } @Test public void testSerializeReferenceAsStrings() { EMFModule module = new EMFModule(); module.configure(EMFModule.Feature.OPTION_USE_ID, true); module.configure(EMFModule.Feature.OPTION_SERIALIZE_TYPE, false); module.setReferenceSerializer(new JsonSerializer<EObject>() { @Override public void serialize(EObject value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(((JsonResource) value.eResource()).getID(value)); } }); mapper.registerModule(module); JsonNode expected = mapper.createArrayNode() .add(mapper.createObjectNode().put("@id", "1").put("name", "Paul").put("uniqueFriend", "2")) .add(mapper.createObjectNode().put("@id", "2").put("name", "Franck")); User u1 = ModelFactory.eINSTANCE.createUser(); u1.setName("Paul"); User u2 = ModelFactory.eINSTANCE.createUser(); u2.setName("Franck"); u1.setUniqueFriend(u2); Resource resource = resourceSet.createResource(URI.createURI("test")); resource.getContents().add(u1); resource.getContents().add(u2); ((JsonResource) resource).setID(u1, "1"); ((JsonResource) resource).setID(u2, "2"); JsonNode result = mapper.valueToTree(resource); assertEquals(expected, result); } }