package cz.cvut.fel.adaptiverestfulapi.serialization.text.plain;
import cz.cvut.fel.adaptiverestfulapi.core.*;
import cz.cvut.fel.adaptiverestfulapi.meta.configuration.Configuration;
import cz.cvut.fel.adaptiverestfulapi.meta.model.Entity;
import cz.cvut.fel.adaptiverestfulapi.meta.model.Model;
import cz.cvut.fel.adaptiverestfulapi.serialization.SerializationException;
import cz.cvut.fel.adaptiverestfulapi.serialization.Serializer;
import java.util.*;
public class PlainTextSerializer implements Serializer {
public static final String MIME = "text/plain;charset=UTF-8";
private Map<String, EntitySerializer> adapters;
@Override
public HttpContext serialize(HttpContext httpContext, Model model, Configuration configuration) throws SerializationException {
this.registerModel(model, configuration);
Entity entity = this.entity(httpContext, model);
Object object = httpContext.getContent();
if (object != null) {
String content = "";
if (object instanceof Collection || object instanceof List) {
StringBuilder sb = new StringBuilder();
sb.append("Collection of ");
sb.append(entity.getName());
sb.append("\n\n\n\n");
Collection items = (Collection)object;
for (Object item : items) {
sb.append(this.adapters.get(entity.getName()).serialize(item, entity.getEntityClass()));
sb.append("\n\n");
}
content = sb.toString();
} else {
content = this.adapters.get(entity.getName()).serialize(object, entity.getEntityClass());
}
httpContext.response(HttpStatus.S_200, this.responseHeaders(), content);
}
return httpContext;
}
@Override
public HttpContext deserialize(HttpContext httpContext, Model model, Configuration configuration) throws SerializationException {
this.registerModel(model, configuration);
Entity entity = this.entity(httpContext, model);
String content = httpContext.getRequestContent();
if (content == null || content.isEmpty()) {
return httpContext;
}
throw new SerializationException(HttpStatus.S_406);
}
private Entity entity(HttpContext httpContext, Model model) throws SerializationException {
String name = this.entityName(httpContext, model);
Entity entity = model.entityForName(name);
if (entity == null) {
throw new SerializationException();
}
return entity;
}
private String entityName(HttpContext httpContext, Model model) {
return model.getName() + "." + httpContext.getRouter().getResource();
}
private HttpHeaders responseHeaders() {
List<HttpHeader> headers = new LinkedList<>();
List<HttpHeaderValue> values = new LinkedList<>();
values.add(new HttpHeaderValue(MIME));
headers.add(HttpHeader.create(HttpHeaders.ContentType, values));
return new HttpHeaders(headers);
}
private void registerModel(Model model, Configuration configuration) {
if (this.adapters == null) {
this.adapters = new HashMap<>();
for (Entity entity : model.getEntities().values()) {
this.adapters.put(entity.getName(), new EntitySerializer(entity, model, configuration));
}
}
}
}