content: package org.alien4cloud.tosca.catalog.index;
  
  import java.util.Collection;
  import java.util.Map;
  
  import org.alien4cloud.tosca.model.CSARDependency;
  import org.alien4cloud.tosca.model.types.AbstractInheritableToscaType;
  import org.alien4cloud.tosca.model.types.AbstractToscaType;
  
  /**
   * Service responsible for indexing TOSCA elements.
   */
  public interface IToscaTypeIndexerService {
      /**
       * Get all {@link AbstractToscaType} from a given archive.
       * 
       * @param archiveName The name of the archive.
       * @param archiveVersion The version of the archive.
       * @return A map of {@link AbstractToscaType} by id.
       */
      Map<String, AbstractToscaType> getArchiveElements(String archiveName, String archiveVersion);
  
      /**
       * Get all elements from a given archive with the given type
       * 
       * @param archiveName The name of the archive.
       * @param archiveVersion The version of the archive.
       * @param type type of the requested elements
       * @param <T> type of element
       * @return all element with the given type within the archive
       */
      <T extends AbstractToscaType> Map<String, T> getArchiveElements(String archiveName, String archiveVersion, Class<T> type);
  
      /**
       * Delete all elements from a given archive.
       * 
       * @param archiveName The name of the archive to delete.
       * @param archiveVersion The version of the archive to delete.
       */
      void deleteElements(String archiveName, String archiveVersion);
  
      /**
       * Index multiple elements into the repository.
       * 
       * @param archiveElements The elements to index.
       * @param dependencies The archive dependencies (in order to add infos from the parent element to the child...)
       */
      void indexInheritableElements(Map<String, ? extends AbstractInheritableToscaType> archiveElements,
              Collection<CSARDependency> dependencies);
  
      /**
       * Index a single element into the repository.
       * 
       * @param archiveName The name of the archive in which the elements lies.
       * @param archiveVersion The version of the archive in which the elements lies.
       * @param element The element to index.
       * @param dependencies The archive dependencies (in order to add infos from the parent element to the child...)
       */
      void indexInheritableElement(String archiveName, String archiveVersion, AbstractInheritableToscaType element, Collection<CSARDependency> dependencies);
  
      /**
       * Delete the given elements from the repository.
       * 
       * @param elements the elements to delete.
       */
      void deleteElements(Collection<AbstractToscaType> elements);
  }