package eu.dnetlib.iis.wf.export.actionmanager.module;
import java.util.Collections;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import com.google.common.base.Preconditions;
import eu.dnetlib.actionmanager.actions.AtomicAction;
import eu.dnetlib.actionmanager.common.Agent;
import eu.dnetlib.data.proto.FieldTypeProtos.Qualifier;
import eu.dnetlib.data.proto.OafProtos.Oaf;
import eu.dnetlib.data.proto.OafProtos.OafEntity;
import eu.dnetlib.data.proto.ResultProtos.Result;
import eu.dnetlib.data.proto.ResultProtos.Result.ExternalReference;
import eu.dnetlib.data.proto.TypeProtos.Type;
import eu.dnetlib.iis.export.schemas.DocumentToSoftwareUrls;
import eu.dnetlib.iis.export.schemas.SoftwareUrl;
/**
* Converts {@link DocumentToSoftwareUrls} holding links to software into {@link AtomicAction} objects.
*
* @author mhorst
*
*/
public class DocumentToSoftwareUrlActionBuilderModuleFactory extends AbstractActionBuilderFactory<DocumentToSoftwareUrls> {
// ------------------------ CONSTRUCTORS --------------------------
public DocumentToSoftwareUrlActionBuilderModuleFactory() {
super(AlgorithmName.document_software_url);
}
// ---------------------- LOGIC ----------------------------
@Override
public ActionBuilderModule<DocumentToSoftwareUrls> instantiate(Configuration config, Agent agent, String actionSetId) {
return new DocumentToSoftwareUrlActionBuilderModule(provideTrustLevelThreshold(config), agent, actionSetId);
}
// ---------------------- INNER CLASSES ----------------------------
class DocumentToSoftwareUrlActionBuilderModule extends AbstractBuilderModule<DocumentToSoftwareUrls> {
// ---------------------- CONSTRUCTORS ----------------------------
/**
* @param trustLevelThreshold trust level threshold or null when all records should be exported
* @param agent action manager agent details
* @param actionSetId action set identifier
*/
public DocumentToSoftwareUrlActionBuilderModule(Float trustLevelThreshold, Agent agent, String actionSetId) {
super(trustLevelThreshold, buildInferenceProvenance(), agent, actionSetId);
}
// ---------------------- LOGIC ----------------------------
@Override
public List<AtomicAction> build(DocumentToSoftwareUrls object) throws TrustLevelThresholdExceededException {
Preconditions.checkNotNull(object);
Oaf oaf = buildOafWithSoftwareUrl(object);
if (oaf != null) {
return getActionFactory().createUpdateActions(getActionSetId(), getAgent(),
object.getDocumentId().toString(), Type.result, oaf.toByteArray());
} else {
return Collections.emptyList();
}
}
// ---------------------- PRIVATE ----------------------------
/**
* Builds {@link Oaf} object containing external reference to url hosting software.
*
* @param source document to software urls
* @return {@link Oaf} object containing external references pointing to software urls
* @throws TrustLevelThresholdExceededException
*/
private Oaf buildOafWithSoftwareUrl(DocumentToSoftwareUrls source) throws TrustLevelThresholdExceededException {
if (!source.getSoftwareUrls().isEmpty()) {
Result.Builder resultBuilder = Result.newBuilder();
for (SoftwareUrl sofwareUrl : source.getSoftwareUrls()) {
resultBuilder.addExternalReference(buildExternalReference(sofwareUrl));
}
OafEntity.Builder entityBuilder = OafEntity.newBuilder();
entityBuilder.setId(source.getDocumentId().toString());
entityBuilder.setType(Type.result);
entityBuilder.setResult(resultBuilder.build());
return buildOaf(entityBuilder.build());
}
return null;
}
private ExternalReference buildExternalReference(SoftwareUrl sofwareUrl) throws TrustLevelThresholdExceededException {
ExternalReference.Builder externalRefBuilder = ExternalReference.newBuilder();
externalRefBuilder.setUrl(sofwareUrl.getSoftwareUrl().toString());
externalRefBuilder.setSitename(sofwareUrl.getRepositoryName().toString());
Qualifier.Builder qualifierBuilder = Qualifier.newBuilder();
qualifierBuilder.setClassid("software");
qualifierBuilder.setClassname("software");
qualifierBuilder.setSchemeid("dnet:externalReference_typologies");
qualifierBuilder.setSchemename("dnet:externalReference_typologies");
externalRefBuilder.setQualifier(qualifierBuilder.build());
externalRefBuilder.setDataInfo(buildInference(sofwareUrl.getConfidenceLevel()));
return externalRefBuilder.build();
}
}
}