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