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.
 
 

Reply via email to