From 187aaa147f89c27aa0c033b3025abddd65bc607c Mon Sep 17 00:00:00 2001 From: posixeleni Date: Fri, 2 May 2014 16:23:46 -0400 Subject: [PATCH 01/66] Updated unpublished terminology and Edit Dataverse section --- .../source/User/dataverse-management.rst | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/doc/Sphinx/source/User/dataverse-management.rst b/doc/Sphinx/source/User/dataverse-management.rst index 2ce049e3881..5580aa2764a 100644 --- a/doc/Sphinx/source/User/dataverse-management.rst +++ b/doc/Sphinx/source/User/dataverse-management.rst @@ -19,33 +19,35 @@ Creating a dataverse is easy but first you must be a registered user (see Create #. Once on the "New Dataverse" page fill in the following fields: * Enter the name of your Dataverse. * **Host Dataverse**: select which dataverse you would like this new dataverse to belong to. By default it will be a child dataverse of the parent you clicked from. - * **Dataverse Alias**: This is an abbreviation, usually lower-case, that becomes part of the URL for the new dataverse. Special characters (~,\`, !, @, #, $, %, ^, &, and \*) and spaces are not allowed. **Note**: if you change the Dataverse Alias field, the URL for your Dataverse changes (http//.../dv/'alias'), which affects links to this page. + * **Alias**: This is an abbreviation, usually lower-case, that becomes part of the URL for the new dataverse. Special characters (~,\`, !, @, #, $, %, ^, &, and \*) and spaces are not allowed. **Note**: if you change the Dataverse Alias field, the URL for your Dataverse changes (http//.../dv/'alias'), which affects links to this page. * **E-mail**: This is the email address you will receive notifications for this particular Dataverse. * **Affiliation**: Add any Affiliation that can be associated to this particular dataverse (e.g., project name, institute name, department name, journal name, etc). * **Description**: Provide a description of this dataverse (max. 1000 characters). This will display on the home page of your dataverse and in the search result list. * **Choose the sets of Metadata Elements for datasets in this Dataverse**: by default the metadata elements will be from the host dataverse that this new dataverse is created in. 3. Click "Create Dataverse" button and you're done! An email will be sent to you with more information, including the URL to access your new dataverse. -\*Required information can vary depending on site policy. Required fields are noted with a red asterisk. +\*Required fields are denoted by a red asterisk. Edit Dataverse ================= -To edit your Dataverse, navigate to your Dataverse homepage and select the "Edit Dataverse" button. +To edit your Dataverse, navigate to your Dataverse homepage and select the "Edit Dataverse" button, +where you will be presented with the following editing options. -- **General Information**: edit name, host dataverse, alias, email, description, and affilitation for your dataverse. +- **General Information**: edit name, host dataverse, alias, email, + description, affilitation, and Metadata Elements for your dataverse. - **Roles + Permissions** for this particular dataverse -- **Setup**: Edit the Metadata elements and Facets you want to associate with your dataverse. Note: facets will appear in the order shown on the list. +- **Setup**: Update the Facets you want to associate with your dataverse. Note: facets will appear in the order shown on the list. Publish Your Dataverse ================================================================= -Once your dataverse is ready to go public, go to your dataverse page, click on the "Private" button on the right +Once your dataverse is ready to go public, go to your dataverse page, click on the "Unpublished" button on the right hand side of the page which should indicate: -"This dataverse is Private. To make it public click 'Publish dataverse' link." +"This dataverse is Unpublished. To publish it click 'Publish dataverse' link" -**Important Note**: Once a dataverse is made public it can no longer be un-published. +**Important Note**: Once a dataverse is made public it can no longer be unpublished. .. |image1| image:: ./img/Dataverses-Datasets.png From b7521e284fa6c9b131c57819b5c0a0332aea668a Mon Sep 17 00:00:00 2001 From: posixeleni Date: Fri, 2 May 2014 16:26:09 -0400 Subject: [PATCH 02/66] Updated Publish dataverse --- doc/Sphinx/source/User/dataverse-management.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/Sphinx/source/User/dataverse-management.rst b/doc/Sphinx/source/User/dataverse-management.rst index 5580aa2764a..9cbd20d75b3 100644 --- a/doc/Sphinx/source/User/dataverse-management.rst +++ b/doc/Sphinx/source/User/dataverse-management.rst @@ -37,7 +37,8 @@ where you will be presented with the following editing options. - **General Information**: edit name, host dataverse, alias, email, description, affilitation, and Metadata Elements for your dataverse. - **Roles + Permissions** for this particular dataverse -- **Setup**: Update the Facets you want to associate with your dataverse. Note: facets will appear in the order shown on the list. +- **Setup**: Update the Facets you want to associate with your dataverse. + Note: facets will appear in the order shown on the list. Publish Your Dataverse @@ -45,7 +46,8 @@ Publish Your Dataverse Once your dataverse is ready to go public, go to your dataverse page, click on the "Unpublished" button on the right hand side of the page which should indicate: -"This dataverse is Unpublished. To publish it click 'Publish dataverse' link" +"This dataverse is Unpublished. To publish it click 'Publish dataverse' link." Once you click "Publish dataverse" it +will be made public. **Important Note**: Once a dataverse is made public it can no longer be unpublished. From e302f5a01b7939911909c919b7917de058a0a8d8 Mon Sep 17 00:00:00 2001 From: sekmiller Date: Fri, 2 May 2014 16:44:57 -0400 Subject: [PATCH 03/66] Add Validation for Date, Float, Int, Url, Email, etc. Also latest citation and add create date and pub date for datafiles --- .../dataverse/DatasetFieldTypeValidator.java | 97 +++++++++++++++++-- .../edu/harvard/iq/dataverse/DatasetPage.java | 96 ++++++++++-------- .../harvard/iq/dataverse/DatasetVersion.java | 9 +- .../command/impl/CreateDatasetCommand.java | 11 ++- .../command/impl/ReleaseDatasetCommand.java | 10 +- .../command/impl/UpdateDatasetCommand.java | 10 ++ src/main/webapp/dataset.xhtml | 9 +- 7 files changed, 183 insertions(+), 59 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldTypeValidator.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldTypeValidator.java index 36581be3341..42ccce12ae8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldTypeValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldTypeValidator.java @@ -5,9 +5,16 @@ */ package edu.harvard.iq.dataverse; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Date; +import java.util.GregorianCalendar; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import org.apache.commons.lang.StringUtils; @@ -32,22 +39,100 @@ public boolean isValid(DatasetFieldValue value, ConstraintValidatorContext conte String fieldType = dsfType.getFieldType(); - if (dsfType.isRequired() && !dsfType.isControlledVocabulary() && StringUtils.isBlank(value.getValue())) { - context.buildConstraintViolationWithTemplate(dsfType.getDisplayName() + " is required.").addConstraintViolation(); - return false; + if (StringUtils.isBlank(value.getValue())) { + return true; } if (fieldType.equals("date")) { - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + boolean valid = false; + if (!valid) { + valid = isValidDate(value.getValue(), "yyyy-MM-dd"); + } + if (!valid) { + valid = isValidDate(value.getValue(), "yyyy-MM"); + } + if (!valid ) { + valid = isValidDate(value.getValue(), "yyyy"); + } + if (!valid ) { + context.buildConstraintViolationWithTemplate(" " + dsfType.getDisplayName() + " is not a valid date.").addConstraintViolation(); + return false; + } + } + + if (fieldType.equals("float")) { + try { + Double.parseDouble(value.getValue()); + } catch (Exception e) { + context.buildConstraintViolationWithTemplate(" " + dsfType.getDisplayName() + " is not a valid number.").addConstraintViolation(); + return false; + } + } + + if (fieldType.equals("int")) { try { - format.parse(value.getValue()); + Integer.parseInt(value.getValue()); } catch (Exception e) { - context.buildConstraintViolationWithTemplate(dsfType.getDisplayName() + " is not a valid date.").addConstraintViolation(); + context.buildConstraintViolationWithTemplate(" " + dsfType.getDisplayName() + " is not a valid integer.").addConstraintViolation(); return false; } + } + + if (fieldType.equals("text") && value.getValue().length() > 255) { + context.buildConstraintViolationWithTemplate(" " + dsfType.getDisplayName() + " may not be more than 255 characters.").addConstraintViolation(); + return false; + } + + if (fieldType.equals("textbox") && value.getValue().length() > 1000) { + context.buildConstraintViolationWithTemplate(" " + dsfType.getDisplayName() + " may not be more than 1000 characters.").addConstraintViolation(); + return false; + } + if (fieldType.equals("url")) { + try { + URL url = new URL(value.getValue()); + } catch (MalformedURLException e) { + context.buildConstraintViolationWithTemplate(" " + dsfType.getDisplayName() + " is not a valid URL.").addConstraintViolation(); + return false; + } + } + if (fieldType.equals("email")) { + Pattern p = Pattern.compile(".+@.+\\.[a-z]+"); + Matcher m = p.matcher(value.getValue()); + boolean matchFound = m.matches(); + if (!matchFound) { + context.buildConstraintViolationWithTemplate(" " + dsfType.getDisplayName() + " is not a valid email address.").addConstraintViolation(); + return false; + } } + return true; } + + private boolean isValidDate(String dateString, String pattern) { + boolean valid=true; + Date date; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + sdf.setLenient(false); + try { + dateString = dateString.trim(); + date = sdf.parse(dateString); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int year = calendar.get(Calendar.YEAR); + int era = calendar.get(Calendar.ERA); + if (era == GregorianCalendar.AD ) { + if ( year > 9999) { + valid=false; + } + } + }catch (ParseException e) { + valid=false; + } + if (dateString.length()>pattern.length()) { + valid=false; + } + return valid; + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 0c4f6854f44..ee30ec463ac 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -26,8 +26,8 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; -import java.util.Iterator; import java.util.List; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.EJB; @@ -44,6 +44,10 @@ import javax.json.JsonObject; import javax.json.JsonArray; import javax.json.JsonReader; +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.GetMethod; @@ -74,7 +78,7 @@ public enum DisplayMode { @EJB DataFileServiceBean datafileService; @EJB - PermissionServiceBean permissionServiceBean; + PermissionServiceBean permissionServiceBean; @EJB DataverseServiceBean dataverseService; @EJB @@ -201,44 +205,30 @@ public void init() { if (dataset.getId() != null) { // view mode for a dataset dataset = datasetService.find(dataset.getId()); if (versionId == null) { - if (canIssueUpdateCommand()){ - displayVersion = dataset.getLatestVersion(); + if (canIssueUpdateCommand()) { + displayVersion = dataset.getLatestVersion(); } else { - displayVersion = dataset.getReleasedVersion(); - } + displayVersion = dataset.getReleasedVersion(); + } } else { displayVersion = datasetVersionService.find(versionId); - } + } ownerId = dataset.getOwner().getId(); - //displayVersion.setDatasetFields(displayVersion.initDatasetFields()); if (dataset.getReleasedVersion() != null) { datasetNextMajorVersion = new Integer(dataset.getReleasedVersion().getVersionNumber().intValue() + 1).toString() + ".0"; datasetNextMinorVersion = new Integer(dataset.getReleasedVersion().getVersionNumber().intValue()).toString() + "." + new Integer(dataset.getReleasedVersion().getMinorVersionNumber().intValue() + 1).toString(); } - - - /* - if (!dataset.isReleased() || (dataset.isReleased() && displayVersion.equals(dataset.getLatestVersion()) && !displayVersion.isDraft())) { - displayCitation = dataset.getCitation(false, displayVersion); - } else if (dataset.isReleased() && displayVersion.isDraft()) { - displayCitation = dataset.getCitation(false, displayVersion.getMostRecentlyReleasedVersion()); - } else if (dataset.isReleased() && !displayVersion.equals(dataset.getLatestVersion())) { - displayCitation = dataset.getCitation(false, displayVersion.getLargestMinorRelease()); - } else { - displayCitation = ""; - } - */ - // show citation for current display version if draft note it on page + try { - datasetVersionUI = new DatasetVersionUI(displayVersion); - displayCitation = dataset.getCitation(false, displayVersion); - } catch (NullPointerException npe){ + datasetVersionUI = new DatasetVersionUI(displayVersion); + } catch (NullPointerException npe) { //This will happen when solr is down and will allow any link to be displayed. throw new RuntimeException("You do not have permission to view this dataset version."); // improve error handling } - + + displayCitation = dataset.getCitation(false, displayVersion); setVersionTabList(resetVersionTabList()); } else if (ownerId != null) { @@ -348,6 +338,26 @@ public void refresh(ActionEvent e) { } public String save() { + + // Validate + boolean dontSave = false; + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + Validator validator = factory.getValidator(); + for (DatasetField dsf : editVersion.getFlatDatasetFields()) { + for (DatasetFieldValue dsfv : dsf.getDatasetFieldValues()) { + // dsfv.setValidationMessage(null); // clear out any existing validation message + Set> constraintViolations = validator.validate(dsfv); + for (ConstraintViolation constraintViolation : constraintViolations) { + FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Validation Error", constraintViolation.getMessage())); + // dsfv.setValidationMessage(constraintViolation.getMessage()); + dontSave = true; + } + } + } + if (dontSave) { + return ""; + } + dataset.setOwner(dataverseService.find(ownerId)); //TODO get real application-wide protocol/authority dataset.setProtocol("doi"); @@ -374,7 +384,7 @@ public String save() { if (dataset.getFileSystemDirectory() != null && Files.exists(dataset.getFileSystemDirectory())) { for (DataFile dFile : newFiles) { String tempFileLocation = getFilesTempDirectory() + "/" + dFile.getFileSystemName(); - + // These are all brand new files, so they should all have // one filemetadata total. You do NOT want to use // getLatestFilemetadata() here - because it relies on @@ -382,7 +392,7 @@ public String save() { // Which may not have been persisted yet. // -- L.A. 4.0 beta. FileMetadata fileMetadata = dFile.getFileMetadatas().get(0); - String fileName = fileMetadata.getLabel(); + String fileName = fileMetadata.getLabel(); //boolean ingestedAsTabular = false; boolean metadataExtracted = false; @@ -621,7 +631,7 @@ public void handleFileUpload(FileUploadEvent event) { fmd.setDataFile(dFile); dFile.getFileMetadatas().add(fmd); - + if (editVersion.getFileMetadatas() == null) { editVersion.setFileMetadatas(new ArrayList()); } @@ -681,8 +691,8 @@ public List getVersionTabList() { public void setVersionTabList(List versionTabList) { this.versionTabList = versionTabList; } - - private boolean canIssueUpdateCommand(){ + + private boolean canIssueUpdateCommand() { try { if (permissionServiceBean.on(dataset).canIssueCommand("UpdateDatasetCommand")) { return true; @@ -694,21 +704,21 @@ private boolean canIssueUpdateCommand(){ } return false; } - + private List resetVersionTabList() { - List retList = new ArrayList(); + List retList = new ArrayList(); - if (canIssueUpdateCommand()) { - return dataset.getVersions(); - } else { - for(DatasetVersion version: dataset.getVersions()){ - if (version.isReleased()){ - retList.add(version); - } + if (canIssueUpdateCommand()) { + return dataset.getVersions(); + } else { + for (DatasetVersion version : dataset.getVersions()) { + if (version.isReleased()) { + retList.add(version); } - return retList; - } + return retList; + + } } - + } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 12d5d0699c8..309ab83a374 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -425,8 +425,13 @@ public String getCitation(boolean isOnlineVersion) { } str += " " + rootDataverseName + " Dataverse"; } - - if (this.getVersionNumber() != null) { + if (this.isDraft()){ + if (!StringUtil.isEmpty(str)) { + str += ", "; + } + str += " DRAFT VERSION "; + + } else if (this.getVersionNumber() != null) { if (!StringUtil.isEmpty(str)) { str += ", "; } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetCommand.java index d53843c81a6..15dfbb71f2e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDatasetCommand.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse.engine.command.impl; +import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetField; import edu.harvard.iq.dataverse.DataverseRole; @@ -50,11 +51,11 @@ public Dataset execute(CommandContext ctxt) throws CommandException { while (dsfItSort.hasNext()) { dsfItSort.next().setValueDisplayOrder(); } - return save(ctxt); - } - - public Dataset save(CommandContext ctxt) { - theDataset.getEditVersion().setCreateTime(new Timestamp(new Date().getTime())); + Date createDate = new Timestamp(new Date().getTime()); + theDataset.getEditVersion().setCreateTime(createDate); + for (DataFile dataFile: theDataset.getFiles() ){ + dataFile.setCreateDate(theDataset.getCreateDate()); + } Dataset savedDataset = ctxt.em().merge(theDataset); String indexingResult = ctxt.index().indexDataset(savedDataset); logger.log(Level.INFO, "during dataset save, indexing result was: {0}", indexingResult); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ReleaseDatasetCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ReleaseDatasetCommand.java index 8dc6a55dbf8..76a637478bf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ReleaseDatasetCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/ReleaseDatasetCommand.java @@ -5,6 +5,7 @@ */ package edu.harvard.iq.dataverse.engine.command.impl; +import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.DataverseUser; @@ -64,8 +65,15 @@ public Dataset execute(CommandContext ctxt) throws CommandException { } } - theDataset.getEditVersion().setReleaseTime(new Timestamp(new Date().getTime())); + Timestamp updateTime = new Timestamp(new Date().getTime()); + theDataset.getEditVersion().setReleaseTime(updateTime); theDataset.getEditVersion().setVersionState(DatasetVersion.VersionState.RELEASED); + + for (DataFile dataFile: theDataset.getFiles() ){ + if(dataFile.getPublicationDate() == null){ + dataFile.setPublicationDate(updateTime); + } + } Dataset savedDataset = ctxt.em().merge(theDataset); String indexingResult = ctxt.index().indexDataset(savedDataset); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetCommand.java index 31771d35a80..966c52c07c7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDatasetCommand.java @@ -5,6 +5,7 @@ */ package edu.harvard.iq.dataverse.engine.command.impl; +import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetField; import edu.harvard.iq.dataverse.DataverseUser; @@ -14,6 +15,8 @@ import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; import edu.harvard.iq.dataverse.engine.command.RequiredPermissionsMap; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; +import java.sql.Timestamp; +import java.util.Date; import java.util.Iterator; import java.util.logging.Logger; @@ -55,6 +58,13 @@ public Dataset save(CommandContext ctxt) { while (dsfItSort.hasNext()) { dsfItSort.next().setValueDisplayOrder(); } + Timestamp updateTime = new Timestamp(new Date().getTime()); + + for (DataFile dataFile: theDataset.getFiles() ){ + if(dataFile.getCreateDate() == null){ + dataFile.setCreateDate(updateTime); + } + } String indexingResult = ctxt.index().indexDataset(theDataset); logger.info("during dataset save, indexing result was: " + indexingResult); Dataset savedDataset = ctxt.em().merge(theDataset); diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index a0c66840f7a..e5d151f18b1 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -188,13 +188,18 @@ #{DatasetPage.displayCitation} - +
- In Draft + Unpublished - This citation will replaced "DRAFT VERSION" with V1 once it is published.
+ +
+ This citation will replace "DRAFT VERSION" with the selected version once it is published. +
+
#{DatasetPage.datasetVersionUI.description.value} From 7807843c0d8e7642ecb23df8fbb50cda71d868e1 Mon Sep 17 00:00:00 2001 From: xyang02 Date: Fri, 2 May 2014 16:59:54 -0400 Subject: [PATCH 04/66] Hided the view tab and moved up other tabs, need clean up. (#3830) --- src/main/webapp/dataverseuser.xhtml | 112 ++++++++++++++-------------- 1 file changed, 57 insertions(+), 55 deletions(-) diff --git a/src/main/webapp/dataverseuser.xhtml b/src/main/webapp/dataverseuser.xhtml index 36b1d9eaa5b..2d3be70ee38 100644 --- a/src/main/webapp/dataverseuser.xhtml +++ b/src/main/webapp/dataverseuser.xhtml @@ -24,23 +24,70 @@ + +
+ + + + +
+
+ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- -
- - - - -
-
-