/*
* Copyright (c) 2005-2010, 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.streamdefn.registry.datastore;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.databridge.commons.StreamDefinition;
import org.wso2.carbon.databridge.commons.utils.DataBridgeCommonsUtils;
import org.wso2.carbon.databridge.commons.utils.EventDefinitionConverterUtils;
import org.wso2.carbon.databridge.commons.utils.IndexDefinitionConverterUtils;
import org.wso2.carbon.databridge.core.definitionstore.AbstractStreamDefinitionStore;
import org.wso2.carbon.databridge.core.exception.StreamDefinitionStoreException;
import org.wso2.carbon.databridge.streamdefn.registry.internal.ServiceHolder;
import org.wso2.carbon.databridge.streamdefn.registry.util.RegistryStreamDefinitionStoreUtil;
import org.wso2.carbon.registry.core.Resource;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.core.session.UserRegistry;
import org.wso2.carbon.registry.core.utils.RegistryUtils;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
/**
* The in memory implementation of the Event Stream definition Store
*/
public class RegistryStreamDefinitionStore extends
AbstractStreamDefinitionStore {
private Log log = LogFactory.getLog(RegistryStreamDefinitionStore.class);
public StreamDefinition getStreamDefinitionFromStore(String name, String version, int tenantId)
throws StreamDefinitionStoreException {
try {
UserRegistry registry = ServiceHolder.getRegistryService().getGovernanceSystemRegistry(tenantId);
if (registry.resourceExists(RegistryStreamDefinitionStoreUtil.getStreamDefinitionPath(name, version))) {
Resource resource = registry.get(RegistryStreamDefinitionStoreUtil.getStreamDefinitionPath(name, version));
Object content = resource.getContent();
if (content != null) {
StreamDefinition streamDefinition = EventDefinitionConverterUtils.
convertFromJson(RegistryUtils.decodeBytes((byte[]) resource.getContent()));
if (registry.resourceExists(RegistryStreamDefinitionStoreUtil.getStreamIndexDefinitionPath(name, version))) {
Resource indexResource = registry.get(RegistryStreamDefinitionStoreUtil.getStreamIndexDefinitionPath(name, version));
streamDefinition.setIndexDefinition(IndexDefinitionConverterUtils.
getIndexDefinition(RegistryUtils.decodeBytes((byte[]) indexResource.getContent())));
}
return streamDefinition;
}
}
return null;
} catch (Exception e) {
log.error("Error in getting Stream Definition " + name + ":" + version, e);
throw new StreamDefinitionStoreException("Error in getting Stream Definition " + name + ":" + version, e);
}
}
@Override
public StreamDefinition getStreamDefinitionFromStore(String streamId, int tenantId)
throws StreamDefinitionStoreException {
return getStreamDefinitionFromStore(DataBridgeCommonsUtils.getStreamNameFromStreamId(streamId),
DataBridgeCommonsUtils.getStreamVersionFromStreamId(streamId), tenantId);
}
@Override
public boolean removeStreamDefinition(String name, String version, int tenantId) {
try {
UserRegistry registry = ServiceHolder.getRegistryService().getGovernanceSystemRegistry(tenantId);
registry.delete(RegistryStreamDefinitionStoreUtil.getStreamDefinitionPath(name, version));
return !registry.resourceExists(RegistryStreamDefinitionStoreUtil.getStreamDefinitionPath(name, version));
} catch (RegistryException e) {
log.error("Error in deleting Stream Definition " + name + ":" + version);
}
return false;
}
@Override
public void saveStreamDefinitionToStore(StreamDefinition streamDefinition, int tenantId)
throws StreamDefinitionStoreException {
PrivilegedCarbonContext privilegedCarbonContext = PrivilegedCarbonContext.getThreadLocalCarbonContext();
try {
UserRegistry registry = ServiceHolder.getRegistryService().getGovernanceSystemRegistry(tenantId);
Resource resource = registry.newResource();
resource.setContent(EventDefinitionConverterUtils.convertToJson(streamDefinition));
resource.setMediaType("application/json");
registry.put(RegistryStreamDefinitionStoreUtil.getStreamDefinitionPath(streamDefinition.
getName(), streamDefinition.getVersion()), resource);
log.info("Stream definition added to registry successfully : " + streamDefinition.getStreamId());
} catch (RegistryException e) {
log.error("Error in saving Stream Definition " + streamDefinition, e);
throw new StreamDefinitionStoreException("Error in saving Stream Definition " + streamDefinition, e);
}
}
public Collection<StreamDefinition> getAllStreamDefinitionsFromStore(int tenantId) {
ConcurrentHashMap<String, StreamDefinition> map = new ConcurrentHashMap<String, StreamDefinition>();
try {
UserRegistry registry = ServiceHolder.getRegistryService().getGovernanceSystemRegistry(tenantId);
if (!registry.resourceExists(RegistryStreamDefinitionStoreUtil.getStreamDefinitionStorePath())) {
registry.put(RegistryStreamDefinitionStoreUtil.getStreamDefinitionStorePath(), registry.newCollection());
} else {
org.wso2.carbon.registry.core.Collection collection =
(org.wso2.carbon.registry.core.Collection) registry.get(RegistryStreamDefinitionStoreUtil.
getStreamDefinitionStorePath());
for (String streamNameCollection : collection.getChildren()) {
org.wso2.carbon.registry.core.Collection innerCollection =
(org.wso2.carbon.registry.core.Collection) registry.get(streamNameCollection);
for (String streamVersionCollection : innerCollection.getChildren()) {
Resource resource = (Resource) registry.get(streamVersionCollection);
try {
StreamDefinition streamDefinition = EventDefinitionConverterUtils
.convertFromJson(RegistryUtils.decodeBytes((byte[]) resource.getContent()));
map.put(streamDefinition.getStreamId(), streamDefinition);
} catch (Throwable e) {
log.error("Error in retrieving streamDefinition from the resource at "
+ resource.getPath(), e);
}
}
}
}
} catch (RegistryException e) {
log.error("Error in retrieving streamDefinitions from the registry", e);
}
return map.values();
}
}