package io.katharsis.repository.annotated; import io.katharsis.queryParams.QueryParams; import io.katharsis.repository.ParametersFactory; import io.katharsis.repository.annotations.JsonApiAddRelations; import io.katharsis.repository.annotations.JsonApiFindManyTargets; import io.katharsis.repository.annotations.JsonApiFindOneTarget; import io.katharsis.repository.annotations.JsonApiRemoveRelations; import io.katharsis.repository.annotations.JsonApiSetRelation; import io.katharsis.repository.annotations.JsonApiSetRelations; import io.katharsis.utils.ClassUtils; import java.io.Serializable; import java.lang.reflect.Method; public class AnnotatedRelationshipRepositoryAdapter<T, T_ID extends Serializable, D, D_ID extends Serializable> extends AnnotatedRepositoryAdapter<T>{ private Method setRelationMethod; private Method setRelationsMethod; private Method addRelationsMethod; private Method removeRelationsMethod; private Method findOneTargetMethod; private Method findManyTargetsMethod; public AnnotatedRelationshipRepositoryAdapter(Object implementationObject, ParametersFactory parametersFactory) { super(implementationObject, parametersFactory); } public void setRelation(T source, D_ID targetId, String fieldName, QueryParams queryParams) { Class<JsonApiSetRelation> annotationType = JsonApiSetRelation.class; if (setRelationMethod == null) { setRelationMethod = ClassUtils.findMethodWith(implementationClass, annotationType); } invokeOperation(setRelationMethod, annotationType, new Object[]{source, targetId, fieldName}, queryParams); } public void setRelations(T source, Iterable<D_ID> targetIds, String fieldName, QueryParams queryParams) { Class<JsonApiSetRelations> annotationType = JsonApiSetRelations.class; if (setRelationsMethod == null) { setRelationsMethod = ClassUtils.findMethodWith(implementationClass, annotationType); } invokeOperation(setRelationsMethod, annotationType, new Object[]{source, targetIds, fieldName}, queryParams); } public void addRelations(T source, Iterable<D_ID> targetIds, String fieldName, QueryParams queryParams) { Class<JsonApiAddRelations> annotationType = JsonApiAddRelations.class; if (addRelationsMethod == null) { addRelationsMethod = ClassUtils.findMethodWith(implementationClass, annotationType); } invokeOperation(addRelationsMethod, annotationType, new Object[]{source, targetIds, fieldName}, queryParams); } public void removeRelations(T source, Iterable<D_ID> targetIds, String fieldName, QueryParams queryParams) { Class<JsonApiRemoveRelations> annotationType = JsonApiRemoveRelations.class; if (removeRelationsMethod == null) { removeRelationsMethod = ClassUtils.findMethodWith(implementationClass, annotationType); } invokeOperation(removeRelationsMethod, annotationType, new Object[]{source, targetIds, fieldName}, queryParams); } public Object findOneTarget(T_ID sourceId, String fieldName, QueryParams queryParams) { Class<JsonApiFindOneTarget> annotationType = JsonApiFindOneTarget.class; if (findOneTargetMethod == null) { findOneTargetMethod = ClassUtils.findMethodWith(implementationClass, annotationType); } return invokeOperation(findOneTargetMethod, annotationType, new Object[]{sourceId, fieldName}, queryParams); } public Object findManyTargets(T_ID sourceId, String fieldName, QueryParams queryParams) { Class<JsonApiFindManyTargets> annotationType = JsonApiFindManyTargets.class; if (findManyTargetsMethod == null) { findManyTargetsMethod = ClassUtils.findMethodWith(implementationClass, annotationType); } return invokeOperation(findManyTargetsMethod, annotationType, new Object[]{sourceId, fieldName}, queryParams); } }