diff --git a/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OSSApplication.java b/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OSSApplication.java deleted file mode 100644 index dd5794d50..000000000 --- a/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OSSApplication.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.springframework.cloud.alibaba.cloud.examples; - -import java.net.URISyntaxException; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -import com.aliyun.oss.OSS; - -/** - * OSS Application - * - * @author Jim - */ -@SpringBootApplication -public class OSSApplication { - - public static final String BUCKET_NAME = "spring-cloud-alibaba"; - - public static void main(String[] args) throws URISyntaxException { - SpringApplication.run(OSSApplication.class, args); - } - - @Bean - public AppRunner appRunner() { - return new AppRunner(); - } - - class AppRunner implements ApplicationRunner { - @Autowired - private OSS ossClient; - - @Override - public void run(ApplicationArguments args) throws Exception { - try { - if (!ossClient.doesBucketExist(BUCKET_NAME)) { - ossClient.createBucket(BUCKET_NAME); - } - } - catch (Exception e) { - System.err.println("oss handle bucket error: " + e.getMessage()); - System.exit(-1); - } - } - } - -} \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OSSController.java b/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OSSController.java deleted file mode 100644 index 2da11529e..000000000 --- a/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OSSController.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.springframework.cloud.alibaba.cloud.examples; - -import java.nio.charset.Charset; - -import org.apache.commons.codec.CharEncoding; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.Resource; -import org.springframework.util.StreamUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.aliyun.oss.OSS; -import com.aliyun.oss.common.utils.IOUtils; -import com.aliyun.oss.model.OSSObject; - -/** - * OSS Controller - * - * @author Jim - */ -@RestController -public class OSSController { - - @Autowired - private OSS ossClient; - - @Value("oss://" + OSSApplication.BUCKET_NAME + "/oss-test") - private Resource file; - - private String dir = "custom-dir/"; - - @GetMapping("/upload") - public String upload() { - try { - ossClient.putObject(OSSApplication.BUCKET_NAME, dir + "oss-test", this - .getClass().getClassLoader().getResourceAsStream("oss-test.json")); - } - catch (Exception e) { - e.printStackTrace(); - return "upload fail: " + e.getMessage(); - } - return "upload success"; - } - - @GetMapping("/file-resource") - public String fileResource() { - try { - return "get file resource success. content: " + StreamUtils.copyToString( - file.getInputStream(), Charset.forName(CharEncoding.UTF_8)); - } - catch (Exception e) { - e.printStackTrace(); - return "get resource fail: " + e.getMessage(); - } - } - - @GetMapping("/download") - public String download() { - try { - OSSObject ossObject = ossClient.getObject(OSSApplication.BUCKET_NAME, - dir + "oss-test"); - return "download success, content: " + IOUtils - .readStreamAsString(ossObject.getObjectContent(), CharEncoding.UTF_8); - } - catch (Exception e) { - e.printStackTrace(); - return "download fail: " + e.getMessage(); - } - } - -} \ No newline at end of file diff --git a/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OssApplication.java b/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OssApplication.java new file mode 100644 index 000000000..7997ac02e --- /dev/null +++ b/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OssApplication.java @@ -0,0 +1,51 @@ +package org.springframework.cloud.alibaba.cloud.examples; + +import java.net.URISyntaxException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +import com.aliyun.oss.OSS; + +/** + * OSS Application + * + * @author Jim + */ +@SpringBootApplication +public class OssApplication { + + public static final String BUCKET_NAME = "spring-cloud-alibaba-test"; + + public static void main(String[] args) throws URISyntaxException { + SpringApplication.run(OssApplication.class, args); + } + + @Bean + public AppRunner appRunner() { + return new AppRunner(); + } + + class AppRunner implements ApplicationRunner { + @Autowired + private OSS ossClient; + + @Override + public void run(ApplicationArguments args) throws Exception { + try { + if (!ossClient.doesBucketExist(BUCKET_NAME)) { + ossClient.createBucket(BUCKET_NAME); + } + } + catch (Exception e) { + System.err.println("oss handle bucket error: " + e.getMessage()); + System.exit(-1); + } + } + } + +} diff --git a/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OssController.java b/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OssController.java new file mode 100644 index 000000000..97623f5b4 --- /dev/null +++ b/spring-cloud-alibaba-examples/oss-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/OssController.java @@ -0,0 +1,70 @@ +package org.springframework.cloud.alibaba.cloud.examples; + +import java.nio.charset.Charset; + +import org.apache.commons.codec.CharEncoding; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.Resource; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.common.utils.IOUtils; +import com.aliyun.oss.model.OSSObject; + +/** + * OSS Controller + * + * @author Jim + */ +@RestController +public class OssController { + + @Autowired + private OSS ossClient; + + @Value("oss://" + OssApplication.BUCKET_NAME + "/oss-test.json") + private Resource file; + + @GetMapping("/upload") + public String upload() { + try { + ossClient.putObject(OssApplication.BUCKET_NAME, "oss-test.json", this + .getClass().getClassLoader().getResourceAsStream("oss-test.json")); + } + catch (Exception e) { + e.printStackTrace(); + return "upload fail: " + e.getMessage(); + } + return "upload success"; + } + + @GetMapping("/file-resource") + public String fileResource() { + try { + return "get file resource success. content: " + StreamUtils.copyToString( + file.getInputStream(), Charset.forName(CharEncoding.UTF_8)); + } + catch (Exception e) { + e.printStackTrace(); + return "get resource fail: " + e.getMessage(); + } + } + + @GetMapping("/download") + public String download() { + try { + OSSObject ossObject = ossClient.getObject(OssApplication.BUCKET_NAME, + "oss-test.json"); + return "download success, content: " + IOUtils + .readStreamAsString(ossObject.getObjectContent(), CharEncoding.UTF_8); + } + catch (Exception e) { + e.printStackTrace(); + return "download fail: " + e.getMessage(); + } + } + +} diff --git a/spring-cloud-alibaba-examples/oss-example/src/main/resources/application.properties b/spring-cloud-alibaba-examples/oss-example/src/main/resources/application.properties index af414af5e..59c650d3d 100644 --- a/spring-cloud-alibaba-examples/oss-example/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/oss-example/src/main/resources/application.properties @@ -1,8 +1,6 @@ spring.application.name=oss-example server.port=18084 - -spring.cloud.alibaba.oss.accessKeyId=[your-ak] -spring.cloud.alibaba.oss.secretAccessKey=[your-sk] -spring.cloud.alibaba.oss.region=[your-region] - -management.security.enabled=false \ No newline at end of file +spring.cloud.alicloud.access-key=AK +spring.cloud.alicloud.secret-key=SK +spring.cloud.alicloud.oss.endpoint=***.aliyuncs.com +management.endpoints.web.exposure.include=* diff --git a/spring-cloud-alicloud-oss/pom.xml b/spring-cloud-alicloud-oss/pom.xml index 72b5f8fcc..d7d224d5f 100644 --- a/spring-cloud-alicloud-oss/pom.xml +++ b/spring-cloud-alicloud-oss/pom.xml @@ -15,6 +15,11 @@ + + org.springframework.cloud + spring-cloud-alicloud-context + + com.aliyun.oss aliyun-sdk-oss diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSProperties.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSProperties.java deleted file mode 100644 index 8ea389262..000000000 --- a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSProperties.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * 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 org.springframework.cloud.alibaba.oss; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.context.properties.ConfigurationProperties; - -import com.aliyun.oss.ClientBuilderConfiguration; - -/** - * {@link ConfigurationProperties} for configuring OSS. - * - * @author Jim - */ -@ConfigurationProperties(prefix = OSSConstants.PREFIX) -public class OSSProperties { - - private static final Logger logger = LoggerFactory.getLogger(OSSProperties.class); - - public static final Map endpointMap = new HashMap<>(); - - static { - endpointMap.put("cn-beijing", "http://oss-cn-beijing.aliyuncs.com"); - endpointMap.put("cn-qingdao", "http://oss-cn-qingdao.aliyuncs.com"); - endpointMap.put("cn-hangzhou", "http://oss-cn-hangzhou.aliyuncs.com"); - endpointMap.put("cn-hongkong", "http://oss-cn-hongkong.aliyuncs.com"); - endpointMap.put("cn-shenzhen", "http://oss-cn-shenzhen.aliyuncs.com"); - endpointMap.put("us-west-1", "http://oss-us-west-1.aliyuncs.com"); - endpointMap.put("ap-southeast-1", "http://oss-ap-southeast-1.aliyuncs.com"); - } - - private ClientBuilderConfiguration configuration; - - private String accessKeyId; - - private String secretAccessKey; - - private String region; - - private String endpoint; - - // support ram sts - private String securityToken; - - public ClientBuilderConfiguration getConfiguration() { - return configuration; - } - - public void setConfiguration(ClientBuilderConfiguration configuration) { - this.configuration = configuration; - } - - public String getAccessKeyId() { - return accessKeyId; - } - - public void setAccessKeyId(String accessKeyId) { - this.accessKeyId = accessKeyId; - } - - public String getSecretAccessKey() { - return secretAccessKey; - } - - public void setSecretAccessKey(String secretAccessKey) { - this.secretAccessKey = secretAccessKey; - } - - public String getEndpoint() { - return endpoint; - } - - public void setEndpoint(String endpoint) { - this.endpoint = endpoint; - } - - public String getSecurityToken() { - return securityToken; - } - - public void setSecurityToken(String securityToken) { - this.securityToken = securityToken; - } - - public String getRegion() { - return region; - } - - public void setRegion(String region) { - if (!endpointMap.containsKey(region)) { - String errorStr = "error region: " + region + ", please choose from " - + Arrays.toString(endpointMap.keySet().toArray()); - logger.error(errorStr); - throw new IllegalArgumentException(errorStr); - } - this.region = region; - this.setEndpoint(endpointMap.get(region)); - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/endpoint/OSSEndpoint.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/endpoint/OSSEndpoint.java deleted file mode 100644 index 21809a980..000000000 --- a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/endpoint/OSSEndpoint.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * 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 org.springframework.cloud.alibaba.oss.endpoint; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.actuate.endpoint.AbstractEndpoint; -import org.springframework.context.ApplicationContext; - -import com.aliyun.oss.OSSClient; - -/** - * Actuator Endpoint to expose OSS Meta Data - * - * @author Jim - */ -public class OSSEndpoint extends AbstractEndpoint> { - - @Autowired - private ApplicationContext applicationContext; - - public OSSEndpoint() { - super("oss"); - } - - @Override - public Map invoke() { - Map result = new HashMap<>(); - - Map ossClientMap = applicationContext - .getBeansOfType(OSSClient.class); - - int size = ossClientMap.size(); - - List ossClientList = new ArrayList<>(); - - for(String beanName : ossClientMap.keySet()) { - Map ossProperties = new HashMap<>(); - OSSClient client = ossClientMap.get(beanName); - ossProperties.put("beanName", beanName); - ossProperties.put("endpoint", client.getEndpoint().toString()); - ossProperties.put("clientConfiguration", client.getClientConfiguration()); - ossProperties.put("credentials", - client.getCredentialsProvider().getCredentials()); - - String[] bucketList = new String[client.listBuckets().size()]; - - for(int index = 0; index < bucketList.length; index ++) { - bucketList[index] = client.listBuckets().get(index).getName(); - } - - ossProperties.put("bucketList", bucketList); - ossClientList.add(ossProperties); - } - - result.put("size", size); - result.put("info", ossClientList); - - return result; - } - -} \ No newline at end of file diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/resource/OSSStorageProtocolResolver.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/resource/OSSStorageProtocolResolver.java deleted file mode 100644 index 3cfc95347..000000000 --- a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/resource/OSSStorageProtocolResolver.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * 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 org.springframework.cloud.alibaba.oss.resource; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanFactoryPostProcessor; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.context.ResourceLoaderAware; -import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.io.ProtocolResolver; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; - -import com.aliyun.oss.OSS; - -/** - * A {@link ProtocolResolver} implementation for the {@code oss://} protocol. - * - * @author Jim - */ -public class OSSStorageProtocolResolver - implements ProtocolResolver, BeanFactoryPostProcessor, ResourceLoaderAware { - - public static final String PROTOCOL = "oss://"; - - private static final Logger logger = LoggerFactory - .getLogger(OSSStorageProtocolResolver.class); - - private ConfigurableListableBeanFactory beanFactory; - - private OSS oss; - - private OSS getOSS() { - if (this.oss == null) { - if (this.beanFactory.getBeansOfType(OSS.class).size() > 1) { - logger.warn( - "There are multiple OSS instances, consider marking one of them as @Primary to resolve oss protocol."); - } - this.oss = this.beanFactory.getBean(OSS.class); - } - return this.oss; - } - - @Override - public Resource resolve(String location, ResourceLoader resourceLoader) { - if (!location.startsWith(PROTOCOL)) { - return null; - } - return new OSSStorageResource(getOSS(), location); - } - - @Override - public void setResourceLoader(ResourceLoader resourceLoader) { - if (DefaultResourceLoader.class.isAssignableFrom(resourceLoader.getClass())) { - ((DefaultResourceLoader) resourceLoader).addProtocolResolver(this); - } - else { - logger.warn("The provided delegate resource loader is not an implementation " - + "of DefaultResourceLoader. Custom Protocol using oss:// prefix will not be enabled."); - } - } - - @Override - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) - throws BeansException { - this.beanFactory = beanFactory; - } -} \ No newline at end of file diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/resource/OSSStorageResource.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/resource/OSSStorageResource.java deleted file mode 100644 index 0febde6f5..000000000 --- a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/resource/OSSStorageResource.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * 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 org.springframework.cloud.alibaba.oss.resource; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; - -import org.springframework.core.io.Resource; -import org.springframework.util.Assert; - -import com.aliyun.oss.ClientException; -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSException; -import com.aliyun.oss.model.Bucket; -import com.aliyun.oss.model.OSSObject; - -/** - * Implements {@link Resource} for reading and writing objects in Aliyun Object Storage - * Service (OSS). An instance of this class represents a handle to a bucket or an OSSObject. - * - * @author Jim - * @see OSS - * @see Bucket - * @see OSSObject - */ -public class OSSStorageResource implements Resource { - - private final OSS oss; - private final String bucketName; - private final String objectKey; - private final URI location; - - public OSSStorageResource(OSS oss, String location) { - Assert.notNull(oss, "Object Storage Service can not be null"); - Assert.isTrue(location.startsWith(OSSStorageProtocolResolver.PROTOCOL), - "Location must start with " + OSSStorageProtocolResolver.PROTOCOL); - this.oss = oss; - try { - URI locationUri = new URI(location); - this.bucketName = locationUri.getAuthority(); - - if (locationUri.getPath() != null && locationUri.getPath().length() > 1) { - this.objectKey = locationUri.getPath().substring(1); - } - else { - this.objectKey = null; - } - this.location = locationUri; - } - catch (URISyntaxException e) { - throw new IllegalArgumentException("Invalid location: " + location, e); - } - } - - @Override - public boolean exists() { - try { - return isBucket() ? getBucket() != null : getOSSObject() != null; - } - catch (Exception e) { - return false; - } - } - - @Override - public boolean isReadable() { - return true; - } - - @Override - public boolean isOpen() { - return false; - } - - /** - * Since the oss: protocol will normally not have a URL stream handler registered, - * this method will always throw a {@link java.net.MalformedURLException}. - * @return The URL for the OSS resource, if a URL stream handler is registered for the - * oss protocol. - */ - @Override - public URL getURL() throws IOException { - return this.location.toURL(); - } - - @Override - public URI getURI() throws IOException { - return this.location; - } - - @Override - public File getFile() throws IOException { - throw new UnsupportedOperationException( - getDescription() + " cannot be resolved to absolute file path"); - } - - @Override - public long contentLength() throws IOException { - assertExisted(); - if (isBucket()) { - throw new FileNotFoundException("OSSObject not existed."); - } - return getOSSObject().getObjectMetadata().getContentLength(); - } - - @Override - public long lastModified() throws IOException { - assertExisted(); - if (isBucket()) { - throw new FileNotFoundException("OSSObject not existed."); - } - return getOSSObject().getObjectMetadata().getLastModified().getTime(); - } - - @Override - public Resource createRelative(String relativePath) throws IOException { - return new OSSStorageResource(this.oss, - this.location.resolve(relativePath).toString()); - } - - @Override - public String getFilename() { - return isBucket() ? this.bucketName : this.objectKey; - } - - @Override - public String getDescription() { - return this.location.toString(); - } - - @Override - public InputStream getInputStream() throws IOException { - assertExisted(); - if (isBucket()) { - throw new IllegalStateException( - "Cannot open an input stream to a bucket: '" + this.location + "'"); - } - else { - return getOSSObject().getObjectContent(); - } - } - - /** - * Returns the {@link Bucket} associated with the resource. - * @return the bucket if it exists, or null otherwise - */ - public Bucket getBucket() { - for(Bucket bucket : this.oss.listBuckets()) { - if(bucket.getName().equals(this.bucketName)) { - return bucket; - } - } - return null; - } - - /** - * Checks for the existence of the {@link Bucket} associated with the resource. - * @return true if the bucket exists - */ - public boolean bucketExists() { - return getBucket() != null; - } - - /** - * Gets the underlying resource object in Aliyun Object Storage Service. - * @return The resource object, will be null if it does not exist in Aliyun Object - * Storage Service. - * @throws OSSException it is thrown upon error when accessing OSS - * @throws ClientException it is the one thrown by the client side when accessing OSS - */ - public OSSObject getOSSObject() { - return this.oss.getObject(this.bucketName, this.objectKey); - } - - /** - * Check if this resource references a bucket and not a blob. - * @return if the resource is bucket - */ - public boolean isBucket() { - return this.objectKey == null; - } - - private void assertExisted() throws FileNotFoundException { - if (!exists()) { - throw new FileNotFoundException("Bucket or OSSObject not existed."); - } - } - -} \ No newline at end of file diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSApplicationListener.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/OssApplicationListener.java similarity index 58% rename from spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSApplicationListener.java rename to spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/OssApplicationListener.java index caf70db1c..cc3e48f7b 100644 --- a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSApplicationListener.java +++ b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/OssApplicationListener.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.alibaba.oss; +package org.springframework.cloud.alicloud.oss; import java.util.Map; @@ -26,23 +26,24 @@ import org.springframework.context.event.ContextClosedEvent; import com.aliyun.oss.OSS; /** - * Shutdown All OSS Clients when {@code ApplicationContext} gets closed {@link ApplicationListener} + * Shutdown All OSS Clients when {@code ApplicationContext} gets closed + * {@link ApplicationListener} * * @author Jim */ -public class OSSApplicationListener implements ApplicationListener { +public class OssApplicationListener implements ApplicationListener { - private static final Logger logger = LoggerFactory - .getLogger(OSSApplicationListener.class); + private static final Logger logger = LoggerFactory + .getLogger(OssApplicationListener.class); - @Override - public void onApplicationEvent(ContextClosedEvent event) { - Map ossClientMap = event.getApplicationContext() - .getBeansOfType(OSS.class); - logger.info("{} OSSClients will be shutdown soon", ossClientMap.size()); - for(String beanName : ossClientMap.keySet()) { - logger.info("shutdown ossClient: {}", beanName); - ossClientMap.get(beanName).shutdown(); - } - } -} \ No newline at end of file + @Override + public void onApplicationEvent(ContextClosedEvent event) { + Map ossClientMap = event.getApplicationContext() + .getBeansOfType(OSS.class); + logger.info("{} OSSClients will be shutdown soon", ossClientMap.size()); + for (String beanName : ossClientMap.keySet()) { + logger.info("shutdown ossClient: {}", beanName); + ossClientMap.get(beanName).shutdown(); + } + } +} diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSAutoConfiguration.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/OssAutoConfiguration.java similarity index 51% rename from spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSAutoConfiguration.java rename to spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/OssAutoConfiguration.java index 9dc684f83..f809cc7a5 100644 --- a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSAutoConfiguration.java +++ b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/OssAutoConfiguration.java @@ -14,20 +14,16 @@ * limitations under the License. */ -package org.springframework.cloud.alibaba.oss; +package org.springframework.cloud.alicloud.oss; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.alibaba.oss.resource.OSSStorageProtocolResolver; +import org.springframework.cloud.alicloud.oss.resource.OssStorageProtocolResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClientBuilder; /** * OSS Auto {@link Configuration} @@ -36,26 +32,13 @@ import com.aliyun.oss.OSSClientBuilder; */ @Configuration @ConditionalOnClass(OSS.class) -@ConditionalOnProperty(name = OSSConstants.ENABLED, havingValue = "true", matchIfMissing = true) -@EnableConfigurationProperties(OSSProperties.class) -public class OSSAutoConfiguration { +@ConditionalOnProperty(name = OssConstants.ENABLED, havingValue = "true", matchIfMissing = true) +public class OssAutoConfiguration { - private static final Logger logger = LoggerFactory - .getLogger(OSSAutoConfiguration.class); + @Bean + @ConditionalOnMissingBean + public OssStorageProtocolResolver ossStorageProtocolResolver() { + return new OssStorageProtocolResolver(); + } - @ConditionalOnMissingBean - @Bean - public OSS ossClient(OSSProperties ossProperties) { - logger.info("construct OSS because it is missing"); - return new OSSClientBuilder().build(ossProperties.getEndpoint(), - ossProperties.getAccessKeyId(), ossProperties.getSecretAccessKey(), - ossProperties.getSecurityToken(), ossProperties.getConfiguration()); - } - - @ConditionalOnMissingBean - @Bean - public OSSStorageProtocolResolver ossStorageProtocolResolver() { - return new OSSStorageProtocolResolver(); - } - -} \ No newline at end of file +} diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSConstants.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/OssConstants.java similarity index 90% rename from spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSConstants.java rename to spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/OssConstants.java index e33b5066b..e764ebacc 100644 --- a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/OSSConstants.java +++ b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/OssConstants.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package org.springframework.cloud.alibaba.oss; +package org.springframework.cloud.alicloud.oss; /** * OSS constants * * @author Jim */ -public interface OSSConstants { +public interface OssConstants { String PREFIX = "spring.cloud.alibaba.oss"; String ENABLED = PREFIX + ".enabled"; -} \ No newline at end of file +} diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/endpoint/OssEndpoint.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/endpoint/OssEndpoint.java new file mode 100644 index 000000000..b8c21b8af --- /dev/null +++ b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/endpoint/OssEndpoint.java @@ -0,0 +1,80 @@ +/* + * 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 org.springframework.cloud.alicloud.oss.endpoint; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.endpoint.AbstractEndpoint; +import org.springframework.context.ApplicationContext; + +import com.aliyun.oss.OSSClient; + +/** + * Actuator Endpoint to expose OSS Meta Data + * + * @author Jim + */ +public class OssEndpoint extends AbstractEndpoint> { + + @Autowired + private ApplicationContext applicationContext; + + public OssEndpoint() { + super("oss"); + } + + @Override + public Map invoke() { + Map result = new HashMap<>(); + + Map ossClientMap = applicationContext + .getBeansOfType(OSSClient.class); + + int size = ossClientMap.size(); + + List ossClientList = new ArrayList<>(); + + for (String beanName : ossClientMap.keySet()) { + Map ossProperties = new HashMap<>(); + OSSClient client = ossClientMap.get(beanName); + ossProperties.put("beanName", beanName); + ossProperties.put("endpoint", client.getEndpoint().toString()); + ossProperties.put("clientConfiguration", client.getClientConfiguration()); + ossProperties.put("credentials", + client.getCredentialsProvider().getCredentials()); + + String[] bucketList = new String[client.listBuckets().size()]; + + for (int index = 0; index < bucketList.length; index++) { + bucketList[index] = client.listBuckets().get(index).getName(); + } + + ossProperties.put("bucketList", bucketList); + ossClientList.add(ossProperties); + } + + result.put("size", size); + result.put("info", ossClientList); + + return result; + } + +} \ No newline at end of file diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/endpoint/OSSEndpointAutoConfiguration.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/endpoint/OssEndpointAutoConfiguration.java similarity index 76% rename from spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/endpoint/OSSEndpointAutoConfiguration.java rename to spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/endpoint/OssEndpointAutoConfiguration.java index 69c4023e4..766718f81 100644 --- a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alibaba/oss/endpoint/OSSEndpointAutoConfiguration.java +++ b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/endpoint/OssEndpointAutoConfiguration.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package org.springframework.cloud.alibaba.oss.endpoint; +package org.springframework.cloud.alicloud.oss.endpoint; import org.springframework.boot.actuate.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.alibaba.oss.OSSProperties; +import org.springframework.cloud.alicloud.context.oss.OssProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -31,14 +31,14 @@ import org.springframework.context.annotation.Configuration; * @author Jim */ @ConditionalOnClass(Endpoint.class) -@EnableConfigurationProperties({ OSSProperties.class }) -public class OSSEndpointAutoConfiguration { +@EnableConfigurationProperties({ OssProperties.class }) +public class OssEndpointAutoConfiguration { - @Bean - @ConditionalOnMissingBean - @ConditionalOnEnabledEndpoint("oss") - public OSSEndpoint sentinelEndPoint() { - return new OSSEndpoint(); - } + @Bean + @ConditionalOnMissingBean + @ConditionalOnEnabledEndpoint("oss") + public OssEndpoint sentinelEndPoint() { + return new OssEndpoint(); + } } \ No newline at end of file diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/resource/OssStorageProtocolResolver.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/resource/OssStorageProtocolResolver.java new file mode 100644 index 000000000..681f3e882 --- /dev/null +++ b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/resource/OssStorageProtocolResolver.java @@ -0,0 +1,84 @@ +/* + * 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 org.springframework.cloud.alicloud.oss.resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ResourceLoaderAware; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.ProtocolResolver; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; + +import com.aliyun.oss.OSS; + +/** + * A {@link ProtocolResolver} implementation for the {@code oss://} protocol. + * + * @author Jim + */ +public class OssStorageProtocolResolver + implements ProtocolResolver, BeanFactoryPostProcessor, ResourceLoaderAware { + + public static final String PROTOCOL = "oss://"; + + private static final Logger logger = LoggerFactory + .getLogger(OssStorageProtocolResolver.class); + + private ConfigurableListableBeanFactory beanFactory; + + private OSS oss; + + private OSS getOSS() { + if (this.oss == null) { + if (this.beanFactory.getBeansOfType(OSS.class).size() > 1) { + logger.warn( + "There are multiple OSS instances, consider marking one of them as @Primary to resolve oss protocol."); + } + this.oss = this.beanFactory.getBean(OSS.class); + } + return this.oss; + } + + @Override + public Resource resolve(String location, ResourceLoader resourceLoader) { + if (!location.startsWith(PROTOCOL)) { + return null; + } + return new OssStorageResource(getOSS(), location); + } + + @Override + public void setResourceLoader(ResourceLoader resourceLoader) { + if (DefaultResourceLoader.class.isAssignableFrom(resourceLoader.getClass())) { + ((DefaultResourceLoader) resourceLoader).addProtocolResolver(this); + } + else { + logger.warn("The provided delegate resource loader is not an implementation " + + "of DefaultResourceLoader. Custom Protocol using oss:// prefix will not be enabled."); + } + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) + throws BeansException { + this.beanFactory = beanFactory; + } +} diff --git a/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/resource/OssStorageResource.java b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/resource/OssStorageResource.java new file mode 100644 index 000000000..c8900152d --- /dev/null +++ b/spring-cloud-alicloud-oss/src/main/java/org/springframework/cloud/alicloud/oss/resource/OssStorageResource.java @@ -0,0 +1,211 @@ +/* + * 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 org.springframework.cloud.alicloud.oss.resource; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.List; + +import org.springframework.core.io.Resource; +import org.springframework.util.Assert; + +import com.aliyun.oss.ClientException; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSException; +import com.aliyun.oss.model.Bucket; +import com.aliyun.oss.model.OSSObject; + +/** + * Implements {@link Resource} for reading and writing objects in Aliyun Object Storage + * Service (OSS). An instance of this class represents a handle to a bucket or an + * OSSObject. + * + * @author Jim + * @see OSS + * @see Bucket + * @see OSSObject + */ +public class OssStorageResource implements Resource { + + private final OSS oss; + private final String bucketName; + private final String objectKey; + private final URI location; + + public OssStorageResource(OSS oss, String location) { + Assert.notNull(oss, "Object Storage Service can not be null"); + Assert.isTrue(location.startsWith(OssStorageProtocolResolver.PROTOCOL), + "Location must start with " + OssStorageProtocolResolver.PROTOCOL); + this.oss = oss; + try { + URI locationUri = new URI(location); + this.bucketName = locationUri.getAuthority(); + + if (locationUri.getPath() != null && locationUri.getPath().length() > 1) { + this.objectKey = locationUri.getPath().substring(1); + } + else { + this.objectKey = null; + } + this.location = locationUri; + } + catch (URISyntaxException e) { + throw new IllegalArgumentException("Invalid location: " + location, e); + } + } + + @Override + public boolean exists() { + try { + return isBucket() ? getBucket() != null : getOSSObject() != null; + } + catch (Exception e) { + return false; + } + } + + @Override + public boolean isReadable() { + return true; + } + + @Override + public boolean isOpen() { + return false; + } + + /** + * Since the oss: protocol will normally not have a URL stream handler registered, + * this method will always throw a {@link java.net.MalformedURLException}. + * @return The URL for the OSS resource, if a URL stream handler is registered for the + * oss protocol. + */ + @Override + public URL getURL() throws IOException { + return this.location.toURL(); + } + + @Override + public URI getURI() throws IOException { + return this.location; + } + + @Override + public File getFile() throws IOException { + throw new UnsupportedOperationException( + getDescription() + " cannot be resolved to absolute file path"); + } + + @Override + public long contentLength() throws IOException { + assertExisted(); + if (isBucket()) { + throw new FileNotFoundException("OSSObject not existed."); + } + return getOSSObject().getObjectMetadata().getContentLength(); + } + + @Override + public long lastModified() throws IOException { + assertExisted(); + if (isBucket()) { + throw new FileNotFoundException("OSSObject not existed."); + } + return getOSSObject().getObjectMetadata().getLastModified().getTime(); + } + + @Override + public Resource createRelative(String relativePath) throws IOException { + return new OssStorageResource(this.oss, + this.location.resolve(relativePath).toString()); + } + + @Override + public String getFilename() { + return isBucket() ? this.bucketName : this.objectKey; + } + + @Override + public String getDescription() { + return this.location.toString(); + } + + @Override + public InputStream getInputStream() throws IOException { + assertExisted(); + if (isBucket()) { + throw new IllegalStateException( + "Cannot open an input stream to a bucket: '" + this.location + "'"); + } + else { + return getOSSObject().getObjectContent(); + } + } + + /** + * Returns the {@link Bucket} associated with the resource. + * @return the bucket if it exists, or null otherwise + */ + public Bucket getBucket() { + List buckets = this.oss.listBuckets(); + for (Bucket bucket : buckets) { + if (bucket.getName().equals(this.bucketName)) { + return bucket; + } + } + return null; + } + + /** + * Checks for the existence of the {@link Bucket} associated with the resource. + * @return true if the bucket exists + */ + public boolean bucketExists() { + return getBucket() != null; + } + + /** + * Gets the underlying resource object in Aliyun Object Storage Service. + * @return The resource object, will be null if it does not exist in Aliyun Object + * Storage Service. + * @throws OSSException it is thrown upon error when accessing OSS + * @throws ClientException it is the one thrown by the client side when accessing OSS + */ + public OSSObject getOSSObject() { + return this.oss.getObject(this.bucketName, this.objectKey); + } + + /** + * Check if this resource references a bucket and not a blob. + * @return if the resource is bucket + */ + public boolean isBucket() { + return this.objectKey == null; + } + + private void assertExisted() throws FileNotFoundException { + if (!exists()) { + throw new FileNotFoundException("Bucket or OSSObject not existed."); + } + } + +} diff --git a/spring-cloud-alicloud-oss/src/main/resources/META-INF/spring.factories b/spring-cloud-alicloud-oss/src/main/resources/META-INF/spring.factories index 4f71c2da2..598bc2166 100644 --- a/spring-cloud-alicloud-oss/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alicloud-oss/src/main/resources/META-INF/spring.factories @@ -1,5 +1,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.cloud.alibaba.oss.OSSAutoConfiguration,\ -org.springframework.cloud.alibaba.oss.endpoint.OSSEndpointAutoConfiguration +org.springframework.cloud.alicloud.oss.OssAutoConfiguration,\ +org.springframework.cloud.alicloud.oss.endpoint.OssEndpointAutoConfiguration org.springframework.context.ApplicationListener=\ -org.springframework.cloud.alibaba.oss.OSSApplicationListener \ No newline at end of file +org.springframework.cloud.alicloud.oss.OssApplicationListener \ No newline at end of file diff --git a/spring-cloud-alicloud-oss/src/test/java/org/springframework/cloud/alibaba/oss/OSSAutoConfigurationTests.java b/spring-cloud-alicloud-oss/src/test/java/org/springframework/cloud/alibaba/oss/OSSAutoConfigurationTests.java deleted file mode 100644 index ea658e34b..000000000 --- a/spring-cloud-alicloud-oss/src/test/java/org/springframework/cloud/alibaba/oss/OSSAutoConfigurationTests.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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 org.springframework.cloud.alibaba.oss; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Before; -import org.junit.Test; -import org.springframework.boot.test.util.EnvironmentTestUtils; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; - -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClient; - -/** - * {@link OSS} {@link OSSProperties} Test - * - * @author Jim - */ -public class OSSAutoConfigurationTests { - - private final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - - @Before - public void init() { - context.register(OSSAutoConfiguration.class); - EnvironmentTestUtils.addEnvironment(this.context, - "spring.cloud.alibaba.oss.accessKeyId=your-ak", - "spring.cloud.alibaba.oss.secretAccessKey=your-sk", - "spring.cloud.alibaba.oss.endpoint=http://oss-cn-beijing.aliyuncs.com", - "spring.cloud.alibaba.oss.configuration.userAgent=alibaba"); - this.context.refresh(); - } - - @Test - public void testOSSProperties() { - OSSProperties ossProperties = context.getBean(OSSProperties.class); - assertThat(ossProperties.getAccessKeyId()).isEqualTo("your-ak"); - assertThat(ossProperties.getSecretAccessKey()).isEqualTo("your-sk"); - assertThat(ossProperties.getEndpoint()) - .isEqualTo("http://oss-cn-beijing.aliyuncs.com"); - assertThat(ossProperties.getConfiguration().getUserAgent()).isEqualTo("alibaba"); - } - - @Test - public void testOSSClient() { - assertThat(context.getBeansOfType(OSS.class).size()).isEqualTo(1); - assertThat(context.getBeanNamesForType(OSS.class)[0]).isEqualTo("ossClient"); - OSSClient ossClient = (OSSClient) context.getBean(OSS.class); - assertThat(ossClient.getCredentialsProvider().getCredentials().getAccessKeyId()) - .isEqualTo("your-ak"); - assertThat( - ossClient.getCredentialsProvider().getCredentials().getSecretAccessKey()) - .isEqualTo("your-sk"); - assertThat(ossClient.getEndpoint().toString()) - .isEqualTo("http://oss-cn-beijing.aliyuncs.com"); - assertThat(ossClient.getClientConfiguration().getUserAgent()) - .isEqualTo("alibaba"); - } - -} \ No newline at end of file diff --git a/spring-cloud-alicloud-oss/src/test/java/org/springframework/cloud/alibaba/oss/OSSMultiClientAutoConfigurationTests.java b/spring-cloud-alicloud-oss/src/test/java/org/springframework/cloud/alibaba/oss/OSSMultiClientAutoConfigurationTests.java deleted file mode 100644 index 68939cf23..000000000 --- a/spring-cloud-alicloud-oss/src/test/java/org/springframework/cloud/alibaba/oss/OSSMultiClientAutoConfigurationTests.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * 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 org.springframework.cloud.alibaba.oss; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.Before; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.test.util.EnvironmentTestUtils; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClient; -import com.aliyun.oss.OSSClientBuilder; - -/** - * Multi {@link OSS} {@link OSSProperties} Test - * - * @author Jim - */ -public class OSSMultiClientAutoConfigurationTests { - - private final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - - @Before - public void init() { - context.register(MultiClientConfiguration.class); - EnvironmentTestUtils.addEnvironment(this.context, - "spring.cloud.alibaba.oss.accessKeyId=your-ak", - "spring.cloud.alibaba.oss.secretAccessKey=your-sk", - "spring.cloud.alibaba.oss.endpoint=http://oss-cn-beijing.aliyuncs.com", - "spring.cloud.alibaba.oss.configuration.userAgent=alibaba", - "spring.cloud.alibaba.oss1.accessKeyId=your-ak1", - "spring.cloud.alibaba.oss1.secretAccessKey=your-sk1", - "spring.cloud.alibaba.oss1.endpoint=http://oss-cn-beijing.aliyuncs.com", - "spring.cloud.alibaba.oss1.configuration.userAgent=alibaba1"); - this.context.refresh(); - } - - @Test - public void testOSSClient() { - assertThat(context.getBeansOfType(OSS.class).size()).isEqualTo(2); - OSSClient ossClient = (OSSClient) context.getBean("ossClient1", OSS.class); - assertThat(ossClient.getCredentialsProvider().getCredentials().getAccessKeyId()) - .isEqualTo("your-ak"); - assertThat( - ossClient.getCredentialsProvider().getCredentials().getSecretAccessKey()) - .isEqualTo("your-sk"); - assertThat(ossClient.getEndpoint().toString()) - .isEqualTo("http://oss-cn-beijing.aliyuncs.com"); - assertThat(ossClient.getClientConfiguration().getUserAgent()) - .isEqualTo("alibaba"); - OSSClient ossClient1 = (OSSClient) context.getBean("ossClient2", OSS.class); - assertThat(ossClient1.getCredentialsProvider().getCredentials().getAccessKeyId()) - .isEqualTo("your-ak1"); - assertThat( - ossClient1.getCredentialsProvider().getCredentials().getSecretAccessKey()) - .isEqualTo("your-sk1"); - assertThat(ossClient1.getEndpoint().toString()) - .isEqualTo("http://oss-cn-beijing.aliyuncs.com"); - assertThat(ossClient1.getClientConfiguration().getUserAgent()) - .isEqualTo("alibaba1"); - } - - @Configuration - @EnableConfigurationProperties - protected static class MultiClientConfiguration { - - @Bean - @ConfigurationProperties(prefix = "spring.cloud.alibaba.oss") - public OSSProperties ossProperties1() { - return new OSSProperties(); - } - - @Bean - public OSS ossClient1(@Qualifier("ossProperties1") OSSProperties ossProperties) { - return new OSSClientBuilder().build(ossProperties.getEndpoint(), - ossProperties.getAccessKeyId(), ossProperties.getSecretAccessKey(), - ossProperties.getSecurityToken(), ossProperties.getConfiguration()); - } - - @Bean - @ConfigurationProperties(prefix = "spring.cloud.alibaba.oss1") - public OSSProperties ossProperties2() { - return new OSSProperties(); - } - - @Bean - public OSS ossClient2(@Qualifier("ossProperties2") OSSProperties ossProperties) { - return new OSSClientBuilder().build(ossProperties.getEndpoint(), - ossProperties.getAccessKeyId(), ossProperties.getSecretAccessKey(), - ossProperties.getSecurityToken(), ossProperties.getConfiguration()); - } - - } - -} \ No newline at end of file