import java.util.concurrent.BlockingQueue import org.antlr.stringtemplate.StringTemplate import org.antlr.stringtemplate.StringTemplateGroup import org.antlr.stringtemplate.language.DefaultTemplateLexer import org.apache.commons.lang.StringEscapeUtils import eu.dnetlib.enabling.manager.msro.hope.groovy.RunnableGroovy 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.LIDOCollection import eu.dnetlib.hope.domains.visual.LidoDescription import eu.dnetlib.hope.domains.visual.LidoPlace import eu.dnetlib.hope.domains.visual.LidoResourceWrap import eu.dnetlib.hope.domains.visual.LidoTitle import eu.dnetlib.hope.domains.visual.TypedSubjects /** * DNetGroovy class for SSA F_9011. * @author alessia * */ class SozArchLIDO9011 implements RunnableGroovy { def String templatePath = "/var/lib/hope-scripts/templates" def SozArchUtils utils = new SozArchUtils() def BlockingQueue resultsQueue, inputQueue; def String collectionID = 'F_9011' /** * Driver namespace for elements in the OAI header. */ def dri = new groovy.xml.Namespace("http://www.driver-repository.eu/namespace/dri", 'dri') def generateCollectionRecord = { template, repoId, setSpec, dateOfCollection -> def String lPageURL = "http://www.bild-video-ton.ch/archiv/images?Bilder.ssaBestand=F_9011 Schweizerischer Metall- und Uhrenarbeiterverband (SMUV)" def String providerName = 'Schweizerisches Sozialarchiv' def String abstractSum=""" "Ähnlich wie andere soziale Bewegungen entdeckten die Gewerkschaften Ende der 1970er Jahre das Medium Video als Möglichkeit, die eigenen Tätigkeiten zu dokumentieren. Die Aufnahmen der Gewerkschaften GTCP, GBH, GBI und SMUV sind aus verschiedenen Gründen bemerkenswert. Die Verbreitung von Consumerformaten wie U-Matic, VCR und VHS machte die Aufnahme von Videos finanziell erschwinglich und technisch auch für Laien schnell erlernbar. Im Unterschied aber zur Jugendbewegung etwa, die sich in kürzester Zeit die Möglichkeiten des Mediums aneignete, sich innovativ der verschiedensten Ausdrucksformen bediente und Agitations-, Kunst- und parodistische Videos drehte, beschränkte sich das gewerkschaftliche Videoschaffen in den Pionier- und Experimentierjahren auf rein Dokumentarisches: Aufnahmen existieren etwa vom Kongress der Gewerkschaft Textil Chemie Papier GTCP von 1978 in Luzern (Signatur: F 9013-025ff.), von einer Krisensitzung derselben Gewerkschaft 1977 (F 9013-019ff.) und von einer Jugendkonferenz der Gewerkschaft Bau und Holz (GBH von 1980, F 9013-031). Die Aufnahmen sind zwar laienhaft, mit Tonstörungen behaftet und manchmal kurios lückenhaft oder langatmig. Als Zeitdokumente sind sie trotzdem von Bedeutung. Gerade die Aufnahmen des GTCP-Kongresses von 1978 und der erwähnten Krisensitzung geben einen Eindruck über den Zustand einer Gewerkschaft in schwieriger Zeit: Zum einen sorgten die Absatzeinbrüche in der Textilindustrie der zweiten Hälfte der 1970er-Jahre und spektakuläre Schliessungen wie die des Firestone-Werks in Pratteln 1977 zu einer Krisenstimmung. Zum andern entwickelten sich auch in der GTCP Spannungen zwischen einer eher konsensorientierten alten Garde und jungen Kräften, die die bestehenden Verhältnisse mit kämpferischer Einstellung zu verändern trachteten. Die Kongressaufnahmen sind ein konzentriertes Zeugnis dieser konjunkturell und ideologisch bestimmten Krisenstimmungen der GTPC. Als Bonus können wir auch miterleben, dass der als Festredner engagierte Bundesrat Willy Ritschard nicht nur Reden hielt, die von Wortwitz und träfen Sprüchen sprühten, sondern auch schlechtere Tage hatte... Im Verlauf der 1980er Jahre professionalisierte sich das gewerkschaftliche Videoschaffen. Mit der Herstellung von Bildungs- und Imagevideos nahm die Arbeiterbewegung eine Propagandamethode wieder auf, die zwischen 1930 und 1960 bereits zu einer ansehnlichen Reihe von Gewerkschaftsfilmen geführt hatte. Hervorzuheben sind aus dieser Zeit ""Treu und Glauben – 50 Jahre Friedensabkommen in der Maschinen- und Metallindustrie"" von 1988 (F 9011-002, dt. und frz. Fassung) oder „Sumoteam“ von 1995 (F 9011-007), der aus gewerkschaftlicher Perspektive eine partizipativere Form der Arbeitsgestaltung in einer Textilmaschinenfabrik schildert. Kämpferische Töne – wie sie zuletzt im Filmschaffen der Arbeiterbewegung der frühen 1930er-Jahre auftauchten – liessen lange auf sich warten. Die massiven weltwirtschaftlichen Umwälzungen und die neoliberale Offensive vieler Unternehmer in den 1990er-Jahren führten zu Betriebsschliessungen, Entlassungen und Verlagerungen der Produktion in Billiglohnländer. Die Gewerkschaften reagierten darauf zum Teil mit Kampfmassnahmen und unter anderem auch damit, mit Videoproduktion für eine grössere Öffentlichkeit und mehr Verständnis für ihre Anliegen zu sorgen. Schöne Beispiele dieser Strategie sind die Videos „Zyliss – Der Streik wird salonfähig“ von 2003 (Regie: Verena Endtner im Auftrag von SMUV und GBI, F 9011-014) oder „Les bras fonctionnent, c'est la tête qui va pas!“ von 2003, eine leidenschaftliche Dokumentation des Einsatzes von Giessereiarbeitern für ihre Arbeitsplätze bei den beiden jurassischen Von Roll-Werke in Choindez und Les Rondez (F 9011-016). " """ def OAIHeader collOaiheader = new OAIHeader(dateOfCollection:dateOfCollection, repositoryId:repoId, setSpec:setSpec, identifier:collectionID, objIdentifier:repoId+"::"+collectionID) def LIDOCollection coll = new LIDOCollection(collectionID:collectionID, langCode:'ger', titles:[ new LidoTitle(value:"Schweizerischer Metall- und Uhrenarbeiterverband (SMUV) - Gewerkschaft Industrie, Gewerbe, Dienstleistungen - Fédération suisse des ouvriers sur métaux et horlogers (FOMH) - Federazione degli operai metallurgici e degli orologiai (FOMO)") ], abstractSummaries:[ new LidoDescription(type:'abstract', value:abstractSum) ], collItemLanguages:[ 'ger', 'por', 'spa', 'gsw', 'ita' ], creationDates:['1989P14Y'], accumulationDates:['2005'], owners:[providerName], sizeItems:'16', itemType:'VIDEO', itemFormatStm:'VHS, DigiBeta', itemFormats:[], associatedPub:'http://www.findmittel.ch/Archive/archNeu/Arsmuv.html', subjects:['Gewerkschaften'], repository:providerName, typedSubjects:[ new TypedSubjects(type:'association', dates:['1989-2003'], places:[ new LidoPlace(preferredName:'CH') ]) ], useRights:"Jede Art der Verwendung und der Reproduktion setzt eine Bewilligung und einen vereinbarten Zweck voraus. Jede weitere Nutzung bedarf der erneuten Zustimmung des Schweizerischen Sozialarchivs oder des jeweiligen Rechteinhabers.", accessRights:'Auf den Bestand oder auf Teile davon gewährt das Schweizerische Sozialarchiv öffentlichen, kostenlosen Zugang. Weitere Bestimmungen finden Sie auf unseren Websites.', europeanaType:'VIDEO', landingPage:new LandingPage(href:lPageURL, localID:lPageURL)) def String collection = coll.getXML(template, collOaiheader, providerName, coll) return collection } @Override public void run() { def StringTemplateGroup group = new StringTemplateGroup("visualGroup", templatePath, DefaultTemplateLexer.class); def StringTemplate template = group.getInstanceOf("visualTemplate"); //iterates on the input xml to generate records contained by the collection created above def parser = new XmlParser(false, true); def String input; def c = 0; while(!((input = this.inputQueue.take()).equals("END"))){ template.reset() def Node xmlRoot = parser.parseText(input) def Node oaiHeaderNode = xmlRoot.'**'.header[0] //Common OAI Header elements def dateOfCollection = oaiHeaderNode.'dri:dateOfCollection'.text() def repoId = oaiHeaderNode.'dri:repositoryId'.text() def setSpec = oaiHeaderNode.setSpec.text() //create collection from constants values from the mapping if(c == 0){ def String collection = generateCollectionRecord(template, repoId, setSpec, dateOfCollection) resultsQueue.put(collection); c++ } def Node sozRoot = xmlRoot.'**'.ImagicXML[0] def NodeList sozObjects = sozRoot.Update.Row println "Found "+sozObjects.size()+" rows" sozObjects.each { String lidoObject = utils.transformSozObjekt(it, template, dateOfCollection, repoId, setSpec, collectionID, generateDigitalResources) resultsQueue.put(lidoObject); c++ template.reset() } } println c +" lido objects enueued" this.resultsQueue.put("END") println "closedQueue" } /** * Generate digital resources, if needed. It returns an object of class LidoResourceWrap. * The returned object is never null, but all properties can be empty. */ def generateDigitalResources = {Node 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(utils.recodeLineBreaks(sozObjekt.Field.find{it.'@Name'.equals('dcBE_besch')}?.'@Value')) def ders = [ new Derivative(pid:resourcePid+'?locatt=view:level1', 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; } @Override public void setResultsQueue(BlockingQueue queue) { this.resultsQueue = queue } @Override public void setInputQueue(BlockingQueue queue) { this.inputQueue = queue } /** * TODO: calling the method from the run() does not work. Kinda groovy strange stuff, I do not know why. */ @Override public void closeResultQueue() { this.resultsQueue.put("END") println "closedQueue" } /** * TODO: use this to set the repoId of the collection instead of the current trick * {@inheritDoc} * @see eu.dnetlib.enabling.manager.msro.hope.groovy.RunnableGroovy#setRepositoryId(java.lang.String) */ @Override public void setRepositoryId(String repoId) {} }