Skip to content

Commit 800932d

Browse files
author
Shivam Pandey
authored
Merge pull request #41 from causecode/dev
Merge dev to master
2 parents 7e8cde9 + ecec1ab commit 800932d

File tree

11 files changed

+86
-24
lines changed

11 files changed

+86
-24
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
# File-Uploader Plugin (Latest 4.0.0)
1+
# File-Uploader Plugin (Latest 4.0.1)
22

33
[![Maintainability](https://api.codeclimate.com/v1/badges/13bfee73c29ecd2ea4b2/maintainability)](https://codeclimate.com/github/causecode/grails-file-uploader/maintainability)
44
[![Test Coverage](https://api.codeclimate.com/v1/badges/13bfee73c29ecd2ea4b2/test_coverage)](https://codeclimate.com/github/causecode/grails-file-uploader/test_coverage)
55

6-
File-Uploader Plugin >= 4.0.0 supports Grails 3.3.x (Tested with 3.3.5)
6+
File-Uploader Plugin >= 4.0.1 supports Grails 3.3.x (Tested with 3.3.5)
77
File-Uploader Plugin <= 3.1.x supports Grails 3.2.x (Tested upto 3.2.5)
88

99
# For Grails 2.x refer branch [here](https://github.com/causecode/grails-file-uploader/tree/grails-2.x-master)

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ buildscript {
1515
}
1616
}
1717

18-
version "4.0.0"
18+
version "4.0.1"
1919
group "com.causecode.plugins"
2020

2121
apply plugin: "idea"

changelog.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# ChangeLog
22

3-
## Version 4.0.0 [Unreleased]
3+
## Version 4.0.1 [Unreleased]
4+
5+
### Added
6+
- Field to store the container name in UFile domain.
7+
8+
## Version 4.0.0 [19-12-2018]
49

510
### Changed
611
- Upgraded the plugin to support grails 3.3.5

grails-app/conf/application.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ fileuploader {
5353
maxSize = 1024 * 1024 * 2 // 2 MB
5454
allowedExtensions = ["jpg", "jpeg", "gif", "png", "txt"]
5555
path = '/tmp'
56+
container = 'test-container'
5657
}
5758
}
5859

grails-app/domain/com/causecode/fileuploader/UFile.groovy

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class UFile implements Serializable {
3737
String fileGroup
3838
String name
3939
String path
40+
String containerName // Name of the cloud container.
4041

4142
//Contains calculated hash value of file content
4243
String checksum
@@ -65,6 +66,7 @@ class UFile implements Serializable {
6566
dateCreated bindable: false
6667
lastUpdated bindable: false
6768
envName bindable: false
69+
containerName size: 3..63, nullable: true
6870
}
6971

7072
static mapping = {
@@ -103,8 +105,8 @@ class UFile implements Serializable {
103105
new File(path).exists()
104106
}
105107

106-
String getContainer() {
107-
containerName(Holders.flatConfig["fileuploader.groups.${fileGroup}.container"])
108+
String getContainerFromConfig() {
109+
containerNameFromConfig(Holders.flatConfig["fileuploader.groups.${fileGroup}.container"])
108110
}
109111

110112
String getFullName() {
@@ -124,7 +126,7 @@ class UFile implements Serializable {
124126
* @param containerName Name of the Amazon file container or Google bucket.
125127
* @return Modified container name as described above.
126128
*/
127-
static String containerName(String containerName) {
129+
static String containerNameFromConfig(String containerName) {
128130
if (!containerName) {
129131
return
130132
}

grails-app/services/com/causecode/fileuploader/FileUploaderService.groovy

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class FileUploaderService {
5252
FileGroup fileGroupInstance = new FileGroup(group)
5353
ChecksumValidator checksumValidator = new ChecksumValidator(fileGroupInstance)
5454

55+
String containerName
56+
5557
if (checksumValidator.shouldCalculateChecksum()) {
5658
UFile uFileInstance = UFile.findByChecksumAndChecksumAlgorithm(checksumValidator.getChecksum(file),
5759
checksumValidator.algorithm)
@@ -100,6 +102,7 @@ class FileUploaderService {
100102
throw new StorageConfigurationException('Provider not defined in the Config. Please define one.')
101103
}
102104

105+
containerName = getContainerNameFromConfig(fileGroupInstance)
103106
expireOn = isPublicGroup(group) ? null : new Date(new Date().time + expirationPeriod * 1000)
104107
path = uploadFileToCloud(fileData, fileGroupInstance, tempFile)
105108
} else {
@@ -110,7 +113,8 @@ class FileUploaderService {
110113

111114
UFile ufile = new UFile(
112115
[name : fileData.fileName, size: fileData.fileSize, path: path, type: type,
113-
extension: fileData.fileExtension, expiresOn: expireOn, fileGroup: group, provider: cdnProvider])
116+
extension: fileData.fileExtension, expiresOn: expireOn, fileGroup: group, provider: cdnProvider,
117+
containerName: containerName])
114118

115119
if (checksumValidator.shouldCalculateChecksum()) {
116120
ufile.checksum = checksumValidator.getChecksum(file)
@@ -121,6 +125,23 @@ class FileUploaderService {
121125
return ufile
122126
}
123127

128+
/**
129+
* This method checks if the configuration {@link FileGroup} contains the {@link String} container name.
130+
*
131+
* @param fileGroup {@link FileGroup}
132+
* @return {@link String} - containerName
133+
* @throws StorageConfigurationException - When container name is not defined.
134+
*/
135+
private static String getContainerNameFromConfig(FileGroup fileGroup) throws StorageConfigurationException {
136+
String containerName = fileGroup.containerName
137+
138+
if (!containerName) {
139+
throw new StorageConfigurationException('Container name not defined in the Config. Please define one.')
140+
}
141+
142+
return containerName
143+
}
144+
124145
/**
125146
* Method is used to upload file to cloud provider. Then it gets the path of uploaded file
126147
* @params fileData , fileGroupInstance, tempFile
@@ -177,7 +198,7 @@ class FileUploaderService {
177198
CDNFileUploader fileUploaderInstance
178199
try {
179200
fileUploaderInstance = providerService.getProviderInstance(ufileInstance.provider.name())
180-
fileUploaderInstance.deleteFile(ufileInstance.container, ufileInstance.fullName)
201+
fileUploaderInstance.deleteFile(ufileInstance.containerFromConfig, ufileInstance.fullName)
181202
} finally {
182203
fileUploaderInstance?.close()
183204
}
@@ -375,7 +396,7 @@ class FileUploaderService {
375396
Boolean makePublic = isPublicGroup(uFileInstance.fileGroup)
376397
long expirationPeriod = getExpirationPeriod(uFileInstance.fileGroup)
377398

378-
amazonFileUploaderInstance.updatePreviousFileMetaData(uFileInstance.container,
399+
amazonFileUploaderInstance.updatePreviousFileMetaData(uFileInstance.containerFromConfig,
379400
uFileInstance.fullName, makePublic, expirationPeriod)
380401
}
381402

@@ -452,13 +473,13 @@ class FileUploaderService {
452473
CDNFileUploader fileUploaderInstance
453474
try {
454475
fileUploaderInstance = providerService.getProviderInstance(toCDNProvider.name())
455-
fileUploaderInstance.uploadFile(uFile.container, downloadedFile, fileName, makePublic,
476+
fileUploaderInstance.uploadFile(uFile.containerFromConfig, downloadedFile, fileName, makePublic,
456477
expirationPeriod)
457478

458479
if (makePublic) {
459-
savedUrlPath = fileUploaderInstance.getPermanentURL(uFile.container, fileName)
480+
savedUrlPath = fileUploaderInstance.getPermanentURL(uFile.containerFromConfig, fileName)
460481
} else {
461-
savedUrlPath = fileUploaderInstance.getTemporaryURL(uFile.container, fileName,
482+
savedUrlPath = fileUploaderInstance.getTemporaryURL(uFile.containerFromConfig, fileName,
462483
expirationPeriod)
463484
}
464485
} finally {

src/main/groovy/com/causecode/fileuploader/FileGroup.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,9 @@ class FileGroup {
201201
return fileNameBuilder.toString()
202202
}
203203

204-
// Method which fetches containerName from application.groovy file and returns it.
204+
// Method which fetches container from application.groovy file and returns it.
205205
String getContainerName() {
206-
return UFile.containerName(this.groupConfig.container ?: this.config.container)
206+
return UFile.containerNameFromConfig(this.groupConfig.container ?: this.config.container)
207207
}
208208

209209
// Method that fetched CDNProvider from the config and returns it.

src/main/groovy/com/causecode/fileuploader/ufile/renewer/DefaultTemporaryUrlRenewer.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class DefaultTemporaryUrlRenewer implements TemporaryUrlRenewer {
105105
private boolean updateExpirationPeriodAndUrl(UFile uFile) {
106106
long expirationPeriod = getExpirationPeriod(uFile.fileGroup)
107107

108-
uFile.path = cdnFileUploader.getTemporaryURL(uFile.container, uFile.fullName, expirationPeriod)
108+
uFile.path = cdnFileUploader.getTemporaryURL(uFile.containerFromConfig, uFile.fullName, expirationPeriod)
109109
uFile.expiresOn = new Date(new Date().time + expirationPeriod * 1000)
110110

111111
if (NucleusUtils.save(uFile, true)) {

src/test/groovy/com/causecode/fileuploader/BaseFileUploaderServiceSpecSetup.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class BaseFileUploaderServiceSpecSetup extends Specification implements BaseTest
9898
void mockFileGroupConstructor(String storageTypes) {
9999
new FileGroup(_) >> { String group ->
100100
fileGroupMock.groupName = group
101+
fileGroupMock.containerName >> 'test-container'
101102
fileGroupMock.groupConfig >> [storageTypes: storageTypes]
102103

103104
return fileGroupMock

src/test/groovy/com/causecode/fileuploader/FileUploaderServiceSpec.groovy

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import grails.util.Holders
1717
import groovy.json.JsonBuilder
1818
import org.apache.commons.fileupload.disk.DiskFileItem
1919
import org.apache.commons.validator.UrlValidator
20-
import org.grails.plugins.codecs.HTMLCodec
2120
import org.springframework.context.MessageSource
2221
import org.springframework.context.i18n.LocaleContextHolder
2322
import org.springframework.web.multipart.MultipartFile
@@ -34,7 +33,7 @@ import javax.servlet.http.Part
3433
// Suppressed Methods counts since this class contains more than 30 methods.
3534
@ConfineMetaClassChanges([FileUploaderService, File])
3635
@Build([UFile, UFileMoveHistory])
37-
@SuppressWarnings('MethodCount')
36+
@SuppressWarnings(['MethodCount', 'FileLengthRule'])
3837
class FileUploaderServiceSpec extends BaseFileUploaderServiceSpecSetup implements ServiceUnitTest<FileUploaderService>,
3938
BuildDataTest {
4039

@@ -92,6 +91,7 @@ class FileUploaderServiceSpec extends BaseFileUploaderServiceSpecSetup implement
9291

9392
new FileGroup(_) >> fileGroupMock
9493
fileGroupMock.cdnProvider >> provider
94+
fileGroupMock.containerName >> 'test-bucket'
9595
fileGroupMock.groupConfig >> [storageTypes: 'CDN']
9696

9797
when: 'The saveFile method is called'
@@ -100,7 +100,7 @@ class FileUploaderServiceSpec extends BaseFileUploaderServiceSpecSetup implement
100100
then: 'UFile instance should be successfully saved'
101101
ufileInstancefile.provider == provider
102102
ufileInstancefile.extension == 'txt'
103-
ufileInstancefile.container == 'causecode-test'
103+
ufileInstancefile.containerFromConfig == 'causecode-test'
104104
ufileInstancefile.fileGroup == fileGroup
105105

106106
file.delete()
@@ -125,6 +125,7 @@ class FileUploaderServiceSpec extends BaseFileUploaderServiceSpecSetup implement
125125
and: 'Mocked FileGroup class method call'
126126
new FileGroup(_) >> fileGroupMock
127127
fileGroupMock.cdnProvider >> CDNProvider.GOOGLE
128+
fileGroupMock.containerName >> 'test-container'
128129
fileGroupMock.groupConfig >> [storageTypes: 'CDN']
129130
mockGetFileNameAndExtensions()
130131

@@ -544,6 +545,7 @@ class FileUploaderServiceSpec extends BaseFileUploaderServiceSpecSetup implement
544545
mockGetFileNameAndExtensions()
545546
mockUploadFileMethod(true)
546547
mockGetProviderInstance('google')
548+
4 * fileGroupMock.containerName >> 'test-container'
547549
5 * fileGroupMock.cdnProvider >> {
548550
return
549551
} >> {
@@ -565,6 +567,7 @@ class FileUploaderServiceSpec extends BaseFileUploaderServiceSpecSetup implement
565567
then: 'Method should return instance of UFile'
566568
result.fileGroup == 'testGoogle'
567569
result.type == UFileType.CDN_PUBLIC
570+
result.containerName == 'test-container'
568571

569572
when: 'saveFile method is hit and file belongs to StandardMultiartFile'
570573
mockUploadFileMethod(true)
@@ -608,6 +611,7 @@ class FileUploaderServiceSpec extends BaseFileUploaderServiceSpecSetup implement
608611

609612
then: 'Method should return saved UFile instance'
610613
result.id != null
614+
assert result.containerName == null
611615

612616
when: 'saveFile method is called and error occurs while saving file'
613617
result = service.saveFile('testLocal', commonsMultipartFileInstance, 'test')
@@ -787,6 +791,7 @@ class FileUploaderServiceSpec extends BaseFileUploaderServiceSpecSetup implement
787791
and: 'Mocked FileGroup Instance'
788792
new FileGroup(_) >> fileGroupMock
789793
fileGroupMock.cdnProvider >> CDNProvider.GOOGLE
794+
fileGroupMock.containerName >> 'test-container'
790795
fileGroupMock.groupConfig >> [storageTypes: 'CDN', checksum: [calculate: true, algorithm: Algorithm.SHA1]]
791796

792797
and: 'The saveFile method has been already called once for given file'
@@ -838,5 +843,32 @@ class FileUploaderServiceSpec extends BaseFileUploaderServiceSpecSetup implement
838843
Exception exception = thrown(IllegalArgumentException)
839844
exception.message == "No enum constant ${Algorithm.canonicalName}.ABCD"
840845
}
841-
}
842846

847+
void "test saveFile method when container name is not defined in the config"() {
848+
given: 'Instances of CommonsMultipartFile to upload'
849+
File fileInstance = getFileInstance('/tmp/test.txt')
850+
851+
DiskFileItem fileItem = getDiskFileItemInstance(fileInstance)
852+
CommonsMultipartFile commonsMultipartFileInstance = new CommonsMultipartFile(fileItem)
853+
854+
and: 'Mocked methods of FileGroup to return empty container name'
855+
mockFileGroupConstructor('CDN')
856+
fileGroupMock.containerName >> {
857+
return null
858+
}
859+
860+
fileGroupMock.cdnProvider >> {
861+
return CDNProvider.GOOGLE
862+
}
863+
864+
and: 'Mocked getFileNameAndExtensions method of fileGroupMock'
865+
mockGetFileNameAndExtensions()
866+
867+
when: 'saveFile is called and container name is not defined'
868+
service.saveFile('testGoogle', commonsMultipartFileInstance, 'test')
869+
870+
then: 'Method should throw StorageConfigurationException and message should match'
871+
StorageConfigurationException exception = thrown(StorageConfigurationException)
872+
exception.message == 'Container name not defined in the Config. Please define one.'
873+
}
874+
}

0 commit comments

Comments
 (0)