package eu.play_project.dcep;
import static eu.play_project.play_commons.constants.Event.EVENT_ID_SUFFIX;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.util.Calendar;
import java.util.HashMap;
import org.etsi.uri.gcm.util.GCM;
import org.event_processing.events.types.FacebookStatusFeedEvent;
import org.junit.Ignore;
import org.junit.Test;
import org.objectweb.fractal.adl.ADLException;
import org.objectweb.fractal.adl.Factory;
import org.objectweb.fractal.api.Component;
import org.objectweb.fractal.api.NoSuchInterfaceException;
import org.objectweb.fractal.api.control.IllegalLifeCycleException;
import org.objectweb.proactive.ActiveObjectCreationException;
import org.objectweb.proactive.api.PAActiveObject;
import org.objectweb.proactive.core.component.adl.FactoryFactory;
import org.objectweb.proactive.core.config.CentralPAPropertyRepository;
import org.objectweb.proactive.core.node.NodeException;
import org.ontoware.rdf2go.model.node.impl.URIImpl;
import eu.play_project.dcep.distributedetalis.api.DistributedEtalisTestApi;
import eu.play_project.dcep.distributedetalis.utils.EventCloudHelpers;
import eu.play_project.play_commons.constants.Stream;
import eu.play_project.play_commons.eventtypes.EventHelpers;
import eu.play_project.play_platformservices.api.QueryDispatchApi;
import eu.play_project.play_platformservices.api.QueryDispatchException;
import fr.inria.eventcloud.api.CompoundEvent;
public class ConnectPSandDCEPTest implements Serializable {
private static final long serialVersionUID = 100L;
public static QueryDispatchApi queryDispatchApi;
public static DistributedEtalisTestApi testApi;
boolean start = false;
static Component root;
public static boolean test;
@Ignore
@Test
public void readQueryFromFileTest(){
System.out.println(getSparqlQueries("play-epsparql-m12-jeans-example-query.eprq"));
}
@Ignore
@Test
public void instantiatePlayPlatformTest() throws IllegalLifeCycleException,
NoSuchInterfaceException, ADLException, InterruptedException, QueryDispatchException {
String queryString;
InstantiatePlayPlatform();
// Get query.
queryString = getSparqlQueries("play-epsparql-m12-jeans-example-query.eprq");
//queryString = getSparqlQueries("play-epsparql-contextualized-latitude-01-query.eprq");
//queryString = getSparqlQueries("play-epsparql-clic2call.eprq");
//System.out.println("SPARQL query:\n" + queryString);
// Compile query
String paternID = queryDispatchApi.registerQuery("http://test.example.com", queryString);
//Subscribe to get complex events.
SubscriberPerformanceTest subscriber = null;
try {
subscriber = PAActiveObject.newActive(SubscriberPerformanceTest.class, new Object[] {});
} catch (ActiveObjectCreationException e) {
e.printStackTrace();
} catch (NodeException e) {
e.printStackTrace();
}
testApi.attach(subscriber);
// Push events.
for (int i = 1; i < 19; i++) {
if (i % 100 == 0) {
System.out.println("Sent " + i + " Events");
}
// subscriber.setState(false);
testApi.publish(createEvent("http://exmaple.com/eventId/" + i));
Thread.sleep(1);
}
//
Thread.sleep(2000);
// Test if result is OK
assertTrue("Number of complex events wrong "
+ subscriber.getComplexEvents().size(), subscriber
.getComplexEvents().size() == 16);
// Stop and terminate GCM Components
try {
GCM.getGCMLifeCycleController(root).stopFc();
// Terminate all subcomponents.
for(Component subcomponent : GCM.getContentController(root).getFcSubComponents()){
GCM.getGCMLifeCycleController(subcomponent).terminateGCMComponent();
}
} catch (IllegalLifeCycleException e) {
e.printStackTrace();
} catch (NoSuchInterfaceException e) {
e.printStackTrace();
}
}
/**
* Test tumbling window functionality.
* The registered pattern generates a complex event if three simple events appear in one second (tumbling window).
* In the beginning of the test four events (e1,e2,e3,e4) are sent and two seconds later two additional events (e5,e6). After a break three events (e7,e8,e9) are sent.
* This test will produce three complex events. The first four events generate two complex events (c1,c2). After the break of two
* seconds a new window (w2) opens and three events are needed to fulfill the pattern. But only two events (e5, e6) are sent - no complex event.
* In window w3 three events are sent. For this reason one complex event (c3) is produced.
*
* w1 w2 w3 w4
* |-e1----e2----e3----e4----|-----------e5----e6------|-e7----e8----e9----------|
* |-> c1 |-> c2 |-> c3
*/
@Ignore
@Test
public void tumblingWindowTest() throws IllegalLifeCycleException,
NoSuchInterfaceException, ADLException, InterruptedException, QueryDispatchException {
String queryString;
InstantiatePlayPlatform();
// Get query.
queryString = getSparqlQueries("patterns/play-epsparql-m12-jeans-example-query-tumbling-window.eprq");
// Compile query
String paternID = queryDispatchApi.registerQuery("http://test.example.com", queryString);
//Subscribe to get complex events.
SubscriberPerformanceTest subscriber = null;
try {
subscriber = PAActiveObject.newActive(SubscriberPerformanceTest.class, new Object[] {});
} catch (ActiveObjectCreationException e) {
e.printStackTrace();
} catch (NodeException e) {
e.printStackTrace();
}
testApi.attach(subscriber);
// Push event e1,e2,e3.
testApi.publish(createEvent("http://exmaple.com/eventId/e1"));
Thread.sleep(1);
testApi.publish(createEvent("http://exmaple.com/eventId/e2"));
Thread.sleep(1);
testApi.publish(createEvent("http://exmaple.com/eventId/e3"));
Thread.sleep(1);
testApi.publish(createEvent("http://exmaple.com/eventId/e4"));
Thread.sleep(1);
// Wait
Thread.sleep(2000);
// Check if c1 and c2 appeared.
assertTrue("Number of complex events wrong. "+ subscriber.getComplexEvents().size() + " complex events produced but 2 complex event were expected.", subscriber.getComplexEvents().size() == 2);
testApi.publish(createEvent("http://exmaple.com/eventId/e5"));
Thread.sleep(1);
testApi.publish(createEvent("http://exmaple.com/eventId/e6"));
Thread.sleep(1);
// No new complex event was produced.
assertTrue("Number of complex events wrong "+ subscriber.getComplexEvents().size(), subscriber.getComplexEvents().size() == 2);
// Wait
Thread.sleep(2000);
// Send e7-e9
testApi.publish(createEvent("http://exmaple.com/eventId/e7"));
Thread.sleep(1);
testApi.publish(createEvent("http://exmaple.com/eventId/e8"));
Thread.sleep(1);
testApi.publish(createEvent("http://exmaple.com/eventId/e9"));
Thread.sleep(1);
// Wait to process events.
Thread.sleep(2000);
// Check if c3 was produced
assertTrue("Number of complex events wrong "+ subscriber.getComplexEvents().size(), subscriber.getComplexEvents().size() == 3);
// Stop and terminate GCM Components
try {
GCM.getGCMLifeCycleController(root).stopFc();
// Terminate all subcomponents.
for(Component subcomponent : GCM.getContentController(root).getFcSubComponents()){
GCM.getGCMLifeCycleController(subcomponent).terminateGCMComponent();
}
} catch (IllegalLifeCycleException e) {
e.printStackTrace();
} catch (NoSuchInterfaceException e) {
e.printStackTrace();
}
}
public void sendEvents(){
start = true;
System.out.println("Start Producer");
System.out.println("Send 2000 Events \n\n\n\n\n\n\n");
}
public static CompoundEvent createEvent(String eventId){
FacebookStatusFeedEvent event = new FacebookStatusFeedEvent(
// set the RDF context part
EventHelpers.createEmptyModel(eventId),
// set the RDF subject
eventId + EVENT_ID_SUFFIX,
// automatically write the rdf:type statement
true);
// Run some setters of the event
event.setFacebookName("Roland Stühmer");
event.setFacebookId("100000058455726");
event.setFacebookLink(new URIImpl("http://graph.facebook.com/roland.stuehmer#"));
event.setStatus("I bought some JEANS this morning");
event.setFacebookLocation("Karlsruhe, Germany");
// Create a Calendar for the current date and time
event.setEndTime(Calendar.getInstance());
event.setStream(new URIImpl(Stream.FacebookStatusFeed.getUri()));
//Push events.
return EventCloudHelpers.toCompoundEvent(event);
}
public static void InstantiatePlayPlatform()
throws IllegalLifeCycleException, NoSuchInterfaceException,
ADLException {
CentralPAPropertyRepository.JAVA_SECURITY_POLICY
.setValue("proactive.java.policy");
CentralPAPropertyRepository.GCM_PROVIDER
.setValue("org.objectweb.proactive.core.component.Fractive");
Factory factory = FactoryFactory.getFactory();
HashMap<String, Object> context = new HashMap<String, Object>();
root = (Component) factory.newComponent("PsDcepComponent", context);
GCM.getGCMLifeCycleController(root).startFc();
queryDispatchApi = ((eu.play_project.play_platformservices.api.QueryDispatchApi) root
.getFcInterface(QueryDispatchApi.class.getSimpleName()));
testApi = ((eu.play_project.dcep.distributedetalis.api.DistributedEtalisTestApi) root
.getFcInterface(DistributedEtalisTestApi.class.getSimpleName()));
}
private String getSparqlQueries(String queryFile){
try {
InputStream is = this.getClass().getClassLoader().getResourceAsStream(queryFile);
BufferedReader br =new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer();
String line;
while (null != (line = br.readLine())) {
sb.append(line);
sb.append("\n");
}
//System.out.println(sb.toString());
br.close();
is.close();
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}