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
144
145
146
147 private ITRFVersion.Converter getConverter(final AbsoluteDate date) {
148
149
150 final ITRFVersion rawVersion = getEOPHistory().getITRFVersion(date);
151 if (rawVersion == version) {
152
153 return null;
154 }
155
156 final ITRFVersion.Converter existing = converter.get();
157 if (existing != null && existing.getOrigin() == rawVersion) {
158
159 return existing;
160 }
161
162
163 final ITRFVersion.Converter newConverter =
164 ITRFVersion.getConverter(rawVersion, version, tt);
165 converter.compareAndSet(null, newConverter);
166 return newConverter;
167
168 }
169
170
171
172
173 @DefaultDataContext
174 private Object writeReplace() {
175 return new DataTransferObject(version, rawProvider);
176 }
177
178
179 @DefaultDataContext
180 private static class DataTransferObject implements Serializable {
181
182
183 private static final long serialVersionUID = 20180403L;
184
185
186 private final ITRFVersion version;
187
188
189 private final ITRFProvider rawProvider;
190
191
192
193
194
195 DataTransferObject(final ITRFVersion version, final ITRFProvider rawProvider) {
196 this.version = version;
197 this.rawProvider = rawProvider;
198 }
199
200
201
202
203 private Object readResolve() {
204 return new VersionedITRFProvider(version, rawProvider,
205 DataContext.getDefault().getTimeScales().getTT());
206 }
207
208 }
209
210 }