You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ni...@apache.org on 2022/03/08 00:41:09 UTC

[tika] 01/03: TIKA-3694 Additional details in HTML on mime type, and per-type json

This is an automated email from the ASF dual-hosted git repository.

nick pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 7768c87b467bb6cc9d01f6b92c45131af3d44fef
Author: Nick Burch <ni...@gagravarr.org>
AuthorDate: Mon Mar 7 22:49:22 2022 +0000

    TIKA-3694 Additional details in HTML on mime type, and per-type json
---
 .../tika/server/core/resource/TikaMimeTypes.java   | 59 ++++++++++++++++++++--
 1 file changed, 56 insertions(+), 3 deletions(-)

diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java
index 7b1887f..784660c 100644
--- a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java
@@ -24,13 +24,19 @@ import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import javax.ws.rs.GET;
+import javax.ws.rs.NotFoundException;
 import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import org.apache.tika.config.TikaConfig;
 import org.apache.tika.mime.MediaType;
 import org.apache.tika.mime.MediaTypeRegistry;
+import org.apache.tika.mime.MimeType;
+import org.apache.tika.mime.MimeTypes;
+import org.apache.tika.mime.MimeTypeException;
 import org.apache.tika.parser.CompositeParser;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.server.core.HTMLHelper;
@@ -38,6 +44,7 @@ import org.apache.tika.server.core.HTMLHelper;
 /**
  * <p>Provides details of all the mimetypes known to Apache Tika,
  * similar to <em>--list-supported-types</em> with the Tika CLI.
+ * <p>Can also provide full details on a single known type.
  */
 @Path("/mime-types")
 public class TikaMimeTypes {
@@ -91,6 +98,17 @@ public class TikaMimeTypes {
                 h.append("<div>Super Type: <a href=\"#").append(type.supertype).append("\">")
                         .append(type.supertype).append("</a></div>\n");
             }
+            if (type.mime != null) {
+               if (!type.mime.getDescription().isEmpty()) {
+                  h.append("<div>Description: ").append(type.mime.getDescription()).append("</div>\n");
+               }
+               if (!type.mime.getAcronym().isEmpty()) {
+                  h.append("<div>Acronym: ").append(type.mime.getAcronym()).append("</div>\n");
+               }
+               if (!type.mime.getExtension().isEmpty()) {
+                  h.append("<div>Default Extension: ").append(type.mime.getExtension()).append("</div>\n");
+               }
+            }
 
             if (type.parser != null) {
                 h.append("<div>Parser: ").append(type.parser).append("</div>\n");
@@ -124,6 +142,27 @@ public class TikaMimeTypes {
     }
 
     @GET
+    @Path("/{type}/{subtype}")
+    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
+    public String getMimeTypeDetailsJSON(@PathParam("type") String typePart,
+                                         @PathParam("subtype") String subtype) throws IOException {
+        MediaTypeDetails type = getMediaType(typePart, subtype);
+        Map<String, Object> details = new HashMap<>();
+
+        details.put("type", type.type.toString());
+        details.put("alias", copyToStringArray(type.aliases));
+        if (type.supertype != null) {
+           details.put("supertype", type.supertype.toString());
+        }
+        if (type.parser != null) {
+           details.put("parser", type.parser);
+        }
+        // TODO Additional details from Mime
+
+        return new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(details);
+    }
+
+    @GET
     @Produces("text/plain")
     public String getMimeTypesPlain() {
         StringBuffer text = new StringBuffer();
@@ -147,10 +186,19 @@ public class TikaMimeTypes {
         return text.toString();
     }
 
+    protected MediaTypeDetails getMediaType(String type, String subtype) throws NotFoundException {
+       MediaType mt = MediaType.parse(type+"/"+subtype);
+       for (MediaTypeDetails mtd : getMediaTypes()) {
+          if (mtd.type.equals(mt)) return mtd;
+       }
+       throw new NotFoundException("No Media Type registered in Tika for " + mt);
+    }
     protected List<MediaTypeDetails> getMediaTypes() {
-        MediaTypeRegistry registry = TikaResource.getConfig().getMediaTypeRegistry();
-        Map<MediaType, Parser> parsers =
-                ((CompositeParser) TikaResource.getConfig().getParser()).getParsers();
+        TikaConfig config = TikaResource.getConfig();
+        MimeTypes mimeTypes = config.getMimeRepository();
+        MediaTypeRegistry registry = config.getMediaTypeRegistry();
+        Map<MediaType, Parser> parsers = ((CompositeParser)config.getParser()).getParsers();
+
         List<MediaTypeDetails> types =
                 new ArrayList<>(registry.getTypes().size());
 
@@ -159,6 +207,10 @@ public class TikaMimeTypes {
             details.type = type;
             details.aliases = registry.getAliases(type).toArray(new MediaType[0]);
 
+            try {
+               details.mime = mimeTypes.getRegisteredMimeType(type.toString());
+            } catch (MimeTypeException e) {}
+
             MediaType supertype = registry.getSupertype(type);
             if (supertype != null && !MediaType.OCTET_STREAM.equals(supertype)) {
                 details.supertype = supertype;
@@ -182,6 +234,7 @@ public class TikaMimeTypes {
         private MediaType type;
         private MediaType[] aliases;
         private MediaType supertype;
+        private MimeType mime;
         private String parser;
     }
 }