From aec8ae3332fcd271145abb8c2e5505464c6e85db Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Tue, 21 Jul 2020 15:55:39 +0200 Subject: [PATCH] Implemented improvement #19695#note-4 --- .../client/AppControllerExplorer.java | 24 +- .../interfaces/SubscriberInterface.java | 4 +- .../workspace/client/resources/Icons.java | 2 +- .../resources/icons/no-preview-available.png | Bin 0 -> 4203 bytes .../resources/icons/preview-not-available.png | Bin 4396 -> 3393 bytes .../client/rpc/GWTWorkspaceService.java | 7 + .../client/rpc/GWTWorkspaceServiceAsync.java | 9 + .../view/windows/DialogGetInfoBootstrap.java | 214 +++++++++--------- .../user/workspace/public/workspacetree.css | 2 +- .../server/GWTWorkspaceServiceImpl.java | 29 +++ .../server/util/MimeTypeUtility.java | 45 ++++ .../PreviewMimeTypeToExtensionMap.properties | 62 +++++ 12 files changed, 285 insertions(+), 113 deletions(-) create mode 100644 src/main/java/org/gcube/portlets/user/workspace/client/resources/icons/no-preview-available.png create mode 100644 src/main/resources/PreviewMimeTypeToExtensionMap.properties diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java b/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java index 377975f..72a5d34 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/AppControllerExplorer.java @@ -208,6 +208,8 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt private WsTaskExecutorWidget taskExecutor = new WsTaskExecutorWidget(); public static final int delayTime = 3000; + + public static Map> mapOfAllowedMimeTypesForPreview = null; /** * Instantiates a new app controller explorer. @@ -2130,7 +2132,7 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt sub.loadFolder(loadFolderEvent.getTargetFolder()); } else if (event instanceof GetInfoEvent) { GetInfoEvent getInfoEvent = (GetInfoEvent) event; - sub.showDetails(getInfoEvent.getSourceFile()); + sub.showDetails(getInfoEvent.getSourceFile(), mapOfAllowedMimeTypesForPreview); } } @@ -2326,6 +2328,7 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt this.explorerPanel = new ExplorerPanel(true, true); loadMyLogin(); loadMyFirstName(); + loadAllowedMimeTypesForPreview(); return this.explorerPanel; } @@ -2347,9 +2350,12 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt this.selectRootItem = selectRootItem; loadMyLogin(); loadMyFirstName(); + loadAllowedMimeTypesForPreview(); return this.explorerPanel; } + + /** * Edi permissions. * @@ -2633,6 +2639,22 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt } }); } + + private void loadAllowedMimeTypesForPreview() { + + rpcWorkspaceService.getAllowedMimetypesForPreview(new AsyncCallback>>() { + + @Override + public void onFailure(Throwable caught) { + } + + @Override + public void onSuccess(Map> result) { + + mapOfAllowedMimeTypesForPreview = result; + } + }); + } /** * Load my first name. diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/SubscriberInterface.java b/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/SubscriberInterface.java index 414e660..b14bd92 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/SubscriberInterface.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/interfaces/SubscriberInterface.java @@ -2,6 +2,7 @@ package org.gcube.portlets.user.workspace.client.interfaces; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.gcube.portlets.user.workspace.client.ConstantsExplorer.ViewSwitchType; import org.gcube.portlets.user.workspace.client.ConstantsExplorer.WS_UPLOAD_TYPE; @@ -204,8 +205,9 @@ public interface SubscriberInterface { * Show details. * * @param fileModel the file model + * @param mapAllowedMimeTypesForPreview the map allowed mime types for preview */ - void showDetails(FileModel fileModel); + void showDetails(FileModel fileModel, Map> mapAllowedMimeTypesForPreview); } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/resources/Icons.java b/src/main/java/org/gcube/portlets/user/workspace/client/resources/Icons.java index 7e211ca..9c29f9d 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/resources/Icons.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/resources/Icons.java @@ -418,7 +418,7 @@ public interface Icons extends ClientBundle { @Source("icons/sync-icon-synched.png") ImageResource syncIconSynched(); - @Source("icons/preview-not-available.png") + @Source("icons/no-preview-available.png") ImageResource previewNotAvailable(); } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/resources/icons/no-preview-available.png b/src/main/java/org/gcube/portlets/user/workspace/client/resources/icons/no-preview-available.png new file mode 100644 index 0000000000000000000000000000000000000000..9e324b072fc41c84fb2bdb6105c412d667eae924 GIT binary patch literal 4203 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 literal 4396 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 diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java index 0c7d432..a094c18 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceService.java @@ -688,4 +688,11 @@ public interface GWTWorkspaceService extends RemoteService { */ String updateDescriptionForItem(String itemId, String newDescription) throws Exception; + /** + * Gets the allowed mimetypes for preview. + * + * @return the allowed mimetypes for preview + */ + Map> getAllowedMimetypesForPreview(); + } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java index 93f1296..2f236c4 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/rpc/GWTWorkspaceServiceAsync.java @@ -622,5 +622,14 @@ public interface GWTWorkspaceServiceAsync { * @param callback the callback */ void updateDescriptionForItem(String itemId, String newDescription, AsyncCallback callback); + + + + /** + * Gets the allowed mimetypes for preview. + * + * @return the allowed mimetypes for preview + */ + void getAllowedMimetypesForPreview(AsyncCallback>> callback); } diff --git a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.java b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.java index ff4926d..3a5ae67 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.java +++ b/src/main/java/org/gcube/portlets/user/workspace/client/view/windows/DialogGetInfoBootstrap.java @@ -12,7 +12,6 @@ import org.gcube.portlets.user.workspace.client.event.FileDownloadEvent.Download import org.gcube.portlets.user.workspace.client.interfaces.GXTFolderItemTypeEnum; import org.gcube.portlets.user.workspace.client.model.FileGridModel; import org.gcube.portlets.user.workspace.client.model.FileModel; -import org.gcube.portlets.user.workspace.client.resources.Icons; import org.gcube.portlets.user.workspace.client.resources.Resources; import org.gcube.portlets.user.workspace.client.workspace.GWTWorkspaceItem; import org.gcube.portlets.user.workspace.client.workspace.folder.item.GWTExternalImage; @@ -52,6 +51,7 @@ import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.NamedFrame; import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.user.server.Base64Utils; // TODO: Auto-generated Javadoc /** @@ -62,6 +62,8 @@ import com.google.gwt.user.client.ui.Widget; */ public class DialogGetInfoBootstrap extends Composite { + private static final int PREVIEW_WAITING_TIME = 10000; + private static DialogGetInfoBootstrapUiBinder uiBinder = GWT.create(DialogGetInfoBootstrapUiBinder.class); /** @@ -189,16 +191,24 @@ public class DialogGetInfoBootstrap extends Composite { private Long fileSize = null; + private Map> mapAllowedMimeTypesForPreview; + + private Image spinnerImage = Resources.getIconLoading().createImage(); + + private Image noPreviewAvailable = new Image(Resources.getPreviewNotAvailable()); + /** * Instantiates a new dialog get info bootstrap. * * @param fileModel the file model * @param onCloseCommand the on close command + * @param mapAllowedMimeTypesForPreview the map allowed mime types for preview */ - public DialogGetInfoBootstrap(final FileModel fileModel, final Command onCloseCommand) { + public DialogGetInfoBootstrap(final FileModel fileModel, final Command onCloseCommand, Map> mapAllowedMimeTypesForPreview) { initWidget(uiBinder.createAndBindUi(this)); this.fileModel = fileModel; this.onCloseCommand = onCloseCommand; + this.mapAllowedMimeTypesForPreview = mapAllowedMimeTypesForPreview; this.cgTxtMimeType.setVisible(true); buttonClose.getElement().getStyle().setFloat(Float.RIGHT); @@ -340,111 +350,93 @@ public class DialogGetInfoBootstrap extends Composite { // SOLUTION BASED ON GOOGLE DOC VIEWER - if (typeEnum.equals(GXTFolderItemTypeEnum.EXTERNAL_PDF_FILE) || - - typeEnum.equals(GXTFolderItemTypeEnum.PDF_DOCUMENT) - || typeEnum.equals(GXTFolderItemTypeEnum.EXTERNAL_FILE)) { - - AppControllerExplorer.rpcWorkspaceService.getPublicLinkForFileItemId(fileModel.getIdentifier(), false, - new AsyncCallback() { - - @Override - public void onFailure(Throwable caught) { - } - - @Override - public void onSuccess(PublicLink result) { - - GWT.log("The PublicLink link is: " + result); - - if (result != null) { - - //if file size is null or greater than 25MB - long byteTo25MB = 1024*1024*25; - GWT.log("The file size is: "+fileSize); - if(fileSize==null || fileSize>byteTo25MB) { - GWT.log("The file size is null or greater than "+byteTo25MB+", returning"); - //htmlPanelFilePreview.add(new Image(Resources.getPreviewNotAvailable())); - return; - } - -// String pdfPreview = ""; - - String googleDocViewerURL = "https://docs.google.com/viewer?url=" - + URL.encode(result.getCompleteURL()) + "&embedded=true"; - - final HTML loadingPreviewHTML = new HTML(); - setPlaceholder(loadingPreviewHTML, "loading preview..."); - - final Frame frame = instanceFrame(googleDocViewerURL, loadingPreviewHTML); - - final long startTime = new Date().getTime(); - Timer timer = new Timer() { + if (typeEnum.equals(GXTFolderItemTypeEnum.EXTERNAL_PDF_FILE) + || typeEnum.equals(GXTFolderItemTypeEnum.PDF_DOCUMENT) + || typeEnum.equals(GXTFolderItemTypeEnum.EXTERNAL_FILE) + || typeEnum.equals(GXTFolderItemTypeEnum.GCUBE_ITEM) + || typeEnum.equals(GXTFolderItemTypeEnum.URL_DOCUMENT) + || typeEnum.equals(GXTFolderItemTypeEnum.METADATA)){ + + if(mapAllowedMimeTypesForPreview.containsKey(fileModel.getType())){ + GWT.log("Mime type "+fileModel.getType()+" allowed for preview, try to display it"); + + AppControllerExplorer.rpcWorkspaceService.getPublicLinkForFileItemId(fileModel.getIdentifier(), false, + new AsyncCallback() { + + @Override + public void onFailure(Throwable caught) { + } + + @Override + public void onSuccess(PublicLink result) { + + GWT.log("The PublicLink link is: " + result); + + if (result != null) { - @Override - public void run() { - GWT.log("Checking if the iFrameGoogleDocViewer is ready"); - if(iFrameGoogleDocViewerLoaded) { - removePlaceHolder(loadingPreviewHTML); - GWT.log("iFrameGoogleDocViewer currently loaded, cancelling timer"); - cancel(); - return; - } - long checkTime = new Date().getTime(); - long diff = checkTime - startTime; - if(diff>5000) {//is greater than 5 sec - try { - GWT.log("iFrameGoogleDocViewer not loaded within 5 sec, cancelling timer, removing iframe"); - cancel(); + //if file size is null or greater than 25MB + long byteTo25MB = 1024*1024*25; + GWT.log("The file size is: "+fileSize); + if(fileSize==null || fileSize>byteTo25MB) { + GWT.log("The file size is null or greater than "+byteTo25MB+", returning"); + //htmlPanelFilePreview.add(new Image(Resources.getPreviewNotAvailable())); + return; + } + + // String pdfPreview = ""; + + String googleDocViewerURL = "https://docs.google.com/viewer?url=" + + URL.encode(result.getCompleteURL()) + "&embedded=true"; + + final HTML loadingPreviewHTML = new HTML(); + setPlaceholder(loadingPreviewHTML, true, "loading preview..."); + + final Frame frame = instanceFrame(googleDocViewerURL, loadingPreviewHTML); + + final long startTime = new Date().getTime(); + Timer timer = new Timer() { + + @Override + public void run() { + GWT.log("Checking if the iFrameGoogleDocViewer is ready"); + if(iFrameGoogleDocViewerLoaded) { removePlaceHolder(loadingPreviewHTML); - htmlPanelFilePreview.add(new Image(Resources.getPreviewNotAvailable())); - frame.setVisible(false); - htmlPanelFilePreview.remove(frame); - }catch (Exception e) { - //Silent + GWT.log("iFrameGoogleDocViewer currently loaded, cancelling timer"); + cancel(); + return; + } + long checkTime = new Date().getTime(); + long diff = checkTime - startTime; + if(diff>PREVIEW_WAITING_TIME) {//is greater than 10 sec + try { + GWT.log("iFrameGoogleDocViewer not loaded within 5 sec, cancelling timer, removing iframe"); + cancel(); + removePlaceHolder(loadingPreviewHTML); + htmlPanelFilePreview.add(noPreviewAvailable); + frame.setVisible(false); + htmlPanelFilePreview.remove(frame); + }catch (Exception e) { + //Silent + } } } - } - }; - timer.scheduleRepeating(200); - - htmlPanelFilePreview.add(loadingPreviewHTML); - htmlPanelFilePreview.add(frame); - htmlPanelFilePreview.setVisible(true); + }; + timer.scheduleRepeating(200); + + htmlPanelFilePreview.add(loadingPreviewHTML); + htmlPanelFilePreview.add(frame); + htmlPanelFilePreview.setVisible(true); + } } - } - }); + }); + }else { + GWT.log("Mime type "+fileModel.getType()+" NOT allowed for preview, displaying 'No preview available'"); + htmlPanelFilePreview.add(noPreviewAvailable); + htmlPanelFilePreview.setVisible(true); + } } - - //SOLUTION BASED ON PDFOBEJCT - /*if(typeEnum.equals(GXTFolderItemTypeEnum.EXTERNAL_PDF_FILE) || - typeEnum.equals(GXTFolderItemTypeEnum.PDF_DOCUMENT)) { - - GWT.log("The file is a PDF"); - - AppControllerExplorer.rpcWorkspaceService.getPublicLinkForFileItemId(fileModel.getIdentifier(), false, new AsyncCallback() { - - @Override - public void onFailure(Throwable caught) { - } - - @Override - public void onSuccess(PublicLink result) { - - GWT.log("The PublicLink link is: "+result); - - if(result!=null) { - - String pdfPreview = "
"; - htmlPanelFilePreview.add(new HTML(pdfPreview)); - showPDFPreview(result.getCompleteURL(), "pdfPrewiewDiv"); - htmlPanelFilePreview.setVisible(true); - } - } - }); - }*/ } addHandlers(); @@ -602,7 +594,7 @@ public class DialogGetInfoBootstrap extends Composite { */ private void loadLocation(FileModel fileModel) { - setPlaceholder(txtLocation, "loading..."); + setPlaceholder(txtLocation, false, "loading..."); AppControllerExplorer.rpcWorkspaceService.getListParentsByItemIdentifier(fileModel.getIdentifier(), false, new AsyncCallback>() { @@ -641,7 +633,7 @@ public class DialogGetInfoBootstrap extends Composite { */ private void loadSize(final String itemId) { GWT.log("Load size"); - setPlaceholder(txtSize, "loading..."); + setPlaceholder(txtSize, false, "loading..."); fileSize = new Long(-1); //means is loading AppControllerExplorer.rpcWorkspaceService.loadSizeByItemId(itemId, new AsyncCallback() { @@ -673,7 +665,7 @@ public class DialogGetInfoBootstrap extends Composite { */ private void loadCreationDate(final String itemId) { - setPlaceholder(txtCreated, "loading..."); + setPlaceholder(txtCreated, false, "loading..."); AppControllerExplorer.rpcWorkspaceService.getItemCreationDateById(itemId, new AsyncCallback() { @Override @@ -701,7 +693,7 @@ public class DialogGetInfoBootstrap extends Composite { */ private void loadLastModificationDate(final String itemId) { - setPlaceholder(txtLastMofication, "loading..."); + setPlaceholder(txtLastMofication, false, "loading..."); AppControllerExplorer.rpcWorkspaceService.loadLastModificationDateById(itemId, new AsyncCallback() { @Override @@ -794,7 +786,7 @@ public class DialogGetInfoBootstrap extends Composite { */ private void loadACLsDescriptionForSharedFolder(String sharedId) { - setPlaceholder(txtSharedWith, "loading..."); + setPlaceholder(txtSharedWith, true, "loading..."); WorkspaceSharingServiceAsync.INSTANCE.getACLsDescriptionForSharedFolderId(sharedId, new AsyncCallback() { @@ -827,7 +819,7 @@ public class DialogGetInfoBootstrap extends Composite { htmlPanelImagePreview.setVisible(true); final HTML txtLoadingPreview = new HTML(); htmlPanelImagePreview.add(txtLoadingPreview); - setPlaceholder(txtLoadingPreview, "loading preview..."); + setPlaceholder(txtLoadingPreview, true, "loading preview..."); AppControllerExplorer.rpcWorkspaceService.getImageById(fileModel.getIdentifier(), fileModel.getGXTFolderItemType().equals(GXTFolderItemTypeEnum.IMAGE_DOCUMENT), false, @@ -863,8 +855,12 @@ public class DialogGetInfoBootstrap extends Composite { * @param html the html * @param placeholder the placeholder */ - private void setPlaceholder(HTML html, String placeholder) { - html.setHTML(placeholder); + private void setPlaceholder(HTML html, boolean spinner, String placeholder) { + String loadingHMTL = placeholder; + if(spinner) { + loadingHMTL = ""+placeholder+""; + } + html.setHTML(loadingHMTL); html.getElement().addClassName("placeholder-loading"); } diff --git a/src/main/java/org/gcube/portlets/user/workspace/public/workspacetree.css b/src/main/java/org/gcube/portlets/user/workspace/public/workspacetree.css index f33298e..eb8e29e 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/public/workspacetree.css +++ b/src/main/java/org/gcube/portlets/user/workspace/public/workspacetree.css @@ -399,7 +399,7 @@ IN THE 'DETAILS' PANEL*/ } .placeholder-loading { - color: #E8E8E8; + color: rgb(142, 142, 142); } .shared-with-style{ diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java index 2ccf2a7..d71cd0a 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java @@ -53,6 +53,7 @@ import org.gcube.portlets.user.workspace.server.reader.ApplicationProfileReader; import org.gcube.portlets.user.workspace.server.tostoragehub.FormatterUtil; import org.gcube.portlets.user.workspace.server.tostoragehub.ObjectStorageHubToWorkpaceMapper; import org.gcube.portlets.user.workspace.server.tostoragehub.StorageHubToWorkpaceConverter; +import org.gcube.portlets.user.workspace.server.util.MimeTypeUtility; import org.gcube.portlets.user.workspace.server.util.PortalContextInfo; import org.gcube.portlets.user.workspace.server.util.StringUtil; import org.gcube.portlets.user.workspace.server.util.WsUtil; @@ -3077,6 +3078,14 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT } + /** + * Update description for item. + * + * @param itemId the item id + * @param newDescription the new description + * @return the string + * @throws Exception the exception + */ @Override public String updateDescriptionForItem(String itemId, String newDescription) throws Exception { workspaceLogger.info("Called updateDescriptionForItem for itemID: " + itemId); @@ -3101,4 +3110,24 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT return newDescription; } + + + /** + * Gets the allowed mimetypes for preview. + * + * @return the allowed mimetypes for preview + */ + + @Override + public Map> getAllowedMimetypesForPreview(){ + workspaceLogger.info("Called getAllowedMimetypesForPreview"); + + Map> map = MimeTypeUtility.getPreviewMimetypeExtensionMap(); + + workspaceLogger.debug("Returning allowed mimetypes for preview: "+map.keySet()); + + return map; + + } + } diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/util/MimeTypeUtility.java b/src/main/java/org/gcube/portlets/user/workspace/server/util/MimeTypeUtility.java index 454d9f7..16a72f8 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/util/MimeTypeUtility.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/util/MimeTypeUtility.java @@ -22,6 +22,7 @@ import org.apache.tika.mime.MediaType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +// TODO: Auto-generated Javadoc /** * The Class MimeTypeUtil. * @@ -48,15 +49,19 @@ public class MimeTypeUtility { protected static final Map> mimetype_extension_map = new LinkedHashMap>(); protected static final Map extension_mimetype_map = new LinkedHashMap(); + protected static final Map> preview_mimetype_extension_map = new LinkedHashMap>(); static { InputStream extensionToMimetype = MimeTypeUtility.class .getResourceAsStream("/WsExtensionToMimeTypeMap.properties"); InputStream mimetypeToExtension = MimeTypeUtility.class .getResourceAsStream("/WsMimeTypeToExtensionMap.properties"); + InputStream previewMimeTypeToExtension = MimeTypeUtility.class + .getResourceAsStream("/PreviewMimeTypeToExtensionMap.properties"); try { loadExtensions(extensionToMimetype); loadMimeTypes(mimetypeToExtension); + loadPreviewMimeTypes(previewMimeTypeToExtension); } catch (IOException e) { e.printStackTrace(); } @@ -114,6 +119,35 @@ public class MimeTypeUtility { } br.close(); } + + + /** + * Load preview mime types. + * + * @param is the is + * @throws IOException Signals that an I/O exception has occurred. + */ + protected static void loadPreviewMimeTypes(InputStream is) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + + String line = br.readLine(); + + while (line != null) { + String[] split = line.split("="); + if (split.length == 2) { + String mimeType = split[0]; + String extension = split[1]; + List toExtensions = preview_mimetype_extension_map.get(mimeType); + if (toExtensions == null) { + toExtensions = new ArrayList(); + } + toExtensions.add(extension); + preview_mimetype_extension_map.put(mimeType, toExtensions); + } + line = br.readLine(); + } + br.close(); + } /** * Gets the extension. @@ -279,5 +313,16 @@ public class MimeTypeUtility { public static Map getExtensionToMimeTypeMap() { return extension_mimetype_map; } + + + /** + * Gets the preview mimetype extension map with the + * mime types allowed for preview displaying + * + * @return the preview mimetype extension map + */ + public static Map> getPreviewMimetypeExtensionMap() { + return preview_mimetype_extension_map; + } } diff --git a/src/main/resources/PreviewMimeTypeToExtensionMap.properties b/src/main/resources/PreviewMimeTypeToExtensionMap.properties new file mode 100644 index 0000000..4f280e0 --- /dev/null +++ b/src/main/resources/PreviewMimeTypeToExtensionMap.properties @@ -0,0 +1,62 @@ +application/msword=doc +application/pdf=pdf +application/rtf=rtf +application/vnd.ms-excel=xls +application/vnd.ms-powerpoint=ppt +application/vnd.openxmlformats-officedocument.wordprocessingml.document=docx +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet=xlsx +application/vnd.openxmlformats-officedocument.presentationml.presentation=pptx +application/x-javascript=js +application/json=json +audio/mid=mid +audio/mpeg=mp3 +audio/x-wav=wav +image/bmp=bmp +image/gif=gif +image/ief=ief +image/jpeg=jpe +image/jpeg=jpeg +image/jpeg=jpg +image/pipeg=jfif +image/svg+xml=svg +image/tiff=tif +image/tiff=tiff +image/x-cmu-raster=ras +image/x-cmx=cmx +image/x-icon=ico +image/x-rgb=rgb +text/css=css +text/html=htm +text/html=stm +text/html=html +text/plain=bas +text/plain=c +text/plain=h +text/plain=txt +text/richtext=rtx +text/scriptlet=sct +text/tab-separated-values=tsv +text/uri-list=txt +text/webviewhtml=htt +text/x-component=htc +video/mpeg=mp2 +video/mpeg=mpa +video/mpeg=mpe +video/mpeg=mpeg +video/mpeg=mpg +video/mpeg=mpv2 +video/quicktime=mov +video/quicktime=qt +video/x-la-asf=lsf +video/x-la-asf=lsx +video/x-ms-asf=asf +video/x-ms-asf=asr +video/x-ms-asf=asx +video/x-msvideo=avi +video/x-sgi-movie=movie +x-world/x-vrml=flr +x-world/x-vrml=vrml +x-world/x-vrml=wrl +x-world/x-vrml=wrz +x-world/x-vrml=xaf +x-world/x-vrml=xof \ No newline at end of file