This is an automated email from the ASF dual-hosted git repository.
hansva pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hop.git
The following commit(s) were added to refs/heads/master by this push:
new 56fdd1d HOP-3475 ExcelWriter: Add create parent folder option
new 0383ebb Merge pull request #1191 from sramazzina/HOP-3475
56fdd1d is described below
commit 56fdd1d2a2353eb1af9728cd61ff4dc547257b5c
Author: sergio.ramazzina <[email protected]>
AuthorDate: Mon Nov 8 23:25:40 2021 +0100
HOP-3475 ExcelWriter: Add create parent folder option
---
.../pages/pipeline/transforms/excelwriter.adoc | 3 +-
.../excelwriter/ExcelWriterFileField.java | 14 ++++
.../excelwriter/ExcelWriterTransform.java | 59 ++++++++++++++++
.../excelwriter/ExcelWriterTransformDialog.java | 80 +++++++++++++++-------
.../excelwriter/messages/messages_en_US.properties | 7 ++
.../excelwriter/messages/messages_it_IT.properties | 9 ++-
6 files changed, 144 insertions(+), 28 deletions(-)
diff --git
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/excelwriter.adoc
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/excelwriter.adoc
index ebba442..5f1c76d 100644
---
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/excelwriter.adoc
+++
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/transforms/excelwriter.adoc
@@ -37,10 +37,9 @@ The .xls files use a binary format which is better suited
for simple content, wh
|Option|Description
|Stream XLSX data|Check this option when writing large XLSX files.
It uses internally a streaming API and is able to write large files without
any memory restrictions (of course not exceeding Excel's limit of 1,048,575
rows and 16,384 columns).
-Note: This option is available since version 4.4.0.
+|Create parent folder|Enable to create the parent folder
|If output file exists|Check this option when writing large XLSX files.
It uses internally a streaming API and is able to write large files without
any memory restrictions (of course not exceeding Excel's limit of 1,048,575
rows and 16,384 columns).
-Note: This option is available since version 4.4.0.
|Add filename(s) to result|Check to have the filename added to the result
filenames
|Wait for first row before creating file|Checking this option makes the
transform create the file only after it has seen a row.
If this is disabled the output file is always created, regardless of whether
rows are actually written to the file.
diff --git
a/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterFileField.java
b/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterFileField.java
index 87ff0be..d9ff813 100644
---
a/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterFileField.java
+++
b/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterFileField.java
@@ -126,6 +126,19 @@ public class ExcelWriterFileField {
injectionKeyDescription =
"ExcelWriterMeta.Injection.DateInFilename.Field")
private boolean dateInFilename;
+
+ /** Flag: create parent folder, default to true */
+ @HopMetadataProperty(injectionKeyDescription =
"ExcelWriterMeta.Injection.CreateParentFolder.Field")
+ private boolean createParentFolder;
+
+ public boolean isCreateParentFolder() {
+ return createParentFolder;
+ }
+
+ public void setCreateParentFolder(boolean createParentFolder) {
+ this.createParentFolder = createParentFolder;
+ }
+
public String getIfFileExists() {
return ifFileExists;
}
@@ -334,6 +347,7 @@ public class ExcelWriterFileField {
fileNameInField = false;
protectsheet = false;
splitEvery = 0;
+ createParentFolder = true;
sheetname = BaseMessages.getString(PKG,
"ExcelWriterMeta.Tab.Sheetname.Text");
}
}
diff --git
a/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransform.java
b/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransform.java
index db4196b..c7fd0df 100644
---
a/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransform.java
+++
b/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransform.java
@@ -21,11 +21,13 @@ import org.apache.commons.vfs2.FileObject;
import org.apache.hop.core.Const;
import org.apache.hop.core.ResultFile;
import org.apache.hop.core.exception.HopException;
+import org.apache.hop.core.exception.HopFileException;
import org.apache.hop.core.row.IRowMeta;
import org.apache.hop.core.row.IValueMeta;
import org.apache.hop.core.row.RowMeta;
import org.apache.hop.core.row.value.ValueMetaString;
import org.apache.hop.core.util.Utils;
+import org.apache.hop.core.variables.IVariables;
import org.apache.hop.core.vfs.HopVfs;
import org.apache.hop.i18n.BaseMessages;
import org.apache.hop.pipeline.Pipeline;
@@ -211,6 +213,57 @@ public class ExcelWriterTransform
data.clearStyleCache(0);
}
+ private void createParentFolder(String filename) throws Exception {
+ // Check for parent folder
+ FileObject parentfolder = null;
+ try {
+ // Get parent folder
+ parentfolder = HopVfs.getFileObject(filename).getParent();
+ if (parentfolder.exists()) {
+ if (isDetailed()) {
+ logDetailed(
+ BaseMessages.getString(
+ PKG,
+ "ExcelWriter.Log.ParentFolderExist",
+ HopVfs.getFriendlyURI(parentfolder)));
+ }
+ } else {
+ if (isDetailed()) {
+ logDetailed(
+ BaseMessages.getString(
+ PKG,
+ "ExcelWriter.Log.ParentFolderNotExist",
+ HopVfs.getFriendlyURI(parentfolder)));
+ }
+ if (meta.getFile().isCreateParentFolder()) {
+ parentfolder.createFolder();
+ if (isDetailed()) {
+ logDetailed(
+ BaseMessages.getString(
+ PKG,
+ "ExcelWriter.Log.ParentFolderCreated",
+ HopVfs.getFriendlyURI(parentfolder)));
+ }
+ } else {
+ throw new HopException(
+ BaseMessages.getString(
+ PKG,
+ "ExcelWriter.Log.ParentFolderNotExistCreateIt",
+ HopVfs.getFriendlyURI(parentfolder),
+ HopVfs.getFriendlyURI(filename)));
+ }
+ }
+ } finally {
+ if (parentfolder != null) {
+ try {
+ parentfolder.close();
+ } catch (Exception ex) {
+ // Ignore
+ }
+ }
+ }
+ }
+
private void closeOutputFile() throws HopException {
try (BufferedOutputStreamWithCloseDetection out =
new
BufferedOutputStreamWithCloseDetection(HopVfs.getOutputStream(data.file,
false))) {
@@ -628,6 +681,11 @@ public class ExcelWriterTransform
data.file = HopVfs.getFileObject(buildFilename);
+ if (!HopVfs.getFileObject(buildFilename).getParent().exists() &&
meta.getFile().isCreateParentFolder()) {
+ logDebug("Create parent directory for " + buildFilename + " because it
does not exist.");
+ createParentFolder(buildFilename);
+ }
+
if (log.isDebug()) {
logDebug(
BaseMessages.getString(PKG,
"ExcelWriterTransform.Log.OpeningFile", buildFilename));
@@ -644,6 +702,7 @@ public class ExcelWriterTransform
throw new HopException("Could not delete stale file " + buildFilename);
}
+
// adding filename to result
if (meta.isAddToResultFilenames()) {
// Add this to the result file names...
diff --git
a/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransformDialog.java
b/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransformDialog.java
index 0763e95..cfd3776 100644
---
a/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransformDialog.java
+++
b/plugins/transforms/excelwriter/src/main/java/org/apache/hop/pipeline/transforms/excelwriter/ExcelWriterTransformDialog.java
@@ -140,6 +140,8 @@ public class ExcelWriterTransformDialog extends
BaseTransformDialog implements I
private TextVar wProtectedBy;
+ protected Button wCreateParentFolder;
+
private Button wMakeActiveSheet;
private Button wForceFormulaRecalculation;
private Button wLeaveExistingStylesUnchanged;
@@ -306,15 +308,62 @@ public class ExcelWriterTransformDialog extends
BaseTransformDialog implements I
fdExtension.right = new FormAttachment(wbFilename, -margin);
wExtension.setLayoutData(fdExtension);
+ // Create Parent Folder
+ Label wlCreateParentFolder = new Label(fileGroup, SWT.RIGHT);
+ wlCreateParentFolder.setText(
+ BaseMessages.getString(PKG,
"ExcelWriterDialog.CreateParentFolder.Label"));
+ props.setLook(wlCreateParentFolder);
+ FormData fdlCreateParentFolder = new FormData();
+ fdlCreateParentFolder.left = new FormAttachment(0, 0);
+ fdlCreateParentFolder.top = new FormAttachment(wExtension, margin);
+ fdlCreateParentFolder.right = new FormAttachment(middle, -margin);
+ wlCreateParentFolder.setLayoutData(fdlCreateParentFolder);
+ wCreateParentFolder = new Button(fileGroup, SWT.CHECK);
+ wCreateParentFolder.setToolTipText(
+ BaseMessages.getString(PKG,
"ExcelWriterDialog.CreateParentFolder.Tooltip"));
+ props.setLook(wCreateParentFolder);
+ FormData fdCreateParentFolder = new FormData();
+ fdCreateParentFolder.left = new FormAttachment(middle, 0);
+ fdCreateParentFolder.top = new FormAttachment(wlCreateParentFolder, 0,
SWT.CENTER);
+ fdCreateParentFolder.right = new FormAttachment(100, 0);
+ wCreateParentFolder.setLayoutData(fdCreateParentFolder);
+ wCreateParentFolder.addSelectionListener(
+ new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ input.setChanged();
+ }
+ });
+
+ // Do not open new File at Init
+ Label wlDoNotOpenNewFileInit = new Label(fileGroup, SWT.RIGHT);
+ wlDoNotOpenNewFileInit.setText(
+ BaseMessages.getString(PKG,
"ExcelWriterDialog.DoNotOpenNewFileInit.Label"));
+ props.setLook(wlDoNotOpenNewFileInit);
+ FormData fdlDoNotOpenNewFileInit = new FormData();
+ fdlDoNotOpenNewFileInit.left = new FormAttachment(0, 0);
+ fdlDoNotOpenNewFileInit.top = new FormAttachment(wCreateParentFolder, 2 *
margin, margin);
+ fdlDoNotOpenNewFileInit.right = new FormAttachment(middle, -margin);
+ wlDoNotOpenNewFileInit.setLayoutData(fdlDoNotOpenNewFileInit);
+ wDoNotOpenNewFileInit = new Button(fileGroup, SWT.CHECK);
+ wDoNotOpenNewFileInit.setToolTipText(
+ BaseMessages.getString(PKG,
"ExcelWriterDialog.DoNotOpenNewFileInit.Tooltip"));
+ props.setLook(wDoNotOpenNewFileInit);
+ FormData fdDoNotOpenNewFileInit = new FormData();
+ fdDoNotOpenNewFileInit.left = new FormAttachment(middle, 0);
+ fdDoNotOpenNewFileInit.top = new FormAttachment(wlDoNotOpenNewFileInit, 0,
SWT.CENTER);
+ fdDoNotOpenNewFileInit.right = new FormAttachment(100, 0);
+ wDoNotOpenNewFileInit.setLayoutData(fdDoNotOpenNewFileInit);
+ wDoNotOpenNewFileInit.addSelectionListener(lsSel);
+
// FileNameInField line
- /* Additional fields */
Label wlFileNameInField = new Label(fileGroup, SWT.RIGHT);
wlFileNameInField.setText(
BaseMessages.getString(PKG,
"ExcelWriterDialog.FileNameInField.Label"));
props.setLook(wlFileNameInField);
FormData fdlFileNameInField = new FormData();
fdlFileNameInField.left = new FormAttachment(0, 0);
- fdlFileNameInField.top = new FormAttachment(wExtension, margin);
+ fdlFileNameInField.top = new FormAttachment(wDoNotOpenNewFileInit, margin);
fdlFileNameInField.right = new FormAttachment(middle, -margin);
wlFileNameInField.setLayoutData(fdlFileNameInField);
wFileNameInField = new Button(fileGroup, SWT.CHECK);
@@ -575,34 +624,13 @@ public class ExcelWriterTransformDialog extends
BaseTransformDialog implements I
fdIfFileExists.right = new FormAttachment(100, 0);
wIfFileExists.setLayoutData(fdIfFileExists);
- // Open new File at Init
- Label wlDoNotOpenNewFileInit = new Label(fileGroup, SWT.RIGHT);
- wlDoNotOpenNewFileInit.setText(
- BaseMessages.getString(PKG,
"ExcelWriterDialog.DoNotOpenNewFileInit.Label"));
- props.setLook(wlDoNotOpenNewFileInit);
- FormData fdlDoNotOpenNewFileInit = new FormData();
- fdlDoNotOpenNewFileInit.left = new FormAttachment(0, 0);
- fdlDoNotOpenNewFileInit.top = new FormAttachment(wIfFileExists, 2 *
margin, margin);
- fdlDoNotOpenNewFileInit.right = new FormAttachment(middle, -margin);
- wlDoNotOpenNewFileInit.setLayoutData(fdlDoNotOpenNewFileInit);
- wDoNotOpenNewFileInit = new Button(fileGroup, SWT.CHECK);
- wDoNotOpenNewFileInit.setToolTipText(
- BaseMessages.getString(PKG,
"ExcelWriterDialog.DoNotOpenNewFileInit.Tooltip"));
- props.setLook(wDoNotOpenNewFileInit);
- FormData fdDoNotOpenNewFileInit = new FormData();
- fdDoNotOpenNewFileInit.left = new FormAttachment(middle, 0);
- fdDoNotOpenNewFileInit.top = new FormAttachment(wlDoNotOpenNewFileInit, 0,
SWT.CENTER);
- fdDoNotOpenNewFileInit.right = new FormAttachment(100, 0);
- wDoNotOpenNewFileInit.setLayoutData(fdDoNotOpenNewFileInit);
- wDoNotOpenNewFileInit.addSelectionListener(lsSel);
-
// Add File to the result files name
Label wlAddToResult = new Label(fileGroup, SWT.RIGHT);
wlAddToResult.setText(BaseMessages.getString(PKG,
"ExcelWriterDialog.AddFileToResult.Label"));
props.setLook(wlAddToResult);
FormData fdlAddToResult = new FormData();
fdlAddToResult.left = new FormAttachment(0, 0);
- fdlAddToResult.top = new FormAttachment(wDoNotOpenNewFileInit, 2 * margin,
margin);
+ fdlAddToResult.top = new FormAttachment(wIfFileExists, 2 * margin, margin);
fdlAddToResult.right = new FormAttachment(middle, -margin);
wlAddToResult.setLayoutData(fdlAddToResult);
wAddToResult = new Button(fileGroup, SWT.CHECK);
@@ -1661,8 +1689,9 @@ public class ExcelWriterTransformDialog extends
BaseTransformDialog implements I
if (file.getDateTimeFormat() != null) {
wDateTimeFormat.setText(file.getDateTimeFormat());
}
- wSpecifyFormat.setSelection(file.isSpecifyFormat());
+ wSpecifyFormat.setSelection(file.isSpecifyFormat());
+ wCreateParentFolder.setSelection(file.isCreateParentFolder());
wAddToResult.setSelection(input.isAddToResultFilenames());
wAutoSize.setSelection(file.isAutosizecolums());
wIfFileExists.select(
@@ -1785,6 +1814,7 @@ public class ExcelWriterTransformDialog extends
BaseTransformDialog implements I
ExcelWriterTemplateField template = tfoi.getTemplate();
file.setFileName(wFilename.getText());
+ file.setCreateParentFolder(wCreateParentFolder.getSelection());
file.setStreamingData(wStreamData.getSelection());
file.setDoNotOpenNewFileInit(wDoNotOpenNewFileInit.getSelection());
file.setFileNameInField(wFileNameInField.getSelection());
diff --git
a/plugins/transforms/excelwriter/src/main/resources/org/apache/hop/pipeline/transforms/excelwriter/messages/messages_en_US.properties
b/plugins/transforms/excelwriter/src/main/resources/org/apache/hop/pipeline/transforms/excelwriter/messages/messages_en_US.properties
index 3b91d97..5227aab 100644
---
a/plugins/transforms/excelwriter/src/main/resources/org/apache/hop/pipeline/transforms/excelwriter/messages/messages_en_US.properties
+++
b/plugins/transforms/excelwriter/src/main/resources/org/apache/hop/pipeline/transforms/excelwriter/messages/messages_en_US.properties
@@ -112,6 +112,9 @@ ExcelWriterDialog.StartingCell.Tooltip=Enter cell reference
to start writing at,
ExcelWriterDialog.ContentTab.TabTitle=Content
ExcelWriterDialog.IfSheetExists.Tooltip=If the sheet exists in the file you
may choose to delete it and replace it with a fresh sheet or reuse the existing
sheet for writing.
ExcelWriterDialog.Encoding.Label=Encoding
+ExcelWriterDialog.CreateParentFolder.Label=Create parent folder
+ExcelWriterMeta.Injection.CreateParentFolder.Field=Create parent folder (Y/N)
+ExcelWriterDialog.CreateParentFolder.Tooltip=Check this if you want to create
parent folder\n when necessary. Otherwise, Apache Hop will throw an exception
when parent folder doesn''t exist.
ExcelWriterDialog.Extension.Tooltip=This is the file extension of the Excel
file. It also implies the file format.
ExcelWriterDialog.RowWritingMethod.PushDown.Label=shift existing cells down
ExcelWriterDialog.Enclosure.Label=Enclosure
@@ -201,4 +204,8 @@ ExcelWriterMeta.Injection.Output.StyleCell.Field=Style from
cell
ExcelWriterMeta.Injection.FilenameInField.Field=Filename in field (Y/N)?
ExcelWriterMeta.Injection.FilenameField.Field=Filename field
ExcelWriterTransformMeta.keyword=excel,writer,transform
+ExcelWriter.Log.ParentFolderNotExistCreateIt=We can not find folder [{0}]! You
need to create it before generating file [{1}].
+ExcelWriter.Log.ParentFolderExist=Parent folder exists [{0}]!
+ExcelWriter.Log.ParentFolderNotExist=We can not find parent folder [{0}]!
+ExcelWriter.Log.ParentFolderCreated=Folder [{0}] was created.
diff --git
a/plugins/transforms/excelwriter/src/main/resources/org/apache/hop/pipeline/transforms/excelwriter/messages/messages_it_IT.properties
b/plugins/transforms/excelwriter/src/main/resources/org/apache/hop/pipeline/transforms/excelwriter/messages/messages_it_IT.properties
index 8ba720f..f1c3775 100644
---
a/plugins/transforms/excelwriter/src/main/resources/org/apache/hop/pipeline/transforms/excelwriter/messages/messages_it_IT.properties
+++
b/plugins/transforms/excelwriter/src/main/resources/org/apache/hop/pipeline/transforms/excelwriter/messages/messages_it_IT.properties
@@ -70,7 +70,7 @@ ExcelWriterDialog.MakeActiveSheet.Label=Rendi il foglio attivo
ExcelWriterTransformMeta.CheckResult.FilenameFieldNotFound=Il campo ''{0}''
non \u00E8 stato trovato nello stream di input.
ExcelWriterDialog.IfSheetExists.Reuse.Label=scrivi nel foglio esistente
ExcelWriterDialog.StartingCell.Label=Inizia a scrivere nella cella
-ExcelWriterDialog.DoNotOpenNewFileInit.Label=Attendi la prima riga prima di
creare il file
+ExcelWriterDialog.DoNotOpenNewFileInit.Label=Non creare il file all''avvio
ExcelWriterDialog.AppendLines.Tooltip=Se selezionato,l''output comincia dopo
l''ultima riga definita nel foglio excel esistente.
ExcelWriterDialog.OmitHeader.Tooltip=Si pu\u00F2 scegliere di non scrivere
l''intestazione nel caso di scrittura su file esistente. Questo \u00E8 utile
per generare nuovi file con intestazione, ma senza ripetere l''intestazione
nelle successive esecuzioni, quando si accoda lo stesso file.
ExcelWriterDialog.DialogTitle=Microsoft Excel writer
@@ -174,5 +174,12 @@
ExcelWriterMeta.Injection.Output.TitleStyleCell.Field=Eredita lo stile di header
ExcelWriterMeta.Injection.Output.StyleCell.Field=Eredita lo stile dalla cella
ExcelWriterMeta.Injection.FilenameInField.Field=Nome file in un campo (Y/N)?
ExcelWriterMeta.Injection.FilenameField.Field=Campo con nome file
+ExcelWriterDialog.CreateParentFolder.Label=Crea cartella padre
+ExcelWriterMeta.Injection.CreateParentFolder.Field=Crea cartella padre (Y/N)?
+ExcelWriterDialog.CreateParentFolder.Tooltip=Selezionare qua per creare la
cartella padre quando necessario.\nAltrimenti Apache Hop lancer\u00E0
un''eccezione quando non esiste la cartella padre.
+ExcelWriter.Log.ParentFolderNotExistCreateIt=We can not find folder [{0}]! You
need to create it before generating file [{1}].
+ExcelWriter.Log.ParentFolderExist=Parent folder exists [{0}]!
+ExcelWriter.Log.ParentFolderNotExist=We can not find parent folder [{0}]!
+ExcelWriter.Log.ParentFolderCreated=Folder [{0}] was created.