Skip to content

Commit

Permalink
Simplified the backend code (was able to get rid of the custom node d…
Browse files Browse the repository at this point in the history
…ata class; and it's still just as fast). #5572
  • Loading branch information
landreev committed Apr 8, 2019
1 parent d0e1122 commit 66e2beb
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 127 deletions.
141 changes: 24 additions & 117 deletions src/main/java/edu/harvard/iq/dataverse/DatasetPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -1682,7 +1682,7 @@ public TreeNode getFilesTreeRoot() {
}

private void initFilesTree() {
filesTreeRoot = createFolderTreeNode("root", null, null);
filesTreeRoot = createFolderTreeNode("root", null);
TreeNode currentNode = filesTreeRoot;
// this is a temporary map, that we keep while we are building
// the tree - in order to have direct access to the ancestor tree
Expand All @@ -1699,12 +1699,10 @@ private void initFilesTree() {
filesTreeRoot.getChildren().add(createFileTreeNode(fileMetadata, filesTreeRoot));
} else {
if (folderMap.containsKey(folder)) {
/*if (currentNode.getData().getFolderPath().equals(folder)) {*/
// We have already created this node; and since all the FileMetadatas
// are sorted by folder-then-label, it is safe to assume this is
// still the "current node":
currentNode.getChildren().add(createFileTreeNode(fileMetadata, currentNode));
/*} else {
// error! shouldn't happen!
logger.severe("filemetadatas out of sorted order (should be sorted by folder-label)");
}*/
} else {
// no node for this folder yet - need to create!

Expand All @@ -1719,13 +1717,11 @@ private void initFilesTree() {
}

if (folderMap.containsKey(folderPath)) {
logger.fine("folder " + folderPath + " already exists;");
// jump directly to that ancestor folder node:
currentNode = folderMap.get(folderPath);
} else {
// create a new folder node:
logger.fine("creating folder " + folderPath);
currentNode = createFolderTreeNode(subfolders[level], folderPath, currentNode);
currentNode = createFolderTreeNode(subfolders[level], currentNode);
folderMap.put(folderPath, currentNode);
// all the folders, except for the top-level root node
// are collapsed by default:
Expand All @@ -1735,7 +1731,7 @@ private void initFilesTree() {
level++;
}
currentNode.getChildren().add(createFileTreeNode(fileMetadata, currentNode));
// As soon as we find the first folder containing files, we want
// As soon as we reach the first folder containing files, we want
// to have all the other folders collapsed by default:
if (expandFolders) {
expandFolders = false;
Expand All @@ -1748,31 +1744,29 @@ private void initFilesTree() {

}

private DefaultTreeNode createFolderTreeNode(String name, String path, TreeNode parent) {

FileTreeNodeData data = new FileTreeNodeData();

data.setIsFolder(true);
data.setFolderName(name);
data.setFolderPath(path);


DefaultTreeNode folderNode = new DefaultTreeNode(data, parent);

private DefaultTreeNode createFolderTreeNode(String name, TreeNode parent) {
// For a tree node representing a folder, we use its name, as a String,
// as the node data payload. (meaning, in the xhtml the folder name can
// be shown as simply "#{node}".
// If we ever want to have more information shown for folders in the
// tree view (for example, we could show the number of files and sub-folders
// in each folder next to the name), we will have to define a custom class
// and use it instead of the string in the DefaultTreeNode constructor
// below:
DefaultTreeNode folderNode = new DefaultTreeNode(name, parent);
return folderNode;
}

private DefaultTreeNode createFileTreeNode(FileMetadata fileMetadata, TreeNode parent) {
FileTreeNodeData data = new FileTreeNodeData();

data.setIsFolder(false);
data.setFileName(fileMetadata.getLabel());
data.setFileSize(fileMetadata.getDataFile().getFriendlySize());
data.setDataFileId(fileMetadata.getDataFile().getId());
data.setDataFileGlobalId(fileMetadata.getDataFile().getGlobalId().asString());
data.setFileClass(datafileService.getFileClass(fileMetadata.getDataFile()));
// For a tree node representing a DataFile, we pack the entire FileMetadata
// object into the node, as its "data" payload.
// Note that we are using a custom node type ("customFileNode"), defined
// in the page xhtml.
// If we ever want to have customized nodes that display different types
// of information for different types of files (tab. files would be a
// natural case), more custom nodes could be defined.

DefaultTreeNode fileNode = new DefaultTreeNode("customFileNode", data, parent);
DefaultTreeNode fileNode = new DefaultTreeNode("customFileNode", fileMetadata, parent);

return fileNode;
}
Expand Down Expand Up @@ -4711,91 +4705,4 @@ public void archiveVersion(Long id) {
}
}
}

public class FileTreeNodeData {

private boolean isFolder = false;

public boolean isFile() {
return !isFolder;
}

public boolean isFolder() {
return isFolder;
}

public void setIsFolder(boolean isFolder) {
this.isFolder = isFolder;
}

private Long dataFileId = null;

public void setDataFileId(Long dataFileId) {
this.dataFileId = dataFileId;
}

public Long getDataFileId() {
return dataFileId;
}

private String dataFileGlobalId = null;

public void setDataFileGlobalId(String dataFileGlobalId) {
this.dataFileGlobalId = dataFileGlobalId;
}

public String getDataFileGlobalId() {
return dataFileGlobalId;
}

private String fileClass = null;

public String getFileClass() {
return fileClass;
}

public void setFileClass(String fileClass) {
this.fileClass = fileClass;
}

private String fileName = null;

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

private String fileSize = null;

public String getFileSize() {
return fileSize;
}

public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}

private String folderName = null;

public String getFolderName() {
return folderName;
}

public void setFolderName(String folderName) {
this.folderName = folderName;
}

private String folderPath = null;

public String getFolderPath() {
return folderPath;
}

public void setFolderPath(String folderPath) {
this.folderPath = folderPath;
}
}
}
24 changes: 14 additions & 10 deletions src/main/webapp/filesFragment.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -436,24 +436,28 @@
var="node">

<p:treeNode expandedIcon="ui-icon ui-icon-folder-open" collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node.folderName}" />
<!-- For a folder, the node payload is just its name as a String object, that we display here: -->
<h:outputText value="#{node}" />
</p:treeNode>

<p:treeNode type="customFileNode">
<span class="icon-#{node.fileClass} text-muted" />

<ui:fragment rendered="#{!empty node.dataFileGlobalId}">
<a href="#{widgetWrapper.wrapURL('/file.xhtml?persistentId='.concat(node.dataFileGlobalId).concat('&amp;version=').concat(DatasetPage.workingVersion.friendlyVersionNumber))}">
#{node.fileName}
<!-- For a file, the payload data ("node") is the corresponding FileMetadata object: -->
<span class="icon-#{dataFileServiceBean.getFileClass(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. -->
<ui:fragment rendered="#{!empty node.dataFile.globalIdString}">
<a href="#{widgetWrapper.wrapURL('/file.xhtml?persistentId='.concat(node.dataFile.globalIdString).concat('&amp;version=').concat(DatasetPage.workingVersion.friendlyVersionNumber))}">
#{node.label}
</a>
</ui:fragment>
<ui:fragment rendered="#{empty node.dataFileGlobalId}">
<a href="#{widgetWrapper.wrapURL('/file.xhtml?fileId='.concat(node.dataFileId).concat('&amp;version=').concat(DatasetPage.workingVersion.friendlyVersionNumber))}">
#{node.fileName}
<ui:fragment rendered="#{empty node.dataFile.globalIdString}">
<a href="#{widgetWrapper.wrapURL('/file.xhtml?fileId='.concat(node.dataFile.id).concat('&amp;version=').concat(DatasetPage.workingVersion.friendlyVersionNumber))}">
#{node.label}
</a>
</ui:fragment>

<span class="text-muted">(#{node.fileSize})</span>
<span class="text-muted">(#{node.dataFile.friendlySize})</span>
</p:treeNode>
</p:tree>
</ui:composition>

0 comments on commit 66e2beb

Please sign in to comment.