From 01633ec5426b69915aa8333ee0980fcf6b59137d Mon Sep 17 00:00:00 2001 From: mdmADA Date: Tue, 14 May 2019 14:16:39 +1000 Subject: [PATCH 01/18] Added @OneToOne relationship to FileDownload. First step in implementing Guestbook-at-Download functionality is to split the GuestbookResponse table into GuestbookResponse and FileDownload and moving a few columns from former into latter. --- .../harvard/iq/dataverse/FileDownload.java | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 src/main/java/edu/harvard/iq/dataverse/FileDownload.java diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java new file mode 100644 index 00000000000..5784810d096 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java @@ -0,0 +1,136 @@ +/* + * 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. + */ +package edu.harvard.iq.dataverse; + +import java.io.Serializable; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.persistence.OneToOne; +import javax.persistence.MapsId; +import java.util.Date; + + +/** + * + * @author marina + */ +@Entity +public class FileDownload implements Serializable { + + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private Long guestbookResponseId; + + @OneToOne @MapsId + private GuestbookResponse guestbookResponse; + + @Temporal(value = TemporalType.TIMESTAMP) + private Date timestamp; + + /* + Transient Values carry non-written information + that will assist in the download process + - selected file ids is a comma delimited list that contains the file ids for multiple download + - fileFormat tells the download api which format a subsettable file should be downloaded as + - writeResponse is set to false when dataset version is draft. + */ + + @Transient + private String selectedFileIds; + + @Transient + private String fileFormat; + + @Transient + private boolean writeResponse = true; + + + private String downloadtype; + private String sessionId; + + public String getFileFormat() { + return fileFormat; + } + + //for download + public void setFileFormat(String downloadFormat) { + this.fileFormat = downloadFormat; + } + + public String getDownloadtype() { + return downloadtype; + } + + public void setDownloadtype(String downloadtype) { + this.downloadtype = downloadtype; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + public String getSelectedFileIds() { + return selectedFileIds; + } + + public void setSelectedFileIds(String selectedFileIds) { + this.selectedFileIds = selectedFileIds; + } + + public Long getId() { + return guestbookResponseId; + } + + public void setId(Long id) { + this.guestbookResponseId = id; + } + + public void setGuestbookResponse(GuestbookResponse gbr){ + this.guestbookResponse = gbr; + } + + public GuestbookResponse getGuestbookResponse(){ + return this.guestbookResponse; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (id != null ? id.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof FileDownload)) { + return false; + } + FileDownload other = (FileDownload) object; + if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { + return false; + } + return true; + } + + @Override + public String toString() { + return "edu.harvard.iq.dataverse.FileDownload[ id=" + id + " ]"; + } + + +} From b91687e543eb10f81ecf6ad60bb8446b4308cb0f Mon Sep 17 00:00:00 2001 From: mdmADA Date: Wed, 15 May 2019 12:47:45 +1000 Subject: [PATCH 02/18] Added @OneToOne relationship to FileDownload. First step in implementing Guestbook-at-Download functionality is to split the GuestbookResponse table into GuestbookResponse and FileDownload and moving a few columns from former into latter. --- .../iq/dataverse/GuestbookResponse.java | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java index 19f55dc241a..8f1af8a7c8b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java @@ -1,3 +1,4 @@ + /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates @@ -24,16 +25,13 @@ @Index(columnList = "datafile_id"), @Index(columnList = "dataset_id") }) -@NamedQueries( - @NamedQuery(name = "GuestbookResponse.findByAuthenticatedUserId", - query = "SELECT gbr FROM GuestbookResponse gbr WHERE gbr.authenticatedUser.id=:authenticatedUserId") -) + public class GuestbookResponse implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - + private Long guestbookResponseId; + @ManyToOne @JoinColumn(nullable=false) private Guestbook guestbook; @@ -54,6 +52,9 @@ public class GuestbookResponse implements Serializable { @JoinColumn(nullable=true) private AuthenticatedUser authenticatedUser; + @OneToOne(cascade=CascadeType.ALL,mappedBy="guestbookResponse") + private FileDownload fileDownload; + @OneToMany(mappedBy="guestbookResponse",cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST},orphanRemoval=true) @OrderBy ("id") private List customQuestionResponses; @@ -73,8 +74,8 @@ public class GuestbookResponse implements Serializable { * (Some day it would be nice to convert WorldMap into an ExternalTool but * it's not worth the effort at this time.) */ - private String downloadtype; - private String sessionId; + //private String downloadtype; + //private String sessionId; @Temporal(value = TemporalType.TIMESTAMP) private Date responseTime; @@ -112,22 +113,23 @@ public void setWriteResponse(boolean writeResponse) { this.writeResponse = writeResponse; } + /*for download - moved to FileDownload.java public String getSelectedFileIds() { return selectedFileIds; } public void setSelectedFileIds(String selectedFileIds) { this.selectedFileIds = selectedFileIds; - } - + }*/ + /*for download - moved to FileDownload.java public String getFileFormat() { return fileFormat; } public void setFileFormat(String downloadFormat) { this.fileFormat = downloadFormat; - } + }*/ public ExternalTool getExternalTool() { return externalTool; @@ -151,7 +153,7 @@ public GuestbookResponse(GuestbookResponse source){ this.setDataset(source.getDataset()); this.setDatasetVersion(source.getDatasetVersion()); this.setAuthenticatedUser(source.getAuthenticatedUser()); - this.setSessionId(source.getSessionId()); + //this.setSessionId(source.getSessionId()); List customQuestionResponses = new ArrayList<>(); if (!source.getCustomQuestionResponses().isEmpty()){ for (CustomQuestionResponse customQuestionResponse : source.getCustomQuestionResponses() ){ @@ -208,11 +210,11 @@ public void setPosition(String position) { } public Long getId() { - return id; + return guestbookResponseId; } public void setId(Long id) { - this.id = id; + this.guestbookResponseId = id; } public Date getResponseTime() { @@ -240,6 +242,15 @@ public void setCustomQuestionResponses(List customQuesti this.customQuestionResponses = customQuestionResponses; } + public FileDownload getFileDownload(){ + return fileDownload; + } + + public void setFileDownload(FileDownload fDownload){ + this.fileDownload = fDownload; + } + + public Dataset getDataset() { return dataset; } @@ -272,26 +283,29 @@ public void setAuthenticatedUser(AuthenticatedUser authenticatedUser) { this.authenticatedUser = authenticatedUser; } + /*for download - moved to FileDownload.java public String getDownloadtype() { return downloadtype; } public void setDownloadtype(String downloadtype) { this.downloadtype = downloadtype; - } + }*/ + + /*for download - moved to FileDownload.java public String getSessionId() { return sessionId; } public void setSessionId(String sessionId) { this.sessionId = sessionId; - } + }*/ @Override public int hashCode() { int hash = 0; - hash += (id != null ? id.hashCode() : 0); + hash += (guestbookResponseId != null ? guestbookResponseId.hashCode() : 0); return hash; } @@ -302,7 +316,7 @@ public boolean equals(Object object) { return false; } GuestbookResponse other = (GuestbookResponse) object; - if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { + if ((this.guestbookResponseId == null && other.guestbookResponseId != null) || (this.guestbookResponseId != null && !this.guestbookResponseId.equals(other.guestbookResponseId))) { return false; } return true; @@ -310,7 +324,7 @@ public boolean equals(Object object) { @Override public String toString() { - return "edu.harvard.iq.dvn.core.vdc.GuestBookResponse[ id=" + id + " ]"; + return "edu.harvard.iq.dvn.core.vdc.GuestBookResponse[ id=" + guestbookResponseId + " ]"; } } From d0dee8977583c99e5df5e1df1c41dc20af0fd163 Mon Sep 17 00:00:00 2001 From: mdmADA Date: Fri, 17 May 2019 10:47:43 +1000 Subject: [PATCH 03/18] postMetadata causing problems --- .../java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java b/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java index a8ddc3b06e9..f4af6d436f2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java @@ -176,6 +176,8 @@ public boolean testDOIExists(String doi) { * @return */ public String postMetadata(String metadata) { + System.out.println("postMetadata url: " + this.url + "/metadata"); + HttpPost httpPost = new HttpPost(this.url + "/metadata"); httpPost.setHeader("Content-Type", "application/xml;charset=UTF-8"); try { From c3874f9aee8d73ac22d68624a874866281b2623f Mon Sep 17 00:00:00 2001 From: mdmADA Date: Fri, 17 May 2019 12:24:51 +1000 Subject: [PATCH 04/18] Changes to GuestbookResponse interface implementation to call FileDownload methods for functionality moved to the latter. --- .../iq/dataverse/GuestbookResponse.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java index 8f1af8a7c8b..6b150e82afb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java @@ -113,6 +113,22 @@ public void setWriteResponse(boolean writeResponse) { this.writeResponse = writeResponse; } + public String getSelectedFileIds(){ + return this.fileDownload.getSelectedFileIds(); + } + + public void setSelectedFileIds(String selectedFileIds) { + this.fileDownload.setSelectedFileIds(selectedFileIds); + } + + public String getFileFormat() { + return this.fileDownload.getFileFormat(); + } + + public void setFileFormat(String downloadFormat) { + this.fileDownload.setFileFormat(downloadFormat); + } + /*for download - moved to FileDownload.java public String getSelectedFileIds() { return selectedFileIds; @@ -283,6 +299,23 @@ public void setAuthenticatedUser(AuthenticatedUser authenticatedUser) { this.authenticatedUser = authenticatedUser; } + public String getDownloadtype() { + return this.fileDownload.getDownloadtype(); + } + + public void setDownloadtype(String downloadtype) { + this.fileDownload.setDownloadtype(downloadtype); + + } + + public String getSessionId() { + return this.fileDownload.getSessionId(); + } + + public void setSessionId(String sessionId) { + this.fileDownload.setSessionId(sessionId); + } + /*for download - moved to FileDownload.java public String getDownloadtype() { return downloadtype; From 2bc6fa6f3d4d2cb4a02e2aeee2ca0ecaebfd6b42 Mon Sep 17 00:00:00 2001 From: mdmADA Date: Fri, 17 May 2019 13:39:58 +1000 Subject: [PATCH 05/18] Setting up one-to-one relationship between FileDownload and GuestbookResponse --- .../java/edu/harvard/iq/dataverse/FileDownload.java | 12 +++++++----- .../edu/harvard/iq/dataverse/GuestbookResponse.java | 12 ++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java index 5784810d096..fd282ece3ac 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java @@ -13,8 +13,9 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; +import javax.persistence.CascadeType; import javax.persistence.OneToOne; -import javax.persistence.MapsId; +import javax.persistence.JoinColumn; import java.util.Date; @@ -27,13 +28,14 @@ public class FileDownload implements Serializable { private static final long serialVersionUID = 1L; @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private Long guestbookResponseId; - - @OneToOne @MapsId + + @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval=true) + @JoinColumn(name="guestbookResponse_id") private GuestbookResponse guestbookResponse; + @Temporal(value = TemporalType.TIMESTAMP) private Date timestamp; diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java index 6b150e82afb..ad015435222 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java @@ -30,7 +30,7 @@ public class GuestbookResponse implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long guestbookResponseId; + private Long id; @ManyToOne @JoinColumn(nullable=false) @@ -226,11 +226,11 @@ public void setPosition(String position) { } public Long getId() { - return guestbookResponseId; + return id; } public void setId(Long id) { - this.guestbookResponseId = id; + this.id = id; } public Date getResponseTime() { @@ -338,7 +338,7 @@ public void setSessionId(String sessionId) { @Override public int hashCode() { int hash = 0; - hash += (guestbookResponseId != null ? guestbookResponseId.hashCode() : 0); + hash += (id != null ? id.hashCode() : 0); return hash; } @@ -349,7 +349,7 @@ public boolean equals(Object object) { return false; } GuestbookResponse other = (GuestbookResponse) object; - if ((this.guestbookResponseId == null && other.guestbookResponseId != null) || (this.guestbookResponseId != null && !this.guestbookResponseId.equals(other.guestbookResponseId))) { + if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; @@ -357,7 +357,7 @@ public boolean equals(Object object) { @Override public String toString() { - return "edu.harvard.iq.dvn.core.vdc.GuestBookResponse[ id=" + guestbookResponseId + " ]"; + return "edu.harvard.iq.dvn.core.vdc.GuestBookResponse[ id=" + id + " ]"; } } From 9f6834c1579e02342fa5fb3a78acb793fc589ff2 Mon Sep 17 00:00:00 2001 From: mdmADA Date: Fri, 17 May 2019 13:44:53 +1000 Subject: [PATCH 06/18] Fixed getId() and setId() --- src/main/java/edu/harvard/iq/dataverse/FileDownload.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java index fd282ece3ac..313a1b978e0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java @@ -94,11 +94,11 @@ public void setSelectedFileIds(String selectedFileIds) { } public Long getId() { - return guestbookResponseId; + return id; } public void setId(Long id) { - this.guestbookResponseId = id; + this.id = id; } public void setGuestbookResponse(GuestbookResponse gbr){ From c69f783e994ce4f3b9bb588b69141003191818e1 Mon Sep 17 00:00:00 2001 From: mdmADA Date: Fri, 17 May 2019 14:06:16 +1000 Subject: [PATCH 07/18] Fixing possible null FileDownload --- .../java/edu/harvard/iq/dataverse/GuestbookResponse.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java index ad015435222..2c8dbe6938d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java @@ -156,7 +156,10 @@ public void setExternalTool(ExternalTool externalTool) { } public GuestbookResponse(){ - + if(this.getFileDownload() == null){ + this.fileDownload = new FileDownload(); + this.fileDownload.setGuestbookResponse(this); + } } public GuestbookResponse(GuestbookResponse source){ @@ -182,6 +185,7 @@ public GuestbookResponse(GuestbookResponse source){ } this.setCustomQuestionResponses(customQuestionResponses); this.setGuestbook(source.getGuestbook()); + this.setFileDownload(source.getFileDownload()); } @@ -313,6 +317,7 @@ public String getSessionId() { } public void setSessionId(String sessionId) { + this.fileDownload.setSessionId(sessionId); } From 07f96424bdd82870e7f68efb101bfd0362fb328a Mon Sep 17 00:00:00 2001 From: mdmADA Date: Fri, 17 May 2019 16:32:35 +1000 Subject: [PATCH 08/18] Fixing downloadTimestamp --- .../java/edu/harvard/iq/dataverse/FileDownload.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java index 313a1b978e0..01948ce86cc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java @@ -37,7 +37,7 @@ public class FileDownload implements Serializable { @Temporal(value = TemporalType.TIMESTAMP) - private Date timestamp; + private Date downloadTimestamp; /* Transient Values carry non-written information @@ -101,6 +101,15 @@ public void setId(Long id) { this.id = id; } + public Date getDownloadTimestamp(){ + return this.downloadTimestamp; + } + + public void setDownloadTimestamp(Date downloadTimestamp){ + this.downloadTimestamp = downloadTimestamp; + } + + public void setGuestbookResponse(GuestbookResponse gbr){ this.guestbookResponse = gbr; } From f37b46c52f282cd21382d9a972bd27c65bc9c0a9 Mon Sep 17 00:00:00 2001 From: mdmADA Date: Mon, 20 May 2019 11:30:56 +1000 Subject: [PATCH 09/18] Fixing downloadTimestamp --- .../harvard/iq/dataverse/GuestbookResponseServiceBean.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java index 79bdce62359..7c0be6d9949 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java @@ -731,6 +731,8 @@ private void setUserDefaultResponses(GuestbookResponse guestbookResponse, Datave user = sessionUser; } + System.out.println("setUserDefaultResponses 1 sessionuser: " + user.toString() ); + if (user != null) { guestbookResponse.setEmail(getUserEMail(user)); guestbookResponse.setName(getUserName(user)); @@ -749,6 +751,9 @@ private void setUserDefaultResponses(GuestbookResponse guestbookResponse, Datave private void setUserDefaultResponses(GuestbookResponse guestbookResponse, DataverseSession session) { User user = session.getUser(); + + System.out.println("setUserDefaultResponses 2 sessionuser: " + user.toString() ); + if (user != null) { guestbookResponse.setEmail(getUserEMail(user)); guestbookResponse.setName(getUserName(user)); From 65ffdcc7fefbab2c0d867e7ba777c21922b9cc72 Mon Sep 17 00:00:00 2001 From: mdmADA Date: Mon, 20 May 2019 12:02:42 +1000 Subject: [PATCH 10/18] Not sure why 'Guest' not written to GuestbookResponse when Guest user downloads. --- .../harvard/iq/dataverse/GuestbookResponseServiceBean.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java index 7c0be6d9949..9626c707a9a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java @@ -730,9 +730,7 @@ private void setUserDefaultResponses(GuestbookResponse guestbookResponse, Datave } else{ user = sessionUser; } - - System.out.println("setUserDefaultResponses 1 sessionuser: " + user.toString() ); - + if (user != null) { guestbookResponse.setEmail(getUserEMail(user)); guestbookResponse.setName(getUserName(user)); @@ -752,8 +750,6 @@ private void setUserDefaultResponses(GuestbookResponse guestbookResponse, Datave private void setUserDefaultResponses(GuestbookResponse guestbookResponse, DataverseSession session) { User user = session.getUser(); - System.out.println("setUserDefaultResponses 2 sessionuser: " + user.toString() ); - if (user != null) { guestbookResponse.setEmail(getUserEMail(user)); guestbookResponse.setName(getUserName(user)); From acdd7c9abc1478423e2625f14483f0549cce6532 Mon Sep 17 00:00:00 2001 From: mdmADA Date: Mon, 20 May 2019 16:02:30 +1000 Subject: [PATCH 11/18] Testing out different onetoone mapping scheme. --- .../harvard/iq/dataverse/FileDownload.java | 36 +++++++++++++++---- .../iq/dataverse/GuestbookResponse.java | 13 ++++--- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java index 01948ce86cc..b9b54d71e28 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java @@ -15,6 +15,8 @@ import javax.persistence.Transient; import javax.persistence.CascadeType; import javax.persistence.OneToOne; +import javax.persistence.MapsId; +import javax.persistence.FetchType; import javax.persistence.JoinColumn; import java.util.Date; @@ -26,15 +28,21 @@ @Entity public class FileDownload implements Serializable { - private static final long serialVersionUID = 1L; + /*private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval=true) @JoinColumn(name="guestbookResponse_id") - private GuestbookResponse guestbookResponse; + private GuestbookResponse guestbookResponse;*/ + + @Id + private Long id; + @OneToOne(fetch = FetchType.LAZY) + @MapsId + private GuestbookResponse guestbookResponse; @Temporal(value = TemporalType.TIMESTAMP) private Date downloadTimestamp; @@ -44,7 +52,6 @@ public class FileDownload implements Serializable { that will assist in the download process - selected file ids is a comma delimited list that contains the file ids for multiple download - fileFormat tells the download api which format a subsettable file should be downloaded as - - writeResponse is set to false when dataset version is draft. */ @Transient @@ -53,14 +60,28 @@ public class FileDownload implements Serializable { @Transient private String fileFormat; - @Transient - private boolean writeResponse = true; + /*@Transient + private boolean writeResponse = true; -> in GuestbookResponse + */ private String downloadtype; private String sessionId; - public String getFileFormat() { + public FileDownload(){ + + } + + public FileDownload(FileDownload source){ + this.setDownloadTimestamp(source.getDownloadTimestamp()); + this.setDownloadtype(source.getDownloadtype()); + this.setFileFormat(source.getFileFormat()); + this.setGuestbookResponse(source.getGuestbookResponse()); + this.setSelectedFileIds(source.getSelectedFileIds()); + this.setSessionId(source.getSessionId()); + } + + public String getFileFormat() { return fileFormat; } @@ -118,6 +139,9 @@ public GuestbookResponse getGuestbookResponse(){ return this.guestbookResponse; } + + + @Override public int hashCode() { int hash = 0; diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java index 2c8dbe6938d..cfa738de7ac 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java @@ -52,9 +52,9 @@ public class GuestbookResponse implements Serializable { @JoinColumn(nullable=true) private AuthenticatedUser authenticatedUser; - @OneToOne(cascade=CascadeType.ALL,mappedBy="guestbookResponse") + @OneToOne(cascade=CascadeType.ALL,mappedBy="guestbookResponse",fetch = FetchType.LAZY, optional = false) private FileDownload fileDownload; - + @OneToMany(mappedBy="guestbookResponse",cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST},orphanRemoval=true) @OrderBy ("id") private List customQuestionResponses; @@ -88,11 +88,12 @@ public class GuestbookResponse implements Serializable { - writeResponse is set to false when dataset version is draft. */ - @Transient - private String selectedFileIds; + /*@Transient + private String selectedFileIds; -> moved to FileDownload @Transient - private String fileFormat; + private String fileFormat; -> moved to FileDownload + */ @Transient private boolean writeResponse = true; @@ -173,6 +174,8 @@ public GuestbookResponse(GuestbookResponse source){ this.setDatasetVersion(source.getDatasetVersion()); this.setAuthenticatedUser(source.getAuthenticatedUser()); //this.setSessionId(source.getSessionId()); + + List customQuestionResponses = new ArrayList<>(); if (!source.getCustomQuestionResponses().isEmpty()){ for (CustomQuestionResponse customQuestionResponse : source.getCustomQuestionResponses() ){ From b0992e782d990bbf071dda2271d2e1de1bba9848 Mon Sep 17 00:00:00 2001 From: mdmADA Date: Mon, 20 May 2019 16:34:36 +1000 Subject: [PATCH 12/18] Cleaning up OneToOne code. --- .../iq/dataverse/GuestbookResponse.java | 41 +------------------ 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java index cfa738de7ac..69059012c73 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java @@ -130,24 +130,6 @@ public void setFileFormat(String downloadFormat) { this.fileDownload.setFileFormat(downloadFormat); } - /*for download - moved to FileDownload.java - public String getSelectedFileIds() { - return selectedFileIds; - } - - public void setSelectedFileIds(String selectedFileIds) { - this.selectedFileIds = selectedFileIds; - }*/ - - /*for download - moved to FileDownload.java - public String getFileFormat() { - return fileFormat; - } - - public void setFileFormat(String downloadFormat) { - this.fileFormat = downloadFormat; - }*/ - public ExternalTool getExternalTool() { return externalTool; } @@ -173,9 +155,7 @@ public GuestbookResponse(GuestbookResponse source){ this.setDataset(source.getDataset()); this.setDatasetVersion(source.getDatasetVersion()); this.setAuthenticatedUser(source.getAuthenticatedUser()); - //this.setSessionId(source.getSessionId()); - - + List customQuestionResponses = new ArrayList<>(); if (!source.getCustomQuestionResponses().isEmpty()){ for (CustomQuestionResponse customQuestionResponse : source.getCustomQuestionResponses() ){ @@ -324,25 +304,6 @@ public void setSessionId(String sessionId) { this.fileDownload.setSessionId(sessionId); } - /*for download - moved to FileDownload.java - public String getDownloadtype() { - return downloadtype; - } - - public void setDownloadtype(String downloadtype) { - this.downloadtype = downloadtype; - }*/ - - - /*for download - moved to FileDownload.java - public String getSessionId() { - return sessionId; - } - - public void setSessionId(String sessionId) { - this.sessionId = sessionId; - }*/ - @Override public int hashCode() { int hash = 0; From 32147016eb051b29acd37a45ed50cccaa5c719ad Mon Sep 17 00:00:00 2001 From: mdmADA Date: Mon, 20 May 2019 16:36:13 +1000 Subject: [PATCH 13/18] Cleaning up OneToOne code. --- .../edu/harvard/iq/dataverse/FileDownload.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java index b9b54d71e28..07b8965d03d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java @@ -26,16 +26,7 @@ * @author marina */ @Entity -public class FileDownload implements Serializable { - - /*private static final long serialVersionUID = 1L; - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval=true) - @JoinColumn(name="guestbookResponse_id") - private GuestbookResponse guestbookResponse;*/ +public class FileDownload implements Serializable { @Id private Long id; @@ -60,11 +51,6 @@ public class FileDownload implements Serializable { @Transient private String fileFormat; - /*@Transient - private boolean writeResponse = true; -> in GuestbookResponse - */ - - private String downloadtype; private String sessionId; From 0f71cc06356ea14b2b27c8fcef0fbccd736df96b Mon Sep 17 00:00:00 2001 From: mdmADA Date: Tue, 21 May 2019 12:51:37 +1000 Subject: [PATCH 14/18] Cleaning up OneToOne code. --- .../harvard/iq/dataverse/FileDownload.java | 14 +++++++--- .../iq/dataverse/GuestbookResponse.java | 26 +++---------------- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java index 07b8965d03d..8463a8278c0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownload.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownload.java @@ -51,6 +51,17 @@ public class FileDownload implements Serializable { @Transient private String fileFormat; + + /** + * Possible values for downloadType include "Download", "Subset", + * "WorldMap", or the displayName of an ExternalTool. + * + * TODO: Types like "Download" and "Subset" and probably "WorldMap" should + * be defined once as constants (likely an enum) rather than having these + * strings duplicated in various places when setDownloadtype() is called. + * (Some day it would be nice to convert WorldMap into an ExternalTool but + * it's not worth the effort at this time.) + */ private String downloadtype; private String sessionId; @@ -125,9 +136,6 @@ public GuestbookResponse getGuestbookResponse(){ return this.guestbookResponse; } - - - @Override public int hashCode() { int hash = 0; diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java index 69059012c73..2d358dc9b0d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponse.java @@ -59,23 +59,11 @@ public class GuestbookResponse implements Serializable { @OrderBy ("id") private List customQuestionResponses; - private String name; private String email; private String institution; private String position; - /** - * Possible values for downloadType include "Download", "Subset", - * "WorldMap", or the displayName of an ExternalTool. - * - * TODO: Types like "Download" and "Subset" and probably "WorldMap" should - * be defined once as constants (likely an enum) rather than having these - * strings duplicated in various places when setDownloadtype() is called. - * (Some day it would be nice to convert WorldMap into an ExternalTool but - * it's not worth the effort at this time.) - */ - //private String downloadtype; - //private String sessionId; + @Temporal(value = TemporalType.TIMESTAMP) private Date responseTime; @@ -83,18 +71,9 @@ public class GuestbookResponse implements Serializable { /* Transient Values carry non-written information that will assist in the download process - - selected file ids is a comma delimited list that contains the file ids for multiple download - - fileFormat tells the download api which format a subsettable file should be downloaded as - writeResponse is set to false when dataset version is draft. */ - - /*@Transient - private String selectedFileIds; -> moved to FileDownload - - @Transient - private String fileFormat; -> moved to FileDownload - */ - + @Transient private boolean writeResponse = true; @@ -226,6 +205,7 @@ public Date getResponseTime() { public void setResponseTime(Date responseTime) { this.responseTime = responseTime; + this.getFileDownload().setDownloadTimestamp(responseTime); } public String getResponseDate() { From 54a204e49f4ea1d602990f92079b304c0bb9494c Mon Sep 17 00:00:00 2001 From: mdmADA Date: Thu, 23 May 2019 15:44:57 +1000 Subject: [PATCH 15/18] Adding update sql script related to splitting guestbookresponse table into filedownload and guestbookresponse. Create table not required for new filedownload table. Insert and alter commands required for inserting data from guestbookresponse into filedownload and for modifying guestbookresponse table. --- .../db/migration/V4.14.0.1__2043-split-gbr-table.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/resources/db/migration/V4.14.0.1__2043-split-gbr-table.sql diff --git a/src/main/resources/db/migration/V4.14.0.1__2043-split-gbr-table.sql b/src/main/resources/db/migration/V4.14.0.1__2043-split-gbr-table.sql new file mode 100644 index 00000000000..d2f2addb620 --- /dev/null +++ b/src/main/resources/db/migration/V4.14.0.1__2043-split-gbr-table.sql @@ -0,0 +1,4 @@ +begin; +insert into filedownload(GUESTBOOKRESPONSE_ID,DOWNLOADTYPE,DOWNLOADTIMESTAMP,SESSIONID) select ID, DOWNLOADTYPE,RESPONSETIME,SESSIONID from guestbookresponse; +alter table guestbookresponse drop column DOWNLOADTYPE, SESSIONID; +commit; \ No newline at end of file From fd362306bc58724f71ea33280ea367effddb288c Mon Sep 17 00:00:00 2001 From: mdmADA Date: Fri, 7 Jun 2019 11:09:22 +1000 Subject: [PATCH 16/18] Rename V4.14.0.1__2043-split-gbr-table.sql to V4.14.0.2__2043-split-gbr-table.sql --- ...-split-gbr-table.sql => V4.14.0.2__2043-split-gbr-table.sql} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/resources/db/migration/{V4.14.0.1__2043-split-gbr-table.sql => V4.14.0.2__2043-split-gbr-table.sql} (96%) diff --git a/src/main/resources/db/migration/V4.14.0.1__2043-split-gbr-table.sql b/src/main/resources/db/migration/V4.14.0.2__2043-split-gbr-table.sql similarity index 96% rename from src/main/resources/db/migration/V4.14.0.1__2043-split-gbr-table.sql rename to src/main/resources/db/migration/V4.14.0.2__2043-split-gbr-table.sql index d2f2addb620..bce5c3d96ca 100644 --- a/src/main/resources/db/migration/V4.14.0.1__2043-split-gbr-table.sql +++ b/src/main/resources/db/migration/V4.14.0.2__2043-split-gbr-table.sql @@ -1,4 +1,4 @@ begin; insert into filedownload(GUESTBOOKRESPONSE_ID,DOWNLOADTYPE,DOWNLOADTIMESTAMP,SESSIONID) select ID, DOWNLOADTYPE,RESPONSETIME,SESSIONID from guestbookresponse; alter table guestbookresponse drop column DOWNLOADTYPE, SESSIONID; -commit; \ No newline at end of file +commit; From f4b5dd465df5192a7ff6c6f86fcc7f3cac3dcc3f Mon Sep 17 00:00:00 2001 From: mdmADA Date: Tue, 18 Jun 2019 13:44:15 +1000 Subject: [PATCH 17/18] Update V4.14.0.2__2043-split-gbr-table.sql --- .../resources/db/migration/V4.14.0.2__2043-split-gbr-table.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/db/migration/V4.14.0.2__2043-split-gbr-table.sql b/src/main/resources/db/migration/V4.14.0.2__2043-split-gbr-table.sql index bce5c3d96ca..b161a093497 100644 --- a/src/main/resources/db/migration/V4.14.0.2__2043-split-gbr-table.sql +++ b/src/main/resources/db/migration/V4.14.0.2__2043-split-gbr-table.sql @@ -1,4 +1,4 @@ begin; insert into filedownload(GUESTBOOKRESPONSE_ID,DOWNLOADTYPE,DOWNLOADTIMESTAMP,SESSIONID) select ID, DOWNLOADTYPE,RESPONSETIME,SESSIONID from guestbookresponse; -alter table guestbookresponse drop column DOWNLOADTYPE, SESSIONID; +alter table guestbookresponse drop column DOWNLOADTYPE, drop column SESSIONID; commit; From 2b164af854d9eb6395834f62cb25bde811972dcf Mon Sep 17 00:00:00 2001 From: mdmADA Date: Thu, 20 Jun 2019 13:05:21 +1000 Subject: [PATCH 18/18] Modify the BASE_QUERY_STRING_FOR_DOWNLOAD_AS_CSV and BASE_QUERY_STRING_FOR_PAGE_DISPLAY sql strings to include the join between guestbookresponse and new filedownload table. --- .../iq/dataverse/GuestbookResponseServiceBean.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java index 9626c707a9a..dd41c92ffbd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/GuestbookResponseServiceBean.java @@ -46,14 +46,15 @@ public class GuestbookResponseServiceBean { // the collected data, in CSV format, from the manage-guestbooks and // guestbook-results pages. (for entire dataverses, and for the individual // guestbooks within dataverses, respectively). -- L.A. - private static final String BASE_QUERY_STRING_FOR_DOWNLOAD_AS_CSV = "select r.id, g.name, v.value, r.responsetime, r.downloadtype," + private static final String BASE_QUERY_STRING_FOR_DOWNLOAD_AS_CSV = "select r.id, g.name, v.value, r.responsetime, f.downloadtype," + " m.label, r.dataFile_id, r.name, r.email, r.institution, r.position " - + "from guestbookresponse r, datasetfieldvalue v, filemetadata m, dvobject o, guestbook g " + + "from guestbookresponse r, filedownload f, datasetfieldvalue v, filemetadata m, dvobject o, guestbook g " + "where " + " v.datasetfield_id = (select id from datasetfield f where datasetfieldtype_id = 1 " + " and datasetversion_id = (select max(id) from datasetversion where dataset_id =r.dataset_id )) " + " and m.datasetversion_id = (select max(datasetversion_id) from filemetadata where datafile_id =r.datafile_id ) " + " and m.datafile_id = r.datafile_id " + + " and r.id = f.guestbookresponse_id " + " and r.dataset_id = o.id " + " and r.guestbook_id = g.id "; @@ -61,13 +62,14 @@ public class GuestbookResponseServiceBean { // on the guestbook-results.xhtml page (the info we show on the page is // less detailed than what we let the users download as CSV files, so this // query has fewer fields than the one above). -- L.A. - private static final String BASE_QUERY_STRING_FOR_PAGE_DISPLAY = "select r.id, v.value, r.responsetime, r.downloadtype, m.label, r.name " - + "from guestbookresponse r, datasetfieldvalue v, filemetadata m , dvobject o " + private static final String BASE_QUERY_STRING_FOR_PAGE_DISPLAY = "select r.id, v.value, r.responsetime, f.downloadtype, m.label, r.name " + + "from guestbookresponse r, filedownload f, datasetfieldvalue v, filemetadata m , dvobject o " + "where " + " v.datasetfield_id = (select id from datasetfield f where datasetfieldtype_id = 1 " + " and datasetversion_id = (select max(id) from datasetversion where dataset_id =r.dataset_id )) " + " and m.datasetversion_id = (select max(datasetversion_id) from filemetadata where datafile_id =r.datafile_id ) " + " and m.datafile_id = r.datafile_id " + + " and r.id = f.guestbookresponse_id " + " and r.dataset_id = o.id "; // And a custom query for retrieving *all* the custom question responses, for