FrameFacade.java
/* Copyright 2002-2021 CS GROUP
* Licensed to CS GROUP (CS) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* CS licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.orekit.files.ccsds.definitions;
import org.orekit.data.DataContext;
import org.orekit.errors.OrekitException;
import org.orekit.frames.Frame;
import org.orekit.utils.IERSConventions;
/** Facade in front of several frames types in CCSDS messages.
* @author Luc Maisonobe
* @since 11.0
*/
public class FrameFacade {
/** Reference to node in Orekit frames tree. */
private final Frame frame;
/** Reference to celestial body centered frame. */
private final CelestialBodyFrame celestialBodyFrame;
/** Reference to orbit-relative frame. */
private final OrbitRelativeFrame orbitRelativeFrame;
/** Reference to spacecraft body frame. */
private final SpacecraftBodyFrame spacecraftBodyFrame;
/** Name of the frame. */
private final String name;
/** Simple constructor.
* <p>
* At most one of {@code celestialBodyFrame}, {@code orbitRelativeFrame}
* or {@code spacecraftBodyFrame} may be non null. They may all be null
* if frame is unknown, in which case only the name will be available.
* </p>
* @param frame reference to node in Orekit frames tree (may be null)
* @param celestialBodyFrame reference to celestial body centered frame (may be null)
* @param orbitRelativeFrame reference to orbit-relative frame (may be null)
* @param spacecraftBodyFrame reference to spacecraft body frame (may be null)
* @param name name of the frame
*/
public FrameFacade(final Frame frame,
final CelestialBodyFrame celestialBodyFrame,
final OrbitRelativeFrame orbitRelativeFrame,
final SpacecraftBodyFrame spacecraftBodyFrame,
final String name) {
this.frame = frame;
this.celestialBodyFrame = celestialBodyFrame;
this.orbitRelativeFrame = orbitRelativeFrame;
this.spacecraftBodyFrame = spacecraftBodyFrame;
this.name = name;
}
/**
* Get the associated frame tree node.
* @return associated frame tree node, or null if none exists
*/
public Frame asFrame() {
return frame;
}
/** Get the associated {@link CelestialBodyFrame celestial body frame}.
* @return associated celestial body frame, or null if frame is
* associated to a {@link #asOrbitRelativeFrame() orbit},
* a {@link #asSpacecraftBodyFrame spacecraft} or is not supported
*/
public CelestialBodyFrame asCelestialBodyFrame() {
return celestialBodyFrame;
}
/** Get the associated {@link OrbitRelativeFrame orbit relative frame}.
* @return associated orbit relative frame, or null if frame is
* associated to a {@link #asCelestialBodyFrame() celestial body},
* a {@link #asSpacecraftBodyFrame spacecraft} or is not supported
*/
public OrbitRelativeFrame asOrbitRelativeFrame() {
return orbitRelativeFrame;
}
/** Get the associated {@link SpacecraftBodyFrame spacecraft body frame}.
* @return associated spacecraft body frame, or null if frame is
* associated to a {@link #asCelestialBodyFrame() celestial body},
* an {@link #asOrbitRelativeFrame orbit} or is not supported
*/
public SpacecraftBodyFrame asSpacecraftBodyFrame() {
return spacecraftBodyFrame;
}
/** Get the CCSDS name for the frame.
* @return CCSDS name
*/
public String getName() {
return name;
}
/** Map an Orekit frame to a CCSDS frame facade.
* @param frame a reference frame.
* @return the CCSDSFrame corresponding to the Orekit frame
*/
public static FrameFacade map(final Frame frame) {
final CelestialBodyFrame cbf = CelestialBodyFrame.map(frame);
return new FrameFacade(frame, cbf, null, null, cbf.name());
}
/** Simple constructor.
* @param name name of the frame
* @param conventions IERS conventions to use
* @param simpleEOP if true, tidal effects are ignored when interpolating EOP
* @param dataContext to use when creating the frame
* @param allowCelestial if true, {@link CelestialBodyFrame} are allowed
* @param allowOrbit if true, {@link OrbitRelativeFrame} are allowed
* @param allowSpacecraft if true, {@link SpacecraftBodyFrame} are allowed
* @return frame facade corresponding to the CCSDS name
*/
public static FrameFacade parse(final String name,
final IERSConventions conventions,
final boolean simpleEOP,
final DataContext dataContext,
final boolean allowCelestial,
final boolean allowOrbit,
final boolean allowSpacecraft) {
try {
final CelestialBodyFrame cbf = CelestialBodyFrame.parse(name);
if (allowCelestial) {
return new FrameFacade(cbf.getFrame(conventions, simpleEOP, dataContext),
cbf, null, null, cbf.name());
}
} catch (IllegalArgumentException iaeC) {
try {
final OrbitRelativeFrame orf = OrbitRelativeFrame.valueOf(name.replace(' ', '_'));
if (allowOrbit) {
return new FrameFacade(null, null, orf, null, orf.name());
}
} catch (IllegalArgumentException iaeO) {
try {
final SpacecraftBodyFrame sbf = SpacecraftBodyFrame.parse(name.replace(' ', '_'));
if (allowSpacecraft) {
return new FrameFacade(null, null, null, sbf, sbf.toString());
}
} catch (OrekitException | IllegalArgumentException e) {
// nothing to do here, use fallback below
}
}
}
// we don't know any frame with this name, just store the name itself
return new FrameFacade(null, null, null, null, name);
}
}