/**
   * Update state by adding all additional states.
   *
   * @param original original state
   * @return updated state, with all additional states included
   * @exception PropagationException if one of the providers throws one
   * @see #addAdditionalStateProvider(AdditionalStateProvider)
   */
  protected SpacecraftState updateAdditionalStates(final SpacecraftState original)
      throws PropagationException {

    // start with original state,
    // which may already contain additional states, for example in interpolated ephemerides
    SpacecraftState updated = original;

    if (initialState != null) {
      // there is an initial state
      // (null initial states occur for example in interpolated ephemerides)
      // copy the additional states present in initialState but otherwise not managed
      for (final Map.Entry<String, double[]> initial :
          initialState.getAdditionalStates().entrySet()) {
        if (!isAdditionalStateManaged(initial.getKey())) {
          // this additional state was in the initial state, but is unknown to the propagator
          // we simply copy its initial value as is
          updated = updated.addAdditionalState(initial.getKey(), initial.getValue());
        }
      }
    }

    // update the additional states managed by providers
    for (final AdditionalStateProvider provider : additionalStateProviders) {
      updated =
          updated.addAdditionalState(provider.getName(), provider.getAdditionalState(updated));
    }

    return updated;
  }
 /** {@inheritDoc} */
 public boolean isAdditionalStateManaged(final String name) {
   for (final AdditionalStateProvider provider : additionalStateProviders) {
     if (provider.getName().equals(name)) {
       return true;
     }
   }
   return false;
 }
  /** {@inheritDoc} */
  public void addAdditionalStateProvider(final AdditionalStateProvider additionalStateProvider)
      throws OrekitException {

    // check if the name is already used
    if (isAdditionalStateManaged(additionalStateProvider.getName())) {
      // this additional state is already registered, complain
      throw new OrekitException(
          OrekitMessages.ADDITIONAL_STATE_NAME_ALREADY_IN_USE, additionalStateProvider.getName());
    }

    // this is really a new name, add it
    additionalStateProviders.add(additionalStateProvider);
  }