/**
* 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 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.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
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.jdom2.Element;
import org.junit.Assert;
import org.junit.Test;
import edu.unc.lib.dl.acl.service.AccessControlService;
import edu.unc.lib.dl.acl.util.AccessGroupSet;
import edu.unc.lib.dl.acl.util.Permission;
import edu.unc.lib.dl.fedora.AccessClient;
import edu.unc.lib.dl.fedora.ClientUtils;
import edu.unc.lib.dl.fedora.PID;
import edu.unc.lib.dl.services.DigitalObjectManager;
import edu.unc.lib.dl.services.OperationsMessageSender;
import edu.unc.lib.dl.util.AtomPubMetadataParserUtil;
import edu.unc.lib.dl.util.ContentModelHelper;
import edu.unc.lib.dl.util.ContentModelHelper.Datastream;
import edu.unc.lib.dl.xml.JDOMNamespaceUtil;
public class FedoraObjectUIPProcessorTest extends Assert {
@Test
public void invalidDatastreamAndMissingContent() throws Exception {
AccessClient accessClient = mock(AccessClient.class);
when(accessClient.getDatastreamDissemination(any(PID.class), anyString(), anyString())).thenReturn(null);
UIPUpdatePipeline pipeline = mock(UIPUpdatePipeline.class);
DigitalObjectManager digitalObjectManager = mock(DigitalObjectManager.class);
FedoraObjectUIPProcessor uipProcessor = new FedoraObjectUIPProcessor();
uipProcessor.setAccessClient(accessClient);
uipProcessor.setDigitalObjectManager(digitalObjectManager);
uipProcessor.setPipeline(pipeline);
PID pid = new PID("uuid:test");
Map<String,File> modifiedFiles = new HashMap<String,File>();
modifiedFiles.put(ContentModelHelper.Datastream.MD_DESCRIPTIVE.getName(), mock(File.class));
modifiedFiles.put(ContentModelHelper.Datastream.MD_TECHNICAL.getName(), null);
modifiedFiles.put(ContentModelHelper.Datastream.AUDIT.getName(), mock(File.class));
modifiedFiles.put("INVALID", mock(File.class));
FedoraObjectUIP uip = mock(FedoraObjectUIP.class);
when(uip.getModifiedFiles()).thenReturn(modifiedFiles);
when(uip.getPID()).thenReturn(pid);
when(uip.getUser()).thenReturn("testuser");
when(uip.getOperation()).thenReturn(UpdateOperation.ADD);
when(pipeline.processUIP(uip)).thenReturn(uip);
uipProcessor.process(uip);
verify(uip, times(1)).getModifiedFiles();
verify(uip, times(1)).storeOriginalDatastreams(any(AccessClient.class));
verify(digitalObjectManager, times(2)).addOrReplaceDatastream(any(PID.class), any(Datastream.class), any(File.class), anyString(), anyString(), anyString());
verify(digitalObjectManager, times(1)).addOrReplaceDatastream(any(PID.class), eq(Datastream.AUDIT), any(File.class), anyString(), anyString(), anyString());
verify(digitalObjectManager, times(1)).addOrReplaceDatastream(any(PID.class), eq(Datastream.MD_DESCRIPTIVE), any(File.class), anyString(), anyString(), anyString());
//Check reaction to null modified files, shouldn't do any updates
when(uip.getModifiedFiles()).thenReturn(null);
uipProcessor.process(uip);
verify(digitalObjectManager, times(2)).addOrReplaceDatastream(any(PID.class), any(Datastream.class), any(File.class), anyString(), anyString(), anyString());
}
@Test
public void testNormalOperations() throws Exception {
FedoraObjectUIPProcessor processor = new FedoraObjectUIPProcessor();
AccessControlService aclService = mock(AccessControlService.class);
when(aclService.hasAccess(any(PID.class), any(AccessGroupSet.class), eq(Permission.editAccessControl)))
.thenReturn(true);
processor.setAclService(aclService);
InputStream entryPart = new FileInputStream(new File("src/test/resources/atompub/metadataUnpublish.xml"));
Abdera abdera = new Abdera();
Parser parser = abdera.getParser();
Document<Entry> entryDoc = parser.parse(entryPart);
Entry entry = entryDoc.getRoot();
Map<String, org.jdom2.Element> originalMap = new HashMap<String, org.jdom2.Element>();
org.jdom2.Element rdfElement = new org.jdom2.Element("RDF", JDOMNamespaceUtil.RDF_NS);
org.jdom2.Element descElement = new org.jdom2.Element("Description", JDOMNamespaceUtil.RDF_NS);
rdfElement.addContent(descElement);
org.jdom2.Element relElement = new org.jdom2.Element(ContentModelHelper.CDRProperty.isPublished.getPredicate(),
JDOMNamespaceUtil.CDR_NS);
relElement.setText("yes");
descElement.addContent(relElement);
relElement = new org.jdom2.Element(ContentModelHelper.CDRProperty.embargoUntil.getPredicate(),
JDOMNamespaceUtil.CDR_ACL_NS);
relElement.setText("2013-02-01");
descElement.addContent(relElement);
relElement = new org.jdom2.Element(ContentModelHelper.FedoraProperty.hasModel.name(),
JDOMNamespaceUtil.FEDORA_MODEL_NS);
relElement.setText(ContentModelHelper.Model.SIMPLE.name());
descElement.addContent(relElement);
originalMap.put(ContentModelHelper.Datastream.RELS_EXT.getName(), rdfElement);
Map<String, org.jdom2.Element> datastreamMap = AtomPubMetadataParserUtil.extractDatastreams(entry);
MetadataUIP uip = mock(MetadataUIP.class);
when(uip.getPID()).thenReturn(new PID("uuid:test/ACL"));
when(uip.getOperation()).thenReturn(UpdateOperation.REPLACE);
when(uip.getOriginalData()).thenReturn(originalMap);
when(uip.getModifiedData()).thenReturn(originalMap);
when(uip.getIncomingData()).thenReturn(datastreamMap);
when(uip.getModifiedFiles()).thenReturn(getModifiedFiles(originalMap));
UIPUpdatePipeline pipeline = mock(UIPUpdatePipeline.class);
when(pipeline.processUIP(any(UpdateInformationPackage.class))).thenReturn(uip);
processor.setPipeline(pipeline);
processor.setVirtualDatastreamMap(new HashMap<String,Datastream>());
DigitalObjectManager digitalObjectManager = mock(DigitalObjectManager.class);
processor.setDigitalObjectManager(digitalObjectManager);
processor.setOperationsMessageSender(mock(OperationsMessageSender.class));
processor.process(uip);
}
public Map<String, File> getModifiedFiles(Map<String, org.jdom2.Element> modifiedData) {
Map<String, File> modifiedFiles = new HashMap<String, File>();
for (java.util.Map.Entry<String, ?> modified : modifiedData.entrySet()) {
Element modifiedElement = (Element)modified.getValue();
try {
File temp = ClientUtils.writeXMLToTempFile(modifiedElement);
modifiedFiles.put(modified.getKey(), temp);
} catch (IOException e) {
System.err.println("Failed to create temp file" + e);
}
}
return modifiedFiles;
}
}