@Override public <T> Optional<T> invokeFindById(Object id) { Method method = methods.getFindOneMethod()// .orElseThrow(() -> new IllegalStateException("Repository doesn't have a find-one-method declared!")); return returnAsOptional(invoke(method, convertId(id))); }
@Override public Iterable<Object> invokeFindAll(Pageable pageable) { return invokeFindAllReflectively(pageable); }
@Override public void invokeDeleteById(Object id) { Assert.notNull(id, "Identifier must not be null!"); Method method = methods.getDeleteMethod() .orElseThrow(() -> new IllegalStateException("Repository doesn't have a delete-method declared!")); if (method.getName().endsWith("ById")) { invoke(method, convertId(id)); } else { invoke(method, this.<Object> invokeFindById(id).orElse(null)); } }
@Override public Optional<Object> invokeQueryMethod(Method method, MultiValueMap<String, ? extends Object> parameters, Pageable pageable, Sort sort) { Assert.notNull(method, "Method must not be null!"); Assert.notNull(parameters, "Parameters must not be null!"); Assert.notNull(pageable, "Pageable must not be null!"); Assert.notNull(sort, "Sort must not be null!"); ReflectionUtils.makeAccessible(method); return returnAsOptional(invoke(method, prepareParameters(method, parameters, pageable, sort))); }
protected Iterable<Object> invokeFindAllReflectively(Pageable pageable) { Method method = methods.getFindAllMethod() .orElseThrow(() -> new IllegalStateException("Repository doesn't have a find-all-method declared!")); Class<?>[] types = method.getParameterTypes(); if (types.length == 0) { return invokeForNonNullResult(method); } if (Pageable.class.isAssignableFrom(types[0])) { return invokeForNonNullResult(method, pageable); } return invokeFindAll(pageable.getSort()); }
private Object[] prepareParameters(Method method, MultiValueMap<String, ? extends Object> rawParameters, Pageable pageable, Sort sort) { List<MethodParameter> parameters = new MethodParameters(method, Optional.of(PARAM_ANNOTATION)).getParameters(); if (parameters.isEmpty()) { return new Object[0]; } Object[] result = new Object[parameters.size()]; Sort sortToUse = pageable.getSortOr(sort); for (int i = 0; i < result.length; i++) { MethodParameter param = parameters.get(i); Class<?> targetType = param.getParameterType(); if (Pageable.class.isAssignableFrom(targetType)) { result[i] = pageable; } else if (Sort.class.isAssignableFrom(targetType)) { result[i] = sortToUse; } else { String parameterName = param.getParameterName(); if (!StringUtils.hasText(parameterName)) { throw new IllegalArgumentException(String.format(NAME_NOT_FOUND, ClassUtils.getQualifiedMethodName(method))); } Object value = unwrapSingleElement(rawParameters.get(parameterName)); result[i] = targetType.isInstance(value) ? value : convert(value, param); } } return result; }
protected Iterable<Object> invokeFindAllReflectively(Sort sort) { Method method = methods.getFindAllMethod() .orElseThrow(() -> new IllegalStateException("Repository doesn't have a find-all-method declared!")); if (method.getParameterCount() == 0) { return invokeForNonNullResult(method); } return invokeForNonNullResult(method, sort); }
@Override public Iterable<Object> invokeFindAll(Pageable pageable) { return customFindAllMethod ? super.invokeFindAll(pageable) : repository.findAll(); }
private <T> T invokeForNonNullResult(Method method, Object... arguments) { T result = invoke(method, arguments); if (result == null) { throw new IllegalStateException(String.format("Invocation of method %s(%s) on %s unexpectedly returned null!", method, Arrays.toString(arguments), repository)); } return result; }
@Override public <T> T invokeSave(T entity) { return customSaveMethod ? super.invokeSave(entity) : repository.save(entity); }
@Override public void invokeDeleteById(Object id) { if (customDeleteMethod) { super.invokeDeleteById(id); } else { repository.deleteById(convertId(id)); } }
@SuppressWarnings("unchecked") protected RepositoryInvoker createInvoker(RepositoryInformation information, Object repository) { if (repository instanceof PagingAndSortingRepository) { return new PagingAndSortingRepositoryInvoker((PagingAndSortingRepository<Object, Object>) repository, information, conversionService); } else if (repository instanceof CrudRepository) { return new CrudRepositoryInvoker((CrudRepository<Object, Object>) repository, information, conversionService); } else { return new ReflectionRepositoryInvoker(repository, information, conversionService); } } }
@Override @SuppressWarnings("unchecked") public <T> Optional<T> invokeFindById(Object id) { return customFindOneMethod ? super.invokeFindById(id) : (Optional<T>) repository.findById(convertId(id)); }
@Override public <T> T invokeSave(T object) { Method method = methods.getSaveMethod()// .orElseThrow(() -> new IllegalStateException("Repository doesn't have a save-method declared!")); return invokeForNonNullResult(method, object); }
@Override public Iterable<Object> invokeFindAll(Sort sort) { return customFindAllMethod ? super.invokeFindAll(sort) : repository.findAll(); }
@Override public Iterable<Object> invokeFindAll(Sort sort) { return invokeFindAllReflectively(sort); }