Skip to content

Commit bda9e62

Browse files
author
吴炳亨
authored
Merge pull request #299 from NigelWu95/dev
Dev
2 parents 4a1810c + ebcfd62 commit bda9e62

25 files changed

+285
-129
lines changed

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
version=8.4.2
1+
version=8.4.3
22

33
package_no_test:
4-
mvn package -Dmaven.test.skip=true
4+
mvn clean package -Dmaven.test.skip=true
55

66
deploy_no_test:
77
mvn clean deploy -P release -Dmaven.test.skip=true

README.md

+11-11
Original file line numberDiff line numberDiff line change
@@ -205,19 +205,19 @@ qsuits -path=qiniu://<bucket> -ak=<ak> -sk=<sk>
205205
1、**基本字段过滤**和 2、**特殊特征匹配过滤**
206206
#### 基本字段过滤
207207
根据设置的字段条件进行筛选,多个条件时需同时满足才保留,若存在记录不包该字段信息时则正向规则下不保留,反正规则下保留,字段包含:
208-
`f-prefix=` 表示**选择**文件名符合该前缀的文件
209-
`f-suffix=` 表示**选择**文件名符合该后缀的文件
210-
`f-inner=` 表示**选择**文件名包含该部分字符的文件
211-
`f-regex=` 表示**选择**文件名符合该正则表达式的文件,所填内容必须为正则表达式
212-
`f-mime=` 表示**选择**符合该 mime 类型的文件
213-
`f-type=` 表示**选择**符合该存储类型的文件,参下述[关于 f-type](#关于-f-type)|
208+
`f-prefix=` 表示**选择**文件名符合该前缀的文件,支持多个用 "," 分隔
209+
`f-suffix=` 表示**选择**文件名符合该后缀的文件,支持多个用 "," 分隔
210+
`f-inner=` 表示**选择**文件名包含该部分字符的文件,支持多个用 "," 分隔
211+
`f-regex=` 表示**选择**文件名符合该正则表达式的文件,所填内容必须为正则表达式,支持多个用 "," 分隔
212+
`f-mime=` 表示**选择**符合该 mime 类型的文件,支持多个用 "," 分隔
213+
`f-type=` 表示**选择**符合该存储类型的文件,参下述[关于 f-type](#关于-f-type),支持多个用 "," 分隔
214214
`f-status=` 表示**选择**符合该存储状态的文件, 为 0(启用) 或 1(禁用)
215215
`f-date-scale` 设置过滤的时间范围,格式为 [\<date1\>,\<date2\>]\<date\> 格式为:yyyy-MM-DD HH:MM:SS,如 `f-date-scale="[0,2018-08-01 12:30:00]"` [特殊规则](#f-date-scale)
216-
`f-anti-prefix=` 表示**排除**文件名符合该前缀的文件
217-
`f-anti-suffix=` 表示**排除**文件名符合该后缀的文件
218-
`f-anti-inner=` 表示**排除**文件名包含该部分字符的文件
219-
`f-anti-regex=` 表示**排除**文件名符合该正则表达式的文件,所填内容必须为正则表达式
220-
`f-anti-mime=` 表示**排除**该 mime 类型的文件
216+
`f-anti-prefix=` 表示**排除**文件名符合该前缀的文件,支持多个用 "," 分隔
217+
`f-anti-suffix=` 表示**排除**文件名符合该后缀的文件,支持多个用 "," 分隔
218+
`f-anti-inner=` 表示**排除**文件名包含该部分字符的文件,支持多个用 "," 分隔
219+
`f-anti-regex=` 表示**排除**文件名符合该正则表达式的文件,所填内容必须为正则表达式,支持多个用 "," 分隔
220+
`f-anti-mime=` 表示**排除**该 mime 类型的文件,支持多个用 "," 分隔
221221
`f-strict-error=` true/false,是否使用严格错误模式,默认为 false,为 true 表示对基础字段过滤到不匹配的行抛出异常或记录为 not_match 的结果(filter_not_match_xxx.txt)
222222

223223
#### 关于 f-type

docs/filter.md

+11-11
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,19 @@ f-check-rewrite=
2727
```
2828
|参数名|参数值及类型 | 含义|
2929
|-----|-------|-----|
30-
|f-prefix| ","分隔的字符串列表| 表示**选择**文件名符合该前缀的文件|
31-
|f-suffix| ","分隔的字符串列表| 表示**选择**文件名符合该后缀的文件|
32-
|f-inner| ","分隔的字符串列表| 表示**选择**文件名包含该部分字符的文件|
33-
|f-regex| ","分隔的字符串列表| 表示**选择**文件名符合该正则表达式的文件,所填内容必须为正则表达式|
34-
|f-mime| ","分隔的字符串列表| 表示**选择**符合该 mime 类型的文件|
35-
|f-type| 存储类型值| 表示**选择**符合该存储类型的文件,参考[关于 f-type](#关于-f-type)|
30+
|f-prefix| 字符串| 表示**选择**文件名符合该前缀的文件,支持多个用 "," 分隔|
31+
|f-suffix| 字符串| 表示**选择**文件名符合该后缀的文件,支持多个用 "," 分隔|
32+
|f-inner| 字符串| 表示**选择**文件名包含该部分字符的文件,支持多个用 "," 分隔|
33+
|f-regex| 字符串| 表示**选择**文件名符合该正则表达式的文件,所填内容必须为正则表达式,支持多个用 "," 分隔|
34+
|f-mime| mime 字符串| 表示**选择**符合该 mime 类型的文件,支持多个用 "," 分隔|
35+
|f-type| 存储类型值| 表示**选择**符合该存储类型的文件,参考[关于 f-type](#关于-f-type),支持多个用 "," 分隔|
3636
|f-status| 0/1| 表示**选择**符合该存储状态的文件, 为 0(启用)或 1(禁用)|
3737
|f-date-scale| 字符串| 设置过滤的时间范围,格式为 [\<date1\>,\<date2\>]\<date\> 格式为:2018-08-01 00:00:00,如 `f-date-scale="[0,2018-08-01 12:30:00]"` [特殊规则](#f-date-scale)|
38-
|f-anti-prefix| ","分隔的字符串列表| 表示**排除**文件名符合该前缀的文件|
39-
|f-anti-suffix| ","分隔的字符串列表| 表示**排除**文件名符合该后缀的文件|
40-
|f-anti-inner| ","分隔的字符串列表| 表示**排除**文件名包含该部分字符的文件|
41-
|f-anti-regex| ","分隔的字符串列表| 表示**排除**文件名符合该正则表达式的文件,所填内容必须为正则表达式|
42-
|f-anti-mime| ","分隔的字符串列表| 表示**排除**该 mime 类型的文件|
38+
|f-anti-prefix| 字符串| 表示**排除**文件名符合该前缀的文件,支持多个用 "," 分隔|
39+
|f-anti-suffix| 字符串| 表示**排除**文件名符合该后缀的文件,支持多个用 "," 分隔|
40+
|f-anti-inner| 字符串| 表示**排除**文件名包含该部分字符的文件,支持多个用 "," 分隔|
41+
|f-anti-regex| 字符串| 表示**排除**文件名符合该正则表达式的文件,所填内容必须为正则表达式,支持多个用 "," 分隔|
42+
|f-anti-mime| mime 字符串| 表示**排除**该 mime 类型的文件,支持多个用 "," 分隔|
4343
|f-strict-error| true/false| 严格错误模式,默认为 false,为 true 表示对基础字段过滤到不匹配的行抛出异常或记录为 not_match 的结果(filter_not_match_xxx.txt)|
4444
|f-check|字符串| 是否进行字段关联匹配性检查,不符合规范的疑似异常文件将被筛选出来|
4545
|f-check-config|配置文件路径字符串| 自定义资源字段规范对应关系列表的配置文件,格式为 json|

docs/metadata.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ cond.[]=
3030

3131
### 命令行参数方式
3232
```
33-
-path= -process=metadata -ak= -sk= -bucket= -meta.Cache-Control=no store ...
33+
-path= -process=metadata -ak= -sk= -bucket= -meta.Cache-Control="no store" ...
3434
```
3535

docs/restorear.md

-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ ak=
1717
sk=
1818
bucket=
1919
days=
20-
cond.[]=
2120
```
2221
|参数名|参数值及类型 | 含义|
2322
|-----|-------|-----|
@@ -26,7 +25,6 @@ cond.[]=
2625
|bucket| 字符串| 操作的资源原空间,当数据源为 qiniu 时无需再设置|
2726
|indexes|字符串| 设置输入行中 key 字段的下标(有默认值),参考[数据源 indexes 设置](datasource.md#1-公共参数)|
2827
|days| 整型数字| 设置解冻的有效期为 days(单位天数),范围 1-7 天|
29-
|cond.[]| 字符串| 可以设置一些操作时的 condition,cond 当前支持设置 hash、mime、fsize、putTime 条件,只有条件匹配才会执行修改操作,如 cond.mime=text/plain|
3028

3129
运行参数:`-config=config.txt`
3230

pom.xml

+5-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.qiniu</groupId>
88
<artifactId>qsuits</artifactId>
9-
<version>8.4.2</version>
9+
<version>8.4.3</version>
1010
<name>qsuits</name>
1111
<description>qiniu-suits is a efficient tools for qiniu api implemented by java8.</description>
1212
<url>https://github.com/NigelWu95/qiniu-suits-java</url>
@@ -63,12 +63,12 @@
6363
<dependency>
6464
<groupId>org.apache.logging.log4j</groupId>
6565
<artifactId>log4j-api</artifactId>
66-
<version>2.12.1</version>
66+
<version>2.13.2</version>
6767
</dependency>
6868
<dependency>
6969
<groupId>org.apache.logging.log4j</groupId>
7070
<artifactId>log4j-core</artifactId>
71-
<version>2.10.0</version>
71+
<version>2.13.2</version>
7272
</dependency>
7373
<dependency>
7474
<groupId>org.apache.logging.log4j</groupId>
@@ -437,7 +437,8 @@
437437
<!--<targetPath>resources/</targetPath>-->
438438
<includes>
439439
<include>check.json</include>
440-
<include>log4j2.properties</include>
440+
<include>log4j2.xml</include>
441+
<!-- <include>log4j2.properties</include>-->
441442
</includes>
442443
</resource>
443444
</resources>

qsuits.iml

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.2" level="project" />
1818
<orderEntry type="library" name="Maven: commons-io:commons-io:1.3.2" level="project" />
1919
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.28" level="project" />
20-
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.12.1" level="project" />
21-
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-core:2.10.0" level="project" />
20+
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.2" level="project" />
21+
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-core:2.13.2" level="project" />
2222
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-slf4j-impl:2.10.0" level="project" />
2323
<orderEntry type="library" name="Maven: com.qcloud:cos_api:5.5.1" level="project" />
2424
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.3" level="project" />

resources/log4j2.xml

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Configuration status="error" strict="true" name="XMLConfig">
3+
4+
<Filter type="ThresholdFilter" level="debug"/>
5+
6+
<Appenders>
7+
<Appender type="Console" name="STDOUT">
8+
<Layout type="PatternLayout" pattern="[%d{yyyy-MM-dd'T'HH:mm:ss.SSS}] %m%n"/>
9+
</Appender>
10+
<Appender type="File" name="procedure" fileName="${sys:procedure}.log" append="false">
11+
<Filters>
12+
<Filter type="ThresholdFilter" level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
13+
</Filters>
14+
</Appender>
15+
<Appender type="File" name="info" fileName="${sys:qsuits}.info" append="false">
16+
<Layout type="PatternLayout" pattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %m%n"/>
17+
<Filters>
18+
<Filter type="ThresholdFilter" level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
19+
</Filters>
20+
</Appender>
21+
<Appender type="File" name="error" fileName="${sys:qsuits}.error" append="false">
22+
<Layout type="PatternLayout" pattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %m%n"/>
23+
<Filters>
24+
<Filter type="ThresholdFilter" level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
25+
</Filters>
26+
</Appender>
27+
</Appenders>
28+
29+
<Loggers>
30+
<Logger name="procedure" level="info" additivity="false">
31+
<AppenderRef ref="procedure"/>
32+
</Logger>
33+
<Logger name="info" level="info">
34+
<AppenderRef ref="info"/>
35+
</Logger>
36+
<Logger name="error" level="error">
37+
<AppenderRef ref="error"/>
38+
</Logger>
39+
<Root level="info">
40+
<AppenderRef ref="STDOUT"/>
41+
</Root>
42+
</Loggers>
43+
44+
</Configuration>

src/main/java/com/qiniu/config/PropertiesFile.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.qiniu.util.FileUtils;
44

55
import java.io.*;
6+
import java.nio.charset.StandardCharsets;
67
import java.util.Properties;
78
import java.util.Set;
89

@@ -21,7 +22,7 @@ public PropertiesFile(String resourceName) throws IOException {
2122
}
2223
if (inputStream == null) throw new IOException(resourceName + " may be not exists.");
2324
properties = new Properties();
24-
properties.load(new InputStreamReader(new BufferedInputStream(inputStream), "utf-8"));
25+
properties.load(new InputStreamReader(new BufferedInputStream(inputStream), StandardCharsets.UTF_8));
2526
} finally {
2627
if (inputStream != null) {
2728
try {

src/main/java/com/qiniu/entry/CommonParams.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -239,14 +239,20 @@ public CommonParams(Map<String, String> paramsMap) throws Exception {
239239
case "delete":
240240
case "status":
241241
case "lifecycle":
242+
case "type":
243+
case "mirror":
244+
case "restorear":
245+
case "metadata":
242246
if (!fromLine) mapLine.put("key", entryParam.getValue("key", entryParam.getParamsMap().containsKey("key") ? "" : null));
243247
break;
244248
case "copy":
245249
case "move":
246250
case "rename":
247251
if (!fromLine) mapLine.put("key", entryParam.getValue("key", entryParam.getParamsMap().containsKey("key") ? "" : null));
248-
indexMap.put("toKey", "toKey");
249-
mapLine.put("toKey", entryParam.getValue("to-key", entryParam.getParamsMap().containsKey("to-key") ? "" : null));
252+
if (entryParam.getParamsMap().containsKey("to-key")) {
253+
indexMap.put("toKey", "toKey");
254+
mapLine.put("toKey", entryParam.getValue("to-key", ""));
255+
}
250256
break;
251257
case "stat":
252258
if (!fromLine) mapLine.put("key", entryParam.getValue("key", entryParam.getParamsMap().containsKey("key") ? "" : null));
@@ -883,11 +889,12 @@ private void setBaseFilter() throws Exception {
883889
List<String> antiKeyInnerList = Arrays.asList(ParamsUtils.escapeSplit(antiKeyInner));
884890
List<String> antiKeyRegexList = Arrays.asList(ParamsUtils.escapeSplit(antiKeyRegex));
885891
List<String> antiMimeTypeList = Arrays.asList(ParamsUtils.escapeSplit(antiMimeType));
892+
List<String> typeList = Arrays.asList(ParamsUtils.escapeSplit(type));
886893

887894
try {
888895
baseFilter = new BaseFilter<Map<String, String>>(keyPrefixList, keySuffixList, keyInnerList, keyRegexList,
889896
antiKeyPrefixList, antiKeySuffixList, antiKeyInnerList, antiKeyRegexList, mimeTypeList, antiMimeTypeList,
890-
putTimeMin, putTimeMax, type, status) {
897+
putTimeMin, putTimeMax, typeList, status) {
891898
@Override
892899
protected String valueFrom(Map<String, String> item, String key) {
893900
return item.get(key);

src/main/java/com/qiniu/entry/QSuitsEntry.java

+13-14
Original file line numberDiff line numberDiff line change
@@ -607,19 +607,18 @@ private ILineProcess<Map<String, String>> getChangeType(boolean single) throws I
607607
private ILineProcess<Map<String, String>> getRestoreArchive(boolean single) throws IOException {
608608
String days = entryParam.getValue("days", "1").trim();
609609
ParamsUtils.checked(days, "days", "[1-7]");
610-
StringBuilder condition = new StringBuilder();
611-
for (Map.Entry<String, String> entry : entryParam.getParamsMap().entrySet()) {
612-
if (entry.getKey().startsWith("cond.")) {
613-
if (condition.length() > 0) {
614-
condition.append(entry.getKey().substring(5)).append("=").append(entry.getValue().trim()).append("&");
615-
} else {
616-
condition.append(entry.getKey().substring(5)).append("=").append(entry.getValue().trim());
617-
}
618-
}
619-
}
620-
return single ? new RestoreArchive(qiniuAccessKey, qiniuSecretKey, getQiniuConfig(), bucket, Integer.parseInt(days),
621-
condition.toString()) : new RestoreArchive(qiniuAccessKey, qiniuSecretKey, getQiniuConfig(), bucket,
622-
Integer.parseInt(days), condition.toString(), savePath);
610+
// StringBuilder condition = new StringBuilder();
611+
// for (Map.Entry<String, String> entry : entryParam.getParamsMap().entrySet()) {
612+
// if (entry.getKey().startsWith("cond.")) {
613+
// if (condition.length() > 0) {
614+
// condition.append(entry.getKey().substring(5)).append("=").append(entry.getValue().trim()).append("&");
615+
// } else {
616+
// condition.append(entry.getKey().substring(5)).append("=").append(entry.getValue().trim());
617+
// }
618+
// }
619+
// }
620+
return single ? new RestoreArchive(qiniuAccessKey, qiniuSecretKey, getQiniuConfig(), bucket, Integer.parseInt(days))
621+
: new RestoreArchive(qiniuAccessKey, qiniuSecretKey, getQiniuConfig(), bucket, Integer.parseInt(days), savePath);
623622
}
624623

625624
private ILineProcess<Map<String, String>> getChangeLifecycle(boolean single) throws IOException {
@@ -630,7 +629,7 @@ private ILineProcess<Map<String, String>> getChangeLifecycle(boolean single) thr
630629
}
631630

632631
private ILineProcess<Map<String, String>> getCopyFile(Map<String, String> indexMap, boolean single) throws IOException {
633-
String toBucket = entryParam.getValue("to-bucket").trim();
632+
String toBucket = entryParam.getValue("to-bucket", bucket).trim();
634633
String toKeyIndex = indexMap.containsValue("toKey") ? "toKey" : null;
635634
String addPrefix = entryParam.getValue("add-prefix", null);
636635
String rmPrefix = entryParam.getValue("rm-prefix", null);

src/main/java/com/qiniu/process/Base.java

+3
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,12 @@ public void setBatchSize(int batchSize) throws IOException {
7070
throw new IOException("batch size must less than 1000 and more than 0.");
7171
} else {
7272
this.batchSize = batchSize;
73+
batchSizeTrigger();
7374
}
7475
}
7576

77+
public void batchSizeTrigger() {}
78+
7679
public void setRetryTimes(int retryTimes) {
7780
this.retryTimes = retryTimes < 1 ? 5 : retryTimes;
7881
}

src/main/java/com/qiniu/process/filtration/BaseFilter.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public abstract class BaseFilter<T> {
1616
private LocalDateTime datetimeMin;
1717
private LocalDateTime datetimeMax;
1818
private List<String> mimeType;
19-
private String type;
19+
private List<String> typeList;
2020
private String status;
2121
private List<String> antiKeyPrefix;
2222
private List<String> antiKeySuffix;
@@ -27,7 +27,7 @@ public abstract class BaseFilter<T> {
2727
public BaseFilter(List<String> keyPrefix, List<String> keySuffix, List<String> keyInner, List<String> keyRegex,
2828
List<String> antiKeyPrefix, List<String> antiKeySuffix, List<String> antiKeyInner,
2929
List<String> antiKeyRegex, List<String> mimeType, List<String> antiMimeType, LocalDateTime putTimeMin,
30-
LocalDateTime putTimeMax, String type, String status) throws IOException {
30+
LocalDateTime putTimeMax, List<String> typeList, String status) throws IOException {
3131
this.keyPrefix = keyPrefix;
3232
this.keySuffix = keySuffix;
3333
this.keyInner = keyInner;
@@ -40,7 +40,7 @@ public BaseFilter(List<String> keyPrefix, List<String> keySuffix, List<String> k
4040
this.antiMimeType = antiMimeType;
4141
this.datetimeMin = putTimeMin;
4242
this.datetimeMax = putTimeMax;
43-
this.type = type == null ? "" : type;
43+
this.typeList = typeList;
4444
this.status = status == null ? "" : status;
4545
if (!checkKeyCon() && !checkMimeTypeCon() && !checkDatetimeCon() && !checkTypeCon() && !checkStatusCon())
4646
throw new IOException("all conditions are invalid.");
@@ -64,7 +64,7 @@ public boolean checkDatetimeCon() {
6464
}
6565

6666
public boolean checkTypeCon() {
67-
return type != null && !"".equals(type);
67+
return checkList(typeList);
6868
}
6969

7070
public boolean checkStatusCon() {
@@ -128,7 +128,9 @@ public boolean filterDatetime(T item) {
128128
public boolean filterType(T item) {
129129
try {
130130
if (item == null) return false;
131-
return valueFrom(item, ConvertingUtils.defaultTypeField).equals(type);
131+
String type = valueFrom(item, ConvertingUtils.defaultTypeField);
132+
for (String s : typeList) if (type.equals(s)) return true;
133+
return false;
132134
} catch (NullPointerException e) {
133135
return true;
134136
}

0 commit comments

Comments
 (0)