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