Bug 569591 - Exception if downloading file with empty/invalid mimetype
Change-Id: Ife48425641532fac0bd6c9acd0be250c69f46313
Signed-off-by: Matthias Koller <m.koller@peak-solution.de>
diff --git a/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ContextFilesSubresource.java b/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ContextFilesSubresource.java
index 07ffb6c..fd4d49c 100644
--- a/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ContextFilesSubresource.java
+++ b/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/ContextFilesSubresource.java
@@ -113,8 +113,8 @@
return entityService.find(V(sourceName), contextDescribableClass, V(contextDescribableId))
.map(contextDescribable -> fileLinkActivity.createFile(sourceName, contextDescribable,
- ServiceUtils.convertIso8859toUtf8(cdh.getFileName()), fileInputStream, description, mimeType, contextType, contextComponentName,
- attributeName))
+ ServiceUtils.convertIso8859toUtf8(cdh.getFileName()), fileInputStream, description, mimeType,
+ contextType, contextComponentName, attributeName))
.map(fileLink -> ServiceUtils.toResponse(Serializer.serializeFileLink(fileLink), Status.OK)).get();
}
@@ -135,7 +135,7 @@
fileLinkActivity.findFileLinkInContext(remotePath, sourceName, contextDescribable, contextType,
contextComponentName, attributeName)))
.map(tuple -> Tuple.of(fileLinkActivity.toStreamingOutput(sourceName, tuple._1, tuple._2),
- tuple._2.getMimeType().toString()))
+ fileLinkActivity.toMediaType(tuple._2)))
.map(tuple -> Response.ok(tuple._1, tuple._2).build()).get();
}
diff --git a/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/FilesAttachableSubresource.java b/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/FilesAttachableSubresource.java
index a75ebc6..2253bee 100644
--- a/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/FilesAttachableSubresource.java
+++ b/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/boundary/FilesAttachableSubresource.java
@@ -109,7 +109,7 @@
.map(filesAttachable -> Tuple.of(filesAttachable,
fileLinkActivity.findFileLinkAtFileAttachable(remotePath, filesAttachable)))
.map(tuple -> Tuple.of(fileLinkActivity.toStreamingOutput(sourceName, tuple._1, tuple._2),
- tuple._2.getMimeType().toString()))
+ fileLinkActivity.toMediaType(tuple._2)))
.map(tuple -> Response.ok(tuple._1, tuple._2).build()).get();
}
@@ -160,8 +160,8 @@
@Parameter(description = "Mimetype of the file", required = true) @FormDataParam("mimeType") MimeType mimeType) {
return entityService.find(V(sourceName), fileAttachableClass, V(id))
- .map(fileAttachable -> fileLinkActivity.createFile(sourceName, fileAttachable, ServiceUtils.convertIso8859toUtf8(cdh.getFileName()),
- fileInputStream, description, mimeType))
+ .map(fileAttachable -> fileLinkActivity.createFile(sourceName, fileAttachable,
+ ServiceUtils.convertIso8859toUtf8(cdh.getFileName()), fileInputStream, description, mimeType))
.map(fileLink -> ServiceUtils.toResponse(Serializer.serializeFileLink(fileLink), Status.OK)).get();
}
diff --git a/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/FileLinkActivity.java b/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/FileLinkActivity.java
index 8faad3a..c9a3252 100644
--- a/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/FileLinkActivity.java
+++ b/nucleus/businessobjects/src/main/java/org/eclipse/mdm/businessobjects/control/FileLinkActivity.java
@@ -29,6 +29,7 @@
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.StreamingOutput;
import org.eclipse.mdm.api.base.Transaction;
@@ -567,4 +568,28 @@
return context.getEntityManager()
.orElseThrow(() -> new MDMEntityAccessException("Entity manager not present in '" + sourceName + "'."));
}
+
+ /**
+ * Returns the {@link MediaType} for a FileLink. In case of error
+ * {@link MediaType#APPLICATION_OCTET_STREAM_TYPE} is returned
+ *
+ * @param fileLink
+ * @return MediaType corresponding to the FileLink's mimetype
+ */
+ public MediaType toMediaType(FileLink fileLink) {
+ String mimeType = fileLink.getMimeType().toString();
+
+ if (mimeType == null || mimeType.isEmpty()) {
+ return MediaType.APPLICATION_OCTET_STREAM_TYPE;
+ }
+
+ try {
+ return MediaType.valueOf(mimeType);
+ } catch (IllegalArgumentException e) {
+ // if the mimeType is not parsable to a MediaType, just application/octet-stream
+ // is returned
+ return MediaType.APPLICATION_OCTET_STREAM_TYPE;
+ }
+
+ }
}