/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * 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.core.service; import com.espertech.esper.client.EPServiceProviderIsolated; import com.espertech.esper.client.EPStatement; import com.espertech.esper.filter.FilterServiceProvider; import com.espertech.esper.filter.FilterServiceSPI; import com.espertech.esper.schedule.SchedulingServiceImpl; import com.espertech.esper.schedule.SchedulingServiceSPI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * Service to maintain currently active isoalted service providers for an engine. */ public class StatementIsolationServiceImpl implements StatementIsolationService { private static final Logger log = LoggerFactory.getLogger(StatementIsolationServiceImpl.class); private final Map<String, EPServiceProviderIsolatedImpl> isolatedProviders; private EPServicesContext epServicesContext; private volatile int currentUnitId = 0; /** * Ctor. */ public StatementIsolationServiceImpl() { isolatedProviders = new ConcurrentHashMap<String, EPServiceProviderIsolatedImpl>(); } /** * Set the engine service context. * * @param epServicesContext services context */ public void setEpServicesContext(EPServicesContext epServicesContext) { this.epServicesContext = epServicesContext; } public EPServiceProviderIsolated getIsolationUnit(String name, Integer optionalUnitId) { EPServiceProviderIsolatedImpl serviceProviderIsolated = isolatedProviders.get(name); if (serviceProviderIsolated != null) { return serviceProviderIsolated; } FilterServiceSPI filterService = FilterServiceProvider.newService(epServicesContext.getConfigSnapshot().getEngineDefaults().getExecution().getFilterServiceProfile(), true); SchedulingServiceSPI scheduleService = new SchedulingServiceImpl(epServicesContext.getTimeSource()); EPIsolationUnitServices services = new EPIsolationUnitServices(name, currentUnitId, filterService, scheduleService); serviceProviderIsolated = new EPServiceProviderIsolatedImpl(name, services, epServicesContext, isolatedProviders); isolatedProviders.put(name, serviceProviderIsolated); return serviceProviderIsolated; } public void destroy() { isolatedProviders.clear(); } public String[] getIsolationUnitNames() { Set<String> keyset = isolatedProviders.keySet(); return keyset.toArray(new String[keyset.size()]); } public void beginIsolatingStatements(String name, int unitId, EPStatement[] stmt) { if (log.isInfoEnabled()) { log.info("Begin isolating statements " + print(stmt) + " unit " + name + " id " + unitId); } } public void commitIsolatingStatements(String name, int unitId, EPStatement[] stmt) { if (log.isInfoEnabled()) { log.info("Completed isolating statements " + print(stmt) + " unit " + name + " id " + unitId); } } public void rollbackIsolatingStatements(String name, int unitId, EPStatement[] stmt) { if (log.isInfoEnabled()) { log.info("Failed isolating statements " + print(stmt) + " unit " + name + " id " + unitId); } } public void beginUnisolatingStatements(String name, int unitId, EPStatement[] stmt) { if (log.isInfoEnabled()) { log.info("Begin un-isolating statements " + print(stmt) + " unit " + name + " id " + unitId); } } public void commitUnisolatingStatements(String name, int unitId, EPStatement[] stmt) { if (log.isInfoEnabled()) { log.info("Completed un-isolating statements " + print(stmt) + " unit " + name + " id " + unitId); } } public void rollbackUnisolatingStatements(String name, int unitId, EPStatement[] stmt) { if (log.isInfoEnabled()) { log.info("Failed un-isolating statements " + print(stmt) + " unit " + name + " id " + unitId); } } public void newStatement(int stmtId, String stmtName, EPIsolationUnitServices isolatedServices) { log.info("New statement '" + stmtName + "' unit " + isolatedServices.getName()); } private String print(EPStatement[] stmts) { StringBuilder buf = new StringBuilder(); String delimiter = ""; for (EPStatement stmt : stmts) { buf.append(delimiter); buf.append(stmt.getName()); delimiter = ", "; } return buf.toString(); } }