/* * Copyright (c) 2005-2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you 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.receiver.core.internal; import org.apache.log4j.Logger; import org.wso2.carbon.event.processor.manager.core.EventReceiverManagementService; import org.wso2.carbon.event.processor.manager.core.exception.EventManagementException; import org.wso2.carbon.event.receiver.core.internal.ds.EventReceiverServiceValueHolder; import org.wso2.siddhi.core.util.snapshot.ByteSerializer; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class CarbonEventReceiverManagementService extends EventReceiverManagementService { private Logger log = Logger.getLogger(CarbonEventReceiverManagementService.class); private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private boolean isReceiverCoordinator = false; @Override public byte[] getState() { Map<Integer, Map<String, EventReceiver>> tenantSpecificEventAdapters = EventReceiverServiceValueHolder.getCarbonEventReceiverService().getTenantSpecificEventReceiverMap(); Map<Integer, HashMap<String, byte[]>> data = new HashMap<Integer, HashMap<String, byte[]>>(); for (Map.Entry<Integer, Map<String, EventReceiver>> pair : tenantSpecificEventAdapters.entrySet()) { Map<String, EventReceiver> map = pair.getValue(); int tenantId = pair.getKey(); HashMap<String, byte[]> tenantData = new HashMap<String, byte[]>(); for (Map.Entry<String, EventReceiver> receiverEntry : map.entrySet()) { if (receiverEntry.getValue().isEventDuplicatedInCluster()) { byte[] state = receiverEntry.getValue().getInputEventDispatcher().getState(); tenantData.put(receiverEntry.getKey(), state); } } data.put(tenantId, tenantData); } return ByteSerializer.OToB(data); } @Override public void syncState(byte[] bytes) { Map<Integer, HashMap<String, byte[]>> snapshotDataList = (HashMap<Integer, HashMap<String, byte[]>>) ByteSerializer.BToO(bytes); Map<Integer, Map<String, EventReceiver>> tenantSpecificEventAdapters = EventReceiverServiceValueHolder.getCarbonEventReceiverService().getTenantSpecificEventReceiverMap(); for (Map.Entry<Integer, HashMap<String, byte[]>> tenantEntry : snapshotDataList.entrySet()) { for (Map.Entry<String, byte[]> eventReceiverData : tenantEntry.getValue().entrySet()) { Map<String, EventReceiver> eventReceiverMap = tenantSpecificEventAdapters.get(tenantEntry.getKey()); if (eventReceiverMap != null) { EventReceiver eventReceiver = eventReceiverMap.get(eventReceiverData.getKey()); if (eventReceiver != null) { eventReceiver.getInputEventDispatcher().syncState(eventReceiverData.getValue()); } else { throw new EventManagementException("No event receiver with name '" + eventReceiverData.getKey() + "' exist for tenant " + tenantEntry.getKey()); } } else { throw new EventManagementException("No event receiver exist for tenant " + tenantEntry.getKey()); } } } } @Override public void pause() { readWriteLock.writeLock().lock(); } @Override public void resume() { readWriteLock.writeLock().unlock(); } @Override public void start() { EventReceiverServiceValueHolder.getCarbonEventReceiverService().start(); } @Override public void startPolling() { EventReceiverServiceValueHolder.getCarbonEventReceiverService().startPolling(); } @Override public boolean isReceiverCoordinator() { return isReceiverCoordinator; } public Lock getReadLock() { return readWriteLock.readLock(); } public void setReceiverCoordinator(boolean isReceiverCoordinator) { this.isReceiverCoordinator = isReceiverCoordinator; } }