package sk.stuba.fiit.perconik.core.persistence; import java.util.Set; import com.google.common.base.Function; import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; import sk.stuba.fiit.perconik.core.Listener; import static com.google.common.base.Functions.constant; import static com.google.common.collect.Sets.newHashSet; import static sk.stuba.fiit.perconik.utilities.MoreSets.newHashSetExpectedFor; /** * Static utility methods pertaining to {@code Registration} instances. * * @author Pavol Zbell * @since 1.0 */ public final class Registrations { private Registrations() {} public static <R extends MarkableRegistration> Set<R> registered(final Iterable<R> registrations) { return selectByRegisteredStatus(registrations, true); } public static <R extends MarkableRegistration> Set<R> unregistered(final Iterable<R> registrations) { return selectByRegisteredStatus(registrations, false); } public static <R extends MarkableRegistration> Set<R> marked(final Iterable<R> registrations) { return selectByRegisteredMark(registrations, true); } public static <R extends MarkableRegistration> Set<R> unmarked(final Iterable<R> registrations) { return selectByRegisteredMark(registrations, false); } public static <R extends Registration> Set<R> selectByRegisteredStatus(final Iterable<R> registrations, final boolean status) { Set<R> result = newHashSetExpectedFor(registrations); for (R registration: registrations) { if (registration.isRegistered() == status) { result.add(registration); } } return result; } public static <R extends MarkableRegistration> Set<R> selectByRegisteredMark(final Iterable<R> registrations, final boolean status) { Set<R> result = newHashSetExpectedFor(registrations); for (R registration: registrations) { if (registration.hasRegistredMark() == status) { result.add(registration); } } return result; } public static <R extends MarkableRegistration & RegistrationMarker<R>> Set<R> applyRegisteredMark(final Iterable<R> registrations) { Set<R> result = newHashSetExpectedFor(registrations); for (R registration: registrations) { result.add(registration.applyRegisteredMark()); } return result; } public static <R extends MarkableRegistration & RegistrationMarker<R>> Set<R> updateRegisteredMark(final Iterable<R> registrations) { Set<R> result = newHashSetExpectedFor(registrations); for (R registration: registrations) { result.add(registration.updateRegisteredMark()); } return result; } public static <R extends MarkableRegistration & RegistrationMarker<R>> Set<R> markRegistered(final Iterable<R> registrations, final boolean status) { return markRegistered(registrations, constant(status)); } public static <R extends MarkableRegistration & RegistrationMarker<R>> Set<R> markRegistered(final Iterable<R> registrations, final Function<? super R, Boolean> function) { Set<R> result = newHashSetExpectedFor(registrations); for (R registration: registrations) { result.add(registration.markRegistered(function.apply(registration))); } return result; } public static <R extends Registration> Set<R> supplement(final Set<? extends R> original, final Iterable<? extends R> supplements) { Set<R> result = newHashSet(original); for (R registration: supplements) { if (!result.contains(registration)) { result.add(registration); } } return result; } public static <R extends ResourceRegistration & MarkableRegistration> SetMultimap<Class<? extends Listener>, String> toResourceNames(final Iterable<R> registrations) { SetMultimap<Class<? extends Listener>, String> result = HashMultimap.create(); for (R registration: registrations) { result.put(registration.getListenerType(), registration.getResourceName()); } return result; } public static <R extends ListenerRegistration & MarkableRegistration> Set<Class<? extends Listener>> toListenerClasses(final Iterable<R> registrations) { Set<Class<? extends Listener>> result = newHashSetExpectedFor(registrations); for (R registration: registrations) { result.add(registration.getListenerClass()); } return result; } }