diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java
index 1c880ce464b..becb4e4a43a 100644
--- a/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java
+++ b/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java
@@ -1490,11 +1490,16 @@ public UploadSessionQuotaLimit getUploadSessionQuotaLimit(DvObjectContainer pare
// Note that we are checking the recorded storage use not on the
// immediate parent necessarily, but on the specific ancestor
// DvObjectContainer on which the storage quota is defined:
- Long currentSize = storageUseService.findStorageSizeByDvContainerId(testDvContainer.getId());
+ Long currentSize = currentStorageSizeInBytes(testDvContainer);
return new UploadSessionQuotaLimit(quota.getAllocation(), currentSize);
}
+ public Long currentStorageSizeInBytes(DvObjectContainer dvObjectContainer) {
+ return storageUseService.findStorageSizeByDvContainerId(dvObjectContainer.getId() != null ?
+ dvObjectContainer.getId() : dvObjectContainer.getOwner().getId());
+ }
+
public boolean isInReleasedVersion(Long id) {
Query query = em.createNativeQuery("SELECT fm.id FROM filemetadata fm WHERE fm.datasetversion_id=(SELECT dv.id FROM datasetversion dv, dvobject dvo WHERE dv.dataset_id=dvo.owner_id AND dv.versionState='RELEASED' and dvo.id=" + id + " ORDER BY dv.versionNumber DESC, dv.minorVersionNumber DESC LIMIT 1) AND fm.datafile_id=" + id);
diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
index fd0f3be9871..83df2156352 100644
--- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
+++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
@@ -35,16 +35,9 @@
import edu.harvard.iq.dataverse.license.LicenseServiceBean;
import edu.harvard.iq.dataverse.search.IndexServiceBean;
import edu.harvard.iq.dataverse.settings.JvmSettings;
-import edu.harvard.iq.dataverse.settings.Setting;
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
import edu.harvard.iq.dataverse.storageuse.UploadSessionQuotaLimit;
-import edu.harvard.iq.dataverse.util.FileUtil;
-import edu.harvard.iq.dataverse.util.JsfHelper;
-import edu.harvard.iq.dataverse.util.SystemConfig;
-import edu.harvard.iq.dataverse.util.WebloaderUtil;
-import edu.harvard.iq.dataverse.util.BundleUtil;
-import edu.harvard.iq.dataverse.util.EjbUtil;
-import edu.harvard.iq.dataverse.util.FileMetadataUtil;
+import edu.harvard.iq.dataverse.util.*;
import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
import java.io.File;
@@ -188,6 +181,8 @@ public enum Referrer {
private String versionString = "";
+ private String storageSizeStr;
+
private boolean saveEnabled = false;
// Used to store results of permissions checks
@@ -567,6 +562,17 @@ public boolean isFileUploadCountExceeded() {
return !ignoreLimit && !isFileReplaceOperation() && fileUploadsAvailable != null && fileUploadsAvailable == 0;
}
+ /**
+ *
+ * @return cached formatted storage size. '1,234 bytes'; '1.23 GB'; '1.00 TB'
+ */
+ public String getCurrentContainerStorageUse() {
+ if (storageSizeStr == null) {
+ storageSizeStr = StringUtil.formatBytes(datafileService.currentStorageSizeInBytes(dataset.getOwner()));
+ }
+ return storageSizeStr;
+ }
+
public String init() {
// default mode should be EDIT
if (mode == null) {
diff --git a/src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java
index 56f85436773..1d52b403a10 100644
--- a/src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java
+++ b/src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java
@@ -9,14 +9,9 @@
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Base64;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.TreeSet;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
@@ -237,4 +232,26 @@ static public String normalize(String sentence) {
return sentence;
}
+
+ public static final long BYTES_PER_KB = 1024L;
+ public static final long BYTES_PER_MB = BYTES_PER_KB * 1024L;
+ public static final long BYTES_PER_GB = BYTES_PER_MB * 1024L;
+ public static final long BYTES_PER_TB = BYTES_PER_GB * 1024L;
+ static public String formatBytes(long bytes) {
+ if (bytes < BYTES_PER_KB) {
+ return NumberFormat.getNumberInstance().format(bytes) + " bytes";
+ } else {
+ double dBytes = bytes;
+ NumberFormat formatter = new DecimalFormat("#,##0.00");
+ if (bytes < BYTES_PER_MB) {
+ return formatter.format(dBytes / BYTES_PER_KB) + " KB";
+ } else if (bytes < BYTES_PER_GB) {
+ return formatter.format(dBytes / BYTES_PER_MB) + " MB";
+ } else if (bytes < BYTES_PER_TB) {
+ return formatter.format(dBytes / BYTES_PER_GB) + " GB";
+ } else {
+ return formatter.format(dBytes / BYTES_PER_TB) + " TB";
+ }
+ }
+ }
}
diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties
index a9330998015..9093d272368 100644
--- a/src/main/java/propertyFiles/Bundle.properties
+++ b/src/main/java/propertyFiles/Bundle.properties
@@ -1874,6 +1874,7 @@ file.selectToAdd.tipMaxNumFilesUploadsAvailable=Maximum of {0} {0, choice, 0#fil
file.selectToAdd.tipTabularLimit=Tabular file ingest is limited to {2}.
file.selectToAdd.tipPerFileTabularLimit=Ingest is limited to the following file sizes based on their format: {0}.
file.selectToAdd.tipMoreInformation=Select files or drag and drop into the upload widget.
+file.selectToAdd.tipTotalSizeUsed=Total size of Collection: {0}.
file.selectToAdd.dragdropMsg=Drag and drop files here.
file.createUploadDisabled=Upload files using rsync via SSH. This method is recommended for large file transfers. The upload script will be available on the Upload Files page once you save this dataset.
file.fromHTTP=Upload with HTTP via your browser
diff --git a/src/main/webapp/editFilesFragment.xhtml b/src/main/webapp/editFilesFragment.xhtml
index 3cfa2ca487d..a004e5d5c4c 100644
--- a/src/main/webapp/editFilesFragment.xhtml
+++ b/src/main/webapp/editFilesFragment.xhtml
@@ -98,6 +98,9 @@
+
+
+
diff --git a/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java
index b00b4afca7d..64429cfbc45 100644
--- a/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java
+++ b/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java
@@ -239,5 +239,16 @@ public void testNormalize() {
// TODO: organization examples...
}
+
+ @Test
+ public void testFormatBytes() {
+ assertEquals("1,023 bytes", StringUtil.formatBytes(StringUtil.BYTES_PER_KB - 1));
+ assertEquals("1,024.00 KB", StringUtil.formatBytes(StringUtil.BYTES_PER_MB - 1));
+ assertEquals("1,024.00 MB", StringUtil.formatBytes(StringUtil.BYTES_PER_GB - 1));
+ assertEquals("1.00 GB", StringUtil.formatBytes(StringUtil.BYTES_PER_GB));
+ assertEquals("341.33 GB", StringUtil.formatBytes(StringUtil.BYTES_PER_TB / 3));
+ assertEquals("1.29 GB", StringUtil.formatBytes(StringUtil.BYTES_PER_GB + 312345678)); // 1386087502 / 1073741824 = 1.290894581
+ assertEquals("1.49 TB", StringUtil.formatBytes(StringUtil.BYTES_PER_TB + (StringUtil.BYTES_PER_GB * 500))); // 1636382539776 / 1099511627776 = 1.48828125
+ }
}
}