/* * 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.application.deployer; import org.apache.axis2.deployment.Deployer; import org.apache.axis2.deployment.DeploymentException; import org.apache.axis2.deployment.repository.util.DeploymentFileData; import org.apache.axis2.engine.AxisConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.application.deployer.AppDeployerConstants; import org.wso2.carbon.application.deployer.AppDeployerUtils; import org.wso2.carbon.application.deployer.CarbonApplication; import org.wso2.carbon.application.deployer.config.Artifact; import org.wso2.carbon.application.deployer.config.CappFile; import org.wso2.carbon.application.deployer.handler.AppDeploymentHandler; import org.wso2.carbon.event.application.deployer.internal.EventProcessingAppDeployerDS; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; public class EventProcessingAppDeployer implements AppDeploymentHandler { private static final Log log = LogFactory.getLog(EventProcessingAppDeployer.class); private Map<String, Boolean> acceptanceList = null; private List<Artifact> executionPlans = new ArrayList<Artifact>(); private List<Artifact> eventStreams = new ArrayList<Artifact>(); private List<Artifact> eventReceivers = new ArrayList<Artifact>(); private List<Artifact> eventPublishers = new ArrayList<Artifact>(); /** * @param carbonApp - CarbonApplication instance to check for Event Processing artifacts * @param axisConfig - AxisConfiguration of the current tenant */ public void deployArtifacts(CarbonApplication carbonApp, AxisConfiguration axisConfig) throws DeploymentException { List<Artifact.Dependency> artifacts = carbonApp.getAppConfig().getApplicationArtifact().getDependencies(); for (Artifact.Dependency dep : artifacts) { Artifact artifact = dep.getArtifact(); if (!validateArtifact(artifact)) { continue; } addArtifact(artifact); } try { deployTypeSpecifiedArtifacts(eventStreams, axisConfig, EventProcessingAppDeployerConstants.CEP_EVENT_STREAM_DIR, EventProcessingAppDeployerConstants.FILE_TYPE_JSON); deployTypeSpecifiedArtifacts(eventReceivers, axisConfig, EventProcessingAppDeployerConstants.CEP_EVENT_RECEIVER_DIR, EventProcessingAppDeployerConstants.FILE_TYPE_XML); deployTypeSpecifiedArtifacts(eventPublishers, axisConfig, EventProcessingAppDeployerConstants.CEP_EVENT_PUBLISHER_DIR, EventProcessingAppDeployerConstants.FILE_TYPE_XML); deployTypeSpecifiedArtifacts(executionPlans, axisConfig, EventProcessingAppDeployerConstants.CEP_EXECUTION_PLAN_DIR, EventProcessingAppDeployerConstants.FILE_TYPE_SIDDHIQL); } catch (Exception e) { throw new DeploymentException(e.getMessage(), e); } finally { executionPlans.clear(); eventStreams.clear(); eventReceivers.clear(); eventPublishers.clear(); } } private void deployTypeSpecifiedArtifacts(List<Artifact> artifacts, AxisConfiguration axisConfig, String directory, String fileType) throws DeploymentException { for (Artifact artifact : artifacts) { EventProcessingDeployer deployer; deployer = (EventProcessingDeployer) AppDeployerUtils.getArtifactDeployer(axisConfig, directory, fileType); if (deployer != null) { deploy(deployer, artifact); } } } void deploy(EventProcessingDeployer deployer, Artifact artifact) throws DeploymentException { String fileName = artifact.getFiles().get(0).getName(); String artifactPath = artifact.getExtractedPath() + File.separator + fileName; try { deployer.processDeployment(new DeploymentFileData(new File(artifactPath), deployer)); artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_DEPLOYED); } catch (Exception e) { artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_FAILED); log.error("Deployment is failed due to " + e.getMessage(), e); throw new DeploymentException(e.getMessage(), e); } } private void addArtifact(Artifact artifact) { if (EventProcessingAppDeployerConstants.CEP_EVENT_RECEIVER_TYPE.equals(artifact.getType())) { eventReceivers.add(artifact); } else if (EventProcessingAppDeployerConstants.CEP_EVENT_PUBLISHER_TYPE.equals(artifact.getType())) { eventPublishers.add(artifact); } else if (EventProcessingAppDeployerConstants.CEP_EXECUTION_PLAN_TYPE.equals(artifact.getType())) { executionPlans.add(artifact); } else if (EventProcessingAppDeployerConstants.CEP_EVENT_STREAM_TYPE.equals(artifact.getType())) { eventStreams.add(artifact); } } public void undeployArtifacts(CarbonApplication carbonApp, AxisConfiguration axisConfig) throws DeploymentException { List<Artifact.Dependency> artifacts = carbonApp.getAppConfig().getApplicationArtifact().getDependencies(); executionPlans.clear(); eventStreams.clear(); eventReceivers.clear(); eventPublishers.clear(); for (Artifact.Dependency dep : artifacts) { Artifact artifact = dep.getArtifact(); if (!validateArtifact(artifact)) { continue; } addArtifact(artifact); } try { undeployTypeSpecifiedArtifacts(eventStreams, axisConfig, EventProcessingAppDeployerConstants.CEP_EVENT_STREAM_DIR, EventProcessingAppDeployerConstants.FILE_TYPE_JSON); undeployTypeSpecifiedArtifacts(eventReceivers, axisConfig, EventProcessingAppDeployerConstants.CEP_EVENT_RECEIVER_DIR, EventProcessingAppDeployerConstants.FILE_TYPE_XML); undeployTypeSpecifiedArtifacts(eventPublishers, axisConfig, EventProcessingAppDeployerConstants.CEP_EVENT_PUBLISHER_DIR, EventProcessingAppDeployerConstants.FILE_TYPE_XML); undeployTypeSpecifiedArtifacts(executionPlans, axisConfig, EventProcessingAppDeployerConstants.CEP_EXECUTION_PLAN_DIR, EventProcessingAppDeployerConstants.FILE_TYPE_SIDDHIQL); } finally { executionPlans.clear(); eventStreams.clear(); eventReceivers.clear(); eventPublishers.clear(); } } private void undeployTypeSpecifiedArtifacts(List<Artifact> artifacts, AxisConfiguration axisConfig, String directory, String fileType) throws DeploymentException { for (Artifact artifact : artifacts) { EventProcessingDeployer deployer; deployer = (EventProcessingDeployer) AppDeployerUtils.getArtifactDeployer(axisConfig, directory, fileType); if (deployer != null && AppDeployerConstants.DEPLOYMENT_STATUS_DEPLOYED.equals(artifact.getDeploymentStatus())) { undeploy(deployer, artifact); } } } private void undeploy(EventProcessingDeployer deployer, Artifact artifact) throws DeploymentException { String fileName = artifact.getFiles().get(0).getName(); String artifactPath = artifact.getExtractedPath() + File.separator + fileName; try { deployer.processUndeployment(new DeploymentFileData(new File(artifactPath), deployer).getAbsolutePath()); artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_PENDING); } catch (Exception e) { artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_FAILED); log.error("Undeployment is failed due to " + e.getMessage(), e); throw new DeploymentException(e.getMessage(), e); } } private EventProcessingDeployer getDeployer(Artifact artifact, AxisConfiguration axisConfig) { Deployer deployer; if (EventProcessingAppDeployerConstants.CEP_EVENT_RECEIVER_TYPE.equals(artifact.getType())) { deployer = AppDeployerUtils .getArtifactDeployer(axisConfig, EventProcessingAppDeployerConstants.CEP_EVENT_RECEIVER_DIR, "xml"); } else if (EventProcessingAppDeployerConstants.CEP_EVENT_PUBLISHER_TYPE.equals(artifact.getType())) { deployer = AppDeployerUtils .getArtifactDeployer(axisConfig, EventProcessingAppDeployerConstants.CEP_EVENT_PUBLISHER_DIR, "xml"); } else if (EventProcessingAppDeployerConstants.CEP_EXECUTION_PLAN_TYPE.equals(artifact.getType())) { deployer = AppDeployerUtils .getArtifactDeployer(axisConfig, EventProcessingAppDeployerConstants.CEP_EXECUTION_PLAN_DIR, "xml"); } else if (EventProcessingAppDeployerConstants.CEP_EVENT_STREAM_TYPE.equals(artifact.getType())) { deployer = AppDeployerUtils .getArtifactDeployer(axisConfig, EventProcessingAppDeployerConstants.CEP_EVENT_STREAM_DIR, "json"); } else { deployer = null; } return (EventProcessingDeployer) deployer; } private boolean isAccepted(String serviceType) { if (acceptanceList == null) { acceptanceList = AppDeployerUtils.buildAcceptanceList(EventProcessingAppDeployerDS .getRequiredFeatures()); } Boolean acceptance = acceptanceList.get(serviceType); return (Boolean.TRUE.equals(acceptance)); } private boolean validateArtifact(Artifact artifact) { if (artifact == null) { return false; } if (isAccepted(artifact.getType())) { List<CappFile> files = artifact.getFiles(); if (files.size() != 1) { log.error("Synapse artifact types must have a single file to " + "be deployed. But " + files.size() + " files found."); return false; } return true; } return false; } }