/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.core.plugins.plugins.ingest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.roda.core.RodaCoreFactory;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.exceptions.InvalidParameterException;
import org.roda.core.data.v2.ip.TransferredResource;
import org.roda.core.data.v2.jobs.PluginParameter;
import org.roda.core.data.v2.jobs.PluginParameter.PluginParameterType;
import org.roda.core.plugins.Plugin;
import org.roda.core.plugins.PluginManager;
import org.roda.core.plugins.plugins.antivirus.AntivirusPlugin;
import org.roda.core.plugins.plugins.base.DescriptiveMetadataValidationPlugin;
import org.roda.core.plugins.plugins.base.ReplicationPlugin;
import org.roda.core.plugins.plugins.characterization.PremisSkeletonPlugin;
import org.roda.core.plugins.plugins.characterization.SiegfriedPlugin;
public class ConfigurableIngestPlugin extends DefaultIngestPlugin {
private Map<String, PluginParameter> pluginParameters = new HashMap<>();
private List<String> deactivatedPlugins = new ArrayList<>();
@Override
public String getName() {
return "Default ingest workflow";
}
@Override
public String getVersionImpl() {
return "1.0";
}
@Override
public String getDescription() {
return "Performs all the tasks needed to ingest a SIP into the repository and therefore creating an AIP.";
}
@Override
public List<PluginParameter> getParameters() {
loadMap();
ArrayList<PluginParameter> pluginParameters = new ArrayList<>();
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_SIP_TO_AIP_CLASS));
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_PARENT_ID));
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_FORCE_PARENT_ID));
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_DO_VIRUS_CHECK));
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_DO_DESCRIPTIVE_METADATA_VALIDATION));
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_CREATE_PREMIS_SKELETON));
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_DO_FILE_FORMAT_IDENTIFICATION));
if (!deactivatedPlugins.contains(RodaConstants.PLUGIN_CLASS_VERAPDF)) {
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_DO_VERAPDF_CHECK));
}
if (!deactivatedPlugins.contains(RodaConstants.PLUGIN_CLASS_TIKA_FULLTEXT)) {
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_DO_FEATURE_EXTRACTION));
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_DO_FULL_TEXT_EXTRACTION));
}
if (!deactivatedPlugins.contains(RodaConstants.PLUGIN_CLASS_DIGITAL_SIGNATURE)) {
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_DO_DIGITAL_SIGNATURE_VALIDATION));
}
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_DO_PRODUCER_AUTHORIZATION_CHECK));
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_DO_AUTO_ACCEPT));
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_DO_REPLICATION));
pluginParameters.add(getPluginParameter(RodaConstants.PLUGIN_PARAMS_EMAIL_NOTIFICATION));
return pluginParameters;
}
private void loadMap() {
if (pluginParameters.isEmpty()) {
deactivatedPlugins = new ArrayList<>();
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_SIP_TO_AIP_CLASS,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_SIP_TO_AIP_CLASS,
"Format of the Submission Information Packages", PluginParameterType.PLUGIN_SIP_TO_AIP,
"org.roda.core.plugins.plugins.ingest.EARKSIPToAIPPlugin", true, false,
"Select the format of the Submission Information Packages to be ingested in this ingest process."));
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_PARENT_ID,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_PARENT_ID, "Parent node", PluginParameterType.AIP_ID, "", false,
false, "Use the provided parent node if the SIPs does not provide one."));
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_FORCE_PARENT_ID,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_FORCE_PARENT_ID, "Force parent node",
PluginParameterType.BOOLEAN, "false", false, false,
"Force the use of the selected parent node even if the SIPs provide information about the desired parent."));
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DO_VIRUS_CHECK,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_DO_VIRUS_CHECK, AntivirusPlugin.getStaticName(),
PluginParameterType.BOOLEAN, "true", true, false, AntivirusPlugin.getStaticDescription()));
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DO_DESCRIPTIVE_METADATA_VALIDATION,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_DO_DESCRIPTIVE_METADATA_VALIDATION,
DescriptiveMetadataValidationPlugin.getStaticName(), PluginParameterType.BOOLEAN, "true", true, true,
DescriptiveMetadataValidationPlugin.getStaticDescription()));
PluginManager pluginManager = RodaCoreFactory.getPluginManager();
Plugin<?> plugin = pluginManager.getPlugin(RodaConstants.PLUGIN_CLASS_VERAPDF);
if (plugin != null) {
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DO_VERAPDF_CHECK,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_DO_VERAPDF_CHECK, plugin.getName(),
PluginParameterType.BOOLEAN, "false", true, false, plugin.getDescription()));
} else {
deactivatedPlugins.add(RodaConstants.PLUGIN_CLASS_VERAPDF);
}
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_CREATE_PREMIS_SKELETON,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_CREATE_PREMIS_SKELETON, PremisSkeletonPlugin.getStaticName(),
PluginParameterType.BOOLEAN, "true", true, true, PremisSkeletonPlugin.getStaticDescription()));
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DO_PRODUCER_AUTHORIZATION_CHECK,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_DO_PRODUCER_AUTHORIZATION_CHECK,
VerifyUserAuthorizationPlugin.getStaticName(), PluginParameterType.BOOLEAN, "true", true, true,
VerifyUserAuthorizationPlugin.getStaticDescription()));
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DO_FILE_FORMAT_IDENTIFICATION,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_DO_FILE_FORMAT_IDENTIFICATION, SiegfriedPlugin.getStaticName(),
PluginParameterType.BOOLEAN, "true", true, false, SiegfriedPlugin.getStaticDescription()));
plugin = pluginManager.getPlugin(RodaConstants.PLUGIN_CLASS_TIKA_FULLTEXT);
if (plugin != null) {
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DO_FEATURE_EXTRACTION,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_DO_FEATURE_EXTRACTION, "Feature extraction",
PluginParameterType.BOOLEAN, "false", true, false, "Extraction of technical metadata using Apache Tika"));
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DO_FULL_TEXT_EXTRACTION,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_DO_FULL_TEXT_EXTRACTION, "Full-text extraction",
PluginParameterType.BOOLEAN, "false", true, false, "Extraction of full-text using Apache Tika"));
} else {
deactivatedPlugins.add(RodaConstants.PLUGIN_CLASS_TIKA_FULLTEXT);
}
plugin = pluginManager.getPlugin(RodaConstants.PLUGIN_CLASS_DIGITAL_SIGNATURE);
if (plugin != null) {
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DO_DIGITAL_SIGNATURE_VALIDATION,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_DO_DIGITAL_SIGNATURE_VALIDATION, plugin.getName(),
PluginParameterType.BOOLEAN, "false", true, false, plugin.getDescription()));
} else {
deactivatedPlugins.add(RodaConstants.PLUGIN_CLASS_DIGITAL_SIGNATURE);
}
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DO_AUTO_ACCEPT,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_DO_AUTO_ACCEPT, AutoAcceptSIPPlugin.getStaticName(),
PluginParameterType.BOOLEAN, "true", true, false, AutoAcceptSIPPlugin.getStaticDescription()));
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DO_REPLICATION,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_DO_REPLICATION, ReplicationPlugin.getStaticName(),
PluginParameterType.BOOLEAN, "false", true, false, ReplicationPlugin.getStaticDescription()));
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_EMAIL_NOTIFICATION,
new PluginParameter(RodaConstants.PLUGIN_PARAMS_EMAIL_NOTIFICATION, "Ingest finished notification",
PluginParameterType.STRING, "", false, false,
"Send a notification after finishing the ingest process to one or more e-mail addresses (comma separated)"));
}
}
@Override
public void setParameterValues(Map<String, String> parameters) throws InvalidParameterException {
loadMap();
setTotalSteps();
super.setParameterValues(parameters);
}
@Override
public Plugin<TransferredResource> cloneMe() {
return new ConfigurableIngestPlugin();
}
@Override
public PluginParameter getPluginParameter(String pluginParameterId) {
loadMap();
if (pluginParameters.get(pluginParameterId) != null) {
return pluginParameters.get(pluginParameterId);
} else {
return new PluginParameter();
}
}
@Override
public void setTotalSteps() {
this.totalSteps = 11 - deactivatedPlugins.size();
}
@Override
public List<String> getCategories() {
return Arrays.asList(RodaConstants.PLUGIN_CATEGORY_INGEST);
}
@Override
public List<Class<TransferredResource>> getObjectClasses() {
return Arrays.asList(TransferredResource.class);
}
@Override
public Optional<? extends AfterExecute> getAfterExecute() {
return Optional.empty();
}
}