package io.katharsis.repository.annotated; import io.katharsis.queryParams.QueryParams; import io.katharsis.repository.ParametersFactory; import io.katharsis.repository.annotations.JsonApiDelete; import io.katharsis.repository.annotations.JsonApiFindAll; import io.katharsis.repository.annotations.JsonApiFindAllWithIds; import io.katharsis.repository.annotations.JsonApiFindOne; import io.katharsis.repository.annotations.JsonApiSave; import io.katharsis.utils.ClassUtils; import java.io.Serializable; import java.lang.reflect.Method; /** * An adapter for annotation-based resource repository. Stores references to repository methods and call o proper one * when a repository method has to be called. This class is instantiated in {@link io.katharsis.repository.RepositoryInstanceBuilder} */ public class AnnotatedResourceRepositoryAdapter<T, ID extends Serializable> extends AnnotatedRepositoryAdapter<T> { private Method findOneMethod; private Method findAllMethod; private Method findAllWithIds; private Method saveMethod; private Method deleteMethod; public AnnotatedResourceRepositoryAdapter(Object implementationObject, ParametersFactory parametersFactory) { super(implementationObject, parametersFactory); } public Object findOne(ID id, QueryParams queryParams) { Class<JsonApiFindOne> annotationType = JsonApiFindOne.class; if (findOneMethod == null) { findOneMethod = ClassUtils.findMethodWith(implementationClass, annotationType); } return invokeOperation(findOneMethod, annotationType, new Object[]{id}, queryParams); } public Object findAll(QueryParams queryParams) { Class<JsonApiFindAll> annotationType = JsonApiFindAll.class; if (findAllMethod == null) { findAllMethod = ClassUtils.findMethodWith(implementationClass, annotationType); } return invokeOperation(findAllMethod, annotationType, new Object[]{}, queryParams); } public Object findAll(Iterable<ID> ids, QueryParams queryParams) { Class<JsonApiFindAllWithIds> annotationType = JsonApiFindAllWithIds.class; if (findAllWithIds == null) { findAllWithIds = ClassUtils.findMethodWith(implementationClass, annotationType); } return invokeOperation(findAllWithIds, annotationType, new Object[]{ids}, queryParams); } public <S extends T> Object save(S entity) { Class<JsonApiSave> annotationType = JsonApiSave.class; if (saveMethod == null) { saveMethod = ClassUtils.findMethodWith(implementationClass, annotationType); } return invokeOperation(saveMethod, annotationType, new Object[]{entity}); } public void delete(ID id, QueryParams queryParams) { Class<JsonApiDelete> annotationType = JsonApiDelete.class; if (deleteMethod == null) { deleteMethod = ClassUtils.findMethodWith(implementationClass, annotationType); } invokeOperation(deleteMethod, annotationType, new Object[]{id}, queryParams); } }