AbstractTransceiver.java

  1. package org.opentrafficsim.sim0mq.publisher;

  2. import org.djunits.Throw;
  3. import org.djutils.metadata.MetaData;

  4. /**
  5.  * Common code for most implementations of TranceiverInterface.
  6.  * <p>
  7.  * Copyright (c) 2020-2020 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
  8.  * BSD-style license. See <a href="http://opentrafficsim.org/docs/current/license.html">OpenTrafficSim License</a>.
  9.  * </p>
  10.  * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
  11.  * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
  12.  * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
  13.  */
  14. public abstract class AbstractTransceiver implements TransceiverInterface
  15. {
  16.     /** The address field descriptors. */
  17.     private final MetaData addressFields;

  18.     /** The result field descriptors. */
  19.     private final MetaData resultFields;

  20.     /** The id of the AbstractTransceiver. */
  21.     private final String id;

  22.     /**
  23.      * Construct a new AbstractTransceiver.
  24.      * @param id String; the id of the new AbstractTransceiver
  25.      * @param addressFields MetaData; description of the elements of an address that the <code>get</code> method of this
  26.      *            AbstractTransceiver can handle
  27.      * @param resultFields MetaData; description of the result of the <code>get</code> method
  28.      */
  29.     public AbstractTransceiver(final String id, final MetaData addressFields, final MetaData resultFields)
  30.     {
  31.         Throw.whenNull(id, "id may not be null");
  32.         Throw.whenNull(addressFields, "addressFieldDescriptors may not be null");
  33.         Throw.whenNull(resultFields, "resultFieldDescriptors may not be null");
  34.         this.id = id;
  35.         this.addressFields = addressFields;
  36.         this.resultFields = resultFields;
  37.     }

  38.     /** {@inheritDoc} */
  39.     @Override
  40.     public final String getId()
  41.     {
  42.         return this.id;
  43.     }

  44.     /** {@inheritDoc} */
  45.     @Override
  46.     public final MetaData getAddressFields()
  47.     {
  48.         return this.addressFields;
  49.     }

  50.     /** {@inheritDoc} */
  51.     @Override
  52.     public final MetaData getResultFields()
  53.     {
  54.         return this.resultFields;
  55.     }

  56.     /**
  57.      * Verify the composition of an Object[].
  58.      * @param metaData MetaData; the expected composition
  59.      * @param address Object[]; the object array that must be verified
  60.      * @return String; null if metaData is OK; descriptive text on error
  61.      */
  62.     public static String verifyMetaData(final MetaData metaData, final Object[] address)
  63.     {
  64.         if (metaData.size() == 0 && (address == null || address.length == 0))
  65.         {
  66.             return null;
  67.         }
  68.         if (metaData.equals(MetaData.NO_META_DATA)) // anything goes
  69.         {
  70.             return null;
  71.         }
  72.         if (null == address)
  73.         {
  74.             return ("Address may not be null");
  75.         }
  76.         if (address.length != metaData.size())
  77.         {
  78.             return String.format("Address for %s has wrong length (expected %d address element%s, got %d address element%s)",
  79.                     metaData.getName(), metaData.size(), metaData.size() != 1 ? "s" : "", address.length,
  80.                     address.length != 1 ? "s" : "");
  81.         }
  82.         for (int index = 0; index < address.length; index++)
  83.         {
  84.             Object object = address[index];
  85.             if ((null != object) && (!(metaData.getObjectClass(index).isAssignableFrom(object.getClass()))))
  86.             {
  87.                 return String.format("objectArray[%d] (%s) cannot be used for %s", index, address[index],
  88.                         metaData.getObjectClass(index).getName());
  89.             }
  90.         }
  91.         return null;
  92.     }

  93.     /** {@inheritDoc} */
  94.     @Override
  95.     public String toString()
  96.     {
  97.         return "AbstractTransceiver [id=" + this.id + ", addressFields=" + this.addressFields + ", resultFields="
  98.                 + this.resultFields + "]";
  99.     }

  100. }