1
0
mirror of https://gitee.com/mirrors/Spring-Cloud-Alibaba.git synced 2021-06-26 13:25:11 +08:00

Add missing Apache 2 License

This commit is contained in:
lichen782 2019-09-10 14:24:00 +08:00
parent 9edab1215b
commit 0de7efabd4
3 changed files with 264 additions and 218 deletions

View File

@ -216,6 +216,10 @@ public class OssStorageResource implements WritableResource {
} }
} }
/**
* create a bucket.
* @return
*/
public Bucket createBucket() { public Bucket createBucket() {
return this.oss.createBucket(this.bucketName); return this.oss.createBucket(this.bucketName);
} }
@ -226,33 +230,37 @@ public class OssStorageResource implements WritableResource {
} }
/** /**
* 获取一个OutputStream用于写操作 * acquire an OutputStream for write.
* 注意写完成后必须关闭该流 * Note: please close the stream after writing is done
* @return * @return
* @throws IOException * @throws IOException
*/ */
@Override @Override
public OutputStream getOutputStream() throws IOException { public OutputStream getOutputStream() throws IOException {
if (isBucket()) { if (isBucket()) {
throw new IllegalStateException( throw new IllegalStateException(
"Cannot open an output stream to a bucket: '" + getURI() + "'"); "Cannot open an output stream to a bucket: '" + getURI() + "'");
} }
else { else {
OSSObject ossObject; OSSObject ossObject;
try { try {
ossObject = this.getOSSObject(); ossObject = this.getOSSObject();
} catch (OSSException ex) { }
if (ex.getMessage() != null && ex.getMessage().startsWith(MESSAGE_KEY_NOT_EXIST)) { catch (OSSException ex) {
ossObject = null; if (ex.getMessage() != null
} else { && ex.getMessage().startsWith(MESSAGE_KEY_NOT_EXIST)) {
throw ex; ossObject = null;
}
else {
throw ex;
} }
} }
if (ossObject == null ) { if (ossObject == null) {
if (!this.autoCreateFiles) { if (!this.autoCreateFiles) {
throw new FileNotFoundException("The object was not found: " + getURI()); throw new FileNotFoundException(
"The object was not found: " + getURI());
} }
} }
@ -263,7 +271,8 @@ public class OssStorageResource implements WritableResource {
executorService.submit(() -> { executorService.submit(() -> {
try { try {
OssStorageResource.this.oss.putObject(bucketName, objectKey, in); OssStorageResource.this.oss.putObject(bucketName, objectKey, in);
} catch (Exception ex) { }
catch (Exception ex) {
logger.error("Failed to put object", ex); logger.error("Failed to put object", ex);
} }
}); });

View File

@ -1,3 +1,19 @@
/*
* Copyright (C) 2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.alicloud.oss.resource; package com.alibaba.alicloud.oss.resource;
import com.aliyun.oss.model.Bucket; import com.aliyun.oss.model.Bucket;
@ -14,67 +30,69 @@ import java.util.concurrent.ConcurrentHashMap;
/** /**
* @author lich * @author lich
* @date 2019/8/30
*/ */
public class DummyOssClient { public class DummyOssClient {
private Map<String, byte[]> storeMap = new ConcurrentHashMap<>(); private Map<String, byte[]> storeMap = new ConcurrentHashMap<>();
private Map<String, Bucket> bucketSet = new HashMap<>(); private Map<String, Bucket> bucketSet = new HashMap<>();
public String getStoreKey(String bucketName, String objectKey) { public String getStoreKey(String bucketName, String objectKey) {
return String.join(".", bucketName, objectKey); return String.join(".", bucketName, objectKey);
} }
public PutObjectResult putObject(String bucketName, String objectKey, InputStream inputStream) { public PutObjectResult putObject(String bucketName, String objectKey,
InputStream inputStream) {
try { try {
byte[] result = StreamUtils.copyToByteArray(inputStream); byte[] result = StreamUtils.copyToByteArray(inputStream);
storeMap.put(getStoreKey(bucketName, objectKey), result); storeMap.put(getStoreKey(bucketName, objectKey), result);
} catch (IOException ex) { }
throw new RuntimeException(ex); catch (IOException ex) {
} finally { throw new RuntimeException(ex);
try { }
inputStream.close(); finally {
} catch (IOException ex) { try {
throw new RuntimeException(ex); inputStream.close();
} }
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
return new PutObjectResult();
}
return new PutObjectResult(); public OSSObject getOSSObject(String bucketName, String objectKey) {
} byte[] value = storeMap.get(this.getStoreKey(bucketName, objectKey));
if (value == null) {
return null;
}
OSSObject ossObject = new OSSObject();
ossObject.setBucketName(bucketName);
ossObject.setKey(objectKey);
InputStream inputStream = new ByteArrayInputStream(value);
ossObject.setObjectContent(inputStream);
public OSSObject getOSSObject(String bucketName, String objectKey) { ObjectMetadata objectMetadata = new ObjectMetadata();
byte[] value = storeMap.get(this.getStoreKey(bucketName, objectKey)); objectMetadata.setContentLength(value.length);
if (value == null) { ossObject.setObjectMetadata(objectMetadata);
return null;
}
OSSObject ossObject = new OSSObject();
ossObject.setBucketName(bucketName);
ossObject.setKey(objectKey);
InputStream inputStream = new ByteArrayInputStream(value);
ossObject.setObjectContent(inputStream);
ObjectMetadata objectMetadata = new ObjectMetadata(); return ossObject;
objectMetadata.setContentLength(value.length); }
ossObject.setObjectMetadata(objectMetadata);
return ossObject; public Bucket createBucket(String bucketName) {
} if (bucketSet.containsKey(bucketName)) {
return bucketSet.get(bucketName);
}
Bucket bucket = new Bucket();
bucket.setCreationDate(new Date());
bucket.setName(bucketName);
bucketSet.put(bucketName, bucket);
return bucket;
}
public Bucket createBucket(String bucketName) { public List<Bucket> bucketList() {
if (bucketSet.containsKey(bucketName)) { return new ArrayList<>(bucketSet.values());
return bucketSet.get(bucketName); }
}
Bucket bucket = new Bucket();
bucket.setCreationDate(new Date());
bucket.setName(bucketName);
bucketSet.put(bucketName, bucket);
return bucket;
}
public List<Bucket> bucketList() {
return new ArrayList<>(bucketSet.values());
}
} }

View File

@ -1,7 +1,22 @@
/*
* Copyright (C) 2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.alicloud.oss.resource; package com.alibaba.alicloud.oss.resource;
import com.aliyun.oss.OSS; import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.IOUtils;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
@ -19,7 +34,6 @@ import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.StreamUtils; import org.springframework.util.StreamUtils;
import java.io.*; import java.io.*;
import java.nio.charset.Charset;
import java.util.Random; import java.util.Random;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -28,200 +42,205 @@ import static org.mockito.Mockito.mock;
/** /**
* @author lich * @author lich
* @date 2019/8/29
*/ */
@SpringBootTest @SpringBootTest
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
public class OssStorageResourceTest { public class OssStorageResourceTest {
/** /**
* Used to test exception messages and types. * Used to test exception messages and types.
*/ */
@Rule @Rule
public ExpectedException expectedEx = ExpectedException.none(); public ExpectedException expectedEx = ExpectedException.none();
@Autowired @Autowired
private OSS oss; private OSS oss;
@Value("oss://aliyun-test-bucket/") @Value("oss://aliyun-test-bucket/")
private Resource bucketResource; private Resource bucketResource;
@Value("oss://aliyun-test-bucket/myfilekey") @Value("oss://aliyun-test-bucket/myfilekey")
private Resource remoteResource; private Resource remoteResource;
public static byte[] generateRandomBytes(int blen) { public static byte[] generateRandomBytes(int blen) {
byte[] array = new byte[blen]; byte[] array = new byte[blen];
new Random().nextBytes(array); new Random().nextBytes(array);
return array; return array;
} }
@Test @Test
public void testResourceType() { public void testResourceType() {
assertEquals(OssStorageResource.class, remoteResource.getClass()); assertEquals(OssStorageResource.class, remoteResource.getClass());
OssStorageResource ossStorageResource = (OssStorageResource)remoteResource; OssStorageResource ossStorageResource = (OssStorageResource) remoteResource;
assertEquals("myfilekey", ossStorageResource.getFilename()); assertEquals("myfilekey", ossStorageResource.getFilename());
assertFalse(ossStorageResource.isBucket()); assertFalse(ossStorageResource.isBucket());
} }
@Test @Test
public void testValidObject() throws Exception { public void testValidObject() throws Exception {
assertTrue(remoteResource.exists()); assertTrue(remoteResource.exists());
OssStorageResource ossStorageResource = (OssStorageResource)remoteResource; OssStorageResource ossStorageResource = (OssStorageResource) remoteResource;
assertTrue(ossStorageResource.bucketExists()); assertTrue(ossStorageResource.bucketExists());
assertEquals(4096L, remoteResource.contentLength()); assertEquals(4096L, remoteResource.contentLength());
assertEquals("oss://aliyun-test-bucket/myfilekey", remoteResource.getURI().toString()); assertEquals("oss://aliyun-test-bucket/myfilekey",
assertEquals("myfilekey", remoteResource.getFilename()); remoteResource.getURI().toString());
} assertEquals("myfilekey", remoteResource.getFilename());
}
@Test @Test
public void testBucketResource() throws Exception { public void testBucketResource() throws Exception {
assertTrue(bucketResource.exists()); assertTrue(bucketResource.exists());
assertTrue(((OssStorageResource)this.bucketResource).isBucket()); assertTrue(((OssStorageResource) this.bucketResource).isBucket());
assertTrue(((OssStorageResource)this.bucketResource).bucketExists()); assertTrue(((OssStorageResource) this.bucketResource).bucketExists());
assertEquals("oss://aliyun-test-bucket/", bucketResource.getURI().toString()); assertEquals("oss://aliyun-test-bucket/", bucketResource.getURI().toString());
assertEquals("aliyun-test-bucket", this.bucketResource.getFilename()); assertEquals("aliyun-test-bucket", this.bucketResource.getFilename());
} }
@Test @Test
public void testBucketNotEndingInSlash() { public void testBucketNotEndingInSlash() {
assertTrue(new OssStorageResource(this.oss, "oss://aliyun-test-bucket").isBucket()); assertTrue(
} new OssStorageResource(this.oss, "oss://aliyun-test-bucket").isBucket());
}
@Test @Test
public void testSpecifyPathCorrect() { public void testSpecifyPathCorrect() {
OssStorageResource ossStorageResource = new OssStorageResource ( OssStorageResource ossStorageResource = new OssStorageResource(this.oss,
this.oss, "oss://aliyun-test-bucket/myfilekey", false); "oss://aliyun-test-bucket/myfilekey", false);
assertTrue(ossStorageResource.exists()); assertTrue(ossStorageResource.exists());
} }
@Test @Test
public void testSpecifyBucketCorrect() { public void testSpecifyBucketCorrect() {
OssStorageResource ossStorageResource = new OssStorageResource( OssStorageResource ossStorageResource = new OssStorageResource(this.oss,
this.oss, "oss://aliyun-test-bucket", false); "oss://aliyun-test-bucket", false);
assertTrue(ossStorageResource.isBucket()); assertTrue(ossStorageResource.isBucket());
assertEquals("aliyun-test-bucket", ossStorageResource.getBucket().getName()); assertEquals("aliyun-test-bucket", ossStorageResource.getBucket().getName());
assertTrue(ossStorageResource.exists()); assertTrue(ossStorageResource.exists());
} }
@Test @Test
public void testBucketOutputStream() throws IOException { public void testBucketOutputStream() throws IOException {
this.expectedEx.expect(IllegalStateException.class); this.expectedEx.expect(IllegalStateException.class);
this.expectedEx.expectMessage("Cannot open an output stream to a bucket: 'oss://aliyun-test-bucket/'"); this.expectedEx.expectMessage(
((WritableResource) this.bucketResource).getOutputStream(); "Cannot open an output stream to a bucket: 'oss://aliyun-test-bucket/'");
} ((WritableResource) this.bucketResource).getOutputStream();
}
@Test @Test
public void testBucketInputStream() throws IOException { public void testBucketInputStream() throws IOException {
this.expectedEx.expect(IllegalStateException.class); this.expectedEx.expect(IllegalStateException.class);
this.expectedEx.expectMessage("Cannot open an input stream to a bucket: 'oss://aliyun-test-bucket/'"); this.expectedEx.expectMessage(
this.bucketResource.getInputStream(); "Cannot open an input stream to a bucket: 'oss://aliyun-test-bucket/'");
} this.bucketResource.getInputStream();
}
@Test @Test
public void testBucketContentLength() throws IOException { public void testBucketContentLength() throws IOException {
this.expectedEx.expect(FileNotFoundException.class); this.expectedEx.expect(FileNotFoundException.class);
this.expectedEx.expectMessage("OSSObject not existed."); this.expectedEx.expectMessage("OSSObject not existed.");
this.bucketResource.contentLength(); this.bucketResource.contentLength();
} }
@Test @Test
public void testBucketFile() throws IOException { public void testBucketFile() throws IOException {
this.expectedEx.expect(UnsupportedOperationException.class); this.expectedEx.expect(UnsupportedOperationException.class);
this.expectedEx.expectMessage("oss://aliyun-test-bucket/ cannot be resolved to absolute file path"); this.expectedEx.expectMessage(
this.bucketResource.getFile(); "oss://aliyun-test-bucket/ cannot be resolved to absolute file path");
} this.bucketResource.getFile();
}
@Test @Test
public void testBucketLastModified() throws IOException { public void testBucketLastModified() throws IOException {
this.expectedEx.expect(FileNotFoundException.class); this.expectedEx.expect(FileNotFoundException.class);
this.expectedEx.expectMessage("OSSObject not existed."); this.expectedEx.expectMessage("OSSObject not existed.");
this.bucketResource.lastModified(); this.bucketResource.lastModified();
} }
@Test @Test
public void testBucketResourceStatuses() { public void testBucketResourceStatuses() {
assertFalse(this.bucketResource.isOpen()); assertFalse(this.bucketResource.isOpen());
assertFalse(((WritableResource) this.bucketResource).isWritable()); assertFalse(((WritableResource) this.bucketResource).isWritable());
assertTrue(this.bucketResource.exists()); assertTrue(this.bucketResource.exists());
} }
@Test @Test
public void testWritable() throws Exception { public void testWritable() throws Exception {
assertTrue(this.remoteResource instanceof WritableResource); assertTrue(this.remoteResource instanceof WritableResource);
WritableResource writableResource = (WritableResource) this.remoteResource; WritableResource writableResource = (WritableResource) this.remoteResource;
assertTrue(writableResource.isWritable()); assertTrue(writableResource.isWritable());
writableResource.getOutputStream(); writableResource.getOutputStream();
} }
@Test @Test
public void testWritableOutputStream() throws Exception { public void testWritableOutputStream() throws Exception {
String location = "oss://aliyun-test-bucket/test"; String location = "oss://aliyun-test-bucket/test";
OssStorageResource resource = new OssStorageResource(this.oss, location, true); OssStorageResource resource = new OssStorageResource(this.oss, location, true);
OutputStream os = resource.getOutputStream(); OutputStream os = resource.getOutputStream();
assertNotNull(os); assertNotNull(os);
byte[] randomBytes = generateRandomBytes(1203); byte[] randomBytes = generateRandomBytes(1203);
String expectedString = new String(randomBytes); String expectedString = new String(randomBytes);
os.write(randomBytes); os.write(randomBytes);
os.close(); os.close();
InputStream in = resource.getInputStream(); InputStream in = resource.getInputStream();
byte[] result = StreamUtils.copyToByteArray(in); byte[] result = StreamUtils.copyToByteArray(in);
String actualString = new String(result); String actualString = new String(result);
assertEquals(expectedString, actualString); assertEquals(expectedString, actualString);
} }
@Test
public void testCreateBucket() {
String location = "oss://my-new-test-bucket/";
OssStorageResource resource = new OssStorageResource(this.oss, location, true);
resource.createBucket();
/** assertTrue(resource.bucketExists());
* Configuration for the tests.
*/
@Configuration
@Import(OssStorageProtocolResolver.class)
static class TestConfiguration {
@Bean }
public static OSS mockOSS() {
DummyOssClient dummyOssStub = new DummyOssClient();
OSS oss = mock(OSS.class);
doAnswer(invocation -> /**
dummyOssStub.putObject( * Configuration for the tests.
invocation.getArgument(0), */
invocation.getArgument(1), @Configuration
invocation.getArgument(2) @Import(OssStorageProtocolResolver.class)
)) static class TestConfiguration {
.when(oss).putObject(Mockito.anyString(), Mockito.anyString(), Mockito.any(InputStream.class));
doAnswer(invocation -> @Bean
dummyOssStub.getOSSObject( public static OSS mockOSS() {
invocation.getArgument(0), DummyOssClient dummyOssStub = new DummyOssClient();
invocation.getArgument(1) OSS oss = mock(OSS.class);
))
.when(oss).getObject(Mockito.anyString(), Mockito.anyString());
doAnswer(invocation -> dummyOssStub.bucketList()) doAnswer(invocation -> dummyOssStub.putObject(invocation.getArgument(0),
.when(oss).listBuckets(); invocation.getArgument(1), invocation.getArgument(2))).when(oss)
.putObject(Mockito.anyString(), Mockito.anyString(),
Mockito.any(InputStream.class));
doAnswer(invocation -> dummyOssStub.createBucket(invocation.getArgument(0))) doAnswer(invocation -> dummyOssStub.getOSSObject(invocation.getArgument(0),
.when(oss).createBucket(Mockito.anyString()); invocation.getArgument(1))).when(oss).getObject(Mockito.anyString(),
Mockito.anyString());
// prepare object doAnswer(invocation -> dummyOssStub.bucketList()).when(oss).listBuckets();
dummyOssStub.createBucket("aliyun-test-bucket");
byte[] content = generateRandomBytes(4096); doAnswer(invocation -> dummyOssStub.createBucket(invocation.getArgument(0)))
ByteArrayInputStream inputStream = new ByteArrayInputStream(content); .when(oss).createBucket(Mockito.anyString());
dummyOssStub.putObject("aliyun-test-bucket", "myfilekey", inputStream);
return oss; // prepare object
} dummyOssStub.createBucket("aliyun-test-bucket");
} byte[] content = generateRandomBytes(4096);
ByteArrayInputStream inputStream = new ByteArrayInputStream(content);
dummyOssStub.putObject("aliyun-test-bucket", "myfilekey", inputStream);
return oss;
}
}
} }