· 7 years ago · Dec 04, 2018, 10:16 AM
1package com.serijakala.mvc.enelpremia.callcenter.utils;
2
3import com.amazonaws.ClientConfiguration;
4import com.amazonaws.Protocol;
5import com.amazonaws.auth.AWSCredentials;
6import com.amazonaws.auth.BasicAWSCredentials;
7import com.amazonaws.regions.Region;
8import com.amazonaws.regions.Regions;
9import com.amazonaws.services.cloudfront.AmazonCloudFrontClient;
10import com.amazonaws.services.cloudfront.model.CreateInvalidationRequest;
11import com.amazonaws.services.cloudfront.model.CreateInvalidationResult;
12import com.amazonaws.services.cloudfront.model.InvalidationBatch;
13import com.amazonaws.services.cloudfront.model.Paths;
14import com.amazonaws.services.s3.AmazonS3;
15import com.amazonaws.services.s3.AmazonS3Client;
16import com.amazonaws.services.s3.model.CannedAccessControlList;
17import com.amazonaws.services.s3.model.DeleteObjectRequest;
18import com.amazonaws.services.s3.model.PutObjectRequest;
19import com.serijakala.mvc.base.properties.BasePropertiesConfiguration;
20import org.apache.commons.lang.exception.ExceptionUtils;
21import org.slf4j.Logger;
22import org.slf4j.LoggerFactory;
23import org.springframework.beans.factory.annotation.Autowired;
24import org.springframework.stereotype.Service;
25import org.springframework.web.multipart.MultipartFile;
26
27import javax.annotation.PostConstruct;
28import javax.annotation.PreDestroy;
29import java.io.File;
30import java.io.FileOutputStream;
31import java.io.IOException;
32import java.util.Date;
33
34import static com.serijakala.mvc.enelpremia.callcenter.services.CommonCallcenterService.CALLCENTER_CHANNEL;
35
36@Service
37public class AmazonClient {
38 private final Logger logger = LoggerFactory.getLogger(this.getClass());
39
40 private AmazonS3 s3client;
41 private AmazonCloudFrontClient cloudFrontClient;
42
43 private String endpointUrl;
44 private String bucketName;
45 private String accessKey;
46 private String secretKey;
47 private String distributionId;
48 private String endPoint;
49
50 private String callcenterClaimsAttachment;
51
52 @Autowired private BasePropertiesConfiguration basePropertiesConfiguration;
53
54 @PostConstruct
55 private void initializeAmazon() {
56 this.endpointUrl = basePropertiesConfiguration.get("amazonProperties.endpointUrl");
57 this.bucketName = basePropertiesConfiguration.get("amazonProperties.bucketName");
58 this.accessKey = basePropertiesConfiguration.get("amazonProperties.accessKey");
59 this.secretKey = basePropertiesConfiguration.get("amazonProperties.secretKey");
60 this.distributionId = basePropertiesConfiguration.get("amazonProperties.distributionId");
61 this.endPoint = basePropertiesConfiguration.get("amazonProperties.endPoint");
62 this.callcenterClaimsAttachment = basePropertiesConfiguration.get("amazonProperties.callcenter.claimsAttachmentPath");
63
64 AWSCredentials credentials = new BasicAWSCredentials(this.accessKey, this.secretKey);
65 this.s3client = new AmazonS3Client(credentials,getSettings());
66 this.s3client.setRegion(Region.getRegion(Regions.EU_WEST_1));
67 this.s3client.setEndpoint(endPoint);
68 this.cloudFrontClient = new AmazonCloudFrontClient(credentials, getSettings());
69 }
70
71 @PreDestroy
72 private void cleanUp() {
73 try {
74 // Shutting down AWS IdleConnectionReaper thread...
75 com.amazonaws.http.IdleConnectionReaper.shutdown();
76 } catch (Throwable t) {
77 logger.error("AmazonClient - CleanUP ERROR: " + ExceptionUtils.getFullStackTrace(t));
78 }
79 }
80
81 public String uploadFile(MultipartFile multipartFile, String context) {
82 String fileUrl = "";
83 try {
84 File file = convertMultiPartToFile(multipartFile);
85 String fileName = getPathByContext(context) + "/" + generateFileName(multipartFile);
86 fileUrl = uploadFileTos3bucket(fileName, file);
87 file.delete();
88 } catch (Exception e) {
89 throw new RuntimeException(e);
90 }
91 return fileUrl;
92 }
93
94 public String deleteFileFromS3Bucket(String fileUrl) {
95 String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
96 s3client.deleteObject(new DeleteObjectRequest(bucketName, fileName));
97 return "Successfully deleted";
98 }
99
100 public String invalidateCacheByPath(String fileName){
101 Paths invalidation_paths = new Paths().withItems(fileName).withQuantity(new Integer(1));
102 InvalidationBatch invalidation_batch = new InvalidationBatch(invalidation_paths, CALLCENTER_CHANNEL + "_" + System.currentTimeMillis());
103 CreateInvalidationRequest invalidation = new CreateInvalidationRequest(distributionId, invalidation_batch);
104 CreateInvalidationResult ret = cloudFrontClient.createInvalidation(invalidation);
105 return ret.getInvalidation().getStatus();
106 }
107
108 private ClientConfiguration getSettings() {
109 ClientConfiguration clientConfig = new ClientConfiguration();
110 clientConfig.setProtocol(Protocol.HTTPS);
111 if(basePropertiesConfiguration.runningOn(BasePropertiesConfiguration.DEV)){
112 clientConfig.setProxyHost(basePropertiesConfiguration.get("amazonProperties.httpProxyUrl"));
113 clientConfig.setProxyPort(Integer.parseInt(basePropertiesConfiguration.get("amazonProperties.httpProxyPort")));
114 clientConfig.setProxyUsername(basePropertiesConfiguration.get("amazonProperties.httpProxyUsername"));
115 clientConfig.setProxyPassword(basePropertiesConfiguration.get("amazonProperties.httpProxyPassword"));
116 }
117
118 return clientConfig;
119 }
120
121 private File convertMultiPartToFile(MultipartFile file) throws IOException {
122 File convFile = new File(file.getOriginalFilename());
123 FileOutputStream fos = new FileOutputStream(convFile);
124 fos.write(file.getBytes());
125 fos.close();
126 return convFile;
127 }
128
129 private String generateFileName(MultipartFile multiPart) {
130 return new Date().getTime() + "-" + multiPart.getOriginalFilename().replace(" ", "_");
131 }
132
133 private String uploadFileTos3bucket(String fileName, File file) {
134 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file);
135 putObjectRequest.setCannedAcl(CannedAccessControlList.PublicRead);
136 s3client.putObject(putObjectRequest);
137 return s3client.getUrl(bucketName, fileName).toString();
138 }
139
140 private String getPathByContext(String context){
141 switch (context){
142 case CALLCENTER_CHANNEL: return callcenterClaimsAttachment;
143 default: throw new RuntimeException("Invalid context");
144 }
145 }
146
147 public String getEndpointUrl() {
148 return endpointUrl;
149 }
150
151 public String getBucketName() {
152 return bucketName;
153 }
154
155 public String getAccessKey() {
156 return accessKey;
157 }
158
159 public String getSecretKey() {
160 return secretKey;
161 }
162
163 public String getDistributionId() {
164 return distributionId;
165 }
166
167 public String getEndPoint() {
168 return endPoint;
169 }
170
171 public String getCallcenterClaimsAttachment() {
172 return callcenterClaimsAttachment;
173 }
174}