| /** |
| * 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; |
| } |
| } |
| } |