/*
* 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.event.stream.core;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.deployment.AbstractDeployer;
import org.apache.axis2.deployment.DeploymentException;
import org.apache.axis2.deployment.repository.util.DeploymentFileData;
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.MalformedStreamDefinitionException;
import org.wso2.carbon.databridge.commons.utils.EventDefinitionConverterUtils;
import org.wso2.carbon.event.application.deployer.EventProcessingDeployer;
import org.wso2.carbon.event.stream.core.exception.EventStreamConfigurationException;
import org.wso2.carbon.event.stream.core.internal.CarbonEventStreamService;
import org.wso2.carbon.event.stream.core.internal.ds.EventStreamServiceValueHolder;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Collections;
import java.util.Scanner;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* Deploy query plans as axis2 service
*/
public class EventStreamDeployer extends AbstractDeployer implements EventProcessingDeployer {
private static Log log = LogFactory.getLog(org.wso2.carbon.event.stream.core.EventStreamDeployer.class);
private ConfigurationContext configurationContext;
private Set<String> deployedEventStreamFilePaths = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
private Set<String> unDeployedEventStreamFilePaths = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
public void init(ConfigurationContext configurationContext) {
this.configurationContext = configurationContext;
}
/**
* Reads the query-plan.xml and deploys it.
*
* @param deploymentFileData information about query plan
* @throws org.apache.axis2.deployment.DeploymentException
*/
public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException {
try {
String path = deploymentFileData.getAbsolutePath();
if (!deployedEventStreamFilePaths.contains(path)) {
processDeployment(deploymentFileData);
} else {
log.debug("Event stream file is already deployed :" + path);
deployedEventStreamFilePaths.remove(path);
}
} catch (Throwable t) {
log.error("Can't deploy the event stream : " + deploymentFileData.getName(), t);
throw new DeploymentException("Can't deploy the event stream : " + deploymentFileData.getName(), t);
}
}
@Override
public void setDirectory(String s) {
}
@Override
public void setExtension(String s) {
}
public void undeploy(String filePath) throws DeploymentException {
try {
if (!unDeployedEventStreamFilePaths.contains(filePath)) {
processUndeployment(filePath);
} else {
log.debug("Event stream file is already undeployed :" + filePath);
unDeployedEventStreamFilePaths.remove(filePath);
}
} catch (Throwable t) {
log.error("Can't undeploy the event stream: " + filePath, t);
throw new DeploymentException("Can't undeploy the event stream: " + filePath, t);
}
}
public synchronized void processDeployment(DeploymentFileData deploymentFileData) throws EventStreamConfigurationException {
CarbonEventStreamService carbonEventStreamService = EventStreamServiceValueHolder.getCarbonEventStreamService();
File eventStreamFile = deploymentFileData.getFile();
boolean isEditable = !eventStreamFile.getAbsolutePath().contains(File.separator + "carbonapps" + File.separator);
try {
String content = new Scanner(new File(eventStreamFile.getAbsolutePath())).useDelimiter("\\Z").next();
StreamDefinition streamDefinition = EventDefinitionConverterUtils.convertFromJson(content);
StreamDefinition existingStreamDefinition = carbonEventStreamService.getStreamDefinition(streamDefinition.getStreamId());
if (existingStreamDefinition != null) {
throw new EventStreamConfigurationException("Event stream already exists for stream id: " + streamDefinition.getStreamId());
}
if (!carbonEventStreamService.isEventStreamFileExists(eventStreamFile.getName())) {
EventStreamConfiguration eventStreamConfiguration = new EventStreamConfiguration();
eventStreamConfiguration.setStreamDefinition(streamDefinition);
eventStreamConfiguration.setEditable(isEditable);
eventStreamConfiguration.setFileName(eventStreamFile.getName());
carbonEventStreamService.addEventStreamConfig(eventStreamConfiguration);
log.info("Stream definition is deployed successfully : " + streamDefinition.getStreamId());
} else {
log.info("Event stream definition for the same configuration file " + eventStreamFile.getName()
+ " already exists");
}
} catch (MalformedStreamDefinitionException e) {
throw new EventStreamConfigurationException("Error in constructing Stream Definition Object from JSON " + e.getMessage(), e);
} catch (FileNotFoundException e) {
throw new EventStreamConfigurationException("Stream Definition file not found " + eventStreamFile.getAbsolutePath() + "," + e.getMessage(), e);
}
}
public synchronized void processUndeployment(String filePath) throws EventStreamConfigurationException {
String fileName = new File(filePath).getName();
log.info("Stream Definition was undeployed successfully : " + fileName);
CarbonEventStreamService carbonEventStreamService = EventStreamServiceValueHolder.getCarbonEventStreamService();
carbonEventStreamService.removeEventStreamConfigurationFromMap(fileName);
}
public Set<String> getDeployedEventStreamFilePaths() {
return deployedEventStreamFilePaths;
}
public Set<String> getUnDeployedEventStreamFilePaths() {
return unDeployedEventStreamFilePaths;
}
public void executeManualDeployment(String filePath) throws EventStreamConfigurationException {
processDeployment(new DeploymentFileData(new File(filePath)));
}
public void executeManualUndeployment(String filePath) throws EventStreamConfigurationException {
processUndeployment(new File(filePath).getName());
}
}