package io.katharsis.resource.registry.responseRepository;
import io.katharsis.queryParams.QueryParams;
import io.katharsis.repository.LinksRepository;
import io.katharsis.repository.MetaRepository;
import io.katharsis.repository.annotated.AnnotatedRepositoryAdapter;
import io.katharsis.response.JsonApiResponse;
import io.katharsis.response.LinksInformation;
import io.katharsis.response.MetaInformation;
import java.util.Collections;
/**
* The adapter is used to create a common layer between controllers and repositories. Every repository can return either
* a resource object or a {@link JsonApiResponse} response which should be returned by a controller. Ok, the last
* sentence is not 100% true since interface based repositories can return only resources, but who's using it anyway?
*
* The methods need to know if a repository is interface- or annotation-based since repository methods have different
* signatures.
*/
public abstract class ResponseRepository {
protected JsonApiResponse getResponse(Object repository, Object resource, QueryParams queryParams) {
if (resource instanceof JsonApiResponse) {
return (JsonApiResponse) resource;
}
Iterable resources;
if (resource instanceof Iterable) {
resources = (Iterable) resource;
} else {
resources = Collections.singletonList(resource);
}
MetaInformation metaInformation = getMetaInformation(repository, resources, queryParams);
LinksInformation linksInformation = getLinksInformation(repository, resources, queryParams);
return new JsonApiResponse()
.setEntity(resource)
.setLinksInformation(linksInformation)
.setMetaInformation(metaInformation);
}
@SuppressWarnings("unchecked")
private MetaInformation getMetaInformation(Object repository, Iterable<?> resources, QueryParams queryParams) {
if (repository instanceof AnnotatedRepositoryAdapter) {
if (((AnnotatedRepositoryAdapter) repository).metaRepositoryAvailable()) {
return ((MetaRepository) repository).getMetaInformation(resources, queryParams);
}
} else if (repository instanceof MetaRepository) {
return ((MetaRepository) repository).getMetaInformation(resources, queryParams);
}
return null;
}
@SuppressWarnings("unchecked")
private LinksInformation getLinksInformation(Object repository, Iterable<?> resources, QueryParams queryParams) {
if (repository instanceof AnnotatedRepositoryAdapter) {
if (((AnnotatedRepositoryAdapter) repository).linksRepositoryAvailable()) {
return ((LinksRepository) repository).getLinksInformation(resources, queryParams);
}
} else if (repository instanceof LinksRepository) {
return ((LinksRepository) repository).getLinksInformation(resources, queryParams);
}
return null;
}
}