Change toLowerCase() to toLowerCase(Locale.ENGLISH)
[debian/openrocket] / core / src / net / sf / openrocket / simulation / FlightDataType.java
1 package net.sf.openrocket.simulation;
2
3 import java.util.HashMap;
4 import java.util.Locale;
5 import java.util.Map;
6
7 import net.sf.openrocket.l10n.Translator;
8 import net.sf.openrocket.startup.Application;
9 import net.sf.openrocket.unit.UnitGroup;
10
11 /**
12  * A class defining a storable simulation variable type.  This class defined numerous ready
13  * types, and allows also creating new types with any name.  When retrieving types based on
14  * a name, you should use {@link #getType(String, UnitGroup)} to return the default unit type,
15  * or a new type if the name does not currently exist.
16  * <p>
17  * Each type has a type name (description), a unit group and a priority.  The type is identified
18  * purely by its name case-insensitively.  The unit group provides the units for the type.
19  * The priority is used to order the types.  The pre-existing types are defined specific priority
20  * numbers, and other types have a default priority number that is after all other types.
21  * 
22  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
23  */
24 public class FlightDataType implements Comparable<FlightDataType> {
25         private static final Translator trans = Application.getTranslator();
26         
27         /** Priority of custom-created variables */
28         private static final int DEFAULT_PRIORITY = 999;
29         
30         /** List of existing types.  MUST BE DEFINED BEFORE ANY TYPES!! */
31         private static final Map<String, FlightDataType> EXISTING_TYPES = new HashMap<String, FlightDataType>();
32         
33         
34         
35         //// Time
36         public static final FlightDataType TYPE_TIME = newType(trans.get("FlightDataType.TYPE_TIME"), UnitGroup.UNITS_FLIGHT_TIME, 1);
37         
38         
39         //// Vertical position and motion
40         //// Altitude
41         public static final FlightDataType TYPE_ALTITUDE = newType(trans.get("FlightDataType.TYPE_ALTITUDE"), UnitGroup.UNITS_DISTANCE, 10);
42         //// Vertical velocity
43         public static final FlightDataType TYPE_VELOCITY_Z = newType(trans.get("FlightDataType.TYPE_VELOCITY_Z"), UnitGroup.UNITS_VELOCITY, 11);
44         //// Vertical acceleration
45         public static final FlightDataType TYPE_ACCELERATION_Z = newType(trans.get("FlightDataType.TYPE_ACCELERATION_Z"), UnitGroup.UNITS_ACCELERATION, 12);
46         
47         
48         //// Total motion
49         //// Total velocity
50         public static final FlightDataType TYPE_VELOCITY_TOTAL = newType(trans.get("FlightDataType.TYPE_VELOCITY_TOTAL"), UnitGroup.UNITS_VELOCITY, 20);
51         //// Total acceleration
52         public static final FlightDataType TYPE_ACCELERATION_TOTAL = newType(trans.get("FlightDataType.TYPE_ACCELERATION_TOTAL"), UnitGroup.UNITS_ACCELERATION, 21);
53         
54         
55         //// Lateral position and motion
56         //// Position upwind
57         public static final FlightDataType TYPE_POSITION_X = newType(trans.get("FlightDataType.TYPE_POSITION_X"), UnitGroup.UNITS_DISTANCE, 30);
58         //// Position parallel to wind
59         public static final FlightDataType TYPE_POSITION_Y = newType(trans.get("FlightDataType.TYPE_POSITION_Y"), UnitGroup.UNITS_DISTANCE, 31);
60         //// Lateral distance
61         public static final FlightDataType TYPE_POSITION_XY = newType(trans.get("FlightDataType.TYPE_POSITION_XY"), UnitGroup.UNITS_DISTANCE, 32);
62         //// Lateral direction
63         public static final FlightDataType TYPE_POSITION_DIRECTION = newType(trans.get("FlightDataType.TYPE_POSITION_DIRECTION"), UnitGroup.UNITS_ANGLE, 33);
64         //// Lateral velocity
65         public static final FlightDataType TYPE_VELOCITY_XY = newType(trans.get("FlightDataType.TYPE_VELOCITY_XY"), UnitGroup.UNITS_VELOCITY, 34);
66         //// Lateral acceleration
67         public static final FlightDataType TYPE_ACCELERATION_XY = newType(trans.get("FlightDataType.TYPE_ACCELERATION_XY"), UnitGroup.UNITS_ACCELERATION, 35);
68         //// Latitude
69         public static final FlightDataType TYPE_LATITUDE = newType(trans.get("FlightDataType.TYPE_LATITUDE"), UnitGroup.UNITS_ANGLE, 36);
70         //// Longitude
71         public static final FlightDataType TYPE_LONGITUDE = newType(trans.get("FlightDataType.TYPE_LONGITUDE"), UnitGroup.UNITS_ANGLE, 37);
72         
73         //// Angular motion
74         //// Angle of attack
75         public static final FlightDataType TYPE_AOA = newType(trans.get("FlightDataType.TYPE_AOA"), UnitGroup.UNITS_ANGLE, 40);
76         //// Roll rate
77         public static final FlightDataType TYPE_ROLL_RATE = newType(trans.get("FlightDataType.TYPE_ROLL_RATE"), UnitGroup.UNITS_ROLL, 41);
78         //// Pitch rate
79         public static final FlightDataType TYPE_PITCH_RATE = newType(trans.get("FlightDataType.TYPE_PITCH_RATE"), UnitGroup.UNITS_ROLL, 42);
80         //// Yaw rate
81         public static final FlightDataType TYPE_YAW_RATE = newType(trans.get("FlightDataType.TYPE_YAW_RATE"), UnitGroup.UNITS_ROLL, 43);
82         
83         
84         //// Stability information
85         //// Mass
86         public static final FlightDataType TYPE_MASS = newType(trans.get("FlightDataType.TYPE_MASS"), UnitGroup.UNITS_MASS, 50);
87         //// Longitudinal moment of inertia
88         public static final FlightDataType TYPE_LONGITUDINAL_INERTIA = newType(trans.get("FlightDataType.TYPE_LONGITUDINAL_INERTIA"), UnitGroup.UNITS_INERTIA, 51);
89         //// Rotational moment of inertia
90         public static final FlightDataType TYPE_ROTATIONAL_INERTIA = newType(trans.get("FlightDataType.TYPE_ROTATIONAL_INERTIA"), UnitGroup.UNITS_INERTIA, 52);
91         //// CP location
92         public static final FlightDataType TYPE_CP_LOCATION = newType(trans.get("FlightDataType.TYPE_CP_LOCATION"), UnitGroup.UNITS_LENGTH, 53);
93         //// CG location
94         public static final FlightDataType TYPE_CG_LOCATION = newType(trans.get("FlightDataType.TYPE_CG_LOCATION"), UnitGroup.UNITS_LENGTH, 54);
95         //// Stability margin calibers
96         public static final FlightDataType TYPE_STABILITY = newType(trans.get("FlightDataType.TYPE_STABILITY"), UnitGroup.UNITS_COEFFICIENT, 55);
97         
98         
99         //// Characteristic numbers
100         //// Mach number
101         public static final FlightDataType TYPE_MACH_NUMBER = newType(trans.get("FlightDataType.TYPE_MACH_NUMBER"), UnitGroup.UNITS_COEFFICIENT, 60);
102         //// Reynolds number
103         public static final FlightDataType TYPE_REYNOLDS_NUMBER = newType(trans.get("FlightDataType.TYPE_REYNOLDS_NUMBER"), UnitGroup.UNITS_COEFFICIENT, 61);
104         
105         
106         //// Thrust and drag
107         //// Thrust
108         public static final FlightDataType TYPE_THRUST_FORCE = newType(trans.get("FlightDataType.TYPE_THRUST_FORCE"), UnitGroup.UNITS_FORCE, 70);
109         //// Drag force
110         public static final FlightDataType TYPE_DRAG_FORCE = newType(trans.get("FlightDataType.TYPE_DRAG_FORCE"), UnitGroup.UNITS_FORCE, 71);
111         //// Drag coefficient
112         public static final FlightDataType TYPE_DRAG_COEFF = newType(trans.get("FlightDataType.TYPE_DRAG_COEFF"), UnitGroup.UNITS_COEFFICIENT, 72);
113         //// Axial drag coefficient
114         public static final FlightDataType TYPE_AXIAL_DRAG_COEFF = newType(trans.get("FlightDataType.TYPE_AXIAL_DRAG_COEFF"), UnitGroup.UNITS_COEFFICIENT, 73);
115         
116         
117         ////  Component drag coefficients
118         //// Friction drag coefficient
119         public static final FlightDataType TYPE_FRICTION_DRAG_COEFF = newType(trans.get("FlightDataType.TYPE_FRICTION_DRAG_COEFF"), UnitGroup.UNITS_COEFFICIENT, 80);
120         //// Pressure drag coefficient
121         public static final FlightDataType TYPE_PRESSURE_DRAG_COEFF = newType(trans.get("FlightDataType.TYPE_PRESSURE_DRAG_COEFF"), UnitGroup.UNITS_COEFFICIENT, 81);
122         //// Base drag coefficient
123         public static final FlightDataType TYPE_BASE_DRAG_COEFF = newType(trans.get("FlightDataType.TYPE_BASE_DRAG_COEFF"), UnitGroup.UNITS_COEFFICIENT, 82);
124         
125         
126         ////  Other coefficients
127         //// Normal force coefficient
128         public static final FlightDataType TYPE_NORMAL_FORCE_COEFF = newType(trans.get("FlightDataType.TYPE_NORMAL_FORCE_COEFF"), UnitGroup.UNITS_COEFFICIENT, 90);
129         //// Pitch moment coefficient
130         public static final FlightDataType TYPE_PITCH_MOMENT_COEFF = newType(trans.get("FlightDataType.TYPE_PITCH_MOMENT_COEFF"), UnitGroup.UNITS_COEFFICIENT, 91);
131         //// Yaw moment coefficient
132         public static final FlightDataType TYPE_YAW_MOMENT_COEFF = newType(trans.get("FlightDataType.TYPE_YAW_MOMENT_COEFF"), UnitGroup.UNITS_COEFFICIENT, 92);
133         //// Side force coefficient
134         public static final FlightDataType TYPE_SIDE_FORCE_COEFF = newType(trans.get("FlightDataType.TYPE_SIDE_FORCE_COEFF"), UnitGroup.UNITS_COEFFICIENT, 93);
135         //// Roll moment coefficient
136         public static final FlightDataType TYPE_ROLL_MOMENT_COEFF = newType(trans.get("FlightDataType.TYPE_ROLL_MOMENT_COEFF"), UnitGroup.UNITS_COEFFICIENT, 94);
137         //// Roll forcing coefficient
138         public static final FlightDataType TYPE_ROLL_FORCING_COEFF = newType(trans.get("FlightDataType.TYPE_ROLL_FORCING_COEFF"), UnitGroup.UNITS_COEFFICIENT, 95);
139         //// Roll damping coefficient
140         public static final FlightDataType TYPE_ROLL_DAMPING_COEFF = newType(trans.get("FlightDataType.TYPE_ROLL_DAMPING_COEFF"), UnitGroup.UNITS_COEFFICIENT, 96);
141         
142         //// Pitch damping coefficient
143         public static final FlightDataType TYPE_PITCH_DAMPING_MOMENT_COEFF = newType(trans.get("FlightDataType.TYPE_PITCH_DAMPING_MOMENT_COEFF"), UnitGroup.UNITS_COEFFICIENT, 97);
144         //// Yaw damping coefficient
145         public static final FlightDataType TYPE_YAW_DAMPING_MOMENT_COEFF = newType(trans.get("FlightDataType.TYPE_YAW_DAMPING_MOMENT_COEFF"), UnitGroup.UNITS_COEFFICIENT, 98);
146         
147         //// Coriolis acceleration
148         public static final FlightDataType TYPE_CORIOLIS_ACCELERATION = newType(trans.get("FlightDataType.TYPE_CORIOLIS_ACCELERATION"), UnitGroup.UNITS_ACCELERATION, 99);
149         
150         
151         ////  Reference length + area
152         //// Reference length
153         public static final FlightDataType TYPE_REFERENCE_LENGTH = newType(trans.get("FlightDataType.TYPE_REFERENCE_LENGTH"), UnitGroup.UNITS_LENGTH, 100);
154         //// Reference area
155         public static final FlightDataType TYPE_REFERENCE_AREA = newType(trans.get("FlightDataType.TYPE_REFERENCE_AREA"), UnitGroup.UNITS_AREA, 101);
156         
157         
158         ////  Orientation
159         //// Vertical orientation (zenith)
160         public static final FlightDataType TYPE_ORIENTATION_THETA = newType(trans.get("FlightDataType.TYPE_ORIENTATION_THETA"), UnitGroup.UNITS_ANGLE, 106);
161         //// Lateral orientation (azimuth)
162         public static final FlightDataType TYPE_ORIENTATION_PHI = newType(trans.get("FlightDataType.TYPE_ORIENTATION_PHI"), UnitGroup.UNITS_ANGLE, 107);
163         
164         
165         ////  Atmospheric conditions
166         //// Wind velocity
167         public static final FlightDataType TYPE_WIND_VELOCITY = newType(trans.get("FlightDataType.TYPE_WIND_VELOCITY"), UnitGroup.UNITS_VELOCITY, 110);
168         //// Air temperature
169         public static final FlightDataType TYPE_AIR_TEMPERATURE = newType(trans.get("FlightDataType.TYPE_AIR_TEMPERATURE"), UnitGroup.UNITS_TEMPERATURE, 111);
170         //// Air pressure
171         public static final FlightDataType TYPE_AIR_PRESSURE = newType(trans.get("FlightDataType.TYPE_AIR_PRESSURE"), UnitGroup.UNITS_PRESSURE, 112);
172         //// Speed of sound
173         public static final FlightDataType TYPE_SPEED_OF_SOUND = newType(trans.get("FlightDataType.TYPE_SPEED_OF_SOUND"), UnitGroup.UNITS_VELOCITY, 113);
174         
175         ////  Simulation information
176         //// Simulation time step
177         public static final FlightDataType TYPE_TIME_STEP = newType(trans.get("FlightDataType.TYPE_TIME_STEP"), UnitGroup.UNITS_TIME_STEP, 200);
178         //// Computation time
179         public static final FlightDataType TYPE_COMPUTATION_TIME = newType(trans.get("FlightDataType.TYPE_COMPUTATION_TIME"), UnitGroup.UNITS_SHORT_TIME, 201);
180         
181         
182         
183         /**
184          * Return a {@link FlightDataType} based on a string description.  This returns known data types
185          * if possible, or a new type otherwise.
186          * 
187          * @param s             the string description of the type.
188          * @param u             the unit group the new type should belong to if a new group is created.
189          * @return              a data type.
190          */
191         public static synchronized FlightDataType getType(String s, UnitGroup u) {
192                 FlightDataType type = EXISTING_TYPES.get(s.toLowerCase(Locale.ENGLISH));
193                 if (type != null) {
194                         return type;
195                 }
196                 type = newType(s, u, DEFAULT_PRIORITY);
197                 return type;
198         }
199         
200         /**
201          * Used while initializing the class.
202          */
203         private static synchronized FlightDataType newType(String s, UnitGroup u, int priority) {
204                 FlightDataType type = new FlightDataType(s, u, priority);
205                 EXISTING_TYPES.put(s.toLowerCase(Locale.ENGLISH), type);
206                 return type;
207         }
208         
209         
210         private final String name;
211         private final UnitGroup units;
212         private final int priority;
213         private final int hashCode;
214         
215         
216         private FlightDataType(String typeName, UnitGroup units, int priority) {
217                 if (typeName == null)
218                         throw new IllegalArgumentException("typeName is null");
219                 if (units == null)
220                         throw new IllegalArgumentException("units is null");
221                 this.name = typeName;
222                 this.units = units;
223                 this.priority = priority;
224                 this.hashCode = this.name.toLowerCase(Locale.ENGLISH).hashCode();
225         }
226         
227         
228         
229         
230         public String getName() {
231                 return name;
232         }
233         
234         public UnitGroup getUnitGroup() {
235                 return units;
236         }
237         
238         @Override
239         public String toString() {
240                 return name;
241         }
242         
243         @Override
244         public boolean equals(Object other) {
245                 if (!(other instanceof FlightDataType))
246                         return false;
247                 return this.name.equalsIgnoreCase(((FlightDataType) other).name);
248         }
249         
250         @Override
251         public int hashCode() {
252                 return hashCode;
253         }
254         
255         @Override
256         public int compareTo(FlightDataType o) {
257                 if (this.priority != o.priority)
258                         return this.priority - o.priority;
259                 return this.name.compareToIgnoreCase(o.name);
260         }
261 }