Skip to content

Commit 733dfec

Browse files
committed
TIKA-4545 - swap in concrete classes to help Jackson
1 parent 8df619c commit 733dfec

5 files changed

Lines changed: 67 additions & 52 deletions

File tree

tika-core/src/main/java/org/apache/tika/extractor/RUnpackExtractorFactory.java

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
*/
1717
package org.apache.tika.extractor;
1818

19-
import java.util.Collections;
2019
import java.util.HashSet;
21-
import java.util.Set;
2220

2321
import org.apache.tika.config.Field;
2422
import org.apache.tika.config.TikaComponent;
@@ -32,10 +30,11 @@ public class RUnpackExtractorFactory implements EmbeddedDocumentByteStoreExtract
3230
public static long DEFAULT_MAX_EMBEDDED_BYTES_FOR_EXTRACTION = 10l * 1024l * 1024l * 1024l;
3331

3432
private boolean writeFileNameToContent = true;
35-
private Set<String> embeddedBytesIncludeMimeTypes = Collections.EMPTY_SET;
36-
private Set<String> embeddedBytesExcludeMimeTypes = Collections.EMPTY_SET;
37-
private Set<String> embeddedBytesIncludeEmbeddedResourceTypes = Collections.EMPTY_SET;
38-
private Set<String> embeddedBytesExcludeEmbeddedResourceTypes = Collections.EMPTY_SET;
33+
//concrete HashSet class for the sake of Jackson
34+
private HashSet<String> embeddedBytesIncludeMimeTypes = new HashSet<>();
35+
private HashSet<String> embeddedBytesExcludeMimeTypes = new HashSet<>();
36+
private HashSet<String> embeddedBytesIncludeEmbeddedResourceTypes = new HashSet<>();
37+
private HashSet<String> embeddedBytesExcludeEmbeddedResourceTypes = new HashSet<>();
3938

4039
private long maxEmbeddedBytesForExtraction = DEFAULT_MAX_EMBEDDED_BYTES_FOR_EXTRACTION;
4140
@Field
@@ -44,30 +43,24 @@ public void setWriteFileNameToContent(boolean writeFileNameToContent) {
4443
}
4544

4645
@Field
47-
public void setEmbeddedBytesIncludeMimeTypes(Set<String> includeMimeTypes) {
48-
embeddedBytesIncludeMimeTypes = new HashSet<>();
49-
embeddedBytesIncludeMimeTypes.addAll(includeMimeTypes);
46+
public void setEmbeddedBytesIncludeMimeTypes(HashSet<String> includeMimeTypes) {
47+
embeddedBytesIncludeMimeTypes = new HashSet<>(includeMimeTypes);
5048
}
5149

5250
@Field
53-
public void setEmbeddedBytesExcludeMimeTypes(Set<String> excludeMimeTypes) {
54-
embeddedBytesExcludeMimeTypes = new HashSet<>();
55-
embeddedBytesExcludeMimeTypes.addAll(excludeMimeTypes);
51+
public void setEmbeddedBytesExcludeMimeTypes(HashSet<String> excludeMimeTypes) {
52+
embeddedBytesExcludeMimeTypes = new HashSet<>(excludeMimeTypes);
5653

5754
}
5855

5956
@Field
60-
public void setEmbeddedBytesIncludeEmbeddedResourceTypes(Set<String> includeAttachmentTypes) {
61-
embeddedBytesIncludeEmbeddedResourceTypes = new HashSet<>();
62-
embeddedBytesIncludeEmbeddedResourceTypes.addAll(includeAttachmentTypes);
63-
57+
public void setEmbeddedBytesIncludeEmbeddedResourceTypes(HashSet<String> includeAttachmentTypes) {
58+
embeddedBytesIncludeEmbeddedResourceTypes = new HashSet<>(includeAttachmentTypes);
6459
}
6560

6661
@Field
67-
public void setEmbeddedBytesExcludeEmbeddedResourceTypes(Set<String> excludeAttachmentTypes) {
68-
embeddedBytesExcludeEmbeddedResourceTypes = new HashSet<>();
69-
embeddedBytesExcludeEmbeddedResourceTypes.addAll(excludeAttachmentTypes);
70-
62+
public void setEmbeddedBytesExcludeEmbeddedResourceTypes(HashSet<String> excludeAttachmentTypes) {
63+
embeddedBytesExcludeEmbeddedResourceTypes = new HashSet<>(excludeAttachmentTypes);
7164
}
7265

7366
/**
@@ -91,19 +84,19 @@ public boolean isWriteFileNameToContent() {
9184
return writeFileNameToContent;
9285
}
9386

94-
public Set<String> getEmbeddedBytesIncludeMimeTypes() {
87+
public HashSet<String> getEmbeddedBytesIncludeMimeTypes() {
9588
return embeddedBytesIncludeMimeTypes;
9689
}
9790

98-
public Set<String> getEmbeddedBytesExcludeMimeTypes() {
91+
public HashSet<String> getEmbeddedBytesExcludeMimeTypes() {
9992
return embeddedBytesExcludeMimeTypes;
10093
}
10194

102-
public Set<String> getEmbeddedBytesIncludeEmbeddedResourceTypes() {
95+
public HashSet<String> getEmbeddedBytesIncludeEmbeddedResourceTypes() {
10396
return embeddedBytesIncludeEmbeddedResourceTypes;
10497
}
10598

106-
public Set<String> getEmbeddedBytesExcludeEmbeddedResourceTypes() {
99+
public HashSet<String> getEmbeddedBytesExcludeEmbeddedResourceTypes() {
107100
return embeddedBytesExcludeEmbeddedResourceTypes;
108101
}
109102

tika-core/src/main/java/org/apache/tika/metadata/writefilter/StandardWriteFilterFactory.java

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
*/
1717
package org.apache.tika.metadata.writefilter;
1818

19-
import java.util.Collections;
20-
import java.util.Set;
21-
import java.util.concurrent.ConcurrentHashMap;
19+
import java.util.HashSet;
2220

2321
/**
2422
* Factory class for {@link StandardWriteFilter}. See that class
@@ -32,15 +30,16 @@ public class StandardWriteFilterFactory implements MetadataWriteFilterFactory {
3230
public static int DEFAULT_TOTAL_ESTIMATED_BYTES = 10 * 1024 * 1024;
3331
public static int DEFAULT_MAX_VALUES_PER_FIELD = 10;
3432

35-
private Set<String> includeFields = Collections.EMPTY_SET;
36-
private Set<String> excludeFields = Collections.EMPTY_SET;
33+
//concrete classes here and in the setters/getters for the sake of Jackson
34+
private HashSet<String> includeFields = new HashSet<>();
35+
private HashSet<String> excludeFields = new HashSet<>();
3736
private int maxKeySize = DEFAULT_MAX_KEY_SIZE;
3837
private int maxFieldSize = DEFAULT_MAX_FIELD_SIZE;
3938
private int maxTotalEstimatedBytes = DEFAULT_TOTAL_ESTIMATED_BYTES;
4039
private int maxValuesPerField = DEFAULT_MAX_VALUES_PER_FIELD;
4140
private boolean includeEmpty = false;
4241

43-
public MetadataWriteFilter newInstance() {
42+
public synchronized MetadataWriteFilter newInstance() {
4443

4544
if (maxFieldSize < 0) {
4645
throw new IllegalArgumentException("maxFieldSize must be > 0");
@@ -59,16 +58,12 @@ public MetadataWriteFilter newInstance() {
5958
excludeFields, includeEmpty);
6059
}
6160

62-
public void setIncludeFields(Set<String> includeFields) {
63-
Set<String> keys = ConcurrentHashMap.newKeySet(includeFields.size());
64-
keys.addAll(includeFields);
65-
this.includeFields = Collections.unmodifiableSet(keys);
61+
public void setIncludeFields(HashSet<String> includeFields) {
62+
this.includeFields = new HashSet<>(includeFields);
6663
}
6764

68-
public void setExcludeFields(Set<String> excludeFields) {
69-
Set<String> keys = ConcurrentHashMap.newKeySet(excludeFields.size());
70-
keys.addAll(excludeFields);
71-
this.excludeFields = Collections.unmodifiableSet(keys);
65+
public void setExcludeFields(HashSet<String> excludeFields) {
66+
this.excludeFields = new HashSet<>(excludeFields);
7267
}
7368

7469
public void setMaxTotalEstimatedBytes(int maxTotalEstimatedBytes) {
@@ -91,11 +86,11 @@ public void setMaxValuesPerField(int maxValuesPerField) {
9186
this.maxValuesPerField = maxValuesPerField;
9287
}
9388

94-
public Set<String> getIncludeFields() {
89+
public HashSet<String> getIncludeFields() {
9590
return includeFields;
9691
}
9792

98-
public Set<String> getExcludeFields() {
93+
public HashSet<String> getExcludeFields() {
9994
return excludeFields;
10095
}
10196

tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/parser/AutoDetectParserConfigTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static org.junit.jupiter.api.Assertions.assertEquals;
2020
import static org.junit.jupiter.api.Assertions.assertNull;
21+
import static org.junit.jupiter.api.Assertions.assertTrue;
2122

2223
import java.nio.file.Files;
2324
import java.nio.file.Path;
@@ -77,6 +78,20 @@ public void testXMLContentHandlerDecoratorFactory() throws Exception {
7778
assertContainsCount("15.9.2007 11:02", txt, 2);
7879
}
7980

81+
@Test
82+
public void testWriteFilter() throws Exception {
83+
//test to make sure that the decorator is only applied once for
84+
//legacy (e.g. not RecursiveParserWrapperHandler) parsing
85+
Parser p = TikaLoaderHelper.getLoader("tika-config-write-filter.json").loadAutoDetectParser();
86+
List<Metadata> metadataList = getRecursiveMetadata("testPPT_EmbeddedPDF.pptx", p);
87+
for (Metadata metadata : metadataList) {
88+
for (String k : metadata.names()) {
89+
assertTrue(k.startsWith("X-TIKA:") || k.startsWith("access_permission:")
90+
|| k.equals("Content-Type") || k.equals("dc:creator"));
91+
}
92+
}
93+
}
94+
8095
@Test
8196
public void testDigests() throws Exception {
8297
//test to make sure that the decorator is only applied once for

tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-upcasing-custom-handler-decorator.json

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,8 @@
88
"metadataWriteFilterFactory": {
99
"@class": "org.apache.tika.metadata.writefilter.StandardWriteFilterFactory",
1010
"includeFields": [
11-
"java.util.Collections$EmptySet",
12-
[]
1311
],
1412
"excludeFields": [
15-
"java.util.Collections$EmptySet",
16-
[]
1713
],
1814
"maxKeySize": 1024,
1915
"maxFieldSize": 102400,
@@ -25,20 +21,15 @@
2521
"@class": "org.apache.tika.extractor.RUnpackExtractorFactory",
2622
"writeFileNameToContent": true,
2723
"embeddedBytesIncludeMimeTypes": [
28-
"java.util.Collections$EmptySet",
29-
[]
24+
"text/pdf"
3025
],
3126
"embeddedBytesExcludeMimeTypes": [
32-
"java.util.Collections$EmptySet",
33-
[]
27+
"rtf/application"
3428
],
3529
"embeddedBytesIncludeEmbeddedResourceTypes": [
36-
"java.util.Collections$EmptySet",
37-
[]
30+
"appended"
3831
],
3932
"embeddedBytesExcludeEmbeddedResourceTypes": [
40-
"java.util.Collections$EmptySet",
41-
[]
4233
],
4334
"maxEmbeddedBytesForExtraction": 10737418240
4435
},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"auto-detect-parser": {
3+
"spoolToDisk": 1000000,
4+
"outputThreshold": 1000000,
5+
"digesterFactory": {
6+
"@class": "org.apache.tika.parser.digestutils.CommonsDigesterFactory",
7+
"markLimit": 100000,
8+
"algorithmString": "sha256:32,md5",
9+
"skipContainerDocument": true
10+
},
11+
"metadataWriteFilterFactory": {
12+
"@class": "org.apache.tika.metadata.writefilter.StandardWriteFilterFactory",
13+
"includeFields": [
14+
"X-TIKA-CONTENT",
15+
"dc:creator"
16+
]
17+
},
18+
"throwOnZeroBytes": false
19+
}
20+
}
21+

0 commit comments

Comments
 (0)