import org.antlr.stringtemplate.StringTemplate import org.apache.commons.lang.StringEscapeUtils import org.apache.commons.lang.StringUtils import eu.dnetlib.hope.domains.common.Derivative import eu.dnetlib.hope.domains.common.LandingPage import eu.dnetlib.hope.domains.common.OAIHeader import eu.dnetlib.hope.domains.visual.* class SozArchUtils{ // def List collectionsWithUpdatedKeywords = [ // 'F_5018', // 'F_5020', // 'F_5024', // 'F_5028', // 'F_5030', // 'F_5041' , // 'F_5043', // 'F_5032', // 'F_5045' // ] String transformSozObjekt(Node sozObjekt, StringTemplate template, String dateOfColl, String repoId, String set, String collectionId, generateResourceWrap){ //reset the template for the current object template.reset() //identifiers: def String metadataId = sozObjekt.Field.find{it.'@Name'.equals('Signatur')}.'@Value' def String resourcePid = 'http://hdl.handle.net/'+sozObjekt.Field.find{it.'@Name'.equals('tk_pid')}.'@Value' def String repoObjId = (repoId+"::"+metadataId) def String landingPageURL = 'http://www.bild-video-ton.ch/archiv/images?Bilder.Signatur='+metadataId //oai header def OAIHeader oaiheader = new OAIHeader(dateOfCollection:dateOfColl, repositoryId:repoId, setSpec:set, identifier:metadataId, objIdentifier:repoObjId) template.setAttribute("oaiheader", oaiheader) def src = "Schweizerisches Sozialarchiv" def parentId = collectionId def LidoIdentifiers lidoIds= new LidoIdentifiers(source:src, localID:metadataId, pid:'', parentID:parentId) template.setAttribute("lido", lidoIds) def String europeanaType = sozObjekt.Field.find{it.'@Name'.equals('dcTY_typ')}?.'@Value' def List objMeasures =[] if(europeanaType.equals('VIDEO') ||europeanaType.equals('SOUND') ) objMeasures = sozObjekt.Field.findAll{it.'@Name'.equals('dcFO_dauer')}.collect{getDurationString(StringEscapeUtils.escapeXml(recodeLineBreaks(it.'@Value')))} if(europeanaType.equals('IMAGE') ||europeanaType.equals('3D') ) objMeasures = sozObjekt.Field.findAll{it.'@Name'.equals('tk_objSize')}.collect{StringEscapeUtils.escapeXml(recodeLineBreaks(it.'@Value'))} def List materials = sozObjekt.Field.findAll{it.'@Name'.equals('ssaOrig_detOt1')}*.'@Value'?.findAll{it != null} if(materials ==null || materials.isEmpty()) materials = sozObjekt.Field.findAll{it.'@Name'.equals('dcFO_detOt')}*.'@Value' def List depictedActors = sozObjekt.Field.findAll{it.'@Name'.equals('ssaPersonen')}*.'@Value'.findAll{it && it != ''}.collect{new LidoActor(type:'person', preferredName:it)} def List lidoSubjects = [ new TypedSubjects(type:"depiction", dates:sozObjekt.Field.findAll{it.'@Name'.equals('tk_year')}*.'@Value', actors:depictedActors, concepts: [], places: sozObjekt.Field.findAll{it.'@Name'.equals('dcCO_geopo')}.collect{new LidoPlace(preferredName:it.'@Value')}+ sozObjekt.Field.findAll{it.'@Name'.equals('tk_iso3166')}.collect{new LidoPlace(preferredName:it.'@Value')}+ sozObjekt.Field.findAll{it.'@Name'.equals('dcCO_geona')}.collect{ new LidoPlace(preferredName:it.'@Value')} ), new TypedSubjects(type:'association', objects:sozObjekt.Field.findAll{it.'@Name'.equals('tk_topic')}*.'@Value' ) ] //sozObjekt.Field.findAll{it.'@Name'.equals('ssaLink1')}*.'@Value' + sozObjekt.Field.findAll{it.'@Name'.equals('ssaLink2')}*.'@Value' def List creationObjects = [ sozObjekt.Field.find{it.'@Name'.equals('dcCR_crea')}?.'@Value', sozObjekt.Field.find{it.'@Name'.equals('dcPU_verle')}?.'@Value' ]. findAll{it && it != ''}.collect{new LidoActor(preferredName:StringEscapeUtils.escapeXml(it))} def List creationPersons = [ sozObjekt.Field.find{it.'@Name'.equals('dcCR_autor')}?.'@Value', sozObjekt.Field.find{it.'@Name'.equals('dcCR_regie')}?.'@Value', sozObjekt.Field.find{it.'@Name'.equals('dcCO_weiBe')}?.'@Value' ] .findAll{it && it != ''}.collect{new LidoActor(preferredName:StringEscapeUtils.escapeXml(it), type:'person')} def LidoEvent creationEvt = new LidoEvent(type:'creation', eventMaterialsTech:[ new LidoMaterial(type:'material', terms:materials) ], eventDisplayDates:[ sozObjekt.Field.findAll{it.'@Name'.equals('dcDA_dat_aufn')}*.'@Value' ], eventActors:creationObjects+creationPersons ) def String owner = sozObjekt.Field.find{it.'@Name'.equals('tk_owner')}?.'@Value' if(!owner) owner = src def List thema = sozObjekt.Field.findAll{it.'@Name'.equals('dcSU_thema')}*.'@Value' def List descrs = sozObjekt.Field.findAll{it.'@Name'.equals('dcBE_abstr') && !it.'@Value'.isEmpty() }.collect{new LidoDescription(langCode:"ger", value:it.'@Value', type:'brief description')} if(descrs.isEmpty()) descrs = thema.collect{new LidoDescription(langCode:"ger", value:recodeLineBreaks(it), type:'brief description')} def List resLang = sozObjekt.Field.findAll{it.'@Name'.equals('dcLA_spra')}*.'@Value' def List technicalAttrs = sozObjekt.Field.findAll{it.'@Name'.equals('dcFO_farbe')}.collect{recodeLineBreaks(it.'@Value')} + sozObjekt.Field.findAll{it.'@Name'.equals('dcFO_zust')}.collect{recodeLineBreaks(it.'@Value')} + sozObjekt.Field.findAll{it.'@Name'.equals('ssaZustand')}.collect{recodeLineBreaks(it.'@Value')} //stumm support (affects F9003) if(europeanaType.equals('VIDEO') && resLang.contains('stumm')) technicalAttrs.add('Stummfilm') //def keywords = sozObjekt.Field.findAll{it.'@Name'.equals('dcCO_geopo')}*.'@Value' + sozObjekt.Field.findAll{it.'@Name'.equals('dcCO_geona')}*.'@Value' + sozObjekt.Field.findAll{it.'@Name'.equals('ssaPersonen')}*.'@Value' // if(collectionsWithUpdatedKeywords.contains(collectionId)){ def keywords = sozObjekt.Field.findAll{it.'@Name'.equals('tk_geopo')}*.'@Value' + sozObjekt.Field.findAll{it.'@Name'.equals('tk_geona')}*.'@Value' //} //workTypes will be mapped into objectNames def LidoDescriptiveMetadata lidoDescrMD = new LidoDescriptiveMetadata( workTypes:sozObjekt.Field.findAll{it.'@Name'.equals('tk_detOt')}*.'@Value', lang:"ger", objectMeasurements:objMeasures, repositoryName:src, europeanaType:europeanaType, collectionItemNumber:sozObjekt.Field.find{it.'@Name'.equals('Signatur')}?.'@Value', titles:sozObjekt.Field.findAll{it.'@Name'.equals('dcTI_haupt')}.collect{new LidoTitle(langCode:"ger", value:StringEscapeUtils.escapeXml(recodeLineBreaks(it.'@Value')))}, descriptions:descrs, inscriptions: sozObjekt.Field.findAll{it.'@Name'.equals('dcBE_inhalt')}.collect{new LidoTitle(langCode:"ger", value:recodeLineBreaks(it.'@Value'))}, techAttributes:technicalAttrs, owners:[owner], creationEvent:creationEvt, typedSubjects:lidoSubjects, displaySubjects:keywords) template.setAttribute("lidoDescr", lidoDescrMD) def String rights = sozObjekt.Field.find{it.'@Name'.equals('ssaRechte')}?.'@Value' def LidoAdminMetadata lidoAdminMD = new LidoAdminMetadata(lang:"ger", landingPage:new LandingPage(localID:landingPageURL, href:landingPageURL), recordType:"item", europeanaRights:rights, rightsCreditLines:[], resources:[ generateResourceWrap(sozObjekt) ]) template.setAttribute("lidoAdmin", lidoAdminMD) return template.toString(); } def generateDefaultResourceWrap = {sozObjekt -> def String resourcePid = 'http://hdl.handle.net/'+sozObjekt.Field.find{it.'@Name'.equals('tk_pid')}.'@Value' def String europeanaType = sozObjekt.Field.find{it.'@Name'.equals('dcTY_typ')}?.'@Value' def String rights = sozObjekt.Field.find{it.'@Name'.equals('ssaRechte')}?.'@Value' def String trans = '' //set resourcePid to null, so we do not generate digital resources for closed objects if(rights.equals("kein Onlinezugriff auf Ressource!") || rights.equals("kein Online-Zugriff auf Ressource!")){ resourcePid = '' } if(europeanaType.equals('SOUND') || europeanaType.equals('VIDEO')) trans = StringEscapeUtils.escapeXml(recodeLineBreaks(sozObjekt.Field.find{it.'@Name'.equals('dcBE_besch')}?.'@Value')) def ders = [ new Derivative(pid:resourcePid+'?locatt=view:level2', type:'derivative2'), new Derivative(pid:resourcePid+'?locatt=view:level3', type:'derivative3') ] def LidoResourceWrap resWrap = new LidoResourceWrap(localID:resourcePid, pid:resourcePid, europeanaType:sozObjekt.Field.find{it.'@Name'.equals('dcTY_typ')}?.'@Value', languages:sozObjekt.Field.findAll{it.'@Name'.equals('dcLA_spra')}*.'@Value', creditLine:rights,transcription:trans, derivatives:ders) return resWrap; } def recodeLineBreaks = { input -> return StringUtils.replace(input, '\\n', ' -- ') } def getDurationString ={String date -> def String[] splitted = date.split("T") if (splitted.length == 1) return null; else return "Duration: "+splitted[1]; } }