private boolean validateArtifact(Artifact artifact) {
    if (artifact == null) {
      return false;
    }

    if (!isAccepted(artifact.getType())) {
      log.warn(
          "Can't deploy artifact : "
              + artifact.getName()
              + " of type : "
              + artifact.getType()
              + ". Required features are not installed in the system");
      return false;
    }

    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;
  }
 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 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);
   }
 }
  /**
   * Check the artifact type and if it is a Gadget, copy it to the Gadget deployment hot folder
   *
   * @param carbonApp - CarbonApplication instance to check for Gadget 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) {
      Deployer deployer;
      Artifact artifact = dep.getArtifact();
      if (artifact == null) {
        continue;
      }
      if (!isAccepted(artifact.getType())) {
        log.warn(
            "Can't deploy artifact : "
                + artifact.getName()
                + " of type : "
                + artifact.getType()
                + ". Required features are not installed in the system");
        continue;
      }

      if (GADGET_TYPE.equals(artifact.getType())) {
        deployer = AppDeployerUtils.getArtifactDeployer(axisConfig, GADGET_DIR, "gar");
      } else {
        continue;
      }

      List<CappFile> files = artifact.getFiles();
      if (files.size() != 1) {
        log.error(
            "Gadgets must have a single .gar file to "
                + "be deployed. But "
                + files.size()
                + " files found.");
        continue;
      }
      if (deployer != null) {
        String fileName = artifact.getFiles().get(0).getName();
        String artifactPath = artifact.getExtractedPath() + File.separator + fileName;
        try {
          deployer.deploy(new DeploymentFileData(new File(artifactPath), deployer));
          artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_DEPLOYED);
        } catch (DeploymentException e) {
          artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_FAILED);
          throw e;
        }
      }
    }
  }
 @Override
 public void undeployArtifacts(
     CarbonApplication carbonApplication, AxisConfiguration axisConfiguration)
     throws DeploymentException {
   if (Boolean.getBoolean(Constants.DISABLE_ANALYTICS_DATA_PURGING_JVM_OPTION)) {
     return;
   }
   List<Artifact.Dependency> artifacts =
       carbonApplication.getAppConfig().getApplicationArtifact().getDependencies();
   for (Artifact.Dependency dep : artifacts) {
     Artifact artifact = dep.getArtifact();
     if (artifact == null) {
       continue;
     }
     if (TYPE.equals(artifact.getType())) {
       List<CappFile> files = artifact.getFiles();
       if (files.size() != 1) {
         log.error(
             "Purging artifact must have a single XML file to be deployed. But "
                 + files.size()
                 + " "
                 + "files found");
         continue;
       }
       if (AppDeployerConstants.DEPLOYMENT_STATUS_DEPLOYED.equals(
           artifact.getDeploymentStatus())) {
         String fileName = artifact.getFiles().get(0).getName();
         fileName = GenericUtils.checkAndReturnPath(fileName);
         String artifactPath = artifact.getExtractedPath() + File.separator + fileName;
         deletePurgingTasks(artifactPath);
         artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_PENDING);
       }
     }
   }
 }
  /**
   * Check the artifact type and if it is a Gadget, delete the file from the Gadget deployment hot
   * folder
   *
   * @param carbonApp - CarbonApplication instance to check for Gadget artifacts
   * @param axisConfig - AxisConfiguration of the current tenant
   */
  public void undeployArtifacts(CarbonApplication carbonApp, AxisConfiguration axisConfig) {

    List<Artifact.Dependency> artifacts =
        carbonApp.getAppConfig().getApplicationArtifact().getDependencies();

    for (Artifact.Dependency dep : artifacts) {
      Deployer deployer;
      Artifact artifact = dep.getArtifact();
      if (artifact == null) {
        continue;
      }

      if (GADGET_TYPE.equals(artifact.getType())) {
        deployer = AppDeployerUtils.getArtifactDeployer(axisConfig, GADGET_DIR, "gar");
      } else {
        continue;
      }

      List<CappFile> files = artifact.getFiles();
      if (files.size() != 1) {
        log.error("A Gadget must have a single .gar file. But " + files.size() + " files found.");
        continue;
      }
      if (deployer != null
          && AppDeployerConstants.DEPLOYMENT_STATUS_DEPLOYED.equals(
              artifact.getDeploymentStatus())) {
        String fileName = artifact.getFiles().get(0).getName();
        String artifactPath = artifact.getExtractedPath() + File.separator + fileName;
        try {
          deployer.undeploy(artifactPath);
          artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_PENDING);
          File artifactFile = new File(artifactPath);
          if (artifactFile.exists() && !artifactFile.delete()) {
            log.warn("Couldn't delete App artifact file : " + artifactPath);
          }
        } catch (DeploymentException e) {
          artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_FAILED);
          log.error("Error occured while trying to un deploy : " + artifact.getName());
        }
      }
    }
  }
 @Override
 public void deployArtifacts(
     CarbonApplication carbonApplication, AxisConfiguration axisConfiguration)
     throws DeploymentException {
   if (Boolean.getBoolean(Constants.DISABLE_ANALYTICS_DATA_PURGING_JVM_OPTION)) {
     if (log.isDebugEnabled()) {
       log.debug("Purging task not scheduling through CApp.");
     }
     return;
   }
   List<Artifact.Dependency> artifacts =
       carbonApplication.getAppConfig().getApplicationArtifact().getDependencies();
   // loop through all artifacts
   for (Artifact.Dependency dep : artifacts) {
     Artifact artifact = dep.getArtifact();
     if (artifact == null) {
       continue;
     }
     if (TYPE.equals(artifact.getType())) {
       List<CappFile> files = artifact.getFiles();
       if (files.size() == 1) {
         String fileName = files.get(0).getName();
         fileName = GenericUtils.checkAndReturnPath(fileName);
         String artifactPath = artifact.getExtractedPath() + File.separator + fileName;
         try {
           registerPurgingTasks(artifactPath);
           artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_DEPLOYED);
         } catch (DeploymentException e) {
           artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_FAILED);
           throw e;
         }
       } else if (files.size() != 0) {
         log.warn(
             "Purging artifact must have a single XML file to be deployed. But "
                 + files.size()
                 + " "
                 + "files found");
       }
     }
   }
 }
  /**
   * Deploy or un-deploy data sources. if deploying, adding the data source to the data sources and
   * if undeploying, removing the data source from data sources. there can be multiple data sources
   * as separate xml files.
   *
   * @param deploy - identify whether deployment process or un-deployment process.
   * @param artifacts - list of artifacts to be deployed.
   */
  private void deployUnDeployDataSources(boolean deploy, List<Artifact> artifacts)
      throws DeploymentException {
    for (Artifact artifact : artifacts) {
      if (DATA_SOURCE_TYPE.equals(artifact.getType())) {
        List<CappFile> files = artifact.getFiles();
        if (files == null || files.isEmpty()) {
          throw new DeploymentException(
              "DataSourceCappDeployer::deployUnDeployDataSources --> "
                  + "Error No data sources found in the artifact to deploy");
        }
        for (CappFile cappFile : files) {
          String fileName = cappFile.getName();
          String dataSourceConfigPath = artifact.getExtractedPath() + File.separator + fileName;

          File file = new File(dataSourceConfigPath);
          if (!file.exists()) {
            throw new DeploymentException(
                "DataSourceCappDeployer::deployUnDeployDataSources --> "
                    + "Error Data source file cannot be found in artifact, "
                    + "file name - "
                    + fileName);
          }
          DataSourceMetaInfo dataSourceMetaInfo = readDataSourceFile(file);
          /**
           * If some artifact fail to deploy, then whole car file will fail, then it will invoke
           * un-deploy flow for the car file so that should only un-deploy artifacts which are
           * already deployed. To identify that we use deployment status of the artifact
           */
          if (deploy) {
            try {
              if (DataSourceManager.getInstance()
                      .getDataSourceRepository()
                      .getDataSource(dataSourceMetaInfo.getName())
                  != null) {
                artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_FAILED);
                throw new DeploymentException(
                    "DataSourceCappDeployer::deployUnDeployDataSources --> "
                        + "Error in deploying data source: data source "
                        + "with same name already exist, "
                        + "data source name - "
                        + dataSourceMetaInfo.getName());
              }
              dataSourceMetaInfo.setCarbonApplicationDeployed(true);
              DataSourceManager.getInstance()
                  .getDataSourceRepository()
                  .addDataSource(dataSourceMetaInfo);
              artifact.setDeploymentStatus(AppDeployerConstants.DEPLOYMENT_STATUS_DEPLOYED);
            } catch (DataSourceException e) {
              throw new DeploymentException(
                  "DataSourceCappDeployer::deployUnDeployDataSources --> "
                      + "Error in deploying data source: "
                      + e.getMessage(),
                  e);
            }
          } else {
            try {
              if (DataSourceManager.getInstance()
                          .getDataSourceRepository()
                          .getDataSource(dataSourceMetaInfo.getName())
                      != null
                  && artifact
                      .getDeploymentStatus()
                      .equals(AppDeployerConstants.DEPLOYMENT_STATUS_DEPLOYED)) {
                DataSourceManager.getInstance()
                    .getDataSourceRepository()
                    .deleteDataSource(dataSourceMetaInfo.getName());
              }
            } catch (DataSourceException e) {
              throw new DeploymentException(
                  "DataSourceCappDeployer::deployUnDeployDataSources --> "
                      + "Error in undeploying data source: "
                      + e.getMessage(),
                  e);
            }
          }
        }
      }
    }
  }