/**
* Copyright (c) 2014 - 2017 Frank Appel
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Frank Appel - initial API and implementation
*/
package com.codeaffine.eclipse.core.runtime;
import static com.codeaffine.eclipse.core.runtime.ArgumentVerification.verifyNoNullElement;
import static com.codeaffine.eclipse.core.runtime.ArgumentVerification.verifyNotNull;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toList;
import static java.util.stream.StreamSupport.stream;
import java.util.function.Predicate;
public class Predicates {
private final static Predicate<Extension> ALWAYS_TRUE = extension -> true;
private final static Predicate<Extension> ALWAYS_FALSE = extension -> false;
private final static Predicate<Extension> IS_NULL = extension -> extension == null;
private final static Predicate<Extension> NOT_NULL = not( isNull() );
public static Predicate<Extension> alwaysTrue() {
return ALWAYS_TRUE;
}
public static Predicate<Extension> alwaysFalse() {
return ALWAYS_FALSE;
}
public static Predicate<Extension> isNull() {
return IS_NULL;
}
public static Predicate<Extension> notNull() {
return NOT_NULL;
}
public static Predicate<Extension> not( Predicate<Extension> predicate ) {
verifyNotNull( predicate, "predicate" );
return predicate.negate();
}
public static Predicate<Extension> and( Iterable<? extends Predicate<Extension>> predicates ) {
verifyNotNull( predicates, "predicates" );
verifyNoNullElement( predicates, "predicates" );
return extension -> calculateAnd( predicates, extension );
}
@SafeVarargs
public static Predicate<Extension> and( Predicate<Extension> ... predicates ) {
verifyNotNull( predicates, "predicates" );
return and( asList( predicates ) );
}
@SuppressWarnings("unchecked")
public static Predicate<Extension> and( Predicate<Extension> first, Predicate<Extension> second ) {
return and( new Predicate[] { first, second } );
}
public static Predicate<Extension> or( Iterable<? extends Predicate<Extension>> predicates ) {
verifyNotNull( predicates, "predicates" );
verifyNoNullElement( predicates, "predicates" );
return extension -> calculateOr( predicates, extension );
}
@SafeVarargs
public static Predicate<Extension> or( Predicate<Extension> ... predicates ) {
verifyNotNull( predicates, "predicates" );
return or( asList( predicates ) );
}
@SuppressWarnings("unchecked")
public static Predicate<Extension> or( Predicate<Extension> first, Predicate<Extension> second ) {
return or( new Predicate[] { first, second } );
}
public static Predicate<Extension> attribute( String name, String value ) {
verifyNotNull( name, "name" );
verifyNotNull( value, "value" );
return extension -> value.equals( extension.getAttribute( name ) );
}
public static Predicate<Extension> attributeMatcher( String name, String regex ) {
verifyNotNull( name, "name" );
verifyNotNull( regex, "regex" );
return extension -> extension.getAttribute( name ) != null && extension.getAttribute( name ).matches( regex );
}
public static Predicate<Extension> attributeIsNull( String name ) {
verifyNotNull( name, "name" );
return extension -> extension.getAttribute( name ) == null;
}
public static Predicate<Extension> name( String value ) {
verifyNotNull( value, "regex" );
return extension -> value.equals( extension.getName() );
}
public static Predicate<Extension> nameMatcher( String regex ) {
verifyNotNull( regex, "regex" );
return extension -> extension.getName().matches( regex );
}
private static boolean calculateAnd( Iterable<? extends Predicate<Extension>> predicates, Extension extension ) {
return stream( predicates.spliterator(), false )
.filter( predicate -> !predicate.test( extension ) )
.collect( toList() )
.isEmpty();
}
private static boolean calculateOr( Iterable<? extends Predicate<Extension>> predicates, Extension extension ) {
return !stream( predicates.spliterator(), false )
.filter( predicate -> predicate.test( extension ) )
.collect( toList() )
.isEmpty();
}
private Predicates() {}
}