/*
* Copyright (c) 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.databridge.core.definitionstore;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.databridge.commons.StreamDefinition;
import org.wso2.carbon.databridge.commons.exception.DifferentStreamDefinitionAlreadyDefinedException;
import org.wso2.carbon.databridge.commons.utils.EventDefinitionConverterUtils;
import org.wso2.carbon.databridge.core.exception.StreamDefinitionStoreException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* The Event Stream Definition Store interface
* Used to persist Event Stream Definitions at the Agent Server
*/
public abstract class AbstractStreamDefinitionStore implements StreamDefinitionStore {
private Log log = LogFactory.getLog(AbstractStreamDefinitionStore.class);
private List<StreamAddRemoveListener> streamAddRemoveListenerList = new ArrayList<StreamAddRemoveListener>();
public StreamDefinition getStreamDefinition(String name,
String version, int tenantId)
throws StreamDefinitionStoreException {
return getStreamDefinitionFromStore(name, version, tenantId);
}
public StreamDefinition getStreamDefinition(String streamId, int tenantId)
throws StreamDefinitionStoreException {
return getStreamDefinitionFromStore(streamId, tenantId);
}
public Collection<StreamDefinition> getAllStreamDefinitions(int tenantId) {
try {
return getAllStreamDefinitionsFromStore(tenantId);
} catch (StreamDefinitionStoreException e) {
log.error("Error occured when trying to retrieve definitions. Returning empty list.");
return new ArrayList<StreamDefinition>();
}
}
public void saveStreamDefinition(StreamDefinition streamDefinition, int tenantId)
throws DifferentStreamDefinitionAlreadyDefinedException,
StreamDefinitionStoreException {
StreamDefinition existingDefinition;
existingDefinition = getStreamDefinition(streamDefinition.getName(), streamDefinition.getVersion(), tenantId);
if (existingDefinition == null) {
saveStreamDefinitionToStore(streamDefinition, tenantId);
for (StreamAddRemoveListener streamAddRemoveListener : streamAddRemoveListenerList) {
streamAddRemoveListener.streamAdded(tenantId, streamDefinition.getStreamId());
}
return;
}
if (!existingDefinition.equals(streamDefinition)) {
throw new DifferentStreamDefinitionAlreadyDefinedException("Cannot define Stream definition:" + EventDefinitionConverterUtils.convertToJson(existingDefinition) + ", Another Stream with same name and version" +
" exist :" + EventDefinitionConverterUtils
.convertToJson(existingDefinition));
}
}
public boolean deleteStreamDefinition(String streamName, String streamVersion, int tenantId) {
if (removeStreamDefinition(streamName, streamVersion, tenantId)) {
for (StreamAddRemoveListener streamAddRemoveListener : streamAddRemoveListenerList) {
streamAddRemoveListener.streamRemoved(tenantId, streamName + ":" + streamVersion);
}
return true;
}
return false;
}
@Override
public void subscribe(StreamAddRemoveListener streamAddRemoveListener) {
if (streamAddRemoveListener != null) {
streamAddRemoveListenerList.add(streamAddRemoveListener);
}
}
@Override
public void unsubscribe(StreamAddRemoveListener streamAddRemoveListener) {
if (streamAddRemoveListener != null) {
streamAddRemoveListenerList.remove(streamAddRemoveListener);
}
}
public void invalidateStreamDefinition(String streamName, String streamVersion, int tenantId) {
for (StreamAddRemoveListener streamAddRemoveListener : streamAddRemoveListenerList) {
streamAddRemoveListener.streamRemoved(tenantId, streamName + ":" + streamVersion);
}
}
public abstract StreamDefinition getStreamDefinitionFromStore(String name, String version, int tenantId)
throws StreamDefinitionStoreException;
public abstract StreamDefinition getStreamDefinitionFromStore(String streamId, int tenantId)
throws StreamDefinitionStoreException;
public abstract Collection<StreamDefinition> getAllStreamDefinitionsFromStore(int tenantId)
throws StreamDefinitionStoreException;
public abstract void saveStreamDefinitionToStore(StreamDefinition streamDefinition, int tenantId)
throws StreamDefinitionStoreException;
public abstract boolean removeStreamDefinition(String name, String version, int tenantId);
}