
org.opentripplanner.service.vehiclerental.street.CompositeRentalRestrictionExtension Maven / Gradle / Ivy
The newest version!
package org.opentripplanner.service.vehiclerental.street;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.opentripplanner.street.model.RentalRestrictionExtension;
import org.opentripplanner.street.search.state.State;
/**
* Combines multiple restrictions into one.
*/
public final class CompositeRentalRestrictionExtension implements RentalRestrictionExtension {
private final RentalRestrictionExtension[] extensions;
private CompositeRentalRestrictionExtension(RentalRestrictionExtension... extensions) {
for (var ext : extensions) {
if (ext instanceof CompositeRentalRestrictionExtension) {
throw new IllegalArgumentException(
"Composite extension cannot be nested into one another."
);
}
}
var set = new HashSet<>(Arrays.asList(extensions));
this.extensions = set.toArray(RentalRestrictionExtension[]::new);
}
@Override
public boolean traversalBanned(State state) {
for (var ext : extensions) {
if (ext.traversalBanned(state)) {
return true;
}
}
return false;
}
@Override
public boolean dropOffBanned(State state) {
for (var ext : extensions) {
if (ext.dropOffBanned(state)) {
return true;
}
}
return false;
}
@Override
public Set debugTypes() {
var set = EnumSet.noneOf(RestrictionType.class);
for (var ext : extensions) {
set.addAll(ext.debugTypes());
}
return set;
}
@Override
public RentalRestrictionExtension add(RentalRestrictionExtension other) {
return CompositeRentalRestrictionExtension.of(this, other);
}
public static RentalRestrictionExtension of(RentalRestrictionExtension... exts) {
var set = Arrays.stream(exts).flatMap(e -> e.toList().stream()).collect(Collectors.toSet());
if (set.size() == 1) {
return List.copyOf(set).get(0);
} else {
return new CompositeRentalRestrictionExtension(
set.toArray(RentalRestrictionExtension[]::new)
);
}
}
@Override
public RentalRestrictionExtension remove(RentalRestrictionExtension toRemove) {
var newExts = Arrays.stream(extensions)
.filter(e -> !e.equals(toRemove))
.toArray(RentalRestrictionExtension[]::new);
if (newExts.length == 0) {
return null;
} else {
return CompositeRentalRestrictionExtension.of(newExts);
}
}
@Override
public List toList() {
return List.copyOf(Arrays.asList(extensions));
}
@Override
public boolean hasRestrictions() {
return extensions.length > 0;
}
@Override
public Set noDropOffNetworks() {
return Arrays.stream(extensions)
.flatMap(e -> e.noDropOffNetworks().stream())
.collect(Collectors.toSet());
}
@Override
public List networks() {
return Arrays.stream(extensions).flatMap(e -> e.networks().stream()).toList();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy