' Copyright 2002-2014 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

  package org.orekit #ECEBD8

    package time #DDEBD8
      interface TimeStamped
      interface "TimeShiftable<T>" as TimeShiftable_T_
      interface "TimeInterpolable<T>" as TimeInterpolable_T_
    end package

    package frames #DDEBD8

    class Frame {
      +String getName()
      +boolean isPseudoInertial()
      +Frame getParent()
      +Transform getTransformTo(Frame destination, AbsoluteDate date)
      +Frame getFrozenFrame(Frame reference, AbsoluteDate freezingDate, String frozenName)
    }

    class EME2000Provider
    class ITRFProvider
    class MODProvider
    class "...Provider" as DummyProvider

    interface TransformProvider {
      +Transform getTransform(AbsoluteDate date)
    }

    class Transform {
      +Transform IDENTITY
      +Transform getInverse()
      +Transform freeze()
      +Vector3D transformPosition(Vector3D position)
      +Vector3D transformVector(Vector3D vector)
      +Line transformLine(Line line)
      +PVCoordinates transformPVCoordinates(PVCoordinates pv)
      +void getJacobian(double[][] jacobian)
      +Vector3D getTranslation()
      +Vector3D getVelocity()
      +Rotation getRotation()
      +Vector3D getRotationRate()
    }

    class UpdatableFrame {
      +void setTransform(Transform)
      +void updateFrame(...)
    }

    class TopocentricFrame
    class LocalOrbitalFrame
    class "...Frame" as DummyFrame
    class FactoryManagedFrame {
      +Predefined getFactoryKey()
    }

    enum Predefined {
      +GCRF
      +ICRF
      +EME2000
      +...
    }

    class FramesFactory {
      +Frame getFrame(Predefined factoryKey)
      +Frame getGCRF()
      +Frame getICRF()
      +FactoryManagedFrame getEME2000()
      +FactoryManagedFrame get...()
    }

    TransformProvider --> Transform : creates
    TransformProvider "1" <--* Frame : transform from parent
    Frame               -right->        Transform
    Frame               <|--       UpdatableFrame
    Frame               <|--       TopocentricFrame
    Frame               <|--       LocalOrbitalFrame
    Frame               <|--       DummyFrame
    Frame               <|--       FactoryManagedFrame
    FactoryManagedFrame <--*       FramesFactory
    Predefined <-left- FramesFactory

    InterpolatingTransformProvider --|> TransformProvider
'    InterpolatingTransformProvider *--> "1" TimeStampedCache
    TransformProvider <|-- FixedTransformProvider
    FixedTransformProvider *--> "1" Transform       
    EME2000Provider        --|> TransformProvider
    ITRFProvider           --|> TransformProvider
    MODProvider            --|> TransformProvider
    DummyProvider          --|> TransformProvider

  end package

  TimeStamped         <|-- Transform
  TimeShiftable_T_    <|-- Transform
  TimeInterpolable_T_ <|-- Transform

    package utils #DDEBD8
      enum IERSConventions {
        +IERS_1996
        +IERS_2003
        +IERS_2010
      }
      FramesFactory --> IERSConventions
    end package

  end package

@enduml
