package sushi.event.test; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; import java.io.Serializable; import java.io.StringReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import sushi.FileUtils; import sushi.esper.SushiStreamProcessingAdapter; import sushi.event.SushiEvent; import sushi.event.SushiEventType; import sushi.event.attribute.SushiAttribute; import sushi.event.attribute.SushiAttributeTypeEnum; import sushi.event.collection.SushiMapTree; import sushi.eventhandling.Broker; import sushi.persistence.Persistor; import sushi.query.SushiQueryTypeEnum; import sushi.query.SushiLiveQueryListener; import sushi.query.SushiQuery; import sushi.util.XMLUtils; import sushi.xml.importer.XMLParser; import sushi.xml.importer.XMLParsingException; import sushi.xml.importer.XSDParser; public class HierarchicalEventsTest { SushiStreamProcessingAdapter esper; private static String pathToEventTaxonomyXSD = "src/test/resources/EventTaxonomy.xsd"; private static String pathToEventXML = "src/test/resources/Event1.xml"; private static String pathToDoubleTagEventXML = "src/test/resources/EventDoubleTags.xml"; @Before public void setup(){ Persistor.useTestEnviroment(); SushiStreamProcessingAdapter.clearInstance(); esper = SushiStreamProcessingAdapter.getInstance(); } @Test public void testHierarchicalEventtypes() throws XMLParsingException, SAXException, IOException, ParserConfigurationException { SushiEventType eventType = XSDParser.generateEventTypeFromXSD(pathToEventTaxonomyXSD, FileUtils.getFileNameWithoutExtension(pathToEventTaxonomyXSD)); Broker.send(eventType); //create direct esper event from xml Document doc = transformXMLFileToEventNode(pathToDoubleTagEventXML); Node rootElement = doc.getChildNodes().item(0); doc.renameNode(rootElement, "", eventType.getTypeName()); esper.getEsperRuntime().sendEvent(doc); } @Test public void testEventsWithDoubleTags() throws XMLParsingException { SushiEventType eventType = XSDParser.generateEventTypeFromXSD(pathToEventTaxonomyXSD, FileUtils.getFileNameWithoutExtension(pathToEventTaxonomyXSD)); Broker.send(eventType); //query String query = "Select ID, vehicle_information.goods[0], vehicle_information.goods[1], vehicle_information.goods[2] From " + eventType.getTypeName(); SushiQuery liveQuery = new SushiQuery("All", query, SushiQueryTypeEnum.LIVE); liveQuery.save(); SushiLiveQueryListener listener = liveQuery.addToEsper(); //prepare Event SushiEvent event = XMLParser.generateEventFromXML(pathToDoubleTagEventXML); Broker.send(event); assertTrue("did not find an event, but" + listener.getNumberOfLogEntries(), listener.getNumberOfLogEntries() == 1); System.out.println(listener.getLog()); } @Test public void testHierarchicalEvents() throws XMLParsingException, SAXException, IOException { //prepare EventType SushiEventType eventType = XSDParser.generateEventTypeFromXSD(pathToEventTaxonomyXSD, FileUtils.getFileNameWithoutExtension(pathToEventTaxonomyXSD)); Broker.send(eventType); //query String query = "Select ID, vehicle_information.vehicle_identifier, count(vehicle_information.vehicle_identifier) From " + eventType.getTypeName(); SushiQuery liveQuery = new SushiQuery("All", query, SushiQueryTypeEnum.LIVE); liveQuery.save(); SushiLiveQueryListener listener = liveQuery.addToEsper(); //prepare Event SushiEvent event = XMLParser.generateEventFromXML(pathToEventXML); Broker.send(event); assertTrue("did not find an event, but" + listener.getNumberOfLogEntries(), listener.getNumberOfLogEntries() == 1); System.out.println(listener.getLog()); } @Test public void testEventTransformation() throws ParserConfigurationException, XMLParsingException{ //prepare EventType SushiEventType eventType = XSDParser.generateEventTypeFromXSD(pathToEventTaxonomyXSD, FileUtils.getFileNameWithoutExtension(pathToEventTaxonomyXSD)); Broker.send(eventType); SushiEvent event = XMLParser.generateEventFromXML(pathToEventXML); Node node = XMLUtils.eventToNode(event); int numberOfChildren = node.getFirstChild().getChildNodes().getLength(); assertTrue("event should have 8 elements, but had " + numberOfChildren, numberOfChildren == 8); } @Test public void testAttributeWithSpaces() { esper.clearInstance(); ArrayList<SushiAttribute> attributes = new ArrayList<SushiAttribute>(Arrays.asList(new SushiAttribute("Attribute 1", SushiAttributeTypeEnum.STRING))); SushiEventType eventType = new SushiEventType("newEventType", attributes); Broker.send(eventType); SushiMapTree<String, Serializable> tree = new SushiMapTree<String, Serializable>(); tree.addRootElement("Attribute 1", "Wert 1"); SushiEvent event = new SushiEvent(eventType, new Date()); event.setValues(tree); Broker.send(event); } public Document transformXMLFileToEventNode(String filePath) { String eventString = ""; try { eventString = FileUtils.getFileContentAsString(filePath); } catch (IOException e1) { e1.printStackTrace(); fail("The InputXML-Filepath was not valid."); } InputSource source = new InputSource(new StringReader(eventString)); DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); builderFactory.setNamespaceAware(true); Document doc = null; try { doc = builderFactory.newDocumentBuilder().parse(source); } catch (SAXException e) { e.printStackTrace(); fail("The InputXML-String was not valid."); } catch (IOException e) { e.printStackTrace(); fail("The InputXML-String was not valid."); } catch (ParserConfigurationException e) { e.printStackTrace(); fail("The InputXML-String was not valid."); } return doc; } }