package tw.com.providers; import java.io.File; import java.util.Collection; import java.util.LinkedList; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.amazonaws.event.ProgressListener; import com.amazonaws.services.cloudformation.model.Parameter; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.PutObjectRequest; public class ArtifactUploader { private static final Logger logger = LoggerFactory.getLogger(ArtifactUploader.class); private AmazonS3Client s3Client; private String bucketName; private Integer buildNumber; private ProgressListener progressListener = new UploadProgressListener(); public ArtifactUploader(AmazonS3Client s3Client, String bucketName, Integer buildNumber) { this.s3Client = s3Client; this.bucketName = bucketName; this.buildNumber = buildNumber; } public List<Parameter> uploadArtifacts(Collection<Parameter> arts) { logger.info("Uploading artifacts to bucket " + bucketName); LinkedList<Parameter> urls = new LinkedList<Parameter>(); for(Parameter artifact : arts) { urls.add(processArtifact(artifact)); } return urls; } private Parameter processArtifact(Parameter artifact) { String fullFilePath = artifact.getParameterValue(); File item = FileUtils.getFile(fullFilePath); String url; if (item.isDirectory()) { for (File file : item.listFiles()) { if (file.isFile()) { String fileUrl = uploadItem(file); logger.info(String.format("Uploaded %s at URL %s", file.getAbsolutePath(), fileUrl)); } else { logger.warn("Skipped item " + file.getAbsolutePath()); } } url = s3Client.getResourceUrl(bucketName, buildNumber.toString()); } else { url = uploadItem(item); } logger.info(String.format("Uploaded %s at URL %s", item.getAbsolutePath(), url)); return new Parameter().withParameterKey(artifact.getParameterKey()).withParameterValue(url); } private String uploadItem(File item) { String fullFilePath = item.getAbsolutePath(); String name = FilenameUtils.getName(fullFilePath); String key = String.format("%s/%s", buildNumber, name); logger.debug(String.format("Uploading file %s to key %s", item.getAbsolutePath(), key)); PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, item); putObjectRequest.setGeneralProgressListener(progressListener); s3Client.putObject(putObjectRequest); //s3Client.putObject(bucketName, key, item); return s3Client.getResourceUrl(bucketName, key); } public void delete(String filename) { String key = String.format("%s/%s",buildNumber,filename); logger.info(String.format("Delete from bucket '%s' key '%s'", bucketName, key)); s3Client.deleteObject(bucketName,key); } }