1
1
package com.wizpanda.file.api
2
2
3
+ import com.wizpanda.file.ConfigHelper
3
4
import com.wizpanda.file.StoredFile
4
5
import com.wizpanda.file.service.AmazonS3UploaderService
5
6
import grails.util.Environment
6
7
import grails.util.GrailsStringUtils
8
+ import groovy.util.logging.Slf4j
7
9
import org.jclouds.ContextBuilder
8
10
import org.jclouds.aws.s3.AWSS3Client
9
11
import org.jclouds.blobstore.BlobStore
10
12
import org.jclouds.blobstore.BlobStoreContext
13
+ import org.jclouds.http.HttpResponseException
14
+ import org.jclouds.s3.domain.CannedAccessPolicy
11
15
import org.jclouds.s3.domain.internal.MutableObjectMetadataImpl
16
+ import org.jclouds.s3.options.CopyObjectOptions
12
17
13
18
import javax.activation.MimetypesFileTypeMap
14
19
20
+ @Slf4j
15
21
abstract class AmazonS3Api extends AbstractStorageApi {
16
22
17
23
BlobStore blobStore
@@ -20,15 +26,15 @@ abstract class AmazonS3Api extends AbstractStorageApi {
20
26
AmazonS3UploaderService service
21
27
22
28
void authenticate () {
23
- println service. accessKey
24
- println service. accessSecret
25
29
context = ContextBuilder . newBuilder(" aws-s3" )
26
30
.credentials(service. accessKey, service. accessSecret)
27
31
.buildView(BlobStoreContext . class)
28
- println " Context created ${ context.class} "
32
+
33
+ log. info " Context created ${ context.class} "
29
34
30
35
blobStore = context. getBlobStore()
31
- println " BlobStore ${ blobStore.class} "
36
+
37
+ log. info " BlobStore ${ blobStore.class} "
32
38
33
39
// Storing wrapped Api of S3Client with Apache JCloud
34
40
client = context. unwrap(). getApi()
@@ -55,6 +61,15 @@ abstract class AmazonS3Api extends AbstractStorageApi {
55
61
return name + " ." + extension
56
62
}
57
63
64
+ @Override
65
+ String getFileName (StoredFile file ) {
66
+ String name = UUID . randomUUID(). toString()
67
+ String originalFileName = file. originalName
68
+ String extension = GrailsStringUtils . substringAfterLast(originalFileName, " ." )
69
+
70
+ return name + " ." + extension
71
+ }
72
+
58
73
String getContainerName () {
59
74
String name = service. container
60
75
if (Environment . current != Environment . PRODUCTION ) {
@@ -75,6 +90,62 @@ abstract class AmazonS3Api extends AbstractStorageApi {
75
90
76
91
@Override
77
92
void deleteNativeFile (StoredFile file ) {
78
- // TODO implement me
93
+ String container = this . containerName
94
+ String fileName = file. name
95
+
96
+ log. info " Deleting file ${ file} with name ${ fileName} from container ${ container} ."
97
+
98
+ this . authenticate()
99
+
100
+ if (! client. objectExists(container, fileName)) {
101
+ log. warn " File not present in the S3 bucket, deleting the Stored file instance."
102
+
103
+ file. delete()
104
+ this . close()
105
+
106
+ return
107
+ }
108
+
109
+ client. deleteObject(container, fileName)
110
+ file. delete()
111
+
112
+ this . close()
113
+ }
114
+
115
+ @Override
116
+ StoredFile cloneStoredFile (StoredFile file , String newGroupName ) {
117
+ StoredFile clonedFile = new StoredFile ()
118
+ clonedFile. originalName = file. originalName
119
+ clonedFile. groupName = newGroupName
120
+ clonedFile. size = file. size
121
+ clonedFile. name = getFileName(file)
122
+
123
+ String currentContainer = ConfigHelper . getGroup(file. groupName). container ?:
124
+ ConfigHelper . getFlatConfig(" global.amazon.container" )
125
+
126
+ String newContainer = getContainerName()
127
+
128
+ CopyObjectOptions fileOptions = new CopyObjectOptions ()
129
+ // For now using the same policy of original file, it gets changed to private scope if not overridden.
130
+ fileOptions. overrideAcl(CannedAccessPolicy . PUBLIC_READ )
131
+
132
+ try {
133
+ this . authenticate()
134
+ client. copyObject(currentContainer, file. name, newContainer, clonedFile. name, fileOptions)
135
+ clonedFile. url = client. getObject(newContainer, clonedFile. name, null ). metadata. uri
136
+
137
+ this . gormFile = clonedFile
138
+ this . gormFile. uploadedOn = new Date ()
139
+
140
+ this . saveGORMFile()
141
+
142
+ log. info " Successfully cloned StoredFile: ${ file} as ${ this.gormFile} "
143
+
144
+ return this . gormFile
145
+ } catch (HttpResponseException hre) {
146
+ log. warn ' Could not copy StoredFile!' , hre
147
+ } finally {
148
+ this . close()
149
+ }
79
150
}
80
151
}
0 commit comments