content: /**
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF 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
   * <p>
   * http://www.apache.org/licenses/LICENSE-2.0
   * <p>
   * 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.apache.oozie.ambari.view;
  
  import java.io.IOException;
  import java.io.InputStream;
  
  import com.google.gson.JsonElement;
  import com.google.gson.JsonParser;
  import org.apache.hadoop.fs.FileStatus;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  public class WorkflowFilesService {
    private final static Logger LOGGER = LoggerFactory
            .getLogger(WorkflowFilesService.class);
    private HDFSFileUtils hdfsFileUtils;
    private String currentDraftVersion="v1";
  
    public WorkflowFilesService(HDFSFileUtils hdfsFileUtils) {
      super();
      this.hdfsFileUtils = hdfsFileUtils;
    }
  
    public String createFile(String appPath, String content,
                             boolean overwrite) throws IOException {
      return hdfsFileUtils.writeToFile(appPath, content,
              overwrite);
    }
  
    public String createAssetFile(String appPath, String content,
                                  boolean overwrite) throws IOException {
      return hdfsFileUtils.writeToFile(appPath, content,
              overwrite);
    }
  
    public InputStream readDraft(String appPath) throws IOException {
      return hdfsFileUtils.read(getWorkflowDraftFileName(appPath,null));
    }
  
    public InputStream readWorkflowXml(String appPath) throws IOException {
      return hdfsFileUtils.read(appPath);
    }
  
    public InputStream readAssset(String assetPath) throws IOException {
      return hdfsFileUtils.read(getAssetFileName(assetPath));
    }
  
    public String getWorkflowDraftFileName(String appPath,JobType jobType) {
      if (appPath.endsWith(Constants.WF_DRAFT_EXTENSION)) {
        return appPath;
      } else if (appPath.endsWith(Constants.WF_EXTENSION)) {
        String folderPath = appPath.substring(0, appPath.lastIndexOf(Constants.WF_EXTENSION));
        return folderPath + Constants.WF_DRAFT_EXTENSION;
      }
      if (jobType==null){
        throw new RuntimeException("Could not determine jobType(Workflow/Coordniator/Bundle");
      }
      if (appPath.endsWith("/")) {
        return appPath + getDefaultDraftFileName(jobType);
      } else {
        return appPath + "/" + getDefaultDraftFileName(jobType);
      }
    }
  
    public String getWorkflowFileName(String appPath, JobType jobType) {
      if (appPath.endsWith(Constants.WF_EXTENSION)) {
        return appPath;
      } else if (appPath.endsWith(Constants.WF_DRAFT_EXTENSION)) {
        String folderPath = appPath.substring(0, appPath.lastIndexOf(Constants.WF_DRAFT_EXTENSION));
        return folderPath + Constants.WF_EXTENSION;
      } else if (appPath.endsWith("/")) {
        return appPath + getDefaultFileName(jobType);
      } else {
        return appPath + "/" + getDefaultFileName(jobType);
      }
    }
  
    private String getDefaultFileName(JobType jobType){
      switch (jobType){
        case BUNDLE:
          return Constants.DEFAULT_BUNDLE_FILENAME+Constants.WF_EXTENSION;
        case COORDINATOR:
          return Constants.DEFAULT_COORDINATOR_FILENAME+Constants.WF_EXTENSION;
        case WORKFLOW:
          return Constants.DEFAULT_WORKFLOW_FILENAME+Constants.WF_EXTENSION;
        default:
          return null;
      }
    }
    private String getDefaultDraftFileName(JobType jobType) {
      switch (jobType){
        case BUNDLE:
          return Constants.DEFAULT_BUNDLE_FILENAME+Constants.WF_DRAFT_EXTENSION;
        case COORDINATOR:
          return Constants.DEFAULT_COORDINATOR_FILENAME+Constants.WF_DRAFT_EXTENSION;
        case WORKFLOW:
          return Constants.DEFAULT_WORKFLOW_FILENAME+Constants.WF_DRAFT_EXTENSION;
        default:
          return null;
      }
    }
  
    public String getAssetFileName(String appPath) {
      String assetFile = null;
      if (appPath.endsWith(Constants.WF_ASSET_EXTENSION)) {
        assetFile = appPath;
      } else {
        String[] paths=appPath.split("/");
        if (paths[paths.length-1].contains(".")){
          return appPath;
        }else{
          assetFile = appPath + (appPath.endsWith("/") ? "" : "/")
            + Constants.DEFAULT_WORKFLOW_ASSET_FILENAME;
        }
      }
      return assetFile;
    }
  
    public void discardDraft(String workflowPath) throws IOException {
      hdfsFileUtils.deleteFile(getWorkflowDraftFileName(workflowPath,null));
    }
  
    public WorkflowFileInfo getWorkflowDetails(String appPath, JobType jobType) {
      appPath=appPath.trim();
      WorkflowFileInfo workflowInfo = new WorkflowFileInfo();
      workflowInfo.setWorkflowPath(appPath);
      boolean draftExists = hdfsFileUtils
              .fileExists(getWorkflowDraftFileName(appPath,jobType
              ));
      workflowInfo.setDraftExists(draftExists);
      boolean workflowExists = hdfsFileUtils.fileExists(appPath);
      workflowInfo.setWorkflowDefinitionExists(workflowExists);
      FileStatus workflowFileStatus = null;
      if (workflowExists) {
        workflowFileStatus = hdfsFileUtils
                .getFileStatus(appPath);
        workflowInfo.setWorkflowModificationTime(workflowFileStatus
                .getModificationTime());
  
      }
      if (draftExists) {
        FileStatus draftFileStatus = hdfsFileUtils
                .getFileStatus(getWorkflowDraftFileName(appPath,jobType));
        workflowInfo.setDraftModificationTime(draftFileStatus
                .getModificationTime());
        if (!workflowExists) {
          workflowInfo.setIsDraftCurrent(true);
        } else {
          workflowInfo.setIsDraftCurrent(draftFileStatus.getModificationTime()
                  - workflowFileStatus.getModificationTime() > 0);
        }
      }
      return workflowInfo;
    }
    public void deleteWorkflowFile(String fullWorkflowFilePath){
      try {
        hdfsFileUtils.deleteFile(fullWorkflowFilePath);
      } catch (IOException e) {
        throw new RuntimeException(e);
      }
    }
  
    public boolean isDraftFormatCurrent(String json) {
      JsonElement jsonElement = new JsonParser().parse(json);
      JsonElement draftVersion = jsonElement.getAsJsonObject().get("draftVersion");
      if (draftVersion != null && currentDraftVersion.equals(draftVersion.getAsString().trim())) {
        return true;
      } else {
        return false;
      }
    }
  }