/* * ************************************************************************************* * Copyright (C) 2008 EsperTech, Inc. All rights reserved. * * http://esper.codehaus.org * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * * ************************************************************************************* */ package com.espertech.esper.event; import junit.framework.TestCase; import com.espertech.esper.client.ConfigurationEventTypeXMLDOM; import com.espertech.esper.client.EventBean; import com.espertech.esper.client.EventType; import com.espertech.esper.support.bean.*; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPathConstants; import java.io.StringReader; import java.util.HashMap; import java.util.Map; public class TestEventAdapterServiceImpl extends TestCase { private EventAdapterServiceImpl adapterService; public void setUp() { adapterService = new EventAdapterServiceImpl(new EventTypeIdGeneratorImpl()); } public void testSelfRefEvent() { EventBean originalBean = adapterService.adapterForBean(new SupportSelfReferenceEvent()); assertEquals(null, originalBean.get("selfRef.selfRef.selfRef.value")); } public void testCreateMapType() { Map<String, Object> testTypesMap; testTypesMap = new HashMap<String, Object>(); testTypesMap.put("key1", String.class); EventType eventType = adapterService.createAnonymousMapType("test", testTypesMap); assertEquals(Map.class, eventType.getUnderlyingType()); assertEquals(1, eventType.getPropertyNames().length); assertEquals("key1", eventType.getPropertyNames()[0]); } public void testGetType() { adapterService.addBeanType("NAME", TestEventAdapterServiceImpl.class.getName(), false, false, false, false); EventType type = adapterService.getExistsTypeByName("NAME"); assertEquals(TestEventAdapterServiceImpl.class, type.getUnderlyingType()); EventType typeTwo = adapterService.getExistsTypeByName(TestEventAdapterServiceImpl.class.getName()); assertSame(typeTwo, typeTwo); assertNull(adapterService.getExistsTypeByName("xx")); } public void testAddInvalid() { try { adapterService.addBeanType("x", "xx", false, false, false, false); fail(); } catch (EventAdapterException ex) { // Expected } } public void testAddMapType() { Map<String, Object> props = new HashMap<String, Object>(); props.put("a", Long.class); props.put("b", String.class); // check result type EventType typeOne = adapterService.addNestableMapType("latencyEvent", props, null, true, true, true, false, false); assertEquals(Long.class, typeOne.getPropertyType("a")); assertEquals(String.class, typeOne.getPropertyType("b")); assertEquals(2, typeOne.getPropertyNames().length); assertSame(typeOne, adapterService.getExistsTypeByName("latencyEvent")); // add the same type with the same name, should succeed and return the same reference EventType typeTwo = adapterService.addNestableMapType("latencyEvent", props, null, true, true, true, false, false); assertSame(typeOne, typeTwo); // add the same name with a different type, should fail props.put("b", boolean.class); try { adapterService.addNestableMapType("latencyEvent", props, null, true, true, true, false, false); fail(); } catch (EventAdapterException ex) { // expected } } public void testAddWrapperType() { EventType beanEventType = adapterService.addBeanType("mybean", SupportMarketDataBean.class, true, true, true); Map<String, Object> props = new HashMap<String, Object>(); props.put("a", Long.class); props.put("b", String.class); // check result type EventType typeOne = adapterService.addWrapperType("latencyEvent", beanEventType, props, false, true); assertEquals(Long.class, typeOne.getPropertyType("a")); assertEquals(String.class, typeOne.getPropertyType("b")); assertEquals(7, typeOne.getPropertyNames().length); assertSame(typeOne, adapterService.getExistsTypeByName("latencyEvent")); // add the same name with a different type, should fail props.put("b", boolean.class); try { EventType beanTwoEventType = adapterService.addBeanType("mybean", SupportBean.class, true, true, true); adapterService.addWrapperType("latencyEvent", beanTwoEventType, props, false, false); fail(); } catch (EventAdapterException ex) { // expected } } public void testAddClassName() { EventType typeOne = adapterService.addBeanType("latencyEvent", SupportBean.class.getName(), true, false, false, false); assertEquals(SupportBean.class, typeOne.getUnderlyingType()); assertSame(typeOne, adapterService.getExistsTypeByName("latencyEvent")); EventType typeTwo = adapterService.addBeanType("latencyEvent", SupportBean.class.getName(), false, false, false, false); assertSame(typeOne, typeTwo); try { adapterService.addBeanType("latencyEvent", SupportBean_A.class.getName(), true, false, false, false); fail(); } catch (EventAdapterException ex) { assertEquals("Event type named 'latencyEvent' has already been declared with differing underlying type information: Class " + SupportBean.class.getName() + " versus " + SupportBean_A.class.getName(), ex.getMessage()); } } public void testAddClass() { EventType typeOne = adapterService.addBeanType("latencyEvent", SupportBean.class, false, false, false); assertEquals(SupportBean.class, typeOne.getUnderlyingType()); assertSame(typeOne, adapterService.getExistsTypeByName("latencyEvent")); EventType typeTwo = adapterService.addBeanType("latencyEvent", SupportBean.class, false, false, false); assertSame(typeOne, typeTwo); try { adapterService.addBeanType("latencyEvent", SupportBean_A.class.getName(), false, false, false, false); fail(); } catch (EventAdapterException ex) { assertEquals("Event type named 'latencyEvent' has already been declared with differing underlying type information: Class " + SupportBean.class.getName() + " versus " + SupportBean_A.class.getName(), ex.getMessage()); } } public void testWrap() { SupportBean bean = new SupportBean(); EventBean theEvent = adapterService.adapterForBean(bean); assertSame(theEvent.getUnderlying(), bean); } public void testAddXMLDOMType() throws Exception { adapterService.addXMLDOMType("XMLDOMTypeOne", getXMLDOMConfig(), null, true); EventType eventType = adapterService.getExistsTypeByName("XMLDOMTypeOne"); assertEquals(Node.class, eventType.getUnderlyingType()); assertSame(eventType, adapterService.getExistsTypeByName("XMLDOMTypeOne")); try { adapterService.addXMLDOMType("a", new ConfigurationEventTypeXMLDOM(), null, true); fail(); } catch (EventAdapterException ex) { // expected } } public void testAdapterForDOM() throws Exception { adapterService.addXMLDOMType("XMLDOMTypeOne", getXMLDOMConfig(), null, true); String xml = "<simpleEvent>\n" + " <nested1>value</nested1>\n" + "</simpleEvent>"; InputSource source = new InputSource(new StringReader(xml)); DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); Document simpleDoc = builderFactory.newDocumentBuilder().parse(source); EventBean bean = adapterService.adapterForDOM(simpleDoc); assertEquals("value", bean.get("nested1")); } private static ConfigurationEventTypeXMLDOM getXMLDOMConfig() { ConfigurationEventTypeXMLDOM config = new ConfigurationEventTypeXMLDOM(); config.setRootElementName("simpleEvent"); config.addXPathProperty("nested1", "/simpleEvent/nested1", XPathConstants.STRING); return config; } }