This is an automated email from the ASF dual-hosted git repository.
tballison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/main by this push:
new 5992a150a7 TIKA-5049: detect 3MF packages as model/3mf, their IANA
type (#3543)
5992a150a7 is described below
commit 5992a150a7fe4f7ee7c04420c70fa4d379095799
Author: Tim Allison <[email protected]>
AuthorDate: Thu Nov 5 09:26:43 2026 -0500
TIKA-5049: detect 3MF packages as model/3mf, their IANA type (#3543)
---
CHANGES.txt | 5 +++++
.../resources/org/apache/tika/mime/tika-mimetypes.xml | 18 ++++++++++--------
.../java/org/apache/tika/mime/MimeTypesReaderTest.java | 9 +++++++++
.../apache/tika/detect/TestContainerAwareDetector.java | 4 ++--
.../java/org/apache/tika/parser/pkg/ZipParserTest.java | 2 +-
.../detect/microsoft/ooxml/OPCPackageDetector.java | 4 ++--
.../java/org/apache/tika/parser/pkg/ZipParser.java | 3 +--
7 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index dc08815664..e3ce13d60c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -13,6 +13,11 @@ Release 4.3.0 - ???
the forks never saw such a fetcher, so every fetch through it failed. Use
file or
ignite (TIKA-5001).
+ * 3MF packages are detected as model/3mf, their IANA type, instead of
+ application/vnd.ms-package.3dmanufacturing-3dmodel+xml, which is the
content type of
+ the model part inside the package. The old name is an alias, so it still
resolves as
+ input, but detection output and metadata now carry model/3mf (TIKA-5049).
+
SERVER, PIPES AND OPERATIONS
* When pipes kills a forked server, it now kills the server's descendant
processes too,
diff --git
a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
index 984eaf40e5..d271b21db9 100644
--- a/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
+++ b/tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml
@@ -2223,14 +2223,6 @@
<glob pattern="*.ost"/>
</mime-type>
- <mime-type type="application/vnd.ms-package.3dmanufacturing-3dmodel+xml">
-
<tika:link>https://en.wikipedia.org/wiki/3D_Manufacturing_Format</tika:link>
- <_comment>3D manufacturing format</_comment>
- <!-- a zip package; without this, the +xml suffix would make it an XML
document -->
- <sub-class-of type="application/zip"/>
- <glob pattern="*.3mf"/>
- </mime-type>
-
<mime-type type="application/vnd.ms-pki.seccat">
<glob pattern="*.cat"/>
</mime-type>
@@ -7678,6 +7670,16 @@
<mime-type type="message/sipfrag"/>
<mime-type type="message/tracking-status"/>
<mime-type type="message/vnd.si.simp"/>
+ <mime-type type="model/3mf">
+ <!-- the package; the old name is the content type of its model part -->
+ <alias type="application/vnd.ms-package.3dmanufacturing-3dmodel+xml"/>
+
<tika:link>https://www.iana.org/assignments/media-types/model/3mf</tika:link>
+
<tika:link>https://en.wikipedia.org/wiki/3D_Manufacturing_Format</tika:link>
+ <_comment>3D manufacturing format</_comment>
+ <sub-class-of type="application/zip"/>
+ <glob pattern="*.3mf"/>
+ </mime-type>
+
<mime-type type="model/e57">
<_comment>3d imaging data exchange</_comment>
<magic priority="60">
diff --git
a/tika-core/src/test/java/org/apache/tika/mime/MimeTypesReaderTest.java
b/tika-core/src/test/java/org/apache/tika/mime/MimeTypesReaderTest.java
index cecd419e7d..6dd4d5d624 100644
--- a/tika-core/src/test/java/org/apache/tika/mime/MimeTypesReaderTest.java
+++ b/tika-core/src/test/java/org/apache/tika/mime/MimeTypesReaderTest.java
@@ -201,6 +201,15 @@ public class MimeTypesReaderTest {
assertEquals("application/x-berkeley-db", mtAltP.toString());
}
+ @Test
+ public void test3MFNameAndSupertype() throws Exception {
+ MediaTypeRegistry registry = mimeTypes.getMediaTypeRegistry();
+ MediaType threeMF = MediaType.parse("model/3mf");
+ assertEquals(threeMF, mimeTypes.forName(
+
"application/vnd.ms-package.3dmanufacturing-3dmodel+xml").getType());
+ assertEquals(MediaType.APPLICATION_ZIP,
registry.getSupertype(threeMF));
+ }
+
/**
* TIKA-746 Ensures that the custom mimetype maps were also
* loaded and used
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/detect/TestContainerAwareDetector.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/detect/TestContainerAwareDetector.java
index 2619286979..3ceb055d2d 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/detect/TestContainerAwareDetector.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/detect/TestContainerAwareDetector.java
@@ -291,8 +291,8 @@ public class TestContainerAwareDetector extends
MultiThreadedTikaTest {
@Test
public void test3MF() throws Exception {
- assertTypeByData("test3mf.3mf",
"application/vnd.ms-package.3dmanufacturing-3dmodel+xml");
- assertTypeByNameAndData("test3mf.3mf",
"application/vnd.ms-package.3dmanufacturing-3dmodel+xml");
+ assertTypeByData("test3mf.3mf", "model/3mf");
+ assertTypeByNameAndData("test3mf.3mf", "model/3mf");
}
@Test
public void testODFDifferentOrder() throws Exception {
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/pkg/ZipParserTest.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/pkg/ZipParserTest.java
index 9752ae8d2b..7f0f0917a4 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/pkg/ZipParserTest.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/parser/pkg/ZipParserTest.java
@@ -96,7 +96,7 @@ public class ZipParserTest extends AbstractPkgTest {
public void test3MFIsParsedAsZip() throws Exception {
List<Metadata> metadataList = getRecursiveMetadata("test3mf.3mf");
Metadata container = metadataList.get(0);
- assertEquals("application/vnd.ms-package.3dmanufacturing-3dmodel+xml",
+ assertEquals("model/3mf",
container.get(HttpHeaders.CONTENT_TYPE));
assertNull(container.get(TikaCoreProperties.CONTAINER_EXCEPTION));
Set<String> names = new HashSet<>();
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/ooxml/OPCPackageDetector.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/ooxml/OPCPackageDetector.java
index 1e60fed208..dd335f7628 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/ooxml/OPCPackageDetector.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/detect/microsoft/ooxml/OPCPackageDetector.java
@@ -88,7 +88,7 @@ public class OPCPackageDetector implements
ZipContainerDetector {
static final MediaType XLAM =
MediaType.application("vnd.ms-excel.addin.macroEnabled.12");
static final MediaType XPS = MediaType.application("vnd.ms-xpsdocument");
- static final MediaType THREE_MF =
MediaType.application("vnd.ms-package.3dmanufacturing-3dmodel+xml");
+ static final MediaType THREE_MF = MediaType.parse("model/3mf");
static final Set<String> OOXML_HINTS =
fillSet("word/", "xl/", "ppt/", "docProps/",
@@ -145,7 +145,7 @@ public class OPCPackageDetector implements
ZipContainerDetector {
MediaType.application("vnd.ms-visio.template"));
OOXML_CONTENT_TYPES.put("application/vnd.ms-package.xps-fixeddocumentsequence+xml",
XPS);
- OOXML_CONTENT_TYPES.put(THREE_MF.toString(), THREE_MF);
+
OOXML_CONTENT_TYPES.put("application/vnd.ms-package.3dmanufacturing-3dmodel+xml",
THREE_MF);
}
diff --git
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/ZipParser.java
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/ZipParser.java
index c0a97b8fd3..87604f5cae 100644
---
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/ZipParser.java
+++
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-pkg-module/src/main/java/org/apache/tika/parser/pkg/ZipParser.java
@@ -146,7 +146,6 @@ public class ZipParser extends AbstractArchiveParser {
"application/vnd.ms-excel.sheet.binary.macroenabled.12",
"application/vnd.ms-excel.sheet.macroenabled.12",
"application/vnd.ms-excel.template.macroenabled.12",
- "application/vnd.ms-package.3dmanufacturing-3dmodel+xml",
"application/vnd.ms-powerpoint.addin.macroenabled.12",
"application/vnd.ms-powerpoint.presentation.macroenabled.12",
"application/vnd.ms-powerpoint.slide.macroenabled.12",
@@ -173,7 +172,7 @@ public class ZipParser extends AbstractArchiveParser {
"application/x-tika-iworks-protected",
"application/x-tika-java-enterprise-archive",
"application/x-tika-java-web-archive",
"application/x-tika-ooxml",
"application/x-tika-visio-ooxml", "application/x-xliff+zip",
"application/x-xmind",
- "model/vnd.dwfx+xps", "application/vnd.sun.xml.calc",
+ "model/3mf", "model/vnd.dwfx+xps",
"application/vnd.sun.xml.calc",
"application/vnd.sun.xml.writer",
"application/vnd.sun.xml.writer.template",
"application/vnd.sun.xml.draw",
"application/vnd.sun.xml.impress",
"application/vnd.openofficeorg.autotext",