Skip to content

Commit

Permalink
Final reorganization of the code used to group files by type, for the…
Browse files Browse the repository at this point in the history
… search facets and default thumbnail icons.

(ref #2202)
  • Loading branch information
landreev committed Jun 4, 2019
1 parent edcfad3 commit 1752b2a
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 65 deletions.
62 changes: 10 additions & 52 deletions src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,20 +66,6 @@ public class DataFileServiceBean implements java.io.Serializable {
@PersistenceContext(unitName = "VDCNet-ejbPU")
private EntityManager em;

// File type "classes" tags:

private static final String FILE_CLASS_AUDIO = "audio";
private static final String FILE_CLASS_CODE = "code";
private static final String FILE_CLASS_DOCUMENT = "document";
private static final String FILE_CLASS_ASTRO = "astro";
private static final String FILE_CLASS_IMAGE = "image";
private static final String FILE_CLASS_NETWORK = "network";
private static final String FILE_CLASS_GEO = "geodata";
private static final String FILE_CLASS_TABULAR = "tabular";
private static final String FILE_CLASS_VIDEO = "video";
private static final String FILE_CLASS_PACKAGE = "package";
private static final String FILE_CLASS_OTHER = "other";

// Assorted useful mime types:

// 3rd-party and/or proprietary tabular data formasts that we know
Expand Down Expand Up @@ -1135,51 +1121,23 @@ public String getFileClassById (Long fileId) {
return null;
}

return getFileClass(file);
return getFileThumbnailClass(file);
}

public String getFileClass (DataFile file) {
if (isFileClassImage(file)) {
return FILE_CLASS_IMAGE;
}

if (isFileClassVideo(file)) {
return FILE_CLASS_VIDEO;
}

if (isFileClassAudio(file)) {
return FILE_CLASS_AUDIO;
}

if (isFileClassCode(file)) {
return FILE_CLASS_CODE;
}

if (isFileClassDocument(file)) {
return FILE_CLASS_DOCUMENT;
}

if (isFileClassAstro(file)) {
return FILE_CLASS_ASTRO;
}

if (isFileClassNetwork(file)) {
return FILE_CLASS_NETWORK;
}

if (isFileClassGeo(file)) {
return FILE_CLASS_GEO;
public String getFileThumbnailClass (DataFile file) {
// there's no solr search facet for "package files", but
// there is a special thumbnail icon:
if (isFileClassPackage(file)) {
return FileUtil.FILE_THUMBNAIL_CLASS_PACKAGE;
}

if (isFileClassTabularData(file)) {
return FILE_CLASS_TABULAR;
}
String fileTypeFacet = FileUtil.getFacetFileType(file);

if (isFileClassPackage(file)) {
return FILE_CLASS_PACKAGE;
if (fileTypeFacet != null && FileUtil.FILE_THUMBNAIL_CLASSES.containsKey(fileTypeFacet)) {
return FileUtil.FILE_THUMBNAIL_CLASSES.get(fileTypeFacet);
}

return FILE_CLASS_OTHER;
return FileUtil.FILE_THUMBNAIL_CLASS_OTHER;
}


Expand Down
2 changes: 2 additions & 0 deletions src/main/java/edu/harvard/iq/dataverse/api/Access.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@
import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
import javax.ws.rs.core.StreamingOutput;
import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json;
import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json;
import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json;

/*
Custom API exceptions [NOT YET IMPLEMENTED]
Expand Down
65 changes: 60 additions & 5 deletions src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,59 @@ public class FileUtil implements java.io.Serializable {

public static final String MIME_TYPE_INGESTED_FILE = "text/tab-separated-values";

// File type "thumbnail classes" tags:

public static final String FILE_THUMBNAIL_CLASS_AUDIO = "audio";
public static final String FILE_THUMBNAIL_CLASS_CODE = "code";
public static final String FILE_THUMBNAIL_CLASS_DOCUMENT = "document";
public static final String FILE_THUMBNAIL_CLASS_ASTRO = "astro";
public static final String FILE_THUMBNAIL_CLASS_IMAGE = "image";
public static final String FILE_THUMBNAIL_CLASS_NETWORK = "network";
public static final String FILE_THUMBNAIL_CLASS_GEOSHAPE = "geodata";
public static final String FILE_THUMBNAIL_CLASS_TABULAR = "tabular";
public static final String FILE_THUMBNAIL_CLASS_VIDEO = "video";
public static final String FILE_THUMBNAIL_CLASS_PACKAGE = "package";
public static final String FILE_THUMBNAIL_CLASS_OTHER = "other";

// File type facets, as returned by the getFacetFileType() method in this utility:

private static final String FILE_FACET_CLASS_ARCHIVE = "Archive";
private static final String FILE_FACET_CLASS_AUDIO = "Audio";
private static final String FILE_FACET_CLASS_CODE = "Code";
private static final String FILE_FACET_CLASS_DATA = "Data";
private static final String FILE_FACET_CLASS_DOCUMENT = "Document";
private static final String FILE_FACET_CLASS_ASTRO = "FITS";
private static final String FILE_FACET_CLASS_IMAGE = "Image";
private static final String FILE_FACET_CLASS_NETWORK = "Network Data";
private static final String FILE_FACET_CLASS_GEOSHAPE = "Shape";
private static final String FILE_FACET_CLASS_TABULAR = "Tabular Data";
private static final String FILE_FACET_CLASS_VIDEO = "Video";
private static final String FILE_FACET_CLASS_TEXT = "Text";
private static final String FILE_FACET_CLASS_OTHER = "Other";
private static final String FILE_FACET_CLASS_UNKNOWN = "Unknown";

// The file type facets and type-specific thumbnail classes (above) are
// very similar, but not exactly 1:1; so the following map is for
// maintaining the relationship between the two:

public static Map<String, String> FILE_THUMBNAIL_CLASSES = new HashMap<String, String>();

static {
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_VIDEO, FILE_THUMBNAIL_CLASS_VIDEO);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_AUDIO, FILE_THUMBNAIL_CLASS_AUDIO);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_CODE, FILE_THUMBNAIL_CLASS_CODE);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_DATA, FILE_THUMBNAIL_CLASS_DOCUMENT);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_NETWORK, FILE_THUMBNAIL_CLASS_NETWORK);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_ASTRO, FILE_THUMBNAIL_CLASS_ASTRO);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_IMAGE, FILE_THUMBNAIL_CLASS_IMAGE);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_DOCUMENT, FILE_THUMBNAIL_CLASS_DOCUMENT);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_GEOSHAPE, FILE_THUMBNAIL_CLASS_GEOSHAPE);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_TABULAR, FILE_THUMBNAIL_CLASS_TABULAR);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_TEXT, FILE_THUMBNAIL_CLASS_DOCUMENT);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_OTHER, FILE_THUMBNAIL_CLASS_OTHER);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_UNKNOWN, FILE_THUMBNAIL_CLASS_OTHER);
FILE_THUMBNAIL_CLASSES.put(FILE_FACET_CLASS_ARCHIVE, FILE_THUMBNAIL_CLASS_OTHER);
}

/**
* This string can be prepended to a Base64-encoded representation of a PNG
Expand Down Expand Up @@ -234,18 +287,20 @@ public static String getFacetFileType(DataFile dataFile) {
} catch (MissingResourceException e) {
// if there's no defined "facet-friendly" form of this mime type
// we'll truncate the available type by "/", e.g., all the
// unknown image/* types will become "image"; many other, quite
// different types will all become "application" this way -
// but it is probably still better than to tag them all as
// "uknown".
// -- L.A. 4.0 alpha 1
// unknown image/* types will become "image".
// Since many other, quite different types would then all become
// "application" - we will use the facet "Other" for all the
// application/* types not specifically defined in the properties file.
//
// UPDATE, MH 4.9.2
// Since production is displaying both "tabulardata" and "Tabular Data"
// we are going to try to add capitalization here to this function
// in order to capitalize all the unknown types that are not called
// out in MimeTypeFacets.properties
String typeClass = fileType.split("/")[0];
if ("Application".equals(typeClass)) {
return FILE_FACET_CLASS_OTHER;
}
return Character.toUpperCase(typeClass.charAt(0)) + typeClass.substring(1);
}
} else {
Expand Down
2 changes: 1 addition & 1 deletion src/main/webapp/editFilesFragment.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@
<p:graphicImage value="/api/access/datafile/#{fileMetadata.dataFile.id}?imageThumb=true"/>
</span>
<!-- Default Icon -->
<span class="icon-#{dataFileServiceBean.getFileClass(fileMetadata.dataFile)} file-thumbnail-icon text-muted" jsf:rendered="#{(!empty fileMetadata.dataFile.id and !dataFileServiceBean.isThumbnailAvailable(fileMetadata.dataFile)) or (empty fileMetadata.dataFile.id and !fileMetadata.dataFile.previewImageAvailable)}"/>
<span class="icon-#{dataFileServiceBean.getFileThumbnailClass(fileMetadata.dataFile)} file-thumbnail-icon text-muted" jsf:rendered="#{(!empty fileMetadata.dataFile.id and !dataFileServiceBean.isThumbnailAvailable(fileMetadata.dataFile)) or (empty fileMetadata.dataFile.id and !fileMetadata.dataFile.previewImageAvailable)}"/>
<ui:fragment rendered="#{empty fileMetadata.dataFile.id and !empty fileMetadata.dataFile.storageIdentifier and fileMetadata.dataFile.previewImageAvailable}">
<h:graphicImage value="#{EditDatafilesPage.getTemporaryPreviewAsBase64(fileMetadata.dataFile.storageIdentifier)}"/>
<h:outputText id="imgPreview" value="#{bundle['preview']}" styleClass="bg-info text-info text-center show"/>
Expand Down
2 changes: 1 addition & 1 deletion src/main/webapp/file-info-fragment.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<div id="fileInfoInclude-filesTable" class="col-sm-12 row">
<div class="pull-left col-file-thumb">
<div class="thumbnail-block text-center">
<span class="icon-#{dataFileServiceBean.getFileClass(fileMetadata.dataFile)} file-thumbnail-icon text-muted" jsf:rendered="#{!EditDatafilesPage.isThumbnailAvailable(fileMetadata)}"/>
<span class="icon-#{dataFileServiceBean.getFileThumbnailClass(fileMetadata.dataFile)} file-thumbnail-icon text-muted" jsf:rendered="#{!EditDatafilesPage.isThumbnailAvailable(fileMetadata)}"/>
<span class="file-thumbnail-preview-img" jsf:rendered="#{EditDatafilesPage.isThumbnailAvailable(fileMetadata)}"
data-container="body" data-toggle="popover" data-placement="top" data-trigger="hover" data-html="true" data-content="&lt;img src=&#34;/api/access/datafile/#{fileMetadata.dataFile.id}?imageThumb=400&#34; alt=&#34; #{bundle['file.preview']} #{fileMetadata.label}&#34; /&gt;">
<p:graphicImage value="/api/access/datafile/#{fileMetadata.dataFile.id}?imageThumb=true"/>
Expand Down
2 changes: 1 addition & 1 deletion src/main/webapp/file.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@
<div id="file-preview-icon-block" class="col-xs-4">
<div id="border-block">
<div id="preview-square">
<span class="icon-#{dataFileServiceBean.getFileClass(FilePage.fileMetadata.dataFile)} text-muted" jsf:rendered="#{!FilePage.isThumbnailAvailable(FilePage.fileMetadata)}"/>
<span class="icon-#{dataFileServiceBean.getFileThumbnailClass(FilePage.fileMetadata.dataFile)} text-muted" jsf:rendered="#{!FilePage.isThumbnailAvailable(FilePage.fileMetadata)}"/>
<p:graphicImage styleClass="img-responsive" value="/api/access/datafile/#{FilePage.fileId}?imageThumb=400" rendered="#{FilePage.isThumbnailAvailable(FilePage.fileMetadata)}"/>
</div>
</div>
Expand Down
4 changes: 2 additions & 2 deletions src/main/webapp/filesFragment.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@
</span>

<!-- Default Icon -->
<span class="icon-#{dataFileServiceBean.getFileClass(fileMetadata.dataFile)} file-thumbnail-icon text-muted" jsf:rendered="#{(!empty fileMetadata.dataFile.id and !DatasetPage.isThumbnailAvailable(fileMetadata)) or (empty fileMetadata.dataFile.id and !dataFileServiceBean.isTemporaryPreviewAvailable(fileMetadata.dataFile.storageIdentifier, fileMetadata.dataFile.contentType))}"/>
<span class="icon-#{dataFileServiceBean.getFileThumbnailClass(fileMetadata.dataFile)} file-thumbnail-icon text-muted" jsf:rendered="#{(!empty fileMetadata.dataFile.id and !DatasetPage.isThumbnailAvailable(fileMetadata)) or (empty fileMetadata.dataFile.id and !dataFileServiceBean.isTemporaryPreviewAvailable(fileMetadata.dataFile.storageIdentifier, fileMetadata.dataFile.contentType))}"/>

<!-- the "temp preview" is for new, not yet saved files; these should never appear on this page - as we now have the editfilespage for that, correct? -->
<ui:fragment rendered="#{empty fileMetadata.dataFile.id and !empty fileMetadata.dataFile.storageIdentifier and dataFileServiceBean.isTemporaryPreviewAvailable(fileMetadata.dataFile.storageIdentifier, fileMetadata.dataFile.contentType)}">
Expand Down Expand Up @@ -445,7 +445,7 @@

<p:treeNode type="customFileNode">
<!-- For a file, the payload data ("node") is the corresponding FileMetadata object: -->
<span class="icon-#{dataFileServiceBean.getFileClass(node.dataFile)} text-muted" />
<span class="icon-#{dataFileServiceBean.getFileThumbnailClass(node.dataFile)} text-muted" />

<!-- same approach to rendering file page links, as in the file table above: -->
<!-- if the file has the global id, we use that; if not, we use the database id in the url. -->
Expand Down
2 changes: 1 addition & 1 deletion src/main/webapp/search-include-fragment.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -581,7 +581,7 @@
<div class="card-preview-icon-block text-center">
<a href="#{!SearchIncludeFragment.rootDv and !result.isInTree ? (result.harvested ? result.fileDatasetUrl : result.fileUrl) : widgetWrapper.wrapURL(result.harvested ? result.fileDatasetUrl : result.fileUrl)}" target="#{(!SearchIncludeFragment.rootDv and !result.isInTree and widgetWrapper.widgetView) or result.harvested ? '_blank' : ''}">
<h:graphicImage value="#{result.imageUrl}" rendered="#{!empty result.imageUrl}"/>
<span class="icon-#{dataFileServiceBean.getFileClass(result.entity)} text-muted h1"
<span class="icon-#{dataFileServiceBean.getFileThumbnailClass(result.entity)} text-muted h1"
jsf:rendered="#{empty result.imageUrl}"/>
</a>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,8 @@ public void testIsThumbnailSupportedForSize() throws Exception {
*/
@Test
public void testGetFileClass() throws Exception {
assertEquals("other", dataFileServiceBean.getFileClass(fileWoContentType));
assertEquals("other", dataFileServiceBean.getFileClass(fileWithBogusContentType));
assertEquals("other", dataFileServiceBean.getFileThumbnailClass(fileWoContentType));
assertEquals("other", dataFileServiceBean.getFileThumbnailClass(fileWithBogusContentType));
}

/**
Expand Down

0 comments on commit 1752b2a

Please sign in to comment.