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

br.eti.clairton.gson.hypermedia.HypermediableSerializer Maven / Gradle / Ivy

The newest version!
package br.eti.clairton.gson.hypermedia;

import static java.util.logging.Level.FINE;

import java.lang.reflect.Type;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;

import javax.persistence.EntityManager;

import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

import br.eti.clairton.inflector.Inflector;
import br.eti.clairton.jpa.serializer.GsonJpaSerializer;
import br.eti.clairton.jpa.serializer.Nodes;
import net.vidageek.mirror.dsl.Mirror;

/**
 * Deserializa os objetos da de forma a integrar com o modo ActiveSerializer.
 *
 * @author Clairton Rodrigo Heinzen
 */
public abstract class HypermediableSerializer extends GsonJpaSerializer implements JsonSerializer, JsonDeserializer, Hypermediable {
	private static final Logger logger = Logger.getLogger(HypermediablePaginatedCollectionSerializer.class.getSimpleName());
	private static final long serialVersionUID = 1L;
	private final HypermediableRule navigator;
	private final Mirror mirror = new Mirror();

	@Deprecated
	protected HypermediableSerializer() {
		this(null, null, null);
	}

	public HypermediableSerializer(final HypermediableRule navigator, final EntityManager em, final Inflector inflector) {
		super(em);
		this.navigator = navigator;
	}
	
	public HypermediableSerializer(final Nodes nodes, final HypermediableRule navigator, final EntityManager em, final Inflector inflector) {
		super(nodes, em);
		this.navigator = navigator;
	}

	/**
	 * {@inheritDoc}.
	 */
	@Override
	public JsonElement serialize(final T src, final Type type, final JsonSerializationContext context) {
		final JsonElement element = super.serialize(src, type, context);
		if (isResource(src)) {
			return serializeWithLinks(element, src, context);
		}
		return element;
	}
	
	protected Boolean isResource(T src){
		return getRootTag(src).equals(getResource(src));		
	}

	protected JsonElement serializeWithLinks(final JsonElement element, final T src, final JsonSerializationContext context){
		final JsonElement link = getLinks(src, context);
		final Object field = mirror.on(element).get().field("members");
		@SuppressWarnings("unchecked")
		final Map members = (Map) field;
		members.put("links", link);
		logger.log(FINE, "Add links {}", link);
		return element;
	}
	
	protected JsonElement getLinks(final T src, final JsonSerializationContext context){
		final Set links = navigator.from(src, getResource(src), getOperation(src));
		final JsonArray collection = new JsonArray();
		for (final Link link : links) {
			final JsonElement element = context.serialize(link);
			collection.add(element);
		}
		return collection;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy