/*
* Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package org.wso2.carbon.event.stream.core.internal;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.base.MultitenantConstants;
import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.core.multitenancy.utils.TenantAxisUtils;
import org.wso2.carbon.databridge.commons.Event;
import org.wso2.carbon.databridge.commons.StreamDefinition;
import org.wso2.carbon.databridge.commons.utils.DataBridgeCommonsUtils;
import org.wso2.carbon.event.stream.core.*;
import org.wso2.carbon.event.stream.core.exception.EventStreamConfigurationException;
import org.wso2.carbon.event.stream.core.internal.ds.EventStreamServiceValueHolder;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class EventStreamRuntime {
private static final Log log = LogFactory.getLog(EventStreamRuntime.class);
private Map<Integer, Map<String, EventJunction>> tenantSpecificEventJunctions =
new HashMap<Integer, Map<String, EventJunction>>();
public void deleteStreamJunction(String streamId)
throws EventStreamConfigurationException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
StreamDefinition streamDefinition = EventStreamServiceValueHolder.getCarbonEventStreamService().getStreamDefinition(
DataBridgeCommonsUtils.getStreamNameFromStreamId(streamId),
DataBridgeCommonsUtils.getStreamVersionFromStreamId(streamId));
if (streamDefinition == null) {
Map<String, EventJunction> eventJunctionMap = tenantSpecificEventJunctions.get(tenantId);
if (eventJunctionMap != null) {
eventJunctionMap.remove(streamId);
}
}
}
private EventJunction getOrConstructEventJunction(String streamId) throws EventStreamConfigurationException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
Map<String, EventJunction> eventJunctionMap = tenantSpecificEventJunctions.get(tenantId);
if (eventJunctionMap == null) {
eventJunctionMap = new ConcurrentHashMap<String, EventJunction>();
tenantSpecificEventJunctions.put(tenantId, eventJunctionMap);
}
EventJunction eventJunction = eventJunctionMap.get(streamId);
if (eventJunction == null) {
StreamDefinition streamDefinition = null;
try {
streamDefinition = EventStreamServiceValueHolder.getCarbonEventStreamService().getStreamDefinition(streamId);
} catch (Exception e) {
throw new EventStreamConfigurationException("Cannot retrieve Stream " + streamId + " for tenant " + tenantId);
}
if (streamDefinition == null) {
throw new EventStreamConfigurationException("Stream " + streamId + " is not configured to tenant " + tenantId);
}
eventJunction = new EventJunction(streamDefinition);
eventJunctionMap.put(streamDefinition.getStreamId(), eventJunction);
}
return eventJunction;
}
public void publish(String streamId, Event event) {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
if (tenantId != MultitenantConstants.SUPER_TENANT_ID) {
String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(true);
TenantAxisUtils.getTenantConfigurationContext(tenantDomain, EventStreamServiceValueHolder.
getConfigurationContextService().getServerConfigContext());
}
Map<String, EventJunction> eventJunctionMap = tenantSpecificEventJunctions.get(tenantId);
if (eventJunctionMap != null && eventJunctionMap.containsKey(streamId)) {
EventJunction eventJunction = eventJunctionMap.get(streamId);
eventJunction.sendEvent(event);
} else {
log.debug("Event " + event.toString() + " dropped since no junction found for the streamId " + streamId);
}
}
public void subscribe(SiddhiEventConsumer siddhiEventConsumer) throws EventStreamConfigurationException {
EventJunction eventJunction = getOrConstructEventJunction(siddhiEventConsumer.getStreamId());
eventJunction.addConsumer(siddhiEventConsumer);
}
public void subscribe(EventProducer eventProducer) throws EventStreamConfigurationException {
EventJunction eventJunction = getOrConstructEventJunction(eventProducer.getStreamId());
eventJunction.addProducer(eventProducer);
}
public void subscribe(WSO2EventConsumer wso2EventConsumer) throws EventStreamConfigurationException {
EventJunction eventJunction = getOrConstructEventJunction(wso2EventConsumer.getStreamId());
eventJunction.addConsumer(wso2EventConsumer);
}
public void subscribe(WSO2EventListConsumer wso2EventListConsumer) throws EventStreamConfigurationException {
EventJunction eventJunction = getOrConstructEventJunction(wso2EventListConsumer.getStreamId());
eventJunction.addConsumer(wso2EventListConsumer);
}
public void unsubscribe(SiddhiEventConsumer siddhiEventConsumer) {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
Map<String, EventJunction> eventJunctionMap = tenantSpecificEventJunctions.get(tenantId);
if (eventJunctionMap != null) {
EventJunction eventJunction = eventJunctionMap.get(siddhiEventConsumer.getStreamId());
if (eventJunction != null) {
eventJunction.removeConsumer(siddhiEventConsumer);
}
}
}
public void unsubscribe(EventProducer eventProducer) {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
Map<String, EventJunction> eventJunctionMap = tenantSpecificEventJunctions.get(tenantId);
if (eventJunctionMap != null) {
EventJunction eventJunction = eventJunctionMap.get(eventProducer.getStreamId());
if (eventJunction != null) {
eventJunction.removeProducer(eventProducer);
}
}
}
public void unsubscribe(WSO2EventConsumer wso2EventConsumer) {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
Map<String, EventJunction> eventJunctionMap = tenantSpecificEventJunctions.get(tenantId);
if (eventJunctionMap != null) {
EventJunction eventJunction = eventJunctionMap.get(wso2EventConsumer.getStreamId());
if (eventJunction != null) {
eventJunction.removeConsumer(wso2EventConsumer);
}
}
}
public void unsubscribe(WSO2EventListConsumer wso2EventListConsumer) {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
Map<String, EventJunction> eventJunctionMap = tenantSpecificEventJunctions.get(tenantId);
if (eventJunctionMap != null) {
EventJunction eventJunction = eventJunctionMap.get(wso2EventListConsumer.getStreamId());
if (eventJunction != null) {
eventJunction.removeConsumer(wso2EventListConsumer);
}
}
}
}