blob: cdf4e9929346eb2f810a1f91f872222a3ff5308b [file] [log] [blame]
/**
* 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;
}
}
}