package ch.alv.components.web.dto;
import ch.alv.components.core.beans.Identifiable;
import ch.alv.components.core.beans.mapper.BeanMapper;
import ch.alv.components.core.utils.StringHelper;
import ch.alv.components.web.context.ServletRequestProvider;
import ch.alv.components.web.endpoint.Endpoint;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.hateoas.Link;
import javax.annotation.Resource;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Default implementation of the {@link ch.alv.components.web.dto.DtoFactory} interface.
*
* @since 1.0.0
*/
public class DefaultDtoFactory implements DtoFactory {
@Resource
private BeanMapper mapper;
@Resource
private ServletRequestProvider requestProvider;
@Override
public Dto createDtoFromRequestBody(String requestBody, Endpoint endpoint) {
if (StringHelper.isEmpty(requestBody)) {
throw new DtoFactoryException("requestBody param must not be empty.");
}
Pattern pattern = Pattern.compile("\\{(.*?)\\}");
Matcher matcher = pattern.matcher(requestBody);
if (matcher.find()) {
String value = matcher.group();
value = value.substring(1);
value = value.substring(0, value.length()-1);
if (StringHelper.isEmpty(value)) {
throw new DtoFactoryException("Illegal string source.");
}
}
if (endpoint == null) {
throw new IllegalArgumentException("Endpoint must not be null.");
}
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readValue(requestBody, endpoint.getDtoClass());
} catch (Exception e) {
throw new DtoFactoryException("Error while creating Dto of type " + endpoint.getDtoClass().getName()
+ " from requestBody '" + requestBody + "'.", e);
}
}
@Override
public Dto createDtoFromEntity(Identifiable entity, Endpoint endpoint) {
if (entity == null) {
return null;
}
Dto dto = mapper.mapObject(entity, endpoint.getDtoClass());
dto.getLinks().add(new Link(createURL(entity, endpoint)));
return dto;
}
private String createURL(Identifiable entity, Endpoint endpoint) {
String languageSuffix = "";
if (requestProvider.getLanguage() != null) {
languageSuffix = "?language=" + requestProvider.getLanguage();
}
return requestProvider.getBasePath() + endpoint.getModuleName() + "/" + endpoint.getStoreName() + "/" + entity.getId() + languageSuffix;
}
}