package eu.dnetlib.iis.wf.export.actionmanager.module; import java.util.Collections; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apache.hadoop.conf.Configuration; 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.common.WorkflowRuntimeParameters; import eu.dnetlib.iis.export.schemas.Concept; import eu.dnetlib.iis.export.schemas.DocumentToConceptIds; /** * {@link DocumentToConceptIds} holding protein data bank identifiers action builder module. * * @author mhorst * */ public class DocumentToPdbActionBuilderModuleFactory extends AbstractActionBuilderFactory<DocumentToConceptIds> { public static final String EXPORT_PDB_URL_ROOT = "export.referenceextraction.pdb.url.root"; public static final String SITENAME = "Protein Data Bank"; public static final String CLASS = "accessionNumber"; public static final String SCHEME = "dnet:externalReference_typologies"; // ------------------------ CONSTRUCTORS -------------------------- public DocumentToPdbActionBuilderModuleFactory() { super(AlgorithmName.document_pdb); } // ------------------------ LOGIC --------------------------------- @Override public ActionBuilderModule<DocumentToConceptIds> instantiate(Configuration config, Agent agent, String actionSetId) { return new DocumentToPdbActionBuilderModule(provideTrustLevelThreshold(config), config.get(EXPORT_PDB_URL_ROOT), agent, actionSetId); } // ------------------------ INNER CLASS --------------------------------- class DocumentToPdbActionBuilderModule extends AbstractBuilderModule<DocumentToConceptIds> { private final String pdbUrlRoot; // ------------------------ CONSTRUCTORS -------------------------- /** * @param trustLevelThreshold trust level threshold or null when all records should be exported * @param pdbUrlRoot protein databank root url * @param agent action manager agent details * @param actionSetId action set identifier */ public DocumentToPdbActionBuilderModule(Float trustLevelThreshold, String pdbUrlRoot, Agent agent, String actionSetId) { super(trustLevelThreshold, buildInferenceProvenance(), agent, actionSetId); this.pdbUrlRoot = pdbUrlRoot; } // ------------------------ LOGIC --------------------------------- @Override public List<AtomicAction> build(DocumentToConceptIds object) throws TrustLevelThresholdExceededException { Oaf oaf = buildOAFWithPdb(object); if (oaf != null) { return getActionFactory().createUpdateActions(getActionSetId(), getAgent(), object.getDocumentId().toString(), Type.result, oaf.toByteArray()); } else { return Collections.emptyList(); } } /** * Builds {@link Oaf} object containing pdb external references. * @throws TrustLevelThresholdExceededException */ private Oaf buildOAFWithPdb(DocumentToConceptIds source) throws TrustLevelThresholdExceededException { if (CollectionUtils.isNotEmpty(source.getConcepts())) { Result.Builder resultBuilder = Result.newBuilder(); for (Concept concept : source.getConcepts()) { resultBuilder.addExternalReference(buildExternalReference(concept)); } OafEntity.Builder entityBuilder = OafEntity.newBuilder(); if (source.getDocumentId() != null) { entityBuilder.setId(source.getDocumentId().toString()); } entityBuilder.setType(Type.result); entityBuilder.setResult(resultBuilder.build()); return buildOaf(entityBuilder.build()); } // fallback return null; } /** * Builds {@link ExternalReference} instance representing PDB concept. */ private ExternalReference buildExternalReference(Concept concept) throws TrustLevelThresholdExceededException { ExternalReference.Builder externalRefBuilder = ExternalReference.newBuilder(); externalRefBuilder.setSitename(SITENAME); String pdbId = concept.getId().toString(); if (pdbUrlRoot != null && !WorkflowRuntimeParameters.UNDEFINED_NONEMPTY_VALUE.equals(pdbUrlRoot)) { externalRefBuilder.setUrl(pdbUrlRoot + pdbId); } else { throw new RuntimeException(EXPORT_PDB_URL_ROOT + " parameter is undefined!"); } Qualifier.Builder qualifierBuilder = Qualifier.newBuilder(); qualifierBuilder.setClassid(CLASS); qualifierBuilder.setClassname(CLASS); qualifierBuilder.setSchemeid(SCHEME); qualifierBuilder.setSchemename(SCHEME); externalRefBuilder.setQualifier(qualifierBuilder.build()); externalRefBuilder.setRefidentifier(pdbId); externalRefBuilder.setDataInfo(buildInference(concept.getConfidenceLevel())); return externalRefBuilder.build(); } } }