All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.thorbenkuck.keller.repository.FinalizerImpl Maven / Gradle / Ivy

The newest version!
package com.github.thorbenkuck.keller.repository;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;

final class FinalizerImpl implements Finalizer {

	private final RepositoryInternals repositoryInternals;
	private final ActionStack actionStack;

	public FinalizerImpl(final ActionStack actionStack) {
		this.repositoryInternals = actionStack.getInternals();
		this.actionStack = actionStack;
	}

	@Override
	public T getFirst() {
		final Optional optional = getFilteredStream().findFirst();
		return handle(optional);
	}

	@Override
	public T getAny() {
		final Optional optional = getFilteredStream().findAny();
		return handle(optional);
	}
	
	private T handle(final Optional objectOptional) {
		if(objectOptional.isPresent()) {
			actionStack.getIfPresent().forEach(Runnable::run);
			return (T) objectOptional.get();
		} else {
			actionStack.getIfNotPresent().forEach(Runnable::run);
			return actionStack.getNullObject();
		}
	}

	@Override
	public Collection getAll() {
		final List objects = getFilteredStream().collect(Collectors.toCollection(ArrayList::new));
		return (Collection) objects;
	}

	@Override
	public T run(final Consumer consumer) {
		return null;
	}

	@Override
	public T run(final Runnable runnable) {
		return null;
	}

	private Stream getFilteredStream() {
		return repositoryInternals.stream()
				.filter(o -> o.getClass().equals(actionStack.getType()))
				.filter(o -> actionStack.getPredicateList().stream()
						.filter(predicate -> predicate.test((T) o))
						.count() == actionStack.getPredicateList().size());
	}
}