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;
+		}
+
+	}
 }