package eu.dnetlib.iis.wf.export.actionmanager.module; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.Test; import com.google.common.collect.Lists; import com.google.protobuf.InvalidProtocolBufferException; import eu.dnetlib.actionmanager.actions.AtomicAction; import eu.dnetlib.data.proto.FieldTypeProtos.ExtraInfo; import eu.dnetlib.data.proto.KindProtos; import eu.dnetlib.data.proto.OafProtos.Oaf; import eu.dnetlib.data.proto.TypeProtos.Type; import eu.dnetlib.iis.common.citations.schemas.CitationEntry; import eu.dnetlib.iis.common.model.extrainfo.ExtraInfoConstants; import eu.dnetlib.iis.common.model.extrainfo.citations.BlobCitationEntry; import eu.dnetlib.iis.common.model.extrainfo.citations.TypedId; import eu.dnetlib.iis.common.model.extrainfo.converter.CitationsExtraInfoConverter; import eu.dnetlib.iis.export.schemas.Citations; import eu.dnetlib.iis.wf.export.actionmanager.cfg.StaticConfigurationProvider; /** * @author mhorst * */ public class CitationsActionBuilderModuleFactoryTest extends AbstractActionBuilderModuleFactoryTest<Citations> { private String docId = "documentId"; // ----------------------- CONSTRUCTORS ------------------- public CitationsActionBuilderModuleFactoryTest() throws Exception { super(CitationsActionBuilderModuleFactory.class, AlgorithmName.document_referencedDocuments); } // ----------------------- TESTS -------------------------- @Test public void testBuildEmptyCitations() throws Exception { // given ActionBuilderModule<Citations> module = factory.instantiate(config, agent, actionSetId); // execute List<AtomicAction> actions = module.build( Citations.newBuilder().setCitations(Collections.emptyList()).setDocumentId(docId).build()); // assert assertNotNull(actions); assertEquals(0, actions.size()); } @Test public void testBuild() throws Exception { // given ActionBuilderModule<Citations> module = factory.instantiate(config, agent, actionSetId); CitationEntry citationEntry = buildCitationEntry(); Citations.Builder builder = Citations.newBuilder(); builder.setDocumentId(docId); builder.setCitations(Lists.newArrayList(citationEntry)); // execute List<AtomicAction> actions = module.build(builder.build()); // assert assertNotNull(actions); assertEquals(1, actions.size()); AtomicAction action = actions.get(0); assertNotNull(action); assertEquals(agent, action.getAgent()); assertNotNull(action.getRowKey()); assertEquals(actionSetId, action.getRawSet()); assertEquals(docId, action.getTargetRowKey()); assertEquals(Type.result.toString(), action.getTargetColumnFamily()); assertOaf(action.getTargetValue(), citationEntry); } @Test public void testConversion() throws Exception { SortedSet<BlobCitationEntry> sortedCitations = new TreeSet<BlobCitationEntry>(); CitationEntry.Builder rawTextCitationEntryBuilder = CitationEntry.newBuilder(); rawTextCitationEntryBuilder.setPosition(44); rawTextCitationEntryBuilder.setRawText("[44] S. Mukhi and R. Nigam, “Constraints on ’rare’ dyon decays,” JHEP 12 (2008) 056, 0809.1157."); rawTextCitationEntryBuilder.setExternalDestinationDocumentIds(Collections.<CharSequence,CharSequence>emptyMap()); CitationEntry.Builder internalCitationEntryBuilder = CitationEntry.newBuilder(); internalCitationEntryBuilder.setRawText("Rugama, Y., Kloosterman, J. L., Winkelman, A., 2004. Prog. Nucl. Energy 44, 1-12."); internalCitationEntryBuilder.setPosition(100); internalCitationEntryBuilder.setDestinationDocumentId("od______2367::00247be440c2188b82d5905b5b1e22bb"); internalCitationEntryBuilder.setConfidenceLevel(0.8f); internalCitationEntryBuilder.setExternalDestinationDocumentIds(Collections.<CharSequence,CharSequence>emptyMap()); CitationEntry.Builder externalPmidCitationEntryBuilder = CitationEntry.newBuilder(); externalPmidCitationEntryBuilder.setRawText("[5] A. Sen, “Walls of Marginal Stability and Dyon Spectrum in N=4 Supersymmetric String Theories,” JHEP 05 (2007) 039, hep-th/0702141."); externalPmidCitationEntryBuilder.setPosition(5); Map<CharSequence, CharSequence> externalPmidDestinationDocumentIds = new HashMap<CharSequence, CharSequence>(); externalPmidDestinationDocumentIds.put("pmid", "20856923"); externalPmidCitationEntryBuilder.setExternalDestinationDocumentIds(externalPmidDestinationDocumentIds); CitationEntry.Builder externalDoiCitationEntryBuilder = CitationEntry.newBuilder(); externalDoiCitationEntryBuilder.setRawText("[17] N. Koblitz. Hyperelliptic cryptosystems. J. Cryptology, 1(3):139–150, 1989."); externalDoiCitationEntryBuilder.setPosition(17); Map<CharSequence, CharSequence> externalDoiDestinationDocumentIds = new HashMap<CharSequence, CharSequence>(); externalDoiDestinationDocumentIds.put("doi", "10.1186/1753-6561-5-S6-P38"); externalDoiDestinationDocumentIds.put("custom-id", "12345"); externalDoiCitationEntryBuilder.setExternalDestinationDocumentIds(externalDoiDestinationDocumentIds); sortedCitations.add(CitationsActionBuilderModuleUtils.build(internalCitationEntryBuilder.build())); sortedCitations.add(CitationsActionBuilderModuleUtils.build(externalPmidCitationEntryBuilder.build())); sortedCitations.add(CitationsActionBuilderModuleUtils.build(externalDoiCitationEntryBuilder.build())); sortedCitations.add(CitationsActionBuilderModuleUtils.build(rawTextCitationEntryBuilder.build())); CitationsExtraInfoConverter converter = new CitationsExtraInfoConverter(); String citationsXML = converter.serialize(sortedCitations); // checking deserialization SortedSet<BlobCitationEntry> deserializedCitations = (SortedSet<BlobCitationEntry>) converter.deserialize(citationsXML); Assert.assertEquals(sortedCitations.size(), deserializedCitations.size()); Iterator<BlobCitationEntry> sortedIt = sortedCitations.iterator(); Iterator<BlobCitationEntry> deserializedIt = deserializedCitations.iterator(); for (int i=0; i<sortedCitations.size(); i++) { Assert.assertEquals(sortedIt.next(), deserializedIt.next()); } } // ----------------------- PRIVATE -------------------------- private CitationEntry buildCitationEntry() { CitationEntry.Builder citationEntryBuilder = CitationEntry.newBuilder(); citationEntryBuilder.setPosition(1); citationEntryBuilder.setRawText("citation raw text"); citationEntryBuilder.setDestinationDocumentId("50|dest-id"); Map<CharSequence, CharSequence> extIds = new HashMap<>(); extIds.put("extIdType", "extIdValue"); citationEntryBuilder.setExternalDestinationDocumentIds(extIds); citationEntryBuilder.setConfidenceLevel(0.9f); return citationEntryBuilder.build(); } private void assertOaf(byte[] oafBytes, CitationEntry sourceEntry) throws InvalidProtocolBufferException { assertNotNull(oafBytes); Oaf.Builder oafBuilder = Oaf.newBuilder(); oafBuilder.mergeFrom(oafBytes); Oaf oaf = oafBuilder.build(); assertNotNull(oaf); assertTrue(KindProtos.Kind.entity == oaf.getKind()); assertNotNull(oaf.getEntity()); assertEquals(docId, oaf.getEntity().getId()); assertNotNull(oaf.getEntity().getResult()); assertEquals(1, oaf.getEntity().getExtraInfoCount()); ExtraInfo extraInfo = oaf.getEntity().getExtraInfo(0); assertNotNull(extraInfo); assertEquals(ExtraInfoConstants.NAME_CITATIONS, extraInfo.getName()); assertEquals(ExtraInfoConstants.TYPOLOGY_CITATIONS, extraInfo.getTypology()); assertEquals(StaticConfigurationProvider.ACTION_TRUST_0_9, extraInfo.getTrust()); assertEquals(((AbstractActionBuilderFactory<Citations>) factory).buildInferenceProvenance(), extraInfo.getProvenance()); assertTrue(StringUtils.isNotBlank(extraInfo.getValue())); CitationsExtraInfoConverter converter = new CitationsExtraInfoConverter(); Set<BlobCitationEntry> citationEntries = converter.deserialize(extraInfo.getValue()); assertNotNull(citationEntries); assertEquals(1, citationEntries.size()); BlobCitationEntry citationEntry = citationEntries.iterator().next(); assertNotNull(citationEntry); assertEquals(sourceEntry.getPosition().intValue(), citationEntry.getPosition()); assertEquals(sourceEntry.getRawText(), citationEntry.getRawText()); List<TypedId> ids = citationEntry.getIdentifiers(); assertNotNull(ids); assertEquals(2, ids.size()); assertEquals(ExtraInfoConstants.CITATION_TYPE_OPENAIRE, ids.get(0).getType()); assertEquals(sourceEntry.getDestinationDocumentId(), ids.get(0).getValue()); Entry<CharSequence, CharSequence> sourceExtIdEntry = sourceEntry.getExternalDestinationDocumentIds() .entrySet().iterator().next(); assertEquals(sourceExtIdEntry.getKey(), ids.get(1).getType()); assertEquals(sourceExtIdEntry.getValue(), ids.get(1).getValue()); } }