Skip to content

Commit 2d8cdbf

Browse files
committed
Merge branch 'master' of github.com:aliyun/aliyun-oss-java-sdk
2 parents 4e6240c + bf5ba31 commit 2d8cdbf

25 files changed

+874
-83
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
<groupId>com.aliyun.oss</groupId>
1313
<artifactId>aliyun-sdk-oss</artifactId>
14-
<version>2.3.0</version>
14+
<version>2.4.0-SNAPSHOT</version>
1515
<packaging>jar</packaging>
1616
<name>Aliyun OSS SDK for Java</name>
1717
<description>The Aliyun OSS SDK for Java used for accessing Aliyun Object Storage Service</description>

src/main/java/com/aliyun/oss/OSS.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.aliyun.oss.model.CreateBucketRequest;
5050
import com.aliyun.oss.model.CreateLiveChannelRequest;
5151
import com.aliyun.oss.model.CreateLiveChannelResult;
52+
import com.aliyun.oss.model.CreateSymlinkRequest;
5253
import com.aliyun.oss.model.DeleteBucketCnameRequest;
5354
import com.aliyun.oss.model.DeleteBucketReplicationRequest;
5455
import com.aliyun.oss.model.DeleteObjectsRequest;
@@ -69,6 +70,7 @@
6970
import com.aliyun.oss.model.LiveChannelStat;
7071
import com.aliyun.oss.model.LiveChannelStatus;
7172
import com.aliyun.oss.model.LiveRecord;
73+
import com.aliyun.oss.model.OSSSymlink;
7274
import com.aliyun.oss.model.ReplicationRule;
7375
import com.aliyun.oss.model.GetImageStyleResult;
7476
import com.aliyun.oss.model.GetObjectRequest;
@@ -1658,4 +1660,44 @@ public String generateRtmpUri(String bucketName, String liveChannelName, String
16581660
public String generateRtmpUri(GenerateRtmpUriRequest generatePushflowUrlRequest)
16591661
throws OSSException, ClientException;
16601662

1663+
/**
1664+
1665+
* @param bucketName Bucket名称。
1666+
* @param symlink 符号链接。
1667+
* @param target 目标文件。
1668+
* @throws OSSException OSS Server异常信息。
1669+
* @throws ClientException OSS Client异常信息。
1670+
*/
1671+
public void createSymlink(String bucketName, String symlink, String target)
1672+
throws OSSException, ClientException;
1673+
/**
1674+
* 创建符号链接。
1675+
* @param createSymlinkRequest 创建符号链接请求。
1676+
* @throws OSSException OSS Server异常信息。
1677+
* @throws ClientException OSS Client异常信息。
1678+
*/
1679+
public void createSymlink(CreateSymlinkRequest createSymlinkRequest)
1680+
throws OSSException, ClientException;
1681+
1682+
/**
1683+
* 获取符号链接的相关信息。
1684+
* @param bucketName Bucket名称。
1685+
* @param symlink 符号链接。
1686+
* @return 符号链接相关的信息,包括目标文件等。
1687+
* @throws OSSException OSS Server异常信息。
1688+
* @throws ClientException OSS Client异常信息。
1689+
*/
1690+
public OSSSymlink getSymlink(String bucketName, String symlink)
1691+
throws OSSException, ClientException;
1692+
1693+
/**
1694+
* 获取符号链接的相关信息。
1695+
* @param genericRequest 请求,包括bucketName、symLink。
1696+
* @return 符号链接相关的信息,包括目标文件等。
1697+
* @throws OSSException OSS Server异常信息。
1698+
* @throws ClientException OSS Client异常信息。
1699+
*/
1700+
public OSSSymlink getSymlink(GenericRequest genericRequest)
1701+
throws OSSException, ClientException;
1702+
16611703
}

src/main/java/com/aliyun/oss/OSSClient.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
import com.aliyun.oss.model.CreateBucketRequest;
9696
import com.aliyun.oss.model.CreateLiveChannelRequest;
9797
import com.aliyun.oss.model.CreateLiveChannelResult;
98+
import com.aliyun.oss.model.CreateSymlinkRequest;
9899
import com.aliyun.oss.model.DeleteBucketCnameRequest;
99100
import com.aliyun.oss.model.DeleteBucketReplicationRequest;
100101
import com.aliyun.oss.model.DeleteObjectsRequest;
@@ -127,6 +128,7 @@
127128
import com.aliyun.oss.model.LiveRecord;
128129
import com.aliyun.oss.model.MultipartUploadListing;
129130
import com.aliyun.oss.model.OSSObject;
131+
import com.aliyun.oss.model.OSSSymlink;
130132
import com.aliyun.oss.model.ObjectAcl;
131133
import com.aliyun.oss.model.ObjectListing;
132134
import com.aliyun.oss.model.ObjectMetadata;
@@ -1400,6 +1402,31 @@ public String generateRtmpUri(GenerateRtmpUriRequest generateRtmpUriRequest)
14001402
return liveChannelOperation.generateRtmpUri(generateRtmpUriRequest);
14011403
}
14021404

1405+
@Override
1406+
public void createSymlink(String bucketName, String symLink, String targetObject)
1407+
throws OSSException, ClientException {
1408+
this.createSymlink(new CreateSymlinkRequest(
1409+
bucketName, symLink, targetObject));
1410+
}
1411+
1412+
@Override
1413+
public void createSymlink(CreateSymlinkRequest createSymlinkRequest)
1414+
throws OSSException, ClientException {
1415+
objectOperation.createSymlink(createSymlinkRequest);
1416+
}
1417+
1418+
@Override
1419+
public OSSSymlink getSymlink(String bucketName, String symLink)
1420+
throws OSSException, ClientException {
1421+
return this.getSymlink(new GenericRequest(bucketName, symLink));
1422+
}
1423+
1424+
@Override
1425+
public OSSSymlink getSymlink(GenericRequest genericRequest)
1426+
throws OSSException, ClientException {
1427+
return objectOperation.getSymlink(genericRequest);
1428+
}
1429+
14031430
@Override
14041431
public void shutdown() {
14051432
try {

src/main/java/com/aliyun/oss/OSSErrorCode.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,5 +238,10 @@ public interface OSSErrorCode {
238238
* Live channel不存在。
239239
*/
240240
static final String NO_SUCH_LIVE_CHANNEL = "NoSuchLiveChannel";
241-
241+
242+
/**
243+
* 连接的目标文件不存在
244+
*/
245+
static final String NO_SUCH_SYM_LINK_TARGET = "SymlinkTargetNotExist";
246+
242247
}

src/main/java/com/aliyun/oss/internal/OSSHeaders.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,5 +72,7 @@ public interface OSSHeaders extends HttpHeaders {
7272

7373
static final String OSS_HEADER_CALLBACK = "x-oss-callback";
7474
static final String OSS_HEADER_CALLBACK_VAR = "x-oss-callback-var";
75+
76+
static final String OSS_HEADER_SYMLINK_TARGET = "x-oss-symlink-target";
7577

7678
}

src/main/java/com/aliyun/oss/internal/OSSObjectOperation.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import static com.aliyun.oss.internal.RequestParameters.SUBRESOURCE_ACL;
4949
import static com.aliyun.oss.internal.RequestParameters.SUBRESOURCE_DELETE;
5050
import static com.aliyun.oss.internal.RequestParameters.SUBRESOURCE_OBJECTMETA;
51+
import static com.aliyun.oss.internal.RequestParameters.SUBRESOURCE_SYMLINK;
5152
import static com.aliyun.oss.internal.ResponseParsers.appendObjectResponseParser;
5253
import static com.aliyun.oss.internal.ResponseParsers.copyObjectResponseParser;
5354
import static com.aliyun.oss.internal.ResponseParsers.deleteObjectsResponseParser;
@@ -56,6 +57,9 @@
5657
import static com.aliyun.oss.internal.ResponseParsers.putObjectReponseParser;
5758
import static com.aliyun.oss.internal.ResponseParsers.putObjectCallbackReponseParser;
5859
import static com.aliyun.oss.internal.ResponseParsers.getSimplifiedObjectMetaResponseParser;
60+
import static com.aliyun.oss.internal.ResponseParsers.getSymbolicLinkResponseParser;
61+
62+
5963

6064
import java.io.BufferedOutputStream;
6165
import java.io.ByteArrayInputStream;
@@ -102,12 +106,14 @@
102106
import com.aliyun.oss.model.CannedAccessControlList;
103107
import com.aliyun.oss.model.CopyObjectRequest;
104108
import com.aliyun.oss.model.CopyObjectResult;
109+
import com.aliyun.oss.model.CreateSymlinkRequest;
105110
import com.aliyun.oss.model.DeleteObjectsRequest;
106111
import com.aliyun.oss.model.DeleteObjectsResult;
107112
import com.aliyun.oss.model.GenericRequest;
108113
import com.aliyun.oss.model.GetObjectRequest;
109114
import com.aliyun.oss.model.HeadObjectRequest;
110115
import com.aliyun.oss.model.OSSObject;
116+
import com.aliyun.oss.model.OSSSymlink;
111117
import com.aliyun.oss.model.ObjectAcl;
112118
import com.aliyun.oss.model.ObjectMetadata;
113119
import com.aliyun.oss.model.PutObjectRequest;
@@ -536,6 +542,76 @@ public ObjectAcl getObjectAcl(GenericRequest genericRequest)
536542
return doOperation(request, getObjectAclResponseParser, bucketName, key, true);
537543
}
538544

545+
public OSSSymlink getSymlink(GenericRequest genericRequest)
546+
throws OSSException, ClientException {
547+
assertParameterNotNull(genericRequest, "genericRequest");
548+
549+
String bucketName = genericRequest.getBucketName();
550+
String symlink = genericRequest.getKey();
551+
552+
assertParameterNotNull(bucketName, "bucketName");
553+
assertParameterNotNull(symlink, "symlink");
554+
ensureBucketNameValid(bucketName);
555+
ensureObjectKeyValid(symlink);
556+
557+
Map<String, String> params = new HashMap<String, String>();
558+
params.put(SUBRESOURCE_SYMLINK, null);
559+
560+
RequestMessage request = new OSSRequestMessageBuilder(getInnerClient())
561+
.setEndpoint(getEndpoint())
562+
.setMethod(HttpMethod.GET)
563+
.setBucket(bucketName)
564+
.setKey(symlink)
565+
.setParameters(params)
566+
.setOriginalRequest(genericRequest)
567+
.build();
568+
569+
OSSSymlink symbolicLink = doOperation(
570+
request, getSymbolicLinkResponseParser, bucketName, symlink, true);
571+
572+
if (symbolicLink != null) {
573+
symbolicLink.setSymlink(new String(symlink));
574+
}
575+
576+
return symbolicLink;
577+
}
578+
579+
public void createSymlink(CreateSymlinkRequest createSymlinkRequest)
580+
throws OSSException, ClientException {
581+
582+
assertParameterNotNull(createSymlinkRequest, "createSymlinkRequest");
583+
584+
String bucketName = createSymlinkRequest.getBucketName();
585+
String symlink = createSymlinkRequest.getSymlink();
586+
String target = createSymlinkRequest.getTarget();
587+
588+
assertParameterNotNull(bucketName, "bucketName");
589+
assertParameterNotNull(symlink, "symlink");
590+
assertParameterNotNull(target, "target");
591+
ensureBucketNameValid(bucketName);
592+
ensureObjectKeyValid(symlink);
593+
ensureObjectKeyValid(target);
594+
595+
Map<String, String> headers = new HashMap<String, String>();
596+
String encodeTargetObject = HttpUtil.urlEncode(target, DEFAULT_CHARSET_NAME);
597+
headers.put(OSSHeaders.OSS_HEADER_SYMLINK_TARGET, encodeTargetObject);
598+
599+
Map<String, String> params = new HashMap<String, String>();
600+
params.put(SUBRESOURCE_SYMLINK, null);
601+
602+
RequestMessage request = new OSSRequestMessageBuilder(getInnerClient())
603+
.setEndpoint(getEndpoint())
604+
.setMethod(HttpMethod.PUT)
605+
.setBucket(bucketName)
606+
.setKey(symlink)
607+
.setHeaders(headers)
608+
.setParameters(params)
609+
.setOriginalRequest(createSymlinkRequest)
610+
.build();
611+
612+
doOperation(request, emptyResponseParser, bucketName, symlink);
613+
}
614+
539615
private static enum MetadataDirective {
540616

541617
/* Copy metadata from source object */

src/main/java/com/aliyun/oss/internal/OSSUtils.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
import com.aliyun.oss.ClientConfiguration;
4040
import com.aliyun.oss.common.comm.ResponseMessage;
41+
import com.aliyun.oss.common.utils.BinaryUtil;
4142
import com.aliyun.oss.common.utils.CodingUtils;
4243
import com.aliyun.oss.common.utils.DateUtil;
4344
import com.aliyun.oss.common.utils.HttpUtil;
@@ -453,18 +454,16 @@ public static void ensureCallbackValid(Callback callback) {
453454
/**
454455
* 回调参数放入消息头
455456
*/
456-
@SuppressWarnings("restriction")
457457
public static void populateRequestCallback(Map<String, String> headers, Callback callback) {
458458
if (callback != null) {
459459
String jsonCb = jsonizeCallback(callback);
460-
String base64Cb = (new sun.misc.BASE64Encoder()).encode(jsonCb.getBytes());
461-
// Java的base64库会76后字符后加上换行,这个行为不是我们希望的,去除换行
462-
base64Cb = base64Cb.replaceAll("\n", "").replaceAll("\r", "");
460+
String base64Cb = BinaryUtil.toBase64String(jsonCb.getBytes());
461+
463462
headers.put(OSSHeaders.OSS_HEADER_CALLBACK, base64Cb);
464463

465464
if (callback.hasCallbackVar()) {
466465
String jsonCbVar = jsonizeCallbackVar(callback);
467-
String base64CbVar = (new sun.misc.BASE64Encoder()).encode(jsonCbVar.getBytes());
466+
String base64CbVar = BinaryUtil.toBase64String(jsonCbVar.getBytes());
468467
base64CbVar = base64CbVar.replaceAll("\n", "").replaceAll("\r", "");
469468
headers.put(OSSHeaders.OSS_HEADER_CALLBACK_VAR, base64CbVar);
470469
}

src/main/java/com/aliyun/oss/internal/RequestParameters.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public final class RequestParameters {
4949
public static final String SUBRESOURCE_END_TIME = "endTime";
5050
public static final String SUBRESOURCE_PROCESS_CONF = "processConfiguration";
5151
public static final String SUBRESOURCE_PROCESS = "x-oss-process";
52+
public static final String SUBRESOURCE_SYMLINK = "symlink";
5253

5354
public static final String PREFIX = "prefix";
5455
public static final String DELIMITER = "delimiter";

src/main/java/com/aliyun/oss/internal/ResponseParsers.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.aliyun.oss.common.parser.ResponseParseException;
4242
import com.aliyun.oss.common.parser.ResponseParser;
4343
import com.aliyun.oss.common.utils.DateUtil;
44+
import com.aliyun.oss.common.utils.HttpUtil;
4445
import com.aliyun.oss.model.AccessControlList;
4546
import com.aliyun.oss.model.AppendObjectResult;
4647
import com.aliyun.oss.model.Bucket;
@@ -69,6 +70,7 @@
6970
import com.aliyun.oss.model.LiveChannelStat.VideoStat;
7071
import com.aliyun.oss.model.LiveChannelStatus;
7172
import com.aliyun.oss.model.LiveChannelTarget;
73+
import com.aliyun.oss.model.OSSSymlink;
7274
import com.aliyun.oss.model.ReplicationRule;
7375
import com.aliyun.oss.model.GetImageStyleResult;
7476
import com.aliyun.oss.model.GroupGrantee;
@@ -146,6 +148,8 @@ public final class ResponseParsers {
146148
public static final GetLiveChannelHistoryResponseParser getLiveChannelHistoryResponseParser = new GetLiveChannelHistoryResponseParser();
147149
public static final ListLiveChannelsReponseParser listLiveChannelsReponseParser = new ListLiveChannelsReponseParser();
148150

151+
public static final GetSymbolicLinkResponseParser getSymbolicLinkResponseParser = new GetSymbolicLinkResponseParser();
152+
149153
public static final class EmptyResponseParser implements ResponseParser<ResponseMessage> {
150154

151155
@Override
@@ -769,6 +773,20 @@ public UploadPartCopyResult parse(ResponseMessage response)
769773

770774
}
771775

776+
public static final class GetSymbolicLinkResponseParser implements ResponseParser<OSSSymlink> {
777+
778+
@Override
779+
public OSSSymlink parse(ResponseMessage response)
780+
throws ResponseParseException {
781+
try {
782+
return parseSymbolicLink(response.getHeaders());
783+
} finally {
784+
OSSUtils.mandatoryCloseResponse(response);
785+
}
786+
}
787+
788+
}
789+
772790
public static <ResultType extends GenericResult> void setCRC64(ResultType result,
773791
ResponseMessage response) {
774792
InputStream inputStream = response.getRequest().getContent();
@@ -1114,6 +1132,27 @@ public static SimplifiedObjectMeta parseSimplifiedObjectMeta(Map<String, String>
11141132
throw new ResponseParseException(e.getMessage(), e);
11151133
}
11161134
}
1135+
1136+
/**
1137+
* Unmarshall symbolic link from response headers.
1138+
*/
1139+
public static OSSSymlink parseSymbolicLink(Map<String, String> headers)
1140+
throws ResponseParseException {
1141+
1142+
try {
1143+
OSSSymlink smyLink = null;
1144+
String targetObject = headers.get(OSSHeaders.OSS_HEADER_SYMLINK_TARGET);
1145+
1146+
if (targetObject != null) {
1147+
targetObject = HttpUtil.urlDecode(targetObject, "UTF-8");
1148+
smyLink = new OSSSymlink(null, targetObject);
1149+
}
1150+
1151+
return smyLink;
1152+
} catch (Exception e) {
1153+
throw new ResponseParseException(e.getMessage(), e);
1154+
}
1155+
}
11171156

11181157
/**
11191158
* Unmarshall object metadata from response headers.

src/main/java/com/aliyun/oss/internal/SignUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import static com.aliyun.oss.internal.RequestParameters.SUBRESOURCE_END_TIME;
5252
import static com.aliyun.oss.internal.RequestParameters.SUBRESOURCE_PROCESS_CONF;
5353
import static com.aliyun.oss.internal.RequestParameters.SUBRESOURCE_PROCESS;
54+
import static com.aliyun.oss.internal.RequestParameters.SUBRESOURCE_SYMLINK;
5455
import static com.aliyun.oss.internal.RequestParameters.UPLOAD_ID;
5556
import static com.aliyun.oss.internal.RequestParameters.SUBRESOURCE_QOS;
5657
import static com.aliyun.oss.model.ResponseHeaderOverrides.RESPONSE_HEADER_CACHE_CONTROL;
@@ -87,7 +88,7 @@ public class SignUtils {
8788
SUBRESOURCE_BUCKET_INFO, SUBRESOURCE_COMP, SUBRESOURCE_QOS,
8889
SUBRESOURCE_LIVE, SUBRESOURCE_STATUS, SUBRESOURCE_VOD,
8990
SUBRESOURCE_START_TIME, SUBRESOURCE_END_TIME, SUBRESOURCE_PROCESS,
90-
SUBRESOURCE_PROCESS_CONF,
91+
SUBRESOURCE_PROCESS_CONF, SUBRESOURCE_SYMLINK,
9192
});
9293

9394
public static String buildCanonicalString(String method, String resourcePath,

0 commit comments

Comments
 (0)