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 <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
108
109
110 final FieldTransform<T> rawTransform = rawProvider.getTransform(date);
111
112
113 final ITRFVersion.Converter converterForDate = getConverter(date.toAbsoluteDate());
114 if (converterForDate == null) {
115 return rawTransform;
116 } else {
117 return new FieldTransform<>(date, rawTransform, converterForDate.getTransform(date));
118 }
119
120 }
121
122
123
124
125
126
127 private ITRFVersion.Converter getConverter(final AbsoluteDate date) {
128
129
130 final ITRFVersion rawVersion = getEOPHistory().getITRFVersion(date);
131 if (rawVersion == version) {
132
133 return null;
134 }
135
136 final ITRFVersion.Converter existing = converter.get();
137 if (existing != null && existing.getOrigin() == rawVersion) {
138
139 return existing;
140 }
141
142
143 final ITRFVersion.Converter newConverter =
144 ITRFVersion.getConverter(rawVersion, version, tt);
145 converter.compareAndSet(null, newConverter);
146 return newConverter;
147
148 }
149
150
151
152
153 @DefaultDataContext
154 private Object writeReplace() {
155 return new DataTransferObject(version, rawProvider);
156 }
157
158
159 @DefaultDataContext
160 private static class DataTransferObject implements Serializable {
161
162
163 private static final long serialVersionUID = 20180403L;
164
165
166 private final ITRFVersion version;
167
168
169 private final ITRFProvider rawProvider;
170
171
172
173
174
175 DataTransferObject(final ITRFVersion version, final ITRFProvider rawProvider) {
176 this.version = version;
177 this.rawProvider = rawProvider;
178 }
179
180
181
182
183 private Object readResolve() {
184 return new VersionedITRFProvider(version, rawProvider,
185 DataContext.getDefault().getTimeScales().getTT());
186 }
187
188 }
189
190 }