package org.gbif.ipt.service.admin;
import org.gbif.ipt.model.Extension;
import org.gbif.ipt.service.DeletionNotAllowedException;
import org.gbif.ipt.service.InvalidConfigException;
import org.gbif.ipt.service.RegistryException;
import org.gbif.ipt.service.admin.impl.ExtensionManagerImpl;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import com.google.inject.ImplementedBy;
/**
* This interface details ALL methods associated with the DwC extensions.
*/
@ImplementedBy(ExtensionManagerImpl.class)
public interface ExtensionManager {
/**
* Safely remove an installed extension by its unique rowType, making sure no mappings to this extension exist.
*
* @param rowType of installed extension to remove
*
* @throws DeletionNotAllowedException if at least one mapping to this extension exists preventing deletion
*/
void uninstallSafely(String rowType) throws DeletionNotAllowedException;
/**
* Update an installed extension to the latest version, identified by its rowType.
*/
void update(String rowType) throws IOException;
/**
* Update extension if it changed since last time it was updated.
*
* @param rowType the rowType of the extension
*
* @return true if the update happened, false otherwise
*/
boolean updateIfChanged(String rowType) throws IOException, RegistryException;
/**
* Get a locally installed extension by its rowType.
*
* @return extension for that rowtype or null if not installed
*/
Extension get(String rowType);
/**
* Downloads an extension to the local cache and installs it for mapping. If the file is already locally existing
* overwrite the older copy.
*
* @param url the url that returns the xml based extension definition
*/
Extension install(URL url) throws InvalidConfigException;
/**
* List all installed extensions.
*
* @return list of installed IPT extensions
*/
List<Extension> list();
/**
* List all available extensions available for the given core. If no core is specified, list all installed
* extensions.
* </br>
* Extensions available for a given core, will be determined by the extension's keywords list. For example, all
* extensions having keyword dwc:Taxon are available for the Taxon core. An extension with an empty
* keywords list will make the extension available for all cores.
* </br>
* Please note that extensions having an empty keywords list qualify for use by any core.
*
* @param coreRowType core row type, e.g. http://rs.tdwg.org/dwc/terms/Occurrence
*
* @return list including extensions available for the given core, all extensions installed if no core is specified,
* or an empty list if no core extensions have been installed yet
*/
List<Extension> list(String coreRowType);
/**
* List only the available core extensions.
*
* @return list including core extensions available, or an empty list if no core extensions have been installed yet
*/
List<Extension> listCore();
/**
* List only the available core extensions available for the given core. If no core is specified, list all installed
* core extensions.
* </br>
* Core extensions available for a given core, will be determined by the extension's keywords list. For example,
* all core extensions having keyword dwc:Event are available for the Event core. An extension with an empty
* keywords list will NOT make the extension available for all cores.
*
* @param coreRowType core row type, e.g. http://rs.tdwg.org/dwc/terms/Occurrence
*
* @return list including core extensions available for the given core, all core extensions installed if no core is
* installed, or an empty list if no core extensions have been installed yet
*/
List<Extension> listCore(String coreRowType);
/**
* Load all installed extensions from the data dir.
*
* @return number of extensions that have been loaded successfully
*/
int load();
/**
* Install all core type extensions.
*/
void installCoreTypes() throws InvalidConfigException;
/**
* Get a list of all (term) groups/classes in an extension that are redundant, excluding Record-Level terms.
* A redundant group/class, is a group/class that is already included in the core extension.
*
* @return list of redundant groups in an extension
*/
List<String> getRedundantGroups(Extension extension, Extension core);
}