content: package alien4cloud.orchestrators.plugin;
  
  import java.util.Map;
  
  import org.alien4cloud.tosca.model.definitions.PropertyDefinition;
  import alien4cloud.model.orchestrators.ArtifactSupport;
  import alien4cloud.model.orchestrators.locations.LocationSupport;
  
  /**
   * Implementation of these class are responsible for providing the common settings for an orchestrators and creating instances responsible for orchestrators
   * connexion.
   * This is the entry point of an orchestrators plugin.
   *
   * @param <T> Type of the orchestrator that this factory creates.
   * @param <V> Type of the configuration of the orchestrator that the factory creates.
   */
  public interface IOrchestratorPluginFactory<T extends IOrchestratorPlugin<V>, V> {
      /**
       * Create a new IOrchestrator instance.
       *
       * @return An instance of the IOrchestrator.
       */
      T newInstance(V configuration);
  
      /**
       * Can be called to destroy the context linked to this instance
       *
       * @param instance provides the instance of IOrchestrator created by this factory that needs to be destroyed.
       */
      void destroy(T instance);
  
      /**
       * Get the default configuration for this provider.
       *
       * @return Return an instance of the default configuration for the orchestrator.
       */
      V getDefaultConfiguration();
  
      /**
       * Get the type of the configuration.
       *
       * @return Type of the object that defines the cloud configuration.
       */
      Class<V> getConfigurationType();
  
      /**
       * Return an object that contains informations on location(s) supported by the orchestrator.
       *
       * @return An instance of LocationSupport that contains the details on what locations the orchestrator can support.
       */
      LocationSupport getLocationSupport();
  
      /**
       * Return an object that contains informations on artifact(s) supported by the orchestrator.
       *
       * @return An instance of ArtifactSupport that contains the details on what artifacts the orchestrator can support.
       */
      ArtifactSupport getArtifactSupport();
  
      /**
       * Get the deployment property definition
       *
       * @return A map containing property definitions
       */
      Map<String, PropertyDefinition> getDeploymentPropertyDefinitions();
  
      /**
       * Get the type of orchestrator this factory provides. ex: cloudify3
       * 
       * @return
       */
      String getType();
  
      /**
       * Cleanup to do when the orchestrator is deleted
       * @param id
       */
      default void delete(String id) {}
  }