Browse Source

S3文件服务器完整版

pull/1/head
richie 4 years ago
parent
commit
ad46161a76
  1. 12
      src/main/java/com/fanruan/fs/s3/repository/core/S3Config.java
  2. 2
      src/main/java/com/fanruan/fs/s3/repository/core/S3RepositoryFactory.java
  3. 118
      src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java
  4. 1
      src/main/resources/com/fanruan/fs/s3/repository/locale/s3.properties
  5. 1
      src/main/resources/com/fanruan/fs/s3/repository/locale/s3_en_US.properties
  6. 1
      src/main/resources/com/fanruan/fs/s3/repository/locale/s3_zh_CN.properties
  7. 22
      src/main/resources/com/fanruan/fs/s3/repository/web/js/bundle.js

12
src/main/java/com/fanruan/fs/s3/repository/core/S3Config.java

@ -20,6 +20,9 @@ public class S3Config extends CommonRepoConfig {
@Identifier("endPoint")
private Conf<String> endPoint = Holders.simple(StringUtils.EMPTY);
@Identifier("region")
private Conf<String> region = Holders.simple(StringUtils.EMPTY);
@Identifier("accessKeyId")
private Conf<String> accessKeyId = Holders.simple(StringUtils.EMPTY);
@ -37,6 +40,14 @@ public class S3Config extends CommonRepoConfig {
this.endPoint.set(endPoint);
}
public String getRegion() {
return region.get();
}
public void setRegion(String region) {
this.region.set(region);
}
public String getAccessKeyId() {
return accessKeyId.get();
}
@ -65,6 +76,7 @@ public class S3Config extends CommonRepoConfig {
public S3Config clone() throws CloneNotSupportedException {
S3Config cloned = (S3Config) super.clone();
cloned.endPoint = (Conf<String>) endPoint.clone();
cloned.region = (Conf<String>) region.clone();
cloned.accessKeyId = (Conf<String>) accessKeyId.clone();
cloned.accessKeySecret = (Conf<String>) accessKeySecret.clone();
cloned.bucket = (Conf<String>) bucket.clone();

2
src/main/java/com/fanruan/fs/s3/repository/core/S3RepositoryFactory.java

@ -34,6 +34,6 @@ public class S3RepositoryFactory extends ConfigRepositoryFactory<S3Config> {
@Override
public ResourceRepository produce(String repoName, String workRoot, S3Config config) {
return new S3ResourceRepository(repoName, workRoot, null, null);
return new S3ResourceRepository(repoName, workRoot, config);
}
}

118
src/main/java/com/fanruan/fs/s3/repository/core/S3ResourceRepository.java

@ -1,14 +1,29 @@
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.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.util.StringKit;
import com.fr.io.repository.FineFileEntry;
import com.fr.io.repository.base.BaseResourceRepository;
import com.fr.stable.Filter;
import com.fr.workspace.resource.ResourceIOException;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/**
* @author richie
@ -17,16 +32,18 @@ import java.net.URL;
*/
public class S3ResourceRepository extends BaseResourceRepository {
private AmazonS3 s3;
private String bucket;
private final AmazonS3 s3;
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);
this.s3 = s3;
this.bucket = bucket;
BasicAWSCredentials credentials = new BasicAWSCredentials(config.getAccessKeyId(), config.getAccessKeySecret());
this.s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(config.getEndPoint(), config.getRegion()))
.withCredentials(new AWSStaticCredentialsProvider(credentials)).build();
this.bucket = config.getBucket();
}
@Override
public String getSeparator() {
return "/";
@ -34,37 +51,77 @@ public class S3ResourceRepository extends BaseResourceRepository {
@Override
public FineFileEntry getEntry(String path) {
return null;
GetObjectRequest request = new GetObjectRequest(bucket, path);
S3Object s3Object = s3.getObject(request);
return s3Object2FileEntry(s3Object, path);
}
@Override
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
public URL getResource(String path) {
return null;
throw new RuntimeException("Not support method.");
}
@Override
public InputStream read(String filePath) throws ResourceIOException {
return null;
GetObjectRequest request = new GetObjectRequest(bucket, filePath);
return s3.getObject(request).getObjectContent();
}
@Override
public void write(String path, byte[] data) {
ObjectMetadata metadata = s3.getObject(bucket, path).getObjectMetadata();
s3.putObject(bucket, path, new ByteArrayInputStream(data), metadata);
}
@Override
public boolean createFile(String path) {
return false;
PutObjectRequest request = new PutObjectRequest(bucket, path, StringKit.EMPTY);
try {
s3.putObject(request);
} catch (Exception e) {
return false;
}
return true;
}
@Override
public boolean createDirectory(String path) {
return false;
PutObjectRequest request = new PutObjectRequest(bucket, path + "/", StringKit.EMPTY);
try {
s3.putObject(request);
} catch (Exception e) {
return false;
}
return true;
}
@Override
@ -80,27 +137,52 @@ public class S3ResourceRepository extends BaseResourceRepository {
@Override
public boolean exist(String path) {
return s3.getObject(bucket, path) != null;
try {
return s3.getObject(bucket, path) != null;
} catch (Exception e) {
return false;
}
}
@Override
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
public boolean isDirectory(String path) {
return false;
S3Object s3Object = s3.getObject(bucket, path);
if (s3Object == null) {
return false;
}
return s3Object.getKey().endsWith("/");
}
@Override
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
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

1
src/main/resources/com/fanruan/fs/s3/repository/locale/s3.properties

@ -1,5 +1,6 @@
Plugin-S3_Input=Please Input
Plugin-S3_End_Point=Endpoint
Plugin-S3_Region=Region
Plugin-S3_Access_Key_Id=AccessKeyId
Plugin-S3_Access_Key_Secret=AccessKeySecret
Plugin-S3_Bucket=Bucket

1
src/main/resources/com/fanruan/fs/s3/repository/locale/s3_en_US.properties

@ -1,5 +1,6 @@
Plugin-S3_Input=Please Input
Plugin-S3_End_Point=Endpoint
Plugin-S3_Region=Region
Plugin-S3_Access_Key_Id=AccessKeyId
Plugin-S3_Access_Key_Secret=AccessKeySecret
Plugin-S3_Bucket=Bucket

1
src/main/resources/com/fanruan/fs/s3/repository/locale/s3_zh_CN.properties

@ -1,5 +1,6 @@
Plugin-S3_Input=\u8BF7\u8F93\u5165
Plugin-S3_End_Point=Endpoint
Plugin-S3_Region=Region
Plugin-S3_Access_Key_Id=AccessKeyId
Plugin-S3_Access_Key_Secret=AccessKeySecret
Plugin-S3_Bucket=Bucket

22
src/main/resources/com/fanruan/fs/s3/repository/web/js/bundle.js

@ -48,6 +48,22 @@ BI.config("dec.constant.intelligence.cluster.file.server", function (items) {
self.store.setEndPoint(this.getValue());
}
}]
}, {
type: "dec.label.editor.item",
textWidth: LABEL_WIDTH,
editorWidth: EDITOR_WIDTH,
watermark: BI.i18nText("Plugin-S3_Input"),
text: BI.i18nText("Plugin-S3_Region"),
value: this.model.endPoint,
ref: function (_ref) {
self.regionRow = _ref;
},
listeners: [{
eventName: BI.Editor.EVENT_CHANGE,
action: function () {
self.store.setRegion(this.getValue());
}
}]
}, {
type: "dec.label.editor.item",
textWidth: LABEL_WIDTH,
@ -99,6 +115,7 @@ BI.config("dec.constant.intelligence.cluster.file.server", function (items) {
getValue: function () {
return {
endPoint: this.model.endPoint,
region: this.model.region,
accessKeyId: this.model.accessKeyId,
accessKeySecret: this.model.accessKeySecret,
bucket: this.model.bucket
@ -117,6 +134,7 @@ BI.config("dec.constant.intelligence.cluster.file.server", function (items) {
var val = this.options.value;
return {
endPoint: val.endPoint,
region: val.region,
accessKeyId: val.accessKeyId,
accessKeySecret: val.accessKeySecret,
bucket: val.bucket
@ -138,6 +156,10 @@ BI.config("dec.constant.intelligence.cluster.file.server", function (items) {
this.model.endPoint = v;
},
setRegion: function (v) {
this.model.region = v;
},
setAccessKeyId: function (v) {
this.model.accessKeyId = v;
},

Loading…
Cancel
Save