/**
* 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.cdr.services.processing;
import static org.mockito.Mockito.*;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.jdom2.Document;
import org.jdom2.input.SAXBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import edu.unc.lib.dl.cdr.services.ObjectEnhancementService;
import edu.unc.lib.dl.cdr.services.imaging.ImageEnhancementService;
import edu.unc.lib.dl.cdr.services.imaging.ThumbnailEnhancementService;
import edu.unc.lib.dl.cdr.services.model.EnhancementMessage;
import edu.unc.lib.dl.cdr.services.model.FedoraEventMessage;
import edu.unc.lib.dl.cdr.services.solr.SolrUpdateEnhancementService;
import edu.unc.lib.dl.cdr.services.techmd.TechnicalMetadataEnhancementService;
import edu.unc.lib.dl.util.ContentModelHelper;
import edu.unc.lib.dl.util.JMSMessageUtil;
public class EnhancementMessageFilterTest extends Assert {
private EnhancementMessageFilter servicesMessageFilter;
private List<ObjectEnhancementService> services;
public EnhancementMessageFilterTest() {
services = new ArrayList<ObjectEnhancementService>();
services.add(new TechnicalMetadataEnhancementService());
services.add(new ThumbnailEnhancementService());
services.add(new ImageEnhancementService());
services.add(new SolrUpdateEnhancementService());
}
@Before
public void setUp() throws Exception {
servicesMessageFilter = new EnhancementMessageFilter();
servicesMessageFilter.setServices(services);
}
@Test
public void serviceMessage(){
EnhancementMessage message = new EnhancementMessage("cdr:test", JMSMessageUtil.servicesMessageNamespace,
JMSMessageUtil.ServicesActions.APPLY_SERVICE.getName(), "");
assertFalse(servicesMessageFilter.filter(message));
message.setServiceName(TechnicalMetadataEnhancementService.class.getName());
assertTrue(servicesMessageFilter.filter(message));
message.setServiceName(null);
assertFalse(servicesMessageFilter.filter(message));
message.setServiceName("does.not.exist.Service");
assertFalse(servicesMessageFilter.filter(message));
message.setServiceName("");
assertFalse(servicesMessageFilter.filter(message));
//Full stack run
message = new EnhancementMessage("cdr:test", JMSMessageUtil.servicesMessageNamespace,
JMSMessageUtil.ServicesActions.APPLY_SERVICE_STACK.getName());
assertTrue(servicesMessageFilter.filter(message));
}
@Test
public void nullMessage(){
assertFalse(servicesMessageFilter.filter(null));
String pid = null;
try {
servicesMessageFilter.filter(new EnhancementMessage(pid, null, null));
assertTrue(false);
} catch (IllegalArgumentException e){
assertTrue(true);
}
EnhancementMessage emptyMessage = new EnhancementMessage("", "", "");
assertFalse(servicesMessageFilter.filter(emptyMessage));
}
@Test
public void fedoraObjectMessages() throws Exception {
//Ingest object message, should partially pass, not pass solr
Document doc = readFileAsString("ingestMessage.xml");
EnhancementMessage message = new FedoraEventMessage(doc);
assertTrue(servicesMessageFilter.filter(message));
assertTrue(message.getFilteredServices().size() > 0);
assertTrue(message.filteredServicesContains(SolrUpdateEnhancementService.class));
assertTrue(message.filteredServicesContains(TechnicalMetadataEnhancementService.class));
assertTrue(message.filteredServicesContains(ImageEnhancementService.class));
assertTrue(message.filteredServicesContains(ThumbnailEnhancementService.class));
//Purge object message, fail
message.setAction(JMSMessageUtil.FedoraActions.PURGE_OBJECT.getName());
assertFalse(servicesMessageFilter.filter(message));
}
@Test
public void fedoraDatastreamMessages() throws Exception {
//Change md descript datastream, should not pass filters
Document doc = readFileAsString("modifyDSMDDescriptive.xml");
EnhancementMessage message = new FedoraEventMessage(doc);
assertFalse(servicesMessageFilter.filter(message));
assertNull(message.getFilteredServices());
message.setAction(JMSMessageUtil.FedoraActions.PURGE_DATASTREAM.getName());
assertFalse(servicesMessageFilter.filter(message));
message.setAction(JMSMessageUtil.FedoraActions.ADD_DATASTREAM.getName());
assertFalse(servicesMessageFilter.filter(message));
//Change data file, should pass
doc = readFileAsString("modifyDSDataFile.xml");
message = new FedoraEventMessage(doc);
assertTrue(servicesMessageFilter.filter(message));
assertTrue(message.getFilteredServices().size() > 0);
assertTrue(message.filteredServicesContains(SolrUpdateEnhancementService.class));
assertTrue(message.filteredServicesContains(TechnicalMetadataEnhancementService.class));
assertTrue(message.filteredServicesContains(ImageEnhancementService.class));
assertTrue(message.filteredServicesContains(ThumbnailEnhancementService.class));
message.setAction(JMSMessageUtil.FedoraActions.PURGE_DATASTREAM.getName());
assertFalse(servicesMessageFilter.filter(message));
message.setAction(JMSMessageUtil.FedoraActions.ADD_DATASTREAM.getName());
assertTrue(servicesMessageFilter.filter(message));
assertTrue(message.filteredServicesContains(SolrUpdateEnhancementService.class));
assertTrue(message.filteredServicesContains(TechnicalMetadataEnhancementService.class));
assertTrue(message.filteredServicesContains(ImageEnhancementService.class));
assertTrue(message.filteredServicesContains(ThumbnailEnhancementService.class));
}
@Test
public void fedoraRelationMessages() throws Exception {
//Add relation tests
Document doc = readFileAsString("addRelSourceData.xml");
FedoraEventMessage message = new FedoraEventMessage(doc);
assertTrue(servicesMessageFilter.filter(message));
assertTrue(message.filteredServicesContains(SolrUpdateEnhancementService.class));
assertFalse(message.filteredServicesContains(TechnicalMetadataEnhancementService.class));
assertFalse(message.filteredServicesContains(ImageEnhancementService.class));
assertTrue(message.filteredServicesContains(ThumbnailEnhancementService.class));
message.setAction(JMSMessageUtil.FedoraActions.PURGE_RELATIONSHIP.getName());
assertTrue(servicesMessageFilter.filter(message));
assertTrue(message.filteredServicesContains(SolrUpdateEnhancementService.class));
assertFalse(message.filteredServicesContains(TechnicalMetadataEnhancementService.class));
assertFalse(message.filteredServicesContains(ImageEnhancementService.class));
assertTrue(message.filteredServicesContains(ThumbnailEnhancementService.class));
message.setRelationPredicate(ContentModelHelper.CDRProperty.hasSurrogate.getURI().toString());
message.setAction(JMSMessageUtil.FedoraActions.ADD_RELATIONSHIP.getName());
assertTrue(servicesMessageFilter.filter(message));
assertTrue(message.filteredServicesContains(SolrUpdateEnhancementService.class));
assertFalse(message.filteredServicesContains(TechnicalMetadataEnhancementService.class));
assertFalse(message.filteredServicesContains(ImageEnhancementService.class));
assertTrue(message.filteredServicesContains(ThumbnailEnhancementService.class));
message.setAction(JMSMessageUtil.FedoraActions.PURGE_RELATIONSHIP.getName());
assertTrue(servicesMessageFilter.filter(message));
assertTrue(message.filteredServicesContains(SolrUpdateEnhancementService.class));
assertFalse(message.filteredServicesContains(TechnicalMetadataEnhancementService.class));
assertFalse(message.filteredServicesContains(ImageEnhancementService.class));
assertTrue(message.filteredServicesContains(ThumbnailEnhancementService.class));
message.setRelationPredicate(ContentModelHelper.CDRProperty.techData.getURI().toString());
message.setAction(JMSMessageUtil.FedoraActions.ADD_RELATIONSHIP.getName());
assertFalse(servicesMessageFilter.filter(message));
message.setAction(JMSMessageUtil.FedoraActions.PURGE_RELATIONSHIP.getName());
assertFalse(servicesMessageFilter.filter(message));
message.setRelationPredicate(ContentModelHelper.CDRProperty.thumb.getURI().toString());
message.setAction(JMSMessageUtil.FedoraActions.ADD_RELATIONSHIP.getName());
assertFalse(servicesMessageFilter.filter(message));
message.setAction(JMSMessageUtil.FedoraActions.PURGE_RELATIONSHIP.getName());
assertFalse(servicesMessageFilter.filter(message));
}
public EnhancementMessageFilter getEnhancementMessageFilter() {
return servicesMessageFilter;
}
public void setEnhancementMessageFilter(EnhancementMessageFilter servicesMessageFilter) {
this.servicesMessageFilter = servicesMessageFilter;
}
private Document readFileAsString(String filePath) throws Exception {
return new SAXBuilder().build(new InputStreamReader(this.getClass().getResourceAsStream(filePath)));
}
}