Skip to content

Commit ccb5f59

Browse files
Merge pull request #17 from alekseinovikov/Add-supertypes-for-MediaTypes
Add supertypes for media types
2 parents 622f6e5 + 41c1e02 commit ccb5f59

File tree

8 files changed

+262
-134
lines changed

8 files changed

+262
-134
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ plugins {
77
}
88

99
group 'org.ktypeparser'
10-
version '2.0'
10+
version '2.1'
1111

1212
repositories {
1313
mavenCentral()

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip

src/main/kotlin/org/ktypeparser/processors/FileHelper.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,20 @@ import java.nio.file.Files
1111
import java.nio.file.Paths
1212
import java.util.*
1313

14-
internal fun deleteTempFile(file: File) = file.delete()
14+
internal fun deleteTempFile(file: File?) = file?.delete()
1515

1616
internal suspend fun deleteTempFileAsync(file: File) = GlobalScope.launch { file.delete() }
1717

18-
internal suspend fun createTempFileAsync(bytes: ByteArray): Deferred<File> =
18+
internal suspend fun createTempFileAsync(bytes: ByteArray): Deferred<File?> =
1919
GlobalScope.async { createTempFile(bytes) }
2020

21-
internal suspend fun createTempFileAsync(inputStream: InputStream): Deferred<File> =
21+
internal suspend fun createTempFileAsync(inputStream: InputStream): Deferred<File?> =
2222
GlobalScope.async { createTempFile(inputStream) }
2323

24-
internal fun createTempFile(bytes: ByteArray): File = createTempFile(ByteArrayInputStream(bytes))
24+
internal fun createTempFile(bytes: ByteArray): File? =
25+
bytes.takeIf { it.isNotEmpty() }?.let { createTempFile(ByteArrayInputStream(it)) }
2526

26-
internal fun createTempFile(inputStream: InputStream): File = inputStream.use {
27+
internal fun createTempFile(inputStream: InputStream): File? = inputStream.takeIf { it.available() > 0 }?.use {
2728
val outputTempFilePath = "$tempDirectory/$randomName"
2829
Files.copy(it, Paths.get(outputTempFilePath))
2930

src/main/kotlin/org/ktypeparser/processors/MediaTypeAsyncDetector.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@ internal object MediaTypeAsyncDetector {
1919

2020
suspend fun detectAsync(bytes: ByteArray): Deferred<MediaType?> {
2121
val file = createTempFileAsync(bytes)
22-
return file.await().toPath().detectAsync()
22+
return file.await()?.toPath().detectAsync()
2323
}
2424

2525
suspend fun detectAsync(inputStream: InputStream): Deferred<MediaType?> =
26-
createTempFileAsync(inputStream).await().toPath().detectAsync()
27-
28-
private suspend fun Path.detectAsync() =
29-
GlobalScope.async { mimeTypeDetector.detectMimeTypeAsync(this@detectAsync).await().parseMediaType() }
26+
createTempFileAsync(inputStream).await()?.toPath().detectAsync()
27+
28+
private suspend fun Path?.detectAsync() =
29+
GlobalScope.async {
30+
this@detectAsync?.let {
31+
mimeTypeDetector.detectMimeTypeAsync(it).await().parseMediaType()
32+
}
33+
}
3034

3135
}

src/main/kotlin/org/ktypeparser/processors/MediaTypeSyncDetector.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ internal object MediaTypeSyncDetector {
2424
}
2525
}
2626

27-
fun detect(file: File): MediaType? {
28-
return parseMediaType(file)
27+
fun detect(file: File?): MediaType? {
28+
return file?.let { parseMediaType(it) }
2929
}
3030

3131
private fun parseMediaType(file: File): MediaType? = mimeTypeDetector.detectMimeType(file)?.parseMediaType()

src/main/kotlin/org/ktypeparser/type/MediaType.kt

Lines changed: 119 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.ktypeparser.type
22

3+
import org.ktypeparser.type.MediaSuperType.*
4+
35
private const val APPLICATION_TYPE = "application"
46
private const val AUDIO_TYPE = "audio"
57
private const val IMAGE_TYPE = "image"
@@ -8,125 +10,134 @@ private const val VIDEO_TYPE = "video"
810

911
private const val WILDCARD = "*"
1012

11-
enum class MediaType(val type: String, val subType: String) {
12-
EMPTY("application","x-empty"),
13+
enum class MediaSuperType {
14+
OTHER,
15+
TEXT,
16+
IMAGE,
17+
AUDIO,
18+
VIDEO,
19+
APPLICATION
20+
}
21+
22+
enum class MediaType(val type: String, val subType: String, val superType: MediaSuperType) {
23+
EMPTY("application", "x-empty", OTHER),
1324

14-
ANY_TYPE(WILDCARD, WILDCARD),
15-
ANY_TEXT_TYPE(TEXT_TYPE, WILDCARD),
16-
ANY_IMAGE_TYPE(IMAGE_TYPE, WILDCARD),
17-
ANY_AUDIO_TYPE(AUDIO_TYPE, WILDCARD),
18-
ANY_VIDEO_TYPE(VIDEO_TYPE, WILDCARD),
19-
ANY_APPLICATION_TYPE(APPLICATION_TYPE, WILDCARD),
25+
ANY_TYPE(WILDCARD, WILDCARD, OTHER),
26+
ANY_TEXT_TYPE(TEXT_TYPE, WILDCARD, TEXT),
27+
ANY_IMAGE_TYPE(IMAGE_TYPE, WILDCARD, IMAGE),
28+
ANY_AUDIO_TYPE(AUDIO_TYPE, WILDCARD, AUDIO),
29+
ANY_VIDEO_TYPE(VIDEO_TYPE, WILDCARD, VIDEO),
30+
ANY_APPLICATION_TYPE(APPLICATION_TYPE, WILDCARD, APPLICATION),
2031

2132
/* TEXT TYPES */
22-
CSS(TEXT_TYPE, "css"),
23-
CSV(TEXT_TYPE, "csv"),
24-
HTML(TEXT_TYPE, "html"),
25-
I_CALENDAR(TEXT_TYPE, "calendar"),
26-
PLAIN_TEXT(TEXT_TYPE, "plain"),
27-
TEXT_JAVASCRIPT(TEXT_TYPE, "javascript"),
28-
TSV(TEXT_TYPE, "tab-separated-values"),
29-
VCARD(TEXT_TYPE, "vcard"),
30-
WML(TEXT_TYPE, "vnd.wap.wml"),
31-
XML(TEXT_TYPE, "xml"),
32-
VTT(TEXT_TYPE, "vtt"),
33+
CSS(TEXT_TYPE, "css", TEXT),
34+
CSV(TEXT_TYPE, "csv", TEXT),
35+
HTML(TEXT_TYPE, "html", TEXT),
36+
I_CALENDAR(TEXT_TYPE, "calendar", TEXT),
37+
PLAIN_TEXT(TEXT_TYPE, "plain", TEXT),
38+
TEXT_JAVASCRIPT(TEXT_TYPE, "javascript", TEXT),
39+
TSV(TEXT_TYPE, "tab-separated-values", TEXT),
40+
VCARD(TEXT_TYPE, "vcard", TEXT),
41+
WML(TEXT_TYPE, "vnd.wap.wml", TEXT),
42+
XML(TEXT_TYPE, "xml", TEXT),
43+
VTT(TEXT_TYPE, "vtt", TEXT),
3344

3445
/* IMAGE TYPES */
35-
BMP(IMAGE_TYPE, "bmp"),
36-
CRW(IMAGE_TYPE, "x-canon-crw"),
37-
GIF(IMAGE_TYPE, "gif"),
38-
ICO(IMAGE_TYPE, "vnd.microsoft.icon"),
39-
JPEG(IMAGE_TYPE, "jpeg"),
40-
PNG(IMAGE_TYPE, "png"),
41-
PSD(IMAGE_TYPE, "vnd.adobe.photoshop"),
42-
SVG(IMAGE_TYPE, "svg+xml"),
43-
TIFF(IMAGE_TYPE, "tiff"),
44-
WEBP(IMAGE_TYPE, "webp"),
45-
HEIF(IMAGE_TYPE, "heif"),
46-
JP2K(IMAGE_TYPE, "jp2"),
46+
BMP(IMAGE_TYPE, "bmp", IMAGE),
47+
CRW(IMAGE_TYPE, "x-canon-crw", IMAGE),
48+
GIF(IMAGE_TYPE, "gif", IMAGE),
49+
ICO(IMAGE_TYPE, "vnd.microsoft.icon", IMAGE),
50+
JPEG(IMAGE_TYPE, "jpeg", IMAGE),
51+
PNG(IMAGE_TYPE, "png", IMAGE),
52+
PSD(IMAGE_TYPE, "vnd.adobe.photoshop", IMAGE),
53+
SVG(IMAGE_TYPE, "svg+xml", IMAGE),
54+
TIFF(IMAGE_TYPE, "tiff", IMAGE),
55+
WEBP(IMAGE_TYPE, "webp", IMAGE),
56+
HEIF(IMAGE_TYPE, "heif", IMAGE),
57+
JP2K(IMAGE_TYPE, "jp2", IMAGE),
4758

4859
/* AUDIO TYPES */
49-
MP4_AUDIO(AUDIO_TYPE, "mp4"),
50-
MPEG_AUDIO(AUDIO_TYPE, "mpeg"),
51-
OGG_AUDIO(AUDIO_TYPE, "ogg"),
52-
WEBM_AUDIO(AUDIO_TYPE, "webm"),
53-
L16_AUDIO(AUDIO_TYPE, "l16"),
54-
L24_AUDIO(AUDIO_TYPE, "l24"),
55-
BASIC_AUDIO(AUDIO_TYPE, "basic"),
56-
AAC_AUDIO(AUDIO_TYPE, "aac"),
57-
VORBIS_AUDIO(AUDIO_TYPE, "vorbis"),
58-
WMA_AUDIO(AUDIO_TYPE, "x-ms-wma"),
59-
WAX_AUDIO(AUDIO_TYPE, "x-ms-wax"),
60-
VND_REAL_AUDIO(AUDIO_TYPE, "vnd.rn-realaudio"),
61-
VND_WAVE_AUDIO(AUDIO_TYPE, "vnd.wave"),
60+
MP4_AUDIO(AUDIO_TYPE, "mp4", AUDIO),
61+
MPEG_AUDIO(AUDIO_TYPE, "mpeg", AUDIO),
62+
OGG_AUDIO(AUDIO_TYPE, "ogg", AUDIO),
63+
WEBM_AUDIO(AUDIO_TYPE, "webm", AUDIO),
64+
L16_AUDIO(AUDIO_TYPE, "l16", AUDIO),
65+
L24_AUDIO(AUDIO_TYPE, "l24", AUDIO),
66+
BASIC_AUDIO(AUDIO_TYPE, "basic", AUDIO),
67+
AAC_AUDIO(AUDIO_TYPE, "aac", AUDIO),
68+
VORBIS_AUDIO(AUDIO_TYPE, "vorbis", AUDIO),
69+
WMA_AUDIO(AUDIO_TYPE, "x-ms-wma", AUDIO),
70+
WAX_AUDIO(AUDIO_TYPE, "x-ms-wax", AUDIO),
71+
VND_REAL_AUDIO(AUDIO_TYPE, "vnd.rn-realaudio", AUDIO),
72+
VND_WAVE_AUDIO(AUDIO_TYPE, "vnd.wave", AUDIO),
6273

6374
/* VIDEO TYPES */
64-
MP4_VIDEO(VIDEO_TYPE, "mp4"),
65-
MPEG_VIDEO(VIDEO_TYPE, "mpeg"),
66-
OGG_VIDEO(VIDEO_TYPE, "ogg"),
67-
QUICKTIME(VIDEO_TYPE, "quicktime"),
68-
WEBM_VIDEO(VIDEO_TYPE, "webm"),
69-
WMV(VIDEO_TYPE, "x-ms-wmv"),
70-
FLV_VIDEO(VIDEO_TYPE, "x-flv"),
71-
THREE_GPP_VIDEO(VIDEO_TYPE, "3gpp"),
72-
THREE_GPP2_VIDEO(VIDEO_TYPE, "3gpp2"),
75+
MP4_VIDEO(VIDEO_TYPE, "mp4", VIDEO),
76+
MPEG_VIDEO(VIDEO_TYPE, "mpeg", VIDEO),
77+
OGG_VIDEO(VIDEO_TYPE, "ogg", VIDEO),
78+
QUICKTIME(VIDEO_TYPE, "quicktime", VIDEO),
79+
WEBM_VIDEO(VIDEO_TYPE, "webm", VIDEO),
80+
WMV(VIDEO_TYPE, "x-ms-wmv", VIDEO),
81+
FLV_VIDEO(VIDEO_TYPE, "x-flv", VIDEO),
82+
THREE_GPP_VIDEO(VIDEO_TYPE, "3gpp", VIDEO),
83+
THREE_GPP2_VIDEO(VIDEO_TYPE, "3gpp2", VIDEO),
7384

7485
/* APPLICATION TYPES */
75-
APPLICATION_XML(APPLICATION_TYPE, "xml"),
76-
ATOM(APPLICATION_TYPE, "atom+xml"),
77-
BZIP2(APPLICATION_TYPE, "x-bzip2"),
78-
DART(APPLICATION_TYPE, "dart"),
79-
APPLE_PASSBOOK(APPLICATION_TYPE, "vnd.apple.pkpass"),
80-
EOT(APPLICATION_TYPE, "vnd.ms-fontobject"),
81-
EPUB(APPLICATION_TYPE, "epub+zip"),
82-
FORM_DATA(APPLICATION_TYPE, "x-www-form-urlencoded"),
83-
KEY_ARCHIVE(APPLICATION_TYPE, "pkcs12"),
84-
APPLICATION_BINARY(APPLICATION_TYPE, "binary"),
85-
GEO_JSON(APPLICATION_TYPE, "geo+json"),
86-
GZIP(APPLICATION_TYPE, "x-gzip"),
87-
HAL_JSON(APPLICATION_TYPE, "hal+json"),
88-
JAVASCRIPT(APPLICATION_TYPE, "javascript"),
89-
JOSE(APPLICATION_TYPE, "jose"),
90-
JOSE_JSON(APPLICATION_TYPE, "jose+json"),
91-
JSON(APPLICATION_TYPE, "json"),
92-
MANIFEST_JSON(APPLICATION_TYPE, "manifest+json"),
93-
KML(APPLICATION_TYPE, "vnd.google-earth.kml+xml"),
94-
KMZ(APPLICATION_TYPE, "vnd.google-earth.kmz"),
95-
MBOX(APPLICATION_TYPE, "mbox"),
96-
APPLE_MOBILE_CONFIG(APPLICATION_TYPE, "x-apple-aspen-config"),
97-
MICROSOFT_EXCEL(APPLICATION_TYPE, "vnd.ms-excel"),
98-
MICROSOFT_OUTLOOK(APPLICATION_TYPE, "vnd.ms-outlook"),
99-
MICROSOFT_POWERPOINT(APPLICATION_TYPE, "vnd.ms-powerpoint"),
100-
MICROSOFT_WORD(APPLICATION_TYPE, "msword"),
101-
MEDIA_PRESENTATION_DESCRIPTION(APPLICATION_TYPE, "dash+xml"),
102-
WASM_APPLICATION(APPLICATION_TYPE, "wasm"),
103-
NACL_APPLICATION(APPLICATION_TYPE, "x-nacl"),
104-
NACL_PORTABLE_APPLICATION(APPLICATION_TYPE, "x-pnacl"),
105-
OCTET_STREAM(APPLICATION_TYPE, "octet-stream"),
106-
OGG_CONTAINER(APPLICATION_TYPE, "ogg"),
107-
OOXML_DOCUMENT(APPLICATION_TYPE, "vnd.openxmlformats-officedocument.wordprocessingml.document"),
108-
OOXML_PRESENTATION(APPLICATION_TYPE, "vnd.openxmlformats-officedocument.presentationml.presentation"),
109-
OOXML_SHEET(APPLICATION_TYPE, "vnd.openxmlformats-officedocument.spreadsheetml.sheet"),
110-
OPENDOCUMENT_GRAPHICS(APPLICATION_TYPE, "vnd.oasis.opendocument.graphics"),
111-
OPENDOCUMENT_PRESENTATION(APPLICATION_TYPE, "vnd.oasis.opendocument.presentation"),
112-
OPENDOCUMENT_SPREADSHEET(APPLICATION_TYPE, "vnd.oasis.opendocument.spreadsheet"),
113-
OPENDOCUMENT_TEXT(APPLICATION_TYPE, "vnd.oasis.opendocument.text"),
114-
OPENSEARCH_DESCRIPTION(APPLICATION_TYPE, "opensearchdescription+xml"),
115-
PDF(APPLICATION_TYPE, "pdf"),
116-
POSTSCRIPT(APPLICATION_TYPE, "postscript"),
117-
PROTOBUF(APPLICATION_TYPE, "protobuf"),
118-
RDF_XML(APPLICATION_TYPE, "rdf+xml"),
119-
RTF(APPLICATION_TYPE, "rtf"),
120-
SFNT(APPLICATION_TYPE, "font-sfnt"),
121-
SHOCKWAVE_FLASH(APPLICATION_TYPE, "x-shockwave-flash"),
122-
SKETCHUP(APPLICATION_TYPE, "vnd.sketchup.skp"),
123-
SOAP_XML(APPLICATION_TYPE, "soap+xml"),
124-
TAR(APPLICATION_TYPE, "x-tar"),
125-
WOFF(APPLICATION_TYPE, "font-woff"),
126-
WOFF2(APPLICATION_TYPE, "font-woff2"),
127-
XHTML(APPLICATION_TYPE, "xhtml+xml"),
128-
XRD(APPLICATION_TYPE, "xrd+xml"),
129-
ZIP(APPLICATION_TYPE, "zip")
86+
APPLICATION_XML(APPLICATION_TYPE, "xml", APPLICATION),
87+
ATOM(APPLICATION_TYPE, "atom+xml", APPLICATION),
88+
BZIP2(APPLICATION_TYPE, "x-bzip2", APPLICATION),
89+
DART(APPLICATION_TYPE, "dart", APPLICATION),
90+
APPLE_PASSBOOK(APPLICATION_TYPE, "vnd.apple.pkpass", APPLICATION),
91+
EOT(APPLICATION_TYPE, "vnd.ms-fontobject", APPLICATION),
92+
EPUB(APPLICATION_TYPE, "epub+zip", APPLICATION),
93+
FORM_DATA(APPLICATION_TYPE, "x-www-form-urlencoded", APPLICATION),
94+
KEY_ARCHIVE(APPLICATION_TYPE, "pkcs12", APPLICATION),
95+
APPLICATION_BINARY(APPLICATION_TYPE, "binary", APPLICATION),
96+
GEO_JSON(APPLICATION_TYPE, "geo+json", APPLICATION),
97+
GZIP(APPLICATION_TYPE, "x-gzip", APPLICATION),
98+
HAL_JSON(APPLICATION_TYPE, "hal+json", APPLICATION),
99+
JAVASCRIPT(APPLICATION_TYPE, "javascript", APPLICATION),
100+
JOSE(APPLICATION_TYPE, "jose", APPLICATION),
101+
JOSE_JSON(APPLICATION_TYPE, "jose+json", APPLICATION),
102+
JSON(APPLICATION_TYPE, "json", APPLICATION),
103+
MANIFEST_JSON(APPLICATION_TYPE, "manifest+json", APPLICATION),
104+
KML(APPLICATION_TYPE, "vnd.google-earth.kml+xml", APPLICATION),
105+
KMZ(APPLICATION_TYPE, "vnd.google-earth.kmz", APPLICATION),
106+
MBOX(APPLICATION_TYPE, "mbox", APPLICATION),
107+
APPLE_MOBILE_CONFIG(APPLICATION_TYPE, "x-apple-aspen-config", APPLICATION),
108+
MICROSOFT_EXCEL(APPLICATION_TYPE, "vnd.ms-excel", APPLICATION),
109+
MICROSOFT_OUTLOOK(APPLICATION_TYPE, "vnd.ms-outlook", APPLICATION),
110+
MICROSOFT_POWERPOINT(APPLICATION_TYPE, "vnd.ms-powerpoint", APPLICATION),
111+
MICROSOFT_WORD(APPLICATION_TYPE, "msword", APPLICATION),
112+
MEDIA_PRESENTATION_DESCRIPTION(APPLICATION_TYPE, "dash+xml", APPLICATION),
113+
WASM_APPLICATION(APPLICATION_TYPE, "wasm", APPLICATION),
114+
NACL_APPLICATION(APPLICATION_TYPE, "x-nacl", APPLICATION),
115+
NACL_PORTABLE_APPLICATION(APPLICATION_TYPE, "x-pnacl", APPLICATION),
116+
OCTET_STREAM(APPLICATION_TYPE, "octet-stream", APPLICATION),
117+
OGG_CONTAINER(APPLICATION_TYPE, "ogg", APPLICATION),
118+
OOXML_DOCUMENT(APPLICATION_TYPE, "vnd.openxmlformats-officedocument.wordprocessingml.document", APPLICATION),
119+
OOXML_PRESENTATION(APPLICATION_TYPE, "vnd.openxmlformats-officedocument.presentationml.presentation", APPLICATION),
120+
OOXML_SHEET(APPLICATION_TYPE, "vnd.openxmlformats-officedocument.spreadsheetml.sheet", APPLICATION),
121+
OPENDOCUMENT_GRAPHICS(APPLICATION_TYPE, "vnd.oasis.opendocument.graphics", APPLICATION),
122+
OPENDOCUMENT_PRESENTATION(APPLICATION_TYPE, "vnd.oasis.opendocument.presentation", APPLICATION),
123+
OPENDOCUMENT_SPREADSHEET(APPLICATION_TYPE, "vnd.oasis.opendocument.spreadsheet", APPLICATION),
124+
OPENDOCUMENT_TEXT(APPLICATION_TYPE, "vnd.oasis.opendocument.text", APPLICATION),
125+
OPENSEARCH_DESCRIPTION(APPLICATION_TYPE, "opensearchdescription+xml", APPLICATION),
126+
PDF(APPLICATION_TYPE, "pdf", APPLICATION),
127+
POSTSCRIPT(APPLICATION_TYPE, "postscript", APPLICATION),
128+
PROTOBUF(APPLICATION_TYPE, "protobuf", APPLICATION),
129+
RDF_XML(APPLICATION_TYPE, "rdf+xml", APPLICATION),
130+
RTF(APPLICATION_TYPE, "rtf", APPLICATION),
131+
SFNT(APPLICATION_TYPE, "font-sfnt", APPLICATION),
132+
SHOCKWAVE_FLASH(APPLICATION_TYPE, "x-shockwave-flash", APPLICATION),
133+
SKETCHUP(APPLICATION_TYPE, "vnd.sketchup.skp", APPLICATION),
134+
SOAP_XML(APPLICATION_TYPE, "soap+xml", APPLICATION),
135+
TAR(APPLICATION_TYPE, "x-tar", APPLICATION),
136+
WOFF(APPLICATION_TYPE, "font-woff", APPLICATION),
137+
WOFF2(APPLICATION_TYPE, "font-woff2", APPLICATION),
138+
XHTML(APPLICATION_TYPE, "xhtml+xml", APPLICATION),
139+
XRD(APPLICATION_TYPE, "xrd+xml", APPLICATION),
140+
ZIP(APPLICATION_TYPE, "zip", APPLICATION)
130141
}
131142

132143
private val nameToMediaTypeMap: Map<String, MediaType> by lazy {

0 commit comments

Comments
 (0)