/** * Invoke {@link Method} by resolving the * * @param method * @param args * @return * @throws Throwable */ public Object invoke(Method method, Object[] args) throws Throwable { RepositoryFragment<?> fragment = fragmentCache.computeIfAbsent(method, key -> { return stream().filter(it -> it.hasMethod(key)) // .filter(it -> it.getImplementation().isPresent()) // .findFirst() .orElseThrow(() -> new IllegalArgumentException(String.format("No fragment found for method %s", key))); }); Object target = fragment.getImplementation().orElseThrow( () -> new IllegalArgumentException(String.format("No implementation found for method %s", method))); return method.invoke(target, args); }
/** * @return {@link Stream} of {@link Method methods}. */ public Stream<Method> methods() { return stream().flatMap(RepositoryFragment::methods); }
/** * Create new {@link RepositoryFragments} from the current content appending {@link RepositoryFragment}. * * @param fragment must not be {@literal null} * @return the new {@link RepositoryFragments} containing all existing fragments and the given * {@link RepositoryFragment} as last element. */ public RepositoryFragments append(RepositoryFragment<?> fragment) { Assert.notNull(fragment, "RepositoryFragment must not be null!"); return concat(stream(), Stream.of(fragment)); }
/** * Validates that all {@link RepositoryFragment fragments} have an implementation. */ public void validateImplementation() { fragments.stream().forEach(it -> it.getImplementation() // .orElseThrow(() -> new IllegalStateException(String.format("Fragment %s has no implementation.", ClassUtils.getQualifiedName(it.getSignatureContributor()))))); }
/** * Create new {@link RepositoryFragments} from the current content appending {@link RepositoryFragments}. * * @param fragments must not be {@literal null} * @return the new {@link RepositoryFragments} containing all existing fragments and the given * {@link RepositoryFragments} as last elements. */ public RepositoryFragments append(RepositoryFragments fragments) { Assert.notNull(fragments, "RepositoryFragments must not be null!"); return concat(stream(), fragments.stream()); }