|
|
@ -1,14 +1,29 @@ |
|
|
|
package com.fanruan.fs.s3.repository.core; |
|
|
|
package com.fanruan.fs.s3.repository.core; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.amazonaws.auth.AWSStaticCredentialsProvider; |
|
|
|
|
|
|
|
import com.amazonaws.auth.BasicAWSCredentials; |
|
|
|
|
|
|
|
import com.amazonaws.client.builder.AwsClientBuilder; |
|
|
|
import com.amazonaws.services.s3.AmazonS3; |
|
|
|
import com.amazonaws.services.s3.AmazonS3; |
|
|
|
|
|
|
|
import com.amazonaws.services.s3.AmazonS3ClientBuilder; |
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.GetObjectRequest; |
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.ListObjectsRequest; |
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.ObjectListing; |
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.ObjectMetadata; |
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.PutObjectRequest; |
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.S3Object; |
|
|
|
|
|
|
|
import com.amazonaws.services.s3.model.S3ObjectSummary; |
|
|
|
import com.fanruan.api.log.LogKit; |
|
|
|
import com.fanruan.api.log.LogKit; |
|
|
|
|
|
|
|
import com.fanruan.api.util.StringKit; |
|
|
|
import com.fr.io.repository.FineFileEntry; |
|
|
|
import com.fr.io.repository.FineFileEntry; |
|
|
|
import com.fr.io.repository.base.BaseResourceRepository; |
|
|
|
import com.fr.io.repository.base.BaseResourceRepository; |
|
|
|
import com.fr.stable.Filter; |
|
|
|
import com.fr.stable.Filter; |
|
|
|
import com.fr.workspace.resource.ResourceIOException; |
|
|
|
import com.fr.workspace.resource.ResourceIOException; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.io.ByteArrayInputStream; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.net.URL; |
|
|
|
import java.net.URL; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* @author richie |
|
|
|
* @author richie |
|
|
@ -17,16 +32,18 @@ import java.net.URL; |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public class S3ResourceRepository extends BaseResourceRepository { |
|
|
|
public class S3ResourceRepository extends BaseResourceRepository { |
|
|
|
|
|
|
|
|
|
|
|
private AmazonS3 s3; |
|
|
|
private final AmazonS3 s3; |
|
|
|
private String bucket; |
|
|
|
private final String bucket; |
|
|
|
|
|
|
|
|
|
|
|
public S3ResourceRepository(String repoName, String workRoot, AmazonS3 s3, String bucket) { |
|
|
|
public S3ResourceRepository(String repoName, String workRoot, S3Config config) { |
|
|
|
super(repoName, workRoot); |
|
|
|
super(repoName, workRoot); |
|
|
|
this.s3 = s3; |
|
|
|
BasicAWSCredentials credentials = new BasicAWSCredentials(config.getAccessKeyId(), config.getAccessKeySecret()); |
|
|
|
this.bucket = bucket; |
|
|
|
this.s3 = AmazonS3ClientBuilder.standard() |
|
|
|
|
|
|
|
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(config.getEndPoint(), config.getRegion())) |
|
|
|
|
|
|
|
.withCredentials(new AWSStaticCredentialsProvider(credentials)).build(); |
|
|
|
|
|
|
|
this.bucket = config.getBucket(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public String getSeparator() { |
|
|
|
public String getSeparator() { |
|
|
|
return "/"; |
|
|
|
return "/"; |
|
|
@ -34,38 +51,78 @@ public class S3ResourceRepository extends BaseResourceRepository { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public FineFileEntry getEntry(String path) { |
|
|
|
public FineFileEntry getEntry(String path) { |
|
|
|
return null; |
|
|
|
GetObjectRequest request = new GetObjectRequest(bucket, path); |
|
|
|
|
|
|
|
S3Object s3Object = s3.getObject(request); |
|
|
|
|
|
|
|
return s3Object2FileEntry(s3Object, path); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public FineFileEntry[] listEntry(String dir) { |
|
|
|
public FineFileEntry[] listEntry(String dir) { |
|
|
|
return new FineFileEntry[0]; |
|
|
|
List<FineFileEntry> result = new ArrayList<>(); |
|
|
|
|
|
|
|
ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName(bucket) |
|
|
|
|
|
|
|
.withPrefix(dir).withDelimiter("/"); |
|
|
|
|
|
|
|
ObjectListing objectListing = s3.listObjects(listObjectsRequest); |
|
|
|
|
|
|
|
for (S3ObjectSummary summary : objectListing.getObjectSummaries()) { |
|
|
|
|
|
|
|
String key = summary.getKey(); |
|
|
|
|
|
|
|
result.add(s3Object2FileEntry(summary, key)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return result.toArray(new FineFileEntry[0]); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private FineFileEntry s3Object2FileEntry(S3ObjectSummary s3Object, String path) { |
|
|
|
|
|
|
|
FineFileEntry entry = new FineFileEntry(path); |
|
|
|
|
|
|
|
entry.setDirectory(s3Object.getKey().endsWith("/")); |
|
|
|
|
|
|
|
entry.setSize(s3Object.getSize()); |
|
|
|
|
|
|
|
entry.setTimestamp(s3Object.getLastModified().getTime()); |
|
|
|
|
|
|
|
return entry; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private FineFileEntry s3Object2FileEntry(S3Object s3Object, String path) { |
|
|
|
|
|
|
|
FineFileEntry entry = new FineFileEntry(path); |
|
|
|
|
|
|
|
entry.setDirectory(s3Object.getKey().endsWith("/")); |
|
|
|
|
|
|
|
entry.setSize(s3Object.getObjectMetadata().getContentLength()); |
|
|
|
|
|
|
|
entry.setTimestamp(s3Object.getObjectMetadata().getLastModified().getTime()); |
|
|
|
|
|
|
|
return entry; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public URL getResource(String path) { |
|
|
|
public URL getResource(String path) { |
|
|
|
return null; |
|
|
|
throw new RuntimeException("Not support method."); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public InputStream read(String filePath) throws ResourceIOException { |
|
|
|
public InputStream read(String filePath) throws ResourceIOException { |
|
|
|
return null; |
|
|
|
GetObjectRequest request = new GetObjectRequest(bucket, filePath); |
|
|
|
|
|
|
|
return s3.getObject(request).getObjectContent(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void write(String path, byte[] data) { |
|
|
|
public void write(String path, byte[] data) { |
|
|
|
|
|
|
|
ObjectMetadata metadata = s3.getObject(bucket, path).getObjectMetadata(); |
|
|
|
|
|
|
|
s3.putObject(bucket, path, new ByteArrayInputStream(data), metadata); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean createFile(String path) { |
|
|
|
public boolean createFile(String path) { |
|
|
|
|
|
|
|
PutObjectRequest request = new PutObjectRequest(bucket, path, StringKit.EMPTY); |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
s3.putObject(request); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean createDirectory(String path) { |
|
|
|
public boolean createDirectory(String path) { |
|
|
|
|
|
|
|
PutObjectRequest request = new PutObjectRequest(bucket, path + "/", StringKit.EMPTY); |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
s3.putObject(request); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean delete(String path) { |
|
|
|
public boolean delete(String path) { |
|
|
@ -80,27 +137,52 @@ public class S3ResourceRepository extends BaseResourceRepository { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean exist(String path) { |
|
|
|
public boolean exist(String path) { |
|
|
|
|
|
|
|
try { |
|
|
|
return s3.getObject(bucket, path) != null; |
|
|
|
return s3.getObject(bucket, path) != null; |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public String[] list(String dir, final Filter<String> filter) { |
|
|
|
public String[] list(String dir, final Filter<String> filter) { |
|
|
|
return new String[0]; |
|
|
|
List<String> result = new ArrayList<>(); |
|
|
|
|
|
|
|
ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName(bucket) |
|
|
|
|
|
|
|
.withPrefix(dir).withDelimiter("/"); |
|
|
|
|
|
|
|
ObjectListing objectListing = s3.listObjects(listObjectsRequest); |
|
|
|
|
|
|
|
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { |
|
|
|
|
|
|
|
if (filter.accept(objectSummary.getKey())) { |
|
|
|
|
|
|
|
result.add(objectSummary.getKey()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return result.toArray(new String[0]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean isDirectory(String path) { |
|
|
|
public boolean isDirectory(String path) { |
|
|
|
|
|
|
|
S3Object s3Object = s3.getObject(bucket, path); |
|
|
|
|
|
|
|
if (s3Object == null) { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return s3Object.getKey().endsWith("/"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public long lastModified(String path) { |
|
|
|
public long lastModified(String path) { |
|
|
|
return s3.getObject(bucket, path).getObjectMetadata().getLastModified().getTime(); |
|
|
|
S3Object s3Object = s3.getObject(bucket, path); |
|
|
|
|
|
|
|
if (s3Object == null) { |
|
|
|
|
|
|
|
return -1L; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return s3Object.getObjectMetadata().getLastModified().getTime(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public long length(String path) { |
|
|
|
public long length(String path) { |
|
|
|
return s3.getObject(bucket, path).getObjectMetadata().getContentLength(); |
|
|
|
S3Object s3Object = s3.getObject(bucket, path); |
|
|
|
|
|
|
|
if (s3Object == null) { |
|
|
|
|
|
|
|
return -1L; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return s3Object.getObjectMetadata().getContentLength(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|