import org.antlr.stringtemplate.StringTemplate import eu.dnetlib.hope.domains.common.Derivative import eu.dnetlib.hope.domains.common.LandingPage import eu.dnetlib.hope.domains.common.LanguagedValue import eu.dnetlib.hope.domains.common.OAIHeader import eu.dnetlib.hope.domains.library.MarcPublication import eu.dnetlib.hope.domains.library.MarcRecord import eu.dnetlib.hope.domains.library.MarcRelative import eu.dnetlib.hope.domains.library.MarcResource import eu.dnetlib.hope.domains.library.MarcTitle import eu.dnetlib.hope.domains.library.MarcTranslatedTitle class AMSABModsUtils { def String transformModsRecord(Node modsNode, StringTemplate template, String dateOfColl, String repoId, String set, collectionPID){ //reset the template for the current Faust-Objekt template.reset() //identifiers def String objPID = modsNode.'*:identifier'.findAll{ it.'@displayLabel' == 'landing page'}.find{it.'@type' == 'pid'}.text() def String repoObjId = (repoId+"::"+objPID) //oai header def OAIHeader oaiheader = new OAIHeader(dateOfCollection:dateOfColl, repositoryId:repoId, setSpec:set, identifier:objPID, objIdentifier:repoObjId) def String issn = modsNode.'*:identifier'.find { it['@type'] == 'issn' }?.text() def String bookNo = modsNode.'*:identifier'.find { it['@type'] == 'book number' }?.text() def LandingPage landingpage = new LandingPage(localID:objPID, href:objPID) def MarcTranslatedTitle mainTitle = new MarcTranslatedTitle(original:modsNode.'*:titleInfo'.'*:title'.text()) def MarcTitle marcTitle = new MarcTitle(main: mainTitle, responsibility:modsNode.'*:name'.'*:namePart'.text(), materialDesignation:modsNode.'*:typeOfResource'.'@displayLabel') def MarcPublication marcPublication= new MarcPublication(placeOfPublication:modsNode.'*:originInfo'.'*:place'.'*:placeTerm'.text(), publisher: modsNode.'*:originInfo'.'*:publisher'.text(), dateOfPublication:modsNode.'*:originInfo'.'*:dateIssued'.text()) //Use following mapping for the value: BIBLIOTHEEK:tijdschriften corresponds to periodicals, //BIBLIOTHEEK:jaren corresponds to year, Bibliotheek:nummers corresponds to issue def String descrLevel = modsNode.'*:levelOfDescription'.text() //if(descrLevel.equals('BIBLIOTHEEK:Tijdschriften')) descrLevel = 'periodicals' //if(descrLevel.equals('BIBLIOTHEEK:Jaren')) descrLevel = 'year' //if(descrLevel.equals('BIBLIOTHEEK:Nummers')) descrLevel = 'issue' def String edmRights = modsNode.'*:accessCondition'.text() if(!edmRights) edmRights ="Unknown" def List resourceLanguages = modsNode.'*:language'.'*:languageTerm'*.text() //removed keywords as they were just a repetition of subject-topics //keywords:modsNode.'*:subject'?.'*:topic'*.text(), topicSubjects_650:modsNode.'*:subject'.'*:topic'*.text(), def MarcRecord marcRecord = new MarcRecord(leader:'NA',pid:objPID, aggregator:'', descriptionLevel:descrLevel, localID:objPID, issn_022:issn, landingPage:landingpage, providerName:modsNode.'*:dataProvider'?.text(), providerLanguage:modsNode.'*:language'?.'*:languageTerm'[0].text(), bookNo_091:bookNo, extents:modsNode.'*:physicalDescription'?.'*:extent'*.text().collect{return new LanguagedValue(value:it)}, physDetails:[], dimensions:[], materialDesignations:modsNode.'*:physicalDescription'?.'*:form'*.text().collect{return new LanguagedValue(value:it)}, toc:'', theabstracts:[], genre:'', keywords:[], topicSubjects_650:modsNode.'*:subject'.'*:topic'*.text(), creatorPersons_100:modsNode.'*:name'.findAll{it.'@type' .equals("personal")}*.'*:namePart'*.text(), creatorCorps_110:modsNode.'*:name'.findAll{it.'@type' .equals("corporate")}*.'*:namePart'*.text(), contributorMeetings_711:[], personSubjects_600:modsNode.'*:subject'.'*:name'.findAll{it.'@type' .equals("personal")}*.text(), corporateSubjects_610:modsNode.'*:subject'.'*:name'.findAll{it.'@type' .equals("corporate")}*.text(), temporalCoverages_648:modsNode.'*:subject'.'*:temporal'*.text(), spatialCoverages_651:modsNode.'*:subject'.'*:geographic'*.text(), personContributors:[], corporateContributors:[], creatorMeetings_111:[], titles_245:[marcTitle], editionStms_250:[], publication:marcPublication, europeanaType:'TEXT', europeanaRights:edmRights, languages_041 :resourceLanguages ) def String relativePID = modsNode.'*:relatedItem'?.find{it.'@type'.equals("preceding")}?.'*:identifier'?.find{it.'@type'.equals("pid")}?.text() def String parentPID = collectionPID if(!descrLevel.equals('BIBLIOTHEEK:Tijdschriften')) parentPID = modsNode.'*:relatedItem'?.find{it.'@type'.equals("host")}?.'*:identifier'?.find{it.'@type'.equals("pid")}?.text() marcRecord.setParentRecord(new MarcRelative(localID:parentPID, pid:parentPID)) marcRecord.setNextRecord(new MarcRelative(localID:relativePID, pid:relativePID)) def derivative2Nodes = modsNode.'*:identifier'.findAll{it.'@displayLabel'.equals("derivative2")} if(!derivative2Nodes.empty){ def List derivativeList def String der2Pid = derivative2Nodes.find{it.'@type'.equals('pid')}.text() def String der2URL = derivative2Nodes.find{it.'@type'.equals('url')}.text() def String der2Id = derivative2Nodes.find{it.'@type'.equals('id')}.text() def derivative3Nodes = modsNode.'*:identifier'.findAll{it.'@displayLabel'.equals("derivative3")} def String der3Pid = derivative3Nodes.find{it.'@type'.equals('pid')}.text() def String der3URL = derivative3Nodes.find{it.'@type'.equals('url')}.text() def String der3Id = derivative3Nodes.find{it.'@type'.equals('id')}.text() def Derivative der2 = new Derivative(pid:der2Pid, href:der2URL, localID:der2Id, type:'derivative2') def Derivative der3 = new Derivative(pid:der3Pid, href:der3URL, localID:der3Id, type:'derivative3') def String resourcePID = der2Pid.split("\\?")[0] //objPID+"_"+der2Id def MarcResource resource = new MarcResource(pid:resourcePID, id:resourcePID, type:'TEXT', languages:resourceLanguages, rights:edmRights, derivatives:[der2, der3]) template.setAttribute("resources", [resource]) } else template.setAttribute("resources", []) template.setAttribute("oaiheader", oaiheader) template.setAttribute("marc", marcRecord) return template.toString(); } }