package io.katharsis.resource.registry.responseRepository;
import io.katharsis.queryParams.QueryParams;
import io.katharsis.repository.RelationshipRepository;
import io.katharsis.repository.annotated.AnnotatedRelationshipRepositoryAdapter;
import io.katharsis.response.JsonApiResponse;
import java.io.Serializable;
/**
* A repository adapter for relationship repository.
*/
@SuppressWarnings("unchecked")
public class RelationshipRepositoryAdapter<T, T_ID extends Serializable, D, D_ID extends Serializable>
extends ResponseRepository {
private final Object relationshipRepository;
private final boolean isAnnotated;
public RelationshipRepositoryAdapter(Object relationshipRepository) {
this.relationshipRepository = relationshipRepository;
this.isAnnotated = relationshipRepository instanceof AnnotatedRelationshipRepositoryAdapter;
}
public JsonApiResponse setRelation(T source, D_ID targetId, String fieldName, QueryParams queryParams) {
if (isAnnotated) {
((AnnotatedRelationshipRepositoryAdapter) relationshipRepository)
.setRelation(source, targetId, fieldName, queryParams);
} else {
((RelationshipRepository) relationshipRepository).setRelation(source, targetId, fieldName);
}
return new JsonApiResponse();
}
public JsonApiResponse setRelations(T source, Iterable<D_ID> targetIds, String fieldName, QueryParams queryParams) {
if (isAnnotated) {
((AnnotatedRelationshipRepositoryAdapter) relationshipRepository)
.setRelations(source, targetIds, fieldName, queryParams);
} else {
((RelationshipRepository) relationshipRepository).setRelations(source, targetIds, fieldName);
}
return new JsonApiResponse();
}
public JsonApiResponse addRelations(T source, Iterable<D_ID> targetIds, String fieldName, QueryParams queryParams) {
if (isAnnotated) {
((AnnotatedRelationshipRepositoryAdapter) relationshipRepository)
.addRelations(source, targetIds, fieldName, queryParams);
} else {
((RelationshipRepository) relationshipRepository).addRelations(source, targetIds, fieldName);
}
return new JsonApiResponse();
}
public JsonApiResponse removeRelations(T source, Iterable<D_ID> targetIds, String fieldName, QueryParams queryParams) {
if (isAnnotated) {
((AnnotatedRelationshipRepositoryAdapter) relationshipRepository)
.removeRelations(source, targetIds, fieldName, queryParams);
} else {
((RelationshipRepository) relationshipRepository).removeRelations(source, targetIds, fieldName);
}
return new JsonApiResponse();
}
public JsonApiResponse findOneTarget(T_ID sourceId, String fieldName, QueryParams queryParams) {
Object resource;
if (isAnnotated) {
resource = ((AnnotatedRelationshipRepositoryAdapter) relationshipRepository)
.findOneTarget(sourceId, fieldName, queryParams);
} else {
resource = ((RelationshipRepository) relationshipRepository)
.findOneTarget(sourceId, fieldName, queryParams);
}
return getResponse(relationshipRepository, resource, queryParams);
}
public JsonApiResponse findManyTargets(T_ID sourceId, String fieldName, QueryParams queryParams) {
Object resources;
if (isAnnotated) {
resources = ((AnnotatedRelationshipRepositoryAdapter) relationshipRepository)
.findManyTargets(sourceId, fieldName, queryParams);
} else {
resources = ((RelationshipRepository) relationshipRepository)
.findManyTargets(sourceId, fieldName, queryParams);
}
return getResponse(relationshipRepository, resources, queryParams);
}
}