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",

Reply via email to