1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.frames;
18
19 import java.util.concurrent.atomic.AtomicReference;
20
21 import org.hipparchus.CalculusFieldElement;
22 import org.orekit.time.AbsoluteDate;
23 import org.orekit.time.FieldAbsoluteDate;
24 import org.orekit.time.TimeScale;
25
26
27
28
29
30
31
32
33
34
35 class VersionedITRFProvider implements EOPBasedTransformProvider {
36
37
38 private final ITRFVersion version;
39
40
41 private final ITRFProvider rawProvider;
42
43
44 private final AtomicReference<ITRFVersion.Converter> converter;
45
46
47 private final TimeScale tt;
48
49
50
51
52
53
54 VersionedITRFProvider(final ITRFVersion version,
55 final ITRFProvider rawProvider,
56 final TimeScale tt) {
57 this.version = version;
58 this.rawProvider = rawProvider;
59 this.converter = new AtomicReference<>();
60 this.tt = tt;
61 }
62
63
64
65
66 public ITRFVersion getITRFVersion() {
67 return version;
68 }
69
70
71 @Override
72 public EOPHistory getEOPHistory() {
73 return rawProvider.getEOPHistory();
74 }
75
76
77 @Override
78 public VersionedITRFProvider getNonInterpolatingProvider() {
79 return new VersionedITRFProvider(version, rawProvider.getNonInterpolatingProvider(), tt);
80 }
81
82
83 @Override
84 public Transform getTransform(final AbsoluteDate date) {
85
86
87 final Transform rawTransform = rawProvider.getTransform(date);
88
89
90 final ITRFVersion.Converter converterForDate = getConverter(date);
91 if (converterForDate == null) {
92 return rawTransform;
93 } else {
94 return new Transform(date, rawTransform, converterForDate.getTransform(date));
95 }
96
97 }
98
99
100 @Override
101 public KinematicTransform getKinematicTransform(final AbsoluteDate date) {
102
103
104 final KinematicTransform rawTransform = rawProvider.getKinematicTransform(date);
105
106
107 final ITRFVersion.Converter converterForDate = getConverter(date);
108 if (converterForDate == null) {
109 return rawTransform;
110 } else {
111 return KinematicTransform.compose(date, rawTransform, converterForDate.getKinematicTransform(date));
112 }
113
114 }
115
116
117 @Override
118 public StaticTransform getStaticTransform(final AbsoluteDate date) {
119
120
121 final StaticTransform rawTransform = rawProvider.getStaticTransform(date);
122
123
124 final ITRFVersion.Converter converterForDate = getConverter(date);
125 if (converterForDate == null) {
126 return rawTransform;
127 } else {
128 return StaticTransform.compose(
129 date,
130 rawTransform,
131 converterForDate.getStaticTransform(date));
132 }
133
134 }
135
136
137 @Override
138 public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
139
140
141 final FieldTransform<T> rawTransform = rawProvider.getTransform(date);
142
143
144 final ITRFVersion.Converter converterForDate = getConverter(date.toAbsoluteDate());
145 if (converterForDate == null) {
146 return rawTransform;
147 } else {
148 return new FieldTransform<>(date, rawTransform, converterForDate.getTransform(date));
149 }
150
151 }
152
153
154 @Override
155 public <T extends CalculusFieldElement<T>> FieldKinematicTransform<T> getKinematicTransform(final FieldAbsoluteDate<T> date) {
156
157
158 final FieldKinematicTransform<T> rawTransform = rawProvider.getKinematicTransform(date);
159
160
161 final ITRFVersion.Converter converterForDate = getConverter(date.toAbsoluteDate());
162 if (converterForDate == null) {
163 return rawTransform;
164 } else {
165 return FieldKinematicTransform.compose(date, rawTransform, converterForDate.getKinematicTransform(date));
166 }
167
168 }
169
170
171 @Override
172 public <T extends CalculusFieldElement<T>> FieldStaticTransform<T> getStaticTransform(final FieldAbsoluteDate<T> date) {
173
174
175 final FieldStaticTransform<T> rawTransform = rawProvider.getStaticTransform(date);
176
177
178 final ITRFVersion.Converter converterForDate = getConverter(date.toAbsoluteDate());
179 if (converterForDate == null) {
180 return rawTransform;
181 } else {
182 return FieldStaticTransform.compose(
183 date,
184 rawTransform,
185 converterForDate.getStaticTransform(date));
186 }
187
188 }
189
190
191
192
193
194
195 private ITRFVersion.Converter getConverter(final AbsoluteDate date) {
196
197
198 final ITRFVersion rawVersion = getEOPHistory().getITRFVersion(date);
199 if (rawVersion == version) {
200
201 return null;
202 }
203
204 final ITRFVersion.Converter existing = converter.get();
205 if (existing != null && existing.getOrigin() == rawVersion) {
206
207 return existing;
208 }
209
210
211 final ITRFVersion.Converter newConverter =
212 ITRFVersion.getConverter(rawVersion, version, tt);
213 converter.compareAndSet(null, newConverter);
214 return newConverter;
215
216 }
217
218 }