diff --git a/src/main/java/Bundle.properties b/src/main/java/Bundle.properties index 23a2ff888d6..919277cc9a2 100644 --- a/src/main/java/Bundle.properties +++ b/src/main/java/Bundle.properties @@ -232,6 +232,7 @@ dataverse.delete.success=Your dataverse has been deleted. dataverse.delete.failure=This dataverse was not able to be deleted. dataverse.create.success=You have successfully created your dataverse! To learn more about what you can do with your dataverse, check out the User Guide. dataverse.create.failure=This dataverse was not able to be created. +dataverse.create.authenticatedUsersOnly=Only authenticated users can create dataverses. dataverse.update.success=You have successfully updated your dataverse! dataverse.update.failure=This dataverse was not able to be updated. @@ -596,6 +597,7 @@ dataset.cite.whyCite.tip=If you use these data, please add this citation to your dataset.cite.downloadBtn=Download Citation dataset.cite.downloadBtn.xml=EndNote XML dataset.cite.downloadBtn.ris=RIS Format +dataset.create.authenticatedUsersOnly=Only authenticated users can create datasets. dataset.deaccession.reason=Deaccession Reason: dataset.beAccessedAt=The dataset can now be accessed at: dataset.keywordDisplay.title=Keyword diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java index 8431736ff55..cbdff71f799 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java @@ -10,9 +10,11 @@ import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.GuestUser; import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.UUID; +import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.EJB; import javax.ejb.Stateless; @@ -135,16 +137,20 @@ public List findByDatasetId(Long studyId) { Sure, we don't have *studies* any more, in 4.0; it's a tribute to the past. -- L.A. */ - Query query = em.createQuery("select object(o) from DataFile as o where o.dataset.id =:studyId order by o.id"); + Query query = em.createQuery("select o from DataFile o where o.owner.id = :studyId order by o.id"); query.setParameter("studyId", studyId); return query.getResultList(); } public List findIngestsInProgress() { - Query query = em.createQuery("select object(o) from DataFile as o where o.ingestStatus =:scheduledStatusCode or o.ingestStatus =:progressStatusCode order by o.id"); - query.setParameter("scheduledStatusCode", DataFile.INGEST_STATUS_SCHEDULED); - query.setParameter("progressStatusCode", DataFile.INGEST_STATUS_INPROGRESS); - return query.getResultList(); + if ( em.isOpen() ) { + Query query = em.createQuery("select object(o) from DataFile as o where o.ingestStatus =:scheduledStatusCode or o.ingestStatus =:progressStatusCode order by o.id"); + query.setParameter("scheduledStatusCode", DataFile.INGEST_STATUS_SCHEDULED); + query.setParameter("progressStatusCode", DataFile.INGEST_STATUS_INPROGRESS); + return query.getResultList(); + } else { + return Collections.emptyList(); + } } public DataTable findDataTableByFileId(Long fileId) { @@ -181,25 +187,24 @@ public void generateStorageIdentifier(DataFile dataFile) { } public String generateStorageIdentifier() { - String storageIdentifier = null; UUID uid = UUID.randomUUID(); - logger.fine("UUID value: "+uid.toString()); + logger.log(Level.FINE, "UUID value: {0}", uid.toString()); // last 6 bytes, of the random UUID, in hex: String hexRandom = uid.toString().substring(24); - logger.fine("UUID (last 6 bytes, 12 hex digits): "+hexRandom); + logger.log(Level.FINE, "UUID (last 6 bytes, 12 hex digits): {0}", hexRandom); String hexTimestamp = Long.toHexString(new Date().getTime()); - logger.fine("(not UUID) timestamp in hex: "+hexTimestamp); + logger.log(Level.FINE, "(not UUID) timestamp in hex: {0}", hexTimestamp); - storageIdentifier = hexTimestamp + "-" + hexRandom; + String storageIdentifier = hexTimestamp + "-" + hexRandom; - logger.fine("timestamp/UUID hybrid: "+storageIdentifier); + logger.log(Level.FINE, "timestamp/UUID hybrid: {0}", storageIdentifier); return storageIdentifier; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index f6c1b2a13ae..ef6ab6ef1af 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -1,13 +1,7 @@ -/* - * 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 edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.authorization.Permission; -import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUser; import edu.harvard.iq.dataverse.authorization.providers.builtin.BuiltinUserServiceBean; import edu.harvard.iq.dataverse.authorization.users.ApiToken; import edu.harvard.iq.dataverse.authorization.users.User; @@ -1333,7 +1327,7 @@ public String save() { */ try { Long idToRemove = fmd.getId(); ///dfn.getId(); - logger.info("deleting file, filemetadata id " + idToRemove); + logger.log(Level.INFO, "deleting file, filemetadata id {0}", idToRemove); // finally, check if this file is being used as the default thumbnail // for its dataset: @@ -1390,8 +1384,13 @@ public String save() { try { if (editMode == EditMode.CREATE) { workingVersion.setLicense(DatasetVersion.License.CC0); - if(selectedTemplate != null){ - cmd = new CreateDatasetCommand(dataset, session.getUser(), false, null, selectedTemplate); + if ( selectedTemplate != null ) { + if ( session.getUser().isAuthenticated() ) { + cmd = new CreateDatasetCommand(dataset, (AuthenticatedUser) session.getUser(), false, null, selectedTemplate); + } else { + JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataset.create.authenticatedUsersOnly")); + return null; + } } else { cmd = new CreateDatasetCommand(dataset, session.getUser()); } @@ -1407,15 +1406,15 @@ public String save() { } } catch (EJBException ex) { StringBuilder error = new StringBuilder(); - error.append(ex + " "); - error.append(ex.getMessage() + " "); + error.append(ex).append(" "); + error.append(ex.getMessage()).append(" "); Throwable cause = ex; - while (cause.getCause() != null) { + while (cause.getCause()!= null) { cause = cause.getCause(); - error.append(cause + " "); - error.append(cause.getMessage() + " "); + error.append(cause).append(" "); + error.append(cause.getMessage()).append(" "); } - logger.fine("Couldn't save dataset: " + error.toString()); + logger.log(Level.FINE, "Couldn''t save dataset: {0}", error.toString()); populateDatasetUpdateFailureMessage(); return null; } catch (CommandException ex) { diff --git a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java index 3461e6e5d35..de939bcf1ca 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java @@ -1,8 +1,3 @@ -/* - * 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 edu.harvard.iq.dataverse.UserNotification.Type; @@ -514,9 +509,14 @@ public String save(String message) { //TODO change to Create - for now the page is expecting INFO instead. Boolean create; if (dataverse.getId() == null) { - dataverse.setOwner(ownerId != null ? dataverseService.find(ownerId) : null); - create = Boolean.TRUE; - cmd = new CreateDataverseCommand(dataverse, session.getUser(), facets.getTarget(), listDFTIL); + if ( session.getUser().isAuthenticated() ) { + dataverse.setOwner(ownerId != null ? dataverseService.find(ownerId) : null); + create = Boolean.TRUE; + cmd = new CreateDataverseCommand(dataverse, (AuthenticatedUser) session.getUser(), facets.getTarget(), listDFTIL); + } else { + JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize("dataverse.create.authenticatedUsersOnly")); + return null; + } } else { create=Boolean.FALSE; cmd = new UpdateDataverseCommand(dataverse, facets.getTarget(), featuredDataverses.getTarget(), session.getUser(), listDFTIL); diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObject.java b/src/main/java/edu/harvard/iq/dataverse/DvObject.java index 691edbff833..f504203d1cb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObject.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObject.java @@ -50,7 +50,7 @@ public String visit(DataFile df) { private Long id; @ManyToOne(cascade = CascadeType.MERGE) - private DvObjectContainer owner; + private DvObject owner; private Timestamp publicationDate; @@ -85,6 +85,7 @@ public Timestamp getModificationTime() { /** * modificationTime is used for comparison with indexTime so we know if the * Solr index is stale. + * @param modificationTime */ public void setModificationTime(Timestamp modificationTime) { this.modificationTime = modificationTime; @@ -97,6 +98,7 @@ public Timestamp getIndexTime() { /** * indexTime is used for comparison with modificationTime so we know if the * Solr index is stale. + * @param indexTime */ public void setIndexTime(Timestamp indexTime) { this.indexTime = indexTime; @@ -123,7 +125,7 @@ protected void setOwner(DvObjectContainer newOwner) { } public DvObjectContainer getOwner() { - return owner; + return (DvObjectContainer)owner; } public Long getId() { diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java b/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java index 9e4a032df61..e40eb1c2a3a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java @@ -1,13 +1,13 @@ package edu.harvard.iq.dataverse; -import javax.persistence.Entity; +import javax.persistence.MappedSuperclass; /** * A {@link DvObject} that can contain other {@link DvObject}s. * * @author michael */ -@Entity +@MappedSuperclass public abstract class DvObjectContainer extends DvObject { public void setOwner(Dataverse owner) { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/BatchImport.java b/src/main/java/edu/harvard/iq/dataverse/api/BatchImport.java index 286f87b75f3..a955d437c0d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/BatchImport.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/BatchImport.java @@ -8,13 +8,12 @@ import edu.harvard.iq.dataverse.api.imports.ImportException; import edu.harvard.iq.dataverse.api.imports.ImportUtil.ImportType; +import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import edu.harvard.iq.dataverse.util.ImportLogger; import java.io.IOException; import javax.ejb.EJB; import javax.ejb.Stateless; -import javax.inject.Inject; import javax.json.JsonObjectBuilder; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -107,7 +106,7 @@ public Response getImport(@QueryParam("path") String fileDir, @QueryParam("ident private Response startBatchJob( String fileDir, String parentIdtf, String apiKey, ImportType importType) { - User u = findUserByApiToken(apiKey); + AuthenticatedUser u = findUserByApiToken(apiKey); if (u == null) { return badApiKey(apiKey); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java index 916e66886e0..9560762725d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java @@ -1,18 +1,12 @@ -/* - * 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.api; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.DataverseServiceBean; import edu.harvard.iq.dataverse.api.imports.ImportException; import edu.harvard.iq.dataverse.api.imports.ImportUtil; -import edu.harvard.iq.dataverse.authorization.users.User; +import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.util.ImportLogger; import java.io.File; -import java.io.IOException; import javax.ejb.Asynchronous; import javax.ejb.EJB; import javax.ejb.Stateless; @@ -35,7 +29,7 @@ public class BatchServiceBean { ImportLogger importLogger; @Asynchronous - public void processFilePath(String fileDir, String parentIdtf, User u, Dataverse owner, ImportUtil.ImportType importType) throws ImportException { + public void processFilePath(String fileDir, String parentIdtf, AuthenticatedUser u, Dataverse owner, ImportUtil.ImportType importType) throws ImportException { importLogger.getLogger().info("BEGIN IMPORT"); JsonArrayBuilder status = Json.createArrayBuilder(); @@ -59,7 +53,7 @@ public void processFilePath(String fileDir, String parentIdtf, User u, Dataverse } - public JsonArrayBuilder handleDirectory(User u, File dir, ImportUtil.ImportType importType) throws ImportException{ + public JsonArrayBuilder handleDirectory(AuthenticatedUser u, File dir, ImportUtil.ImportType importType) throws ImportException{ JsonArrayBuilder status = Json.createArrayBuilder(); Dataverse owner = dataverseService.findByAlias(dir.getName()); if (owner == null) { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java index 85987baa936..416fdc638e4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -118,7 +118,7 @@ public Response addDataverse( String body, @PathParam("identifier") String paren dc.setDataverse(d); } - User u = findUserOrDie( apiKey ); + AuthenticatedUser u = findUserOrDie( apiKey ); d = execCommand( new CreateDataverseCommand(d, u, null, null), "Creating Dataverse" ); return createdResponse( "/dvs/"+d.getAlias(), json(d) ); } catch ( WrappedResponse ww ) { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/ImportServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/ImportServiceBean.java index 6a3508e502e..18c05ef7f3d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/ImportServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/ImportServiceBean.java @@ -23,6 +23,7 @@ import edu.harvard.iq.dataverse.api.imports.ImportDDI; import edu.harvard.iq.dataverse.api.imports.ImportException; import edu.harvard.iq.dataverse.api.imports.ImportUtil.ImportType; +import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.impl.CreateDatasetCommand; @@ -60,69 +61,67 @@ */ @Stateless public class ImportServiceBean { -@EJB - protected EjbDataverseEngine engineSvc; - @EJB + + @EJB + protected EjbDataverseEngine engineSvc; + @EJB DatasetServiceBean datasetService; @EJB DataverseServiceBean dataverseService; @EJB DatasetFieldServiceBean datasetfieldService; - + @EJB MetadataBlockServiceBean metadataBlockService; @EJB - SettingsServiceBean settingsService; - @EJB ImportLogger importLogger; + SettingsServiceBean settingsService; + @EJB + ImportLogger importLogger; @TransactionAttribute(REQUIRES_NEW) - public Dataverse createDataverse(File dir, User u) throws ImportException { - Dataverse d = new Dataverse(); - Dataverse root = dataverseService.findByAlias("root"); - d.setOwner(root); - d.setAlias(dir.getName()); - d.setName(dir.getName()); - d.setAffiliation("affiliation"); - d.setPermissionRoot(false); - d.setDescription("description"); - d.setDataverseType(Dataverse.DataverseType.RESEARCHERS); - DataverseContact dc = new DataverseContact(); - dc.setContactEmail("pete@mailinator.com"); - ArrayList dcList = new ArrayList<>(); - dcList.add(dc); - d.setDataverseContacts(dcList); - try { - d = engineSvc.submit(new CreateDataverseCommand(d, u, null, null)); - } catch (EJBException ex) { - Throwable cause = ex; - StringBuilder sb = new StringBuilder(); - sb.append("Error creating dataverse."); - while (cause.getCause() != null) { - cause = cause.getCause(); - if (cause instanceof ConstraintViolationException) { - ConstraintViolationException constraintViolationException = (ConstraintViolationException) cause; - for (ConstraintViolation violation : constraintViolationException.getConstraintViolations()) { - sb.append(" Invalid value: <<<").append(violation.getInvalidValue()).append(">>> for ").append(violation.getPropertyPath()).append(" at ").append(violation.getLeafBean()).append(" - ").append(violation.getMessage()); - } - } + public Dataverse createDataverse(File dir, AuthenticatedUser u) throws ImportException { + Dataverse d = new Dataverse(); + Dataverse root = dataverseService.findByAlias("root"); + d.setOwner(root); + d.setAlias(dir.getName()); + d.setName(dir.getName()); + d.setAffiliation("affiliation"); + d.setPermissionRoot(false); + d.setDescription("description"); + d.setDataverseType(Dataverse.DataverseType.RESEARCHERS); + DataverseContact dc = new DataverseContact(); + dc.setContactEmail("pete@mailinator.com"); + ArrayList dcList = new ArrayList<>(); + dcList.add(dc); + d.setDataverseContacts(dcList); + try { + d = engineSvc.submit(new CreateDataverseCommand(d, u, null, null)); + } catch (EJBException ex) { + Throwable cause = ex; + StringBuilder sb = new StringBuilder(); + sb.append("Error creating dataverse."); + while (cause.getCause() != null) { + cause = cause.getCause(); + if (cause instanceof ConstraintViolationException) { + ConstraintViolationException constraintViolationException = (ConstraintViolationException) cause; + for (ConstraintViolation violation : constraintViolationException.getConstraintViolations()) { + sb.append(" Invalid value: <<<").append(violation.getInvalidValue()).append(">>> for ").append(violation.getPropertyPath()).append(" at ").append(violation.getLeafBean()).append(" - ").append(violation.getMessage()); } - importLogger.getLogger().log(Level.SEVERE, sb.toString()); - System.out.println("Error creating dataverse: " + sb.toString()); - throw new ImportException(sb.toString()); - } catch (Exception e) { - throw new ImportException(e.getMessage()); } - return d; - - } - - - - - + } + importLogger.getLogger().log(Level.SEVERE, sb.toString()); + System.out.println("Error creating dataverse: " + sb.toString()); + throw new ImportException(sb.toString()); + } catch (Exception e) { + throw new ImportException(e.getMessage()); + } + return d; + + } + @TransactionAttribute(REQUIRES_NEW) public JsonObjectBuilder handleFile(User u, Dataverse owner, File file, ImportType importType) throws ImportException { - + System.out.println("handling file: " + file.getAbsolutePath()); String ddiXMLToParse; try { @@ -132,25 +131,26 @@ public JsonObjectBuilder handleFile(User u, Dataverse owner, File file, ImportTy importLogger.getLogger().info("completed doImport " + file.getParentFile().getName() + "/" + file.getName()); return status; } catch (ImportException ex) { - importLogger.getLogger().info("Import Exception processing file " + file.getParentFile().getName() + "/" + file.getName() + ", msg:" + ex.getMessage()); + importLogger.getLogger().info("Import Exception processing file " + file.getParentFile().getName() + "/" + file.getName() + ", msg:" + ex.getMessage()); return Json.createObjectBuilder().add("message", "Import Exception processing file " + file.getParentFile().getName() + "/" + file.getName() + ", msg:" + ex.getMessage()); } catch (Exception e) { - String msg = "Unexpected Error in handleFile(), file:" + file.getParentFile().getName() + "/" + file.getName(); - importLogger.getLogger().log(Level.SEVERE,msg, e); + String msg = "Unexpected Error in handleFile(), file:" + file.getParentFile().getName() + "/" + file.getName(); + importLogger.getLogger().log(Level.SEVERE, msg, e); throw new ImportException("Unexpected Error in handleFile(), file:" + file.getParentFile().getName() + "/" + file.getName(), e); } } - public JsonObjectBuilder doImport(User u, Dataverse owner, String xmlToParse, ImportType importType) throws ImportException { - + + public JsonObjectBuilder doImport(User u, Dataverse owner, String xmlToParse, ImportType importType) throws ImportException { + String status = ""; Long createdId = null; DatasetDTO dsDTO = null; - try { + try { ImportDDI importDDI = new ImportDDI(importType); dsDTO = importDDI.doImport(xmlToParse); } catch (XMLStreamException e) { - throw new ImportException("XMLStreamException" + e); + throw new ImportException("XMLStreamException" + e); } // convert DTO to Json, Gson gson = new GsonBuilder().setPrettyPrinting().create(); @@ -162,7 +162,7 @@ public JsonObjectBuilder doImport(User u, Dataverse owner, String xmlToParse, Im JsonParser parser = new JsonParser(datasetfieldService, metadataBlockService, settingsService); parser.setLenient(!importType.equals(ImportType.NEW)); Dataset ds = parser.parseDataset(obj); - + // For ImportType.NEW, if the user supplies a global identifier, and it's not a protocol // we support, it will be rejected. if (importType.equals(ImportType.NEW)) { @@ -170,7 +170,7 @@ public JsonObjectBuilder doImport(User u, Dataverse owner, String xmlToParse, Im throw new ImportException("Could not register id " + ds.getGlobalId() + ", protocol not supported"); } } - + ds.setOwner(owner); ds.getLatestVersion().setDatasetFields(ds.getLatestVersion().initDatasetFields()); @@ -188,16 +188,16 @@ public JsonObjectBuilder doImport(User u, Dataverse owner, String xmlToParse, Im // if required values are missing. String errMsg = "Error importing data:"; for (ConstraintViolation v : violations) { - errMsg+=" "+v.getMessage(); + errMsg += " " + v.getMessage(); } throw new ImportException(errMsg); } } - + // Check data against validation constraints // If we are migrating and dataset contact email is invalid, then set it to NA Set invalidViolations = ds.getVersions().get(0).validate(); - if( !invalidViolations.isEmpty()) { + if (!invalidViolations.isEmpty()) { if (importType.equals(ImportType.MIGRATION)) { for (ConstraintViolation v : invalidViolations) { DatasetFieldValue f = ((DatasetFieldValue) v.getRootBean()); @@ -205,21 +205,21 @@ public JsonObjectBuilder doImport(User u, Dataverse owner, String xmlToParse, Im f.setValue(DatasetField.NA_VALUE); } } - } + } } - + Dataset existingDs = datasetService.findByGlobalId(ds.getGlobalId()); if (existingDs != null) { if (importType.equals(ImportType.HARVEST)) { // For harvested datasets, there should always only be one version. // We will replace the current version with the imported version. - if (existingDs.getVersions().size()!=1) { - throw new ImportException("Error importing Harvested Dataset, existing dataset has "+ existingDs.getVersions().size() + " versions"); + if (existingDs.getVersions().size() != 1) { + throw new ImportException("Error importing Harvested Dataset, existing dataset has " + existingDs.getVersions().size() + " versions"); } - engineSvc.submit(new DestroyDatasetCommand(existingDs,u)); + engineSvc.submit(new DestroyDatasetCommand(existingDs, u)); Dataset managedDs = engineSvc.submit(new CreateDatasetCommand(ds, u, false, importType)); - status = " updated dataset, id=" + managedDs.getId() + "."; + status = " updated dataset, id=" + managedDs.getId() + "."; } else { // If we are adding a new version to an existing dataset, // check that the version number isn't already in the dataset @@ -228,11 +228,11 @@ public JsonObjectBuilder doImport(User u, Dataverse owner, String xmlToParse, Im throw new ImportException("VersionNumber " + ds.getLatestVersion().getVersionNumber() + " already exists in dataset " + existingDs.getGlobalId()); } } - DatasetVersion dsv = engineSvc.submit(new CreateDatasetVersionCommand(u, existingDs, ds.getVersions().get(0))); - status = " created datasetVersion, id=" + dsv.getId() + "."; - createdId = dsv.getId(); + DatasetVersion dsv = engineSvc.submit(new CreateDatasetVersionCommand(u, existingDs, ds.getVersions().get(0))); + status = " created datasetVersion, id=" + dsv.getId() + "."; + createdId = dsv.getId(); } - + } else { Dataset managedDs = engineSvc.submit(new CreateDatasetCommand(ds, u, false, importType)); status = " created dataset, id=" + managedDs.getId() + "."; @@ -240,18 +240,17 @@ public JsonObjectBuilder doImport(User u, Dataverse owner, String xmlToParse, Im } } catch (JsonParseException ex) { - - importLogger.getLogger().info("Error parsing datasetVersion: " + ex.getMessage()); + + importLogger.getLogger().info("Error parsing datasetVersion: " + ex.getMessage()); throw new ImportException("Error parsing datasetVersion: " + ex.getMessage(), ex); - } catch(CommandException ex) { - importLogger.getLogger().info("Error excuting Create dataset command: " + ex.getMessage()); + } catch (CommandException ex) { + importLogger.getLogger().info("Error excuting Create dataset command: " + ex.getMessage()); throw new ImportException("Error excuting dataverse command: " + ex.getMessage(), ex); } return Json.createObjectBuilder().add("message", status).add("id", createdId); - } - private static class MyCustomFormatter extends Formatter { + } - + private static class MyCustomFormatter extends Formatter { @Override @@ -271,8 +270,6 @@ public String format(LogRecord record) { } - - } } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUser.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUser.java index d15e0b7a8a0..fee91effbe9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUser.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUser.java @@ -2,7 +2,6 @@ import edu.harvard.iq.dataverse.ValidateEmail; import edu.harvard.iq.dataverse.authorization.AuthenticatedUserDisplayInfo; -import edu.harvard.iq.dataverse.authorization.RoleAssigneeDisplayInfo; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; @@ -13,7 +12,6 @@ import javax.persistence.NamedQuery; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; -import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.NotBlank; /** @@ -45,19 +43,6 @@ public class BuiltinUser implements Serializable { @Column( unique = true ) private String userName; - /** - * @todo Why are we storing email both here *and* in the authenticateduser - * table? Is this a holdover from when this was the only user table? Yes, it - * probably is. Here are places in the system that rely on the email address - * being in this table: - * - * - password reset - * - * If this field is kept (probably shouldn't be) at least add a uniqueness - * constraint per https://github.com/IQSS/dataverse/issues/845 - * @NotNull - * @Column(nullable = false, unique=true) - */ @NotBlank(message = "Please enter a valid email address.") @ValidateEmail(message = "Please enter a valid email address.") private String email; 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 0f3a96b438d..7e341273b45 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 @@ -11,6 +11,7 @@ import edu.harvard.iq.dataverse.api.imports.ImportUtil; import edu.harvard.iq.dataverse.api.imports.ImportUtil.ImportType; import edu.harvard.iq.dataverse.authorization.Permission; +import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; import edu.harvard.iq.dataverse.engine.command.AbstractCommand; import edu.harvard.iq.dataverse.engine.command.CommandContext; @@ -68,7 +69,7 @@ public CreateDatasetCommand(Dataset theDataset, User user, boolean registrationR this.template=null; } - public CreateDatasetCommand(Dataset theDataset, User user, boolean registrationRequired, ImportUtil.ImportType importType, Template template) { + public CreateDatasetCommand(Dataset theDataset, AuthenticatedUser user, boolean registrationRequired, ImportUtil.ImportType importType, Template template) { super(user, theDataset.getOwner()); this.theDataset = theDataset; this.registrationRequired = registrationRequired; @@ -79,7 +80,6 @@ public CreateDatasetCommand(Dataset theDataset, User user, boolean registrationR @Override public Dataset execute(CommandContext ctxt) throws CommandException { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-hh.mm.ss"); - logger.log(Level.INFO, "start " + formatter.format(new Date().getTime())); if ( importType!=ImportType.MIGRATION && !ctxt.datasets().isUniqueIdentifier(theDataset.getIdentifier(), theDataset.getProtocol(), theDataset.getAuthority(), theDataset.getDoiSeparator()) ) { throw new IllegalCommandException(String.format("Dataset with identifier '%s', protocol '%s' and authority '%s' already exists", @@ -102,10 +102,8 @@ public Dataset execute(CommandContext ctxt) throws CommandException { throw new IllegalCommandException(validationFailedString, this); } - logger.log(Level.INFO, "after validation " + formatter.format(new Date().getTime())); - // FIXME - need to revisit this. Either - // theDataset.setCreator(getUser()); - // if, at all, we decide to keep it. + logger.log(Level.INFO, "after validation " + formatter.format(new Date().getTime())); // TODO remove + theDataset.setCreator((AuthenticatedUser) getUser()); theDataset.setCreateDate(new Timestamp(new Date().getTime())); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommand.java index 5073590c65e..02725db9a39 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommand.java @@ -6,7 +6,7 @@ import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.RoleAssignment; import edu.harvard.iq.dataverse.authorization.Permission; -import edu.harvard.iq.dataverse.authorization.users.User; +import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.engine.command.AbstractCommand; import edu.harvard.iq.dataverse.engine.command.CommandContext; import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; @@ -31,7 +31,7 @@ public class CreateDataverseCommand extends AbstractCommand { private final List facetList; public CreateDataverseCommand(Dataverse created, - User aUser, List facetList, List inputLevelList) { + AuthenticatedUser aUser, List facetList, List inputLevelList) { super(aUser, created.getOwner()); this.created = created; if (facetList != null) { @@ -60,8 +60,7 @@ public Dataverse execute(CommandContext ctxt) throws CommandException { } if (created.getCreator() == null) { - // FIXME Is the "creator" concept being carried over from 3.x? -// created.setCreator(getUser()); + created.setCreator((AuthenticatedUser) getUser()); } if (created.getDataverseType() == null) { diff --git a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java index 9abe5d03ce7..78a146ed4e2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/ingest/IngestServiceBean.java @@ -118,6 +118,7 @@ import java.util.zip.ZipException; import java.util.zip.ZipInputStream; import javax.annotation.PostConstruct; +import javax.ejb.EJBException; import javax.ejb.Singleton; import javax.ejb.Startup; import org.apache.commons.io.FileUtils; @@ -180,27 +181,31 @@ public class IngestServiceBean { @PostConstruct public void init() { logger.info("Initializing the Ingest Service."); - List ingestsInProgress = fileService.findIngestsInProgress(); - if (ingestsInProgress != null && ingestsInProgress.size() > 0) { - logger.info("Ingest Service: " + ingestsInProgress.size()+" files are in the queue."); - // go through the queue, remove the "ingest in progress" flags and the - // any dataset locks found: - Iterator dfit = ingestsInProgress.iterator(); - while (dfit.hasNext()) { - DataFile datafile = (DataFile)dfit.next(); - logger.info("Ingest Service: removing ingest-in-progress status on datafile "+datafile.getId()); - datafile.setIngestDone(); - datafile = fileService.save(datafile); - - if (datafile.getOwner() != null && datafile.getOwner().isLocked()) { - if (datafile.getOwner().getId() != null) { - logger.fine("Ingest Servioce: removing lock on dataset "+datafile.getOwner().getId()); - datasetService.removeDatasetLock(datafile.getOwner().getId()); + try { + List ingestsInProgress = fileService.findIngestsInProgress(); + if (ingestsInProgress != null && ingestsInProgress.size() > 0) { + logger.log(Level.INFO, "Ingest Service: {0} files are in the queue.", ingestsInProgress.size()); + // go through the queue, remove the "ingest in progress" flags and the + // any dataset locks found: + Iterator dfit = ingestsInProgress.iterator(); + while (dfit.hasNext()) { + DataFile datafile = (DataFile)dfit.next(); + logger.log(Level.INFO, "Ingest Service: removing ingest-in-progress status on datafile {0}", datafile.getId()); + datafile.setIngestDone(); + datafile = fileService.save(datafile); + + if (datafile.getOwner() != null && datafile.getOwner().isLocked()) { + if (datafile.getOwner().getId() != null) { + logger.log(Level.FINE, "Ingest Servioce: removing lock on dataset {0}", datafile.getOwner().getId()); + datasetService.removeDatasetLock(datafile.getOwner().getId()); + } } } + } else { + logger.info("Ingest Service: zero files in the ingest queue."); } - } else { - logger.info("Ingest Service: zero files in the ingest queue."); + } catch ( EJBException ex ) { + logger.log(Level.WARNING, "Error initing the IngestServiceBean: {0}", ex.getMessage()); } }