//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.consumers;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.uima.UIMAException;
import org.apache.uima.analysis_engine.AnalysisEngine;
import org.apache.uima.analysis_engine.AnalysisEngineDescription;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.fit.factory.AnalysisEngineFactory;
import org.apache.uima.fit.factory.ExternalResourceFactory;
import org.apache.uima.jcas.tcas.DocumentAnnotation;
import org.apache.uima.resource.ExternalResourceDescription;
import org.junit.BeforeClass;
import org.junit.Test;
import uk.gov.dstl.baleen.resources.SharedActiveMQResource;
import uk.gov.dstl.baleen.types.common.CommsIdentifier;
import uk.gov.dstl.baleen.types.common.Person;
import uk.gov.dstl.baleen.types.semantic.Location;
import uk.gov.dstl.baleen.types.semantic.Relation;
import uk.gov.dstl.baleen.types.semantic.Temporal;
import uk.gov.dstl.baleen.uima.utils.TypeSystemSingleton;
public class ActiveMQTest extends ConsumerTestBase {
private static final String ACTIVEMQ = "activemq";
private static final String ENDPOINT = "output";
private static final String HOST_VALUE = "localhost";
private static final String PROTOCOL_VALUE = "vm";
private static final String BROKERARGS_VALUE = "broker.persistent=false";
private static AnalysisEngine ae;
private static SharedActiveMQResource resource;
private static MessageConsumer topicConsumer;
private static final Long receiveTimeout = 500L;
@BeforeClass
public static void setupClass() throws UIMAException, JMSException {
//Configuration values
Object[] configArr = new String[] {
SharedActiveMQResource.PARAM_PROTOCOL, PROTOCOL_VALUE,
SharedActiveMQResource.PARAM_HOST, HOST_VALUE,
SharedActiveMQResource.PARAM_BROKERARGS, BROKERARGS_VALUE
};
//Create descriptors
ExternalResourceDescription erd = ExternalResourceFactory.createExternalResourceDescription(ACTIVEMQ, SharedActiveMQResource.class, configArr);
AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescription(ActiveMQ.class, TypeSystemSingleton.getTypeSystemDescriptionInstance(), ACTIVEMQ, erd, ActiveMQ.PARAM_ENDPOINT, ENDPOINT);
//Create annotator
ae = AnalysisEngineFactory.createEngine(aed);
//Get resource so that we can use it to test output
resource = (SharedActiveMQResource) ae.getUimaContext().getResourceObject(ACTIVEMQ);
//Subscribe to what will be the output topic
Session session = resource.getSession();
topicConsumer = session.createConsumer(session.createTopic(ENDPOINT));
}
@Test
public void testMessagePersisted() throws AnalysisEngineProcessException, JMSException {
//Create document
jCas.setDocumentText("Hello World!");
DocumentAnnotation da = (DocumentAnnotation) jCas.getDocumentAnnotationFs();
da.setSourceUri("hello.txt");
//Process document (i.e. send it to ActiveMQ)
ae.process(jCas);
//Check that message has been received
Message msg = topicConsumer.receive(receiveTimeout);
assertNotNull(msg);
TextMessage txtMsg = (TextMessage) msg;
assertTrue(txtMsg.getText().contains("\"content\":\"Hello World!\""));
//Check there are no more messages on the queue
assertNull(topicConsumer.receive(receiveTimeout));
}
@Test
public void testDocument() throws AnalysisEngineProcessException, JMSException {
createEntitiesDocument();
ae.process(jCas);
//Check that message has been received
Message msg = topicConsumer.receive(receiveTimeout);
assertNotNull(msg);
TextMessage txtMsg = (TextMessage) msg;
assertEquals("{\"entities\":["
+ "{\"gender\":null,\"isNormalised\":false,\"confidence\":0.0,\"externalId\":\"6296367351eed432f0a2f3c3c2e867de8bb9c5812a7eac2921134d34200b459e\",\"end\":5,\"subType\":null,\"title\":null,\"type\":\"Person\",\"begin\":0,\"value\":\"James\"},"
+ "{\"geoJson\":{\"type\":\"Point\",\"coordinates\":[-0.1,51.5]},\"isNormalised\":false,\"confidence\":0.0,\"externalId\":\"8f4008b559740384ca92fce87a51c64dbd9276dbe9426c93880d94640781980c\",\"end\":20,\"subType\":null,\"type\":\"Location\",\"begin\":14,\"value\":\"London\"},"
+ "{\"temporalType\":null,\"isNormalised\":false,\"confidence\":1.0,\"precision\":null,\"externalId\":\"c04e32ec85d053a1c985886a5381e1af85daec38ee73b354af7485217181d2ab\",\"type\":\"Temporal\",\"timestampStop\":0,\"timestampStart\":0,\"scope\":null,\"end\":42,\"subType\":null,\"begin\":24,\"value\":\"19th February 2015\"},"
+ "{\"isNormalised\":false,\"confidence\":0.0,\"externalId\":\"cb9440e3ec0eb12474ec0e61e20a94aab34fa1347e8c65def15cc9045f1c9454\",\"end\":83,\"subType\":\"email\",\"type\":\"CommsIdentifier\",\"begin\":66,\"value\":\"james@example.com\"}"
+ "],\"externalId\":\"0b7e0fc074fb2da8394f3370a9c02919cbb24a88e50908cdba03f8b56e26ce58\",\"language\":\"x-unspecified\",\"dateAccessed\":0,"
+ "\"relations\":[{\"relationshipType\":\"visited\",\"confidence\":0.0,\"externalId\":\"ac30c60f186922345007705da74dc7832b1819b48c7287cb7806862425c7fbd7\",\"end\":20,\"source\":\"6296367351eed432f0a2f3c3c2e867de8bb9c5812a7eac2921134d34200b459e\",\"type\":\"Relation\",\"begin\":0,\"value\":\"James went to London\",\"relationSubType\":null,\"target\":\"8f4008b559740384ca92fce87a51c64dbd9276dbe9426c93880d94640781980c\"}],"
+ "\"content\":\"James went to London on 19th February 2015. His e-mail address is james@example.com\"}", txtMsg.getText());
//Check there are no more messages on the queue
assertNull(topicConsumer.receive(receiveTimeout));
}
protected void createEntitiesDocument(){
jCas.reset();
jCas.setDocumentText("James went to London on 19th February 2015. His e-mail address is james@example.com");
Person p = new Person(jCas, 0, 5);
p.setValue("James");
p.addToIndexes();
Location l = new Location(jCas, 14, 20);
l.setValue("London");
l.setGeoJson("{\"type\": \"Point\", \"coordinates\": [-0.1, 51.5]}");
l.addToIndexes();
Temporal d = new Temporal(jCas, 24, 42);
d.setConfidence(1.0);
d.addToIndexes();
CommsIdentifier ci = new CommsIdentifier(jCas, 66, 83);
ci.setSubType("email");
ci.addToIndexes();
Relation r = new Relation(jCas, 0, 20);
r.setRelationshipType("visited");
r.setSource(p);
r.setTarget(l);
r.addToIndexes();
}
}