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

org.opentcs.kernel.extensions.controlcenter.vehicles.VehicleEntry Maven / Gradle / Ivy

There is a newer version: 6.1.2
Show newest version
// SPDX-FileCopyrightText: The openTCS Authors
// SPDX-License-Identifier: MIT
package org.opentcs.kernel.extensions.controlcenter.vehicles;

import static java.util.Objects.requireNonNull;

import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import org.opentcs.data.model.Vehicle;
import org.opentcs.drivers.vehicle.VehicleCommAdapter;
import org.opentcs.drivers.vehicle.VehicleCommAdapterFactory;
import org.opentcs.drivers.vehicle.VehicleProcessModel;

/**
 * Represents a {@link Vehicle} in the {@link VehicleEntryPool}.
 */
public class VehicleEntry
    implements
      PropertyChangeListener {

  /**
   * The vehicle this entry represents.
   */
  private final Vehicle vehicle;
  /**
   * Used for implementing property change events.
   */
  @SuppressWarnings("this-escape")
  private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
  /**
   * The process model for the vehicle.
   */
  private VehicleProcessModel processModel;
  /**
   * The comm adapter factory for this vehicle.
   */
  private VehicleCommAdapterFactory commAdapterFactory = new NullVehicleCommAdapterFactory();
  /**
   * The comm adapter that is attached to this vehicle.
   */
  private VehicleCommAdapter commAdapter;

  /**
   * Creates a vehicle entry.
   *
   * @param vehicle The vehicle this entry represents.
   */
  public VehicleEntry(Vehicle vehicle) {
    this.vehicle = requireNonNull(vehicle, "vehicle");
    this.processModel = new VehicleProcessModel(vehicle);
  }

  @Override
  public void propertyChange(PropertyChangeEvent evt) {
    if (!(evt.getSource() instanceof VehicleProcessModel)) {
      return;
    }

    pcs.firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue());
  }

  /**
   * Add a property change listener.
   *
   * @param listener The listener to add.
   */
  public void addPropertyChangeListener(PropertyChangeListener listener) {
    pcs.addPropertyChangeListener(listener);
  }

  /**
   * Remove a property change listener.
   *
   * @param listener The listener to remove.
   */
  public void removePropertyChangeListener(PropertyChangeListener listener) {
    pcs.removePropertyChangeListener(listener);
  }

  /**
   * Returns the vehicle that is represented by this entry.
   *
   * @return The vehicle that is represented by this entry.
   */
  @Nonnull
  public Vehicle getVehicle() {
    return vehicle;
  }

  /**
   * Returns the name of the vehicle that is represented by this entry.
   *
   * @return The name of the vehicle that is represented by this entry.
   */
  @Nonnull
  public String getVehicleName() {
    return vehicle.getName();
  }

  /**
   * Returns the process model of the vehicle that is represented by this entry.
   *
   * @return The process model of the vehicle that is represented by this entry.
   */
  @Nonnull
  public VehicleProcessModel getProcessModel() {
    return processModel;
  }

  /**
   * Sets the process model for the vehicle represented by this entry.
   *
   * @param processModel The new process model for the vehicle.
   */
  public void setProcessModel(
      @Nonnull
      VehicleProcessModel processModel
  ) {
    VehicleProcessModel oldProcessModel = this.processModel;
    this.processModel = requireNonNull(processModel, "processModel");

    oldProcessModel.removePropertyChangeListener(this);
    processModel.addPropertyChangeListener(this);

    pcs.firePropertyChange(Attribute.PROCESS_MODEL.name(), oldProcessModel, processModel);
  }

  @Nonnull
  public VehicleCommAdapterFactory getCommAdapterFactory() {
    return commAdapterFactory;
  }

  /**
   * Sets the comm adapter factory for this entry.
   *
   * @param commAdapterFactory The new comm adapter factory.
   */
  public void setCommAdapterFactory(
      @Nonnull
      VehicleCommAdapterFactory commAdapterFactory
  ) {
    VehicleCommAdapterFactory oldValue = this.commAdapterFactory;
    this.commAdapterFactory = commAdapterFactory;

    pcs.firePropertyChange(Attribute.COMM_ADAPTER_FACTORY.name(), oldValue, commAdapterFactory);
  }

  /**
   * Returns the comm adapter factory for this entry.
   *
   * @return The comm adapter factory for this entry
   */
  @Nullable
  public VehicleCommAdapter getCommAdapter() {
    return commAdapter;
  }

  /**
   * Sets the comm adapter for this entry.
   *
   * @param commAdapter The new comm adapter.
   */
  public void setCommAdapter(
      @Nullable
      VehicleCommAdapter commAdapter
  ) {
    VehicleCommAdapter oldValue = this.commAdapter;
    this.commAdapter = commAdapter;

    pcs.firePropertyChange(Attribute.COMM_ADAPTER.name(), oldValue, commAdapter);
  }

  /**
   * Enum elements used as notification arguments to specify which argument changed.
   */
  public enum Attribute {
    /**
     * Indicates a change of the process model reference.
     */
    PROCESS_MODEL,
    /**
     * Indicates a change of the comm adapter factory reference.
     */
    COMM_ADAPTER_FACTORY,
    /**
     * Indicates a change of the comm adapter reference.
     */
    COMM_ADAPTER
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy