com.espertech.esper.regression.client.TestAudit.java Source code

Java tutorial

Introduction

Here is the source code for com.espertech.esper.regression.client.TestAudit.java

Source

/*
 * *************************************************************************************
 *  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.regression.client;

import com.espertech.esper.client.Configuration;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.EPStatement;
import com.espertech.esper.client.annotation.AuditEnum;
import com.espertech.esper.client.dataflow.EPDataFlowInstance;
import com.espertech.esper.client.scopetest.SupportUpdateListener;
import com.espertech.esper.client.time.CurrentTimeEvent;
import com.espertech.esper.core.service.EPServiceProviderSPI;
import com.espertech.esper.support.bean.SupportBean;
import com.espertech.esper.support.bean.SupportBean_ST0;
import com.espertech.esper.support.bean.SupportBean_ST1;
import com.espertech.esper.support.client.SupportConfigFactory;
import com.espertech.esper.util.AuditCallback;
import com.espertech.esper.util.AuditContext;
import com.espertech.esper.util.AuditPath;
import com.espertech.esper.util.EventRepresentationEnum;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class TestAudit extends TestCase {

    private static final Log log = LogFactory.getLog(TestAudit.class);
    private static final Log auditLog = LogFactory.getLog(AuditPath.AUDIT_LOG);

    private EPServiceProvider epService;
    private SupportUpdateListener listener;

    public void setUp() {
        listener = new SupportUpdateListener();

        Configuration configuration = SupportConfigFactory.getConfiguration();
        configuration.addEventType("SupportBean", SupportBean.class);
        configuration.addEventType("SupportBean_ST0", SupportBean_ST0.class);
        configuration.addEventType("SupportBean_ST1", SupportBean_ST1.class);
        configuration.getEngineDefaults().getLogging().setAuditPattern("[%u] [%s] [%c] %m");
        epService = EPServiceProviderManager.getDefaultProvider(configuration);
        epService.initialize();
    }

    public void testDocSample() {
        epService.getEPAdministrator().createEPL("create schema OrderEvent(price double)");

        String epl = "@Name('All-Order-Events') @Audit('stream,property') select price from OrderEvent";
        epService.getEPAdministrator().createEPL(epl).addListener(listener);

        if (EventRepresentationEnum.getEngineDefault(epService).isObjectArrayEvent()) {
            epService.getEPRuntime().sendEvent(new Object[] { 100d }, "OrderEvent");
        } else {
            epService.getEPRuntime().sendEvent(Collections.singletonMap("price", 100d), "OrderEvent");
        }
    }

    public void testAudit() throws Exception {

        // stream, and test audit callback
        SupportAuditCallback callback = new SupportAuditCallback();
        AuditPath.setAuditCallback(callback);
        auditLog.info("*** Stream: ");
        EPStatement stmtInput = epService.getEPAdministrator()
                .createEPL("@Name('ABC') @Audit('stream') select * from SupportBean(theString = 'E1')");
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
        assertEquals(1, callback.getAudits().size());
        AuditContext cb = callback.getAudits().get(0);
        assertEquals("SupportBean(theString=...) inserted SupportBean[SupportBean(E1, 1)]", cb.getMessage());
        assertEquals("ABC", cb.getStatementName());
        assertEquals(EPServiceProviderSPI.DEFAULT_ENGINE_URI, cb.getEngineURI());
        assertEquals(AuditEnum.STREAM, cb.getCategory());
        AuditPath.setAuditCallback(null);
        stmtInput.destroy();

        auditLog.info("*** Named Window And Insert-Into: ");
        EPStatement stmtNW = epService.getEPAdministrator()
                .createEPL("@Name('create') @Audit create window WinOne.win:keepall() as SupportBean");
        EPStatement stmtInsert = epService.getEPAdministrator()
                .createEPL("@Name('insert') @Audit insert into WinOne select * from SupportBean");
        EPStatement stmtConsume = epService.getEPAdministrator()
                .createEPL("@Name('select') @Audit select * from WinOne");
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
        stmtNW.destroy();
        stmtInsert.destroy();
        stmtConsume.destroy();

        auditLog.info("*** Insert-Into: ");
        EPStatement stmtInsertInto = epService.getEPAdministrator()
                .createEPL("@Name('insert') @Audit insert into ABC select * from SupportBean");
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
        stmtInsertInto.destroy();

        auditLog.info("*** Schedule: ");
        epService.getEPRuntime().sendEvent(new CurrentTimeEvent(0));
        EPStatement stmtSchedule = epService.getEPAdministrator()
                .createEPL("@Name('ABC') @Audit('schedule') select irstream * from SupportBean.win:time(1 sec)");
        stmtSchedule.addListener(listener);
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
        listener.reset();
        log.info("Sending time");
        epService.getEPRuntime().sendEvent(new CurrentTimeEvent(2000));
        assertTrue(listener.isInvoked());
        listener.reset();
        stmtSchedule.destroy();

        // exprdef-instances
        auditLog.info("*** Expression-Def: ");
        EPStatement stmtExprDef = epService.getEPAdministrator()
                .createEPL("@Name('ABC') @Audit('exprdef') " + "expression DEF { 1 } "
                        + "expression INN {  x => x.theString }" + "expression OUT { x => INN(x) } "
                        + "select DEF(), OUT(sb) from SupportBean sb");
        stmtExprDef.addListener(listener);
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
        assertEquals(1, listener.assertOneGetNewAndReset().get("DEF()"));
        stmtExprDef.destroy();

        // pattern-instances
        auditLog.info("*** Pattern-Lifecycle: ");
        EPStatement stmtPatternLife = epService.getEPAdministrator().createEPL(
                "@Name('ABC') @Audit('pattern-instances') select a.intPrimitive as val0 from pattern [every a=SupportBean -> (b=SupportBean_ST0 and not SupportBean_ST1)]");
        stmtPatternLife.addListener(listener);
        log.info("Sending E1");
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
        log.info("Sending E2");
        epService.getEPRuntime().sendEvent(new SupportBean("E2", 2));
        log.info("Sending E3");
        epService.getEPRuntime().sendEvent(new SupportBean_ST1("E3", 3));
        stmtPatternLife.destroy();

        // pattern
        auditLog.info("*** Pattern: ");
        EPStatement stmtPattern = epService.getEPAdministrator().createEPL(
                "@Name('ABC') @Audit('pattern') select a.intPrimitive as val0 from pattern [a=SupportBean -> b=SupportBean_ST0]");
        stmtPattern.addListener(listener);
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 1));
        epService.getEPRuntime().sendEvent(new SupportBean_ST0("E2", 2));
        assertEquals(1, listener.assertOneGetNewAndReset().get("val0"));
        stmtPattern.destroy();

        // view
        auditLog.info("*** View: ");
        EPStatement stmtView = epService.getEPAdministrator()
                .createEPL("@Name('ABC') @Audit('view') select intPrimitive from SupportBean.std:lastevent()");
        stmtView.addListener(listener);
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 50));
        assertEquals(50, listener.assertOneGetNewAndReset().get("intPrimitive"));
        stmtView.destroy();

        EPStatement stmtGroupedView = epService.getEPAdministrator()
                .createEPL("@Audit Select * From SupportBean.std:groupwin(theString).win:length(2)");
        stmtGroupedView.addListener(listener);
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 50));
        listener.reset();
        stmtGroupedView.destroy();

        // expression
        auditLog.info("*** Expression: ");
        EPStatement stmtExpr = epService.getEPAdministrator().createEPL(
                "@Name('ABC') @Audit('expression') select intPrimitive*100 as val0, sum(intPrimitive) as val1 from SupportBean");
        stmtExpr.addListener(listener);
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 50));
        assertEquals(5000, listener.assertOneGetNew().get("val0"));
        assertEquals(50, listener.assertOneGetNewAndReset().get("val1"));
        stmtExpr.destroy();

        // expression-detail
        auditLog.info("*** Expression-Nested: ");
        EPStatement stmtExprNested = epService.getEPAdministrator().createEPL(
                "@Name('ABC') @Audit('expression-nested') select ('A'||theString)||'X' as val0 from SupportBean");
        stmtExprNested.addListener(listener);
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 50));
        assertEquals("AE1X", listener.assertOneGetNewAndReset().get("val0"));
        stmtExprNested.destroy();

        // property
        auditLog.info("*** Property: ");
        EPStatement stmtProp = epService.getEPAdministrator()
                .createEPL("@Name('ABC') @Audit('property') select intPrimitive from SupportBean");
        stmtProp.addListener(listener);
        epService.getEPRuntime().sendEvent(new SupportBean("E1", 50));
        assertEquals(50, listener.assertOneGetNewAndReset().get("intPrimitive"));
        stmtProp.destroy();

        // with aggregation
        epService.getEPAdministrator()
                .createEPL("@Audit @Name ('create') create window MyWindow.win:keepall() as SupportBean");
        String epl = "@Audit @Name('S0') on SupportBean as sel select count(*) from MyWindow as win having count(*)=3 order by win.intPrimitive";
        epService.getEPAdministrator().createEPL(epl);

        // data flow
        epService.getEPAdministrator()
                .createEPL("@Audit @Name('df') create dataflow MyFlow "
                        + "EventBusSource -> a<SupportBean> {filter:theString like 'I%'} "
                        + "Filter(a) -> b {filter: true}" + "LogSink(b) {log:false}");
        EPDataFlowInstance df = epService.getEPRuntime().getDataFlowRuntime().instantiate("MyFlow");
        df.start();
        epService.getEPRuntime().sendEvent(new SupportBean("I1", 1));
        df.cancel();
    }

    private static class SupportAuditCallback implements AuditCallback {
        private List<AuditContext> audits = new ArrayList<AuditContext>();

        public void audit(AuditContext auditContext) {
            audits.add(auditContext);
        }

        public List<AuditContext> getAudits() {
            return audits;
        }
    }
}