From e5b173b2f77d3309e7b2db0f41160b09ae12f1ab Mon Sep 17 00:00:00 2001
From: Steven Winship <39765413+stevenwinship@users.noreply.github.com>
Date: Mon, 8 Dec 2025 09:45:13 -0500
Subject: [PATCH 1/7] Display current collection size on Add Files page
---
.../iq/dataverse/DataFileServiceBean.java | 7 +++++-
.../iq/dataverse/EditDatafilesPage.java | 14 +++++------
.../harvard/iq/dataverse/util/StringUtil.java | 24 ++++++++++++-------
src/main/java/propertyFiles/Bundle.properties | 1 +
src/main/webapp/editFilesFragment.xhtml | 3 +++
.../iq/dataverse/util/StringUtilTest.java | 9 +++++++
6 files changed, 41 insertions(+), 17 deletions(-)
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..825bdc73b54 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;
@@ -567,6 +560,11 @@ public boolean isFileUploadCountExceeded() {
return !ignoreLimit && !isFileReplaceOperation() && fileUploadsAvailable != null && fileUploadsAvailable == 0;
}
+ public String getCurrentStorageUse() {
+ Long size = datafileService.currentStorageSizeInBytes(dataset);
+ return StringUtil.formatBytes(size);
+ }
+
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..a45596430ff 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,17 @@ static public String normalize(String sentence) {
return sentence;
}
+
+ public static final long BYTES_PER_GB = 1024L * 1024L * 1024L;
+ public static final long BYTES_PER_TB = BYTES_PER_GB * 1024L;
+ static public String formatBytes(long bytes) {
+ if (bytes < BYTES_PER_GB) {
+ return NumberFormat.getNumberInstance().format(bytes) + " bytes";
+ } else {
+ double dBytes = bytes;
+ NumberFormat formatter = new DecimalFormat("#,##0.00");
+ return bytes < BYTES_PER_TB ? formatter.format(dBytes / BYTES_PER_GB) + " GB" :
+ formatter.format(dBytes / BYTES_PER_TB) + " TB";
+ }
+ }
}
diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties
index 14a33e24119..7f220496de2 100644
--- a/src/main/java/propertyFiles/Bundle.properties
+++ b/src/main/java/propertyFiles/Bundle.properties
@@ -1870,6 +1870,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..44c7abf775c 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..b8485e14abf 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,14 @@ public void testNormalize() {
// TODO: organization examples...
}
+
+ @Test
+ public void testFormatBytes() {
+ assertEquals("1,073,741,823 bytes", 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
+ }
}
}
From a68031d17238961ee2e74ac6f5d47468d8b5cd61 Mon Sep 17 00:00:00 2001
From: Steven Winship <39765413+stevenwinship@users.noreply.github.com>
Date: Mon, 8 Dec 2025 11:38:17 -0500
Subject: [PATCH 2/7] cache storage size
---
.../edu/harvard/iq/dataverse/EditDatafilesPage.java | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
index 825bdc73b54..537eba1a8a5 100644
--- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
+++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
@@ -181,6 +181,8 @@ public enum Referrer {
private String versionString = "";
+ private String storageSizeStr;
+
private boolean saveEnabled = false;
// Used to store results of permissions checks
@@ -560,9 +562,15 @@ 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 getCurrentStorageUse() {
- Long size = datafileService.currentStorageSizeInBytes(dataset);
- return StringUtil.formatBytes(size);
+ if (storageSizeStr == null) {
+ storageSizeStr = StringUtil.formatBytes(datafileService.currentStorageSizeInBytes(dataset));
+ }
+ return storageSizeStr;
}
public String init() {
From db26a90b98b94d25fbc7ef977daa3124d30687dc Mon Sep 17 00:00:00 2001
From: Steven Winship <39765413+stevenwinship@users.noreply.github.com>
Date: Mon, 8 Dec 2025 15:07:17 -0500
Subject: [PATCH 3/7] change dataset to container
---
.../java/edu/harvard/iq/dataverse/EditDatafilesPage.java | 5 +++--
src/main/webapp/editFilesFragment.xhtml | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
index 537eba1a8a5..4056c259e2d 100644
--- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
+++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
@@ -566,9 +566,10 @@ public boolean isFileUploadCountExceeded() {
*
* @return cached formatted storage size. '1,234 bytes'; '1.23 GB'; '1.00 TB'
*/
- public String getCurrentStorageUse() {
+ public String getCurrentContainerStorageUse() {
if (storageSizeStr == null) {
- storageSizeStr = StringUtil.formatBytes(datafileService.currentStorageSizeInBytes(dataset));
+ Dataverse container = dataset.getOwner();
+ storageSizeStr = StringUtil.formatBytes(datafileService.currentStorageSizeInBytes(container));
}
return storageSizeStr;
}
diff --git a/src/main/webapp/editFilesFragment.xhtml b/src/main/webapp/editFilesFragment.xhtml
index 44c7abf775c..a004e5d5c4c 100644
--- a/src/main/webapp/editFilesFragment.xhtml
+++ b/src/main/webapp/editFilesFragment.xhtml
@@ -99,7 +99,7 @@
-
+
From 564b8476744d843d633dc1240195c6b5eb8eee43 Mon Sep 17 00:00:00 2001
From: Steven Winship <39765413+stevenwinship@users.noreply.github.com>
Date: Mon, 8 Dec 2025 15:34:30 -0500
Subject: [PATCH 4/7] change dataset to container
---
src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
index 4056c259e2d..83df2156352 100644
--- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
+++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java
@@ -568,8 +568,7 @@ public boolean isFileUploadCountExceeded() {
*/
public String getCurrentContainerStorageUse() {
if (storageSizeStr == null) {
- Dataverse container = dataset.getOwner();
- storageSizeStr = StringUtil.formatBytes(datafileService.currentStorageSizeInBytes(container));
+ storageSizeStr = StringUtil.formatBytes(datafileService.currentStorageSizeInBytes(dataset.getOwner()));
}
return storageSizeStr;
}
From e2d24c01319f1e78c41d5806dceb4a2e1cfa7ed5 Mon Sep 17 00:00:00 2001
From: Steven Winship <39765413+stevenwinship@users.noreply.github.com>
Date: Fri, 12 Dec 2025 15:05:36 -0500
Subject: [PATCH 5/7] adding MB to StringUtil
---
.../edu/harvard/iq/dataverse/util/StringUtil.java | 12 +++++++++---
.../harvard/iq/dataverse/util/StringUtilTest.java | 3 ++-
2 files changed, 11 insertions(+), 4 deletions(-)
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 a45596430ff..f1c80cce772 100644
--- a/src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java
+++ b/src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java
@@ -233,16 +233,22 @@ static public String normalize(String sentence) {
return sentence;
}
+ public static final long BYTES_PER_MB = 1024L * 1024L;
public static final long BYTES_PER_GB = 1024L * 1024L * 1024L;
public static final long BYTES_PER_TB = BYTES_PER_GB * 1024L;
static public String formatBytes(long bytes) {
- if (bytes < BYTES_PER_GB) {
+ if (bytes < BYTES_PER_MB) {
return NumberFormat.getNumberInstance().format(bytes) + " bytes";
} else {
double dBytes = bytes;
NumberFormat formatter = new DecimalFormat("#,##0.00");
- return bytes < BYTES_PER_TB ? formatter.format(dBytes / BYTES_PER_GB) + " GB" :
- formatter.format(dBytes / BYTES_PER_TB) + " TB";
+ 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/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java
index b8485e14abf..9253b8c5eaf 100644
--- a/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java
+++ b/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java
@@ -242,7 +242,8 @@ public void testNormalize() {
@Test
public void testFormatBytes() {
- assertEquals("1,073,741,823 bytes", StringUtil.formatBytes(StringUtil.BYTES_PER_GB - 1));
+ assertEquals("1,048,575 bytes", 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
From 360b5d03118bc08b8d156959cc51af5ecec67dac Mon Sep 17 00:00:00 2001
From: Steven Winship <39765413+stevenwinship@users.noreply.github.com>
Date: Fri, 12 Dec 2025 15:07:39 -0500
Subject: [PATCH 6/7] adding MB to StringUtil
---
src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 f1c80cce772..3a535b880e1 100644
--- a/src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java
+++ b/src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java
@@ -234,7 +234,7 @@ static public String normalize(String sentence) {
}
public static final long BYTES_PER_MB = 1024L * 1024L;
- public static final long BYTES_PER_GB = 1024L * 1024L * 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_MB) {
From a2457f7ac8be87a4f198e5deb8762cd867c3877d Mon Sep 17 00:00:00 2001
From: Steven Winship <39765413+stevenwinship@users.noreply.github.com>
Date: Fri, 12 Dec 2025 15:20:39 -0500
Subject: [PATCH 7/7] adding KB to StringUtil
---
.../java/edu/harvard/iq/dataverse/util/StringUtil.java | 9 ++++++---
.../edu/harvard/iq/dataverse/util/StringUtilTest.java | 3 ++-
2 files changed, 8 insertions(+), 4 deletions(-)
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 3a535b880e1..1d52b403a10 100644
--- a/src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java
+++ b/src/main/java/edu/harvard/iq/dataverse/util/StringUtil.java
@@ -233,16 +233,19 @@ static public String normalize(String sentence) {
return sentence;
}
- public static final long BYTES_PER_MB = 1024L * 1024L;
+ 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_MB) {
+ 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_GB) {
+ 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";
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 9253b8c5eaf..64429cfbc45 100644
--- a/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java
+++ b/src/test/java/edu/harvard/iq/dataverse/util/StringUtilTest.java
@@ -242,7 +242,8 @@ public void testNormalize() {
@Test
public void testFormatBytes() {
- assertEquals("1,048,575 bytes", StringUtil.formatBytes(StringUtil.BYTES_PER_MB - 1));
+ 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));