This is an automated email from the ASF dual-hosted git repository.
turcsanyi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 92ccb79670 NIFI-11117 Remove folder creation from PutGoogleDrive
92ccb79670 is described below
commit 92ccb79670fd5990d915cb3d5c7b7eb0bb182b52
Author: krisztina-zsihovszki <[email protected]>
AuthorDate: Tue Jan 31 17:38:19 2023 +0100
NIFI-11117 Remove folder creation from PutGoogleDrive
This closes #6910.
Signed-off-by: Peter Turcsanyi <[email protected]>
---
.../nifi-gcp-bundle/nifi-gcp-processors/pom.xml | 5 +
.../processors/gcp/drive/FetchGoogleDrive.java | 4 +-
.../nifi/processors/gcp/drive/PutGoogleDrive.java | 123 ++++-----------------
.../processors/gcp/drive/FetchGoogleDriveIT.java | 11 --
.../processors/gcp/drive/ListGoogleDriveIT.java | 15 +--
.../gcp/drive/ListGoogleDriveSimpleTest.java | 1 -
.../gcp/drive/ListGoogleDriveTestRunnerTest.java | 14 ---
.../processors/gcp/drive/PutGoogleDriveIT.java | 68 +-----------
.../processors/gcp/drive/PutGoogleDriveTest.java | 59 +++-------
9 files changed, 48 insertions(+), 252 deletions(-)
diff --git a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/pom.xml
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/pom.xml
index 2063da4b54..0517d7023f 100644
--- a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/pom.xml
@@ -65,6 +65,11 @@
<version>1.20.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.nifi</groupId>
+ <artifactId>nifi-conflict-resolution</artifactId>
+ <version>1.20.0-SNAPSHOT</version>
+ </dependency>
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-mock</artifactId>
diff --git
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/drive/FetchGoogleDrive.java
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/drive/FetchGoogleDrive.java
index c958cd4489..40ae075de1 100644
---
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/drive/FetchGoogleDrive.java
+++
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/drive/FetchGoogleDrive.java
@@ -183,7 +183,7 @@ public class FetchGoogleDrive extends AbstractProcessor
implements GoogleDriveTr
}
private void handleErrorResponse(ProcessSession session, String fileId,
FlowFile flowFile, GoogleJsonResponseException e) {
- getLogger().error("Couldn't fetch file with id '{}'", fileId, e);
+ getLogger().error("Fetching File [{}] failed", fileId, e);
flowFile = session.putAttribute(flowFile, ERROR_CODE, "" +
e.getStatusCode());
flowFile = session.putAttribute(flowFile, ERROR_MESSAGE,
e.getMessage());
@@ -193,7 +193,7 @@ public class FetchGoogleDrive extends AbstractProcessor
implements GoogleDriveTr
}
private void handleUnexpectedError(ProcessSession session, FlowFile
flowFile, String fileId, Exception e) {
- getLogger().error("Unexpected error while fetching and processing file
with id '{}'", fileId, e);
+ getLogger().error("Fetching File [{}] failed", fileId, e);
flowFile = session.putAttribute(flowFile, ERROR_MESSAGE,
e.getMessage());
diff --git
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/drive/PutGoogleDrive.java
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/drive/PutGoogleDrive.java
index 0276c3a0eb..751a6397fb 100644
---
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/drive/PutGoogleDrive.java
+++
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/drive/PutGoogleDrive.java
@@ -23,7 +23,8 @@ import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.joining;
import static
org.apache.nifi.processor.util.StandardValidators.DATA_SIZE_VALIDATOR;
-import static
org.apache.nifi.processor.util.StandardValidators.createRegexMatchingValidator;
+import static
org.apache.nifi.processors.conflict.resolution.ConflictResolutionStrategy.FAIL;
+import static
org.apache.nifi.processors.conflict.resolution.ConflictResolutionStrategy.IGNORE;
import static
org.apache.nifi.processors.gcp.drive.GoogleDriveAttributes.ERROR_CODE;
import static
org.apache.nifi.processors.gcp.drive.GoogleDriveAttributes.ERROR_CODE_DESC;
import static
org.apache.nifi.processors.gcp.drive.GoogleDriveAttributes.ERROR_MESSAGE;
@@ -66,7 +67,6 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
-import java.util.regex.Pattern;
import org.apache.nifi.annotation.behavior.InputRequirement;
import org.apache.nifi.annotation.behavior.InputRequirement.Requirement;
import org.apache.nifi.annotation.behavior.ReadsAttribute;
@@ -90,6 +90,7 @@ import org.apache.nifi.processor.ProcessSession;
import org.apache.nifi.processor.Relationship;
import org.apache.nifi.processor.exception.ProcessException;
import org.apache.nifi.processor.util.StandardValidators;
+import
org.apache.nifi.processors.conflict.resolution.ConflictResolutionStrategy;
import org.apache.nifi.processors.gcp.ProxyAwareTransportFactory;
import org.apache.nifi.proxy.ProxyConfiguration;
import org.json.JSONObject;
@@ -108,34 +109,19 @@ import org.json.JSONObject;
@WritesAttribute(attribute = ERROR_CODE, description =
ERROR_CODE_DESC),
@WritesAttribute(attribute = ERROR_MESSAGE, description =
ERROR_MESSAGE_DESC)})
public class PutGoogleDrive extends AbstractProcessor implements
GoogleDriveTrait {
-
- public static final String IGNORE_RESOLUTION = "ignore";
- public static final String REPLACE_RESOLUTION = "replace";
- public static final String FAIL_RESOLUTION = "fail";
public static final int MIN_ALLOWED_CHUNK_SIZE_IN_BYTES =
MediaHttpUploader.MINIMUM_CHUNK_SIZE;
public static final int MAX_ALLOWED_CHUNK_SIZE_IN_BYTES = 1024 * 1024 *
1024;
public static final PropertyDescriptor FOLDER_ID = new
PropertyDescriptor.Builder()
.name("folder-id")
.displayName("Folder ID")
- .description("The ID of the shared folder. " +
+ .description("The ID of the shared folder." +
" Please see Additional Details to set up access to Google
Drive and obtain Folder ID.")
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.required(true)
.build();
- public static final PropertyDescriptor SUBFOLDER_NAME = new
PropertyDescriptor.Builder()
- .name("subfolder-name")
- .displayName("Subfolder Name")
- .description("The name (path) of the subfolder where files are
uploaded. The subfolder name is relative to the shared folder specified by
'Folder ID'."
- + " Example: subFolder, subFolder1/subfolder2")
-
.addValidator(createRegexMatchingValidator(Pattern.compile("^(?!/).+(?<!/)$"),
false,
- "Subfolder Name should not contain leading or trailing
slash ('/') character."))
-
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .required(false)
- .build();
-
public static final PropertyDescriptor FILE_NAME = new
PropertyDescriptor.Builder()
.name("file-name")
.displayName("Filename")
@@ -146,26 +132,13 @@ public class PutGoogleDrive extends AbstractProcessor
implements GoogleDriveTrai
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
.build();
- public static final PropertyDescriptor CREATE_SUBFOLDER = new
PropertyDescriptor.Builder()
- .name("create-subfolder")
- .displayName("Create Subfolder")
- .expressionLanguageSupported(ExpressionLanguageScope.NONE)
- .required(true)
- .addValidator(StandardValidators.BOOLEAN_VALIDATOR)
- .allowableValues("true", "false")
- .defaultValue("false")
- .dependsOn(SUBFOLDER_NAME)
- .description("Specifies whether to automatically create the
subfolder specified by 'Folder Name' if it does not exist. " +
- "Permission to list folders is required. ")
- .build();
-
public static final PropertyDescriptor CONFLICT_RESOLUTION = new
PropertyDescriptor.Builder()
.name("conflict-resolution-strategy")
.displayName("Conflict Resolution Strategy")
.description("Indicates what should happen when a file with the
same name already exists in the specified Google Drive folder.")
.required(true)
- .defaultValue(FAIL_RESOLUTION)
- .allowableValues(FAIL_RESOLUTION, IGNORE_RESOLUTION,
REPLACE_RESOLUTION)
+ .defaultValue(FAIL.getValue())
+ .allowableValues(ConflictResolutionStrategy.class)
.build();
public static final PropertyDescriptor CHUNKED_UPLOAD_SIZE = new
PropertyDescriptor.Builder()
@@ -190,8 +163,6 @@ public class PutGoogleDrive extends AbstractProcessor
implements GoogleDriveTrai
public static final List<PropertyDescriptor> PROPERTIES =
Collections.unmodifiableList(asList(
GCP_CREDENTIALS_PROVIDER_SERVICE,
FOLDER_ID,
- SUBFOLDER_NAME,
- CREATE_SUBFOLDER,
FILE_NAME,
CONFLICT_RESOLUTION,
CHUNKED_UPLOAD_THRESHOLD,
@@ -260,15 +231,11 @@ public class PutGoogleDrive extends AbstractProcessor
implements GoogleDriveTrai
return;
}
- String folderId =
context.getProperty(FOLDER_ID).evaluateAttributeExpressions(flowFile).getValue();
- final String subfolderName =
context.getProperty(SUBFOLDER_NAME).evaluateAttributeExpressions(flowFile).getValue();
- final boolean createFolder =
context.getProperty(CREATE_SUBFOLDER).asBoolean();
+ final String folderId =
context.getProperty(FOLDER_ID).evaluateAttributeExpressions(flowFile).getValue();
final String filename =
context.getProperty(FILE_NAME).evaluateAttributeExpressions(flowFile).getValue();
final String mimeType =
flowFile.getAttribute(CoreAttributes.MIME_TYPE.key());
try {
- folderId = subfolderName != null ?
getOrCreateParentSubfolder(subfolderName, folderId, createFolder).getId() :
folderId;
-
final long startNanos = System.nanoTime();
final long size = flowFile.getSize();
@@ -280,20 +247,19 @@ public class PutGoogleDrive extends AbstractProcessor
implements GoogleDriveTrai
.asDataSize(DataUnit.B)
.intValue();
- final String conflictResolution =
context.getProperty(CONFLICT_RESOLUTION).getValue();
-
+ final ConflictResolutionStrategy conflictResolution =
ConflictResolutionStrategy.forValue(context.getProperty(CONFLICT_RESOLUTION).getValue());
final Optional<File> alreadyExistingFile =
checkFileExistence(filename, folderId);
- final File fileMetadata = alreadyExistingFile.isPresent() ?
alreadyExistingFile.get() : createMetadata(filename, folderId);
+ final File fileMetadata = alreadyExistingFile.orElseGet(() ->
createMetadata(filename, folderId));
- if (alreadyExistingFile.isPresent() &&
FAIL_RESOLUTION.equals(conflictResolution)) {
- getLogger().error("File '{}' already exists in {} folder,
conflict resolution is '{}'", filename, getFolderName(subfolderName),
FAIL_RESOLUTION);
+ if (alreadyExistingFile.isPresent() && conflictResolution == FAIL)
{
+ getLogger().error("File [{}] already exists in [{}] Folder,
conflict resolution is [{}]", filename, folderId, FAIL.getDisplayName());
flowFile = addAttributes(alreadyExistingFile.get(), flowFile,
session);
session.transfer(flowFile, REL_FAILURE);
return;
}
- if (alreadyExistingFile.isPresent() &&
IGNORE_RESOLUTION.equals(conflictResolution)) {
- getLogger().info("File '{}' already exists in {} folder,
conflict resolution is '{}'", filename, getFolderName(subfolderName),
IGNORE_RESOLUTION);
+ if (alreadyExistingFile.isPresent() && conflictResolution ==
IGNORE) {
+ getLogger().info("File [{}] already exists in [{}] Folder,
conflict resolution is [{}]", filename, folderId, IGNORE.getDisplayName());
flowFile = addAttributes(alreadyExistingFile.get(), flowFile,
session);
session.transfer(flowFile, REL_SUCCESS);
return;
@@ -323,12 +289,12 @@ public class PutGoogleDrive extends AbstractProcessor
implements GoogleDriveTrai
}
session.transfer(flowFile, REL_SUCCESS);
} catch (GoogleJsonResponseException e) {
- getLogger().error("Exception occurred while uploading file '{}' to
{} Google Drive folder", filename,
- getFolderName(subfolderName), e);
+ getLogger().error("Exception occurred while uploading File [{}] to
[{}] Google Drive Folder", filename,
+ folderId, e);
handleExpectedError(session, flowFile, e);
} catch (Exception e) {
- getLogger().error("Exception occurred while uploading file '{}' to
{} Google Drive folder", filename,
- getFolderName(subfolderName), e);
+ getLogger().error("Exception occurred while uploading File [{}] to
[{}] Google Drive Folder", filename,
+ folderId, e);
if (e.getCause() != null && e.getCause() instanceof
GoogleJsonResponseException) {
handleExpectedError(session, flowFile,
(GoogleJsonResponseException) e.getCause());
@@ -354,10 +320,6 @@ public class PutGoogleDrive extends AbstractProcessor
implements GoogleDriveTrai
return session.putAllAttributes(flowFile, attributes);
}
- private String getFolderName(String subFolderName) {
- return subFolderName == null ? "shared" : format("'%s'",
subFolderName);
- }
-
private DriveRequest<File> createDriveRequest(File fileMetadata, final
InputStreamContent mediaContent) throws IOException {
if (fileMetadata.getId() == null) {
return driveService.files()
@@ -384,7 +346,8 @@ public class PutGoogleDrive extends AbstractProcessor
implements GoogleDriveTrai
fileMetadata.setSize(mediaContent.getLength());
return fileMetadata;
} else {
- throw new ProcessException(format("Upload of file '%s' to folder
'%s' failed, HTTP error code: %d", fileMetadata.getName(),
fileMetadata.getId(), response.getStatusCode()));
+ throw new ProcessException(format("Upload of File [%s] to Folder
[%s] failed, HTTP error code: [%d]",
+ fileMetadata.getName(), fileMetadata.getId(),
response.getStatusCode()));
}
}
@@ -395,44 +358,6 @@ public class PutGoogleDrive extends AbstractProcessor
implements GoogleDriveTrai
return new JSONObject(contentAsString).getString("id");
}
- private File getOrCreateParentSubfolder(String folderName, String
parentFolderId, boolean createFolder) throws IOException {
- final int indexOfPathSeparator = folderName.indexOf("/");
-
- if (isMultiLevelFolder(indexOfPathSeparator, folderName)) {
- final String mainFolderName = folderName.substring(0,
indexOfPathSeparator);
- final String subFolders =
folderName.substring(indexOfPathSeparator + 1);
- final File mainFolder = getOrCreateFolder(mainFolderName,
parentFolderId, createFolder);
- return getOrCreateParentSubfolder(subFolders, mainFolder.getId(),
createFolder);
- } else {
- return getOrCreateFolder(folderName, parentFolderId, createFolder);
- }
- }
-
- private boolean isMultiLevelFolder(int indexOfPathSeparator, String
folderName) {
- return indexOfPathSeparator > 0 && indexOfPathSeparator <
folderName.length() - 1;
- }
-
- private File getOrCreateFolder(String folderName, String parentFolderId,
boolean createFolder) throws IOException {
- final Optional<File> existingFolder = checkFolderExistence(folderName,
parentFolderId);
-
- if (existingFolder.isPresent()) {
- return existingFolder.get();
- }
-
- if (createFolder) {
- getLogger().debug("Create folder " + folderName + " parent id: " +
parentFolderId);
- final File folderMetadata = createMetadata(folderName,
parentFolderId);
- folderMetadata.setMimeType(DRIVE_FOLDER_MIME_TYPE);
-
- return driveService.files()
- .create(folderMetadata)
- .setFields("id, parents")
- .execute();
- } else {
- throw new ProcessException(format("The specified subfolder '%s'
does not exist and '%s' is false.", folderName,
CREATE_SUBFOLDER.getDisplayName()));
- }
- }
-
private File createMetadata(final String name, final String parentId) {
final File metadata = new File();
metadata.setName(name);
@@ -440,18 +365,10 @@ public class PutGoogleDrive extends AbstractProcessor
implements GoogleDriveTrai
return metadata;
}
- private Optional<File> checkFolderExistence(String folderName, String
parentId) throws IOException {
- return checkObjectExistence(format("mimeType='%s' and name='%s' and
('%s' in parents)", DRIVE_FOLDER_MIME_TYPE, folderName, parentId));
- }
-
private Optional<File> checkFileExistence(String fileName, String
parentId) throws IOException {
- return checkObjectExistence(format("name='%s' and ('%s' in parents)",
fileName, parentId));
- }
-
- private Optional<File> checkObjectExistence(String query) throws
IOException {
final FileList result = driveService.files()
.list()
- .setQ(query)
+ .setQ(format("name='%s' and ('%s' in parents)", fileName,
parentId))
.setFields("files(name, id)")
.execute();
diff --git
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/FetchGoogleDriveIT.java
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/FetchGoogleDriveIT.java
index 8b10406fc7..9220b4d02e 100644
---
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/FetchGoogleDriveIT.java
+++
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/FetchGoogleDriveIT.java
@@ -42,7 +42,6 @@ public class FetchGoogleDriveIT extends
AbstractGoogleDriveIT<FetchGoogleDrive>
@Test
void testFetch() throws Exception {
- // GIVEN
File file = createFileWithDefaultContent("test_file.txt",
mainFolderId);
Map<String, String> inputFlowFileAttributes = new HashMap<>();
@@ -54,11 +53,9 @@ public class FetchGoogleDriveIT extends
AbstractGoogleDriveIT<FetchGoogleDrive>
HashSet<Map<String, String>> expectedAttributes = new
HashSet<>(singletonList(inputFlowFileAttributes));
List<String> expectedContent = singletonList(DEFAULT_FILE_CONTENT);
- // WHEN
testRunner.enqueue("unimportant_data", inputFlowFileAttributes);
testRunner.run();
- // THEN
testRunner.assertTransferCount(FetchGoogleDrive.REL_FAILURE, 0);
checkAttributes(FetchGoogleDrive.REL_SUCCESS, expectedAttributes);
@@ -67,7 +64,6 @@ public class FetchGoogleDriveIT extends
AbstractGoogleDriveIT<FetchGoogleDrive>
@Test
void testInputFlowFileReferencesMissingFile() {
- // GIVEN
Map<String, String> inputFlowFileAttributes = new HashMap<>();
inputFlowFileAttributes.put(GoogleDriveAttributes.ID, "missing");
inputFlowFileAttributes.put(GoogleDriveAttributes.FILENAME,
"missing_filename");
@@ -80,24 +76,20 @@ public class FetchGoogleDriveIT extends
AbstractGoogleDriveIT<FetchGoogleDrive>
}}
));
- // WHEN
testRunner.enqueue("unimportant_data", inputFlowFileAttributes);
testRunner.run();
- // THEN
testRunner.assertTransferCount(FetchGoogleDrive.REL_SUCCESS, 0);
checkAttributes(FetchGoogleDrive.REL_FAILURE,
expectedFailureAttributes);
}
@Test
void testInputFlowFileThrowsExceptionBeforeFetching() throws Exception {
- // GIVEN
File file = createFileWithDefaultContent("test_file.txt",
mainFolderId);
Map<String, String> inputFlowFileAttributes = new HashMap<>();
inputFlowFileAttributes.put(GoogleDriveAttributes.ID, file.getId());
inputFlowFileAttributes.put(GoogleDriveAttributes.FILENAME,
file.getName());
-
MockFlowFile input = new MockFlowFile(1) {
final AtomicBoolean throwException = new AtomicBoolean(true);
@@ -111,7 +103,6 @@ public class FetchGoogleDriveIT extends
AbstractGoogleDriveIT<FetchGoogleDrive>
return super.isPenalized();
}
}
-
@Override
public Map<String, String> getAttributes() {
return inputFlowFileAttributes;
@@ -122,11 +113,9 @@ public class FetchGoogleDriveIT extends
AbstractGoogleDriveIT<FetchGoogleDrive>
inputFlowFileAttributes
));
- // WHEN
testRunner.enqueue(input);
testRunner.run();
- // THEN
testRunner.assertTransferCount(FetchGoogleDrive.REL_SUCCESS, 0);
checkAttributes(FetchGoogleDrive.REL_FAILURE,
expectedFailureAttributes);
diff --git
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveIT.java
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveIT.java
index f352539064..ed7fab0a08 100644
---
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveIT.java
+++
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveIT.java
@@ -49,7 +49,6 @@ public class ListGoogleDriveIT extends
AbstractGoogleDriveIT<ListGoogleDrive> {
@Test
void listFilesFrom3LayerDeepDirectoryTree() throws Exception {
- // GIVEN
File main_sub1 = createFolder("main_sub1", mainFolderId);
File main_sub2 = createFolder("main_sub2", mainFolderId);
@@ -78,10 +77,8 @@ public class ListGoogleDriveIT extends
AbstractGoogleDriveIT<ListGoogleDrive> {
// The creation of the files are not (completely) synchronized.
Thread.sleep(2000);
- // WHEN
testRunner.run();
- // THEN
List<MockFlowFile> successFlowFiles =
testRunner.getFlowFilesForRelationship(ListGoogleDrive.REL_SUCCESS);
Set<String> actualFileNames = successFlowFiles.stream()
@@ -93,19 +90,17 @@ public class ListGoogleDriveIT extends
AbstractGoogleDriveIT<ListGoogleDrive> {
// Next, list a sub folder, non-recursively this time. (Changing these
properties will clear the Processor state as well
// so all files are eligible for listing again.)
- // GIVEN
+
testRunner.clearTransferState();
expectedFileNames = new HashSet<>(Arrays.asList(
"main_sub1_file1"
));
- // WHEN
testRunner.setProperty(ListGoogleDrive.FOLDER_ID, main_sub1.getId());
testRunner.setProperty(ListGoogleDrive.RECURSIVE_SEARCH, "false");
testRunner.run();
- // THEN
successFlowFiles =
testRunner.getFlowFilesForRelationship(ListGoogleDrive.REL_SUCCESS);
actualFileNames = successFlowFiles.stream()
@@ -117,7 +112,6 @@ public class ListGoogleDriveIT extends
AbstractGoogleDriveIT<ListGoogleDrive> {
@Test
void doNotListTooYoungFilesWhenMinAgeIsSet() throws Exception {
- // GIVEN
testRunner.setProperty(ListGoogleDrive.MIN_AGE, "15 s");
createFileWithDefaultContent("main_file", mainFolderId);
@@ -125,10 +119,8 @@ public class ListGoogleDriveIT extends
AbstractGoogleDriveIT<ListGoogleDrive> {
// Make sure the file 'arrives' and could be listed
Thread.sleep(5000);
- // WHEN
testRunner.run();
- // THEN
List<MockFlowFile> successFlowFiles =
testRunner.getFlowFilesForRelationship(ListGoogleDrive.REL_SUCCESS);
Set<String> actualFileNames = successFlowFiles.stream()
@@ -139,17 +131,15 @@ public class ListGoogleDriveIT extends
AbstractGoogleDriveIT<ListGoogleDrive> {
// Next, wait for another 10+ seconds for MIN_AGE to expire then list
again
- // GIVEN
+
Thread.sleep(10000);
Set<String> expectedFileNames = new HashSet<>(Arrays.asList(
"main_file"
));
- // WHEN
testRunner.run();
- // THEN
successFlowFiles =
testRunner.getFlowFilesForRelationship(ListGoogleDrive.REL_SUCCESS);
actualFileNames = successFlowFiles.stream()
@@ -158,5 +148,4 @@ public class ListGoogleDriveIT extends
AbstractGoogleDriveIT<ListGoogleDrive> {
assertEquals(expectedFileNames, actualFileNames);
}
-
}
diff --git
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveSimpleTest.java
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveSimpleTest.java
index e29fc62a57..47394a2588 100644
---
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveSimpleTest.java
+++
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveSimpleTest.java
@@ -38,7 +38,6 @@ import static org.mockito.Mockito.when;
public class ListGoogleDriveSimpleTest {
private ListGoogleDrive testSubject;
-
private ProcessContext mockProcessContext;
private Drive mockDriverService;
diff --git
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveTestRunnerTest.java
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveTestRunnerTest.java
index af3d324005..da628c2515 100644
---
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveTestRunnerTest.java
+++
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/ListGoogleDriveTestRunnerTest.java
@@ -84,7 +84,6 @@ public class ListGoogleDriveTestRunnerTest implements
OutputChecker {
@Test
void testOutputAsAttributesWhereTimestampIsCreatedTime() throws Exception {
- // GIVEN
String id = "id_1";
String filename = "file_name_1";
Long size = 125L;
@@ -92,14 +91,10 @@ public class ListGoogleDriveTestRunnerTest implements
OutputChecker {
Long modifiedTime = null;
String mimeType = "mime_type_1";
- // WHEN
- // THEN
testOutputAsAttributes(id, filename, size, createdTime, modifiedTime,
mimeType, createdTime);
}
-
@Test
void testOutputAsAttributesWhereTimestampIsModifiedTime() throws Exception
{
- // GIVEN
String id = "id_1";
String filename = "file_name_1";
Long size = 125L;
@@ -107,14 +102,11 @@ public class ListGoogleDriveTestRunnerTest implements
OutputChecker {
Long modifiedTime = 123456L + 1L;
String mimeType = "mime_type_1";
- // WHEN
- // THEN
testOutputAsAttributes(id, filename, size, createdTime, modifiedTime,
mimeType, modifiedTime);
}
@Test
void testOutputAsContent() throws Exception {
- // GIVEN
String id = "id_1";
String filename = "file_name_1";
Long size = 125L;
@@ -137,10 +129,7 @@ public class ListGoogleDriveTestRunnerTest implements
OutputChecker {
"}" +
"]");
- // WHEN
testRunner.run();
-
- // THEN
checkContent(ListGoogleDrive.REL_SUCCESS, expectedContents);
}
@@ -172,7 +161,6 @@ public class ListGoogleDriveTestRunnerTest implements
OutputChecker {
}
private void testOutputAsAttributes(String id, String filename, Long size,
Long createdTime, Long modifiedTime, String mimeType, Long expectedTimestamp)
throws IOException {
- // GIVEN
mockFetchedGoogleDriveFileList(id, filename, size, createdTime,
modifiedTime, mimeType);
Map<String, String> inputFlowFileAttributes = new HashMap<>();
@@ -184,10 +172,8 @@ public class ListGoogleDriveTestRunnerTest implements
OutputChecker {
HashSet<Map<String, String>> expectedAttributes = new
HashSet<>(asList(inputFlowFileAttributes));
- // WHEN
testRunner.run();
- // THEN
checkAttributes(ListGoogleDrive.REL_SUCCESS, expectedAttributes);
}
diff --git
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/PutGoogleDriveIT.java
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/PutGoogleDriveIT.java
index 98ac347992..5ee3dd550f 100644
---
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/PutGoogleDriveIT.java
+++
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/PutGoogleDriveIT.java
@@ -16,12 +16,11 @@
*/
package org.apache.nifi.processors.gcp.drive;
-import static
org.apache.nifi.processors.gcp.drive.PutGoogleDrive.CREATE_SUBFOLDER;
+import static
org.apache.nifi.processors.conflict.resolution.ConflictResolutionStrategy.IGNORE;
+import static
org.apache.nifi.processors.conflict.resolution.ConflictResolutionStrategy.REPLACE;
import static org.apache.nifi.processors.gcp.drive.PutGoogleDrive.FILE_NAME;
import static org.apache.nifi.processors.gcp.drive.PutGoogleDrive.FOLDER_ID;
-import static
org.apache.nifi.processors.gcp.drive.PutGoogleDrive.SUBFOLDER_NAME;
-import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -59,68 +58,11 @@ public class PutGoogleDriveIT extends
AbstractGoogleDriveIT<PutGoogleDrive> impl
// THEN
testRunner.assertTransferCount(PutGoogleDrive.REL_SUCCESS, 1);
testRunner.assertTransferCount(PutGoogleDrive.REL_FAILURE, 0);
- }
-
- @Test
- void testUploadFileFolderByName() {
- // GIVEN
- testRunner.setProperty(SUBFOLDER_NAME, "testFolderNew");
- testRunner.setProperty(FOLDER_ID, mainFolderId);
- testRunner.setProperty(FILE_NAME, TEST_FILENAME);
- testRunner.setProperty(CREATE_SUBFOLDER, "true");
-
- // WHEN
- runWithFileContent();
-
- // THEN
- testRunner.assertTransferCount(PutGoogleDrive.REL_SUCCESS, 1);
- testRunner.assertTransferCount(PutGoogleDrive.REL_FAILURE, 0);
- final List<MockFlowFile> flowFiles =
testRunner.getFlowFilesForRelationship(PutGoogleDrive.REL_SUCCESS);
- final MockFlowFile ff0 = flowFiles.get(0);
- assertFlowFileAttributes(ff0);
- }
-
- @Test
- void testUploadFileCreateMultiLevelFolder() throws IOException {
- createFolder("existingFolder", mainFolderId);
-
- // GIVEN
- testRunner.setProperty(SUBFOLDER_NAME, "existingFolder/new1/new2");
- testRunner.setProperty(FOLDER_ID, mainFolderId);
- testRunner.setProperty(FILE_NAME, TEST_FILENAME);
- testRunner.setProperty(CREATE_SUBFOLDER, "true");
-
- // WHEN
- runWithFileContent();
-
- // THEN
- testRunner.assertTransferCount(PutGoogleDrive.REL_SUCCESS, 1);
- testRunner.assertTransferCount(PutGoogleDrive.REL_FAILURE, 0);
-
final List<MockFlowFile> flowFiles =
testRunner.getFlowFilesForRelationship(PutGoogleDrive.REL_SUCCESS);
final MockFlowFile ff0 = flowFiles.get(0);
assertFlowFileAttributes(ff0);
}
- @Test
- void testSpecifiedFolderIdDoesNotExist() {
- // GIVEN
- testRunner.setProperty(FOLDER_ID, "nonExistentId");
- testRunner.setProperty(FILE_NAME, "testFile4");
-
- // WHEN
- runWithFileContent();
-
- // THEN
- testRunner.assertTransferCount(PutGoogleDrive.REL_SUCCESS, 0);
- testRunner.assertTransferCount(PutGoogleDrive.REL_FAILURE, 1);
-
- final List<MockFlowFile> flowFiles =
testRunner.getFlowFilesForRelationship(PutGoogleDrive.REL_FAILURE);
- final MockFlowFile ff0 = flowFiles.get(0);
- ff0.assertAttributeEquals(GoogleDriveAttributes.ERROR_CODE, "404");
- ff0.assertAttributeExists(GoogleDriveAttributes.ERROR_MESSAGE);
- }
-
@Test
void testUploadedFileAlreadyExistsFailResolution() {
// GIVEN
@@ -145,11 +87,11 @@ public class PutGoogleDriveIT extends
AbstractGoogleDriveIT<PutGoogleDrive> impl
}
@Test
- void testUploadedFileAlreadyExistsOverwriteResolution() {
+ void testUploadedFileAlreadyExistsReplaceResolution() {
// GIVEN
testRunner.setProperty(FOLDER_ID, mainFolderId);
testRunner.setProperty(FILE_NAME, TEST_FILENAME);
- testRunner.setProperty(PutGoogleDrive.CONFLICT_RESOLUTION,
PutGoogleDrive.REPLACE_RESOLUTION);
+ testRunner.setProperty(PutGoogleDrive.CONFLICT_RESOLUTION,
REPLACE.getValue());
// WHEN
runWithFileContent();
@@ -176,7 +118,7 @@ public class PutGoogleDriveIT extends
AbstractGoogleDriveIT<PutGoogleDrive> impl
// GIVEN
testRunner.setProperty(FOLDER_ID, mainFolderId);
testRunner.setProperty(FILE_NAME, TEST_FILENAME);
- testRunner.setProperty(PutGoogleDrive.CONFLICT_RESOLUTION,
PutGoogleDrive.IGNORE_RESOLUTION);
+ testRunner.setProperty(PutGoogleDrive.CONFLICT_RESOLUTION,
IGNORE.getValue());
// WHEN
runWithFileContent();
diff --git
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/PutGoogleDriveTest.java
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/PutGoogleDriveTest.java
index b9e45e093d..1e1905ac62 100644
---
a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/PutGoogleDriveTest.java
+++
b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/test/java/org/apache/nifi/processors/gcp/drive/PutGoogleDriveTest.java
@@ -19,9 +19,11 @@ package org.apache.nifi.processors.gcp.drive;
import static java.lang.String.format;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
+import static
org.apache.nifi.processors.conflict.resolution.ConflictResolutionStrategy.IGNORE;
+import static
org.apache.nifi.processors.conflict.resolution.ConflictResolutionStrategy.REPLACE;
import static
org.apache.nifi.processors.gcp.drive.GoogleDriveAttributes.ERROR_MESSAGE;
-import static
org.apache.nifi.processors.gcp.drive.GoogleDriveTrait.DRIVE_FOLDER_MIME_TYPE;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
@@ -82,26 +84,11 @@ public class PutGoogleDriveTest extends
AbstractGoogleDriveTest{
testRunner.assertNotValid();
}
- @Test
- void testSubfolderNameValidity() {
- testRunner.setProperty(PutGoogleDrive.SUBFOLDER_NAME, "sub1");
- testRunner.assertValid();
- testRunner.setProperty(PutGoogleDrive.SUBFOLDER_NAME, "sub1/sub2");
- testRunner.assertValid();
- testRunner.setProperty(PutGoogleDrive.SUBFOLDER_NAME, "/sub1");
- testRunner.assertNotValid();
- testRunner.setProperty(PutGoogleDrive.SUBFOLDER_NAME, "/");
- testRunner.assertNotValid();
- testRunner.setProperty(PutGoogleDrive.SUBFOLDER_NAME, "sub1/");
- testRunner.assertNotValid();
- testRunner.setProperty(PutGoogleDrive.SUBFOLDER_NAME, "/sub1/");
- testRunner.assertNotValid();
- }
-
@Test
void testFileUploadFileNameFromProperty() throws Exception {
testRunner.setProperty(PutGoogleDrive.FILE_NAME, TEST_FILENAME);
+ mockFileExists(emptyList());
mockFileUpload(createFile());
runWithFlowFile();
@@ -114,6 +101,7 @@ public class PutGoogleDriveTest extends
AbstractGoogleDriveTest{
void testFileUploadFileNameFromFlowFileAttribute() throws Exception {
testRunner.setProperty(PutGoogleDrive.FOLDER_ID, SHARED_FOLDER_ID);
+ mockFileExists(emptyList());
mockFileUpload(createFile());
final MockFlowFile mockFlowFile = getMockFlowFile();
@@ -128,31 +116,12 @@ public class PutGoogleDriveTest extends
AbstractGoogleDriveTest{
assertProvenanceEvent(ProvenanceEventType.SEND);
}
- @Test
- void testFileUploadFileToFolderSpecifiedByNameFolderExists() throws
Exception {
- testRunner.setProperty(PutGoogleDrive.SUBFOLDER_NAME, SUBFOLDER_NAME);
- testRunner.setProperty(PutGoogleDrive.FILE_NAME, TEST_FILENAME);
-
- when(mockDriverService.files()
- .list()
- .setQ(format("mimeType='%s' and name='%s' and ('%s' in
parents)", DRIVE_FOLDER_MIME_TYPE, SUBFOLDER_NAME, SHARED_FOLDER_ID))
- .setFields("files(name, id)")
- .execute())
- .thenReturn(new
FileList().setFiles(singletonList(createFile(SUBFOLDER_ID, SUBFOLDER_NAME,
SHARED_FOLDER_ID, DRIVE_FOLDER_MIME_TYPE))));
-
- mockFileUpload(createFile());
-
- runWithFlowFile();
- testRunner.assertAllFlowFilesTransferred(PutGoogleDrive.REL_SUCCESS,
1);
- assertFlowFileAttributes(PutGoogleDrive.REL_SUCCESS);
- assertProvenanceEvent(ProvenanceEventType.SEND);
- }
-
@Test
void testFileUploadError() throws Exception {
testRunner.setProperty(PutGoogleDrive.FILE_NAME, TEST_FILENAME);
final JsonParseException exception = new JsonParseException("Google
Drive error", new FileNotFoundException());
+ mockFileExists(emptyList());
mockFileUploadError(exception);
runWithFlowFile();
@@ -168,7 +137,7 @@ public class PutGoogleDriveTest extends
AbstractGoogleDriveTest{
void testFileAlreadyExistsFailResolution() throws Exception {
testRunner.setProperty(PutGoogleDrive.FILE_NAME, TEST_FILENAME);
- mockFileExists();
+ mockFileExists(singletonList(createFile()));
runWithFlowFile();
@@ -179,9 +148,9 @@ public class PutGoogleDriveTest extends
AbstractGoogleDriveTest{
@Test
void testFileAlreadyExistsIgnoreResolution() throws Exception {
testRunner.setProperty(PutGoogleDrive.FILE_NAME, TEST_FILENAME);
- testRunner.setProperty(PutGoogleDrive.CONFLICT_RESOLUTION,
PutGoogleDrive.IGNORE_RESOLUTION);
+ testRunner.setProperty(PutGoogleDrive.CONFLICT_RESOLUTION,
IGNORE.getValue());
- mockFileExists();
+ mockFileExists(singletonList(createFile()));
runWithFlowFile();
@@ -193,11 +162,11 @@ public class PutGoogleDriveTest extends
AbstractGoogleDriveTest{
}
@Test
- void testFileAlreadyExistsOverwriteResolution() throws Exception {
+ void testFileAlreadyExistsReplaceResolution() throws Exception {
testRunner.setProperty(PutGoogleDrive.FILE_NAME, TEST_FILENAME);
- testRunner.setProperty(PutGoogleDrive.CONFLICT_RESOLUTION,
PutGoogleDrive.REPLACE_RESOLUTION);
+ testRunner.setProperty(PutGoogleDrive.CONFLICT_RESOLUTION,
REPLACE.getValue());
- mockFileExists();
+ mockFileExists(singletonList(createFile()));
mockFileUpdate(createFile());
@@ -242,12 +211,12 @@ public class PutGoogleDriveTest extends
AbstractGoogleDriveTest{
.thenThrow(exception);
}
- private void mockFileExists() throws IOException {
+ private void mockFileExists(List<File> fileList) throws IOException {
when(mockDriverService.files()
.list()
.setQ(format("name='%s' and ('%s' in parents)", TEST_FILENAME,
SHARED_FOLDER_ID))
.setFields("files(name, id)")
.execute())
- .thenReturn(new
FileList().setFiles(singletonList(createFile())));
+ .thenReturn(new FileList().setFiles(fileList));
}
}
\ No newline at end of file