package at.gv.egovernment.moa.spss.api;

import org.apache.commons.discovery.tools.DiscoverClass;

import at.gv.egovernment.moa.spss.MOAException;

/**
 * Configures the SP/SS API.
 * 
 * Also handles dynamic configuration updates. 
 * 
 * @author Patrick Peck
 * @version $Id$
 */
public abstract class Configurator {

  /** The default implementation class. */
  private static final String DEFAULT_IMPLEMENTATION =
    "at.gv.egovernment.moa.spss.server.init.ConfiguratorImpl";

  /** The single instance of this class. */
  private static Configurator instance = null;

  public static synchronized Configurator getInstance() {
    if (instance == null) {
      try {
        DiscoverClass discover = new DiscoverClass();
        instance =
          (Configurator) discover.newInstance(
            Configurator.class,
            DEFAULT_IMPLEMENTATION);
      } catch (Exception e) {
        // this can not happen since we provide a valid default 
        // implementation
      }
    }
    return instance;
  }

  /**
   * Initialize the SP/SS configuration.
   * 
   * Only a single call to this method will have an effect. Use 
   * <code>update()</code> for reflecting changes in the configuration instead. 
   * 
   * @throws MOAException An error occurred updating the SP/SS configuration.
   */  
  public abstract void init() throws MOAException;
  
  /**
   * Update the SP/SS configuration.
   * 
   * This will only have an effect after the system has been initialized once
   * using <code>init()</code>.
   * 
   * @throws MOAException An error occurred updating the SP/SS configuration.
   */
  public abstract void update() throws MOAException;

}