package cz.cvut.fel.adaptiverestfulapi.serialization; import cz.cvut.fel.adaptiverestfulapi.core.Filter; import cz.cvut.fel.adaptiverestfulapi.core.FilterException; import cz.cvut.fel.adaptiverestfulapi.core.HttpContext; import cz.cvut.fel.adaptiverestfulapi.core.HttpHeaders; import cz.cvut.fel.adaptiverestfulapi.meta.configuration.Configuration; import cz.cvut.fel.adaptiverestfulapi.meta.model.Model; import java.util.List; /** * Serialization resolver. */ public class Resolver extends Filter { @Override public HttpContext process(HttpContext httpContext, Model model, Configuration configuration) throws FilterException { Serializer serializer = null; serializer = this.deserializer(httpContext, model, configuration); httpContext = serializer.deserialize(httpContext, model, configuration); httpContext = this.resign(httpContext, model, configuration); serializer = this.serializer(httpContext, model, configuration); return serializer.serialize(httpContext, model, configuration); } /** * Resolves most appropriate serializer for `Accept` header. * For now it's necessary to provide concrete type, like `application/json`. * @param httpContext * @param model * @param configuration * @return * @throws FilterException */ protected Serializer serializer(HttpContext httpContext, Model model, Configuration configuration) throws FilterException { List<String> values = httpContext.getRequestHeaders().getStringValues(HttpHeaders.Accept); Serializer serializer = this.resolve(values, model, configuration); if (serializer == null) { throw new FilterException("Could not resolve serializer."); } return serializer; } /** * Resolves most appropriate deserializer for `Content-Type` header. * For now it's necessary to provide concrete type, like `application/json`. * @param httpContext * @param model * @param configuration * @return * @throws FilterException */ protected Serializer deserializer(HttpContext httpContext, Model model, Configuration configuration) throws FilterException { List<String> values = httpContext.getRequestHeaders().getStringValues(HttpHeaders.ContentType); Serializer deserializer = this.resolve(values, model, configuration); if (deserializer == null) { throw new FilterException("Could not resolve deserializer."); } return deserializer; } private Serializer resolve(List<String> values, Model model, Configuration configuration) { Serializer serializer = null; if (values == null) { return serializer; } for (String value : values) { serializer = configuration.get(value, model); if (serializer != null) { return serializer; } } return serializer; } }