/** * Copyright 2008 The University of North Carolina at Chapel Hill * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package edu.unc.lib.dl.update; import static edu.unc.lib.dl.test.TestHelpers.setField; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Map; import javax.annotation.Resource; import org.apache.abdera.Abdera; import org.apache.abdera.model.Document; import org.apache.abdera.model.Entry; import org.apache.abdera.parser.Parser; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.jdom2.Element; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import edu.unc.lib.dl.fedora.AccessClient; import edu.unc.lib.dl.fedora.PID; import edu.unc.lib.dl.fedora.types.MIMETypedStream; import edu.unc.lib.dl.schematron.SchematronValidator; import edu.unc.lib.dl.util.AtomPubMetadataParserUtil; import edu.unc.lib.dl.util.ContentModelHelper; import edu.unc.lib.dl.util.VocabularyHelperManager; import edu.unc.lib.dl.xml.JDOMNamespaceUtil; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "/service-context.xml" }) public class AtomDCToMODSFilterTest extends Assert { @Resource private SchematronValidator schematronValidator; private AtomDCToMODSFilter filter; @Mock private VocabularyHelperManager vocabManager; private static Logger log = Logger.getLogger(AtomDCToMODSFilter.class); @Before public void init() throws Exception { initMocks(this); filter = new AtomDCToMODSFilter(); filter.setSchematronValidator(schematronValidator); setField(filter, "vocabManager", vocabManager); } @Test public void addNewMODSFromDCTerms() throws Exception { InputStream entryPart = new FileInputStream(new File("src/test/resources/atompub/metadataDC.xml")); Abdera abdera = new Abdera(); Parser parser = abdera.getParser(); Document<Entry> entryDoc = parser.parse(entryPart); Entry entry = entryDoc.getRoot(); AccessClient accessClient = mock(AccessClient.class); when(accessClient.getDatastreamDissemination(any(PID.class), anyString(), anyString())).thenReturn(null); PID pid = new PID("uuid:test"); AtomPubMetadataUIP uip = new AtomPubMetadataUIP(pid, "testuser", UpdateOperation.ADD, entry); assertEquals(0, uip.getOriginalData().size()); assertEquals(0, uip.getModifiedData().size()); assertEquals(2, uip.getIncomingData().size()); uip.storeOriginalDatastreams(accessClient); assertFalse(uip.getOriginalData().containsKey(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName())); assertFalse(uip.getOriginalData().containsKey(AtomPubMetadataParserUtil.ATOM_DC_DATASTREAM)); assertTrue(uip.getIncomingData().containsKey(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName())); assertTrue(uip.getIncomingData().containsKey(AtomPubMetadataParserUtil.ATOM_DC_DATASTREAM)); filter.doFilter(uip); XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); log.debug(outputter.outputString(uip.getModifiedData().get(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName()))); assertFalse(uip.getOriginalData().containsKey(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName())); assertFalse(uip.getOriginalData().containsKey(AtomPubMetadataParserUtil.ATOM_DC_DATASTREAM)); assertTrue(uip.getModifiedData().containsKey(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName())); assertFalse(uip.getModifiedData().containsKey(AtomPubMetadataParserUtil.ATOM_DC_DATASTREAM)); assertTrue(uip.getIncomingData().containsKey(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName())); assertTrue(uip.getIncomingData().containsKey(AtomPubMetadataParserUtil.ATOM_DC_DATASTREAM)); Element modsElement = uip.getModifiedData().get(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName()); assertTrue(modsElement.getChildren().size() > 0); } @Test public void addNewMODSWithDCTerms() throws Exception { AtomPubMetadataUIP uip = mock(AtomPubMetadataUIP.class); @SuppressWarnings("unchecked") Map<String,Element> incomingData = mock(Map.class); when(incomingData.get(eq(AtomPubMetadataParserUtil.ATOM_DC_DATASTREAM))).thenReturn(new Element("atom_dc")); when(incomingData.get(eq(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName()))).thenReturn(new Element("mods")); when(incomingData.containsKey(eq(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName()))).thenReturn(true); when(incomingData.containsKey(eq(AtomPubMetadataParserUtil.ATOM_DC_DATASTREAM))).thenReturn(true); when(uip.getIncomingData()).thenReturn(incomingData); filter.doFilter(uip); // No changes should occur since there is also a mods record incoming verify(incomingData, times(1)).get(eq(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName())); verify(uip, never()).getModifiedData(); } @Test public void replaceMODSWithDCTerms() throws Exception { InputStream entryPart = new FileInputStream(new File("src/test/resources/atompub/metadataDC.xml")); Abdera abdera = new Abdera(); Parser parser = abdera.getParser(); Document<Entry> entryDoc = parser.parse(entryPart); Entry entry = entryDoc.getRoot(); AccessClient accessClient = mock(AccessClient.class); MIMETypedStream modsStream = new MIMETypedStream(); File raf = new File("src/test/resources/testmods.xml"); byte[] bytes = FileUtils.readFileToByteArray(raf); modsStream.setStream(bytes); modsStream.setMIMEType("text/xml"); when( accessClient.getDatastreamDissemination(any(PID.class), eq(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName()), anyString())).thenReturn(modsStream); PID pid = new PID("uuid:test"); AtomPubMetadataUIP uip = new AtomPubMetadataUIP(pid, "testuser", UpdateOperation.REPLACE, entry); uip.storeOriginalDatastreams(accessClient); filter.doFilter(uip); Element dcTitleElement = uip.getIncomingData().get(AtomPubMetadataParserUtil.ATOM_DC_DATASTREAM); String dcTitle = dcTitleElement.getChildText("title", JDOMNamespaceUtil.DCTERMS_NS); Element oldMODSElement = uip.getOriginalData().get(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName()); String oldMODSTitle = oldMODSElement.getChild("titleInfo", JDOMNamespaceUtil.MODS_V3_NS).getChildText("title", JDOMNamespaceUtil.MODS_V3_NS); Element modsElement = uip.getModifiedData().get(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName()); String newMODSTitle = modsElement.getChild("titleInfo", JDOMNamespaceUtil.MODS_V3_NS).getChildText("title", JDOMNamespaceUtil.MODS_V3_NS); assertEquals("Title", dcTitle); assertEquals("Hiring and recruitment practices in academic libraries", oldMODSTitle); assertEquals(dcTitle, newMODSTitle); assertEquals(1, uip.getOriginalData().size()); assertEquals(1, uip.getModifiedData().size()); assertEquals(2, uip.getIncomingData().size()); } @Test public void wrongUIPType() throws UIPException{ ContentUIP uip = mock(ContentUIP.class); filter.doFilter(uip); verify(uip, times(0)).getIncomingData(); verify(uip, times(0)).getModifiedData(); } }