1 /*
2 * Copyright 2009-2017 Alibaba Cloud All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18 #include <alibabacloud/oss/model/GetBucketLifecycleResult.h>
19 #include <external/tinyxml2/tinyxml2.h>
20 #include "utils/Utils.h"
21 using namespace AlibabaCloud::OSS;
22 using namespace tinyxml2;
23
24
GetBucketLifecycleResult()25 GetBucketLifecycleResult::GetBucketLifecycleResult() :
26 OssResult()
27 {
28 }
29
GetBucketLifecycleResult(const std::string & result)30 GetBucketLifecycleResult::GetBucketLifecycleResult(const std::string& result):
31 GetBucketLifecycleResult()
32 {
33 *this = result;
34 }
35
GetBucketLifecycleResult(const std::shared_ptr<std::iostream> & result)36 GetBucketLifecycleResult::GetBucketLifecycleResult(const std::shared_ptr<std::iostream>& result):
37 GetBucketLifecycleResult()
38 {
39 std::istreambuf_iterator<char> isb(*result.get()), end;
40 std::string str(isb, end);
41 *this = str;
42 }
43
operator =(const std::string & result)44 GetBucketLifecycleResult& GetBucketLifecycleResult::operator =(const std::string& result)
45 {
46 XMLDocument doc;
47 XMLError xml_err;
48 if ((xml_err = doc.Parse(result.c_str(), result.size())) == XML_SUCCESS) {
49 XMLElement* root =doc.RootElement();
50 if (root && !std::strncmp("LifecycleConfiguration", root->Name(), 22)) {
51 XMLElement *rule_node = root->FirstChildElement("Rule");
52 for (; rule_node; rule_node = rule_node->NextSiblingElement("Rule")) {
53 LifecycleRule rule;
54 XMLElement *node;
55 node = rule_node->FirstChildElement("ID");
56 if (node && node->GetText()) rule.setID(node->GetText());
57
58 node = rule_node->FirstChildElement("Prefix");
59 if (node && node->GetText()) rule.setPrefix(node->GetText());
60
61 node = rule_node->FirstChildElement("Status");
62 if (node && node->GetText()) rule.setStatus(ToRuleStatusType(node->GetText()));
63
64 node = rule_node->FirstChildElement("Expiration");
65 if (node) {
66 XMLElement *subNode;
67 //Days
68 subNode = node->FirstChildElement("Days");
69 if (subNode && subNode->GetText()) {
70 rule.Expiration().setDays(std::stoi(subNode->GetText(), nullptr, 10));
71 }
72 //CreatedBeforeDate
73 subNode = node->FirstChildElement("CreatedBeforeDate");
74 if (subNode && subNode->GetText()) {
75 rule.Expiration().setCreatedBeforeDate(subNode->GetText());
76 }
77 //ExpiredObjectDeleteMarker
78 subNode = node->FirstChildElement("ExpiredObjectDeleteMarker");
79 if (subNode && subNode->GetText()) {
80 rule.setExpiredObjectDeleteMarker(!std::strncmp("true", subNode->GetText(), 4));
81 }
82 }
83
84 node = rule_node->FirstChildElement("Transition");
85 for (; node; node = node->NextSiblingElement("Transition")) {
86 LifeCycleTransition transiton;
87 XMLElement *subNode;
88 //Days
89 subNode = node->FirstChildElement("Days");
90 if (subNode && subNode->GetText()) {
91 transiton.Expiration().setDays(std::stoi(subNode->GetText(), nullptr, 10));
92 }
93 //CreatedBeforeDate
94 subNode = node->FirstChildElement("CreatedBeforeDate");
95 if (subNode && subNode->GetText()) {
96 transiton.Expiration().setCreatedBeforeDate(subNode->GetText());
97 }
98 //StorageClass
99 subNode = node->FirstChildElement("StorageClass");
100 if (subNode && subNode->GetText()) {
101 transiton.setStorageClass(ToStorageClassType(subNode->GetText()));
102 }
103 rule.addTransition(transiton);
104 }
105
106 node = rule_node->FirstChildElement("AbortMultipartUpload");
107 if (node) {
108 XMLElement *subNode;
109 //Days
110 subNode = node->FirstChildElement("Days");
111 if (subNode && subNode->GetText()) {
112 rule.AbortMultipartUpload().setDays(std::stoi(subNode->GetText(), nullptr, 10));
113 }
114 //CreatedBeforeDate
115 subNode = node->FirstChildElement("CreatedBeforeDate");
116 if (subNode && subNode->GetText()) {
117 rule.AbortMultipartUpload().setCreatedBeforeDate(subNode->GetText());
118 }
119 }
120
121 node = rule_node->FirstChildElement("Tag");
122 for (; node; node = node->NextSiblingElement("Tag")) {
123 Tag tag;
124 XMLElement *subNode;
125 //Key
126 subNode = node->FirstChildElement("Key");
127 if (subNode && subNode->GetText()) {
128 tag.setKey(subNode->GetText());
129 }
130 //Value
131 subNode = node->FirstChildElement("Value");
132 if (subNode && subNode->GetText()) {
133 tag.setValue(subNode->GetText());
134 }
135 rule.addTag(tag);
136 }
137
138 node = rule_node->FirstChildElement("NoncurrentVersionExpiration");
139 if (node) {
140 XMLElement *subNode;
141 //Days
142 subNode = node->FirstChildElement("NoncurrentDays");
143 if (subNode && subNode->GetText()) {
144 rule.NoncurrentVersionExpiration().setDays(std::stoi(subNode->GetText(), nullptr, 10));
145 }
146 }
147
148 node = rule_node->FirstChildElement("NoncurrentVersionTransition");
149 for (; node; node = node->NextSiblingElement("NoncurrentVersionTransition")) {
150 LifeCycleTransition transiton;
151 XMLElement *subNode;
152 //Days
153 subNode = node->FirstChildElement("NoncurrentDays");
154 if (subNode && subNode->GetText()) {
155 transiton.Expiration().setDays(std::stoi(subNode->GetText(), nullptr, 10));
156 }
157 //StorageClass
158 subNode = node->FirstChildElement("StorageClass");
159 if (subNode && subNode->GetText()) {
160 transiton.setStorageClass(ToStorageClassType(subNode->GetText()));
161 }
162 rule.addNoncurrentVersionTransition(transiton);
163 }
164
165 lifecycleRuleList_.emplace_back(std::move(rule));
166 }
167 parseDone_ = true;
168 }
169 }
170 return *this;
171 }
172