/* * 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.databridge.commons.Event; import org.wso2.carbon.databridge.commons.StreamDefinition; import org.wso2.carbon.event.stream.core.EventProducer; import org.wso2.carbon.event.stream.core.EventProducerCallback; import org.wso2.carbon.event.stream.core.SiddhiEventConsumer; import org.wso2.carbon.event.stream.core.WSO2EventConsumer; import org.wso2.carbon.event.stream.core.WSO2EventListConsumer; import org.wso2.carbon.event.stream.core.internal.util.EventConverter; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * Acts as the pass through point for a given stream. Does not distinguish between input and output streams. */ public class EventJunction implements EventProducerCallback { private static final Log log = LogFactory.getLog(EventJunction.class); /* latest stream definition. */ private StreamDefinition streamDefinition; private boolean metaFlag = false; private boolean correlationFlag = false; private boolean payloadFlag = false; private int attributesCount; /* holding the producers this junction is subscribed to. incoming events can be from both event builders and siddhi runtimes */ private CopyOnWriteArrayList<EventProducer> producers; /* listeners of this junction. output events can be towards both event formatter and siddhi runtime. */ private CopyOnWriteArrayList<SiddhiEventConsumer> siddhiEventConsumers; private CopyOnWriteArrayList<WSO2EventConsumer> wso2EventConsumers; private CopyOnWriteArrayList<WSO2EventListConsumer> wso2EventListConsumers; public EventJunction(StreamDefinition streamDefinition) { this.streamDefinition = streamDefinition; this.producers = new CopyOnWriteArrayList<EventProducer>(); this.siddhiEventConsumers = new CopyOnWriteArrayList<SiddhiEventConsumer>(); this.wso2EventConsumers = new CopyOnWriteArrayList<WSO2EventConsumer>(); this.wso2EventListConsumers = new CopyOnWriteArrayList<WSO2EventListConsumer>(); populateEventTemplate(streamDefinition); } public void addConsumer(SiddhiEventConsumer consumer) { if (!siddhiEventConsumers.contains(consumer)) { log.info("Consumer added to the junction. Stream:" + getStreamDefinition().getStreamId()); siddhiEventConsumers.add(consumer); } else { log.error("Consumer already exist in the junction: " + streamDefinition.getStreamId()); } } public boolean removeConsumer(SiddhiEventConsumer consumer) { return siddhiEventConsumers.remove(consumer); } public void addConsumer(WSO2EventConsumer consumer) { if (!wso2EventConsumers.contains(consumer)) { log.info("WSO2EventConsumer added to the junction. Stream:" + getStreamDefinition().getStreamId()); consumer.onAddDefinition(streamDefinition); wso2EventConsumers.add(consumer); } else { log.error("WSO2EventConsumer already exist in the junction: " + streamDefinition.getStreamId()); } } public void addConsumer(WSO2EventListConsumer consumer) { if (!wso2EventListConsumers.contains(consumer)) { log.info("WSO2EventConsumer added to the junction. Stream:" + getStreamDefinition().getStreamId()); consumer.onAddDefinition(streamDefinition); wso2EventListConsumers.add(consumer); } else { log.error("WSO2EventConsumer already exist in the junction: " + streamDefinition.getStreamId()); } } public boolean removeConsumer(WSO2EventConsumer consumer) { boolean isRemoved = wso2EventConsumers.remove(consumer); consumer.onRemoveDefinition(streamDefinition); return isRemoved; } public boolean removeConsumer(WSO2EventListConsumer consumer) { boolean isRemoved = wso2EventListConsumers.remove(consumer); consumer.onRemoveDefinition(streamDefinition); return isRemoved; } public void addProducer(EventProducer listener) { if (!producers.contains(listener)) { log.info("Producer added to the junction. Stream:" + getStreamDefinition().getStreamId()); listener.setCallBack(this); producers.add(listener); } else { log.error("Producer already exist in the junction: " + streamDefinition.getStreamId()); } } public boolean removeProducer(EventProducer producer) { boolean isRemoved = producers.remove(producer); if (isRemoved) { producer.setCallBack(null); } return isRemoved; } public StreamDefinition getStreamDefinition() { return streamDefinition; } @Override public void sendEvent(Event event) { if (!siddhiEventConsumers.isEmpty()) { org.wso2.siddhi.core.event.Event convertedEvent = EventConverter.convertToEvent(event, metaFlag, correlationFlag, payloadFlag, attributesCount); for (SiddhiEventConsumer consumer : siddhiEventConsumers) { try { consumer.consumeEvent(convertedEvent); } catch (Exception e) { log.error("Error while dispatching events: " + e.getMessage(), e); } } } if (!wso2EventConsumers.isEmpty()) { for (WSO2EventConsumer consumer : wso2EventConsumers) { try { consumer.onEvent(event); } catch (Exception e) { log.error("Error while dispatching events: " + e.getMessage(), e); } } } if (!wso2EventListConsumers.isEmpty()) { for (WSO2EventListConsumer consumer : wso2EventListConsumers) { try { consumer.onEvent(event); } catch (Exception e) { log.error("Error while dispatching events: " + e.getMessage(), e); } } } } @Override public void sendEvents(List<Event> events) { for (Event event : events) { if (!siddhiEventConsumers.isEmpty()) { org.wso2.siddhi.core.event.Event convertedEvent = EventConverter.convertToEvent(event, metaFlag, correlationFlag, payloadFlag, attributesCount); for (SiddhiEventConsumer consumer : siddhiEventConsumers) { try { consumer.consumeEvent(convertedEvent); } catch (Exception e) { log.error("Error while dispatching events: " + e.getMessage(), e); } } } if (!wso2EventConsumers.isEmpty()) { for (WSO2EventConsumer consumer : wso2EventConsumers) { try { consumer.onEvent(event); } catch (Exception e) { log.error("Error while dispatching events: " + e.getMessage(), e); } } } } if (!wso2EventListConsumers.isEmpty()) { for (WSO2EventListConsumer eventListConsumer : wso2EventListConsumers) { try { eventListConsumer.onEventList(events); } catch (Exception e) { log.error("Error while dispatching events: " + e.getMessage(), e); } } } } private void populateEventTemplate(StreamDefinition definition) { int attributesCount = 0; if (definition.getMetaData() != null) { attributesCount += definition.getMetaData().size(); metaFlag = true; } if (definition.getCorrelationData() != null) { attributesCount += definition.getCorrelationData().size(); correlationFlag = true; } if (definition.getPayloadData() != null) { attributesCount += definition.getPayloadData().size(); payloadFlag = true; } this.attributesCount = attributesCount; } }