1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.bodies;
18
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23
24 import org.orekit.data.DataProvidersManager;
25 import org.orekit.errors.OrekitException;
26 import org.orekit.errors.OrekitMessages;
27 import org.orekit.frames.Frame;
28 import org.orekit.time.TimeScales;
29
30
31
32
33
34
35
36
37
38
39 public class LazyLoadedCelestialBodies implements CelestialBodies {
40
41
42 private final DataProvidersManager dataProvidersManager;
43
44 private final TimeScales timeScales;
45
46 private final Frame gcrf;
47
48 private final Map<String, List<CelestialBodyLoader>> loadersMap = new HashMap<>();
49
50
51 private final Map<String, CelestialBody> celestialBodyMap = new HashMap<>();
52
53
54
55
56
57
58
59
60 public LazyLoadedCelestialBodies(final DataProvidersManager dataProvidersManager,
61 final TimeScales timeScales,
62 final Frame gcrf) {
63 this.dataProvidersManager = dataProvidersManager;
64 this.timeScales = timeScales;
65 this.gcrf = gcrf;
66 }
67
68
69
70
71
72
73
74
75 public void addCelestialBodyLoader(final String name,
76 final CelestialBodyLoader loader) {
77 synchronized (loadersMap) {
78 loadersMap.computeIfAbsent(name, k -> new ArrayList<>()).add(loader);
79 }
80 }
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 public void addDefaultCelestialBodyLoader(final String supportedNames) {
96 addDefaultCelestialBodyLoader(CelestialBodyFactory.SOLAR_SYSTEM_BARYCENTER, supportedNames);
97 addDefaultCelestialBodyLoader(CelestialBodyFactory.SUN, supportedNames);
98 addDefaultCelestialBodyLoader(CelestialBodyFactory.MERCURY, supportedNames);
99 addDefaultCelestialBodyLoader(CelestialBodyFactory.VENUS, supportedNames);
100 addDefaultCelestialBodyLoader(CelestialBodyFactory.EARTH_MOON, supportedNames);
101 addDefaultCelestialBodyLoader(CelestialBodyFactory.EARTH, supportedNames);
102 addDefaultCelestialBodyLoader(CelestialBodyFactory.MOON, supportedNames);
103 addDefaultCelestialBodyLoader(CelestialBodyFactory.MARS, supportedNames);
104 addDefaultCelestialBodyLoader(CelestialBodyFactory.JUPITER, supportedNames);
105 addDefaultCelestialBodyLoader(CelestialBodyFactory.SATURN, supportedNames);
106 addDefaultCelestialBodyLoader(CelestialBodyFactory.URANUS, supportedNames);
107 addDefaultCelestialBodyLoader(CelestialBodyFactory.NEPTUNE, supportedNames);
108 addDefaultCelestialBodyLoader(CelestialBodyFactory.PLUTO, supportedNames);
109 }
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 public void addDefaultCelestialBodyLoader(final String name,
126 final String supportedNames) {
127
128 CelestialBodyLoader loader = null;
129 if (name.equalsIgnoreCase(CelestialBodyFactory.SOLAR_SYSTEM_BARYCENTER)) {
130 loader =
131 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.SOLAR_SYSTEM_BARYCENTER, dataProvidersManager, timeScales, gcrf);
132 } else if (name.equalsIgnoreCase(CelestialBodyFactory.SUN)) {
133 loader =
134 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.SUN, dataProvidersManager, timeScales, gcrf);
135 } else if (name.equalsIgnoreCase(CelestialBodyFactory.MERCURY)) {
136 loader =
137 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.MERCURY, dataProvidersManager, timeScales, gcrf);
138 } else if (name.equalsIgnoreCase(CelestialBodyFactory.VENUS)) {
139 loader =
140 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.VENUS, dataProvidersManager, timeScales, gcrf);
141 } else if (name.equalsIgnoreCase(CelestialBodyFactory.EARTH_MOON)) {
142 loader =
143 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.EARTH_MOON, dataProvidersManager, timeScales, gcrf);
144 } else if (name.equalsIgnoreCase(CelestialBodyFactory.EARTH)) {
145 loader =
146 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.EARTH, dataProvidersManager, timeScales, gcrf);
147 } else if (name.equalsIgnoreCase(CelestialBodyFactory.MOON)) {
148 loader =
149 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.MOON, dataProvidersManager, timeScales, gcrf);
150 } else if (name.equalsIgnoreCase(CelestialBodyFactory.MARS)) {
151 loader =
152 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.MARS, dataProvidersManager, timeScales, gcrf);
153 } else if (name.equalsIgnoreCase(CelestialBodyFactory.JUPITER)) {
154 loader =
155 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.JUPITER, dataProvidersManager, timeScales, gcrf);
156 } else if (name.equalsIgnoreCase(CelestialBodyFactory.SATURN)) {
157 loader =
158 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.SATURN, dataProvidersManager, timeScales, gcrf);
159 } else if (name.equalsIgnoreCase(CelestialBodyFactory.URANUS)) {
160 loader =
161 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.URANUS, dataProvidersManager, timeScales, gcrf);
162 } else if (name.equalsIgnoreCase(CelestialBodyFactory.NEPTUNE)) {
163 loader =
164 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.NEPTUNE, dataProvidersManager, timeScales, gcrf);
165 } else if (name.equalsIgnoreCase(CelestialBodyFactory.PLUTO)) {
166 loader =
167 new JPLEphemeridesLoader(supportedNames, JPLEphemeridesLoader.EphemerisType.PLUTO, dataProvidersManager, timeScales, gcrf);
168 }
169
170 if (loader != null) {
171 addCelestialBodyLoader(name, loader);
172 }
173
174 }
175
176
177
178
179
180
181
182
183
184
185
186 public void clearCelestialBodyLoaders(final String name) {
187
188 synchronized (celestialBodyMap) {
189
190
191 clearCelestialBodyCache(name);
192
193 synchronized (loadersMap) {
194 loadersMap.remove(name);
195 }
196 }
197 }
198
199
200
201
202
203
204
205
206
207 public void clearCelestialBodyLoaders() {
208 synchronized (celestialBodyMap) {
209 clearCelestialBodyCache();
210
211 synchronized (loadersMap) {
212 loadersMap.clear();
213 }
214 }
215 }
216
217
218
219
220 public void clearCelestialBodyCache(final String name) {
221 synchronized (celestialBodyMap) {
222 celestialBodyMap.remove(name);
223 }
224 }
225
226
227
228
229
230
231
232
233 public void clearCelestialBodyCache() {
234 synchronized (celestialBodyMap) {
235 celestialBodyMap.clear();
236 }
237 }
238
239 @Override
240 public CelestialBody getSolarSystemBarycenter() {
241 return getBody(CelestialBodyFactory.SOLAR_SYSTEM_BARYCENTER);
242 }
243
244 @Override
245 public CelestialBody getSun() {
246 return getBody(CelestialBodyFactory.SUN);
247 }
248
249 @Override
250 public CelestialBody getMercury() {
251 return getBody(CelestialBodyFactory.MERCURY);
252 }
253
254 @Override
255 public CelestialBody getVenus() {
256 return getBody(CelestialBodyFactory.VENUS);
257 }
258
259 @Override
260 public CelestialBody getEarthMoonBarycenter() {
261 return getBody(CelestialBodyFactory.EARTH_MOON);
262 }
263
264 @Override
265 public CelestialBody getEarth() {
266 return getBody(CelestialBodyFactory.EARTH);
267 }
268
269 @Override
270 public CelestialBody getMoon() {
271 return getBody(CelestialBodyFactory.MOON);
272 }
273
274 @Override
275 public CelestialBody getMars() {
276 return getBody(CelestialBodyFactory.MARS);
277 }
278
279 @Override
280 public CelestialBody getJupiter() {
281 return getBody(CelestialBodyFactory.JUPITER);
282 }
283
284 @Override
285 public CelestialBody getSaturn() {
286 return getBody(CelestialBodyFactory.SATURN);
287 }
288
289 @Override
290 public CelestialBody getUranus() {
291 return getBody(CelestialBodyFactory.URANUS);
292 }
293
294 @Override
295 public CelestialBody getNeptune() {
296 return getBody(CelestialBodyFactory.NEPTUNE);
297 }
298
299 @Override
300 public CelestialBody getPluto() {
301 return getBody(CelestialBodyFactory.PLUTO);
302 }
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317 @Override
318 public CelestialBody getBody(final String name) {
319 synchronized (celestialBodyMap) {
320 CelestialBody body = celestialBodyMap.get(name);
321 if (body == null) {
322 synchronized (loadersMap) {
323 List<CelestialBodyLoader> loaders = loadersMap.get(name);
324 if (loaders == null || loaders.isEmpty()) {
325 addDefaultCelestialBodyLoader(name, JPLEphemeridesLoader.DEFAULT_DE_SUPPORTED_NAMES);
326 addDefaultCelestialBodyLoader(name, JPLEphemeridesLoader.DEFAULT_INPOP_SUPPORTED_NAMES);
327 loaders = loadersMap.get(name);
328 }
329 OrekitException delayedException = null;
330 for (CelestialBodyLoader loader : loaders) {
331 try {
332 body = loader.loadCelestialBody(name);
333 if (body != null) {
334 break;
335 }
336 } catch (OrekitException oe) {
337 delayedException = oe;
338 }
339 }
340 if (body == null) {
341 throw (delayedException != null) ?
342 delayedException :
343 new OrekitException(OrekitMessages.NO_DATA_LOADED_FOR_CELESTIAL_BODY, name);
344 }
345
346 }
347
348
349 celestialBodyMap.put(name, body);
350
351 }
352
353 return body;
354
355 }
356 }
357
358 }