import org.antlr.stringtemplate.StringTemplate import org.apache.commons.lang.StringEscapeUtils 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 VGAMarcUtils { def String transformMarcRecord(Node marcRecord, StringTemplate template, String providerName, String collectionID,String collectionPID, String repoId, String dateOfColl, String set){ //reset the template for the current record template.reset() //identifiers def String objID = marcRecord.'*:datafield'.find{it.'@tag' == '035'}.'*:subfield'.find{it.'@code' == 'x'}.text() def String repoObjId = (repoId+"::"+objID) def String bookNo = marcRecord.'*:datafield'.find{it.'@tag' == '091'}?.'*:subfield'?.find{it.'@code' == 'x'}?.text() //oai header def OAIHeader oaiheader = new OAIHeader(dateOfCollection:dateOfColl, repositoryId:repoId, setSpec:set, identifier:objID, objIdentifier:repoObjId) def LandingPage landingpage = new LandingPage(localID:objID) def Node titleNode = marcRecord.'*:datafield'.find{it.'@tag' == '245'} def String title = titleNode?.'*:subfield'.find{it.'@code' == 'a'}?.text() def String subtitle = titleNode?.'*:subfield'.find{it.'@code' == 'b'}?.text() if(!title && !subtitle){ println "Record with no title: "+objID } def MarcTranslatedTitle mainTitle = new MarcTranslatedTitle( original:title?.substring(title?.indexOf(';'))) def MarcTranslatedTitle subTitle = new MarcTranslatedTitle( original:subtitle?.substring(subtitle?.indexOf(';'))) def MarcTitle marcTitle = new MarcTitle(main: mainTitle, subtitle:subTitle, responsibility:StringEscapeUtils.escapeXml(titleNode?.'*:subfield'.find{it.'@code' == 'c'}?.text())) def publicationNode = marcRecord.'*:datafield'.find{it.'@tag' == '260'} def MarcPublication marcPublication= new MarcPublication( placeOfPublication:publicationNode?.'*:subfield'?.find{it.'@code' == 'a'}?.text(), dateOfPublication:publicationNode?.'*:subfield'?.find{it.'@code' == 'c'}?.text(), dateOfPrinting:marcRecord.'*:datafield'.find{it.'@tag' == '111'}?.'*:subfield'?.find{it.'@code' == 'd'}?.text()) def String descrLevel = 'item' def List resourceLanguages = ['Deutsch'] def String edmRights = marcRecord.'*:datafield'.find{it.'@tag' == '542'}.'*:subfield'.find{it.'@code' == 'a'}?.text() if(!edmRights) println "Record with no edm rights: "+objID def String edmType = marcRecord.'*:datafield'.find{it.'@tag' == '843'}.'*:subfield'.find{it.'@code' == 'a'}?.text() if(!edmType) println "Record with no edm type: "+objID def physdescrNodes = marcRecord.'*:datafield'.findAll{it.'@tag' == '300'} def MarcRecord marc = new MarcRecord(leader:'',pid:'', aggregator:'', descriptionLevel:descrLevel, localID:objID, landingPage:landingpage, parentRecord:new MarcRelative(localID:collectionID,pid:collectionPID), providerName:providerName, providerLanguage:'German', bookNo_091:bookNo, extents: physdescrNodes.'*:subfield'.findAll{it.'@code' == 'a'}*.text().collect{return new LanguagedValue(value:it)}, physDetails:physdescrNodes.'*:subfield'.findAll{it.'@code' == 'b'}*.text().collect{return new LanguagedValue(value:it)}, dimensions:physdescrNodes.'*:subfield'.findAll{it.'@code' == 'c'}*.text().collect{return new LanguagedValue(value:it)}, genre: StringEscapeUtils.escapeXml(marcRecord.'*:datafield'.find{it.'@tag' == '655'}?.'*:subfield'?.find{it.'@code' == 'a'}?.text()), keywords:[], topicSubjects_650:marcRecord.'*:datafield'.findAll{it.'@tag' == '650'}*.'*:subfield'.findAll{it.'@code' == 'a'}*.text(), personSubjects_600:[],corporateSubjects_610:[], temporalCoverages_648:marcRecord.'*:datafield'.findAll{it.'@tag' == '648'}*.'*:subfield'.findAll{it.'@code' == 'a'}*.text(), spatialCoverages_651:[], titles_245:[marcTitle], publication:marcPublication, europeanaType:edmType, europeanaRights:edmRights, languages_041 :resourceLanguages ) //concat('http://hdl.handle.net/11151/', removeFileExtension(//datafield[@tag='843']/subfield[@code='8']), '?locatt=view:level2') def String resourceID = marcRecord.'*:datafield'.find{it.'@tag' == '843'}.'*:subfield'.find{it.'@code' == '8'}?.text() if(!resourceID) resourceID = marcRecord.'*:datafield'.find{it.'@tag' == '035'}.'*:subfield'.find{it.'@code' == 'x'}?.text() else resourceID = resourceID.substring(0, resourceID?.indexOf('.')) def String resourcePID = 'http://hdl.handle.net/11152/'+resourceID if(resourceID){ def der2Pid = resourcePID+'?locatt=view:level2' def der3Pid = resourcePID+'?locatt=view:level3' def Derivative der2 = new Derivative(type:'derivative2', pid:der2Pid) def Derivative der3 = new Derivative(type:'derivative3', pid:der3Pid) def MarcResource resource = new MarcResource(id:resourcePID, pid:resourcePID, type:edmType, languages:resourceLanguages, rights:edmRights, derivatives:[der2, der3]) template.setAttribute("resources", [resource]) } else {template.setAttribute("resources", []) println "No resource to generate for metadata record "+objID } template.setAttribute("oaiheader", oaiheader) template.setAttribute("marc", marc) return template.toString(); } }