View Javadoc
1   package org.opentrafficsim.editor.extensions;
2   
3   import java.awt.Color;
4   import java.util.LinkedHashMap;
5   import java.util.Map;
6   
7   import org.djunits.value.vdouble.scalar.Angle;
8   import org.djunits.value.vdouble.scalar.Direction;
9   import org.djunits.value.vdouble.scalar.Length;
10  import org.djunits.value.vdouble.scalar.LinearDensity;
11  import org.djutils.draw.point.Point2d;
12  import org.djutils.exceptions.Throw;
13  import org.opentrafficsim.base.OtsRuntimeException;
14  import org.opentrafficsim.base.StripeElement.StripeLateralSync;
15  import org.opentrafficsim.xml.bindings.AngleAdapter;
16  import org.opentrafficsim.xml.bindings.ArcDirectionAdapter;
17  import org.opentrafficsim.xml.bindings.BooleanAdapter;
18  import org.opentrafficsim.xml.bindings.ColorAdapter;
19  import org.opentrafficsim.xml.bindings.DirectionAdapter;
20  import org.opentrafficsim.xml.bindings.DoubleAdapter;
21  import org.opentrafficsim.xml.bindings.DoublePositiveAdapter;
22  import org.opentrafficsim.xml.bindings.DoublePositiveInclusiveAdapter;
23  import org.opentrafficsim.xml.bindings.ExpressionAdapter;
24  import org.opentrafficsim.xml.bindings.IntegerAdapter;
25  import org.opentrafficsim.xml.bindings.LengthAdapter;
26  import org.opentrafficsim.xml.bindings.LengthBeginEndAdapter;
27  import org.opentrafficsim.xml.bindings.LinearDensityAdapter;
28  import org.opentrafficsim.xml.bindings.Point2dAdapter;
29  import org.opentrafficsim.xml.bindings.StringAdapter;
30  import org.opentrafficsim.xml.bindings.StripeLateralSyncAdapter;
31  import org.opentrafficsim.xml.bindings.types.ArcDirectionType.ArcDirection;
32  import org.opentrafficsim.xml.bindings.types.ExpressionType;
33  import org.opentrafficsim.xml.bindings.types.LengthBeginEndType.LengthBeginEnd;
34  
35  /**
36   * Class that houses static instances of adapters, for common usage within the editor.
37   * <p>
38   * Copyright (c) 2023-2026 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
39   * BSD-style license. See <a href="https://opentrafficsim.org/docs/license.html">OpenTrafficSim License</a>.
40   * </p>
41   * @author Alexander Verbraeck
42   * @author Wouter Schakel
43   */
44  public final class Adapters
45  {
46  
47      /** Map of adapters per output type. */
48      private static final Map<Class<?>, ExpressionAdapter<?, ?>> ADAPTERS = new LinkedHashMap<>();
49  
50      /** Adapter for positive doubles, excluding 0.0. */
51      public static final DoublePositiveAdapter DOUBLE_POSITIVE_ADAPTER = new DoublePositiveAdapter();
52  
53      /** Adapter for positive doubles, including 0.0. */
54      public static final DoublePositiveInclusiveAdapter DOUBLE_POSITIVE_INCLUSIVE_ADAPTER = new DoublePositiveInclusiveAdapter();
55  
56      static
57      {
58          ADAPTERS.put(Angle.class, new AngleAdapter());
59          ADAPTERS.put(ArcDirection.class, new ArcDirectionAdapter());
60          ADAPTERS.put(Boolean.class, new BooleanAdapter());
61          ADAPTERS.put(Color.class, new ColorAdapter());
62          ADAPTERS.put(Direction.class, new DirectionAdapter());
63          ADAPTERS.put(Double.class, new DoubleAdapter());
64          ADAPTERS.put(Integer.class, new IntegerAdapter());
65          ADAPTERS.put(Length.class, new LengthAdapter());
66          ADAPTERS.put(LengthBeginEnd.class, new LengthBeginEndAdapter());
67          ADAPTERS.put(LinearDensity.class, new LinearDensityAdapter());
68          ADAPTERS.put(Point2d.class, new Point2dAdapter());
69          ADAPTERS.put(String.class, new StringAdapter());
70          ADAPTERS.put(StripeLateralSync.class, new StripeLateralSyncAdapter());
71      }
72  
73      /** Constructor. */
74      private Adapters()
75      {
76  
77      }
78  
79      /**
80       * Returns an adapter for the given class. Adapters are only provided for known classes. This is to limit the number of
81       * adapters in memory, as these are stateless. Adapters are available for: Angle, ArcDirection, Boolean, Direction, Double,
82       * Integer, Length, LinearDensity, Point2d, String, and Stripe.Type.
83       * @param <T> output type of the adapter.
84       * @param <E> expression type of the adapter.
85       * @param clazz class of the output type of the adapter.
86       * @return adapter.
87       */
88      @SuppressWarnings("unchecked")
89      public static <T, E extends ExpressionType<T>> ExpressionAdapter<T, E> get(final Class<T> clazz)
90      {
91          Throw.when(!ADAPTERS.containsKey(clazz), OtsRuntimeException.class,
92                  "No adapter for class %s available. Add it in the static code block of MapData or create one directly.");
93          return (ExpressionAdapter<T, E>) ADAPTERS.get(clazz);
94      }
95  
96      /**
97       * Add an adapter for the given class.
98       * @param <T> output type of the adapter.
99       * @param <E> expression type of the adapter.
100      * @param clazz class of the output type of the adapter.
101      * @param adapter adapter.
102      */
103     public static <T, E extends ExpressionType<T>> void set(final Class<T> clazz, final ExpressionAdapter<T, E> adapter)
104     {
105         Throw.whenNull(clazz, "Class may not be null.");
106         Throw.whenNull(adapter, "Adapter may not be null.");
107         ADAPTERS.put(clazz, adapter);
108     }
109 
110 }