/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.sys.context;
import java.io.File;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
/**
* BatchStepFileDescriptor contains the properties of a batch step file (name of the job, name of the step, and the file type extension).
* The index of the step, the start time/date, and the completion time/date of the step can also be stored.
*
*/
public class BatchStepFileDescriptor {
private static final String STEP_FILE_SUFFIX_RUN = "run";
private static final String STEP_FILE_SUFFIX_RESULT_SUCCESS = "success";
private static final String STEP_FILE_SUFFIX_RESULT_ERROR = "error";
public static final String STEP_FILE_EXTENSION_SEPARATOR = ".";
public static final String STEP_FILE_NAME_SEPARATOR = "~";
private String jobName;
private String stepName;
private String extension;
private File stepFile;
private Integer stepIndex;
private Date startedDate;
private Date completedDate;
/**
* Create a descriptor using the properties provided. getStepFile() will return null when this constructor is used.
* This constructor is used to provide the details about a semaphore file to look for in the directory.
*
* @param jobName the name of the job in which the step is running
* @param stepName the name of the step to be executed
* @param extension the type of file to work with (RUN, SUCCESS, or ERROR)
*/
public BatchStepFileDescriptor(String jobName, String stepName, String extension) {
this.jobName = jobName;
this.stepName = stepName;
this.extension = extension;
}
/**
* @param stepFile the semaphore file in the directory. The jobName, stepName, and extension are retrieved from the semaphore file name.
*/
public BatchStepFileDescriptor(File stepFile) {
this.stepFile = stepFile;
this.jobName = getJobNameFromFile(stepFile);
this.stepName = getStepNameFromFile(stepFile);
this.extension = getExtensionFromFile(stepFile);
}
/**
* @return the name of the job in which the step is running
*/
public String getJobName() {
return jobName;
}
/**
* @return the name of the step being executed
*/
public String getStepName() {
return stepName;
}
/**
* @return the extension of the semaphore file
*/
public String getExtension() {
return extension;
}
/**
* @return the semaphore file in the directory
*/
public File getStepFile() {
return stepFile;
}
/**
* @return the name of the file with the extension (jobName~stepName.extension)
*/
public String getName() {
return jobName + STEP_FILE_NAME_SEPARATOR + stepName + STEP_FILE_EXTENSION_SEPARATOR + extension;
}
/**
* @return the name of the file without an extension (jobName~stepName)
*/
public String getNameNoExtension() {
return jobName + STEP_FILE_NAME_SEPARATOR + stepName;
}
/**
* Return a representation of the step file descriptor. STEP and the stepIndex are only printed if the stepIndex is not null.
*
* @return [jobName] STEP[stepIndex]-[stepName] or [jobName] [stepName]
*/
@Override
public String toString() {
return getJobName() +" "+ (stepIndex != null ? "STEP"+ stepIndex +"-":"") + getStepName();
}
/**
* @return true if the semaphore file is an ERROR file, false otherwise
*/
public boolean isStepFileAnErrorResultFile() {
return getName().endsWith(BatchStepFileDescriptor.getFileExtensionError());
}
/**
* @return the index of the step in its job
*/
public Integer getStepIndex() {
return stepIndex;
}
/**
* @param stepIndex the index of the step in its job
*/
public void setStepIndex(Integer stepIndex) {
this.stepIndex = stepIndex;
}
/**
* @return the time the step started
*/
public Date getStartedDate() {
return startedDate;
}
/**
* @param startedDate the time the step started
*/
public void setStartedDate(Date startedDate) {
this.startedDate = startedDate;
}
/**
* @return the time the step completed
*/
public Date getCompletedDate() {
return completedDate;
}
/**
* @param completedDate the time the step completed
*/
public void setCompletedDate(Date completedDate) {
this.completedDate = completedDate;
}
/**
* Retrieves the name of the job from the File
*
* @param runFile the semaphore file
* @return the job name
*/
private String getJobNameFromFile(File runFile) {
String runFileName = runFile.getName();
int indexOfExtension = runFileName.lastIndexOf(STEP_FILE_EXTENSION_SEPARATOR);
String fileNameNoExtension = StringUtils.substring(runFileName, 0, indexOfExtension);
int indexOfStep = fileNameNoExtension.lastIndexOf(STEP_FILE_NAME_SEPARATOR);
String jobName = StringUtils.substring(fileNameNoExtension, 0, indexOfStep);
return jobName;
}
/**
* Retrieves the name of the step from the File
*
* @param runFile the semaphore file
* @return the step name
*/
private String getStepNameFromFile(File runFile) {
String runFileName = runFile.getName();
int indexOfExtension = runFileName.lastIndexOf(STEP_FILE_EXTENSION_SEPARATOR);
String fileNameNoExtension = StringUtils.substring(runFileName, 0, indexOfExtension);
int indexOfStep = fileNameNoExtension.lastIndexOf(STEP_FILE_NAME_SEPARATOR);
String stepName = StringUtils.substring(fileNameNoExtension, indexOfStep+1);
return stepName;
}
/**
* Retrieves the extension from the File
*
* @param runFile the semaphore file
* @return the extension
*/
private String getExtensionFromFile(File runFile) {
String runFileName = runFile.getName();
int indexOfExtension = runFileName.lastIndexOf(STEP_FILE_EXTENSION_SEPARATOR);
String extension = StringUtils.substring(runFileName, indexOfExtension+1);
return extension;
}
/**
* @return the extension for the RUN file
*/
public static String getFileExtensionRun() {
return BatchStepFileDescriptor.STEP_FILE_SUFFIX_RUN;
}
/**
* @return the extension for the SUCCESS file
*/
public static String getFileExtensionSuccess() {
return BatchStepFileDescriptor.STEP_FILE_SUFFIX_RESULT_SUCCESS;
}
/**
* @return the extension for the ERROR file
*/
public static String getFileExtensionError() {
return BatchStepFileDescriptor.STEP_FILE_SUFFIX_RESULT_ERROR;
}
}