' Copyright 2002-2020 CS Systèmes d'Information
' Licensed to CS Systèmes d'Information (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.
 
@startuml

  skinparam svek                  true
  skinparam ClassBackgroundColor  #F3EFEB/CCC9C5
  skinparam ClassArrowColor       #691616
  skinparam ClassBorderColor      #691616
  skinparam NoteBackgroundColor   #F3EFEB
  skinparam NoteBorderColor       #691616
  skinparam NoteFontColor         #691616
  skinparam ClassFontSize         11
  skinparam PackageFontSize       12

  package org.orekit #ECEBD8 {

    package utils #DDEBD8 {
      interface PVCoordinatesProvider {
        +PVCoordinates getPVCoordinates(AbsoluteDate date, Frame frame)
      }
    }
 
    package propagation #DDEBD8 {
      interface Propagator {
        +int getMode()
        +void setSlaveMode()
        +void setMasterMode(double h, OrekitFixedStepHandler handler)
        +void setMasterMode(OrekitStepHandler handler)
        +void setEphemerisMode()
        +BoundedPropagator getGeneratedEphemeris()
        +SpacecraftState getInitialState()
        +void resetInitialState(SpacecraftState state)
        +void addEventDetector(EventDetector detector)
        +Collection<EventDetector> getEventsDetectors()
        +void clearEventsDetectors()
        +AttitudeProvider getAttitudeProvider()
        +void setAttitudeProvider(AttitudeProvider attitudeProvider)
        +Frame getFrame()
        +SpacecraftState propagate(AbsoluteDate target)
        +SpacecraftState propagate(AbsoluteDate start, AbsoluteDate target)
      }

      interface BoundedPropagator {
        +AbsoluteDate getMinDate()
        +AbsoluteDate getMaxDate()
      }

      abstract class AbstractPropagator {
      }

      PVCoordinatesProvider <|.. Propagator
      Propagator            <|.. AbstractPropagator
      Propagator            <|.. BoundedPropagator

      package analytical #ECEBD8 {

        abstract class AbstractAnalyticalPropagator {
          +PVCoordinatesProvider getPvProvider()
          +void addAdditionalStateProvider(AdditionalStateProvider additionalStateProvider)
        }

        AbstractPropagator           <|-- AbstractAnalyticalPropagator
        AbstractAnalyticalPropagator <|-- AdapterPropagator
        AbstractAnalyticalPropagator <|-- EcksteinHechlerPropagator
        AbstractAnalyticalPropagator <|-- KeplerianPropagator

        AbstractAnalyticalPropagator <|-- Ephemeris
        BoundedPropagator            <|.. Ephemeris

        package tle #DDEBD8 {
          AbstractAnalyticalPropagator <|-- TLEPropagator
        }

        package gnss #DDEBD8 {
          AbstractAnalyticalPropagator <|-- GPSPropagator
        }

     }

     package integration #ECEBD8 {

       abstract class AbstractIntegratedPropagator {
         +void setIntegrator(FirstOrderIntegrator integrator)
         +void addAdditionalEquations(AdditionalEquations addEqu)
         +void setInitialAdditionalState(String name, double[] addState)
       }

       BoundedPropagator <|.. IntegratedEphemeris
       IntegratedEphemeris --|> AbstractAnalyticalPropagator
       AbstractIntegratedPropagator o--> IntegratedEphemeris : creates
       AbstractPropagator  <|-- AbstractIntegratedPropagator

     }

     package semianalytical #ECEBD8 {

       package dsst #DDEBD8 {
         DSSTPropagator --|> AbstractIntegratedPropagator
       }

     }

     package numerical #ECEBD8 {
       NumericalPropagator --|> AbstractIntegratedPropagator
     }

   }

@enduml
