in plugins/transforms/processfiles/src/main/java/org/apache/hop/pipeline/transforms/processfiles/ProcessFiles.java [48:283]
public boolean processRow() throws HopException {
Object[] r = getRow(); // Get row from input rowset & set row busy!
if (r == null) { // no more input to be expected...
setOutputDone();
return false;
}
if (first) {
first = false;
// Check is source filename field is provided
if (Utils.isEmpty(meta.getSourceFilenameField())) {
throw new HopException(
BaseMessages.getString(PKG, "ProcessFiles.Error.SourceFilenameFieldMissing"));
}
// Check is target filename field is provided
if (meta.getOperationType() != ProcessFilesMeta.OPERATION_TYPE_DELETE
&& Utils.isEmpty(meta.getTargetFilenameField())) {
throw new HopException(
BaseMessages.getString(PKG, "ProcessFiles.Error.TargetFilenameFieldMissing"));
}
// cache the position of the source filename field
if (data.indexOfSourceFilename < 0) {
data.indexOfSourceFilename = getInputRowMeta().indexOfValue(meta.getSourceFilenameField());
if (data.indexOfSourceFilename < 0) {
// The field is unreachable !
throw new HopException(
BaseMessages.getString(
PKG, "ProcessFiles.Exception.CouldnotFindField", meta.getSourceFilenameField()));
}
}
// cache the position of the source filename field
if (meta.getOperationType() != ProcessFilesMeta.OPERATION_TYPE_DELETE
&& data.indexOfTargetFilename < 0) {
data.indexOfTargetFilename = getInputRowMeta().indexOfValue(meta.getTargetFilenameField());
if (data.indexOfTargetFilename < 0) {
// The field is unreachable !
throw new HopException(
BaseMessages.getString(
PKG, "ProcessFiles.Exception.CouldnotFindField", meta.getTargetFilenameField()));
}
}
if (meta.simulate && isBasic()) {
logBasic(BaseMessages.getString(PKG, "ProcessFiles.Log.SimulationModeON"));
}
} // End If first
try {
// get source filename
String sourceFilename = getInputRowMeta().getString(r, data.indexOfSourceFilename);
if (Utils.isEmpty(sourceFilename)) {
logError(BaseMessages.getString(PKG, "ProcessFiles.Error.SourceFileEmpty"));
throw new HopException(BaseMessages.getString(PKG, "ProcessFiles.Error.SourceFileEmpty"));
}
data.sourceFile = HopVfs.getFileObject(sourceFilename, variables);
if (!data.sourceFile.exists()) {
logError(
BaseMessages.getString(PKG, "ProcessFiles.Error.SourceFileNotExist", sourceFilename));
throw new HopException(
BaseMessages.getString(PKG, "ProcessFiles.Error.SourceFileNotExist", sourceFilename));
}
if (data.sourceFile.getType() != FileType.FILE) {
logError(
BaseMessages.getString(PKG, "ProcessFiles.Error.SourceFileNotFile", sourceFilename));
throw new HopException(
BaseMessages.getString(PKG, "ProcessFiles.Error.SourceFileNotFile", sourceFilename));
}
String targetFilename = null;
if (meta.getOperationType() != ProcessFilesMeta.OPERATION_TYPE_DELETE) {
// get value for target filename
targetFilename = getInputRowMeta().getString(r, data.indexOfTargetFilename);
if (Utils.isEmpty(targetFilename)) {
logError(BaseMessages.getString(PKG, "ProcessFiles.Error.TargetFileEmpty"));
throw new HopException(BaseMessages.getString(PKG, "ProcessFiles.Error.TargetFileEmpty"));
}
data.targetFile = HopVfs.getFileObject(targetFilename, variables);
if (data.targetFile.exists()) {
if (isDetailed()) {
logDetailed(
BaseMessages.getString(PKG, "ProcessFiles.Log.TargetFileExists", targetFilename));
}
// check if target is really a file otherwise it could overwrite a complete folder by copy
// or move operations
if (data.targetFile.getType() != FileType.FILE) {
logError(
BaseMessages.getString(
PKG, "ProcessFiles.Error.TargetFileNotFile", targetFilename));
throw new HopException(
BaseMessages.getString(
PKG, "ProcessFiles.Error.TargetFileNotFile", targetFilename));
}
} else {
// let's check parent folder
FileObject parentFolder = data.targetFile.getParent();
if (!parentFolder.exists()) {
if (!meta.isCreateParentFolder()) {
throw new HopException(
BaseMessages.getString(
PKG,
"ProcessFiles.Error.TargetParentFolderNotExists",
parentFolder.toString()));
} else {
parentFolder.createFolder();
}
}
if (parentFolder != null) {
parentFolder.close();
}
}
}
switch (meta.getOperationType()) {
case ProcessFilesMeta.OPERATION_TYPE_COPY:
if (((meta.isOverwriteTargetFile() && data.targetFile.exists())
|| !data.targetFile.exists())
&& !meta.simulate) {
if (meta.isOverwriteTargetFile() && data.targetFile.exists())
logBasic(
BaseMessages.getString(
PKG, "ProcessFiles.Log.SourceFileCopied.TargetOverwritten", targetFilename));
// Better to delete the file before because. sometime, it's not properly overwritten
data.targetFile.delete();
data.targetFile.copyFrom(data.sourceFile, new TextOneToOneFileSelector());
if (isDetailed()) {
logDetailed(
BaseMessages.getString(
PKG, "ProcessFiles.Log.SourceFileCopied", sourceFilename, targetFilename));
}
} else {
if (isDetailed()) {
logDetailed(
BaseMessages.getString(
PKG,
"ProcessFiles.Log.TargetNotOverwritten",
sourceFilename,
targetFilename));
}
}
break;
case ProcessFilesMeta.OPERATION_TYPE_MOVE:
if (((meta.isOverwriteTargetFile() && data.targetFile.exists())
|| !data.targetFile.exists())
&& !meta.simulate) {
if (meta.isOverwriteTargetFile() && data.targetFile.exists())
logBasic(
BaseMessages.getString(
PKG, "ProcessFiles.Log.SourceFileMoved.TargetOverwritten", targetFilename));
data.sourceFile.moveTo(HopVfs.getFileObject(targetFilename, variables));
if (isDetailed()) {
logDetailed(
BaseMessages.getString(
PKG, "ProcessFiles.Log.SourceFileMoved", sourceFilename, targetFilename));
}
} else {
if (isDetailed()) {
logDetailed(
BaseMessages.getString(
PKG,
"ProcessFiles.Log.TargetNotOverwritten",
sourceFilename,
targetFilename));
}
}
break;
case ProcessFilesMeta.OPERATION_TYPE_DELETE:
if (!meta.simulate && !data.sourceFile.delete()) {
throw new HopException(
BaseMessages.getString(
PKG, "ProcessFiles.Error.CanNotDeleteFile", data.sourceFile.toString()));
}
if (isDetailed()) {
logDetailed(
BaseMessages.getString(PKG, "ProcessFiles.Log.SourceFileDeleted", sourceFilename));
}
break;
default:
break;
}
// add filename to result filenames?
if (meta.isAddResultFilenames()
&& meta.getOperationType() != ProcessFilesMeta.OPERATION_TYPE_DELETE
&& data.targetFile.getType() == FileType.FILE) {
// Add this to the result file names...
ResultFile resultFile =
new ResultFile(
ResultFile.FILE_TYPE_GENERAL,
data.targetFile,
getPipelineMeta().getName(),
getTransformName());
resultFile.setComment(BaseMessages.getString(PKG, "ProcessFiles.Log.FileAddedResult"));
addResultFile(resultFile);
if (isDetailed()) {
logDetailed(
BaseMessages.getString(
PKG, "ProcessFiles.Log.FilenameAddResult", data.targetFile.toString()));
}
}
putRow(getInputRowMeta(), r); // copy row to possible alternate rowset(s).
if (checkFeedback(getLinesRead()) && isBasic()) {
logBasic(BaseMessages.getString(PKG, "ProcessFiles.LineNumber") + getLinesRead());
}
} catch (Exception e) {
boolean sendToErrorRow = false;
String errorMessage = null;
if (getTransformMeta().isDoingErrorHandling()) {
sendToErrorRow = true;
errorMessage = e.toString();
} else {
logError(
BaseMessages.getString(PKG, "ProcessFiles.ErrorInTransformRunning") + e.getMessage());
setErrors(1);
stopAll();
setOutputDone(); // signal end to receiver(s)
return false;
}
if (sendToErrorRow) {
// Simply add this row to the error row
putError(getInputRowMeta(), r, 1, errorMessage, null, "ProcessFiles001");
}
}
return true;
}