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

org.opentripplanner.service.vehicleparking.internal.DefaultVehicleParkingRepository Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.service.vehicleparking.internal;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimap;
import jakarta.inject.Inject;
import jakarta.inject.Singleton;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.opentripplanner.service.vehicleparking.VehicleParkingRepository;
import org.opentripplanner.service.vehicleparking.model.VehicleParking;
import org.opentripplanner.service.vehicleparking.model.VehicleParkingGroup;

@Singleton
public class DefaultVehicleParkingRepository implements VehicleParkingRepository {

  @Inject
  public DefaultVehicleParkingRepository() {}

  /**
   * To ensure that his is thread-safe, the set stored here should always be immutable.
   * 

* The volatile keyword is used to ensure safe publication by clearing CPU caches. */ private volatile Set vehicleParkings = Set.of(); /** * To ensure that his is thread-safe, {@link ImmutableListMultimap} is used. *

* The volatile keyword is used to ensure safe publication by clearing CPU caches. */ private volatile ImmutableListMultimap vehicleParkingGroups = ImmutableListMultimap.of(); /** * Does atomic update of {@link VehicleParking} and index of {@link VehicleParkingGroup} in this * service by replacing the existing with a new copy that includes old ones that were not removed * in the update and the new ones that were added in the update. */ @Override public void updateVehicleParking( Collection parkingToAdd, Collection parkingToRemove ) { Multimap updatedVehicleParkingGroups = ArrayListMultimap.create(vehicleParkingGroups); parkingToRemove.forEach(vehicleParking -> { var vehicleParkingGroup = vehicleParking.getVehicleParkingGroup(); if (vehicleParkingGroup != null) { updatedVehicleParkingGroups.remove(vehicleParking.getVehicleParkingGroup(), vehicleParking); } }); parkingToAdd.forEach(vehicleParking -> { var vehicleParkingGroup = vehicleParking.getVehicleParkingGroup(); if (vehicleParkingGroup != null) { updatedVehicleParkingGroups.put(vehicleParking.getVehicleParkingGroup(), vehicleParking); } }); vehicleParkingGroups = ImmutableListMultimap.copyOf(updatedVehicleParkingGroups); Set updatedVehicleParkings = new HashSet<>(vehicleParkings); updatedVehicleParkings.removeAll(parkingToRemove); updatedVehicleParkings.addAll(parkingToAdd); vehicleParkings = Set.copyOf(updatedVehicleParkings); } @Override public Collection listVehicleParkings() { return Set.copyOf(vehicleParkings); } @Override public ListMultimap getVehicleParkingGroups() { return vehicleParkingGroups; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy