Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add extension functions #10

Merged
merged 2 commits into from
Jun 26, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,15 @@ You can build the project using Gradle.

## Usage

* org.ktypeparser.MediaTypeParser.parse(inputStream: InputStream): MediaType?
* org.ktypeparser.MediaTypeParser.parse(bytes: ByteArray): MediaType?
* org.ktypeparser.MediaTypeParser.parse(file: File): MediaType?
Functions:
* detect(inputStream: InputStream): MediaType?
* detect(bytes: ByteArray): MediaType?
* detect(file: File): MediaType?

Extension functions:
* File.detectMediaType(): MediaType?
* ByteArray.detectMediaType(): MediaType?
* InputStream.detectMediaType(): MediaType?

MediaType - is an enum with media types that can be determined by MIME Type

Expand Down
14 changes: 14 additions & 0 deletions src/main/kotlin/org/ktypeparser/MediaTypeDetector.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.ktypeparser

import org.ktypeparser.processors.MediaTypeProcessor
import org.ktypeparser.type.MediaType
import java.io.File
import java.io.InputStream

fun File.detectMediaType() = detect(this)
fun ByteArray.detectMediaType() = detect(this)
fun InputStream.detectMediaType() = detect(this)

fun detect(inputStream: InputStream): MediaType? = MediaTypeProcessor.detect(inputStream)
fun detect(bytes: ByteArray): MediaType? = MediaTypeProcessor.detect(bytes)
fun detect(file: File): MediaType? = MediaTypeProcessor.detect(file)
51 changes: 0 additions & 51 deletions src/main/kotlin/org/ktypeparser/MediaTypeParser.kt

This file was deleted.

50 changes: 49 additions & 1 deletion src/main/kotlin/org/ktypeparser/processors/MediaTypeProcessor.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,58 @@ package org.ktypeparser.processors
import org.ktypeparser.type.MediaType
import org.ktypeparser.type.parseMediaType
import org.overviewproject.mime_types.MimeTypeDetector
import java.io.ByteArrayInputStream
import java.io.File
import java.io.InputStream
import java.nio.file.Files
import java.nio.file.Paths
import java.util.*

internal object MediaTypeProcessor {

object MediaTypeProcessor {
private val mimeTypeDetector = MimeTypeDetector()

fun detect(inputStream: InputStream): MediaType? {
val tempFile = createTempFile(inputStream)
return detect(tempFile).also {
deleteTempFile(tempFile)
}
}

fun detect(bytes: ByteArray): MediaType? {
val tempFile = createTempFile(bytes)
return detect(tempFile).also {
deleteTempFile(tempFile)
}
}

fun detect(file: File): MediaType? {
return parseMediaType(file)
}

private fun deleteTempFile(file: File) = file.delete()

private fun createTempFile(bytes: ByteArray): File {
return createTempFile(ByteArrayInputStream(bytes))
}

private fun createTempFile(inputStream: InputStream): File = inputStream.use {
val outputTempFilePath = "$tempDirectory/$randomName"
Files.copy(it, Paths.get(outputTempFilePath))

try {
it.reset() //trying to reset input stream, if supported
} catch (_: Exception) {
//ignore reset
}
File(outputTempFilePath)
}

private val tempDirectory: String by lazy { System.getProperty("java.io.tmpdir") }

private val randomName: String
get() = UUID.randomUUID().toString()

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

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,60 +7,60 @@ import java.io.File
import java.nio.file.Files
import java.nio.file.Paths

internal class MediaTypeParserTest {
internal class MediaTypeDetectorTest {

@Test
fun parse_pdfFile_rightType() {
fun detect_pdfFile_rightType() {
val pdfFile = getFileFromResources("pdf.pdf")

val mediaType = MediaTypeParser.parse(pdfFile)
val mediaType = detect(pdfFile)

Assertions.assertEquals(MediaType.PDF, mediaType)
}

@Test
fun parse_pdfFileByteArray_rightType() {
fun detect_pdfFileByteArray_rightType() {
val pdfFile = getFileFromResources("pdf.pdf")
val bytes = Files.readAllBytes(Paths.get(pdfFile.toURI()))

val mediaType = MediaTypeParser.parse(bytes)
val mediaType = detect(bytes)

Assertions.assertEquals(MediaType.PDF, mediaType)
}

@Test
fun parse_pdfFileInputStream_rightType() {
fun detect_pdfFileInputStream_rightType() {
val pdfFile = getFileFromResources("pdf.pdf")

val mediaType = MediaTypeParser.parse(pdfFile.inputStream())
val mediaType = detect(pdfFile.inputStream())

Assertions.assertEquals(MediaType.PDF, mediaType)
}

@Test
fun parse_jpgFile_rightType() {
fun detect_jpgFile_rightType() {
val jpgFile = getFileFromResources("jpg.jpg")

val mediaType = MediaTypeParser.parse(jpgFile)
val mediaType = detect(jpgFile)

Assertions.assertEquals(MediaType.JPEG, mediaType)
}

@Test
fun parse_jpgFileByteArray_rightType() {
fun detect_jpgFileByteArray_rightType() {
val jpgFile = getFileFromResources("jpg.jpg")
val bytes = Files.readAllBytes(Paths.get(jpgFile.toURI()))

val mediaType = MediaTypeParser.parse(bytes)
val mediaType = detect(bytes)

Assertions.assertEquals(MediaType.JPEG, mediaType)
}

@Test
fun parse_jpgFileInputStream_rightType() {
fun detect_jpgFileInputStream_rightType() {
val jpgFile = getFileFromResources("jpg.jpg")

val mediaType = MediaTypeParser.parse(jpgFile.inputStream())
val mediaType = detect(jpgFile.inputStream())

Assertions.assertEquals(MediaType.JPEG, mediaType)
}
Expand Down