From f41747d2684697c0bd02fbbb15fc4bcbfc578e0e Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Thu, 1 Nov 2018 16:24:24 -0400 Subject: [PATCH 01/32] Pull new dcm package file and zip checksum #4949 --- .../iq/dataverse/S3PackageImporter.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java index f5310119150..0032016014b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java @@ -142,15 +142,27 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t FileUtil.generateStorageIdentifier(packageFile); - String dvBucketName = System.getProperty("dataverse.files.s3-bucket-name"); String dvDatasetKey = getS3DatasetKey(dataset); - S3Object s3object = null; + S3Object s3FilesSha = null; + + //String fileName = folderName.substring(folderName.lastIndexOf('/') + 1); + //FK2/BST918/package_FK2BST918.zip + + //This is a brittle calculation, changes of the dcm post_upload script will blow this up + String rootPackageName = "package_" + folderName.replace("/", ""); + + //getting the name of the .sha file via substring, ${packageName}.sha + logger.log(Level.INFO, "shaname {0}", new Object[]{rootPackageName + ".sha"}); + - s3object = s3.getObject(new GetObjectRequest(dvBucketName, dvDatasetKey+"/files.sha")); + s3FilesSha = s3.getObject(new GetObjectRequest(dvBucketName, dvDatasetKey + "/" + rootPackageName + ".sha")); - InputStream in = s3object.getObjectContent(); - String checksumVal = FileUtil.CalculateChecksum(in, packageFile.getChecksumType()); + InputStream inSha = s3FilesSha.getObjectContent(); + String checksumVal = FileUtil.CalculateChecksum(inSha, packageFile.getChecksumType()); + + logger.log(Level.INFO, "Checksum value for the package in Dataset {0} is: {1}", + new Object[]{dataset.getIdentifier(), checksumVal}); packageFile.setChecksumValue(checksumVal); @@ -165,7 +177,7 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t // set metadata and add to latest version FileMetadata fmd = new FileMetadata(); - fmd.setLabel(folderName.substring(folderName.lastIndexOf('/') + 1)); + fmd.setLabel(rootPackageName + ".zip"); fmd.setDataFile(packageFile); packageFile.getFileMetadatas().add(fmd); From c8f80f092b62248ab01fa018d24ae67c921af8ee Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Fri, 2 Nov 2018 17:45:18 -0400 Subject: [PATCH 02/32] Pull checksum from dcm uploaded .sha #5053 --- .../iq/dataverse/S3PackageImporter.java | 52 ++++++++++++++++--- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java index 0032016014b..d7c17361cae 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java @@ -23,8 +23,11 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.FileUtil; import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; @@ -36,6 +39,7 @@ import javax.inject.Named; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; +import org.apache.commons.io.IOUtils; /** * This class is for importing files added to s3 outside of dataverse. @@ -144,10 +148,6 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t String dvBucketName = System.getProperty("dataverse.files.s3-bucket-name"); String dvDatasetKey = getS3DatasetKey(dataset); - S3Object s3FilesSha = null; - - //String fileName = folderName.substring(folderName.lastIndexOf('/') + 1); - //FK2/BST918/package_FK2BST918.zip //This is a brittle calculation, changes of the dcm post_upload script will blow this up String rootPackageName = "package_" + folderName.replace("/", ""); @@ -155,11 +155,47 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t //getting the name of the .sha file via substring, ${packageName}.sha logger.log(Level.INFO, "shaname {0}", new Object[]{rootPackageName + ".sha"}); - - s3FilesSha = s3.getObject(new GetObjectRequest(dvBucketName, dvDatasetKey + "/" + rootPackageName + ".sha")); + S3Object s3FilesSha = s3.getObject(new GetObjectRequest(dvBucketName, dvDatasetKey + "/" + rootPackageName + ".sha")); - InputStream inSha = s3FilesSha.getObjectContent(); - String checksumVal = FileUtil.CalculateChecksum(inSha, packageFile.getChecksumType()); + + InputStreamReader str = new InputStreamReader(s3FilesSha.getObjectContent()); + BufferedReader reader = new BufferedReader(str); + String checksumVal = ""; + try { + String line; + while((line = reader.readLine()) != null && checksumVal.isEmpty()) { + logger.log(Level.INFO, "line {0}", new Object[]{line}); + String[] splitLine = line.split(" "); + //logger.log(Level.INFO, "root package name {0}", new Object[]{rootPackageName + ".zip"}); + //logger.log(Level.INFO, "splitline {0} | {1}", new Object[]{splitLine[0], splitLine[1]}); + + //the sha file should only contain one line, but incase it doesn't we will check for the one for our zip + if(splitLine[1].contains(rootPackageName + ".zip")) { + checksumVal = splitLine[0]; + logger.log(Level.INFO, "checksumVal found {0}", new Object[]{checksumVal}); + } + } + if(checksumVal.isEmpty()) { + logger.log(Level.SEVERE, "No checksum found for uploaded DCM S3 zip on dataset {0}", new Object[]{dataset.getIdentifier()}); + } + } catch (IOException ex){ + logger.log(Level.SEVERE, "Error parsing DCM s3 checksum file on dataset {0} . Error: {1} ", new Object[]{dataset.getIdentifier(), ex}); + } finally { + try { + str.close(); + reader.close(); + } catch (IOException ex) { + logger.log(Level.WARNING, "errors closing s3 DCM object reader stream: {0}", new Object[]{ex}); + } + + } + + //MAD: CLOSE THINGS + + //String shaFileContents = IOUtils.toString(s3FilesSha.getObjectContent(), StandardCharsets.UTF_8); + + //We parse the checksum from the passed sha 1 + //String checksumVal = shaFileContents. logger.log(Level.INFO, "Checksum value for the package in Dataset {0} is: {1}", new Object[]{dataset.getIdentifier(), checksumVal}); From 4b55ebaf961b45ce3520fcfe7a800d3043fdfb59 Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Fri, 2 Nov 2018 17:53:19 -0400 Subject: [PATCH 03/32] Revert "Pull checksum from dcm uploaded .sha #5053" This reverts commit c8f80f092b62248ab01fa018d24ae67c921af8ee. --- .../iq/dataverse/S3PackageImporter.java | 52 +++---------------- 1 file changed, 8 insertions(+), 44 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java index d7c17361cae..0032016014b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java @@ -23,11 +23,8 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.FileUtil; import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; -import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; @@ -39,7 +36,6 @@ import javax.inject.Named; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; -import org.apache.commons.io.IOUtils; /** * This class is for importing files added to s3 outside of dataverse. @@ -148,6 +144,10 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t String dvBucketName = System.getProperty("dataverse.files.s3-bucket-name"); String dvDatasetKey = getS3DatasetKey(dataset); + S3Object s3FilesSha = null; + + //String fileName = folderName.substring(folderName.lastIndexOf('/') + 1); + //FK2/BST918/package_FK2BST918.zip //This is a brittle calculation, changes of the dcm post_upload script will blow this up String rootPackageName = "package_" + folderName.replace("/", ""); @@ -155,47 +155,11 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t //getting the name of the .sha file via substring, ${packageName}.sha logger.log(Level.INFO, "shaname {0}", new Object[]{rootPackageName + ".sha"}); - S3Object s3FilesSha = s3.getObject(new GetObjectRequest(dvBucketName, dvDatasetKey + "/" + rootPackageName + ".sha")); - - - InputStreamReader str = new InputStreamReader(s3FilesSha.getObjectContent()); - BufferedReader reader = new BufferedReader(str); - String checksumVal = ""; - try { - String line; - while((line = reader.readLine()) != null && checksumVal.isEmpty()) { - logger.log(Level.INFO, "line {0}", new Object[]{line}); - String[] splitLine = line.split(" "); - //logger.log(Level.INFO, "root package name {0}", new Object[]{rootPackageName + ".zip"}); - //logger.log(Level.INFO, "splitline {0} | {1}", new Object[]{splitLine[0], splitLine[1]}); - - //the sha file should only contain one line, but incase it doesn't we will check for the one for our zip - if(splitLine[1].contains(rootPackageName + ".zip")) { - checksumVal = splitLine[0]; - logger.log(Level.INFO, "checksumVal found {0}", new Object[]{checksumVal}); - } - } - if(checksumVal.isEmpty()) { - logger.log(Level.SEVERE, "No checksum found for uploaded DCM S3 zip on dataset {0}", new Object[]{dataset.getIdentifier()}); - } - } catch (IOException ex){ - logger.log(Level.SEVERE, "Error parsing DCM s3 checksum file on dataset {0} . Error: {1} ", new Object[]{dataset.getIdentifier(), ex}); - } finally { - try { - str.close(); - reader.close(); - } catch (IOException ex) { - logger.log(Level.WARNING, "errors closing s3 DCM object reader stream: {0}", new Object[]{ex}); - } - - } - - //MAD: CLOSE THINGS - - //String shaFileContents = IOUtils.toString(s3FilesSha.getObjectContent(), StandardCharsets.UTF_8); - //We parse the checksum from the passed sha 1 - //String checksumVal = shaFileContents. + s3FilesSha = s3.getObject(new GetObjectRequest(dvBucketName, dvDatasetKey + "/" + rootPackageName + ".sha")); + + InputStream inSha = s3FilesSha.getObjectContent(); + String checksumVal = FileUtil.CalculateChecksum(inSha, packageFile.getChecksumType()); logger.log(Level.INFO, "Checksum value for the package in Dataset {0} is: {1}", new Object[]{dataset.getIdentifier(), checksumVal}); From cbea0c6339093e4e214c82f192bd712e17c8b453 Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Fri, 2 Nov 2018 17:54:39 -0400 Subject: [PATCH 04/32] Pull checksum from dcm uploaded .sha #4949 --- .../iq/dataverse/S3PackageImporter.java | 52 ++++++++++++++++--- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java index 0032016014b..d7c17361cae 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java @@ -23,8 +23,11 @@ import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.FileUtil; import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; @@ -36,6 +39,7 @@ import javax.inject.Named; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; +import org.apache.commons.io.IOUtils; /** * This class is for importing files added to s3 outside of dataverse. @@ -144,10 +148,6 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t String dvBucketName = System.getProperty("dataverse.files.s3-bucket-name"); String dvDatasetKey = getS3DatasetKey(dataset); - S3Object s3FilesSha = null; - - //String fileName = folderName.substring(folderName.lastIndexOf('/') + 1); - //FK2/BST918/package_FK2BST918.zip //This is a brittle calculation, changes of the dcm post_upload script will blow this up String rootPackageName = "package_" + folderName.replace("/", ""); @@ -155,11 +155,47 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t //getting the name of the .sha file via substring, ${packageName}.sha logger.log(Level.INFO, "shaname {0}", new Object[]{rootPackageName + ".sha"}); - - s3FilesSha = s3.getObject(new GetObjectRequest(dvBucketName, dvDatasetKey + "/" + rootPackageName + ".sha")); + S3Object s3FilesSha = s3.getObject(new GetObjectRequest(dvBucketName, dvDatasetKey + "/" + rootPackageName + ".sha")); - InputStream inSha = s3FilesSha.getObjectContent(); - String checksumVal = FileUtil.CalculateChecksum(inSha, packageFile.getChecksumType()); + + InputStreamReader str = new InputStreamReader(s3FilesSha.getObjectContent()); + BufferedReader reader = new BufferedReader(str); + String checksumVal = ""; + try { + String line; + while((line = reader.readLine()) != null && checksumVal.isEmpty()) { + logger.log(Level.INFO, "line {0}", new Object[]{line}); + String[] splitLine = line.split(" "); + //logger.log(Level.INFO, "root package name {0}", new Object[]{rootPackageName + ".zip"}); + //logger.log(Level.INFO, "splitline {0} | {1}", new Object[]{splitLine[0], splitLine[1]}); + + //the sha file should only contain one line, but incase it doesn't we will check for the one for our zip + if(splitLine[1].contains(rootPackageName + ".zip")) { + checksumVal = splitLine[0]; + logger.log(Level.INFO, "checksumVal found {0}", new Object[]{checksumVal}); + } + } + if(checksumVal.isEmpty()) { + logger.log(Level.SEVERE, "No checksum found for uploaded DCM S3 zip on dataset {0}", new Object[]{dataset.getIdentifier()}); + } + } catch (IOException ex){ + logger.log(Level.SEVERE, "Error parsing DCM s3 checksum file on dataset {0} . Error: {1} ", new Object[]{dataset.getIdentifier(), ex}); + } finally { + try { + str.close(); + reader.close(); + } catch (IOException ex) { + logger.log(Level.WARNING, "errors closing s3 DCM object reader stream: {0}", new Object[]{ex}); + } + + } + + //MAD: CLOSE THINGS + + //String shaFileContents = IOUtils.toString(s3FilesSha.getObjectContent(), StandardCharsets.UTF_8); + + //We parse the checksum from the passed sha 1 + //String checksumVal = shaFileContents. logger.log(Level.INFO, "Checksum value for the package in Dataset {0} is: {1}", new Object[]{dataset.getIdentifier(), checksumVal}); From 9284ba9d1081b1d2a4789d43668d86bdda2e2346 Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Wed, 7 Nov 2018 13:51:28 -0500 Subject: [PATCH 05/32] Move file info to new fragment #4949 This move allows that code to be reused in the new package popup This also contains a bit of render logic around s3 package UI --- src/main/webapp/filesFragment.xhtml | 91 ++---------------------- src/main/webapp/filesInfoFragment.xhtml | 94 +++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 84 deletions(-) create mode 100644 src/main/webapp/filesInfoFragment.xhtml diff --git a/src/main/webapp/filesFragment.xhtml b/src/main/webapp/filesFragment.xhtml index 6e959fb4bf5..d66118e91b0 100644 --- a/src/main/webapp/filesFragment.xhtml +++ b/src/main/webapp/filesFragment.xhtml @@ -152,88 +152,10 @@ - -
- - - - - - - - - - - - - - - - -
- -
-
- -
-
-
- @@ -375,7 +297,8 @@ -
+
@@ -388,8 +311,8 @@
- -
+
diff --git a/src/main/webapp/filesInfoFragment.xhtml b/src/main/webapp/filesInfoFragment.xhtml new file mode 100644 index 00000000000..8de06d90702 --- /dev/null +++ b/src/main/webapp/filesInfoFragment.xhtml @@ -0,0 +1,94 @@ + + + + +
+ + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+ +
\ No newline at end of file From 0cdc100d953ea03c9eb2b70f4df741ccfd733d0e Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Thu, 8 Nov 2018 18:25:09 -0500 Subject: [PATCH 06/32] Generate s3 identifier on import #4949 There was a bug in the previous story where the imported dcm s3 files did not have an S3 identifier. --- .../edu/harvard/iq/dataverse/S3PackageImporter.java | 3 ++- .../java/edu/harvard/iq/dataverse/util/FileUtil.java | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java index d7c17361cae..e74850156e7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java @@ -63,6 +63,7 @@ public class S3PackageImporter extends AbstractApiBean implements java.io.Serial @EJB EjbDataverseEngine commandEngine; + //Copies from another s3 bucket to our own public void copyFromS3(Dataset dataset, String s3ImportPath) throws IOException { try { s3 = AmazonS3ClientBuilder.standard().defaultClient(); @@ -144,7 +145,7 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t DataFile packageFile = new DataFile(DataFileServiceBean.MIME_TYPE_PACKAGE_FILE); packageFile.setChecksumType(DataFile.ChecksumType.SHA1); - FileUtil.generateStorageIdentifier(packageFile); + FileUtil.generateS3StorageIdentifier(packageFile); String dvBucketName = System.getProperty("dataverse.files.s3-bucket-name"); String dvDatasetKey = getS3DatasetKey(dataset); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java index 48fbfb5e37d..e5cdf4c856d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java @@ -28,6 +28,7 @@ import edu.harvard.iq.dataverse.FileMetadata; import edu.harvard.iq.dataverse.TermsOfUseAndAccess; import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; +import static edu.harvard.iq.dataverse.dataaccess.S3AccessIO.S3_IDENTIFIER_PREFIX; import edu.harvard.iq.dataverse.dataset.DatasetThumbnail; import edu.harvard.iq.dataverse.datasetutility.FileExceedsMaxSizeException; import static edu.harvard.iq.dataverse.datasetutility.FileSizeChecker.bytesToHumanReadable; @@ -91,7 +92,7 @@ public class FileUtil implements java.io.Serializable { private static final String[] TABULAR_DATA_FORMAT_SET = {"POR", "SAV", "DTA", "RDA"}; private static Map STATISTICAL_FILE_EXTENSION = new HashMap(); - + /* * The following are Stata, SAS and SPSS syntax/control cards: * These are recognized as text files (because they are!) so @@ -1132,6 +1133,15 @@ public static String getFilesTempDirectory() { return filesTempDirectory; } + //MAD: Refactor this again so it reuses code from S3AccessIO. + //Also maybe refactor the generic named one to reflect that it creates fileAccessIO on its own. + public static void generateS3StorageIdentifier(DataFile dataFile) { + String storageId = generateStorageIdentifier(); + String bucketName = System.getProperty("dataverse.files.s3-bucket-name"); + storageId = S3_IDENTIFIER_PREFIX + "://" + bucketName + ":" + storageId; + dataFile.setStorageIdentifier(storageId); + } + public static void generateStorageIdentifier(DataFile dataFile) { dataFile.setStorageIdentifier(generateStorageIdentifier()); } From f391e6334663641bb4b274ddf9f2c7f56be6b5db Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Wed, 14 Nov 2018 19:22:57 -0500 Subject: [PATCH 07/32] Popup with s3 package download url #4949 --- src/main/java/Bundle.properties | 4 ++ .../iq/dataverse/S3PackageImporter.java | 15 ++++--- .../dataverse/S3PackagePopupFragmentBean.java | 45 +++++++++++++++++++ .../dataverse/api/DownloadInstanceWriter.java | 3 ++ .../harvard/iq/dataverse/util/FileUtil.java | 9 ++-- src/main/webapp/dataset.xhtml | 14 ++++-- .../file-download-button-fragment.xhtml | 24 +++++++++- src/main/webapp/file.xhtml | 11 +++++ .../s3-package-download-popup-fragment.xhtml | 42 +++++++++++++++++ 9 files changed, 150 insertions(+), 17 deletions(-) create mode 100644 src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java create mode 100644 src/main/webapp/s3-package-download-popup-fragment.xhtml diff --git a/src/main/java/Bundle.properties b/src/main/java/Bundle.properties index 8f94e25199c..8a332cdde5b 100755 --- a/src/main/java/Bundle.properties +++ b/src/main/java/Bundle.properties @@ -70,6 +70,10 @@ toggleNavigation=Toggle navigation defaultBody=Default Body filter=Filter +s3packagedownload.title=Download Package File +s3packagedownload.instructions=Download this package file by copying and pasting the URL below into Wget or a download manager. Use of a web browser for this download is not recommended. User Guide - Downloading Package Files +s3packagedownload.urlHeader=Download URL + # dataverse_header.xhtml header.status.header=Status header.search.title=Search all dataverses... diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java index e74850156e7..f423ca768be 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java @@ -145,14 +145,12 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t DataFile packageFile = new DataFile(DataFileServiceBean.MIME_TYPE_PACKAGE_FILE); packageFile.setChecksumType(DataFile.ChecksumType.SHA1); - FileUtil.generateS3StorageIdentifier(packageFile); - + //This is a brittle calculation, changes of the dcm post_upload script will blow this up + String rootPackageName = "package_" + folderName.replace("/", ""); + String dvBucketName = System.getProperty("dataverse.files.s3-bucket-name"); String dvDatasetKey = getS3DatasetKey(dataset); - //This is a brittle calculation, changes of the dcm post_upload script will blow this up - String rootPackageName = "package_" + folderName.replace("/", ""); - //getting the name of the .sha file via substring, ${packageName}.sha logger.log(Level.INFO, "shaname {0}", new Object[]{rootPackageName + ".sha"}); @@ -211,18 +209,21 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t dataset.getFiles().add(packageFile); packageFile.setIngestDone(); - + // set metadata and add to latest version + // Set early so we can generate the storage id with the info FileMetadata fmd = new FileMetadata(); fmd.setLabel(rootPackageName + ".zip"); fmd.setDataFile(packageFile); packageFile.getFileMetadatas().add(fmd); if (dataset.getLatestVersion().getFileMetadatas() == null) dataset.getLatestVersion().setFileMetadatas(new ArrayList<>()); - + dataset.getLatestVersion().getFileMetadatas().add(fmd); fmd.setDatasetVersion(dataset.getLatestVersion()); + FileUtil.generateS3PackageStorageIdentifier(packageFile); + GlobalIdServiceBean idServiceBean = GlobalIdServiceBean.getBean(packageFile.getProtocol(), commandEngine.getContext()); if (packageFile.getIdentifier() == null || packageFile.getIdentifier().isEmpty()) { String packageIdentifier = dataFileServiceBean.generateDataFileIdentifier(packageFile, idServiceBean); diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java b/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java new file mode 100644 index 00000000000..dfcbc952b66 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java @@ -0,0 +1,45 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +//MAD: This and s3importer should probably be in their own package +package edu.harvard.iq.dataverse; + +import edu.harvard.iq.dataverse.dataaccess.DataAccess; +import edu.harvard.iq.dataverse.dataaccess.S3AccessIO; +import edu.harvard.iq.dataverse.dataaccess.StorageIO; +import java.io.IOException; +import javax.faces.view.ViewScoped; +import javax.inject.Named; + +/** + * + * @author matthew + */ + +@ViewScoped +@Named +public class S3PackagePopupFragmentBean implements java.io.Serializable { + + DataFile df; + + public void setDataFile(DataFile dataFile) { + df = dataFile; + } + + public DataFile getDataFile() { + return df; + } + +// public String provideS3OneTimeUrl() throws IOException { +// if(df != null ) { +// StorageIO storageIO = DataAccess.getStorageIO(df); +// return ((S3AccessIO)storageIO).generateTemporaryS3Url(); +// } else { +// return ""; +// } +// +// } +} + \ No newline at end of file diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java index fab2538832e..0e4471c536b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java @@ -4,6 +4,7 @@ * and open the template in the editor. */ +//MAD: WHY DOES THIS LIVE IN API package edu.harvard.iq.dataverse.api; import java.lang.reflect.Type; @@ -33,6 +34,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; import java.util.logging.Logger; import javax.ws.rs.NotFoundException; import javax.ws.rs.RedirectionException; @@ -75,6 +77,7 @@ public void writeTo(DownloadInstance di, Class clazz, Type type, Annotation[] storageIO.open(); } catch (IOException ioex) { //throw new WebApplicationException(Response.Status.SERVICE_UNAVAILABLE); + logger.log(Level.INFO, "Datafile {0}: Failed to locate and/or open physical file. Error message: {1}", new Object[]{dataFile.getId(), ioex.getLocalizedMessage()}); throw new NotFoundException("Datafile "+dataFile.getId()+": Failed to locate and/or open physical file."); } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java index e5cdf4c856d..595b633a9a9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java @@ -1133,12 +1133,11 @@ public static String getFilesTempDirectory() { return filesTempDirectory; } - //MAD: Refactor this again so it reuses code from S3AccessIO. - //Also maybe refactor the generic named one to reflect that it creates fileAccessIO on its own. - public static void generateS3StorageIdentifier(DataFile dataFile) { - String storageId = generateStorageIdentifier(); + //OLD MAD: Refactor this again so it reuses code from S3AccessIO. + //OLD MAD: Also maybe refactor the generic named one to reflect that it creates fileAccessIO on its own. + public static void generateS3PackageStorageIdentifier(DataFile dataFile) { String bucketName = System.getProperty("dataverse.files.s3-bucket-name"); - storageId = S3_IDENTIFIER_PREFIX + "://" + bucketName + ":" + storageId; + String storageId = S3_IDENTIFIER_PREFIX + "://" + bucketName + ":" + dataFile.getFileMetadata().getLabel(); dataFile.setStorageIdentifier(storageId); } diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 8b2c0878dd0..d7a34ef2a58 100755 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -1165,7 +1165,6 @@ - @@ -1173,9 +1172,18 @@ - - + + + + + + + + + + + diff --git a/src/main/webapp/file-download-button-fragment.xhtml b/src/main/webapp/file-download-button-fragment.xhtml index a08acdf74e8..c36561278da 100644 --- a/src/main/webapp/file-download-button-fragment.xhtml +++ b/src/main/webapp/file-download-button-fragment.xhtml @@ -112,8 +112,28 @@ #{bundle['file.compute']} - - + + + + + + + S3 Download #{fileMetadata.dataFile} + + + + +
+ + + + + + + + + + + diff --git a/src/main/webapp/s3-package-download-popup-fragment.xhtml b/src/main/webapp/s3-package-download-popup-fragment.xhtml new file mode 100644 index 00000000000..9fc65ac80e9 --- /dev/null +++ b/src/main/webapp/s3-package-download-popup-fragment.xhtml @@ -0,0 +1,42 @@ + + + + + + + + + + + +
+ + + + + +
+
+
#{systemConfig.getDataverseSiteUrl()}/api/access/datafile/#{s3PackagePopupFragmentBean.dataFile.id}
+
+ + +
+
From 36b864864835895d73970f11fd633f259d380153 Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Thu, 15 Nov 2018 18:12:56 -0500 Subject: [PATCH 08/32] Launch s3Package popup from guestbook #4949 --- .../iq/dataverse/FileDownloadHelper.java | 17 +++++++++- .../file-download-button-fragment.xhtml | 33 +++++++++++-------- .../webapp/file-download-popup-fragment.xhtml | 14 ++++++-- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java b/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java index befdc3a9eeb..476a3bf97e3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java @@ -297,7 +297,22 @@ public void writeGuestbookAndLaunchExploreTool(GuestbookResponse guestbookRespon } fileDownloadService.explore(guestbookResponse, fmd, externalTool); requestContext.execute("PF('downloadPopup').hide()"); - } + } + + public void writeGuestbookAndLaunchS3PackagePopup(GuestbookResponse guestbookResponse) { + RequestContext requestContext = RequestContext.getCurrentInstance(); + boolean valid = validateGuestbookResponse(guestbookResponse); + + if (!valid) { + JH.addMessage(FacesMessage.SEVERITY_ERROR, JH.localize("dataset.message.validationError")); + } else { + requestContext.execute("PF('downloadPopup').hide()"); + requestContext.execute("PF('downloadS3PackagePopup').show()"); + requestContext.execute("handleResizeDialog('downloadS3PackagePopup')"); + + fileDownloadService.writeGuestbookResponseRecord(guestbookResponse); + } + } public String startWorldMapDownloadLink(GuestbookResponse guestbookResponse, FileMetadata fmd){ diff --git a/src/main/webapp/file-download-button-fragment.xhtml b/src/main/webapp/file-download-button-fragment.xhtml index c36561278da..a7206922824 100644 --- a/src/main/webapp/file-download-button-fragment.xhtml +++ b/src/main/webapp/file-download-button-fragment.xhtml @@ -112,25 +112,31 @@ #{bundle['file.compute']} - - - - - - - + + S3 Download #{fileMetadata.dataFile} - + + + + #{bundle.download} + #{bundle.download} -
+ @@ -172,7 +174,15 @@ update="guestbookUIFragment"> #{bundle['acceptTerms']} + + + + + +
\ No newline at end of file From e7d7dcd8971e80945b78d361eb37b1cf6f3b7a2a Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Mon, 19 Nov 2018 18:30:33 -0500 Subject: [PATCH 09/32] dcm s3 file page start #4949 --- .../harvard/iq/dataverse/DataCiteRESTfullClient.java | 1 + .../java/edu/harvard/iq/dataverse/DatasetPage.java | 6 +++++- .../edu/harvard/iq/dataverse/S3PackageImporter.java | 2 +- src/main/webapp/file-download-button-fragment.xhtml | 11 ++++++----- src/main/webapp/file.xhtml | 10 +++++++--- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java b/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java index a8ddc3b06e9..d128996c91e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java @@ -219,6 +219,7 @@ public String inactiveDataset(String doi) { } } + //MAD: This shouldn't be hardcoded in our source.... public static void main(String[] args) throws Exception { String doi = "10.5072/DVN/274533"; DataCiteRESTfullClient client = new DataCiteRESTfullClient("https://mds.test.datacite.org", "DATACITE.HARVARD", "DVNapitest"); diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 84462e3915e..5e762000386 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -1,6 +1,7 @@ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.provenance.ProvPopupFragmentBean; +import edu.harvard.iq.dataverse.S3PackagePopupFragmentBean; import edu.harvard.iq.dataverse.api.AbstractApiBean; import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.authorization.Permission; @@ -196,7 +197,9 @@ public enum DisplayMode { SettingsWrapper settingsWrapper; @Inject ProvPopupFragmentBean provPopupFragmentBean; - +//MAD: Does this even do anything? Does the prov one for that matter? +// @Inject +// S3PackagePopupFragmentBean s3PopupFragmentBean; private Dataset dataset = new Dataset(); private EditMode editMode; @@ -1470,6 +1473,7 @@ private String init(boolean initFull) { logger.fine("Checking if rsync support is enabled."); if (DataCaptureModuleUtil.rsyncSupportEnabled(settingsWrapper.getValueForKey(SettingsServiceBean.Key.UploadMethods))) { try { +//MAD: I think this is the spot that keeps checking for rsync even though its gone thru the process ScriptRequestResponse scriptRequestResponse = commandEngine.submit(new RequestRsyncScriptCommand(dvRequestService.getDataverseRequest(), dataset)); logger.fine("script: " + scriptRequestResponse.getScript()); if(scriptRequestResponse.getScript()!=null && !scriptRequestResponse.getScript().isEmpty()){ diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java index f423ca768be..806b6d32ef8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java @@ -189,7 +189,7 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t } - //MAD: CLOSE THINGS + //MAD: CLOSE THINGS !! //String shaFileContents = IOUtils.toString(s3FilesSha.getObjectContent(), StandardCharsets.UTF_8); diff --git a/src/main/webapp/file-download-button-fragment.xhtml b/src/main/webapp/file-download-button-fragment.xhtml index a7206922824..20c12ad5ba4 100644 --- a/src/main/webapp/file-download-button-fragment.xhtml +++ b/src/main/webapp/file-download-button-fragment.xhtml @@ -113,8 +113,9 @@ #{bundle['file.compute']} + @@ -150,7 +151,7 @@
+ and (!FilePage.fileMetadata.dataFile.filePackage or + FilePage.fileMetadata.dataFile.filePackage and FilePage.fileMetadata.getDataFile().getOwner().getStorageIdentifier().startsWith('s3://'))}"> + @@ -362,7 +365,7 @@ + rendered="#{settingsWrapper.rsyncDownload and FilePage.fileMetadata.dataFile.filePackage and !FilePage.fileMetadata.getDataFile().getOwner().getStorageIdentifier().startsWith('s3://')}"> @@ -551,7 +554,8 @@
- + From 756de2b56e87bcb6a744416b0396c724ab6db680 Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Tue, 27 Nov 2018 19:18:33 -0500 Subject: [PATCH 10/32] Share file entry code from replace and s3 #4949 Wired up for all flows, and multiple update bugs fixed. --- .../iq/dataverse/EditDatafilesPage.java | 13 +++ .../iq/dataverse/FileDownloadServiceBean.java | 8 ++ .../dataverse/S3PackagePopupFragmentBean.java | 14 +-- src/main/webapp/editdatafiles.xhtml | 53 +---------- .../file-download-button-fragment.xhtml | 17 ++-- .../webapp/file-download-popup-fragment.xhtml | 8 +- src/main/webapp/filesFragment.xhtml | 84 ++++++++++++++++- src/main/webapp/filesInfoFragment.xhtml | 94 ------------------- src/main/webapp/individualFileTable.xhtml | 60 ++++++++++++ .../s3-package-download-popup-fragment.xhtml | 24 ++--- 10 files changed, 192 insertions(+), 183 deletions(-) delete mode 100644 src/main/webapp/filesInfoFragment.xhtml create mode 100644 src/main/webapp/individualFileTable.xhtml diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java index 3a20a08068c..176360ec49b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java @@ -180,6 +180,7 @@ public String getSelectedFileIds() { return selectedFileIdsString; } + //If you change this the getFileMetadataToReplace should be changed in kind public DataFile getFileToReplace(){ if (!this.isFileReplaceOperation()){ return null; @@ -190,6 +191,18 @@ public DataFile getFileToReplace(){ return this.fileReplacePageHelper.getFileToReplace(); } + //MAD: This is an attempt to use the same ui for all file cards. + //We want that fragment to use fileMetadata because its easier to get from that to the needed info + public FileMetadata getFileMetadataToReplace(){ + if (!this.isFileReplaceOperation()){ + return null; + } + if (this.fileReplacePageHelper == null){ + return null; + } + return this.fileReplacePageHelper.getFileToReplace().getFileMetadata(); + } + public void setSelectedFileIds(String selectedFileIds) { selectedFileIdsString = selectedFileIds; } diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java index 73458433bb8..cc8f895b370 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java @@ -145,6 +145,14 @@ public void writeGuestbookAndStartFileDownload(GuestbookResponse guestbookRespon logger.fine("issued file download redirect for datafile "+guestbookResponse.getDataFile().getId()); } + //MAD: I'm pretty sure we should filter out draft + public void writeGuestbookResponseRecord(GuestbookResponse guestbookResponse, FileMetadata fileMetadata, String format) { + if(!fileMetadata.getDatasetVersion().isDraft()){ + guestbookResponse = guestbookResponseService.modifyDatafileAndFormat(guestbookResponse, fileMetadata, format); + writeGuestbookResponseRecord(guestbookResponse); + } + } + public void writeGuestbookResponseRecord(GuestbookResponse guestbookResponse) { try { diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java b/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java index dfcbc952b66..d268726e3ee 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java @@ -6,10 +6,6 @@ //MAD: This and s3importer should probably be in their own package package edu.harvard.iq.dataverse; -import edu.harvard.iq.dataverse.dataaccess.DataAccess; -import edu.harvard.iq.dataverse.dataaccess.S3AccessIO; -import edu.harvard.iq.dataverse.dataaccess.StorageIO; -import java.io.IOException; import javax.faces.view.ViewScoped; import javax.inject.Named; @@ -22,14 +18,14 @@ @Named public class S3PackagePopupFragmentBean implements java.io.Serializable { - DataFile df; + FileMetadata fm; - public void setDataFile(DataFile dataFile) { - df = dataFile; + public void setFileMetadata(FileMetadata fileMetadata) { + fm = fileMetadata; } - public DataFile getDataFile() { - return df; + public FileMetadata getFileMetadata() { + return fm; } // public String provideS3OneTimeUrl() throws IOException { diff --git a/src/main/webapp/editdatafiles.xhtml b/src/main/webapp/editdatafiles.xhtml index aab4541229e..fcf19e8bf8f 100755 --- a/src/main/webapp/editdatafiles.xhtml +++ b/src/main/webapp/editdatafiles.xhtml @@ -38,58 +38,15 @@ - - -
-
-
-
- - - - - -
- -
-
- -
-
-
- -
+ + + + +
diff --git a/src/main/webapp/file-download-button-fragment.xhtml b/src/main/webapp/file-download-button-fragment.xhtml index 20c12ad5ba4..97a1391a669 100644 --- a/src/main/webapp/file-download-button-fragment.xhtml +++ b/src/main/webapp/file-download-button-fragment.xhtml @@ -113,18 +113,18 @@ #{bundle['file.compute']} - - - + + - S3 Download #{fileMetadata.dataFile} + #{bundle.download} + #{bundle.download} @@ -141,7 +142,7 @@ diff --git a/src/main/webapp/file-download-popup-fragment.xhtml b/src/main/webapp/file-download-popup-fragment.xhtml index 21c0b954b63..ea8da2a9b3d 100644 --- a/src/main/webapp/file-download-popup-fragment.xhtml +++ b/src/main/webapp/file-download-popup-fragment.xhtml @@ -176,11 +176,11 @@ - - - + + + #{bundle['acceptTerms']} diff --git a/src/main/webapp/filesFragment.xhtml b/src/main/webapp/filesFragment.xhtml index d66118e91b0..51088665c96 100644 --- a/src/main/webapp/filesFragment.xhtml +++ b/src/main/webapp/filesFragment.xhtml @@ -153,8 +153,88 @@ - - + +
+ + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+ diff --git a/src/main/webapp/filesInfoFragment.xhtml b/src/main/webapp/filesInfoFragment.xhtml deleted file mode 100644 index 8de06d90702..00000000000 --- a/src/main/webapp/filesInfoFragment.xhtml +++ /dev/null @@ -1,94 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - -
- -
-
- -
-
-
- -
\ No newline at end of file diff --git a/src/main/webapp/individualFileTable.xhtml b/src/main/webapp/individualFileTable.xhtml new file mode 100644 index 00000000000..a9e2cde4762 --- /dev/null +++ b/src/main/webapp/individualFileTable.xhtml @@ -0,0 +1,60 @@ + + +
+
+
+ + + + + +
+ +
+
+ +
+
+
+ +
+
+
\ No newline at end of file diff --git a/src/main/webapp/s3-package-download-popup-fragment.xhtml b/src/main/webapp/s3-package-download-popup-fragment.xhtml index 9fc65ac80e9..92bae40616c 100644 --- a/src/main/webapp/s3-package-download-popup-fragment.xhtml +++ b/src/main/webapp/s3-package-download-popup-fragment.xhtml @@ -9,23 +9,10 @@ xmlns:iqbs="http://xmlns.jcp.org/jsf/composite/iqbs"> - - - - - - - - +
+ + +
@@ -34,9 +21,10 @@
-
#{systemConfig.getDataverseSiteUrl()}/api/access/datafile/#{s3PackagePopupFragmentBean.dataFile.id}
+
#{systemConfig.getDataverseSiteUrl()}/api/access/datafile/#{s3PackagePopupFragmentBean.fileMetadata.dataFile.id}
+
From 23196c005a49f98d480016b230f02273069b51f4 Mon Sep 17 00:00:00 2001 From: matthew-a-dunlap Date: Thu, 29 Nov 2018 15:17:48 -0500 Subject: [PATCH 11/32] dcm s3 download code cleanup #4949 --- .../iq/dataverse/DataCiteRESTfullClient.java | 1 - .../edu/harvard/iq/dataverse/DatasetPage.java | 5 +--- .../iq/dataverse/EditDatafilesPage.java | 13 --------- .../iq/dataverse/FileDownloadHelper.java | 6 ++-- .../iq/dataverse/FileDownloadServiceBean.java | 3 -- .../iq/dataverse/S3PackageImporter.java | 29 ++++--------------- .../dataverse/S3PackagePopupFragmentBean.java | 11 +------ .../dataverse/api/DownloadInstanceWriter.java | 1 - .../harvard/iq/dataverse/util/FileUtil.java | 2 -- src/main/webapp/WEB-INF/web.xml | 6 ++++ src/main/webapp/dataset.xhtml | 1 - src/main/webapp/editdatafiles.xhtml | 4 +-- .../file-download-button-fragment.xhtml | 2 -- src/main/webapp/file.xhtml | 4 --- .../s3-package-download-popup-fragment.xhtml | 2 +- 15 files changed, 18 insertions(+), 72 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java b/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java index d128996c91e..a8ddc3b06e9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java @@ -219,7 +219,6 @@ public String inactiveDataset(String doi) { } } - //MAD: This shouldn't be hardcoded in our source.... public static void main(String[] args) throws Exception { String doi = "10.5072/DVN/274533"; DataCiteRESTfullClient client = new DataCiteRESTfullClient("https://mds.test.datacite.org", "DATACITE.HARVARD", "DVNapitest"); diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 5e762000386..67cde84ed58 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -197,9 +197,6 @@ public enum DisplayMode { SettingsWrapper settingsWrapper; @Inject ProvPopupFragmentBean provPopupFragmentBean; -//MAD: Does this even do anything? Does the prov one for that matter? -// @Inject -// S3PackagePopupFragmentBean s3PopupFragmentBean; private Dataset dataset = new Dataset(); private EditMode editMode; @@ -1473,7 +1470,7 @@ private String init(boolean initFull) { logger.fine("Checking if rsync support is enabled."); if (DataCaptureModuleUtil.rsyncSupportEnabled(settingsWrapper.getValueForKey(SettingsServiceBean.Key.UploadMethods))) { try { -//MAD: I think this is the spot that keeps checking for rsync even though its gone thru the process + //TODO: This check could be improved to check the existence of rsync data before requesting a script ScriptRequestResponse scriptRequestResponse = commandEngine.submit(new RequestRsyncScriptCommand(dvRequestService.getDataverseRequest(), dataset)); logger.fine("script: " + scriptRequestResponse.getScript()); if(scriptRequestResponse.getScript()!=null && !scriptRequestResponse.getScript().isEmpty()){ diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java index 176360ec49b..3a20a08068c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java @@ -180,7 +180,6 @@ public String getSelectedFileIds() { return selectedFileIdsString; } - //If you change this the getFileMetadataToReplace should be changed in kind public DataFile getFileToReplace(){ if (!this.isFileReplaceOperation()){ return null; @@ -191,18 +190,6 @@ public DataFile getFileToReplace(){ return this.fileReplacePageHelper.getFileToReplace(); } - //MAD: This is an attempt to use the same ui for all file cards. - //We want that fragment to use fileMetadata because its easier to get from that to the needed info - public FileMetadata getFileMetadataToReplace(){ - if (!this.isFileReplaceOperation()){ - return null; - } - if (this.fileReplacePageHelper == null){ - return null; - } - return this.fileReplacePageHelper.getFileToReplace().getFileMetadata(); - } - public void setSelectedFileIds(String selectedFileIds) { selectedFileIdsString = selectedFileIds; } diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java b/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java index 476a3bf97e3..16e7ca4ee05 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownloadHelper.java @@ -309,7 +309,7 @@ public void writeGuestbookAndLaunchS3PackagePopup(GuestbookResponse guestbookRes requestContext.execute("PF('downloadPopup').hide()"); requestContext.execute("PF('downloadS3PackagePopup').show()"); requestContext.execute("handleResizeDialog('downloadS3PackagePopup')"); - +//MAD: Do I need to check this is draft? Also am I passing that this is s3? fileDownloadService.writeGuestbookResponseRecord(guestbookResponse); } } @@ -351,10 +351,8 @@ public void clearRequestAccessFiles(){ public void addMultipleFilesForRequestAccess(DataFile dataFile) { this.filesForRequestAccess.add(dataFile); - } + } - - private String selectedFileId = null; public String getSelectedFileId() { diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java index cc8f895b370..18dbe1c49f5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java @@ -145,7 +145,6 @@ public void writeGuestbookAndStartFileDownload(GuestbookResponse guestbookRespon logger.fine("issued file download redirect for datafile "+guestbookResponse.getDataFile().getId()); } - //MAD: I'm pretty sure we should filter out draft public void writeGuestbookResponseRecord(GuestbookResponse guestbookResponse, FileMetadata fileMetadata, String format) { if(!fileMetadata.getDatasetVersion().isDraft()){ guestbookResponse = guestbookResponseService.modifyDatafileAndFormat(guestbookResponse, fileMetadata, format); @@ -154,13 +153,11 @@ public void writeGuestbookResponseRecord(GuestbookResponse guestbookResponse, Fi } public void writeGuestbookResponseRecord(GuestbookResponse guestbookResponse) { - try { CreateGuestbookResponseCommand cmd = new CreateGuestbookResponseCommand(dvRequestService.getDataverseRequest(), guestbookResponse, guestbookResponse.getDataset()); commandEngine.submit(cmd); } catch (CommandException e) { //if an error occurs here then download won't happen no need for response recs... - } } diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java index 806b6d32ef8..4fa6b8b944b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackageImporter.java @@ -21,13 +21,10 @@ import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import edu.harvard.iq.dataverse.util.FileUtil; -import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; +import edu.harvard.iq.dataverse.util.FileUtil;; import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; @@ -37,9 +34,6 @@ import javax.ejb.EJB; import javax.ejb.Stateless; import javax.inject.Named; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import org.apache.commons.io.IOUtils; /** * This class is for importing files added to s3 outside of dataverse. @@ -63,7 +57,7 @@ public class S3PackageImporter extends AbstractApiBean implements java.io.Serial @EJB EjbDataverseEngine commandEngine; - //Copies from another s3 bucket to our own + //Coppies from another s3 bucket to our own public void copyFromS3(Dataset dataset, String s3ImportPath) throws IOException { try { s3 = AmazonS3ClientBuilder.standard().defaultClient(); @@ -72,11 +66,7 @@ public void copyFromS3(Dataset dataset, String s3ImportPath) throws IOException "Cannot instantiate a S3 client using; check your AWS credentials and region", e); } - - JsonObjectBuilder bld = jsonObjectBuilder(); - - String fileMode = FileRecordWriter.FILE_MODE_PACKAGE_FILE; - + String dcmBucketName = System.getProperty("dataverse.files.dcm-s3-bucket-name"); String dcmDatasetKey = s3ImportPath; String dvBucketName = System.getProperty("dataverse.files.s3-bucket-name"); @@ -165,10 +155,8 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t while((line = reader.readLine()) != null && checksumVal.isEmpty()) { logger.log(Level.INFO, "line {0}", new Object[]{line}); String[] splitLine = line.split(" "); - //logger.log(Level.INFO, "root package name {0}", new Object[]{rootPackageName + ".zip"}); - //logger.log(Level.INFO, "splitline {0} | {1}", new Object[]{splitLine[0], splitLine[1]}); - - //the sha file should only contain one line, but incase it doesn't we will check for the one for our zip + + //the sha file should only contain one entry, but incase it doesn't we will check for the one for our zip if(splitLine[1].contains(rootPackageName + ".zip")) { checksumVal = splitLine[0]; logger.log(Level.INFO, "checksumVal found {0}", new Object[]{checksumVal}); @@ -189,13 +177,6 @@ public DataFile createPackageDataFile(Dataset dataset, String folderName, long t } - //MAD: CLOSE THINGS !! - - //String shaFileContents = IOUtils.toString(s3FilesSha.getObjectContent(), StandardCharsets.UTF_8); - - //We parse the checksum from the passed sha 1 - //String checksumVal = shaFileContents. - logger.log(Level.INFO, "Checksum value for the package in Dataset {0} is: {1}", new Object[]{dataset.getIdentifier(), checksumVal}); diff --git a/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java b/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java index d268726e3ee..eadacfbe536 100644 --- a/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/S3PackagePopupFragmentBean.java @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -//MAD: This and s3importer should probably be in their own package + package edu.harvard.iq.dataverse; import javax.faces.view.ViewScoped; @@ -28,14 +28,5 @@ public FileMetadata getFileMetadata() { return fm; } -// public String provideS3OneTimeUrl() throws IOException { -// if(df != null ) { -// StorageIO storageIO = DataAccess.getStorageIO(df); -// return ((S3AccessIO)storageIO).generateTemporaryS3Url(); -// } else { -// return ""; -// } -// -// } } \ No newline at end of file diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java index 0e4471c536b..399e9a081df 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java @@ -4,7 +4,6 @@ * and open the template in the editor. */ -//MAD: WHY DOES THIS LIVE IN API package edu.harvard.iq.dataverse.api; import java.lang.reflect.Type; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java index 595b633a9a9..38f17e78b9b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java @@ -1133,8 +1133,6 @@ public static String getFilesTempDirectory() { return filesTempDirectory; } - //OLD MAD: Refactor this again so it reuses code from S3AccessIO. - //OLD MAD: Also maybe refactor the generic named one to reflect that it creates fileAccessIO on its own. public static void generateS3PackageStorageIdentifier(DataFile dataFile) { String bucketName = System.getProperty("dataverse.files.s3-bucket-name"); String storageId = S3_IDENTIFIER_PREFIX + "://" + bucketName + ":" + dataFile.getFileMetadata().getLabel(); diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 5ef5faf85f6..cb7c6ffdf17 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -22,6 +22,12 @@ org.jboss.weld.context.conversation.lazy false + + + javax.faces.PROJECT_STAGE + + Production + primefaces.THEME bootstrap diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index d7a34ef2a58..6e15fd588c5 100755 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -1173,7 +1173,6 @@
- diff --git a/src/main/webapp/editdatafiles.xhtml b/src/main/webapp/editdatafiles.xhtml index fcf19e8bf8f..2f3898fe636 100755 --- a/src/main/webapp/editdatafiles.xhtml +++ b/src/main/webapp/editdatafiles.xhtml @@ -43,8 +43,8 @@ #{bundle['file.replace.original']} - - + +
diff --git a/src/main/webapp/file-download-button-fragment.xhtml b/src/main/webapp/file-download-button-fragment.xhtml index 97a1391a669..515a94e128f 100644 --- a/src/main/webapp/file-download-button-fragment.xhtml +++ b/src/main/webapp/file-download-button-fragment.xhtml @@ -113,8 +113,6 @@ #{bundle['file.compute']} - - - @@ -554,8 +552,6 @@ - diff --git a/src/main/webapp/s3-package-download-popup-fragment.xhtml b/src/main/webapp/s3-package-download-popup-fragment.xhtml index 92bae40616c..76f7608efae 100644 --- a/src/main/webapp/s3-package-download-popup-fragment.xhtml +++ b/src/main/webapp/s3-package-download-popup-fragment.xhtml @@ -8,7 +8,7 @@ xmlns:jsf="http://xmlns.jcp.org/jsf" xmlns:iqbs="http://xmlns.jcp.org/jsf/composite/iqbs"> - +
From 8827430e37d018a36fe2e6787ea89e80ec4e42b8 Mon Sep 17 00:00:00 2001 From: Michael Heppler Date: Thu, 29 Nov 2018 18:17:08 -0500 Subject: [PATCH 12/32] Cleaned up UI of new popup for S3 download [ref #4949] --- src/main/java/Bundle.properties | 7 ++-- src/main/webapp/dataset.xhtml | 2 +- src/main/webapp/editdatafiles.xhtml | 12 ++++--- .../file-download-button-fragment.xhtml | 9 +++-- src/main/webapp/individualFileTable.xhtml | 10 +++--- .../s3-package-download-popup-fragment.xhtml | 33 +++++++++++-------- 6 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/main/java/Bundle.properties b/src/main/java/Bundle.properties index 8a332cdde5b..d3e471dc3dc 100755 --- a/src/main/java/Bundle.properties +++ b/src/main/java/Bundle.properties @@ -70,10 +70,6 @@ toggleNavigation=Toggle navigation defaultBody=Default Body filter=Filter -s3packagedownload.title=Download Package File -s3packagedownload.instructions=Download this package file by copying and pasting the URL below into Wget or a download manager. Use of a web browser for this download is not recommended. User Guide - Downloading Package Files -s3packagedownload.urlHeader=Download URL - # dataverse_header.xhtml header.status.header=Status header.search.title=Search all dataverses... @@ -1620,6 +1616,9 @@ file.dataset.allFiles=All Files from this Dataset file.downloadDialog.header=Dataset Terms file.downloadDialog.tip=Please confirm and/or complete the information needed below in order to continue. file.requestAccessTermsDialog.tip=Please confirm and/or complete the information needed below in order to request access to files in this dataset. +s3packagedownload.title=Package File Download +s3packagedownload.instructions=Use the Download URL in a Wget command or a download manager to download this package file. Download via web browser is not recommended. User Guide - Downloading Package Files +s3packagedownload.urlHeader=Download URL file.search.placeholder=Search this dataset... file.results.btn.sort=Sort file.results.btn.sort.option.nameAZ=Name (A-Z) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 6e15fd588c5..7cbe0ad4483 100755 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -1173,7 +1173,7 @@ - + diff --git a/src/main/webapp/editdatafiles.xhtml b/src/main/webapp/editdatafiles.xhtml index 2f3898fe636..32406ce430d 100755 --- a/src/main/webapp/editdatafiles.xhtml +++ b/src/main/webapp/editdatafiles.xhtml @@ -42,11 +42,13 @@ - - - - - +
+ + + + + +
diff --git a/src/main/webapp/file-download-button-fragment.xhtml b/src/main/webapp/file-download-button-fragment.xhtml index 515a94e128f..1cbad980964 100644 --- a/src/main/webapp/file-download-button-fragment.xhtml +++ b/src/main/webapp/file-download-button-fragment.xhtml @@ -112,9 +112,12 @@ #{bundle['file.compute']} + + - @@ -122,7 +125,7 @@ - #{bundle.download} + #{bundle.download} S3 -
-
+
+
- + @@ -27,10 +27,10 @@
-
+