1 package org.djutils.serialization;
2
3 import java.util.HashMap;
4 import java.util.Map;
5 import java.util.Objects;
6
7 import org.djunits.unit.AbsoluteTemperatureUnit;
8 import org.djunits.unit.AbsorbedDoseUnit;
9 import org.djunits.unit.AccelerationUnit;
10 import org.djunits.unit.AmountOfSubstanceUnit;
11 import org.djunits.unit.AngleUnit;
12 import org.djunits.unit.AngularAccelerationUnit;
13 import org.djunits.unit.AngularVelocityUnit;
14 import org.djunits.unit.AreaUnit;
15 import org.djunits.unit.CatalyticActivityUnit;
16 import org.djunits.unit.DensityUnit;
17 import org.djunits.unit.DimensionlessUnit;
18 import org.djunits.unit.DirectionUnit;
19 import org.djunits.unit.DurationUnit;
20 import org.djunits.unit.ElectricalCapacitanceUnit;
21 import org.djunits.unit.ElectricalChargeUnit;
22 import org.djunits.unit.ElectricalConductanceUnit;
23 import org.djunits.unit.ElectricalCurrentUnit;
24 import org.djunits.unit.ElectricalInductanceUnit;
25 import org.djunits.unit.ElectricalPotentialUnit;
26 import org.djunits.unit.ElectricalResistanceUnit;
27 import org.djunits.unit.EnergyUnit;
28 import org.djunits.unit.EquivalentDoseUnit;
29 import org.djunits.unit.FlowMassUnit;
30 import org.djunits.unit.FlowVolumeUnit;
31 import org.djunits.unit.ForceUnit;
32 import org.djunits.unit.FrequencyUnit;
33 import org.djunits.unit.IlluminanceUnit;
34 import org.djunits.unit.LengthUnit;
35 import org.djunits.unit.LinearDensityUnit;
36 import org.djunits.unit.LuminousFluxUnit;
37 import org.djunits.unit.LuminousIntensityUnit;
38 import org.djunits.unit.MagneticFluxDensityUnit;
39 import org.djunits.unit.MagneticFluxUnit;
40 import org.djunits.unit.MassUnit;
41 import org.djunits.unit.MomentumUnit;
42 import org.djunits.unit.PositionUnit;
43 import org.djunits.unit.PowerUnit;
44 import org.djunits.unit.PressureUnit;
45 import org.djunits.unit.RadioActivityUnit;
46 import org.djunits.unit.SolidAngleUnit;
47 import org.djunits.unit.SpeedUnit;
48 import org.djunits.unit.TemperatureUnit;
49 import org.djunits.unit.TimeUnit;
50 import org.djunits.unit.TorqueUnit;
51 import org.djunits.unit.Unit;
52 import org.djunits.unit.VolumeUnit;
53
54
55
56
57
58
59
60
61
62 public class QuantityType
63 {
64
65 private static Map<Byte, QuantityType> byteTypeMap = new HashMap<>();
66
67
68 private static Map<Class<? extends Unit<?>>, QuantityType> unitTypeMap = new HashMap<>();
69
70
71 public static final QuantityType DIMENSIONLESS =
72 new QuantityType(0, DimensionlessUnit.class, "Dimensionless", "Unit without a dimension", "[]");
73
74
75 public static final QuantityType ACCELERATION =
76 new QuantityType(1, AccelerationUnit.class, "Acceleration", "Acceleration", "[m/s^2]");
77
78
79 public static final QuantityType SOLIDANGLE =
80 new QuantityType(2, SolidAngleUnit.class, "SolidAngle", "Solid angle (steradian)", "[sr]");
81
82
83 public static final QuantityType ANGLE = new QuantityType(3, AngleUnit.class, "Angle", "Angle (relative)", "[rad]");
84
85
86 public static final QuantityType DIRECTION =
87 new QuantityType(4, DirectionUnit.class, "Direction", "Angle (absolute)", "[rad]");
88
89
90 public static final QuantityType AREA = new QuantityType(5, AreaUnit.class, "Area", "Area (m2)", "[m^2]");
91
92
93 public static final QuantityType DENSITY =
94 new QuantityType(6, DensityUnit.class, "Density", "Density based on mass and length", "[kg/m^3]");
95
96
97 public static final QuantityType ELECTRICALCHARGE =
98 new QuantityType(7, ElectricalChargeUnit.class, "ElectricalCharge", "Electrical charge (Coulomb)", "[s.A]");
99
100
101 public static final QuantityType ELECTRICALCURRENT =
102 new QuantityType(8, ElectricalCurrentUnit.class, "ElectricalCurrent", "Electrical current (Ampere)", "[A]");
103
104
105 public static final QuantityType ELECTRICALPOTENTIAL = new QuantityType(9, ElectricalPotentialUnit.class,
106 "ElectricalPotential", "Electrical potential (Volt)", "[kg.m^2/s^3.A]");
107
108
109 public static final QuantityType ELECTRICALRESISTANCE = new QuantityType(10, ElectricalResistanceUnit.class,
110 "ElectricalResistance", "Electrical resistance (Ohm)", "[kg.m^2/s^3.A^2]");
111
112
113 public static final QuantityType ENERGY =
114 new QuantityType(11, EnergyUnit.class, "Energy", "Energy (Joule)", "[kg.m^2/s^2]");
115
116
117 public static final QuantityType FLOWMASS =
118 new QuantityType(12, FlowMassUnit.class, "FlowMass", "Mass flow rate ", "[kg/s]");
119
120
121 public static final QuantityType FLOWVOLUME =
122 new QuantityType(13, FlowVolumeUnit.class, "FlowVolume", "Volume flow rate", "[m^3/s]");
123
124
125 public static final QuantityType FORCE = new QuantityType(14, ForceUnit.class, "Force", "Force (Newton)", "[kg.m/s^2]");
126
127
128 public static final QuantityType FREQUENCY =
129 new QuantityType(15, FrequencyUnit.class, "Frequency", "Frequency (Hz)", "[1/s]");
130
131
132 public static final QuantityType LENGTH = new QuantityType(16, LengthUnit.class, "Length", "Length (relative)", "[m]");
133
134
135 public static final QuantityType POSITION =
136 new QuantityType(17, PositionUnit.class, "Position", "Length (absolute)", "[m]");
137
138
139 public static final QuantityType LINEARDENSITY =
140 new QuantityType(18, LinearDensityUnit.class, "LinearDensity", "Linear density ", "[1/m]");
141
142
143 public static final QuantityType MASS = new QuantityType(19, MassUnit.class, "Mass", "Mass", "[kg]");
144
145
146 public static final QuantityType POWER = new QuantityType(20, PowerUnit.class, "Power", "Power (Watt)", "[kg.m^2/s^3]");
147
148
149 public static final QuantityType PRESSURE =
150 new QuantityType(21, PressureUnit.class, "Pressure", "Pressure (Pascal)", "[kg/m.s^2]");
151
152
153 public static final QuantityType SPEED = new QuantityType(22, SpeedUnit.class, "Speed", "Speed", "[m/s]");
154
155
156 public static final QuantityType TEMPERATURE =
157 new QuantityType(23, TemperatureUnit.class, "Temperature", "Temperature (relative)", "[K]");
158
159
160 public static final QuantityType ABSOLUTETEMPERATURE =
161 new QuantityType(24, AbsoluteTemperatureUnit.class, "AbsoluteTemperature", "Temperature (absolute)", "[K]");
162
163
164 public static final QuantityType DURATION = new QuantityType(25, DurationUnit.class, "Duration", "Time (relative)", "[s]");
165
166
167 public static final QuantityType TIME = new QuantityType(26, TimeUnit.class, "Time", "Time (absolute)", "[s]");
168
169
170 public static final QuantityType TORQUE =
171 new QuantityType(27, TorqueUnit.class, "Torque", "Torque (Newton-meter)", "[kg.m^2/s^2]");
172
173
174 public static final QuantityType VOLUME = new QuantityType(28, VolumeUnit.class, "Volume", "Volume", "[m^3]");
175
176
177 public static final QuantityType ABSORBEDDOSE =
178 new QuantityType(28, AbsorbedDoseUnit.class, "Absorbed dose", "Absorbed Dose (Gray)", "[m^2/s^2]");
179
180
181 public static final QuantityType AMOUNTOFSUBSTANCE =
182 new QuantityType(30, AmountOfSubstanceUnit.class, "Amount of substance", "Amount of substance (mole)", "[mol]");
183
184
185 public static final QuantityType CATALYTICACTIVITY =
186 new QuantityType(31, CatalyticActivityUnit.class, "Catalytic activity", "Catalytic activity (katal)", "[mol/s]");
187
188
189 public static final QuantityType ELECTRICALCAPACITANCE = new QuantityType(32, ElectricalCapacitanceUnit.class,
190 "Electrical capacitance", "Electrical capacitance (Farad)", "[s^4.A^2/kg.m^2]");
191
192
193 public static final QuantityType ELECTRICALCONDUCTANCE = new QuantityType(33, ElectricalConductanceUnit.class,
194 "Electrical conductance", "Electrical conductance (Siemens)", "[s^3.A^2/kg.m^2]");
195
196
197 public static final QuantityType ELECTRICALINDUCTANCE = new QuantityType(34, ElectricalInductanceUnit.class,
198 "Electrical inductance", "Electrical inductance (Henry)", "[kg.m^2/s^2.A^2]");
199
200
201 public static final QuantityType EQUIVALENTDOSE =
202 new QuantityType(35, EquivalentDoseUnit.class, "Equivalent dose", "Equivalent dose (Sievert)", "[m^2/s^2]");
203
204
205 public static final QuantityType ILLUMINANCE =
206 new QuantityType(36, IlluminanceUnit.class, "Illuminance", "Illuminance (lux)", "[sr.cd/m^2]");
207
208
209 public static final QuantityType LUMINOUSFLUX =
210 new QuantityType(37, LuminousFluxUnit.class, "Luminous flux", "Luminous flux (lumen)", "[sr.cd]");
211
212
213 public static final QuantityType LUMINOUSINTENSITY =
214 new QuantityType(38, LuminousIntensityUnit.class, "Luminous intensity", "Luminous intensity (candela)", "[cd]");
215
216
217 public static final QuantityType MAGNETICFLUXDENSITY = new QuantityType(39, MagneticFluxDensityUnit.class,
218 "Magnetic flux density", "Magnetic flux density (Tesla)", "[kg/s^2.A]");
219
220
221 public static final QuantityType MAGNETICFLUX =
222 new QuantityType(40, MagneticFluxUnit.class, "Magnetic flux", "Magnetic flux (Weber)", "[kg.m^2/s^2.A]");
223
224
225 public static final QuantityType RADIOACTIVITY =
226 new QuantityType(41, RadioActivityUnit.class, "Radioactivity", "Radioactivity (Becquerel)", "[1/s]");
227
228
229 public static final QuantityType ANGULARACCELERATION =
230 new QuantityType(42, AngularAccelerationUnit.class, "AngularAcceleration", "AngularAcceleration", "[rad/s^2]");
231
232
233 public static final QuantityType ANGULARVELOCITY =
234 new QuantityType(43, AngularVelocityUnit.class, "AngularVelocity", "AngularVelocity", "[rad/s]");
235
236
237 public static final QuantityType MOMENTUM = new QuantityType(44, MomentumUnit.class, "Momentum", "Momentum", "[rad/s^2]");
238
239
240 private final byte code;
241
242
243 private final Class<? extends Unit<?>> djunitsType;
244
245
246 private final String name;
247
248
249 private final String description;
250
251
252 private final String siUnit;
253
254
255
256
257
258
259
260
261
262
263 public <U extends Unit<U>> QuantityType(final int code, final Class<U> djunitsType, final String name,
264 final String description, final String siUnit)
265 {
266 this.code = (byte) code;
267 this.djunitsType = djunitsType;
268 this.name = name;
269 this.description = description;
270 this.siUnit = siUnit;
271
272 byteTypeMap.put(this.code, this);
273 unitTypeMap.put(this.djunitsType, this);
274 }
275
276
277
278
279
280
281 public static QuantityType getUnitType(final byte code)
282 {
283 return byteTypeMap.get(code);
284 }
285
286
287
288
289
290
291 public static Class<? extends Unit<?>> getUnitClass(final byte code)
292 {
293 QuantityType type = byteTypeMap.get(code);
294 return type == null ? null : type.getDjunitsType();
295 }
296
297
298
299
300
301
302
303 public static <U extends Unit<U>> QuantityType getUnitType(final U unit)
304 {
305 return unitTypeMap.get(unit.getClass());
306 }
307
308
309
310
311
312
313
314
315 public static <U extends Unit<U>> byte getUnitCode(final U unit)
316 {
317 QuantityType type = unitTypeMap.get(unit.getClass());
318 if (type == null)
319 {
320 throw new IllegalArgumentException("Could not find unit type for unit " + unit + " in unitTypeMap");
321 }
322 return type.getCode();
323 }
324
325
326
327
328
329 public final byte getCode()
330 {
331 return this.code;
332 }
333
334
335
336
337
338 public final Class<? extends Unit<?>> getDjunitsType()
339 {
340 return this.djunitsType;
341 }
342
343
344
345
346
347 public final String getName()
348 {
349 return this.name;
350 }
351
352
353
354
355
356 public final String getDescription()
357 {
358 return this.description;
359 }
360
361
362
363
364
365 public final String getSiUnit()
366 {
367 return this.siUnit;
368 }
369
370 @SuppressWarnings("checkstyle:designforextension")
371 @Override
372 public int hashCode()
373 {
374 return Objects.hash(this.code, this.description, this.djunitsType, this.name, this.siUnit);
375 }
376
377 @SuppressWarnings({"checkstyle:designforextension", "needbraces"})
378 @Override
379 public boolean equals(final Object obj)
380 {
381 if (this == obj)
382 return true;
383 if (obj == null)
384 return false;
385 if (getClass() != obj.getClass())
386 return false;
387 QuantityType other = (QuantityType) obj;
388 return this.code == other.code && Objects.equals(this.description, other.description)
389 && Objects.equals(this.djunitsType, other.djunitsType) && Objects.equals(this.name, other.name)
390 && Objects.equals(this.siUnit, other.siUnit);
391 }
392
393 @Override
394 @SuppressWarnings("checkstyle:designforextension")
395 public String toString()
396 {
397 return "UnitType [code=" + this.code + ", name=" + this.name + ", description=" + this.description + ", siUnit="
398 + this.siUnit + "]";
399 }
400
401 }