diff --git a/src/main/java/edu/harvard/iq/dataverse/ConfigureFragmentBean.java b/src/main/java/edu/harvard/iq/dataverse/ConfigureFragmentBean.java index ff67c2c620c..86453194737 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ConfigureFragmentBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/ConfigureFragmentBean.java @@ -28,7 +28,7 @@ @ViewScoped @Named -public class ConfigureFragmentBean implements java.io.Serializable{ +public class ConfigureFragmentBean implements java.io.Serializable { private static final Logger logger = Logger.getLogger(ConfigureFragmentBean.class.getName()); @@ -63,11 +63,11 @@ public ExternalTool getConfigurePopupTool() { } public ExternalToolHandler getConfigurePopupToolHandler() { - if(fileId == null) { + if (fileId == null) { //on first UI load, method is called before fileId is set. There may be a better way to handle this return null; } - if(toolHandler != null) { + if (toolHandler != null) { return toolHandler; } @@ -84,8 +84,7 @@ public ExternalToolHandler getConfigurePopupToolHandler() { return toolHandler; } - public void setConfigureFileId(Long setFileId) - { + public void setConfigureFileId(Long setFileId) { fileId = setFileId; } } diff --git a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java index 1b1eb6460f6..13d8d1d4da3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/ControlledVocabularyValue.java @@ -64,9 +64,9 @@ public void setId(Long id) { public String getStrValue() { return strValue; } + public void setStrValue(String strValue) { this.strValue = strValue; - } private String identifier; @@ -78,20 +78,24 @@ public String getIdentifier() { public void setIdentifier(String identifier) { this.identifier = identifier; } - - - + private int displayOrder; - public int getDisplayOrder() { return this.displayOrder;} - public void setDisplayOrder(int displayOrder) {this.displayOrder = displayOrder;} - - + + public int getDisplayOrder() { + return this.displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + @ManyToOne // @JoinColumn( nullable = false ) TODO this breaks for the N/A value. need to create an N/A type for that value. private DatasetFieldType datasetFieldType; public DatasetFieldType getDatasetFieldType() { return datasetFieldType; } + public void setDatasetFieldType(DatasetFieldType datasetFieldType) { this.datasetFieldType = datasetFieldType; } @@ -107,7 +111,6 @@ public void setControlledVocabAlternates(Collection co this.controlledVocabAlternates = controlledVocabAlternates; } - @Override public int hashCode() { int hash = 0; @@ -128,5 +131,5 @@ public boolean equals(Object object) { public String toString() { return "edu.harvard.iq.dataverse.ControlledVocabularyValue[ id=" + id + " ]"; } - + } diff --git a/src/main/java/edu/harvard/iq/dataverse/DataCitation.java b/src/main/java/edu/harvard/iq/dataverse/DataCitation.java index 7b586df9323..45aab6bbad3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataCitation.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataCitation.java @@ -69,7 +69,6 @@ public DataCitation(DatasetVersion dsv) { this(dsv, false); } - public DataCitation(DatasetVersion dsv, boolean direct) { this.direct = direct; getCommonValuesFrom(dsv); @@ -196,7 +195,7 @@ public String toString(boolean html) { } if (persistentId != null) { - // always show url format + // always show url format citationList.add(formatURL(persistentId.toURL().toString(), persistentId.toURL().toString(), html)); } citationList.add(formatString(publisher, html)); @@ -596,13 +595,13 @@ private void createEndNoteXML(XMLStreamWriter xmlw) throws XMLStreamException { } - public Map getDataCiteMetadata() { + public Map getDataCiteMetadata() { Map metadata = new HashMap<>(); String authorString = getAuthorsString(); if (authorString.isEmpty()) { authorString = ":unav"; - } + } String producerString = getPublisher(); if (producerString.isEmpty()) { @@ -614,10 +613,9 @@ public Map getDataCiteMetadata() { metadata.put("datacite.publisher", producerString); metadata.put("datacite.publicationyear", getYear()); return metadata; - } + } - - // helper methods + // helper methods private String formatString(String value, boolean escapeHtml) { return formatString(value, escapeHtml, ""); } diff --git a/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java b/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java index a8ddc3b06e9..2bb89edf673 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataCiteRESTfullClient.java @@ -222,25 +222,24 @@ public String inactiveDataset(String doi) { public static void main(String[] args) throws Exception { String doi = "10.5072/DVN/274533"; DataCiteRESTfullClient client = new DataCiteRESTfullClient("https://mds.test.datacite.org", "DATACITE.HARVARD", "DVNapitest"); -// System.out.println(client.getUrl(doi)); -// System.out.println(client.getMetadata(doi)); -// System.out.println(client.postMetadata(readAndClose("C:/Users/luopc/Desktop/datacite.xml", "utf-8"))); -// System.out.println(client.postUrl("10.5072/000000001", "http://opendata.pku.edu.cn/dvn/dv/DAIM/faces/study/StudyPage.xhtml?globalId=hdl:TEST/10027&studyListingIndex=1_1acc4e9f23fa10b3cc0500d9eb5e")); -// client.close(); -// String doi2 = "10.1/1.0003"; -// SimpleRESTfullClient client2 = new SimpleRESTfullClient("https://162.105.140.119:8443/mds", "PKULIB.IR", "luopengcheng","localhost.keystore"); -// System.out.println(client2.getUrl("10.1/1.0002")); -// System.out.println(client2.getUrl("10.1/1.0002")); -// System.out.println(client2.getMetadata(doi2)); -// client2.postUrl("10.1/1.0003", "http://ir.pku.edu.cn"); -// System.out.println(client2.postUrl("10.1/1.0008", "http://ir.pku.edu.cn")); -// System.out.println(client2.postMetadata(FileUtil.loadAsString(new File("C:/Users/luopc/Desktop/test/datacite-example-ResourceTypeGeneral_Collection-v3.0.xml"), "utf-8"))); -// System.out.println(client2.getMetadata("10.1/1.0007")); -// System.out.println(client2.inactiveDataSet("10.1/1.0007")); -// client2.close(); -} +// System.out.println(client.getUrl(doi)); +// System.out.println(client.getMetadata(doi)); +// System.out.println(client.postMetadata(readAndClose("C:/Users/luopc/Desktop/datacite.xml", "utf-8"))); +// System.out.println(client.postUrl("10.5072/000000001", "http://opendata.pku.edu.cn/dvn/dv/DAIM/faces/study/StudyPage.xhtml?globalId=hdl:TEST/10027&studyListingIndex=1_1acc4e9f23fa10b3cc0500d9eb5e")); +// client.close(); +// String doi2 = "10.1/1.0003"; +// SimpleRESTfullClient client2 = new SimpleRESTfullClient("https://162.105.140.119:8443/mds", "PKULIB.IR", "luopengcheng","localhost.keystore"); +// System.out.println(client2.getUrl("10.1/1.0002")); +// System.out.println(client2.getUrl("10.1/1.0002")); +// System.out.println(client2.getMetadata(doi2)); +// client2.postUrl("10.1/1.0003", "http://ir.pku.edu.cn"); +// System.out.println(client2.postUrl("10.1/1.0008", "http://ir.pku.edu.cn")); +// System.out.println(client2.postMetadata(FileUtil.loadAsString(new File("C:/Users/luopc/Desktop/test/datacite-example-ResourceTypeGeneral_Collection-v3.0.xml"), "utf-8"))); +// System.out.println(client2.getMetadata("10.1/1.0007")); +// System.out.println(client2.inactiveDataSet("10.1/1.0007")); +// client2.close(); + } - // private static String readAndClose(String file, String encoding) throws IOException{ // BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),encoding)); // StringBuilder str = new StringBuilder(); diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 02061e4ecfe..3a5d2c4a3c9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -54,16 +54,18 @@ * @author gdurand */ @NamedQueries({ - @NamedQuery( name="DataFile.removeFromDatasetVersion", - query="DELETE FROM FileMetadata f WHERE f.datasetVersion.id=:versionId and f.dataFile.id=:fileId"), - @NamedQuery(name="DataFile.findDataFileByIdProtocolAuth", - query="SELECT s FROM DataFile s WHERE s.identifier=:identifier AND s.protocol=:protocol AND s.authority=:authority") + @NamedQuery(name="DataFile.removeFromDatasetVersion", + query="DELETE FROM FileMetadata f WHERE f.datasetVersion.id=:versionId and f.dataFile.id=:fileId"), + @NamedQuery(name="DataFile.findDataFileByIdProtocolAuth", + query="SELECT s FROM DataFile s WHERE s.identifier=:identifier AND s.protocol=:protocol AND s.authority=:authority") }) @Entity -@Table(indexes = {@Index(columnList="ingeststatus") - , @Index(columnList="checksumvalue") - , @Index(columnList="contenttype") - , @Index(columnList="restricted")}) +@Table(indexes = { + @Index(columnList="ingeststatus"), + @Index(columnList="checksumvalue"), + @Index(columnList="contenttype"), + @Index(columnList="restricted") +}) public class DataFile extends DvObject implements Comparable { private static final Logger logger = Logger.getLogger(DatasetPage.class.getCanonicalName()); private static final long serialVersionUID = 1L; @@ -80,7 +82,6 @@ public class DataFile extends DvObject implements Comparable { @Column( nullable = false ) @Pattern(regexp = "^.*/.*$", message = "{contenttype.slash}") private String contentType; - // @Expose // @SerializedName("storageIdentifier") @@ -141,7 +142,6 @@ public String toString() { @Column(nullable = false) private String checksumValue; - /* start: FILE REPLACE ATTRIBUTES */ // For the initial version of a file, this will be equivalent to the ID @@ -160,9 +160,7 @@ public String toString() { @Column(nullable=true) private Long previousDataFileId; /* endt: FILE REPLACE ATTRIBUTES */ - - - + @Expose @Column(nullable=true) private Long filesize; // Number of bytes in file. Allows 0 and null, negative numbers not permitted @@ -225,8 +223,7 @@ public DataFile(String contentType) { this.fileMetadatas = new ArrayList<>(); initFileReplaceAttributes(); } - - + /** * All constructors should use this method * to initialize this file replace attributes @@ -301,6 +298,7 @@ public JsonArrayBuilder getTagLabelsAsJsonArrayBuilder(){ } return builder; } + public void setTags(List dataFileTags) { this.dataFileTags = dataFileTags; } @@ -633,7 +631,6 @@ public String getUnf() { } return null; } - @ManyToMany @JoinTable(name = "fileaccessrequests", @@ -701,12 +698,12 @@ protected String toStringExtras() { FileMetadata fmd = getLatestFileMetadata(); return "label:" + (fmd!=null? fmd.getLabel() : "[no metadata]"); } - - @Override - public T accept( Visitor v ) { - return v.visit(this); - } - + + @Override + public T accept( Visitor v ) { + return v.visit(this); + } + @Override public String getDisplayName() { return getLatestFileMetadata().getLabel(); @@ -734,7 +731,6 @@ public boolean hasGeospatialTag(){ return false; } - /** * Set rootDataFileId * @param rootDataFileId @@ -792,9 +788,7 @@ public String toJSON(){ return serializeAsJSON(false); } - - - + public JsonObject asGsonObject(boolean prettyPrint){ String overarchingKey = "data"; @@ -876,7 +870,6 @@ public JsonObject asGsonObject(boolean prettyPrint){ jsonObj.getAsJsonObject().add("checksum", checkSumJSONMap); return jsonObj.getAsJsonObject(); - } /** @@ -890,7 +883,6 @@ private String serializeAsJSON(boolean prettyPrint){ //return fullFileJSON. return fullFileJSON.toString(); - } public String getPublicationDateFormattedYYYYMMDD() { @@ -906,8 +898,6 @@ public String getCreateDateFormattedYYYYMMDD() { } return null; } - - } // end of class diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java index 08846ffc1e4..31b49ccb567 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFileServiceBean.java @@ -978,10 +978,10 @@ public Boolean isPreviouslyPublished(Long fileId){ return (retList.size() > 1); } - public void deleteFromVersion( DatasetVersion d, DataFile f ) { - em.createNamedQuery("DataFile.removeFromDatasetVersion") - .setParameter("versionId", d.getId()).setParameter("fileId", f.getId()) - .executeUpdate(); + public void deleteFromVersion(DatasetVersion d, DataFile f) { + em.createNamedQuery("DataFile.removeFromDatasetVersion") + .setParameter("versionId", d.getId()).setParameter("fileId", f.getId()) + .executeUpdate(); } /* @@ -1357,12 +1357,11 @@ public boolean isFileClassPackage (DataFile file) { return MIME_TYPE_PACKAGE_FILE.equalsIgnoreCase(contentType); } - + public void populateFileSearchCard(SolrSearchResult solrSearchResult) { solrSearchResult.setEntity(this.findCheapAndEasy(solrSearchResult.getEntityId())); } - - + /** * Does this file have a replacement. * Any file should have AT MOST 1 replacement @@ -1389,19 +1388,15 @@ public boolean hasReplacement(DataFile df) throws Exception{ return false; } - if (!df.isReleased()){ + if (!df.isReleased()){ // An unpublished SHOULD NOT have a replacment String errMsg = "DataFile with id: [" + df.getId() + "] is UNPUBLISHED with a REPLACEMENT. This should NOT happen."; logger.severe(errMsg); throw new Exception(errMsg); - } - - - - else if (dataFiles.size() == 1){ + } else if (dataFiles.size() == 1) { return true; - }else{ + } else { String errMsg = "DataFile with id: [" + df.getId() + "] has more than one replacment!"; logger.severe(errMsg); @@ -1465,7 +1460,7 @@ public String generateDataFileIdentifier(DataFile datafile, GlobalIdServiceBean prepend = datafile.getOwner().getIdentifier() + "/"; } else { //If there's a shoulder prepend independent identifiers with it - prepend = settingsService.getValueForKey(SettingsServiceBean.Key.Shoulder, ""); + prepend = settingsService.getValueForKey(SettingsServiceBean.Key.Shoulder, ""); } switch (doiIdentifierType) { @@ -1482,7 +1477,7 @@ public String generateDataFileIdentifier(DataFile datafile, GlobalIdServiceBean return generateIdentifierAsRandomString(datafile, idServiceBean, prepend); } } - + private String generateIdentifierAsRandomString(DataFile datafile, GlobalIdServiceBean idServiceBean, String prepend) { String identifier = null; do { @@ -1492,7 +1487,6 @@ private String generateIdentifierAsRandomString(DataFile datafile, GlobalIdServi return identifier; } - private String generateIdentifierAsIndependentSequentialNumber(DataFile datafile, GlobalIdServiceBean idServiceBean, String prepend) { String identifier; do { @@ -1562,7 +1556,6 @@ public boolean isGlobalIdUnique(String userIdentifier, DataFile datafile, Global //we can live with failure - means identifier not found remotely } - return u; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetField.java b/src/main/java/edu/harvard/iq/dataverse/DatasetField.java index 2d247ca4032..bf69f861da3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetField.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetField.java @@ -290,12 +290,12 @@ public List getValues() { } return returnList; } + /** * list of values (as opposed to display values). * used for passing to solr for indexing */ - public List getValues_nondisplay() - { + public List getValues_nondisplay() { List returnList = new ArrayList(); if (!datasetFieldValues.isEmpty()) { for (DatasetFieldValue dsfv : datasetFieldValues) { @@ -335,7 +335,7 @@ public boolean isEmptyForDisplay() { private boolean isEmpty(boolean forDisplay) { if (datasetFieldType.isPrimitive()) { // primitive - List values = forDisplay ? getValues() : getValues_nondisplay(); + List values = forDisplay ? getValues() : getValues_nondisplay(); for (String value : values) { if (!StringUtils.isBlank(value) && !(forDisplay && DatasetField.NA_VALUE.equals(value))) { return false; diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldDefaultValue.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldDefaultValue.java index bad482dbca9..1eb5c8f6f3f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldDefaultValue.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldDefaultValue.java @@ -125,12 +125,17 @@ public String toString() { return "edu.harvard.iq.dataverse.DatasetFieldDefaultValue[ id=" + id + " ]"; } - public boolean isEmpty() { + public boolean isEmpty() { return ((strValue==null || strValue.trim().equals(""))); } private int displayOrder; - public int getDisplayOrder() { return this.displayOrder;} - public void setDisplayOrder(int displayOrder) {this.displayOrder = displayOrder;} - + + public int getDisplayOrder() { + return this.displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java index eef0f8fc22c..0d9ec056cb9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java @@ -17,12 +17,12 @@ * @author Stephen Kraffmiller */ @NamedQueries({ - @NamedQuery(name="DatasetFieldType.findByName", - query= "SELECT dsfType FROM DatasetFieldType dsfType WHERE dsfType.name=:name"), - @NamedQuery(name = "DatasetFieldType.findAllFacetable", - query= "select dsfType from DatasetFieldType dsfType WHERE dsfType.facetable = true and dsfType.title != '' order by dsfType.id"), - @NamedQuery(name = "DatasetFieldType.findFacetableByMetadaBlock", - query= "select dsfType from DatasetFieldType dsfType WHERE dsfType.facetable = true and dsfType.title != '' and dsfType.metadataBlock.id = :metadataBlockId order by dsfType.id") + @NamedQuery(name="DatasetFieldType.findByName", + query= "SELECT dsfType FROM DatasetFieldType dsfType WHERE dsfType.name=:name"), + @NamedQuery(name = "DatasetFieldType.findAllFacetable", + query= "select dsfType from DatasetFieldType dsfType WHERE dsfType.facetable = true and dsfType.title != '' order by dsfType.id"), + @NamedQuery(name = "DatasetFieldType.findFacetableByMetadaBlock", + query= "select dsfType from DatasetFieldType dsfType WHERE dsfType.facetable = true and dsfType.title != '' and dsfType.metadataBlock.id = :metadataBlockId order by dsfType.id") }) @Entity @Table(indexes = {@Index(columnList="metadatablock_id"),@Index(columnList="parentdatasetfieldtype_id")}) @@ -47,7 +47,6 @@ public void setId(Long id) { this.id = id; } - /** * The internal, DDI-like name, no spaces, etc. */ @@ -130,11 +129,7 @@ public List getOptionSelectItems() { public void setOptionSelectItems(List optionSelectItems) { this.optionSelectItems = optionSelectItems; } - - - - public DatasetFieldType() {} public DatasetFieldType(String name, FieldType fieldType, boolean allowMultiples) { @@ -301,11 +296,11 @@ public void setMetadataBlock(MetadataBlock metadataBlock) { private String uri; public String getUri() { - return uri; + return uri; } public void setUri(String uri) { - this.uri=uri; + this.uri=uri; } /** @@ -324,13 +319,13 @@ public void setControlledVocabularyValues(Collection this.controlledVocabularyValues = controlledVocabularyValues; } - public ControlledVocabularyValue getControlledVocabularyValue( String strValue ) { - if ( ! isControlledVocabulary() ) { + public ControlledVocabularyValue getControlledVocabularyValue(String strValue) { + if (! isControlledVocabulary()) { throw new IllegalStateException("getControlledVocabularyValue() called on a non-controlled vocabulary type."); } - if ( controlledVocabularyValuesByStrValue == null ) { + if (controlledVocabularyValuesByStrValue == null) { controlledVocabularyValuesByStrValue = new TreeMap<>(); - for ( ControlledVocabularyValue cvv : getControlledVocabularyValues() ) { + for (ControlledVocabularyValue cvv : getControlledVocabularyValues()) { controlledVocabularyValuesByStrValue.put( cvv.getStrValue(), cvv); } } @@ -365,7 +360,6 @@ public void setParentDatasetFieldType(DatasetFieldType parentDatasetFieldType) { this.parentDatasetFieldType = parentDatasetFieldType; } - public Set getDataverseFacets() { return dataverseFacets; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 60072815dd7..f42a0501b31 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -62,7 +62,7 @@ */ @Entity @Table(indexes = {@Index(columnList="dataset_id")}, - uniqueConstraints = @UniqueConstraint(columnNames = {"dataset_id,versionnumber,minorversionnumber"})) + uniqueConstraints = @UniqueConstraint(columnNames = {"dataset_id,versionnumber,minorversionnumber"})) public class DatasetVersion implements Serializable { private static final Logger logger = Logger.getLogger(DatasetVersion.class.getCanonicalName()); @@ -825,46 +825,45 @@ public List getTimePeriodsCovered() { String start = ""; String end = ""; for (DatasetField subField : timePeriodValue.getChildDatasetFields()) { - if (subField.getDatasetFieldType().getName() - .equals(DatasetFieldConstant.timePeriodCoveredStart)) { - if (subField.isEmptyForDisplay()) { - start = null; - } else { - // we want to use "getValue()", as opposed to "getDisplayValue()" here - - // as the latter method prepends the value with the word "Start:"! - start = subField.getValue(); - } - } - if (subField.getDatasetFieldType().getName() - .equals(DatasetFieldConstant.timePeriodCoveredEnd)) { - if (subField.isEmptyForDisplay()) { - end = null; - } else { - // see the comment above - end = subField.getValue(); - } - } - - } - if (start != null && end != null) { - retList.add(start + "/" + end); - } - } - } - } - return retList; - } - - public List getDatesOfCollection() { - List retList = new ArrayList<>(); - for (DatasetField dsf : this.getDatasetFields()) { - if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.dateOfCollection)) { - for (DatasetFieldCompoundValue timePeriodValue : dsf.getDatasetFieldCompoundValues()) { - String start = ""; - String end = ""; - for (DatasetField subField : timePeriodValue.getChildDatasetFields()) { - if (subField.getDatasetFieldType().getName() - .equals(DatasetFieldConstant.dateOfCollectionStart)) { + if (subField.getDatasetFieldType().getName() + .equals(DatasetFieldConstant.timePeriodCoveredStart)) { + if (subField.isEmptyForDisplay()) { + start = null; + } else { + // we want to use "getValue()", as opposed to "getDisplayValue()" here - + // as the latter method prepends the value with the word "Start:"! + start = subField.getValue(); + } + } + if (subField.getDatasetFieldType().getName() + .equals(DatasetFieldConstant.timePeriodCoveredEnd)) { + if (subField.isEmptyForDisplay()) { + end = null; + } else { + // see the comment above + end = subField.getValue(); + } + } + } + if (start != null && end != null) { + retList.add(start + "/" + end); + } + } + } + } + return retList; + } + + public List getDatesOfCollection() { + List retList = new ArrayList<>(); + for (DatasetField dsf : this.getDatasetFields()) { + if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.dateOfCollection)) { + for (DatasetFieldCompoundValue timePeriodValue : dsf.getDatasetFieldCompoundValues()) { + String start = ""; + String end = ""; + for (DatasetField subField : timePeriodValue.getChildDatasetFields()) { + if (subField.getDatasetFieldType().getName() + .equals(DatasetFieldConstant.dateOfCollectionStart)) { if (subField.isEmptyForDisplay()) { start = null; } else { @@ -873,8 +872,8 @@ public List getDatesOfCollection() { start = subField.getValue(); } } - if (subField.getDatasetFieldType().getName() - .equals(DatasetFieldConstant.dateOfCollectionEnd)) { + if (subField.getDatasetFieldType().getName() + .equals(DatasetFieldConstant.dateOfCollectionEnd)) { if (subField.isEmptyForDisplay()) { end = null; } else { @@ -921,77 +920,78 @@ public List getDatasetSubjects() { * @return List of Strings containing the version's Topic Classifications */ public List getTopicClassifications() { - return getCompoundChildFieldValues(DatasetFieldConstant.topicClassification, - DatasetFieldConstant.topicClassValue); - } - - /** - * @return List of Strings containing the version's Kind Of Data entries - */ - public List getKindOfData() { - List kod = new ArrayList<>(); - for (DatasetField dsf : this.getDatasetFields()) { - if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.kindOfData)) { - kod.addAll(dsf.getValues()); - } - } - return kod; - } - - /** - * @return List of Strings containing the version's language entries - */ - public List getLanguages() { - List languages = new ArrayList<>(); - for (DatasetField dsf : this.getDatasetFields()) { - if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.language)) { - languages.addAll(dsf.getValues()); - } - } - return languages; - } - - // TODO: consider calling the newer getSpatialCoverages method below with the commaSeparated boolean set to true. - public List getSpatialCoverages() { - List retList = new ArrayList<>(); - for (DatasetField dsf : this.getDatasetFields()) { - if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.geographicCoverage)) { - for (DatasetFieldCompoundValue geoValue : dsf.getDatasetFieldCompoundValues()) { - List coverage = new ArrayList(); - for (DatasetField subField : geoValue.getChildDatasetFields()) { - if (subField.getDatasetFieldType().getName() - .equals(DatasetFieldConstant.country)) { - if (!subField.isEmptyForDisplay()) { - } else { - coverage.add(subField.getValue()); - } - } - if (subField.getDatasetFieldType().getName() - .equals(DatasetFieldConstant.state)) { - if (!subField.isEmptyForDisplay()) { - coverage.add(subField.getValue()); - } - } - if (subField.getDatasetFieldType().getName() - .equals(DatasetFieldConstant.city)) { - if (!subField.isEmptyForDisplay()) { - coverage.add(subField.getValue()); - } - } - if (subField.getDatasetFieldType().getName() - .equals(DatasetFieldConstant.otherGeographicCoverage)) { - if (!subField.isEmptyForDisplay()) { - coverage.add(subField.getValue()); - } - } - } - if (!coverage.isEmpty()) { - retList.add(String.join(",", coverage)); - } - } - } - } - return retList; + return getCompoundChildFieldValues(DatasetFieldConstant.topicClassification, + DatasetFieldConstant.topicClassValue); + } + + /** + * @return List of Strings containing the version's Kind Of Data entries + */ + public List getKindOfData() { + List kod = new ArrayList<>(); + for (DatasetField dsf : this.getDatasetFields()) { + if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.kindOfData)) { + kod.addAll(dsf.getValues()); + } + } + return kod; + } + + /** + * @return List of Strings containing the version's language entries + */ + public List getLanguages() { + List languages = new ArrayList<>(); + for (DatasetField dsf : this.getDatasetFields()) { + if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.language)) { + languages.addAll(dsf.getValues()); + } + } + return languages; + } + + // TODO: consider calling the newer getSpatialCoverages method below with the commaSeparated boolean set to true. + public List getSpatialCoverages() { + List retList = new ArrayList<>(); + for (DatasetField dsf : this.getDatasetFields()) { + if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.geographicCoverage)) { + for (DatasetFieldCompoundValue geoValue : dsf.getDatasetFieldCompoundValues()) { + List coverage = new ArrayList(); + for (DatasetField subField : geoValue.getChildDatasetFields()) { + if (subField.getDatasetFieldType().getName() + .equals(DatasetFieldConstant.country)) { + if (!subField.isEmptyForDisplay()) { + + } else { + coverage.add(subField.getValue()); + } + } + if (subField.getDatasetFieldType().getName() + .equals(DatasetFieldConstant.state)) { + if (!subField.isEmptyForDisplay()) { + coverage.add(subField.getValue()); + } + } + if (subField.getDatasetFieldType().getName() + .equals(DatasetFieldConstant.city)) { + if (!subField.isEmptyForDisplay()) { + coverage.add(subField.getValue()); + } + } + if (subField.getDatasetFieldType().getName() + .equals(DatasetFieldConstant.otherGeographicCoverage)) { + if (!subField.isEmptyForDisplay()) { + coverage.add(subField.getValue()); + } + } + } + if (!coverage.isEmpty()) { + retList.add(String.join(",", coverage)); + } + } + } + } + return retList; } public List getSpatialCoverages(boolean commaSeparated) { @@ -1090,38 +1090,37 @@ public List getRelatedPublications() { } /** - * @return List of Strings containing the version's Grant Agency(ies) - */ - public List getUniqueGrantAgencyValues() { - - // Since only grant agency names are returned, use distinct() to avoid repeats - // (e.g. if there are two grants from the same agency) - return getCompoundChildFieldValues(DatasetFieldConstant.grantNumber, DatasetFieldConstant.grantNumberAgency) - .stream().distinct().collect(Collectors.toList()); - } - - /** - * @return String containing the version's series title - */ - public String getSeriesTitle() { - - List seriesNames = getCompoundChildFieldValues(DatasetFieldConstant.series, - DatasetFieldConstant.seriesName); - if (seriesNames.size() > 1) { - logger.warning("More than one series title found for datasetVersion: " + this.id); - } - if (!seriesNames.isEmpty()) { - return seriesNames.get(0); - } else { - return null; - } - } - - /** - * @param parentFieldName - * compound dataset field A (from DatasetFieldConstant.*) - * @param childFieldName - * dataset field B, child field of A (from DatasetFieldConstant.*) + * @return List of Strings containing the version's Grant Agency(ies) + */ + public List getUniqueGrantAgencyValues() { + + // Since only grant agency names are returned, use distinct() to avoid repeats + // (e.g. if there are two grants from the same agency) + return getCompoundChildFieldValues(DatasetFieldConstant.grantNumber, DatasetFieldConstant.grantNumberAgency) + .stream().distinct().collect(Collectors.toList()); + } + + /** + * @return String containing the version's series title + */ + public String getSeriesTitle() { + List seriesNames = getCompoundChildFieldValues(DatasetFieldConstant.series, + DatasetFieldConstant.seriesName); + if (seriesNames.size() > 1) { + logger.warning("More than one series title found for datasetVersion: " + this.id); + } + if (!seriesNames.isEmpty()) { + return seriesNames.get(0); + } else { + return null; + } + } + + /** + * @param parentFieldName + * compound dataset field A (from DatasetFieldConstant.*) + * @param childFieldName + * dataset field B, child field of A (from DatasetFieldConstant.*) * @return List of values of the child field */ public List getCompoundChildFieldValues(String parentFieldName, String childFieldName) { @@ -1153,7 +1152,7 @@ public List getDatasetProducerNames(){ for (DatasetFieldCompoundValue authorValue : dsf.getDatasetFieldCompoundValues()) { for (DatasetField subField : authorValue.getChildDatasetFields()) { if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.producerName)) { - producerNames.add(subField.getDisplayValue().trim()); + producerNames.add(subField.getDisplayValue().trim()); } } } diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java index 433477936d2..ed583dba06b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java @@ -48,17 +48,19 @@ @NamedQuery(name = "Dataverse.filterByName", query="SELECT dv FROM Dataverse dv WHERE LOWER(dv.name) LIKE :name order by dv.alias") }) @Entity -@Table(indexes = {@Index(columnList="defaultcontributorrole_id") - , @Index(columnList="defaulttemplate_id") - , @Index(columnList="alias") - , @Index(columnList="affiliation") - , @Index(columnList="dataversetype") - , @Index(columnList="facetroot") - , @Index(columnList="guestbookroot") - , @Index(columnList="metadatablockroot") - , @Index(columnList="templateroot") - , @Index(columnList="permissionroot") - , @Index(columnList="themeroot")}) +@Table(indexes = { + @Index(columnList="defaultcontributorrole_id"), + @Index(columnList="defaulttemplate_id"), + @Index(columnList="alias"), + @Index(columnList="affiliation"), + @Index(columnList="dataversetype"), + @Index(columnList="facetroot"), + @Index(columnList="guestbookroot"), + @Index(columnList="metadatablockroot"), + @Index(columnList="templateroot"), + @Index(columnList="permissionroot"), + @Index(columnList="themeroot") +}) public class Dataverse extends DvObjectContainer { public enum DataverseType { @@ -143,7 +145,7 @@ public String getIndexableCategoryName() { private String affiliation; - // Note: We can't have "Remove" here, as there are role assignments that refer + // Note: We can't have "Remove" here, as there are role assignments that refer // to this role. So, adding it would mean violating a forign key contstraint. @OneToMany(cascade = {CascadeType.MERGE}, fetch = FetchType.LAZY, diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseContact.java b/src/main/java/edu/harvard/iq/dataverse/DataverseContact.java index d19f20d5ebd..5056cfad203 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseContact.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseContact.java @@ -24,9 +24,11 @@ * @author gdurand */ @Entity -@Table(indexes = {@Index(columnList="dataverse_id") - , @Index(columnList="contactemail") - , @Index(columnList="displayorder")}) +@Table(indexes = { + @Index(columnList="dataverse_id"), + @Index(columnList="contactemail"), + @Index(columnList="displayorder") +}) public class DataverseContact implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFacet.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFacet.java index bfd465b8f54..8654f19fc7a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFacet.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFacet.java @@ -24,16 +24,18 @@ * @author gdurand */ @NamedQueries({ - @NamedQuery( name="DataverseFacet.removeByOwnerId", - query="DELETE FROM DataverseFacet f WHERE f.dataverse.id=:ownerId"), - @NamedQuery( name="DataverseFacet.findByDataverseId", - query="select f from DataverseFacet f where f.dataverse.id = :dataverseId order by f.displayOrder") + @NamedQuery(name="DataverseFacet.removeByOwnerId", + query="DELETE FROM DataverseFacet f WHERE f.dataverse.id=:ownerId"), + @NamedQuery(name="DataverseFacet.findByDataverseId", + query="select f from DataverseFacet f where f.dataverse.id = :dataverseId order by f.displayOrder") }) @Entity -@Table(indexes = {@Index(columnList="dataverse_id") - , @Index(columnList="datasetfieldtype_id") - , @Index(columnList="displayorder")}) +@Table(indexes = { + @Index(columnList="dataverse_id"), + @Index(columnList="datasetfieldtype_id"), + @Index(columnList="displayorder") +}) public class DataverseFacet implements Serializable { private static final long serialVersionUID = 1L; @@ -49,16 +51,15 @@ public void setId(Long id) { this.id = id; } - @ManyToOne - @JoinColumn(name="dataverse_id") - private Dataverse dataverse; - - @ManyToOne - @JoinColumn(name="datasetfieldtype_id") - private DatasetFieldType datasetFieldType; + @ManyToOne + @JoinColumn(name="dataverse_id") + private Dataverse dataverse; + @ManyToOne + @JoinColumn(name="datasetfieldtype_id") + private DatasetFieldType datasetFieldType; - private int displayOrder; + private int displayOrder; public Dataverse getDataverse() { return dataverse; @@ -106,4 +107,3 @@ public String toString() { } } - diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFacetServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFacetServiceBean.java index 67bf6a820e2..10d33ce7e94 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFacetServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFacetServiceBean.java @@ -42,14 +42,13 @@ public void delete(DataverseFacet dataverseFacet) { cache.invalidate(); } - public void deleteFacetsFor( Dataverse d ) { - em.createNamedQuery("DataverseFacet.removeByOwnerId") - .setParameter("ownerId", d.getId()) - .executeUpdate(); + public void deleteFacetsFor(Dataverse d) { + em.createNamedQuery("DataverseFacet.removeByOwnerId") + .setParameter("ownerId", d.getId()) + .executeUpdate(); cache.invalidate(d.getId()); - - } - + } + public DataverseFacet create(int displayOrder, DatasetFieldType fieldType, Dataverse ownerDv) { DataverseFacet dataverseFacet = new DataverseFacet(); diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFeaturedDataverse.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFeaturedDataverse.java index 662ee74c3bf..90e6424a909 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFeaturedDataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFeaturedDataverse.java @@ -19,14 +19,16 @@ */ @NamedQueries({ - @NamedQuery( name="DataverseFeaturedDataverse.removeByOwnerId", - query="DELETE FROM DataverseFeaturedDataverse f WHERE f.dataverse.id=:ownerId") + @NamedQuery(name="DataverseFeaturedDataverse.removeByOwnerId", + query="DELETE FROM DataverseFeaturedDataverse f WHERE f.dataverse.id=:ownerId") }) @Entity -@Table(indexes = {@Index(columnList="dataverse_id") - , @Index(columnList="featureddataverse_id") - , @Index(columnList="displayorder")}) +@Table(indexes = { + @Index(columnList="dataverse_id"), + @Index(columnList="featureddataverse_id"), + @Index(columnList="displayorder") +}) public class DataverseFeaturedDataverse implements Serializable { private static final long serialVersionUID = 1L; @@ -96,5 +98,4 @@ public boolean equals(Object object) { public String toString() { return "edu.harvard.iq.dataverse.DataverseFeaturedDataverse[ id=" + id + " ]"; } - } diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java index 18414f642e0..dbcdc3c5229 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java @@ -24,21 +24,23 @@ */ @NamedQueries({ @NamedQuery(name = "DataverseFieldTypeInputLevel.removeByOwnerId", - query = "DELETE FROM DataverseFieldTypeInputLevel f WHERE f.dataverse.id=:ownerId"), + query = "DELETE FROM DataverseFieldTypeInputLevel f WHERE f.dataverse.id=:ownerId"), @NamedQuery(name = "DataverseFieldTypeInputLevel.findByDataverseId", - query = "select f from DataverseFieldTypeInputLevel f where f.dataverse.id = :dataverseId"), + query = "select f from DataverseFieldTypeInputLevel f where f.dataverse.id = :dataverseId"), @NamedQuery(name = "DataverseFieldTypeInputLevel.findByDataverseIdDatasetFieldTypeId", - query = "select f from DataverseFieldTypeInputLevel f where f.dataverse.id = :dataverseId and f.datasetFieldType.id = :datasetFieldTypeId"), + query = "select f from DataverseFieldTypeInputLevel f where f.dataverse.id = :dataverseId and f.datasetFieldType.id = :datasetFieldTypeId"), @NamedQuery(name = "DataverseFieldTypeInputLevel.findByDataverseIdAndDatasetFieldTypeIdList", - query = "select f from DataverseFieldTypeInputLevel f where f.dataverse.id = :dataverseId and f.datasetFieldType.id in :datasetFieldIdList") - + query = "select f from DataverseFieldTypeInputLevel f where f.dataverse.id = :dataverseId and f.datasetFieldType.id in :datasetFieldIdList") }) -@Table(name="DataverseFieldTypeInputLevel" - , uniqueConstraints={ - @UniqueConstraint(columnNames={"dataverse_id", "datasetfieldtype_id"})} - , indexes = {@Index(columnList="dataverse_id") - , @Index(columnList="datasetfieldtype_id") - , @Index(columnList="required")} +@Table(name="DataverseFieldTypeInputLevel", + uniqueConstraints={ + @UniqueConstraint(columnNames={"dataverse_id", "datasetfieldtype_id"}) + }, + indexes = { + @Index(columnList="dataverse_id"), + @Index(columnList="datasetfieldtype_id"), + @Index(columnList="required") + } ) @Entity public class DataverseFieldTypeInputLevel implements Serializable { diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseLocaleBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseLocaleBean.java index 4ac334bf50b..665bdfae6c2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseLocaleBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseLocaleBean.java @@ -25,8 +25,7 @@ public class DataverseLocaleBean implements Serializable { { //Noticed that the NullPointerException was thrown from FacesContext.getCurrentInstance() while running the testcases(mvn:package). //Reason: the FacesContext is not initialized until the app starts. So, added the below if-condition - if(FacesContext.getCurrentInstance() == null) - { + if(FacesContext.getCurrentInstance() == null) { localeCode = "en"; } else { diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java index ac564e2915c..a9de4c3a096 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java @@ -196,23 +196,23 @@ public List findAllPublishedByOwnerId(Long ownerId) { public Dataverse findByAlias(String anAlias) { try { return (anAlias.toLowerCase().equals(":root")) - ? findRootDataverse() - : em.createNamedQuery("Dataverse.findByAlias", Dataverse.class) - .setParameter("alias", anAlias.toLowerCase()) - .getSingleResult(); + ? findRootDataverse() + : em.createNamedQuery("Dataverse.findByAlias", Dataverse.class) + .setParameter("alias", anAlias.toLowerCase()) + .getSingleResult(); } catch ( NoResultException|NonUniqueResultException ex ) { logger.fine("Unable to find a single dataverse using alias \"" + anAlias + "\": " + ex); return null; } } - public boolean hasData( Dataverse dv ) { - TypedQuery amountQry = em.createNamedQuery("Dataverse.ownedObjectsById", Long.class) - .setParameter("id", dv.getId()); - - return (amountQry.getSingleResult()>0); - } - + public boolean hasData( Dataverse dv ) { + TypedQuery amountQry = em.createNamedQuery("Dataverse.ownedObjectsById", Long.class) + .setParameter("id", dv.getId()); + + return (amountQry.getSingleResult()>0); + } + public boolean isRootDataverseExists() { long count = em.createQuery("SELECT count(dv) FROM Dataverse dv WHERE dv.owner.id=null", Long.class).getSingleResult(); return (count == 1); diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseSession.java b/src/main/java/edu/harvard/iq/dataverse/DataverseSession.java index 7fc80542daa..dd44702bc7b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseSession.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseSession.java @@ -27,8 +27,8 @@ public class DataverseSession implements Serializable{ @EJB BuiltinUserServiceBean usersSvc; - - @EJB + + @EJB ActionLogServiceBean logSvc; private boolean statusDismissed = false; diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObject.java b/src/main/java/edu/harvard/iq/dataverse/DvObject.java index 9c091e2d34c..bdb466601a1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObject.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObject.java @@ -17,19 +17,17 @@ */ @NamedQueries({ @NamedQuery(name = "DvObject.findAll", - query = "SELECT o FROM DvObject o ORDER BY o.id"), + query = "SELECT o FROM DvObject o ORDER BY o.id"), @NamedQuery(name = "DvObject.findById", - query = "SELECT o FROM DvObject o WHERE o.id=:id"), + query = "SELECT o FROM DvObject o WHERE o.id=:id"), @NamedQuery(name = "DvObject.ownedObjectsById", - query="SELECT COUNT(obj) FROM DvObject obj WHERE obj.owner.id=:id"), + query="SELECT COUNT(obj) FROM DvObject obj WHERE obj.owner.id=:id"), @NamedQuery(name = "DvObject.findByGlobalId", - query = "SELECT o FROM DvObject o WHERE o.identifier=:identifier and o.authority=:authority and o.protocol=:protocol and o.dtype=:dtype"), - + query = "SELECT o FROM DvObject o WHERE o.identifier=:identifier and o.authority=:authority and o.protocol=:protocol and o.dtype=:dtype"), @NamedQuery(name = "DvObject.findByAlternativeGlobalId", - query = "SELECT o FROM DvObject o, AlternativePersistentIdentifier a WHERE o.id = a.dvObject.id and a.identifier=:identifier and a.authority=:authority and a.protocol=:protocol and o.dtype=:dtype"), - + query = "SELECT o FROM DvObject o, AlternativePersistentIdentifier a WHERE o.id = a.dvObject.id and a.identifier=:identifier and a.authority=:authority and a.protocol=:protocol and o.dtype=:dtype"), @NamedQuery(name = "DvObject.findByProtocolIdentifierAuthority", - query = "SELECT o FROM DvObject o WHERE o.identifier=:identifier and o.authority=:authority and o.protocol=:protocol") + query = "SELECT o FROM DvObject o WHERE o.identifier=:identifier and o.authority=:authority and o.protocol=:protocol") }) @Entity // Inheritance strategy "JOINED" will create 4 db tables - @@ -38,11 +36,14 @@ // in the child tables. (i.e., the id sequences will be "sparse" in the 3 // child tables). Tested, appears to be working properly. -- L.A. Nov. 4 2014 @Inheritance(strategy=InheritanceType.JOINED) -@Table(indexes = {@Index(columnList="dtype") - , @Index(columnList="owner_id") - , @Index(columnList="creator_id") - , @Index(columnList="releaseuser_id")}, - uniqueConstraints = @UniqueConstraint(columnNames = {"authority,protocol,identifier"})) +@Table(indexes = { + @Index(columnList="dtype"), + @Index(columnList="owner_id"), + @Index(columnList="creator_id"), + @Index(columnList="releaseuser_id") + }, + uniqueConstraints = @UniqueConstraint(columnNames = {"authority,protocol,identifier"}) +) public abstract class DvObject extends DataverseEntity implements java.io.Serializable { public static final String DATAVERSE_DTYPE_STRING = "Dataverse"; diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java b/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java index e40eb1c2a3a..00a653a4310 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java @@ -9,15 +9,14 @@ */ @MappedSuperclass public abstract class DvObjectContainer extends DvObject { - public void setOwner(Dataverse owner) { super.setOwner(owner); } - - @Override - public Dataverse getOwner() { - return super.getOwner()!=null ? (Dataverse)super.getOwner() : null; - } + + @Override + public Dataverse getOwner() { + return super.getOwner() != null ? (Dataverse) super.getOwner() : null; + } protected abstract boolean isPermissionRoot(); @@ -25,5 +24,4 @@ public Dataverse getOwner() { public boolean isEffectivelyPermissionRoot() { return isPermissionRoot() || (getOwner() == null); } - } diff --git a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java index 3a20a08068c..2f57db65f99 100644 --- a/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/EditDatafilesPage.java @@ -2158,7 +2158,7 @@ private String processUploadedFileList(List dFileList) { if (multipleDupesExisting) { duplicateFilesErrorMessage = getBundleString("dataset.files.exist") + dupeFileNamesExisting + getBundleString("dataset.file.skip"); } else { - duplicateFilesErrorMessage = getBundleString("dataset.file.exist") + dupeFileNamesExisting; + duplicateFilesErrorMessage = getBundleString("dataset.file.exist") + dupeFileNamesExisting; } if (warningMessage == null) { warningMessage = duplicateFilesErrorMessage; @@ -2170,9 +2170,9 @@ private String processUploadedFileList(List dFileList) { if (dupeFileNamesNew != null) { String duplicateFilesErrorMessage = null; if (multipleDupesNew) { - duplicateFilesErrorMessage = getBundleString("dataset.files.duplicate") + dupeFileNamesNew + getBundleString("dataset.file.skip"); + duplicateFilesErrorMessage = getBundleString("dataset.files.duplicate") + dupeFileNamesNew + getBundleString("dataset.file.skip"); } else { - duplicateFilesErrorMessage = getBundleString("dataset.file.duplicate") + dupeFileNamesNew + getBundleString("dataset.file.skip"); + duplicateFilesErrorMessage = getBundleString("dataset.file.duplicate") + dupeFileNamesNew + getBundleString("dataset.file.skip"); } if (warningMessage == null) { diff --git a/src/main/java/edu/harvard/iq/dataverse/FeaturedDataverseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/FeaturedDataverseServiceBean.java index e7362587c36..0e50ea38fb6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FeaturedDataverseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/FeaturedDataverseServiceBean.java @@ -83,11 +83,11 @@ public void delete(DataverseFeaturedDataverse dataverseFeaturedDataverse) { em.remove(em.merge(dataverseFeaturedDataverse)); } - public void deleteFeaturedDataversesFor( Dataverse d ) { - em.createNamedQuery("DataverseFeaturedDataverse.removeByOwnerId") - .setParameter("ownerId", d.getId()) - .executeUpdate(); - } + public void deleteFeaturedDataversesFor( Dataverse d ) { + em.createNamedQuery("DataverseFeaturedDataverse.removeByOwnerId") + .setParameter("ownerId", d.getId()) + .executeUpdate(); + } public void create(int diplayOrder, Long featuredDataverseId, Long dataverseId) { DataverseFeaturedDataverse dataverseFeaturedDataverse = new DataverseFeaturedDataverse(); @@ -101,7 +101,5 @@ public void create(int diplayOrder, Long featuredDataverseId, Long dataverseId) dataverseFeaturedDataverse.setFeaturedDataverse(featuredDataverse); em.persist(dataverseFeaturedDataverse); - } - - + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java index 73458433bb8..f48bf8ac8d3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileDownloadServiceBean.java @@ -73,11 +73,11 @@ public class FileDownloadServiceBean implements java.io.Serializable { private static final Logger logger = Logger.getLogger(FileDownloadServiceBean.class.getCanonicalName()); - public void writeGuestbookAndStartBatchDownload(GuestbookResponse guestbookResponse){ + public void writeGuestbookAndStartBatchDownload(GuestbookResponse guestbookResponse) { writeGuestbookAndStartBatchDownload(guestbookResponse, false); } - public void writeGuestbookAndStartBatchDownload(GuestbookResponse guestbookResponse, Boolean doNotSaveGuestbookRecord){ + public void writeGuestbookAndStartBatchDownload(GuestbookResponse guestbookResponse, Boolean doNotSaveGuestbookRecord) { if (guestbookResponse == null || guestbookResponse.getSelectedFileIds() == null) { return; } @@ -126,7 +126,7 @@ public void writeGuestbookAndStartBatchDownload(GuestbookResponse guestbookRespo } public void writeGuestbookAndStartFileDownload(GuestbookResponse guestbookResponse, FileMetadata fileMetadata, String format) { - if(!fileMetadata.getDatasetVersion().isDraft()){ + if (!fileMetadata.getDatasetVersion().isDraft()) { guestbookResponse = guestbookResponseService.modifyDatafileAndFormat(guestbookResponse, fileMetadata, format); writeGuestbookResponseRecord(guestbookResponse); } @@ -172,14 +172,14 @@ public void writeGuestbookResponseRecord(GuestbookResponse guestbookResponse) { // But note that this may change - there may be some future situations where it will // become necessary again, to pass the job of creating the access record // to the API. - private void redirectToBatchDownloadAPI(String multiFileString, Boolean guestbookRecordsAlreadyWritten, Boolean downloadOriginal){ + private void redirectToBatchDownloadAPI(String multiFileString, Boolean guestbookRecordsAlreadyWritten, Boolean downloadOriginal) { String fileDownloadUrl = "/api/access/datafiles/" + multiFileString; - if (guestbookRecordsAlreadyWritten && !downloadOriginal){ + if (guestbookRecordsAlreadyWritten && !downloadOriginal) { fileDownloadUrl += "?gbrecs=true"; - } else if (guestbookRecordsAlreadyWritten && downloadOriginal){ + } else if (guestbookRecordsAlreadyWritten && downloadOriginal) { fileDownloadUrl += "?gbrecs=true&format=original"; - } else if (!guestbookRecordsAlreadyWritten && downloadOriginal){ + } else if (!guestbookRecordsAlreadyWritten && downloadOriginal) { fileDownloadUrl += "?format=original"; } @@ -205,7 +205,7 @@ private void redirectToDownloadAPI(String downloadType, Long fileId) { redirectToDownloadAPI(downloadType, fileId, true); } - private void redirectToBatchDownloadAPI(String multiFileString, Boolean downloadOriginal){ + private void redirectToBatchDownloadAPI(String multiFileString, Boolean downloadOriginal) { redirectToBatchDownloadAPI(multiFileString, true, downloadOriginal); } @@ -252,22 +252,22 @@ public void explore(GuestbookResponse guestbookResponse, FileMetadata fmd, Exter } } - public String startWorldMapDownloadLink(GuestbookResponse guestbookResponse, FileMetadata fmd){ + public String startWorldMapDownloadLink(GuestbookResponse guestbookResponse, FileMetadata fmd) { - if (guestbookResponse != null && guestbookResponse.isWriteResponse() && ((fmd != null && fmd.getDataFile() != null) || guestbookResponse.getDataFile() != null)){ - if(guestbookResponse.getDataFile() == null && fmd != null){ + if (guestbookResponse != null && guestbookResponse.isWriteResponse() && ((fmd != null && fmd.getDataFile() != null) || guestbookResponse.getDataFile() != null)) { + if (guestbookResponse.getDataFile() == null && fmd != null) { guestbookResponse.setDataFile(fmd.getDataFile()); } - if (fmd == null || !fmd.getDatasetVersion().isDraft()){ + if (fmd == null || !fmd.getDatasetVersion().isDraft()) { writeGuestbookResponseRecord(guestbookResponse); } } DataFile file = null; - if (fmd != null){ - file = fmd.getDataFile(); + if (fmd != null) { + file = fmd.getDataFile(); } - if (guestbookResponse != null && guestbookResponse.getDataFile() != null && file == null){ - file = guestbookResponse.getDataFile(); + if (guestbookResponse != null && guestbookResponse.getDataFile() != null && file == null) { + file = guestbookResponse.getDataFile(); } @@ -282,12 +282,12 @@ public String startWorldMapDownloadLink(GuestbookResponse guestbookResponse, Fil return retVal; } - public Boolean canSeeTwoRavensExploreButton(){ + public Boolean canSeeTwoRavensExploreButton() { return false; } - public Boolean canUserSeeExploreWorldMapButton(){ + public Boolean canUserSeeExploreWorldMapButton() { return false; } @@ -304,9 +304,9 @@ public void downloadDirectDatafileCitationXML(FileMetadata fileMetadata) { } public void downloadCitationXML(FileMetadata fileMetadata, Dataset dataset, boolean direct) { - DataCitation citation=null; - if (dataset != null){ - citation = new DataCitation(dataset.getLatestVersion()); + DataCitation citation = null; + if (dataset != null) { + citation = new DataCitation(dataset.getLatestVersion()); } else { citation= new DataCitation(fileMetadata, direct); } @@ -333,9 +333,7 @@ public void downloadCitationXML(FileMetadata fileMetadata, Dataset dataset, bool } public void downloadDatasetCitationRIS(Dataset dataset) { - downloadCitationRIS(null, dataset, false); - } public void downloadDatafileCitationRIS(FileMetadata fileMetadata) { @@ -347,11 +345,11 @@ public void downloadDirectDatafileCitationRIS(FileMetadata fileMetadata) { } public void downloadCitationRIS(FileMetadata fileMetadata, Dataset dataset, boolean direct) { - DataCitation citation=null; - if (dataset != null){ - citation = new DataCitation(dataset.getLatestVersion()); + DataCitation citation = null; + if (dataset != null) { + citation = new DataCitation(dataset.getLatestVersion()); } else { - citation= new DataCitation(fileMetadata, direct); + citation = new DataCitation(fileMetadata, direct); } FacesContext ctx = FacesContext.getCurrentInstance(); @@ -397,11 +395,11 @@ public void downloadDirectDatafileCitationBibtex(FileMetadata fileMetadata) { } public void downloadCitationBibtex(FileMetadata fileMetadata, Dataset dataset, boolean direct) { - DataCitation citation=null; - if (dataset != null){ - citation = new DataCitation(dataset.getLatestVersion()); + DataCitation citation = null; + if (dataset != null) { + citation = new DataCitation(dataset.getLatestVersion()); } else { - citation= new DataCitation(fileMetadata, direct); + citation = new DataCitation(fileMetadata, direct); } FacesContext ctx = FacesContext.getCurrentInstance(); @@ -427,9 +425,9 @@ public void downloadCitationBibtex(FileMetadata fileMetadata, Dataset dataset, b } } - + public boolean requestAccess(Long fileId) { - if (dvRequestService.getDataverseRequest().getAuthenticatedUser() == null){ + if (dvRequestService.getDataverseRequest().getAuthenticatedUser() == null) { return false; } DataFile file = datafileService.find(fileId); @@ -441,7 +439,6 @@ public boolean requestAccess(Long fileId) { logger.info("Unable to request access for file id " + fileId + ". Exception: " + ex); } } - return false; } @@ -449,9 +446,5 @@ public void sendRequestFileAccessNotification(Dataset dataset, Long fileId) { permissionService.getUsersWithPermissionOn(Permission.ManageDatasetPermissions, dataset).stream().forEach((au) -> { userNotificationService.sendNotification(au, new Timestamp(new Date().getTime()), UserNotification.Type.REQUESTFILEACCESS, fileId); }); - - } - - - + } } \ No newline at end of file diff --git a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java index 6ad4eb34ddd..bc4b48a2361 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java @@ -48,7 +48,6 @@ public class FileMetadata implements Serializable { private static final DateFormat displayDateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM); private static final Logger logger = Logger.getLogger(FileMetadata.class.getCanonicalName()); - @Expose @Pattern(regexp="^[^:<>;#/\"\\*\\|\\?\\\\]*$", message = "{filename.illegalCharacters}") @@ -301,7 +300,7 @@ public void addCategoryByName(String newCategoryName) { } } - public String getFileDateToDisplay() { + public String getFileDateToDisplay() { Date fileDate = null; DataFile datafile = this.getDataFile(); if (datafile != null) { @@ -325,18 +324,15 @@ public String getFileDateToDisplay() { } public String getFileCitation(){ - return getFileCitation(false); - } - + return getFileCitation(false); + } - - public String getFileCitation(boolean html){ - return new DataCitation(this).toString(html); - } + return new DataCitation(this).toString(html); + } public String getDirectFileCitation(boolean html){ - return new DataCitation(this, true).toString(html); + return new DataCitation(this, true).toString(html); } @@ -348,8 +344,6 @@ public void setDatasetVersion(DatasetVersion datasetVersion) { this.datasetVersion = datasetVersion; } - - public DataFile getDataFile() { return dataFile; } @@ -358,7 +352,6 @@ public void setDataFile(DataFile dataFile) { this.dataFile = dataFile; } - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -511,16 +504,12 @@ public int compare(FileMetadata o1, FileMetadata o2) { return o1.getLabel().toUpperCase().compareTo(o2.getLabel().toUpperCase()); } }; - - - - public String toPrettyJSON(){ - + + public String toPrettyJSON() { return serializeAsJSON(true); } - public String toJSON(){ - + public String toJSON() { return serializeAsJSON(false); } @@ -530,21 +519,15 @@ public String toJSON(){ * @return */ private String serializeAsJSON(boolean prettyPrint){ - JsonObject jsonObj = asGsonObject(prettyPrint); - return jsonObj.toString(); - } - public JsonObject asGsonObject(boolean prettyPrint){ - - GsonBuilder builder; - if (prettyPrint){ // Add pretty printing + if (prettyPrint) { // Add pretty printing builder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting(); - }else{ + } else { builder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation(); } diff --git a/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFieldMapping.java b/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFieldMapping.java index 40d219d2638..93f10babbf4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFieldMapping.java +++ b/src/main/java/edu/harvard/iq/dataverse/ForeignMetadataFieldMapping.java @@ -15,13 +15,15 @@ * * @author Leonid Andreev */ -@Table( uniqueConstraints = @UniqueConstraint(columnNames={"foreignMetadataFormatMapping_id","foreignFieldXpath"}) - , indexes = {@Index(columnList="foreignmetadataformatmapping_id") - , @Index(columnList="foreignfieldxpath") - , @Index(columnList="parentfieldmapping_id")}) +@Table(uniqueConstraints = @UniqueConstraint(columnNames={"foreignMetadataFormatMapping_id","foreignFieldXpath"}), + indexes = { + @Index(columnList="foreignmetadataformatmapping_id"), + @Index(columnList="foreignfieldxpath"), + @Index(columnList="parentfieldmapping_id") +}) @NamedQueries({ - @NamedQuery( name="ForeignMetadataFieldMapping.findByPath", - query="SELECT fmfm FROM ForeignMetadataFieldMapping fmfm WHERE fmfm.foreignMetadataFormatMapping.name=:formatName AND fmfm.foreignFieldXPath=:xPath") + @NamedQuery(name="ForeignMetadataFieldMapping.findByPath", + query="SELECT fmfm FROM ForeignMetadataFieldMapping fmfm WHERE fmfm.foreignMetadataFormatMapping.name=:formatName AND fmfm.foreignFieldXPath=:xPath") }) @Entity public class ForeignMetadataFieldMapping implements Serializable { diff --git a/src/main/java/edu/harvard/iq/dataverse/GlobalId.java b/src/main/java/edu/harvard/iq/dataverse/GlobalId.java index 98112170d25..4d747b1db17 100644 --- a/src/main/java/edu/harvard/iq/dataverse/GlobalId.java +++ b/src/main/java/edu/harvard/iq/dataverse/GlobalId.java @@ -194,38 +194,38 @@ private boolean parsePersistentId(String identifierString) { return true; } - private static String formatIdentifierString(String str){ + private static String formatIdentifierString(String str) { - if (str == null){ + if (str == null) { return null; } // remove whitespace, single quotes, and semicolons return str.replaceAll("\\s+|'|;",""); /* - < (%3C) -> (%3E) -{ (%7B) -} (%7D) -^ (%5E) -[ (%5B) -] (%5D) -` (%60) -| (%7C) -\ (%5C) -+ + < (%3C) + > (%3E) + { (%7B) + } (%7D) + ^ (%5E) + [ (%5B) + ] (%5D) + ` (%60) + | (%7C) + \ (%5C) + + */ // http://www.doi.org/doi_handbook/2_Numbering.html } - private static boolean testforNullTerminator(String str){ - if(str == null) { + private static boolean testforNullTerminator(String str) { + if (str == null) { return false; } return str.indexOf('\u0000') > 0; } - private boolean checkDOIAuthority(String doiAuthority){ + private boolean checkDOIAuthority(String doiAuthority) { if (doiAuthority==null){ return false; diff --git a/src/main/java/edu/harvard/iq/dataverse/HarvestingClientsPage.java b/src/main/java/edu/harvard/iq/dataverse/HarvestingClientsPage.java index d947849f4fb..d3ec47907b5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/HarvestingClientsPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/HarvestingClientsPage.java @@ -225,12 +225,13 @@ public void runHarvest(HarvestingClient harvestingClient) { // for it: // (looks like we need to sleep for a few milliseconds here, to make sure // it has already been updated with the "inprogress" setting) - try{Thread.sleep(500L);}catch(Exception e){} - - + try { + Thread.sleep(500L); + } catch(Exception e) { + + } + configuredHarvestingClients = harvestingClientService.getAllHarvestingClients(); - - } public void editClient(HarvestingClient harvestingClient) { diff --git a/src/main/java/edu/harvard/iq/dataverse/HarvestingDataverseConfig.java b/src/main/java/edu/harvard/iq/dataverse/HarvestingDataverseConfig.java index 28df6e19e65..be1aebbfc88 100644 --- a/src/main/java/edu/harvard/iq/dataverse/HarvestingDataverseConfig.java +++ b/src/main/java/edu/harvard/iq/dataverse/HarvestingDataverseConfig.java @@ -22,10 +22,12 @@ * @author Leonid Andreev */ @Entity -@Table(indexes = {@Index(columnList="dataverse_id") - , @Index(columnList="harvesttype") - , @Index(columnList="harveststyle") - , @Index(columnList="harvestingurl")}) +@Table(indexes = { + @Index(columnList="dataverse_id"), + @Index(columnList="harvesttype"), + @Index(columnList="harveststyle"), + @Index(columnList="harvestingurl") +}) public class HarvestingDataverseConfig implements Serializable { private static final long serialVersionUID = 1L; @Id diff --git a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java index dea22784600..7d8f76f11bf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java @@ -88,10 +88,10 @@ public void sendMail(String host, String reply, String to, String subject, Strin String[] recipientStrings = to.split(","); InternetAddress[] recipients = new InternetAddress[recipientStrings.length]; try { - InternetAddress fromAddress=getSystemAddress(); - fromAddress.setPersonal(BundleUtil.getStringFromBundle("contact.delegation", Arrays.asList( + InternetAddress fromAddress=getSystemAddress(); + fromAddress.setPersonal(BundleUtil.getStringFromBundle("contact.delegation", Arrays.asList( fromAddress.getPersonal(), reply)), charset); - msg.setFrom(fromAddress); + msg.setFrom(fromAddress); msg.setReplyTo(new Address[] {new InternetAddress(reply, charset)}); for (int i = 0; i < recipients.length; i++) { recipients[i] = new InternetAddress(recipientStrings[i], "", charset); @@ -170,7 +170,7 @@ public void sendMail(String from, String to, String subject, String messageText) public void sendMail(String reply, String to, String subject, String messageText, Map extraHeaders) { try { MimeMessage msg = new MimeMessage(session); - //Always send from system address to avoid email being blocked + // Always send from system address to avoid email being blocked InternetAddress fromAddress=getSystemAddress(); try { fromAddress.setPersonal(BundleUtil.getStringFromBundle("contact.delegation", Arrays.asList( @@ -180,10 +180,10 @@ public void sendMail(String reply, String to, String subject, String messageText } msg.setFrom(fromAddress); if (EMailValidator.isEmailValid(reply, null)) { - //But set the reply-to address to direct replies to the requested 'from' party if it is a valid email address + // But set the reply-to address to direct replies to the requested 'from' party if it is a valid email address msg.setReplyTo(new Address[] {new InternetAddress(reply)}); } else { - //Otherwise include the invalid 'from' address in the message + // Otherwise include the invalid 'from' address in the message messageText = "From: " + reply + "\n\n" + messageText; } msg.setSentDate(new Date()); diff --git a/src/main/java/edu/harvard/iq/dataverse/MapLayerMetadataServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MapLayerMetadataServiceBean.java index dbbe8b3d8bb..1edfe6ce703 100755 --- a/src/main/java/edu/harvard/iq/dataverse/MapLayerMetadataServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MapLayerMetadataServiceBean.java @@ -38,8 +38,7 @@ @Stateless @Named public class MapLayerMetadataServiceBean { - - + @PersistenceContext(unitName = "VDCNet-ejbPU") private EntityManager em; @@ -73,31 +72,28 @@ public MapLayerMetadata save( MapLayerMetadata layer_metadata) { if ( layer_metadata.getId() == null ) { em.persist(layer_metadata); return layer_metadata; - } else { + } else { return em.merge( layer_metadata ); - } + } } - - - + /* Given a datafile id, return the associated MapLayerMetadata object - */ public MapLayerMetadata findMetadataByDatafile(DataFile datafile){ - if (datafile == null){ + if (datafile == null) { return null; } - try{ + try { // String sqlStatement = Query query = em.createQuery("select m from MapLayerMetadata m WHERE m.dataFile=:datafile", MapLayerMetadata.class); query.setParameter("datafile", datafile); query.setMaxResults(1); //entityManager.createQuery(SQL_QUERY).setParameter(arg0,arg1).setMaxResults(10).getResultList(); return (MapLayerMetadata) query.getSingleResult(); - } catch ( NoResultException nre ) { + } catch (NoResultException nre) { return null; } } @@ -131,35 +127,31 @@ public boolean deleteMapLayerMetadataObject(MapLayerMetadata mapLayerMetadata, U } return false; } - - - public MapLayerMetadata findMetadataByLayerNameAndDatafile(String layer_name){//, DataFile datafile) { - if ((layer_name == null)){//||(datafile==null)){ + + public MapLayerMetadata findMetadataByLayerNameAndDatafile(String layer_name) { //, DataFile datafile) { + if ((layer_name == null)) { // ||(datafile==null)){ return null; } - //Query query = em.createQuery("select o.id from MapLayerMetadta as o where o.layer_name =:layerName and o.datafile_id =:datafileID;"); - //Query query = em.createQuery("select m from MapLayerMetadata m where m.layer_name =:layerName ;"); - try{ + // Query query = em.createQuery("select o.id from MapLayerMetadta as o where o.layer_name =:layerName and o.datafile_id =:datafileID;"); + // Query query = em.createQuery("select m from MapLayerMetadata m where m.layer_name =:layerName ;"); + try { return em.createQuery("select m from MapLayerMetadata m WHERE m.layerName=:layerName", MapLayerMetadata.class) - .setParameter("layerName", layer_name) - .getSingleResult(); - } catch ( NoResultException nre ) { + .setParameter("layerName", layer_name) + .getSingleResult(); + } catch (NoResultException nre) { return null; } } - - - - public List getMapLayerMetadataForDataset(Dataset dataset){ - if (dataset == null){ + + public List getMapLayerMetadataForDataset(Dataset dataset) { + if (dataset == null) { return null; } TypedQuery query = em.createQuery("select object(o) from MapLayerMetadata as o where o.dataset=:dataset", MapLayerMetadata.class);// order by o.name"); query.setParameter("dataset", dataset); return query.getResultList(); - } - - + } + /** * Before downloading a file for map icons (see "retrieveMapImageForIcon" below), * first remove any existing .img and .img.* files @@ -307,12 +299,16 @@ public boolean retrieveMapImageForIcon(MapLayerMetadata mapLayerMetadata) throws logger.info("try to open InputStream"); InputStream is = null; - try{ + try { is = url.openStream(); - }catch(IOException exio){ + } catch(IOException exio) { logger.warning("Error when retrieving map icon image. Exception: " + exio.getMessage()); - if (is!=null){ - try { is.close(); } catch (IOException ignore) {} + if (is!=null) { + try { + is.close(); + } catch (IOException ignore) { + + } } return false; } diff --git a/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java b/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java index 9d6b8dd9651..53122d6e1cc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java +++ b/src/main/java/edu/harvard/iq/dataverse/MetadataBlock.java @@ -23,11 +23,13 @@ * * @author skraffmiller */ -@Table(indexes = {@Index(columnList="name") - , @Index(columnList="owner_id")}) +@Table(indexes = { + @Index(columnList="name"), + @Index(columnList="owner_id") +}) @NamedQueries({ - @NamedQuery( name="MetadataBlock.listAll", query = "SELECT mdb FROM MetadataBlock mdb"), - @NamedQuery( name="MetadataBlock.findByName", query = "SELECT mdb FROM MetadataBlock mdb WHERE mdb.name=:name") + @NamedQuery(name="MetadataBlock.listAll", query = "SELECT mdb FROM MetadataBlock mdb"), + @NamedQuery(name="MetadataBlock.findByName", query = "SELECT mdb FROM MetadataBlock mdb WHERE mdb.name=:name") }) @Entity public class MetadataBlock implements Serializable { diff --git a/src/main/java/edu/harvard/iq/dataverse/RoleAssignment.java b/src/main/java/edu/harvard/iq/dataverse/RoleAssignment.java index 5bfd55134b0..22da74a7608 100644 --- a/src/main/java/edu/harvard/iq/dataverse/RoleAssignment.java +++ b/src/main/java/edu/harvard/iq/dataverse/RoleAssignment.java @@ -25,62 +25,63 @@ */ @Entity @Table( - uniqueConstraints = @UniqueConstraint(columnNames={"assigneeIdentifier","role_id","definitionPoint_id"}) - , indexes = {@Index(columnList="assigneeidentifier") - , @Index(columnList="definitionpoint_id") - , @Index(columnList="role_id")} + uniqueConstraints = @UniqueConstraint(columnNames={"assigneeIdentifier","role_id","definitionPoint_id"}), + indexes = { + @Index(columnList="assigneeidentifier"), + @Index(columnList="definitionpoint_id"), + @Index(columnList="role_id")} ) @NamedQueries({ - @NamedQuery( name = "RoleAssignment.listByAssigneeIdentifier_DefinitionPointId", - query = "SELECT r FROM RoleAssignment r WHERE r.assigneeIdentifier=:assigneeIdentifier AND r.definitionPoint.id=:definitionPointId" ), - @NamedQuery( name = "RoleAssignment.listByAssigneeIdentifier", - query = "SELECT r FROM RoleAssignment r WHERE r.assigneeIdentifier=:assigneeIdentifier" ), - @NamedQuery( name = "RoleAssignment.listByDefinitionPointId", - query = "SELECT r FROM RoleAssignment r WHERE r.definitionPoint.id=:definitionPointId" ), - @NamedQuery( name = "RoleAssignment.listByRoleId", - query = "SELECT r FROM RoleAssignment r WHERE r.role=:roleId" ), - @NamedQuery( name = "RoleAssignment.listByPrivateUrlToken", - query = "SELECT r FROM RoleAssignment r WHERE r.privateUrlToken=:privateUrlToken" ), - @NamedQuery( name = "RoleAssignment.deleteByAssigneeIdentifier_RoleIdDefinition_PointId", - query = "DELETE FROM RoleAssignment r WHERE r.assigneeIdentifier=:assigneeIdentifier AND r.role.id=:roleId AND r.definitionPoint.id=:definitionPointId"), - @NamedQuery( name = "RoleAssignment.deleteAllByAssigneeIdentifier", - query = "DELETE FROM RoleAssignment r WHERE r.assigneeIdentifier=:assigneeIdentifier") + @NamedQuery(name = "RoleAssignment.listByAssigneeIdentifier_DefinitionPointId", + query = "SELECT r FROM RoleAssignment r WHERE r.assigneeIdentifier=:assigneeIdentifier AND r.definitionPoint.id=:definitionPointId"), + @NamedQuery(name = "RoleAssignment.listByAssigneeIdentifier", + query = "SELECT r FROM RoleAssignment r WHERE r.assigneeIdentifier=:assigneeIdentifier"), + @NamedQuery(name = "RoleAssignment.listByDefinitionPointId", + query = "SELECT r FROM RoleAssignment r WHERE r.definitionPoint.id=:definitionPointId"), + @NamedQuery(name = "RoleAssignment.listByRoleId", + query = "SELECT r FROM RoleAssignment r WHERE r.role=:roleId"), + @NamedQuery(name = "RoleAssignment.listByPrivateUrlToken", + query = "SELECT r FROM RoleAssignment r WHERE r.privateUrlToken=:privateUrlToken"), + @NamedQuery(name = "RoleAssignment.deleteByAssigneeIdentifier_RoleIdDefinition_PointId", + query = "DELETE FROM RoleAssignment r WHERE r.assigneeIdentifier=:assigneeIdentifier AND r.role.id=:roleId AND r.definitionPoint.id=:definitionPointId"), + @NamedQuery(name = "RoleAssignment.deleteAllByAssigneeIdentifier", + query = "DELETE FROM RoleAssignment r WHERE r.assigneeIdentifier=:assigneeIdentifier") }) public class RoleAssignment implements java.io.Serializable { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column( nullable=false ) - private String assigneeIdentifier; - - @ManyToOne( cascade = {CascadeType.MERGE} ) - @JoinColumn( nullable=false ) - private DataverseRole role; - - @ManyToOne( cascade = {CascadeType.MERGE} ) - @JoinColumn( nullable=false ) - private DvObject definitionPoint; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column( nullable=false ) + private String assigneeIdentifier; + + @ManyToOne( cascade = {CascadeType.MERGE} ) + @JoinColumn( nullable=false ) + private DataverseRole role; + + @ManyToOne( cascade = {CascadeType.MERGE} ) + @JoinColumn( nullable=false ) + private DvObject definitionPoint; @Column(nullable = true) private String privateUrlToken; - - public RoleAssignment() {} - - public RoleAssignment(DataverseRole aRole, RoleAssignee anAssignee, DvObject aDefinitionPoint, String privateUrlToken) { + + public RoleAssignment() {} + + public RoleAssignment(DataverseRole aRole, RoleAssignee anAssignee, DvObject aDefinitionPoint, String privateUrlToken) { role = aRole; assigneeIdentifier = anAssignee.getIdentifier(); definitionPoint = aDefinitionPoint; this.privateUrlToken = privateUrlToken; } - - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } public String getAssigneeIdentifier() { return assigneeIdentifier; @@ -90,53 +91,52 @@ public void setAssigneeIdentifier(String assigneeIdentifier) { this.assigneeIdentifier = assigneeIdentifier; } - public DataverseRole getRole() { - return role; - } + public DataverseRole getRole() { + return role; + } - public void setRole(DataverseRole role) { - this.role = role; - } + public void setRole(DataverseRole role) { + this.role = role; + } - public DvObject getDefinitionPoint() { - return definitionPoint; - } + public DvObject getDefinitionPoint() { + return definitionPoint; + } - public void setDefinitionPoint(DvObject definitionPoint) { - this.definitionPoint = definitionPoint; - } + public void setDefinitionPoint(DvObject definitionPoint) { + this.definitionPoint = definitionPoint; + } public String getPrivateUrlToken() { return privateUrlToken; } - @Override - public int hashCode() { - int hash = 7; - hash = 97 * hash + Objects.hashCode(role); - hash = 97 * hash + Objects.hashCode(assigneeIdentifier); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if ( ! (obj instanceof RoleAssignment) ) { - return false; - } - final RoleAssignment other = (RoleAssignment) obj; - - return ( Objects.equals(getRole(), other.getRole() ) - && Objects.equals(getAssigneeIdentifier(), other.getAssigneeIdentifier()) - && Objects.equals(getDefinitionPoint(), other.getDefinitionPoint())); - - } - - @Override - public String toString() { - return "RoleAssignment{" + "id=" + id + ", assignee=" + assigneeIdentifier + ", role=" + role + ", definitionPoint=" + definitionPoint + '}'; - } - + @Override + public int hashCode() { + int hash = 7; + hash = 97 * hash + Objects.hashCode(role); + hash = 97 * hash + Objects.hashCode(assigneeIdentifier); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (!(obj instanceof RoleAssignment)) { + return false; + } + final RoleAssignment other = (RoleAssignment) obj; + + return ( Objects.equals(getRole(), other.getRole() ) + && Objects.equals(getAssigneeIdentifier(), other.getAssigneeIdentifier()) + && Objects.equals(getDefinitionPoint(), other.getDefinitionPoint())); +} + + @Override + public String toString() { + return "RoleAssignment{" + "id=" + id + ", assignee=" + assigneeIdentifier + ", role=" + role + ", definitionPoint=" + definitionPoint + '}'; + } + } diff --git a/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java b/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java index 204806e7894..7e20d8022a4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java +++ b/src/main/java/edu/harvard/iq/dataverse/RolePermissionFragment.java @@ -178,8 +178,8 @@ public void toggleFileRestrict(ActionEvent evt) { } public void grantAccess(ActionEvent evt) { - //RoleAssignee assignRoleRoleAssignee = roleAssigneeService.getRoleAssignee(assignRoleUsername); - // Find the built in file downloader role (currently by alias) + // RoleAssignee assignRoleRoleAssignee = roleAssigneeService.getRoleAssignee(assignRoleUsername); + // Find the built in file downloader role (currently by alias) assignRole(assignRoleRoleAssignee, roleService.findBuiltinRoleByAlias("fileDownloader")); } public void assignRole(ActionEvent evt) { diff --git a/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java b/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java index 63c5f43234f..4a363278e1d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/ThumbnailServiceWrapper.java @@ -239,10 +239,9 @@ public String getDatasetCardImageAsBase64Url(Dataset dataset, Long versionId, bo // (alternatively, we could ignore the exception, and proceed with the // regular process of selecting the thumbnail from the available // image files - ?) - } finally - { - IOUtils.closeQuietly(in); - } + } finally { + IOUtils.closeQuietly(in); + } } // If not, see if the dataset has one of its image files already assigned diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index 10e23c1aace..dd81b65b41a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -177,8 +177,8 @@ String getWrappedMessageWhenJson() { @EJB protected UserServiceBean userSvc; - @EJB - protected DataverseRoleServiceBean rolesSvc; + @EJB + protected DataverseRoleServiceBean rolesSvc; @EJB protected SettingsServiceBean settingsSvc; @@ -493,16 +493,17 @@ protected DataverseRequest createDataverseRequest( User u ) { return new DataverseRequest(u, httpRequest); } - protected Dataverse findDataverse( String idtf ) { - return isNumeric(idtf) ? dataverseSvc.find(Long.parseLong(idtf)) - : dataverseSvc.findByAlias(idtf); - } + protected Dataverse findDataverse( String idtf ) { + return isNumeric(idtf) + ? dataverseSvc.find(Long.parseLong(idtf)) + : dataverseSvc.findByAlias(idtf); + } - protected DvObject findDvo( Long id ) { - return em.createNamedQuery("DvObject.findById", DvObject.class) - .setParameter("id", id) - .getSingleResult(); - } + protected DvObject findDvo( Long id ) { + return em.createNamedQuery("DvObject.findById", DvObject.class) + .setParameter("id", id) + .getSingleResult(); + } /** * Tries to find a DvObject. If the passed id can be interpreted as a number, @@ -511,16 +512,15 @@ protected DvObject findDvo( Long id ) { * @param id a value identifying the DvObject, either numeric of textual. * @return A DvObject, or {@code null} */ - protected DvObject findDvo( String id ) { - if ( isNumeric(id) ) { + protected DvObject findDvo(String id) { + if (isNumeric(id)) { return findDvo( Long.valueOf(id)) ; } else { Dataverse d = dataverseSvc.findByAlias(id); - return ( d != null ) ? + return (d != null) ? d : datasetSvc.findByGlobalId(id); - } - } + } protected T failIfNull( T t, String errorMessage ) throws WrappedResponse { if ( t != null ) return t; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java index 3b5dbe2a150..b2ebed3a636 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java @@ -99,956 +99,956 @@ @Path("admin") public class Admin extends AbstractApiBean { - private static final Logger logger = Logger.getLogger(Admin.class.getName()); - - @EJB - BuiltinUserServiceBean builtinUserService; - @EJB - ShibServiceBean shibService; - @EJB - AuthTestDataServiceBean authTestDataService; - @EJB - UserServiceBean userService; - @EJB - IngestServiceBean ingestService; - @EJB - DataFileServiceBean fileService; - @EJB - DatasetServiceBean datasetService; + private static final Logger logger = Logger.getLogger(Admin.class.getName()); + + @EJB + BuiltinUserServiceBean builtinUserService; + @EJB + ShibServiceBean shibService; + @EJB + AuthTestDataServiceBean authTestDataService; + @EJB + UserServiceBean userService; + @EJB + IngestServiceBean ingestService; + @EJB + DataFileServiceBean fileService; + @EJB + DatasetServiceBean datasetService; @EJB GroupServiceBean groupService; - // Make the session available - @Inject - DataverseSession session; - - public static final String listUsersPartialAPIPath = "list-users"; - public static final String listUsersFullAPIPath = "/api/admin/" + listUsersPartialAPIPath; - - @Path("settings") - @GET - public Response listAllSettings() { - JsonObjectBuilder bld = jsonObjectBuilder(); - settingsSvc.listAll().forEach(s -> bld.add(s.getName(), s.getContent())); - return ok(bld); - } - - @Path("settings/{name}") - @PUT - public Response putSetting(@PathParam("name") String name, String content) { - Setting s = settingsSvc.set(name, content); - return ok(jsonObjectBuilder().add(s.getName(), s.getContent())); - } - - @Path("settings/{name}") - @GET - public Response getSetting(@PathParam("name") String name) { - String s = settingsSvc.get(name); - - return (s != null) ? ok(s) : notFound("Setting " + name + " not found"); - } - - @Path("settings/{name}") - @DELETE - public Response deleteSetting(@PathParam("name") String name) { - settingsSvc.delete(name); - - return ok("Setting " + name + " deleted."); - } - - @Path("authenticationProviderFactories") - @GET - public Response listAuthProviderFactories() { - return ok(authSvc.listProviderFactories().stream() - .map(f -> jsonObjectBuilder().add("alias", f.getAlias()).add("info", f.getInfo())) - .collect(toJsonArray())); - } - - @Path("authenticationProviders") - @GET - public Response listAuthProviders() { - return ok(em.createNamedQuery("AuthenticationProviderRow.findAll", AuthenticationProviderRow.class) - .getResultList().stream().map(r -> json(r)).collect(toJsonArray())); - } - - @Path("authenticationProviders") - @POST - public Response addProvider(AuthenticationProviderRow row) { - try { - AuthenticationProviderRow managed = em.find(AuthenticationProviderRow.class, row.getId()); - if (managed != null) { - managed = em.merge(row); - } else { - em.persist(row); - managed = row; - } - if (managed.isEnabled()) { - AuthenticationProvider provider = authSvc.loadProvider(managed); - authSvc.deregisterProvider(provider.getId()); - authSvc.registerProvider(provider); - } - return created("/api/admin/authenticationProviders/" + managed.getId(), json(managed)); - } catch (AuthorizationSetupException e) { - return error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); - } - } - - @Path("authenticationProviders/{id}") - @GET - public Response showProvider(@PathParam("id") String id) { - AuthenticationProviderRow row = em.find(AuthenticationProviderRow.class, id); - return (row != null) ? ok(json(row)) - : error(Status.NOT_FOUND, "Can't find authetication provider with id '" + id + "'"); - } - - @POST - @Path("authenticationProviders/{id}/:enabled") - public Response enableAuthenticationProvider_deprecated(@PathParam("id") String id, String body) { - return enableAuthenticationProvider(id, body); - } - - @PUT - @Path("authenticationProviders/{id}/enabled") - @Produces("application/json") - public Response enableAuthenticationProvider(@PathParam("id") String id, String body) { - body = body.trim(); - if (!Util.isBoolean(body)) { - return error(Response.Status.BAD_REQUEST, "Illegal value '" + body + "'. Use 'true' or 'false'"); - } - boolean enable = Util.isTrue(body); - - AuthenticationProviderRow row = em.find(AuthenticationProviderRow.class, id); - if (row == null) { - return notFound("Can't find authentication provider with id '" + id + "'"); - } - - row.setEnabled(enable); - em.merge(row); - - if (enable) { - // enable a provider - if (authSvc.getAuthenticationProvider(id) != null) { - return ok(String.format("Authentication provider '%s' already enabled", id)); - } - try { - authSvc.registerProvider(authSvc.loadProvider(row)); - return ok(String.format("Authentication Provider %s enabled", row.getId())); - - } catch (AuthenticationProviderFactoryNotFoundException ex) { - return notFound(String.format("Can't instantiate provider, as there's no factory with alias %s", - row.getFactoryAlias())); - } catch (AuthorizationSetupException ex) { - logger.log(Level.WARNING, "Error instantiating authentication provider: " + ex.getMessage(), ex); - return error(Status.INTERNAL_SERVER_ERROR, - String.format("Can't instantiate provider: %s", ex.getMessage())); - } - - } else { - // disable a provider - authSvc.deregisterProvider(id); - return ok("Authentication Provider '" + id + "' disabled. " - + (authSvc.getAuthenticationProviderIds().isEmpty() - ? "WARNING: no enabled authentication providers left." - : "")); - } - } - - @GET - @Path("authenticationProviders/{id}/enabled") - public Response checkAuthenticationProviderEnabled(@PathParam("id") String id) { - List prvs = em - .createNamedQuery("AuthenticationProviderRow.findById", AuthenticationProviderRow.class) - .setParameter("id", id).getResultList(); - if (prvs.isEmpty()) { - return notFound("Can't find a provider with id '" + id + "'."); - } else { - return ok(Boolean.toString(prvs.get(0).isEnabled())); - } - } - - @DELETE - @Path("authenticationProviders/{id}/") - public Response deleteAuthenticationProvider(@PathParam("id") String id) { - authSvc.deregisterProvider(id); - AuthenticationProviderRow row = em.find(AuthenticationProviderRow.class, id); - if (row != null) { - em.remove(row); - } - - return ok("AuthenticationProvider " + id + " deleted. " - + (authSvc.getAuthenticationProviderIds().isEmpty() - ? "WARNING: no enabled authentication providers left." - : "")); - } - - @GET - @Path("authenticatedUsers/{identifier}/") - public Response getAuthenticatedUser(@PathParam("identifier") String identifier) { - AuthenticatedUser authenticatedUser = authSvc.getAuthenticatedUser(identifier); - if (authenticatedUser != null) { - return ok(json(authenticatedUser)); - } - return error(Response.Status.BAD_REQUEST, "User " + identifier + " not found."); - } - - @DELETE - @Path("authenticatedUsers/{identifier}/") - public Response deleteAuthenticatedUser(@PathParam("identifier") String identifier) { - AuthenticatedUser user = authSvc.getAuthenticatedUser(identifier); - if (user != null) { - authSvc.deleteAuthenticatedUser(user.getId()); - return ok("AuthenticatedUser " + identifier + " deleted. "); - } - return error(Response.Status.BAD_REQUEST, "User " + identifier + " not found."); - } - - @POST - @Path("publishDataverseAsCreator/{id}") - public Response publishDataverseAsCreator(@PathParam("id") long id) { - try { - Dataverse dataverse = dataverseSvc.find(id); - if (dataverse != null) { - AuthenticatedUser authenticatedUser = dataverse.getCreator(); - return ok(json(execCommand( - new PublishDataverseCommand(createDataverseRequest(authenticatedUser), dataverse)))); - } else { - return error(Status.BAD_REQUEST, "Could not find dataverse with id " + id); - } - } catch (WrappedResponse wr) { - return wr.getResponse(); - } - } - - @Deprecated - @GET - @Path("authenticatedUsers") - public Response listAuthenticatedUsers() { - try { - AuthenticatedUser user = findAuthenticatedUserOrDie(); - if (!user.isSuperuser()) { - return error(Response.Status.FORBIDDEN, "Superusers only."); - } - } catch (WrappedResponse ex) { - return error(Response.Status.FORBIDDEN, "Superusers only."); - } - JsonArrayBuilder userArray = Json.createArrayBuilder(); - authSvc.findAllAuthenticatedUsers().stream().forEach((user) -> { - userArray.add(json(user)); - }); - return ok(userArray); - } - - @GET - @Path(listUsersPartialAPIPath) - @Produces({ "application/json" }) - public Response filterAuthenticatedUsers(@QueryParam("searchTerm") String searchTerm, - @QueryParam("selectedPage") Integer selectedPage, @QueryParam("itemsPerPage") Integer itemsPerPage) { - - User authUser; - try { - authUser = this.findUserOrDie(); - } catch (AbstractApiBean.WrappedResponse ex) { - return error(Response.Status.FORBIDDEN, - BundleUtil.getStringFromBundle("dashboard.list_users.api.auth.invalid_apikey")); - } - - if (!authUser.isSuperuser()) { - return error(Response.Status.FORBIDDEN, - BundleUtil.getStringFromBundle("dashboard.list_users.api.auth.not_superuser")); - } - - UserListMaker userListMaker = new UserListMaker(userService); - - String sortKey = null; - UserListResult userListResult = userListMaker.runUserSearch(searchTerm, itemsPerPage, selectedPage, sortKey); - - return ok(userListResult.toJSON()); - } - - /** - * @todo Make this support creation of BuiltInUsers. - * - * @todo Add way more error checking. Only the happy path is tested by AdminIT. - */ - @POST - @Path("authenticatedUsers") - public Response createAuthenicatedUser(JsonObject jsonObject) { - logger.fine("JSON in: " + jsonObject); - String persistentUserId = jsonObject.getString("persistentUserId"); - String identifier = jsonObject.getString("identifier"); - String proposedAuthenticatedUserIdentifier = identifier.replaceFirst("@", ""); - String firstName = jsonObject.getString("firstName"); - String lastName = jsonObject.getString("lastName"); - String emailAddress = jsonObject.getString("email"); - String position = null; - String affiliation = null; - UserRecordIdentifier userRecordId = new UserRecordIdentifier(jsonObject.getString("authenticationProviderId"), - persistentUserId); - AuthenticatedUserDisplayInfo userDisplayInfo = new AuthenticatedUserDisplayInfo(firstName, lastName, - emailAddress, affiliation, position); - boolean generateUniqueIdentifier = true; - AuthenticatedUser authenticatedUser = authSvc.createAuthenticatedUser(userRecordId, - proposedAuthenticatedUserIdentifier, userDisplayInfo, true); - return ok(json(authenticatedUser)); - } + // Make the session available + @Inject + DataverseSession session; + + public static final String listUsersPartialAPIPath = "list-users"; + public static final String listUsersFullAPIPath = "/api/admin/" + listUsersPartialAPIPath; + + @Path("settings") + @GET + public Response listAllSettings() { + JsonObjectBuilder bld = jsonObjectBuilder(); + settingsSvc.listAll().forEach(s -> bld.add(s.getName(), s.getContent())); + return ok(bld); + } + + @Path("settings/{name}") + @PUT + public Response putSetting(@PathParam("name") String name, String content) { + Setting s = settingsSvc.set(name, content); + return ok(jsonObjectBuilder().add(s.getName(), s.getContent())); + } + + @Path("settings/{name}") + @GET + public Response getSetting(@PathParam("name") String name) { + String s = settingsSvc.get(name); + + return (s != null) ? ok(s) : notFound("Setting " + name + " not found"); + } + + @Path("settings/{name}") + @DELETE + public Response deleteSetting(@PathParam("name") String name) { + settingsSvc.delete(name); + + return ok("Setting " + name + " deleted."); + } + + @Path("authenticationProviderFactories") + @GET + public Response listAuthProviderFactories() { + return ok(authSvc.listProviderFactories().stream() + .map(f -> jsonObjectBuilder().add("alias", f.getAlias()).add("info", f.getInfo())) + .collect(toJsonArray())); + } + + @Path("authenticationProviders") + @GET + public Response listAuthProviders() { + return ok(em.createNamedQuery("AuthenticationProviderRow.findAll", AuthenticationProviderRow.class) + .getResultList().stream().map(r -> json(r)).collect(toJsonArray())); + } + + @Path("authenticationProviders") + @POST + public Response addProvider(AuthenticationProviderRow row) { + try { + AuthenticationProviderRow managed = em.find(AuthenticationProviderRow.class, row.getId()); + if (managed != null) { + managed = em.merge(row); + } else { + em.persist(row); + managed = row; + } + if (managed.isEnabled()) { + AuthenticationProvider provider = authSvc.loadProvider(managed); + authSvc.deregisterProvider(provider.getId()); + authSvc.registerProvider(provider); + } + return created("/api/admin/authenticationProviders/" + managed.getId(), json(managed)); + } catch (AuthorizationSetupException e) { + return error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); + } + } + + @Path("authenticationProviders/{id}") + @GET + public Response showProvider(@PathParam("id") String id) { + AuthenticationProviderRow row = em.find(AuthenticationProviderRow.class, id); + return (row != null) ? ok(json(row)) + : error(Status.NOT_FOUND, "Can't find authetication provider with id '" + id + "'"); + } + + @POST + @Path("authenticationProviders/{id}/:enabled") + public Response enableAuthenticationProvider_deprecated(@PathParam("id") String id, String body) { + return enableAuthenticationProvider(id, body); + } + + @PUT + @Path("authenticationProviders/{id}/enabled") + @Produces("application/json") + public Response enableAuthenticationProvider(@PathParam("id") String id, String body) { + body = body.trim(); + if (!Util.isBoolean(body)) { + return error(Response.Status.BAD_REQUEST, "Illegal value '" + body + "'. Use 'true' or 'false'"); + } + boolean enable = Util.isTrue(body); + + AuthenticationProviderRow row = em.find(AuthenticationProviderRow.class, id); + if (row == null) { + return notFound("Can't find authentication provider with id '" + id + "'"); + } + + row.setEnabled(enable); + em.merge(row); + + if (enable) { + // enable a provider + if (authSvc.getAuthenticationProvider(id) != null) { + return ok(String.format("Authentication provider '%s' already enabled", id)); + } + try { + authSvc.registerProvider(authSvc.loadProvider(row)); + return ok(String.format("Authentication Provider %s enabled", row.getId())); + + } catch (AuthenticationProviderFactoryNotFoundException ex) { + return notFound(String.format("Can't instantiate provider, as there's no factory with alias %s", + row.getFactoryAlias())); + } catch (AuthorizationSetupException ex) { + logger.log(Level.WARNING, "Error instantiating authentication provider: " + ex.getMessage(), ex); + return error(Status.INTERNAL_SERVER_ERROR, + String.format("Can't instantiate provider: %s", ex.getMessage())); + } + + } else { + // disable a provider + authSvc.deregisterProvider(id); + return ok("Authentication Provider '" + id + "' disabled. " + + (authSvc.getAuthenticationProviderIds().isEmpty() + ? "WARNING: no enabled authentication providers left." + : "")); + } + } + + @GET + @Path("authenticationProviders/{id}/enabled") + public Response checkAuthenticationProviderEnabled(@PathParam("id") String id) { + List prvs = em + .createNamedQuery("AuthenticationProviderRow.findById", AuthenticationProviderRow.class) + .setParameter("id", id).getResultList(); + if (prvs.isEmpty()) { + return notFound("Can't find a provider with id '" + id + "'."); + } else { + return ok(Boolean.toString(prvs.get(0).isEnabled())); + } + } + + @DELETE + @Path("authenticationProviders/{id}/") + public Response deleteAuthenticationProvider(@PathParam("id") String id) { + authSvc.deregisterProvider(id); + AuthenticationProviderRow row = em.find(AuthenticationProviderRow.class, id); + if (row != null) { + em.remove(row); + } + + return ok("AuthenticationProvider " + id + " deleted. " + + (authSvc.getAuthenticationProviderIds().isEmpty() + ? "WARNING: no enabled authentication providers left." + : "")); + } + + @GET + @Path("authenticatedUsers/{identifier}/") + public Response getAuthenticatedUser(@PathParam("identifier") String identifier) { + AuthenticatedUser authenticatedUser = authSvc.getAuthenticatedUser(identifier); + if (authenticatedUser != null) { + return ok(json(authenticatedUser)); + } + return error(Response.Status.BAD_REQUEST, "User " + identifier + " not found."); + } + + @DELETE + @Path("authenticatedUsers/{identifier}/") + public Response deleteAuthenticatedUser(@PathParam("identifier") String identifier) { + AuthenticatedUser user = authSvc.getAuthenticatedUser(identifier); + if (user != null) { + authSvc.deleteAuthenticatedUser(user.getId()); + return ok("AuthenticatedUser " + identifier + " deleted. "); + } + return error(Response.Status.BAD_REQUEST, "User " + identifier + " not found."); + } + + @POST + @Path("publishDataverseAsCreator/{id}") + public Response publishDataverseAsCreator(@PathParam("id") long id) { + try { + Dataverse dataverse = dataverseSvc.find(id); + if (dataverse != null) { + AuthenticatedUser authenticatedUser = dataverse.getCreator(); + return ok(json(execCommand( + new PublishDataverseCommand(createDataverseRequest(authenticatedUser), dataverse)))); + } else { + return error(Status.BAD_REQUEST, "Could not find dataverse with id " + id); + } + } catch (WrappedResponse wr) { + return wr.getResponse(); + } + } + + @Deprecated + @GET + @Path("authenticatedUsers") + public Response listAuthenticatedUsers() { + try { + AuthenticatedUser user = findAuthenticatedUserOrDie(); + if (!user.isSuperuser()) { + return error(Response.Status.FORBIDDEN, "Superusers only."); + } + } catch (WrappedResponse ex) { + return error(Response.Status.FORBIDDEN, "Superusers only."); + } + JsonArrayBuilder userArray = Json.createArrayBuilder(); + authSvc.findAllAuthenticatedUsers().stream().forEach((user) -> { + userArray.add(json(user)); + }); + return ok(userArray); + } + + @GET + @Path(listUsersPartialAPIPath) + @Produces({ "application/json" }) + public Response filterAuthenticatedUsers(@QueryParam("searchTerm") String searchTerm, + @QueryParam("selectedPage") Integer selectedPage, @QueryParam("itemsPerPage") Integer itemsPerPage) { + + User authUser; + try { + authUser = this.findUserOrDie(); + } catch (AbstractApiBean.WrappedResponse ex) { + return error(Response.Status.FORBIDDEN, + BundleUtil.getStringFromBundle("dashboard.list_users.api.auth.invalid_apikey")); + } + + if (!authUser.isSuperuser()) { + return error(Response.Status.FORBIDDEN, + BundleUtil.getStringFromBundle("dashboard.list_users.api.auth.not_superuser")); + } + + UserListMaker userListMaker = new UserListMaker(userService); + + String sortKey = null; + UserListResult userListResult = userListMaker.runUserSearch(searchTerm, itemsPerPage, selectedPage, sortKey); + + return ok(userListResult.toJSON()); + } + + /** + * @todo Make this support creation of BuiltInUsers. + * + * @todo Add way more error checking. Only the happy path is tested by AdminIT. + */ + @POST + @Path("authenticatedUsers") + public Response createAuthenicatedUser(JsonObject jsonObject) { + logger.fine("JSON in: " + jsonObject); + String persistentUserId = jsonObject.getString("persistentUserId"); + String identifier = jsonObject.getString("identifier"); + String proposedAuthenticatedUserIdentifier = identifier.replaceFirst("@", ""); + String firstName = jsonObject.getString("firstName"); + String lastName = jsonObject.getString("lastName"); + String emailAddress = jsonObject.getString("email"); + String position = null; + String affiliation = null; + UserRecordIdentifier userRecordId = new UserRecordIdentifier(jsonObject.getString("authenticationProviderId"), + persistentUserId); + AuthenticatedUserDisplayInfo userDisplayInfo = new AuthenticatedUserDisplayInfo(firstName, lastName, + emailAddress, affiliation, position); + boolean generateUniqueIdentifier = true; + AuthenticatedUser authenticatedUser = authSvc.createAuthenticatedUser(userRecordId, + proposedAuthenticatedUserIdentifier, userDisplayInfo, true); + return ok(json(authenticatedUser)); + } //TODO: Delete this endpoint after 4.9.3. Was updated with change in docs. --MAD - /** - * curl -X PUT -d "shib@mailinator.com" - * http://localhost:8080/api/admin/authenticatedUsers/id/11/convertShibToBuiltIn - * - * @deprecated We have documented this API endpoint so we'll keep in around for - * a while but we should encourage everyone to switch to the - * "convertRemoteToBuiltIn" endpoint and then remove this - * Shib-specfic one. - */ - @PUT - @Path("authenticatedUsers/id/{id}/convertShibToBuiltIn") - @Deprecated - public Response convertShibUserToBuiltin(@PathParam("id") Long id, String newEmailAddress) { + /** + * curl -X PUT -d "shib@mailinator.com" + * http://localhost:8080/api/admin/authenticatedUsers/id/11/convertShibToBuiltIn + * + * @deprecated We have documented this API endpoint so we'll keep in around for + * a while but we should encourage everyone to switch to the + * "convertRemoteToBuiltIn" endpoint and then remove this + * Shib-specfic one. + */ + @PUT + @Path("authenticatedUsers/id/{id}/convertShibToBuiltIn") + @Deprecated + public Response convertShibUserToBuiltin(@PathParam("id") Long id, String newEmailAddress) { try { AuthenticatedUser user = findAuthenticatedUserOrDie(); - if (!user.isSuperuser()) { - return error(Response.Status.FORBIDDEN, "Superusers only."); - } - } catch (WrappedResponse ex) { - return error(Response.Status.FORBIDDEN, "Superusers only."); - } - try { - BuiltinUser builtinUser = authSvc.convertRemoteToBuiltIn(id, newEmailAddress); - if (builtinUser == null) { - return error(Response.Status.BAD_REQUEST, "User id " + id - + " could not be converted from Shibboleth to BuiltIn. An Exception was not thrown."); - } + if (!user.isSuperuser()) { + return error(Response.Status.FORBIDDEN, "Superusers only."); + } + } catch (WrappedResponse ex) { + return error(Response.Status.FORBIDDEN, "Superusers only."); + } + try { + BuiltinUser builtinUser = authSvc.convertRemoteToBuiltIn(id, newEmailAddress); + if (builtinUser == null) { + return error(Response.Status.BAD_REQUEST, "User id " + id + + " could not be converted from Shibboleth to BuiltIn. An Exception was not thrown."); + } AuthenticatedUser authUser = authSvc.getAuthenticatedUser(builtinUser.getUserName()); - JsonObjectBuilder output = Json.createObjectBuilder(); - output.add("email", authUser.getEmail()); - output.add("username", builtinUser.getUserName()); - return ok(output); - } catch (Throwable ex) { - StringBuilder sb = new StringBuilder(); - sb.append(ex + " "); - while (ex.getCause() != null) { - ex = ex.getCause(); - sb.append(ex + " "); - } - String msg = "User id " + id - + " could not be converted from Shibboleth to BuiltIn. Details from Exception: " + sb; - logger.info(msg); - return error(Response.Status.BAD_REQUEST, msg); - } - } - - @PUT - @Path("authenticatedUsers/id/{id}/convertRemoteToBuiltIn") - public Response convertOAuthUserToBuiltin(@PathParam("id") Long id, String newEmailAddress) { + JsonObjectBuilder output = Json.createObjectBuilder(); + output.add("email", authUser.getEmail()); + output.add("username", builtinUser.getUserName()); + return ok(output); + } catch (Throwable ex) { + StringBuilder sb = new StringBuilder(); + sb.append(ex + " "); + while (ex.getCause() != null) { + ex = ex.getCause(); + sb.append(ex + " "); + } + String msg = "User id " + id + + " could not be converted from Shibboleth to BuiltIn. Details from Exception: " + sb; + logger.info(msg); + return error(Response.Status.BAD_REQUEST, msg); + } + } + + @PUT + @Path("authenticatedUsers/id/{id}/convertRemoteToBuiltIn") + public Response convertOAuthUserToBuiltin(@PathParam("id") Long id, String newEmailAddress) { try { - AuthenticatedUser user = findAuthenticatedUserOrDie(); - if (!user.isSuperuser()) { - return error(Response.Status.FORBIDDEN, "Superusers only."); - } - } catch (WrappedResponse ex) { - return error(Response.Status.FORBIDDEN, "Superusers only."); - } - try { - BuiltinUser builtinUser = authSvc.convertRemoteToBuiltIn(id, newEmailAddress); + AuthenticatedUser user = findAuthenticatedUserOrDie(); + if (!user.isSuperuser()) { + return error(Response.Status.FORBIDDEN, "Superusers only."); + } + } catch (WrappedResponse ex) { + return error(Response.Status.FORBIDDEN, "Superusers only."); + } + try { + BuiltinUser builtinUser = authSvc.convertRemoteToBuiltIn(id, newEmailAddress); //AuthenticatedUser authUser = authService.getAuthenticatedUser(aUser.getUserName()); - if (builtinUser == null) { - return error(Response.Status.BAD_REQUEST, "User id " + id - + " could not be converted from remote to BuiltIn. An Exception was not thrown."); - } + if (builtinUser == null) { + return error(Response.Status.BAD_REQUEST, "User id " + id + + " could not be converted from remote to BuiltIn. An Exception was not thrown."); + } AuthenticatedUser authUser = authSvc.getAuthenticatedUser(builtinUser.getUserName()); - JsonObjectBuilder output = Json.createObjectBuilder(); - output.add("email", authUser.getEmail()); - output.add("username", builtinUser.getUserName()); - return ok(output); - } catch (Throwable ex) { - StringBuilder sb = new StringBuilder(); - sb.append(ex + " "); - while (ex.getCause() != null) { - ex = ex.getCause(); - sb.append(ex + " "); - } - String msg = "User id " + id + " could not be converted from remote to BuiltIn. Details from Exception: " - + sb; - logger.info(msg); - return error(Response.Status.BAD_REQUEST, msg); - } - } - - /** - * This is used in testing via AdminIT.java but we don't expect sysadmins to use - * this. - */ - @Path("authenticatedUsers/convert/builtin2shib") - @PUT - public Response builtin2shib(String content) { - logger.info("entering builtin2shib..."); - try { - AuthenticatedUser userToRunThisMethod = findAuthenticatedUserOrDie(); - if (!userToRunThisMethod.isSuperuser()) { - return error(Response.Status.FORBIDDEN, "Superusers only."); - } - } catch (WrappedResponse ex) { - return error(Response.Status.FORBIDDEN, "Superusers only."); - } - boolean disabled = false; - if (disabled) { - return error(Response.Status.BAD_REQUEST, "API endpoint disabled."); - } - AuthenticatedUser builtInUserToConvert = null; - String emailToFind; - String password; - String authuserId = "0"; // could let people specify id on authuser table. probably better to let them - // tell us their - String newEmailAddressToUse; - try { - String[] args = content.split(":"); - emailToFind = args[0]; - password = args[1]; - newEmailAddressToUse = args[2]; - // authuserId = args[666]; - } catch (ArrayIndexOutOfBoundsException ex) { - return error(Response.Status.BAD_REQUEST, "Problem with content <<<" + content + ">>>: " + ex.toString()); - } - AuthenticatedUser existingAuthUserFoundByEmail = shibService.findAuthUserByEmail(emailToFind); - String existing = "NOT FOUND"; - if (existingAuthUserFoundByEmail != null) { - builtInUserToConvert = existingAuthUserFoundByEmail; - existing = existingAuthUserFoundByEmail.getIdentifier(); - } else { - long longToLookup = Long.parseLong(authuserId); - AuthenticatedUser specifiedUserToConvert = authSvc.findByID(longToLookup); - if (specifiedUserToConvert != null) { - builtInUserToConvert = specifiedUserToConvert; - } else { - return error(Response.Status.BAD_REQUEST, - "No user to convert. We couldn't find a *single* existing user account based on " + emailToFind - + " and no user was found using specified id " + longToLookup); - } - } - String shibProviderId = ShibAuthenticationProvider.PROVIDER_ID; - Map randomUser = authTestDataService.getRandomUser(); - // String eppn = UUID.randomUUID().toString().substring(0, 8); - String eppn = randomUser.get("eppn"); - String idPEntityId = randomUser.get("idp"); - String notUsed = null; - String separator = "|"; - UserIdentifier newUserIdentifierInLookupTable = new UserIdentifier(idPEntityId + separator + eppn, notUsed); - String overwriteFirstName = randomUser.get("firstName"); - String overwriteLastName = randomUser.get("lastName"); - String overwriteEmail = randomUser.get("email"); - overwriteEmail = newEmailAddressToUse; - logger.info("overwriteEmail: " + overwriteEmail); - boolean validEmail = EMailValidator.isEmailValid(overwriteEmail, null); - if (!validEmail) { - // See https://github.com/IQSS/dataverse/issues/2998 - return error(Response.Status.BAD_REQUEST, "invalid email: " + overwriteEmail); - } - /** - * @todo If affiliation is not null, put it in RoleAssigneeDisplayInfo - * constructor. - */ - /** - * Here we are exercising (via an API test) shibService.getAffiliation with the - * TestShib IdP and a non-production DevShibAccountType. - */ - idPEntityId = ShibUtil.testShibIdpEntityId; - String overwriteAffiliation = shibService.getAffiliation(idPEntityId, - ShibServiceBean.DevShibAccountType.RANDOM); - logger.info("overwriteAffiliation: " + overwriteAffiliation); - /** - * @todo Find a place to put "position" in the authenticateduser table: - * https://github.com/IQSS/dataverse/issues/1444#issuecomment-74134694 - */ - String overwritePosition = "staff;student"; - AuthenticatedUserDisplayInfo displayInfo = new AuthenticatedUserDisplayInfo(overwriteFirstName, - overwriteLastName, overwriteEmail, overwriteAffiliation, overwritePosition); - JsonObjectBuilder response = Json.createObjectBuilder(); - JsonArrayBuilder problems = Json.createArrayBuilder(); - if (password != null) { - response.add("password supplied", password); - boolean knowsExistingPassword = false; - BuiltinUser oldBuiltInUser = builtinUserService.findByUserName(builtInUserToConvert.getUserIdentifier()); - if (oldBuiltInUser != null) { - String usernameOfBuiltinAccountToConvert = oldBuiltInUser.getUserName(); - response.add("old username", usernameOfBuiltinAccountToConvert); - AuthenticatedUser authenticatedUser = authSvc.canLogInAsBuiltinUser(usernameOfBuiltinAccountToConvert, - password); - if (authenticatedUser != null) { - knowsExistingPassword = true; - AuthenticatedUser convertedUser = authSvc.convertBuiltInToShib(builtInUserToConvert, shibProviderId, - newUserIdentifierInLookupTable); - if (convertedUser != null) { - /** - * @todo Display name is not being overwritten. Logic must be in Shib backing - * bean - */ - AuthenticatedUser updatedInfoUser = authSvc.updateAuthenticatedUser(convertedUser, displayInfo); - if (updatedInfoUser != null) { - response.add("display name overwritten with", updatedInfoUser.getName()); - } else { - problems.add("couldn't update display info"); - } - } else { - problems.add("unable to convert user"); - } - } - } else { - problems.add("couldn't find old username"); - } - if (!knowsExistingPassword) { - String message = "User doesn't know password."; - problems.add(message); - /** - * @todo Someday we should make a errorResponse method that takes JSON arrays - * and objects. - */ - return error(Status.BAD_REQUEST, problems.build().toString()); - } - // response.add("knows existing password", knowsExistingPassword); - } - - response.add("user to convert", builtInUserToConvert.getIdentifier()); - response.add("existing user found by email (prompt to convert)", existing); - response.add("changing to this provider", shibProviderId); - response.add("value to overwrite old first name", overwriteFirstName); - response.add("value to overwrite old last name", overwriteLastName); - response.add("value to overwrite old email address", overwriteEmail); - if (overwriteAffiliation != null) { - response.add("affiliation", overwriteAffiliation); - } - response.add("problems", problems); - return ok(response); - } - - /** - * This is used in testing via AdminIT.java but we don't expect sysadmins to use - * this. - */ - @Path("authenticatedUsers/convert/builtin2oauth") - @PUT - public Response builtin2oauth(String content) { - logger.info("entering builtin2oauth..."); - try { - AuthenticatedUser userToRunThisMethod = findAuthenticatedUserOrDie(); - if (!userToRunThisMethod.isSuperuser()) { - return error(Response.Status.FORBIDDEN, "Superusers only."); - } - } catch (WrappedResponse ex) { - return error(Response.Status.FORBIDDEN, "Superusers only."); - } - boolean disabled = false; - if (disabled) { - return error(Response.Status.BAD_REQUEST, "API endpoint disabled."); - } - AuthenticatedUser builtInUserToConvert = null; - String emailToFind; - String password; - String authuserId = "0"; // could let people specify id on authuser table. probably better to let them - // tell us their - String newEmailAddressToUse; - String newProviderId; - String newPersistentUserIdInLookupTable; - logger.info("content: " + content); - try { - String[] args = content.split(":"); - emailToFind = args[0]; - password = args[1]; - newEmailAddressToUse = args[2]; - newProviderId = args[3]; - newPersistentUserIdInLookupTable = args[4]; - // authuserId = args[666]; - } catch (ArrayIndexOutOfBoundsException ex) { - return error(Response.Status.BAD_REQUEST, "Problem with content <<<" + content + ">>>: " + ex.toString()); - } - AuthenticatedUser existingAuthUserFoundByEmail = shibService.findAuthUserByEmail(emailToFind); - String existing = "NOT FOUND"; - if (existingAuthUserFoundByEmail != null) { - builtInUserToConvert = existingAuthUserFoundByEmail; - existing = existingAuthUserFoundByEmail.getIdentifier(); - } else { - long longToLookup = Long.parseLong(authuserId); - AuthenticatedUser specifiedUserToConvert = authSvc.findByID(longToLookup); - if (specifiedUserToConvert != null) { - builtInUserToConvert = specifiedUserToConvert; - } else { - return error(Response.Status.BAD_REQUEST, - "No user to convert. We couldn't find a *single* existing user account based on " + emailToFind - + " and no user was found using specified id " + longToLookup); - } - } - // String shibProviderId = ShibAuthenticationProvider.PROVIDER_ID; - Map randomUser = authTestDataService.getRandomUser(); - // String eppn = UUID.randomUUID().toString().substring(0, 8); - String eppn = randomUser.get("eppn"); - String idPEntityId = randomUser.get("idp"); - String notUsed = null; - String separator = "|"; - // UserIdentifier newUserIdentifierInLookupTable = new - // UserIdentifier(idPEntityId + separator + eppn, notUsed); - UserIdentifier newUserIdentifierInLookupTable = new UserIdentifier(newPersistentUserIdInLookupTable, notUsed); - String overwriteFirstName = randomUser.get("firstName"); - String overwriteLastName = randomUser.get("lastName"); - String overwriteEmail = randomUser.get("email"); - overwriteEmail = newEmailAddressToUse; - logger.info("overwriteEmail: " + overwriteEmail); - boolean validEmail = EMailValidator.isEmailValid(overwriteEmail, null); - if (!validEmail) { - // See https://github.com/IQSS/dataverse/issues/2998 - return error(Response.Status.BAD_REQUEST, "invalid email: " + overwriteEmail); - } - /** - * @todo If affiliation is not null, put it in RoleAssigneeDisplayInfo - * constructor. - */ - /** - * Here we are exercising (via an API test) shibService.getAffiliation with the - * TestShib IdP and a non-production DevShibAccountType. - */ - // idPEntityId = ShibUtil.testShibIdpEntityId; - // String overwriteAffiliation = shibService.getAffiliation(idPEntityId, - // ShibServiceBean.DevShibAccountType.RANDOM); - String overwriteAffiliation = null; - logger.info("overwriteAffiliation: " + overwriteAffiliation); - /** - * @todo Find a place to put "position" in the authenticateduser table: - * https://github.com/IQSS/dataverse/issues/1444#issuecomment-74134694 - */ - String overwritePosition = "staff;student"; - AuthenticatedUserDisplayInfo displayInfo = new AuthenticatedUserDisplayInfo(overwriteFirstName, - overwriteLastName, overwriteEmail, overwriteAffiliation, overwritePosition); - JsonObjectBuilder response = Json.createObjectBuilder(); - JsonArrayBuilder problems = Json.createArrayBuilder(); - if (password != null) { - response.add("password supplied", password); - boolean knowsExistingPassword = false; - BuiltinUser oldBuiltInUser = builtinUserService.findByUserName(builtInUserToConvert.getUserIdentifier()); - if (oldBuiltInUser != null) { - String usernameOfBuiltinAccountToConvert = oldBuiltInUser.getUserName(); - response.add("old username", usernameOfBuiltinAccountToConvert); - AuthenticatedUser authenticatedUser = authSvc.canLogInAsBuiltinUser(usernameOfBuiltinAccountToConvert, - password); - if (authenticatedUser != null) { - knowsExistingPassword = true; - AuthenticatedUser convertedUser = authSvc.convertBuiltInUserToRemoteUser(builtInUserToConvert, - newProviderId, newUserIdentifierInLookupTable); - if (convertedUser != null) { - /** - * @todo Display name is not being overwritten. Logic must be in Shib backing - * bean - */ - AuthenticatedUser updatedInfoUser = authSvc.updateAuthenticatedUser(convertedUser, displayInfo); - if (updatedInfoUser != null) { - response.add("display name overwritten with", updatedInfoUser.getName()); - } else { - problems.add("couldn't update display info"); - } - } else { - problems.add("unable to convert user"); - } - } - } else { - problems.add("couldn't find old username"); - } - if (!knowsExistingPassword) { - String message = "User doesn't know password."; - problems.add(message); - /** - * @todo Someday we should make a errorResponse method that takes JSON arrays - * and objects. - */ - return error(Status.BAD_REQUEST, problems.build().toString()); - } - // response.add("knows existing password", knowsExistingPassword); - } - - response.add("user to convert", builtInUserToConvert.getIdentifier()); - response.add("existing user found by email (prompt to convert)", existing); - response.add("changing to this provider", newProviderId); - response.add("value to overwrite old first name", overwriteFirstName); - response.add("value to overwrite old last name", overwriteLastName); - response.add("value to overwrite old email address", overwriteEmail); - if (overwriteAffiliation != null) { - response.add("affiliation", overwriteAffiliation); - } - response.add("problems", problems); - return ok(response); - } - - @DELETE - @Path("authenticatedUsers/id/{id}/") - public Response deleteAuthenticatedUserById(@PathParam("id") Long id) { - AuthenticatedUser user = authSvc.findByID(id); - if (user != null) { - authSvc.deleteAuthenticatedUser(user.getId()); - return ok("AuthenticatedUser " + id + " deleted. "); - } - return error(Response.Status.BAD_REQUEST, "User " + id + " not found."); - } - - @Path("roles") - @POST - public Response createNewBuiltinRole(RoleDTO roleDto) { - ActionLogRecord alr = new ActionLogRecord(ActionLogRecord.ActionType.Admin, "createBuiltInRole") - .setInfo(roleDto.getAlias() + ":" + roleDto.getDescription()); - try { - return ok(json(rolesSvc.save(roleDto.asRole()))); - } catch (Exception e) { - alr.setActionResult(ActionLogRecord.Result.InternalError); - alr.setInfo(alr.getInfo() + "// " + e.getMessage()); - return error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); - } finally { - actionLogSvc.log(alr); - } - } - - @Path("roles") - @GET - public Response listBuiltinRoles() { - try { - return ok(rolesToJson(rolesSvc.findBuiltinRoles())); - } catch (Exception e) { - return error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); - } - } - - @Path("superuser/{identifier}") - @POST - public Response toggleSuperuser(@PathParam("identifier") String identifier) { - ActionLogRecord alr = new ActionLogRecord(ActionLogRecord.ActionType.Admin, "toggleSuperuser") - .setInfo(identifier); - try { - AuthenticatedUser user = authSvc.getAuthenticatedUser(identifier); - - user.setSuperuser(!user.isSuperuser()); - - return ok("User " + user.getIdentifier() + " " + (user.isSuperuser() ? "set" : "removed") - + " as a superuser."); - } catch (Exception e) { - alr.setActionResult(ActionLogRecord.Result.InternalError); - alr.setInfo(alr.getInfo() + "// " + e.getMessage()); - return error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); - } finally { - actionLogSvc.log(alr); - } - } - - @Path("validate") - @GET - public Response validate() { - String msg = "UNKNOWN"; - try { - beanValidationSvc.validateDatasets(); - msg = "valid"; - } catch (Exception ex) { - Throwable cause = ex; - while (cause != null) { - if (cause instanceof ConstraintViolationException) { - ConstraintViolationException constraintViolationException = (ConstraintViolationException) cause; - for (ConstraintViolation constraintViolation : constraintViolationException - .getConstraintViolations()) { - String databaseRow = constraintViolation.getLeafBean().toString(); - String field = constraintViolation.getPropertyPath().toString(); - String invalidValue = constraintViolation.getInvalidValue().toString(); - JsonObjectBuilder violation = Json.createObjectBuilder(); - violation.add("entityClassDatabaseTableRowId", databaseRow); - violation.add("field", field); - violation.add("invalidValue", invalidValue); - return ok(violation); - } - } - cause = cause.getCause(); - } - } - return ok(msg); - } - - @Path("assignments/assignees/{raIdtf: .*}") - @GET - public Response getAssignmentsFor(@PathParam("raIdtf") String raIdtf) { - - JsonArrayBuilder arr = Json.createArrayBuilder(); - roleAssigneeSvc.getAssignmentsFor(raIdtf).forEach(a -> arr.add(json(a))); - - return ok(arr); - } - - /** - * This method is used in integration tests. - * - * @param userId - * The database id of an AuthenticatedUser. - * @return The confirm email token. - */ - @Path("confirmEmail/{userId}") - @GET - public Response getConfirmEmailToken(@PathParam("userId") long userId) { - AuthenticatedUser user = authSvc.findByID(userId); - if (user != null) { - ConfirmEmailData confirmEmailData = confirmEmailSvc.findSingleConfirmEmailDataByUser(user); - if (confirmEmailData != null) { - return ok(Json.createObjectBuilder().add("token", confirmEmailData.getToken())); - } - } - return error(Status.BAD_REQUEST, "Could not find confirm email token for user " + userId); - } - - /** - * This method is used in integration tests. - * - * @param userId - * The database id of an AuthenticatedUser. - */ - @Path("confirmEmail/{userId}") - @POST - public Response startConfirmEmailProcess(@PathParam("userId") long userId) { - AuthenticatedUser user = authSvc.findByID(userId); - if (user != null) { - try { - ConfirmEmailInitResponse confirmEmailInitResponse = confirmEmailSvc.beginConfirm(user); - ConfirmEmailData confirmEmailData = confirmEmailInitResponse.getConfirmEmailData(); - return ok(Json.createObjectBuilder().add("tokenCreated", confirmEmailData.getCreated().toString()) - .add("identifier", user.getUserIdentifier())); - } catch (ConfirmEmailException ex) { - return error(Status.BAD_REQUEST, - "Could not start confirm email process for user " + userId + ": " + ex.getLocalizedMessage()); - } - } - return error(Status.BAD_REQUEST, "Could not find user based on " + userId); - } - - /** - * This method is used by an integration test in UsersIT.java to exercise bug - * https://github.com/IQSS/dataverse/issues/3287 . Not for use by users! - */ - @Path("convertUserFromBcryptToSha1") - @POST - public Response convertUserFromBcryptToSha1(String json) { - JsonReader jsonReader = Json.createReader(new StringReader(json)); - JsonObject object = jsonReader.readObject(); - jsonReader.close(); - BuiltinUser builtinUser = builtinUserService.find(new Long(object.getInt("builtinUserId"))); - builtinUser.updateEncryptedPassword("4G7xxL9z11/JKN4jHPn4g9iIQck=", 0); // password is "sha-1Pass", 0 means - // SHA-1 - BuiltinUser savedUser = builtinUserService.save(builtinUser); - return ok("foo: " + savedUser); - - } - - @Path("permissions/{dvo}") - @GET - public Response findPermissonsOn(@PathParam("dvo") String dvo) { - try { - DvObject dvObj = findDvo(dvo); - if (dvObj == null) { - return notFound("DvObject " + dvo + " not found"); - } - try { - User aUser = findUserOrDie(); - JsonObjectBuilder bld = Json.createObjectBuilder(); - bld.add("user", aUser.getIdentifier()); - bld.add("permissions", json(permissionSvc.permissionsFor(createDataverseRequest(aUser), dvObj))); - return ok(bld); - - } catch (WrappedResponse wr) { - return wr.getResponse(); - } - } catch (Exception e) { - logger.log(Level.SEVERE, "Error while testing permissions", e); - return error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); - } - } - - @Path("assignee/{idtf}") - @GET - public Response findRoleAssignee(@PathParam("idtf") String idtf) { - RoleAssignee ra = roleAssigneeSvc.getRoleAssignee(idtf); - return (ra == null) ? notFound("Role Assignee '" + idtf + "' not found.") : ok(json(ra.getDisplayInfo())); - } - - @Path("datasets/integrity/{datasetVersionId}/fixmissingunf") - @POST - public Response fixUnf(@PathParam("datasetVersionId") String datasetVersionId, - @QueryParam("forceRecalculate") boolean forceRecalculate) { - JsonObjectBuilder info = datasetVersionSvc.fixMissingUnf(datasetVersionId, forceRecalculate); - return ok(info); - } - - @Path("datafiles/integrity/fixmissingoriginaltypes") - @GET - public Response fixMissingOriginalTypes() { - JsonObjectBuilder info = Json.createObjectBuilder(); - - List affectedFileIds = fileService.selectFilesWithMissingOriginalTypes(); - - if (affectedFileIds.isEmpty()) { - info.add("message", - "All the tabular files in the database already have the original types set correctly; exiting."); - } else { - for (Long fileid : affectedFileIds) { - logger.info("found file id: " + fileid); - } - info.add("message", "Found " + affectedFileIds.size() - + " tabular files with missing original types. Kicking off an async job that will repair the files in the background."); - } - - ingestService.fixMissingOriginalTypes(affectedFileIds); - - return ok(info); - } - - /** - * This method is used in API tests, called from UtilIt.java. - */ - @GET - @Path("datasets/thumbnailMetadata/{id}") - public Response getDatasetThumbnailMetadata(@PathParam("id") Long idSupplied) { - Dataset dataset = datasetSvc.find(idSupplied); - if (dataset == null) { - return error(Response.Status.NOT_FOUND, "Could not find dataset based on id supplied: " + idSupplied + "."); - } - JsonObjectBuilder data = Json.createObjectBuilder(); - DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(); - data.add("isUseGenericThumbnail", dataset.isUseGenericThumbnail()); - data.add("datasetLogoPresent", DatasetUtil.isDatasetLogoPresent(dataset)); - if (datasetThumbnail != null) { - data.add("datasetThumbnailBase64image", datasetThumbnail.getBase64image()); - DataFile dataFile = datasetThumbnail.getDataFile(); - if (dataFile != null) { - /** - * @todo Change this from a String to a long. - */ - data.add("dataFileId", dataFile.getId().toString()); - } - } - return ok(data); - } - - /** - * validatePassword - *

- * Validate a password with an API call - * - * @param password - * The password - * @return A response with the validation result. - */ - @Path("validatePassword") - @POST - public Response validatePassword(String password) { - - final List errors = passwordValidatorService.validate(password, new Date(), false); - final JsonArrayBuilder errorArray = Json.createArrayBuilder(); - errors.forEach(errorArray::add); - return ok(Json.createObjectBuilder().add("password", password).add("errors", errorArray)); - } - - @GET - @Path("/isOrcid") - public Response isOrcidEnabled() { - return authSvc.isOrcidEnabled() ? ok("Orcid is enabled") : ok("no orcid for you."); - } + JsonObjectBuilder output = Json.createObjectBuilder(); + output.add("email", authUser.getEmail()); + output.add("username", builtinUser.getUserName()); + return ok(output); + } catch (Throwable ex) { + StringBuilder sb = new StringBuilder(); + sb.append(ex + " "); + while (ex.getCause() != null) { + ex = ex.getCause(); + sb.append(ex + " "); + } + String msg = "User id " + id + " could not be converted from remote to BuiltIn. Details from Exception: " + + sb; + logger.info(msg); + return error(Response.Status.BAD_REQUEST, msg); + } + } + + /** + * This is used in testing via AdminIT.java but we don't expect sysadmins to use + * this. + */ + @Path("authenticatedUsers/convert/builtin2shib") + @PUT + public Response builtin2shib(String content) { + logger.info("entering builtin2shib..."); + try { + AuthenticatedUser userToRunThisMethod = findAuthenticatedUserOrDie(); + if (!userToRunThisMethod.isSuperuser()) { + return error(Response.Status.FORBIDDEN, "Superusers only."); + } + } catch (WrappedResponse ex) { + return error(Response.Status.FORBIDDEN, "Superusers only."); + } + boolean disabled = false; + if (disabled) { + return error(Response.Status.BAD_REQUEST, "API endpoint disabled."); + } + AuthenticatedUser builtInUserToConvert = null; + String emailToFind; + String password; + String authuserId = "0"; // could let people specify id on authuser table. probably better to let them + // tell us their + String newEmailAddressToUse; + try { + String[] args = content.split(":"); + emailToFind = args[0]; + password = args[1]; + newEmailAddressToUse = args[2]; + // authuserId = args[666]; + } catch (ArrayIndexOutOfBoundsException ex) { + return error(Response.Status.BAD_REQUEST, "Problem with content <<<" + content + ">>>: " + ex.toString()); + } + AuthenticatedUser existingAuthUserFoundByEmail = shibService.findAuthUserByEmail(emailToFind); + String existing = "NOT FOUND"; + if (existingAuthUserFoundByEmail != null) { + builtInUserToConvert = existingAuthUserFoundByEmail; + existing = existingAuthUserFoundByEmail.getIdentifier(); + } else { + long longToLookup = Long.parseLong(authuserId); + AuthenticatedUser specifiedUserToConvert = authSvc.findByID(longToLookup); + if (specifiedUserToConvert != null) { + builtInUserToConvert = specifiedUserToConvert; + } else { + return error(Response.Status.BAD_REQUEST, + "No user to convert. We couldn't find a *single* existing user account based on " + emailToFind + + " and no user was found using specified id " + longToLookup); + } + } + String shibProviderId = ShibAuthenticationProvider.PROVIDER_ID; + Map randomUser = authTestDataService.getRandomUser(); + // String eppn = UUID.randomUUID().toString().substring(0, 8); + String eppn = randomUser.get("eppn"); + String idPEntityId = randomUser.get("idp"); + String notUsed = null; + String separator = "|"; + UserIdentifier newUserIdentifierInLookupTable = new UserIdentifier(idPEntityId + separator + eppn, notUsed); + String overwriteFirstName = randomUser.get("firstName"); + String overwriteLastName = randomUser.get("lastName"); + String overwriteEmail = randomUser.get("email"); + overwriteEmail = newEmailAddressToUse; + logger.info("overwriteEmail: " + overwriteEmail); + boolean validEmail = EMailValidator.isEmailValid(overwriteEmail, null); + if (!validEmail) { + // See https://github.com/IQSS/dataverse/issues/2998 + return error(Response.Status.BAD_REQUEST, "invalid email: " + overwriteEmail); + } + /** + * @todo If affiliation is not null, put it in RoleAssigneeDisplayInfo + * constructor. + */ + /** + * Here we are exercising (via an API test) shibService.getAffiliation with the + * TestShib IdP and a non-production DevShibAccountType. + */ + idPEntityId = ShibUtil.testShibIdpEntityId; + String overwriteAffiliation = shibService.getAffiliation(idPEntityId, + ShibServiceBean.DevShibAccountType.RANDOM); + logger.info("overwriteAffiliation: " + overwriteAffiliation); + /** + * @todo Find a place to put "position" in the authenticateduser table: + * https://github.com/IQSS/dataverse/issues/1444#issuecomment-74134694 + */ + String overwritePosition = "staff;student"; + AuthenticatedUserDisplayInfo displayInfo = new AuthenticatedUserDisplayInfo(overwriteFirstName, + overwriteLastName, overwriteEmail, overwriteAffiliation, overwritePosition); + JsonObjectBuilder response = Json.createObjectBuilder(); + JsonArrayBuilder problems = Json.createArrayBuilder(); + if (password != null) { + response.add("password supplied", password); + boolean knowsExistingPassword = false; + BuiltinUser oldBuiltInUser = builtinUserService.findByUserName(builtInUserToConvert.getUserIdentifier()); + if (oldBuiltInUser != null) { + String usernameOfBuiltinAccountToConvert = oldBuiltInUser.getUserName(); + response.add("old username", usernameOfBuiltinAccountToConvert); + AuthenticatedUser authenticatedUser = authSvc.canLogInAsBuiltinUser(usernameOfBuiltinAccountToConvert, + password); + if (authenticatedUser != null) { + knowsExistingPassword = true; + AuthenticatedUser convertedUser = authSvc.convertBuiltInToShib(builtInUserToConvert, shibProviderId, + newUserIdentifierInLookupTable); + if (convertedUser != null) { + /** + * @todo Display name is not being overwritten. Logic must be in Shib backing + * bean + */ + AuthenticatedUser updatedInfoUser = authSvc.updateAuthenticatedUser(convertedUser, displayInfo); + if (updatedInfoUser != null) { + response.add("display name overwritten with", updatedInfoUser.getName()); + } else { + problems.add("couldn't update display info"); + } + } else { + problems.add("unable to convert user"); + } + } + } else { + problems.add("couldn't find old username"); + } + if (!knowsExistingPassword) { + String message = "User doesn't know password."; + problems.add(message); + /** + * @todo Someday we should make a errorResponse method that takes JSON arrays + * and objects. + */ + return error(Status.BAD_REQUEST, problems.build().toString()); + } + // response.add("knows existing password", knowsExistingPassword); + } + + response.add("user to convert", builtInUserToConvert.getIdentifier()); + response.add("existing user found by email (prompt to convert)", existing); + response.add("changing to this provider", shibProviderId); + response.add("value to overwrite old first name", overwriteFirstName); + response.add("value to overwrite old last name", overwriteLastName); + response.add("value to overwrite old email address", overwriteEmail); + if (overwriteAffiliation != null) { + response.add("affiliation", overwriteAffiliation); + } + response.add("problems", problems); + return ok(response); + } + + /** + * This is used in testing via AdminIT.java but we don't expect sysadmins to use + * this. + */ + @Path("authenticatedUsers/convert/builtin2oauth") + @PUT + public Response builtin2oauth(String content) { + logger.info("entering builtin2oauth..."); + try { + AuthenticatedUser userToRunThisMethod = findAuthenticatedUserOrDie(); + if (!userToRunThisMethod.isSuperuser()) { + return error(Response.Status.FORBIDDEN, "Superusers only."); + } + } catch (WrappedResponse ex) { + return error(Response.Status.FORBIDDEN, "Superusers only."); + } + boolean disabled = false; + if (disabled) { + return error(Response.Status.BAD_REQUEST, "API endpoint disabled."); + } + AuthenticatedUser builtInUserToConvert = null; + String emailToFind; + String password; + String authuserId = "0"; // could let people specify id on authuser table. probably better to let them + // tell us their + String newEmailAddressToUse; + String newProviderId; + String newPersistentUserIdInLookupTable; + logger.info("content: " + content); + try { + String[] args = content.split(":"); + emailToFind = args[0]; + password = args[1]; + newEmailAddressToUse = args[2]; + newProviderId = args[3]; + newPersistentUserIdInLookupTable = args[4]; + // authuserId = args[666]; + } catch (ArrayIndexOutOfBoundsException ex) { + return error(Response.Status.BAD_REQUEST, "Problem with content <<<" + content + ">>>: " + ex.toString()); + } + AuthenticatedUser existingAuthUserFoundByEmail = shibService.findAuthUserByEmail(emailToFind); + String existing = "NOT FOUND"; + if (existingAuthUserFoundByEmail != null) { + builtInUserToConvert = existingAuthUserFoundByEmail; + existing = existingAuthUserFoundByEmail.getIdentifier(); + } else { + long longToLookup = Long.parseLong(authuserId); + AuthenticatedUser specifiedUserToConvert = authSvc.findByID(longToLookup); + if (specifiedUserToConvert != null) { + builtInUserToConvert = specifiedUserToConvert; + } else { + return error(Response.Status.BAD_REQUEST, + "No user to convert. We couldn't find a *single* existing user account based on " + emailToFind + + " and no user was found using specified id " + longToLookup); + } + } + // String shibProviderId = ShibAuthenticationProvider.PROVIDER_ID; + Map randomUser = authTestDataService.getRandomUser(); + // String eppn = UUID.randomUUID().toString().substring(0, 8); + String eppn = randomUser.get("eppn"); + String idPEntityId = randomUser.get("idp"); + String notUsed = null; + String separator = "|"; + // UserIdentifier newUserIdentifierInLookupTable = new + // UserIdentifier(idPEntityId + separator + eppn, notUsed); + UserIdentifier newUserIdentifierInLookupTable = new UserIdentifier(newPersistentUserIdInLookupTable, notUsed); + String overwriteFirstName = randomUser.get("firstName"); + String overwriteLastName = randomUser.get("lastName"); + String overwriteEmail = randomUser.get("email"); + overwriteEmail = newEmailAddressToUse; + logger.info("overwriteEmail: " + overwriteEmail); + boolean validEmail = EMailValidator.isEmailValid(overwriteEmail, null); + if (!validEmail) { + // See https://github.com/IQSS/dataverse/issues/2998 + return error(Response.Status.BAD_REQUEST, "invalid email: " + overwriteEmail); + } + /** + * @todo If affiliation is not null, put it in RoleAssigneeDisplayInfo + * constructor. + */ + /** + * Here we are exercising (via an API test) shibService.getAffiliation with the + * TestShib IdP and a non-production DevShibAccountType. + */ + // idPEntityId = ShibUtil.testShibIdpEntityId; + // String overwriteAffiliation = shibService.getAffiliation(idPEntityId, + // ShibServiceBean.DevShibAccountType.RANDOM); + String overwriteAffiliation = null; + logger.info("overwriteAffiliation: " + overwriteAffiliation); + /** + * @todo Find a place to put "position" in the authenticateduser table: + * https://github.com/IQSS/dataverse/issues/1444#issuecomment-74134694 + */ + String overwritePosition = "staff;student"; + AuthenticatedUserDisplayInfo displayInfo = new AuthenticatedUserDisplayInfo(overwriteFirstName, + overwriteLastName, overwriteEmail, overwriteAffiliation, overwritePosition); + JsonObjectBuilder response = Json.createObjectBuilder(); + JsonArrayBuilder problems = Json.createArrayBuilder(); + if (password != null) { + response.add("password supplied", password); + boolean knowsExistingPassword = false; + BuiltinUser oldBuiltInUser = builtinUserService.findByUserName(builtInUserToConvert.getUserIdentifier()); + if (oldBuiltInUser != null) { + String usernameOfBuiltinAccountToConvert = oldBuiltInUser.getUserName(); + response.add("old username", usernameOfBuiltinAccountToConvert); + AuthenticatedUser authenticatedUser = authSvc.canLogInAsBuiltinUser(usernameOfBuiltinAccountToConvert, + password); + if (authenticatedUser != null) { + knowsExistingPassword = true; + AuthenticatedUser convertedUser = authSvc.convertBuiltInUserToRemoteUser(builtInUserToConvert, + newProviderId, newUserIdentifierInLookupTable); + if (convertedUser != null) { + /** + * @todo Display name is not being overwritten. Logic must be in Shib backing + * bean + */ + AuthenticatedUser updatedInfoUser = authSvc.updateAuthenticatedUser(convertedUser, displayInfo); + if (updatedInfoUser != null) { + response.add("display name overwritten with", updatedInfoUser.getName()); + } else { + problems.add("couldn't update display info"); + } + } else { + problems.add("unable to convert user"); + } + } + } else { + problems.add("couldn't find old username"); + } + if (!knowsExistingPassword) { + String message = "User doesn't know password."; + problems.add(message); + /** + * @todo Someday we should make a errorResponse method that takes JSON arrays + * and objects. + */ + return error(Status.BAD_REQUEST, problems.build().toString()); + } + // response.add("knows existing password", knowsExistingPassword); + } + + response.add("user to convert", builtInUserToConvert.getIdentifier()); + response.add("existing user found by email (prompt to convert)", existing); + response.add("changing to this provider", newProviderId); + response.add("value to overwrite old first name", overwriteFirstName); + response.add("value to overwrite old last name", overwriteLastName); + response.add("value to overwrite old email address", overwriteEmail); + if (overwriteAffiliation != null) { + response.add("affiliation", overwriteAffiliation); + } + response.add("problems", problems); + return ok(response); + } + + @DELETE + @Path("authenticatedUsers/id/{id}/") + public Response deleteAuthenticatedUserById(@PathParam("id") Long id) { + AuthenticatedUser user = authSvc.findByID(id); + if (user != null) { + authSvc.deleteAuthenticatedUser(user.getId()); + return ok("AuthenticatedUser " + id + " deleted. "); + } + return error(Response.Status.BAD_REQUEST, "User " + id + " not found."); + } + + @Path("roles") + @POST + public Response createNewBuiltinRole(RoleDTO roleDto) { + ActionLogRecord alr = new ActionLogRecord(ActionLogRecord.ActionType.Admin, "createBuiltInRole") + .setInfo(roleDto.getAlias() + ":" + roleDto.getDescription()); + try { + return ok(json(rolesSvc.save(roleDto.asRole()))); + } catch (Exception e) { + alr.setActionResult(ActionLogRecord.Result.InternalError); + alr.setInfo(alr.getInfo() + "// " + e.getMessage()); + return error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); + } finally { + actionLogSvc.log(alr); + } + } + + @Path("roles") + @GET + public Response listBuiltinRoles() { + try { + return ok(rolesToJson(rolesSvc.findBuiltinRoles())); + } catch (Exception e) { + return error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); + } + } + + @Path("superuser/{identifier}") + @POST + public Response toggleSuperuser(@PathParam("identifier") String identifier) { + ActionLogRecord alr = new ActionLogRecord(ActionLogRecord.ActionType.Admin, "toggleSuperuser") + .setInfo(identifier); + try { + AuthenticatedUser user = authSvc.getAuthenticatedUser(identifier); + + user.setSuperuser(!user.isSuperuser()); + + return ok("User " + user.getIdentifier() + " " + (user.isSuperuser() ? "set" : "removed") + + " as a superuser."); + } catch (Exception e) { + alr.setActionResult(ActionLogRecord.Result.InternalError); + alr.setInfo(alr.getInfo() + "// " + e.getMessage()); + return error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); + } finally { + actionLogSvc.log(alr); + } + } + + @Path("validate") + @GET + public Response validate() { + String msg = "UNKNOWN"; + try { + beanValidationSvc.validateDatasets(); + msg = "valid"; + } catch (Exception ex) { + Throwable cause = ex; + while (cause != null) { + if (cause instanceof ConstraintViolationException) { + ConstraintViolationException constraintViolationException = (ConstraintViolationException) cause; + for (ConstraintViolation constraintViolation : constraintViolationException + .getConstraintViolations()) { + String databaseRow = constraintViolation.getLeafBean().toString(); + String field = constraintViolation.getPropertyPath().toString(); + String invalidValue = constraintViolation.getInvalidValue().toString(); + JsonObjectBuilder violation = Json.createObjectBuilder(); + violation.add("entityClassDatabaseTableRowId", databaseRow); + violation.add("field", field); + violation.add("invalidValue", invalidValue); + return ok(violation); + } + } + cause = cause.getCause(); + } + } + return ok(msg); + } + + @Path("assignments/assignees/{raIdtf: .*}") + @GET + public Response getAssignmentsFor(@PathParam("raIdtf") String raIdtf) { + + JsonArrayBuilder arr = Json.createArrayBuilder(); + roleAssigneeSvc.getAssignmentsFor(raIdtf).forEach(a -> arr.add(json(a))); + + return ok(arr); + } + + /** + * This method is used in integration tests. + * + * @param userId + * The database id of an AuthenticatedUser. + * @return The confirm email token. + */ + @Path("confirmEmail/{userId}") + @GET + public Response getConfirmEmailToken(@PathParam("userId") long userId) { + AuthenticatedUser user = authSvc.findByID(userId); + if (user != null) { + ConfirmEmailData confirmEmailData = confirmEmailSvc.findSingleConfirmEmailDataByUser(user); + if (confirmEmailData != null) { + return ok(Json.createObjectBuilder().add("token", confirmEmailData.getToken())); + } + } + return error(Status.BAD_REQUEST, "Could not find confirm email token for user " + userId); + } + + /** + * This method is used in integration tests. + * + * @param userId + * The database id of an AuthenticatedUser. + */ + @Path("confirmEmail/{userId}") + @POST + public Response startConfirmEmailProcess(@PathParam("userId") long userId) { + AuthenticatedUser user = authSvc.findByID(userId); + if (user != null) { + try { + ConfirmEmailInitResponse confirmEmailInitResponse = confirmEmailSvc.beginConfirm(user); + ConfirmEmailData confirmEmailData = confirmEmailInitResponse.getConfirmEmailData(); + return ok(Json.createObjectBuilder().add("tokenCreated", confirmEmailData.getCreated().toString()) + .add("identifier", user.getUserIdentifier())); + } catch (ConfirmEmailException ex) { + return error(Status.BAD_REQUEST, + "Could not start confirm email process for user " + userId + ": " + ex.getLocalizedMessage()); + } + } + return error(Status.BAD_REQUEST, "Could not find user based on " + userId); + } + + /** + * This method is used by an integration test in UsersIT.java to exercise bug + * https://github.com/IQSS/dataverse/issues/3287 . Not for use by users! + */ + @Path("convertUserFromBcryptToSha1") + @POST + public Response convertUserFromBcryptToSha1(String json) { + JsonReader jsonReader = Json.createReader(new StringReader(json)); + JsonObject object = jsonReader.readObject(); + jsonReader.close(); + BuiltinUser builtinUser = builtinUserService.find(new Long(object.getInt("builtinUserId"))); + builtinUser.updateEncryptedPassword("4G7xxL9z11/JKN4jHPn4g9iIQck=", 0); // password is "sha-1Pass", 0 means + // SHA-1 + BuiltinUser savedUser = builtinUserService.save(builtinUser); + return ok("foo: " + savedUser); + + } + + @Path("permissions/{dvo}") + @GET + public Response findPermissonsOn(@PathParam("dvo") String dvo) { + try { + DvObject dvObj = findDvo(dvo); + if (dvObj == null) { + return notFound("DvObject " + dvo + " not found"); + } + try { + User aUser = findUserOrDie(); + JsonObjectBuilder bld = Json.createObjectBuilder(); + bld.add("user", aUser.getIdentifier()); + bld.add("permissions", json(permissionSvc.permissionsFor(createDataverseRequest(aUser), dvObj))); + return ok(bld); + + } catch (WrappedResponse wr) { + return wr.getResponse(); + } + } catch (Exception e) { + logger.log(Level.SEVERE, "Error while testing permissions", e); + return error(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage()); + } + } + + @Path("assignee/{idtf}") + @GET + public Response findRoleAssignee(@PathParam("idtf") String idtf) { + RoleAssignee ra = roleAssigneeSvc.getRoleAssignee(idtf); + return (ra == null) ? notFound("Role Assignee '" + idtf + "' not found.") : ok(json(ra.getDisplayInfo())); + } + + @Path("datasets/integrity/{datasetVersionId}/fixmissingunf") + @POST + public Response fixUnf(@PathParam("datasetVersionId") String datasetVersionId, + @QueryParam("forceRecalculate") boolean forceRecalculate) { + JsonObjectBuilder info = datasetVersionSvc.fixMissingUnf(datasetVersionId, forceRecalculate); + return ok(info); + } + + @Path("datafiles/integrity/fixmissingoriginaltypes") + @GET + public Response fixMissingOriginalTypes() { + JsonObjectBuilder info = Json.createObjectBuilder(); + + List affectedFileIds = fileService.selectFilesWithMissingOriginalTypes(); + + if (affectedFileIds.isEmpty()) { + info.add("message", + "All the tabular files in the database already have the original types set correctly; exiting."); + } else { + for (Long fileid : affectedFileIds) { + logger.info("found file id: " + fileid); + } + info.add("message", "Found " + affectedFileIds.size() + + " tabular files with missing original types. Kicking off an async job that will repair the files in the background."); + } + + ingestService.fixMissingOriginalTypes(affectedFileIds); + + return ok(info); + } + + /** + * This method is used in API tests, called from UtilIt.java. + */ + @GET + @Path("datasets/thumbnailMetadata/{id}") + public Response getDatasetThumbnailMetadata(@PathParam("id") Long idSupplied) { + Dataset dataset = datasetSvc.find(idSupplied); + if (dataset == null) { + return error(Response.Status.NOT_FOUND, "Could not find dataset based on id supplied: " + idSupplied + "."); + } + JsonObjectBuilder data = Json.createObjectBuilder(); + DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(); + data.add("isUseGenericThumbnail", dataset.isUseGenericThumbnail()); + data.add("datasetLogoPresent", DatasetUtil.isDatasetLogoPresent(dataset)); + if (datasetThumbnail != null) { + data.add("datasetThumbnailBase64image", datasetThumbnail.getBase64image()); + DataFile dataFile = datasetThumbnail.getDataFile(); + if (dataFile != null) { + /** + * @todo Change this from a String to a long. + */ + data.add("dataFileId", dataFile.getId().toString()); + } + } + return ok(data); + } + + /** + * validatePassword + *

+ * Validate a password with an API call + * + * @param password + * The password + * @return A response with the validation result. + */ + @Path("validatePassword") + @POST + public Response validatePassword(String password) { + + final List errors = passwordValidatorService.validate(password, new Date(), false); + final JsonArrayBuilder errorArray = Json.createArrayBuilder(); + errors.forEach(errorArray::add); + return ok(Json.createObjectBuilder().add("password", password).add("errors", errorArray)); + } + + @GET + @Path("/isOrcid") + public Response isOrcidEnabled() { + return authSvc.isOrcidEnabled() ? ok("Orcid is enabled") : ok("no orcid for you."); + } @POST @Path("{id}/reregisterHDLToPID") @@ -1086,202 +1086,202 @@ public Response reregisterHdlToPID(@PathParam("id") String id) { return ok(BundleUtil.getStringFromBundle("admin.api.migrateHDL.success")); } - @GET - @Path("{id}/registerDataFile") - public Response registerDataFile(@PathParam("id") String id) { - logger.info("Starting to register " + id + " file id. " + new Date()); - - try { - User u = findUserOrDie(); - DataverseRequest r = createDataverseRequest(u); - DataFile df = findDataFileOrDie(id); - if (df.getIdentifier() == null || df.getIdentifier().isEmpty()) { - execCommand(new RegisterDvObjectCommand(r, df)); - } else { - return ok("File was already registered. "); - } - - } catch (WrappedResponse r) { - logger.info("Failed to register file id: " + id); - } catch (Exception e) { - logger.info("Failed to register file id: " + id + " Unexpecgted Exception " + e.getMessage()); - } - return ok("Datafile registration complete. File registered successfully."); - } - - @GET - @Path("/registerDataFileAll") - public Response registerDataFileAll() { - Integer count = fileService.findAll().size(); - Integer successes = 0; - Integer alreadyRegistered = 0; - Integer released = 0; - Integer draft = 0; - logger.info("Starting to register: analyzing " + count + " files. " + new Date()); - logger.info("Only unregistered, published files will be registered."); - for (DataFile df : fileService.findAll()) { - try { - if ((df.getIdentifier() == null || df.getIdentifier().isEmpty())) { - if (df.isReleased()) { - released++; - User u = findAuthenticatedUserOrDie(); - DataverseRequest r = createDataverseRequest(u); - execCommand(new RegisterDvObjectCommand(r, df)); - successes++; - if (successes % 100 == 0) { - logger.info(successes + " of " + count + " files registered successfully. " + new Date()); - } - } else { - draft++; - logger.info(draft + " of " + count + " files not yet published"); - } - } else { - alreadyRegistered++; - logger.info(alreadyRegistered + " of " + count + " files are already registered. " + new Date()); - } - } catch (WrappedResponse ex) { - released++; - logger.info("Failed to register file id: " + df.getId()); - Logger.getLogger(Datasets.class.getName()).log(Level.SEVERE, null, ex); - } catch (Exception e) { - logger.info("Unexpected Exception: " + e.getMessage()); - } - } - logger.info("Final Results:"); - logger.info(alreadyRegistered + " of " + count + " files were already registered. " + new Date()); - logger.info(draft + " of " + count + " files are not yet published. " + new Date()); - logger.info(released + " of " + count + " unregistered, published files to register. " + new Date()); - logger.info(successes + " of " + released + " unregistered, published files registered successfully. " - + new Date()); - - return ok("Datafile registration complete." + successes + " of " + released - + " unregistered, published files registered successfully."); - } - - @GET - @Path("/updateHashValues/{alg}") - public Response updateHashValues(@PathParam("alg") String alg, @QueryParam("num") int num) { - Integer count = fileService.findAll().size(); - Integer successes = 0; - Integer alreadyUpdated = 0; - Integer rehashed = 0; - Integer harvested=0; - - if (num <= 0) - num = Integer.MAX_VALUE; - DataFile.ChecksumType cType = null; - try { - cType = DataFile.ChecksumType.fromString(alg); - } catch (IllegalArgumentException iae) { - return error(Status.BAD_REQUEST, "Unknown algorithm"); - } - logger.info("Starting to rehash: analyzing " + count + " files. " + new Date()); - logger.info("Hashes not created with " + alg + " will be verified, and, if valid, replaced with a hash using " - + alg); - try { - User u = findAuthenticatedUserOrDie(); - if (!u.isSuperuser()) - return error(Status.UNAUTHORIZED, "must be superuser"); - } catch (WrappedResponse e1) { - return error(Status.UNAUTHORIZED, "api key required"); - } - - for (DataFile df : fileService.findAll()) { - if (rehashed.intValue() >= num) - break; - InputStream in = null; - InputStream in2 = null; - try { - if (df.isHarvested()) { - harvested++; - } else { - if (!df.getChecksumType().equals(cType)) { - - rehashed++; - logger.fine(rehashed + ": Datafile: " + df.getFileMetadata().getLabel() + ", " - + df.getIdentifier()); - // verify hash and calc new one to replace it - StorageIO storage = df.getStorageIO(); - storage.open(DataAccessOption.READ_ACCESS); - if (!df.isTabularData()) { - in = storage.getInputStream(); - } else { - // if this is a tabular file, read the preserved original "auxiliary file" - // instead: - in = storage.getAuxFileAsInputStream(FileUtil.SAVED_ORIGINAL_FILENAME_EXTENSION); - } - if (in == null) - logger.warning("Cannot retrieve file."); - String currentChecksum = FileUtil.CalculateChecksum(in, df.getChecksumType()); - if (currentChecksum.equals(df.getChecksumValue())) { - logger.fine("Current checksum for datafile: " + df.getFileMetadata().getLabel() + ", " - + df.getIdentifier() + " is valid"); - storage.open(DataAccessOption.READ_ACCESS); - if (!df.isTabularData()) { - in2 = storage.getInputStream(); - } else { - // if this is a tabular file, read the preserved original "auxiliary file" - // instead: - in2 = storage.getAuxFileAsInputStream(FileUtil.SAVED_ORIGINAL_FILENAME_EXTENSION); - } - if (in2 == null) - logger.warning("Cannot retrieve file to calculate new checksum."); - String newChecksum = FileUtil.CalculateChecksum(in2, cType); - - df.setChecksumType(cType); - df.setChecksumValue(newChecksum); - successes++; - if (successes % 100 == 0) { - logger.info( - successes + " of " + count + " files rehashed successfully. " + new Date()); - } - } else { - logger.warning("Problem: Current checksum for datafile: " + df.getFileMetadata().getLabel() - + ", " + df.getIdentifier() + " is INVALID"); - } - } else { - alreadyUpdated++; - if (alreadyUpdated % 100 == 0) { - logger.info(alreadyUpdated + " of " + count - + " files are already have hashes with the new algorithm. " + new Date()); - } - } - } - } catch (Exception e) { - logger.warning("Unexpected Exception: " + e.getMessage()); - - } finally { - IOUtils.closeQuietly(in); - IOUtils.closeQuietly(in2); - } - } - logger.info("Final Results:"); - logger.info(harvested + " harvested files skipped."); - logger.info( - alreadyUpdated + " of " + count + " files already had hashes with the new algorithm. " + new Date()); - logger.info(rehashed + " of " + count + " files to rehash. " + new Date()); - logger.info( - successes + " of " + rehashed + " files successfully rehashed with the new algorithm. " + new Date()); - - return ok("Datafile rehashing complete." + successes + " of " + rehashed + " files successfully rehashed."); - } - - - @DELETE - @Path("/clearMetricsCache") - public Response clearMetricsCache() { - em.createNativeQuery("DELETE FROM metric").executeUpdate(); - return ok("all metric caches cleared."); - } - - @DELETE - @Path("/clearMetricsCache/{name}") - public Response clearMetricsCacheByName(@PathParam("name") String name) { - Query deleteQuery = em.createNativeQuery("DELETE FROM metric where metricname = ?"); - deleteQuery.setParameter(1, name); - deleteQuery.executeUpdate(); - return ok("metric cache " + name + " cleared."); - } + @GET + @Path("{id}/registerDataFile") + public Response registerDataFile(@PathParam("id") String id) { + logger.info("Starting to register " + id + " file id. " + new Date()); + + try { + User u = findUserOrDie(); + DataverseRequest r = createDataverseRequest(u); + DataFile df = findDataFileOrDie(id); + if (df.getIdentifier() == null || df.getIdentifier().isEmpty()) { + execCommand(new RegisterDvObjectCommand(r, df)); + } else { + return ok("File was already registered. "); + } + + } catch (WrappedResponse r) { + logger.info("Failed to register file id: " + id); + } catch (Exception e) { + logger.info("Failed to register file id: " + id + " Unexpecgted Exception " + e.getMessage()); + } + return ok("Datafile registration complete. File registered successfully."); + } + + @GET + @Path("/registerDataFileAll") + public Response registerDataFileAll() { + Integer count = fileService.findAll().size(); + Integer successes = 0; + Integer alreadyRegistered = 0; + Integer released = 0; + Integer draft = 0; + logger.info("Starting to register: analyzing " + count + " files. " + new Date()); + logger.info("Only unregistered, published files will be registered."); + for (DataFile df : fileService.findAll()) { + try { + if ((df.getIdentifier() == null || df.getIdentifier().isEmpty())) { + if (df.isReleased()) { + released++; + User u = findAuthenticatedUserOrDie(); + DataverseRequest r = createDataverseRequest(u); + execCommand(new RegisterDvObjectCommand(r, df)); + successes++; + if (successes % 100 == 0) { + logger.info(successes + " of " + count + " files registered successfully. " + new Date()); + } + } else { + draft++; + logger.info(draft + " of " + count + " files not yet published"); + } + } else { + alreadyRegistered++; + logger.info(alreadyRegistered + " of " + count + " files are already registered. " + new Date()); + } + } catch (WrappedResponse ex) { + released++; + logger.info("Failed to register file id: " + df.getId()); + Logger.getLogger(Datasets.class.getName()).log(Level.SEVERE, null, ex); + } catch (Exception e) { + logger.info("Unexpected Exception: " + e.getMessage()); + } + } + logger.info("Final Results:"); + logger.info(alreadyRegistered + " of " + count + " files were already registered. " + new Date()); + logger.info(draft + " of " + count + " files are not yet published. " + new Date()); + logger.info(released + " of " + count + " unregistered, published files to register. " + new Date()); + logger.info(successes + " of " + released + " unregistered, published files registered successfully. " + + new Date()); + + return ok("Datafile registration complete." + successes + " of " + released + + " unregistered, published files registered successfully."); + } + + @GET + @Path("/updateHashValues/{alg}") + public Response updateHashValues(@PathParam("alg") String alg, @QueryParam("num") int num) { + Integer count = fileService.findAll().size(); + Integer successes = 0; + Integer alreadyUpdated = 0; + Integer rehashed = 0; + Integer harvested=0; + + if (num <= 0) + num = Integer.MAX_VALUE; + DataFile.ChecksumType cType = null; + try { + cType = DataFile.ChecksumType.fromString(alg); + } catch (IllegalArgumentException iae) { + return error(Status.BAD_REQUEST, "Unknown algorithm"); + } + logger.info("Starting to rehash: analyzing " + count + " files. " + new Date()); + logger.info("Hashes not created with " + alg + " will be verified, and, if valid, replaced with a hash using " + + alg); + try { + User u = findAuthenticatedUserOrDie(); + if (!u.isSuperuser()) + return error(Status.UNAUTHORIZED, "must be superuser"); + } catch (WrappedResponse e1) { + return error(Status.UNAUTHORIZED, "api key required"); + } + + for (DataFile df : fileService.findAll()) { + if (rehashed.intValue() >= num) + break; + InputStream in = null; + InputStream in2 = null; + try { + if (df.isHarvested()) { + harvested++; + } else { + if (!df.getChecksumType().equals(cType)) { + + rehashed++; + logger.fine(rehashed + ": Datafile: " + df.getFileMetadata().getLabel() + ", " + + df.getIdentifier()); + // verify hash and calc new one to replace it + StorageIO storage = df.getStorageIO(); + storage.open(DataAccessOption.READ_ACCESS); + if (!df.isTabularData()) { + in = storage.getInputStream(); + } else { + // if this is a tabular file, read the preserved original "auxiliary file" + // instead: + in = storage.getAuxFileAsInputStream(FileUtil.SAVED_ORIGINAL_FILENAME_EXTENSION); + } + if (in == null) + logger.warning("Cannot retrieve file."); + String currentChecksum = FileUtil.CalculateChecksum(in, df.getChecksumType()); + if (currentChecksum.equals(df.getChecksumValue())) { + logger.fine("Current checksum for datafile: " + df.getFileMetadata().getLabel() + ", " + + df.getIdentifier() + " is valid"); + storage.open(DataAccessOption.READ_ACCESS); + if (!df.isTabularData()) { + in2 = storage.getInputStream(); + } else { + // if this is a tabular file, read the preserved original "auxiliary file" + // instead: + in2 = storage.getAuxFileAsInputStream(FileUtil.SAVED_ORIGINAL_FILENAME_EXTENSION); + } + if (in2 == null) + logger.warning("Cannot retrieve file to calculate new checksum."); + String newChecksum = FileUtil.CalculateChecksum(in2, cType); + + df.setChecksumType(cType); + df.setChecksumValue(newChecksum); + successes++; + if (successes % 100 == 0) { + logger.info( + successes + " of " + count + " files rehashed successfully. " + new Date()); + } + } else { + logger.warning("Problem: Current checksum for datafile: " + df.getFileMetadata().getLabel() + + ", " + df.getIdentifier() + " is INVALID"); + } + } else { + alreadyUpdated++; + if (alreadyUpdated % 100 == 0) { + logger.info(alreadyUpdated + " of " + count + + " files are already have hashes with the new algorithm. " + new Date()); + } + } + } + } catch (Exception e) { + logger.warning("Unexpected Exception: " + e.getMessage()); + + } finally { + IOUtils.closeQuietly(in); + IOUtils.closeQuietly(in2); + } + } + logger.info("Final Results:"); + logger.info(harvested + " harvested files skipped."); + logger.info( + alreadyUpdated + " of " + count + " files already had hashes with the new algorithm. " + new Date()); + logger.info(rehashed + " of " + count + " files to rehash. " + new Date()); + logger.info( + successes + " of " + rehashed + " files successfully rehashed with the new algorithm. " + new Date()); + + return ok("Datafile rehashing complete." + successes + " of " + rehashed + " files successfully rehashed."); + } + + + @DELETE + @Path("/clearMetricsCache") + public Response clearMetricsCache() { + em.createNativeQuery("DELETE FROM metric").executeUpdate(); + return ok("all metric caches cleared."); + } + + @DELETE + @Path("/clearMetricsCache/{name}") + public Response clearMetricsCacheByName(@PathParam("name") String name) { + Query deleteQuery = em.createNativeQuery("DELETE FROM metric where metricname = ?"); + deleteQuery.setParameter(1, name); + deleteQuery.executeUpdate(); + return ok("metric cache " + name + " cleared."); + } @GET @Path("/dataverse/{alias}/addRoleAssignmentsToChildren") diff --git a/src/main/java/edu/harvard/iq/dataverse/api/BundleDownloadInstanceWriter.java b/src/main/java/edu/harvard/iq/dataverse/api/BundleDownloadInstanceWriter.java index c306da51231..0670e7b01a3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/BundleDownloadInstanceWriter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/BundleDownloadInstanceWriter.java @@ -47,8 +47,6 @@ public long getSize(BundleDownloadInstance di, Class clazz, Type type, Annota return -1; } - - @Override public void writeTo(BundleDownloadInstance di, Class clazz, Type type, Annotation[] annotation, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream outstream) throws IOException, WebApplicationException { @@ -116,8 +114,16 @@ public void writeTo(BundleDownloadInstance di, Class clazz, Type type, Annota logger.warning("failed to retrieve saved original for " + fileName); } finally { if (instream != null) { - try {instream.close();} catch (IOException ioex) {} - try {zout.closeEntry();} catch (IOException ioex) {} + try { + instream.close(); + } catch (IOException ioex) { + + } + try { + zout.closeEntry(); + } catch (IOException ioex) { + + } } } @@ -150,8 +156,16 @@ public void writeTo(BundleDownloadInstance di, Class clazz, Type type, Annota logger.warning("failed to convert tabular data file "+fileName+" to RData."); } finally { if (instream != null) { - try{instream.close();}catch(IOException ioex){} - try{zout.closeEntry();}catch(IOException ioex){} + try { + instream.close(); + } catch(IOException ioex) { + + } + try { + zout.closeEntry(); + } catch(IOException ioex) { + + } } } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInfo.java b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInfo.java index aa67f358a63..7a6d7c40db8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInfo.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInfo.java @@ -145,7 +145,7 @@ public String getFileName() { } public List getServicesAvailable() { - return optionalServicesAvailable; + return optionalServicesAvailable; } public void addServiceAvailable(OptionalAccessService accessService) { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java index fab2538832e..c687f77a32d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DownloadInstanceWriter.java @@ -222,7 +222,11 @@ public void writeTo(DownloadInstance di, Class clazz, Type type, Annotation[] // emphasizes that it is very important not to leave these // lying around un-closed, since they are going to fill // up the S3 connection pool! - try {storageIO.getInputStream().close();} catch (IOException ioex) {} + try { + storageIO.getInputStream().close(); + } catch (IOException ioex) { + + } // [attempt to] redirect: String redirect_url_str; try { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java b/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java index cb28d1fae49..8502cee285a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java @@ -122,7 +122,7 @@ public Response oaiSet(@PathParam("specname") String spec, @QueryParam("key") St @Path("{specname}") public Response createOaiSet(String jsonBody, @PathParam("specname") String spec, @QueryParam("key") String apiKey) throws IOException, JsonParseException { /* - * authorization modeled after the UI (aka HarvestingSetsPage) + * authorization modeled after the UI (aka HarvestingSetsPage) */ AuthenticatedUser dvUser; try { @@ -135,53 +135,51 @@ public Response createOaiSet(String jsonBody, @PathParam("specname") String spec } StringReader rdr = new StringReader(jsonBody); - - try( JsonReader jrdr = Json.createReader(rdr) ) - { - JsonObject json = jrdr.readObject(); - OAISet set = new OAISet(); - //Validating spec - if (!StringUtils.isEmpty(spec)) { - if (spec.length() > 30) { - return badRequest(BundleUtil.getStringFromBundle("harvestserver.newSetDialog.setspec.sizelimit")); - } - if (!Pattern.matches("^[a-zA-Z0-9\\_\\-]+$", spec)) { - return badRequest(BundleUtil.getStringFromBundle("harvestserver.newSetDialog.setspec.invalid")); - // If it passes the regex test, check - } - if (oaiSetService.findBySpec(spec) != null) { - return badRequest(BundleUtil.getStringFromBundle("harvestserver.newSetDialog.setspec.alreadyused")); - } + try (JsonReader jrdr = Json.createReader(rdr)) { + JsonObject json = jrdr.readObject(); + OAISet set = new OAISet(); + // Validating spec + if (!StringUtils.isEmpty(spec)) { + if (spec.length() > 30) { + return badRequest(BundleUtil.getStringFromBundle("harvestserver.newSetDialog.setspec.sizelimit")); + } + if (!Pattern.matches("^[a-zA-Z0-9\\_\\-]+$", spec)) { + return badRequest(BundleUtil.getStringFromBundle("harvestserver.newSetDialog.setspec.invalid")); + // If it passes the regex test, check + } + if (oaiSetService.findBySpec(spec) != null) { + return badRequest(BundleUtil.getStringFromBundle("harvestserver.newSetDialog.setspec.alreadyused")); + } + } else { + return badRequest(BundleUtil.getStringFromBundle("harvestserver.newSetDialog.setspec.required")); + } + set.setSpec(spec); + String name, desc, defn; + + try { + name = json.getString("name"); + } catch (NullPointerException npe_name) { + return badRequest(BundleUtil.getStringFromBundle("harvestserver.newSetDialog.setspec.required")); + } - } else { - return badRequest(BundleUtil.getStringFromBundle("harvestserver.newSetDialog.setspec.required")); - } - set.setSpec(spec); - String name, desc, defn; + try { + defn = json.getString("definition"); + } catch (NullPointerException npe_defn) { + throw new JsonParseException("definition unspecified"); + } - try { - name = json.getString("name"); - } catch (NullPointerException npe_name) { - return badRequest(BundleUtil.getStringFromBundle("harvestserver.newSetDialog.setspec.required")); - } - try { - defn = json.getString("definition"); - } catch (NullPointerException npe_defn) { - throw new JsonParseException("definition unspecified"); - } - try { - desc = json.getString("description"); - } catch (NullPointerException npe_desc) { - desc = ""; //treating description as optional - } - set.setName(name); - set.setDescription(desc); - set.setDefinition(defn); - oaiSetService.save(set); - return created("/harvest/server/oaisets" + spec, oaiSetAsJson(set)); - } - + try { + desc = json.getString("description"); + } catch (NullPointerException npe_desc) { + desc = ""; //treating description as optional + } + set.setName(name); + set.setDescription(desc); + set.setDefinition(defn); + oaiSetService.save(set); + return created("/harvest/server/oaisets" + spec, oaiSetAsJson(set)); + } } @PUT diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Metadata.java b/src/main/java/edu/harvard/iq/dataverse/api/Metadata.java index 5084b5267a4..61b6c682acd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Metadata.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Metadata.java @@ -67,31 +67,23 @@ public Response reExportAll() { */ @PUT @Path("/exportOAI/{specname}") - public Response exportOaiSet( @PathParam("specname") String spec ) - { - // assuming this belongs here (because it's a metadata export), but open to moving it elsewhere - OAISet set = null; - try - { - set = oaiSetService.findBySpec(spec); - } - catch(Exception ex) - { - return error(Response.Status.BAD_REQUEST,"bad request / invalid OAI set"); - } - if ( null == set ) - { - return error(Response.Status.NOT_FOUND, "unable to find specified OAI set"); - } - try - { - oaiSetService.setUpdateInProgress( set.getId() ); - oaiSetService.exportOaiSetAsync(set); - return ok("export started"); - } - catch( Exception ex ) - { - return error(Response.Status.BAD_REQUEST, "problem exporting OAI set"); - } + public Response exportOaiSet(@PathParam("specname") String spec) { + // assuming this belongs here (because it's a metadata export), but open to moving it elsewhere + OAISet set = null; + try { + set = oaiSetService.findBySpec(spec); + } catch(Exception ex) { + return error(Response.Status.BAD_REQUEST,"bad request / invalid OAI set"); + } + if (null == set) { + return error(Response.Status.NOT_FOUND, "unable to find specified OAI set"); + } + try { + oaiSetService.setUpdateInProgress(set.getId()); + oaiSetService.exportOaiSetAsync(set); + return ok("export started"); + } catch(Exception ex) { + return error(Response.Status.BAD_REQUEST, "problem exporting OAI set"); + } } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Roles.java b/src/main/java/edu/harvard/iq/dataverse/api/Roles.java index b3f75e00c5a..0a152c927d9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Roles.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Roles.java @@ -23,40 +23,40 @@ @Stateless @Path("roles") public class Roles extends AbstractApiBean { - - @GET - @Path("{id}") - public Response viewRole( @PathParam("id") Long id) { - return response( ()-> { - final User user = findUserOrDie(); - final DataverseRole role = findRoleOrDie(id); - return ( permissionSvc.userOn(user, role.getOwner()).has(Permission.ManageDataversePermissions) ) - ? ok( json(role) ) : permissionError("Permission required to view roles."); - }); - } - - @DELETE - @Path("{id}") - public Response deleteRole( @PathParam("id") Long id ) { - return response( req -> { - execCommand( new DeleteRoleCommand(req, findRoleOrDie(id)) ); - return ok("role " + id + " deleted."); - }); - } - - @POST - public Response createNewRole( RoleDTO roleDto, - @QueryParam("dvo") String dvoIdtf ) { - return response( req -> ok(json(execCommand( - new CreateRoleCommand(roleDto.asRole(), + @GET + @Path("{id}") + public Response viewRole(@PathParam("id") Long id) { + return response(()-> { + final User user = findUserOrDie(); + final DataverseRole role = findRoleOrDie(id); + return (permissionSvc.userOn(user, role.getOwner()).has(Permission.ManageDataversePermissions)) + ? ok(json(role)) + : permissionError("Permission required to view roles."); + }); + } + + @DELETE + @Path("{id}") + public Response deleteRole(@PathParam("id") Long id) { + return response(req -> { + execCommand(new DeleteRoleCommand(req, findRoleOrDie(id))); + return ok("role " + id + " deleted."); + }); + } + + @POST + public Response createNewRole(RoleDTO roleDto, + @QueryParam("dvo") String dvoIdtf) { + return response(req -> ok(json(execCommand( + new CreateRoleCommand(roleDto.asRole(), req,findDataverseOrDie(dvoIdtf)))))); - } + } - private DataverseRole findRoleOrDie( long id ) throws WrappedResponse { - DataverseRole role = rolesSvc.find(id); - if ( role != null ) { - return role; - } - throw new WrappedResponse(notFound( "role with id " + id + " not found")); - } + private DataverseRole findRoleOrDie(long id) throws WrappedResponse { + DataverseRole role = rolesSvc.find(id); + if (role != null) { + return role; + } + throw new WrappedResponse(notFound("role with id " + id + " not found")); + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Util.java b/src/main/java/edu/harvard/iq/dataverse/api/Util.java index 82adedc709f..d5030d4ad35 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Util.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Util.java @@ -29,17 +29,17 @@ public class Util { VALID_BOOLEAN_VALUES.add("0"); } - static JsonArray asJsonArray( String str ) { + static JsonArray asJsonArray(String str) { try ( JsonReader rdr = Json.createReader(new StringReader(str)) ) { return rdr.readArray(); } } - static boolean isBoolean( String s ) { + static boolean isBoolean(String s) { return VALID_BOOLEAN_VALUES.contains(s.toLowerCase()); } - static boolean isTrue( String s ) { + static boolean isTrue(String s) { return BOOLEAN_TRUE_VALUES.contains(s.toLowerCase()); } @@ -63,23 +63,21 @@ static boolean isTrue( String s ) { * http://apiux.com/2013/03/20/5-laws-api-dates-and-times/ * */ - private static final String DATE_TIME_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss'Z'"; + private static final String DATE_TIME_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss'Z'"; private static final String DATE_FORMAT_STRING = "yyyy-MM-dd"; - private static final ThreadLocal DATETIME_FORMAT_TL = new ThreadLocal(){ + private static final ThreadLocal DATETIME_FORMAT_TL = new ThreadLocal() { @Override - protected SimpleDateFormat initialValue() - { + protected SimpleDateFormat initialValue() { SimpleDateFormat format = new SimpleDateFormat(DATE_TIME_FORMAT_STRING); format.setTimeZone(TimeZone.getTimeZone("UTC")); return format; } }; - private static final ThreadLocal DATE_FORMAT_TL = new ThreadLocal(){ + private static final ThreadLocal DATE_FORMAT_TL = new ThreadLocal() { @Override - protected SimpleDateFormat initialValue() - { + protected SimpleDateFormat initialValue() { SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT_STRING); format.setTimeZone(TimeZone.getTimeZone("UTC")); return format; @@ -108,9 +106,9 @@ public static SimpleDateFormat getDateFormat() { * @return */ - public static List removeDuplicatesNullsEmptyStrings(List stringsToCheck){ + public static List removeDuplicatesNullsEmptyStrings(List stringsToCheck) { - if (stringsToCheck == null){ + if (stringsToCheck == null) { throw new NullPointerException("stringsToCheck cannot be null"); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/WorldMapRelatedData.java b/src/main/java/edu/harvard/iq/dataverse/api/WorldMapRelatedData.java index e9868f91cee..1e5a57739d6 100755 --- a/src/main/java/edu/harvard/iq/dataverse/api/WorldMapRelatedData.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/WorldMapRelatedData.java @@ -205,9 +205,8 @@ private Response mapDataFileTokenOnlyOption(@Context HttpServletRequest request if (user==null){ return error(Response.Status.FORBIDDEN, "Not logged in"); } - - - if (true){ + + if (true) { //return okResponse( "Looks good " + datafile_id); //tokenAppServiceBean.getGeoConnectApplication(); //return okResponse("Currently deactivated (mapDataFile)"); @@ -215,26 +214,26 @@ private Response mapDataFileTokenOnlyOption(@Context HttpServletRequest request // Check if the user exists AuthenticatedUser dvUser = dataverseUserService.findByID(dvuser_id); - if ( dvUser == null ){ + if (dvUser == null) { return error(Response.Status.FORBIDDEN, "Invalid user"); } // Check if this file exists DataFile dfile = dataFileService.find(datafile_id); - if (dfile==null){ + if (dfile==null) { return error(Response.Status.NOT_FOUND, "DataFile not found for id: " + datafile_id); } /* Is the dataset public? */ - if (!dfile.getOwner().isReleased()){ + if (!dfile.getOwner().isReleased()) { return error(Response.Status.FORBIDDEN, "Mapping is only permitted for public datasets/files"); } // Does this user have permission to edit metadata for this file? - if (!permissionService.request(createDataverseRequest(dvUser)).on(dfile.getOwner()).has(Permission.EditDataset)){ + if (!permissionService.request(createDataverseRequest(dvUser)).on(dfile.getOwner()).has(Permission.EditDataset)) { String errMsg = "The user does not have permission to edit metadata for this file."; return error(Response.Status.FORBIDDEN, errMsg); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetDTO.java b/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetDTO.java index 87564c96637..d4415cd9778 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetDTO.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetDTO.java @@ -8,17 +8,17 @@ * @author michael */ public class DatasetDTO implements java.io.Serializable { - private String id; - private String identifier; - private String protocol; - private String authority; - private String globalIdCreateTime; - private String publisher; - private String publicationDate; - private DatasetVersionDTO datasetVersion; - private List dataFiles; - public static final String DOI_PROTOCOL = "doi"; - public static final String HDL_PROTOCOL = "hdl"; + private String id; + private String identifier; + private String protocol; + private String authority; + private String globalIdCreateTime; + private String publisher; + private String publicationDate; + private DatasetVersionDTO datasetVersion; + private List dataFiles; + public static final String DOI_PROTOCOL = "doi"; + public static final String HDL_PROTOCOL = "hdl"; public String getId() { return id; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/dto/RoleAssignmentDTO.java b/src/main/java/edu/harvard/iq/dataverse/api/dto/RoleAssignmentDTO.java index 968d771ee01..0e0aab313ee 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/dto/RoleAssignmentDTO.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/dto/RoleAssignmentDTO.java @@ -5,8 +5,8 @@ * @author michael */ public class RoleAssignmentDTO { - String assignee; - String role; + String assignee; + String role; public String getAssignee() { return assignee; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/dto/RoleDTO.java b/src/main/java/edu/harvard/iq/dataverse/api/dto/RoleDTO.java index 58e30ade584..85dcfdde105 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/dto/RoleDTO.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/dto/RoleDTO.java @@ -9,61 +9,61 @@ * @author michael */ public class RoleDTO { - String alias; - String name; - String description; - String ownerId; - String[] permissions; + String alias; + String name; + String description; + String ownerId; + String[] permissions; - public String getAlias() { - return alias; - } + public String getAlias() { + return alias; + } - public void setAlias(String alias) { - this.alias = alias; - } + public void setAlias(String alias) { + this.alias = alias; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public String getDescription() { - return description; - } + public String getDescription() { + return description; + } - public void setDescription(String description) { - this.description = description; - } + public void setDescription(String description) { + this.description = description; + } - public String[] getPermissions() { - return permissions; - } + public String[] getPermissions() { + return permissions; + } - public void setPermissions(String[] permissions) { - this.permissions = permissions; - } + public void setPermissions(String[] permissions) { + this.permissions = permissions; + } - public DataverseRole asRole() { - DataverseRole r = new DataverseRole(); - r.setAlias(alias); - r.setDescription(description); - r.setName(name); - if (permissions != null) { - if (permissions.length > 0) { - if (permissions[0].trim().toLowerCase().equals("all")) { - r.addPermissions(EnumSet.allOf(Permission.class)); - } else { - for (String ps : permissions) { - r.addPermission(Permission.valueOf(ps)); - } - } - } - } - return r; - } - + public DataverseRole asRole() { + DataverseRole r = new DataverseRole(); + r.setAlias(alias); + r.setDescription(description); + r.setName(name); + if (permissions != null) { + if (permissions.length > 0) { + if (permissions[0].trim().toLowerCase().equals("all")) { + r.addPermissions(EnumSet.allOf(Permission.class)); + } else { + for (String ps : permissions) { + r.addPermission(Permission.valueOf(ps)); + } + } + } + } + return r; + } + } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportDDIServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportDDIServiceBean.java index 591998d117c..56841666377 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportDDIServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportDDIServiceBean.java @@ -153,12 +153,18 @@ public Map mapDDI(ImportType importType, File ddiFile, DatasetD throw new EJBException("ERROR occurred in mapDDI.", ex); } finally { try { - if (xmlr != null) { xmlr.close(); } + if (xmlr != null) { + xmlr.close(); + } } catch (XMLStreamException ex) {} try { - if (in != null) { in.close();} - } catch (IOException ex) {} + if (in != null) { + in.close(); + } + } catch (IOException ex) { + + } } return filesMap; @@ -189,7 +195,7 @@ private void processDDI(ImportType importType, XMLStreamReader xmlr, DatasetDTO processCodeBook(importType, xmlr, datasetDTO, filesMap); MetadataBlockDTO citationBlock = datasetDTO.getDatasetVersion().getMetadataBlocks().get("citation"); - if (codeBookLevelId != null && !codeBookLevelId.isEmpty()) { + if (codeBookLevelId != null && !codeBookLevelId.isEmpty()) { if (citationBlock.getField("otherId")==null) { // this means no ids were found during the parsing of the // study description section. we'll use the one we found in @@ -200,14 +206,12 @@ private void processDDI(ImportType importType, XMLStreamReader xmlr, DatasetDTO } } - if (isHarvestImport(importType)) { + if (isHarvestImport(importType)) { datasetDTO.getDatasetVersion().setVersionState(VersionState.RELEASED); - - } - - + } } - public DatasetDTO initializeDataset() { + + public DatasetDTO initializeDataset() { DatasetDTO datasetDTO = new DatasetDTO(); DatasetVersionDTO datasetVersionDTO = new DatasetVersionDTO(); datasetDTO.setDatasetVersion(datasetVersionDTO); @@ -222,12 +226,11 @@ public DatasetDTO initializeDataset() { datasetVersionDTO.getMetadataBlocks().get("geospatial").setFields(new ArrayList<>()); return datasetDTO; - } // Read the XMLStream, and populate datasetDTO and filesMap private void processCodeBook(ImportType importType, XMLStreamReader xmlr, DatasetDTO datasetDTO, Map filesMap) throws XMLStreamException, ImportException { - for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { + for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { if (event == XMLStreamConstants.START_ELEMENT) { if (xmlr.getLocalName().equals("docDscr")) { processDocDscr(xmlr, datasetDTO); @@ -260,11 +263,10 @@ private void processCodeBook(ImportType importType, XMLStreamReader xmlr, Datase } } - private void processDocDscr(XMLStreamReader xmlr, DatasetDTO datasetDTO) throws XMLStreamException { + private void processDocDscr(XMLStreamReader xmlr, DatasetDTO datasetDTO) throws XMLStreamException { for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { if (event == XMLStreamConstants.START_ELEMENT) { - - if (xmlr.getLocalName().equals("IDNo") && StringUtil.isEmpty(datasetDTO.getIdentifier()) ) { + if (xmlr.getLocalName().equals("IDNo") && StringUtil.isEmpty(datasetDTO.getIdentifier()) ) { // this will set a StudyId if it has not yet been set; it will get overridden by a metadata // id in the StudyDscr section, if one exists if ( AGENCY_HANDLE.equals( xmlr.getAttributeValue(null, "agency") ) ) { @@ -279,25 +281,27 @@ private void processDocDscr(XMLStreamReader xmlr, DatasetDTO datasetDTO) throws } } } - private String parseText(XMLStreamReader xmlr) throws XMLStreamException { + private String parseText(XMLStreamReader xmlr) throws XMLStreamException { return parseText(xmlr,true); - } + } - private String parseText(XMLStreamReader xmlr, boolean scrubText) throws XMLStreamException { + private String parseText(XMLStreamReader xmlr, boolean scrubText) throws XMLStreamException { String tempString = getElementText(xmlr); if (scrubText) { tempString = tempString.trim().replace('\n',' '); } return tempString; - } - private String parseDate (XMLStreamReader xmlr, String endTag) throws XMLStreamException { + } + + private String parseDate (XMLStreamReader xmlr, String endTag) throws XMLStreamException { String date = xmlr.getAttributeValue(null, "date"); if (date == null) { date = parseText(xmlr); } return date; } - /* We had to add this method because the ref getElementText has a bug where it + + /* We had to add this method because the ref getElementText has a bug where it * would append a null before the text, if there was an escaped apostrophe; it appears * that the code finds an null ENTITY_REFERENCE in this case which seems like a bug; * the workaround for the moment is to comment or handling ENTITY_REFERENCE in this case @@ -331,7 +335,6 @@ private String getElementText(XMLStreamReader xmlr) throws XMLStreamException { } private void processStdyDscr(ImportType importType, XMLStreamReader xmlr, DatasetDTO datasetDTO) throws XMLStreamException, ImportException { - for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { if (event == XMLStreamConstants.START_ELEMENT) { if (xmlr.getLocalName().equals("citation")) processCitation(importType, xmlr, datasetDTO); @@ -348,6 +351,7 @@ private void processStdyDscr(ImportType importType, XMLStreamReader xmlr, Datase } } } + private void processOthrStdyMat(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) throws XMLStreamException { List> publications = new ArrayList<>(); boolean replicationForFound = false; @@ -413,23 +417,21 @@ else if (xmlr.getLocalName().equals("relStdy")) { if (publications.size()>0) { getCitation(dvDTO).addField(FieldDTO.createMultipleCompoundFieldDTO(DatasetFieldConstant.publication, publications)); } - } else if (xmlr.getLocalName().equals("otherRefs")) { - List otherRefs = new ArrayList<>(); otherRefs.add(parseText(xmlr, "otherRefs")); getCitation(dvDTO).addField(FieldDTO.createMultiplePrimitiveFieldDTO(DatasetFieldConstant.otherReferences, otherRefs)); } } else if (event == XMLStreamConstants.END_ELEMENT) { - if (xmlr.getLocalName().equals("othrStdyMat")) { return; } } } } - private void processCitation(ImportType importType, XMLStreamReader xmlr, DatasetDTO datasetDTO) throws XMLStreamException, ImportException { + + private void processCitation(ImportType importType, XMLStreamReader xmlr, DatasetDTO datasetDTO) throws XMLStreamException, ImportException { DatasetVersionDTO dvDTO = datasetDTO.getDatasetVersion(); MetadataBlockDTO citation=datasetDTO.getDatasetVersion().getMetadataBlocks().get("citation"); boolean distStatementProcessed = false; @@ -465,19 +467,18 @@ else if (xmlr.getLocalName().equals("notes")) { } } } - - - /** + + /** * * * @param xmlr * @param citation * @throws XMLStreamException */ - private void processStdyInfo(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) throws XMLStreamException { - List> descriptions = new ArrayList<>(); + private void processStdyInfo(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) throws XMLStreamException { + List> descriptions = new ArrayList<>(); - for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { + for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { if (event == XMLStreamConstants.START_ELEMENT) { if (xmlr.getLocalName().equals("subject")) { processSubject(xmlr, getCitation(dvDTO)); @@ -501,11 +502,12 @@ private void processStdyInfo(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) thro } } } - } + } + private void processSubject(XMLStreamReader xmlr, MetadataBlockDTO citation) throws XMLStreamException { List> keywords = new ArrayList<>(); List> topicClasses = new ArrayList<>(); - for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { + for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { if (event == XMLStreamConstants.START_ELEMENT) { if (xmlr.getLocalName().equals("keyword")) { @@ -552,7 +554,7 @@ private void processSubject(XMLStreamReader xmlr, MetadataBlockDTO citation) thr */ private String formatNotesfromXML(XMLStreamReader xmlr) throws XMLStreamException{ - if (xmlr==null){ + if (xmlr == null) { throw new NullPointerException("XMLStreamReader xmlr cannot be null"); } //System.out.println("formatNotesfromXML"); @@ -603,12 +605,9 @@ private String formatNotesfromXML(XMLStreamReader xmlr) throws XMLStreamExceptio addNote(note, dvDTO); */ } - - + private void processNotes (XMLStreamReader xmlr, DatasetVersionDTO dvDTO) throws XMLStreamException { - String formattedNotes = this.formatNotesfromXML(xmlr); - if (formattedNotes != null){ this.addNote(formattedNotes, dvDTO); } @@ -707,10 +706,8 @@ private void processSumDscr(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) throw } } } - - - - private HashSet processGeoBndBox(XMLStreamReader xmlr) throws XMLStreamException { + + private HashSet processGeoBndBox(XMLStreamReader xmlr) throws XMLStreamException { HashSet set = new HashSet<>(); for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { @@ -730,7 +727,8 @@ private HashSet processGeoBndBox(XMLStreamReader xmlr) throws XMLStrea } return set; } - private void processMethod(XMLStreamReader xmlr, DatasetVersionDTO dvDTO ) throws XMLStreamException, ImportException { + + private void processMethod(XMLStreamReader xmlr, DatasetVersionDTO dvDTO ) throws XMLStreamException, ImportException { for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { if (event == XMLStreamConstants.START_ELEMENT) { if (xmlr.getLocalName().equals("dataColl")) { @@ -872,7 +870,7 @@ private void processSources(XMLStreamReader xmlr, MetadataBlockDTO citation) thr } } } - private void processAnlyInfo(XMLStreamReader xmlr, MetadataBlockDTO socialScience) throws XMLStreamException { + private void processAnlyInfo(XMLStreamReader xmlr, MetadataBlockDTO socialScience) throws XMLStreamException { for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { if (event == XMLStreamConstants.START_ELEMENT) { // socialscience responseRate @@ -909,22 +907,22 @@ private void processDataColl(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) thro } timeMeth = timeMeth.concat(thisValue); } - //socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("timeMethod", parseText( xmlr, "timeMeth" ))); - } else if (xmlr.getLocalName().equals("dataCollector")) { - socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("dataCollector", parseText( xmlr, "dataCollector" ))); - // frequencyOfDataCollection + // socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("timeMethod", parseText( xmlr, "timeMeth" ))); + } else if (xmlr.getLocalName().equals("dataCollector")) { + socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("dataCollector", parseText( xmlr, "dataCollector" ))); + // frequencyOfDataCollection } else if (xmlr.getLocalName().equals("frequenc")) { - socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("frequencyOfDataCollection", parseText( xmlr, "frequenc" ))); - //samplingProcedure + socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("frequencyOfDataCollection", parseText( xmlr, "frequenc" ))); + // samplingProcedure } else if (xmlr.getLocalName().equals("sampProc")) { - socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("samplingProcedure", parseText( xmlr, "sampProc" ))); - //targetSampleSize + socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("samplingProcedure", parseText( xmlr, "sampProc" ))); + // targetSampleSize } else if (xmlr.getLocalName().equals("targetSampleSize")) { - processTargetSampleSize(xmlr, socialScience); - //devationsFromSamplingDesign + processTargetSampleSize(xmlr, socialScience); + // devationsFromSamplingDesign } else if (xmlr.getLocalName().equals("deviat")) { socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("deviationsFromSampleDesign", parseText( xmlr, "deviat" ))); - // collectionMode + // collectionMode } else if (xmlr.getLocalName().equals("collMode")) { String thisValue = parseText( xmlr, "collMode" ); if (!StringUtil.isEmpty(thisValue)) { @@ -933,18 +931,18 @@ private void processDataColl(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) thro } collMode = collMode.concat(thisValue); } - //socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("collectionMode", parseText( xmlr, "collMode" ))); + //socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("collectionMode", parseText( xmlr, "collMode" ))); //researchInstrument } else if (xmlr.getLocalName().equals("resInstru")) { - socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("researchInstrument", parseText( xmlr, "resInstru" ))); + socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("researchInstrument", parseText( xmlr, "resInstru" ))); } else if (xmlr.getLocalName().equals("sources")) { processSources(xmlr,getCitation(dvDTO)); } else if (xmlr.getLocalName().equals("collSitu")) { - socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("dataCollectionSituation", parseText( xmlr, "collSitu" ))); + socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("dataCollectionSituation", parseText( xmlr, "collSitu" ))); } else if (xmlr.getLocalName().equals("actMin")) { - socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("actionsToMinimizeLoss", parseText( xmlr, "actMin" ))); + socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("actionsToMinimizeLoss", parseText( xmlr, "actMin" ))); } else if (xmlr.getLocalName().equals("ConOps")) { - socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("controlOperations", parseText( xmlr, "ConOps" ))); + socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("controlOperations", parseText( xmlr, "ConOps" ))); } else if (xmlr.getLocalName().equals("weight")) { String thisValue = parseText( xmlr, "weight" ); if (!StringUtil.isEmpty(thisValue)) { @@ -955,7 +953,7 @@ private void processDataColl(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) thro } //socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("weighting", parseText( xmlr, "weight" ))); } else if (xmlr.getLocalName().equals("cleanOps")) { - socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("cleaningOperations", parseText( xmlr, "cleanOps" ))); + socialScience.getFields().add(FieldDTO.createPrimitiveFieldDTO("cleaningOperations", parseText( xmlr, "cleanOps" ))); } } else if (event == XMLStreamConstants.END_ELEMENT) { if (xmlr.getLocalName().equals("dataColl")) { @@ -993,20 +991,20 @@ private void processTargetSampleSize(XMLStreamReader xmlr, MetadataBlockDTO soci } } } - } + /* EMK TODO: In DVN 3.6, users were allowed to enter their own version date, and in addition the app assigned a version date when the version is released. So DDI's that we have to migrate, we can see this: - - 1 - - - 1 - - Question: what to do with these two different dates? Need to review with Eleni - Note: we should use the verStmt with source="DVN" as the 'official' version statement - DDI's that we are migrating should have one and only one DVN version statement + + 1 + + + 1 + + Question: what to do with these two different dates? Need to review with Eleni + Note: we should use the verStmt with source="DVN" as the 'official' version statement + DDI's that we are migrating should have one and only one DVN version statement */ private void processVerStmt(ImportType importType, XMLStreamReader xmlr, DatasetVersionDTO dvDTO) throws XMLStreamException { if ( isHarvestImport(importType) ) { @@ -1016,9 +1014,12 @@ private void processVerStmt(ImportType importType, XMLStreamReader xmlr, Dataset if (xmlr.getLocalName().equals("version")) { addNote("Version Date: "+ xmlr.getAttributeValue(null, "date"),dvDTO); addNote("Version Text: "+ parseText(xmlr),dvDTO); - } else if (xmlr.getLocalName().equals("notes")) { processNotes(xmlr, dvDTO); } + } else if (xmlr.getLocalName().equals("notes")) { + processNotes(xmlr, dvDTO); } } else if (event == XMLStreamConstants.END_ELEMENT) { - if (xmlr.getLocalName().equals("verStmt")) return; + if (xmlr.getLocalName().equals("verStmt")) { + return; + } } } } else { @@ -1052,7 +1053,7 @@ private void processVerStmt(ImportType importType, XMLStreamReader xmlr, Dataset } } - private void processDataAccs(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) throws XMLStreamException { + private void processDataAccs(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) throws XMLStreamException { for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { if (event == XMLStreamConstants.START_ELEMENT) { if (xmlr.getLocalName().equals("setAvail")) { @@ -1124,6 +1125,7 @@ private void processUseStmt(XMLStreamReader xmlr, DatasetVersionDTO dvDTO) throw } } } + /** * Separate the versionNumber into two parts - before the first '.' * is the versionNumber, and after is the minorVersionNumber. @@ -1140,11 +1142,9 @@ private void parseVersionNumber(DatasetVersionDTO dvDTO, String versionNumber) { dvDTO.setVersionNumber(Long.parseLong(versionNumber.substring(0, firstIndex - 1))); dvDTO.setMinorVersionNumber(versionNumber.substring(firstIndex + 1)); } - - } - private void processSerStmt(XMLStreamReader xmlr, MetadataBlockDTO citation) throws XMLStreamException { + private void processSerStmt(XMLStreamReader xmlr, MetadataBlockDTO citation) throws XMLStreamException { FieldDTO seriesName=null; FieldDTO seriesInformation=null; for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { @@ -1210,6 +1210,7 @@ private void processDistStmt(XMLStreamReader xmlr, MetadataBlockDTO citation) th } } } + private void processProdStmt(XMLStreamReader xmlr, MetadataBlockDTO citation) throws XMLStreamException { List> producers = new ArrayList<>(); List> grants = new ArrayList<>(); @@ -1270,11 +1271,11 @@ private void processProdStmt(XMLStreamReader xmlr, MetadataBlockDTO citation) th } } - private void processTitlStmt(XMLStreamReader xmlr, DatasetDTO datasetDTO) throws XMLStreamException, ImportException { - MetadataBlockDTO citation = datasetDTO.getDatasetVersion().getMetadataBlocks().get("citation"); - List> otherIds = new ArrayList<>(); + private void processTitlStmt(XMLStreamReader xmlr, DatasetDTO datasetDTO) throws XMLStreamException, ImportException { + MetadataBlockDTO citation = datasetDTO.getDatasetVersion().getMetadataBlocks().get("citation"); + List> otherIds = new ArrayList<>(); - for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { + for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { if (event == XMLStreamConstants.START_ELEMENT) { if (xmlr.getLocalName().equals("titl")) { FieldDTO field = FieldDTO.createPrimitiveFieldDTO("title", parseText(xmlr)); @@ -1319,9 +1320,10 @@ private void processTitlStmt(XMLStreamReader xmlr, DatasetDTO datasetDTO) throws } } } - private void processRspStmt(XMLStreamReader xmlr, MetadataBlockDTO citation) throws XMLStreamException { + + private void processRspStmt(XMLStreamReader xmlr, MetadataBlockDTO citation) throws XMLStreamException { - List> authors = new ArrayList<>(); + List> authors = new ArrayList<>(); for (int event = xmlr.next(); event != XMLStreamConstants.END_DOCUMENT; event = xmlr.next()) { if (event == XMLStreamConstants.START_ELEMENT) { if (xmlr.getLocalName().equals("AuthEnty")) { @@ -1344,14 +1346,17 @@ private void processRspStmt(XMLStreamReader xmlr, MetadataBlockDTO citation) thr } } } - private Map parseCompoundText (XMLStreamReader xmlr, String endTag) throws XMLStreamException { + + private Map parseCompoundText (XMLStreamReader xmlr, String endTag) throws XMLStreamException { Map returnMap = new HashMap<>(); String text = ""; while (true) { int event = xmlr.next(); if (event == XMLStreamConstants.CHARACTERS) { - if (!text.isEmpty()) { text += "\n";} + if (!text.isEmpty()) { + text += "\n"; + } text += xmlr.getText().trim().replace('\n',' '); } else if (event == XMLStreamConstants.START_ELEMENT) { if (xmlr.getLocalName().equals("ExtLink")) { @@ -1360,7 +1365,9 @@ private Map parseCompoundText (XMLStreamReader xmlr, String endTa parseText(xmlr, "ExtLink"); // this line effectively just skips though until the end of the tag } } else if (event == XMLStreamConstants.END_ELEMENT) { - if (xmlr.getLocalName().equals(endTag)) break; + if (xmlr.getLocalName().equals(endTag)) { + break; + } } } @@ -1369,20 +1376,22 @@ private Map parseCompoundText (XMLStreamReader xmlr, String endTa } private String parseText(XMLStreamReader xmlr, String endTag) throws XMLStreamException { - return (String) parseTextNew(xmlr,endTag); - } - + return (String) parseTextNew(xmlr, endTag); + } + // #FIXME We should really type stabalize this. - private Object parseTextNew(XMLStreamReader xmlr, String endTag) throws XMLStreamException { + private Object parseTextNew(XMLStreamReader xmlr, String endTag) throws XMLStreamException { String returnString = ""; Map returnMap = null; while (true) { - if (!returnString.equals("")) { returnString += "\n";} + if (!returnString.equals("")) { + returnString += "\n"; + } int event = xmlr.next(); if (event == XMLStreamConstants.CHARACTERS) { returnString += xmlr.getText().trim().replace('\n',' '); - } else if (event == XMLStreamConstants.START_ELEMENT) { + } else if (event == XMLStreamConstants.START_ELEMENT) { if (xmlr.getLocalName().equals("p") || xmlr.getLocalName().equals("br") || xmlr.getLocalName().equals("head")) { returnString += "

" + parseText(xmlr, xmlr.getLocalName()) + "

"; } else if (xmlr.getLocalName().equals("emph") || xmlr.getLocalName().equals("em") || xmlr.getLocalName().equals("i")) { @@ -1434,7 +1443,7 @@ private String parseNoteByType(XMLStreamReader xmlr, String type) throws XMLStre return null; } } - private String parseText_list (XMLStreamReader xmlr) throws XMLStreamException { + private String parseText_list (XMLStreamReader xmlr) throws XMLStreamException { String listString = null; String listCloseTag = null; @@ -1553,7 +1562,7 @@ else if (xmlr.getLocalName().equals("notes")) { return returnValues; } - private void parseStudyIdHandle(String _id, DatasetDTO datasetDTO) { + private void parseStudyIdHandle(String _id, DatasetDTO datasetDTO) { int index1 = _id.indexOf(':'); int index2 = _id.indexOf('/'); @@ -1622,17 +1631,16 @@ private MetadataBlockDTO getGeospatial(DatasetVersionDTO dvDTO) { return dvDTO.getMetadataBlocks().get("geospatial"); } - private MetadataBlockDTO getSocialScience(DatasetVersionDTO dvDTO) { + private MetadataBlockDTO getSocialScience(DatasetVersionDTO dvDTO) { return dvDTO.getMetadataBlocks().get("socialscience"); } - - + private void addToSet(HashSet set, String typeName, String value ) { if (value!=null && !value.trim().isEmpty()) { set.add(FieldDTO.createPrimitiveFieldDTO(typeName, value)); } } - + private void processOtherMat(XMLStreamReader xmlr, DatasetDTO datasetDTO) throws XMLStreamException { FileMetadataDTO fmdDTO = new FileMetadataDTO(); @@ -1825,7 +1833,7 @@ else if (xmlr.getLocalName().equals("notes")) { } } - private String determineFileCategory(String catName, String icpsrDesc, String icpsrId) { + private String determineFileCategory(String catName, String icpsrDesc, String icpsrId) { if (catName == null) { catName = icpsrDesc; @@ -1838,7 +1846,8 @@ private String determineFileCategory(String catName, String icpsrDesc, String ic return (catName != null ? catName : ""); } - /** + + /** * sets fmdDTO.label, fmdDTO.description, fmdDTO.studyfile.subsettableFileType * @param xmlr * @param fmdDTO @@ -1889,7 +1898,7 @@ private String processFileTxt(XMLStreamReader xmlr, FileMetadataDTO fmdDTO, Data return ddiFileId; } - /** + /** * Set dtDTO. caseQuantity, varQuantity, recordsPerCase * @param xmlr * @param dtDTO @@ -1916,6 +1925,4 @@ private void processDimensns(XMLStreamReader xmlr, DataTableDTO dtDTO) throws XM } } } - } - diff --git a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBean.java index b5554816c0a..4b08d4c16a7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportGenericServiceBean.java @@ -109,8 +109,12 @@ public void importXML(String xmlToParse, String foreignFormat, DatasetVersion da Logger.getLogger(ImportGenericServiceBean.class.getName()).log(Level.SEVERE, null, ex); } finally { try { - if (xmlr != null) { xmlr.close(); } - } catch (XMLStreamException ex) {} + if (xmlr != null) { + xmlr.close(); + } + } catch (XMLStreamException ex) { + + } } } @@ -148,12 +152,20 @@ public void importXML(File xmlFile, String foreignFormat, DatasetVersion dataset Logger.getLogger(ImportGenericServiceBean.class.getName()).log(Level.SEVERE, null, ex); } finally { try { - if (xmlr != null) { xmlr.close(); } - } catch (XMLStreamException ex) {} + if (xmlr != null) { + xmlr.close(); + } + } catch (XMLStreamException ex) { + + } try { - if (in != null) { in.close();} - } catch (IOException ex) {} + if (in != null) { + in.close(); + } + } catch (IOException ex) { + + } } } @@ -587,12 +599,20 @@ public Map mapDCTerms(File ddiFile, DatasetDTO datasetDTO) { throw new EJBException("ERROR occurred in mapDDI.", ex); } finally { try { - if (xmlr != null) { xmlr.close(); } - } catch (XMLStreamException ex) {} + if (xmlr != null) { + xmlr.close(); + } + } catch (XMLStreamException ex) { + + } try { - if (in != null) { in.close();} - } catch (IOException ex) {} + if (in != null) { + in.close(); + } + } catch (IOException ex) { + + } } return filesMap; diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvider.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvider.java index ec989317758..baa08baa0ad 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationProvider.java @@ -28,28 +28,51 @@ public interface AuthenticationProvider { AuthenticationProviderDisplayInfo getInfo(); - default boolean isPasswordUpdateAllowed() { return false; }; - default boolean isUserInfoUpdateAllowed() { return false; }; - default boolean isUserDeletionAllowed() { return false; }; - default boolean isOAuthProvider() { return false; }; + default boolean isPasswordUpdateAllowed() { + return false; + }; + default boolean isUserInfoUpdateAllowed() { + return false; + }; + default boolean isUserDeletionAllowed() { + return false; + }; + default boolean isOAuthProvider() { + return false; + }; + /** @todo Consider moving some or all of these to AuthenticationProviderDisplayInfo.*/ /** The identifier is only displayed in the UI if it's meaningful, such as an ORCID iD.*/ - default boolean isDisplayIdentifier() { return false; }; + default boolean isDisplayIdentifier() { + return false; + }; + /** ORCID calls their persistent id an "ORCID iD".*/ - default String getPersistentIdName() { return null; }; + default String getPersistentIdName() { + return null; + }; + /** ORCID has special language to describe their ID: http://members.orcid.org/logos-web-graphics */ - default String getPersistentIdDescription() { return null; }; + default String getPersistentIdDescription() { + return null; + }; + /** An ORCID example would be the "http://orcid.org/" part of http://orcid.org/0000-0002-7874-374X*/ - default String getPersistentIdUrlPrefix() { return null; }; - default String getLogo() { return null; }; - - - + default String getPersistentIdUrlPrefix() { + return null; + }; + + default String getLogo() { + return null; + }; + /** * Some providers (e.g organizational ones) provide verified email addresses. * @return {@code true} if we can treat email addresses coming from this provider as verified, {@code false} otherwise. */ - default boolean isEmailVerified() { return false; }; + default boolean isEmailVerified() { + return false; + }; @@ -60,7 +83,7 @@ public interface AuthenticationProvider { * @throws UnsupportedOperationException if the provider does not support updating passwords. * @see #isPasswordUpdateAllowed() */ - default void updatePassword( String userIdInProvider, String newPassword ) { + default void updatePassword(String userIdInProvider, String newPassword) { throw new UnsupportedOperationException(this.toString() + " does not implement password updates"); }; @@ -74,7 +97,7 @@ default void updatePassword( String userIdInProvider, String newPassword ) { * @throws UnsupportedOperationException if the provider does not support updating passwords. * @see #isPasswordUpdateAllowed() */ - default Boolean verifyPassword( String userIdInProvider, String password ) { + default Boolean verifyPassword(String userIdInProvider, String password) { throw new UnsupportedOperationException(this.toString() + " does not implement password updates"); }; diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java index 0395c2453db..234df0f089d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/AuthenticationServiceBean.java @@ -137,9 +137,8 @@ public void startup() { } public void registerProviderFactory(AuthenticationProviderFactory aFactory) - throws AuthorizationSetupException - { - if ( providerFactories.containsKey(aFactory.getAlias()) ) { + throws AuthorizationSetupException { + if (providerFactories.containsKey(aFactory.getAlias())) { throw new AuthorizationSetupException( "Duplicate alias " + aFactory.getAlias() + " for authentication provider factory."); } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRole.java b/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRole.java index e0544455409..c1eb1eaccfe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRole.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/DataverseRole.java @@ -33,29 +33,32 @@ * @author michael */ @NamedQueries({ - @NamedQuery(name = "DataverseRole.findByOwnerId", - query= "SELECT r FROM DataverseRole r WHERE r.owner.id=:ownerId ORDER BY r.name"), - @NamedQuery(name = "DataverseRole.findBuiltinRoles", - query= "SELECT r FROM DataverseRole r WHERE r.owner is null ORDER BY r.name"), + @NamedQuery(name = "DataverseRole.findByOwnerId", + query= "SELECT r FROM DataverseRole r WHERE r.owner.id=:ownerId ORDER BY r.name"), + @NamedQuery(name = "DataverseRole.findBuiltinRoles", + query= "SELECT r FROM DataverseRole r WHERE r.owner is null ORDER BY r.name"), @NamedQuery(name = "DataverseRole.findBuiltinRoleByAlias", - query= "SELECT r FROM DataverseRole r WHERE r.alias=:alias AND r.owner is null"), - @NamedQuery(name = "DataverseRole.listAll", - query= "SELECT r FROM DataverseRole r"), - @NamedQuery(name = "DataverseRole.deleteById", - query= "DELETE FROM DataverseRole r WHERE r.id=:id") + query= "SELECT r FROM DataverseRole r WHERE r.alias=:alias AND r.owner is null"), + @NamedQuery(name = "DataverseRole.listAll", + query= "SELECT r FROM DataverseRole r"), + @NamedQuery(name = "DataverseRole.deleteById", + query= "DELETE FROM DataverseRole r WHERE r.id=:id") }) @Entity -@Table(indexes = {@Index(columnList="owner_id") - , @Index(columnList="name") - , @Index(columnList="alias")}) +@Table(indexes = { + @Index(columnList="owner_id"), + @Index(columnList="name"), + @Index(columnList="alias") +}) public class DataverseRole implements Serializable { - + //constants for the built in roles references in the code public static final String ADMIN = "admin"; public static final String FILE_DOWNLOADER = "fileDownloader"; public static final String FULL_CONTRIBUTOR = "fullContributor"; public static final String DV_CONTRIBUTOR = "dvContributor"; public static final String DS_CONTRIBUTOR = "dsContributor"; + /** * Heads up that this says "editor" which comes from * scripts/api/data/role-editor.json but the name is "Contributor". The @@ -66,29 +69,29 @@ public class DataverseRole implements Serializable { public static final String CURATOR = "curator"; public static final String MEMBER = "member"; - - public static final Comparator CMP_BY_NAME = new Comparator(){ - - @Override - public int compare(DataverseRole o1, DataverseRole o2) { - int cmp = o1.getName().compareTo(o2.getName()); - if ( cmp != 0 ) return cmp; + public static final Comparator CMP_BY_NAME = new Comparator() { + @Override + public int compare(DataverseRole o1, DataverseRole o2) { + int cmp = o1.getName().compareTo(o2.getName()); + if (cmp != 0) { + return cmp; + } Long o1OwnerId = o1.getOwner() == null ? 0l : o1.getOwner().getId(); Long o2OwnerId = o2.getOwner() == null ? 0l : o2.getOwner().getId(); + return o1OwnerId.compareTo( o2OwnerId ); + } + }; - return o1OwnerId.compareTo( o2OwnerId ); - } - }; - public static Set permissionSet( Iterable roles ) { - long miniset = 0l; - for ( DataverseRole role : roles ) { - miniset |= role.permissionBits; - } - return new BitSet(miniset).asSetOf(Permission.class); - } - - @Id + public static Set permissionSet( Iterable roles ) { + long miniset = 0l; + for ( DataverseRole role : roles ) { + miniset |= role.permissionBits; + } + return new BitSet(miniset).asSetOf(Permission.class); + } + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -103,21 +106,21 @@ public static Set permissionSet( Iterable roles ) { @Pattern(regexp = "[a-zA-Z0-9\\_\\-]+", message = "{alias.illegalCharacters}") @Column(nullable = false, unique=true) private String alias; - - /** Stores the permissions in a bit set. */ - private long permissionBits; - - @ManyToOne + + /** Stores the permissions in a bit set. */ + private long permissionBits; + + @ManyToOne @JoinColumn(nullable=true) private DvObject owner; - - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } public String getName() { if (alias != null) { @@ -138,9 +141,9 @@ public String getName() { } } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } public String getDescription() { if (alias != null) { @@ -162,118 +165,110 @@ public String getDescription() { } } - public void setDescription(String description) { - this.description = description; - } - - public String getAlias() { - return alias; - } - - public void setAlias(String alias) { - this.alias = alias; - } - - public DvObject getOwner() { - return owner; - } - - public void setOwner(DvObject owner) { - this.owner = owner; - } - - public void addPermissions( Collection ps ) { - for ( Permission p : ps ) addPermission(p); - } - - public void addPermission( Permission p ) { - permissionBits = new BitSet(permissionBits).set(p.ordinal()).getBits(); - } - - public void clearPermissions() { - permissionBits = 0l; - } - - public Set permissions() { - return new BitSet(permissionBits).asSetOf(Permission.class); - } - - public long getPermissionsBits() { - return permissionBits; - } - - @Override - public String toString() { - return "DataverseRole{" + "id=" + id + ", alias=" + alias + '}'; - } - - @Override - public int hashCode() { - int hash = 7; - hash = 97 * hash + Objects.hashCode(this.id); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final DataverseRole other = (DataverseRole) obj; - if (!Objects.equals(this.id, other.id)) { - return false; - } - return true; - } - - /** - * Given a DvObject object, see if this role contains a Permission - * applicable to that object - * - * @param dvObject - * @return - */ - public boolean doesDvObjectHavePermissionForObject(DvObject dvObject){ - - if (dvObject == null){ - return false; - } - - return this.doesDvObjectClassHavePermissionForObject(dvObject.getClass()); - - } // doesDvObjectHavePermissionForObject - - - /** - * Given a DvObject object class, see if this role contains a Permission - * applicable to that object - * - * Initial user is for MyData page and displaying role tags - * - * @param dvObjectClass - * @return - */ - public boolean doesDvObjectClassHavePermissionForObject(Class dvObjectClass){ - - if (dvObjectClass == null){ - return false; - } - - // Iterate through permissions. If one applies to this class, return true - // - for (Permission perm : this.permissions()) { - if (perm.appliesTo(dvObjectClass)){ - return true; - } - } - + public void setDescription(String description) { + this.description = description; + } + + public String getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + public DvObject getOwner() { + return owner; + } + + public void setOwner(DvObject owner) { + this.owner = owner; + } + + public void addPermissions( Collection ps ) { + for (Permission p : ps) { + addPermission(p); + } + } + + public void addPermission( Permission p ) { + permissionBits = new BitSet(permissionBits).set(p.ordinal()).getBits(); + } + + public void clearPermissions() { + permissionBits = 0l; + } + + public Set permissions() { + return new BitSet(permissionBits).asSetOf(Permission.class); + } + + public long getPermissionsBits() { + return permissionBits; + } + + @Override + public String toString() { + return "DataverseRole{" + "id=" + id + ", alias=" + alias + '}'; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 97 * hash + Objects.hashCode(this.id); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final DataverseRole other = (DataverseRole) obj; + if (!Objects.equals(this.id, other.id)) { return false; - - } // doesDvObjectClassHavePermissionForObject - - - + } + return true; + } + + /** + * Given a DvObject object, see if this role contains a Permission + * applicable to that object + * + * @param dvObject + * @return + */ + public boolean doesDvObjectHavePermissionForObject(DvObject dvObject) { + if (dvObject == null) { + return false; + } + return this.doesDvObjectClassHavePermissionForObject(dvObject.getClass()); + } // doesDvObjectHavePermissionForObject + + /** + * Given a DvObject object class, see if this role contains a Permission + * applicable to that object + * + * Initial user is for MyData page and displaying role tags + * + * @param dvObjectClass + * @return + */ + public boolean doesDvObjectClassHavePermissionForObject(Class dvObjectClass){ + if (dvObjectClass == null){ + return false; + } + + // Iterate through permissions. If one applies to this class, return true + for (Permission perm : this.permissions()) { + if (perm.appliesTo(dvObjectClass)){ + return true; + } + } + + return false; + } // doesDvObjectClassHavePermissionForObject } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/RoleAssignmentSet.java b/src/main/java/edu/harvard/iq/dataverse/authorization/RoleAssignmentSet.java index 01df10eac76..2cfff9a62d3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/RoleAssignmentSet.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/RoleAssignmentSet.java @@ -13,46 +13,46 @@ * @author michael */ public class RoleAssignmentSet implements Iterable { - - private final RoleAssignee roas; - private final Set assignments = new HashSet<>(); - - public RoleAssignmentSet( RoleAssignee aRoleAssignee) { - roas = aRoleAssignee; - } - - public void add( Iterable ras ) { - for ( RoleAssignment ra : ras ) { - assignments.add(ra); - } - } - - public void add( RoleAssignment ra ) { - assignments.add( ra ); - } - - public Set getPermissions() { - BitSet acc = new BitSet(); - for ( RoleAssignment ra : assignments ) { - acc.union( new BitSet(ra.getRole().getPermissionsBits()) ); - } - return acc.asSetOf( Permission.class ); - } + + private final RoleAssignee roas; + private final Set assignments = new HashSet<>(); + + public RoleAssignmentSet( RoleAssignee aRoleAssignee) { + roas = aRoleAssignee; + } + + public void add( Iterable ras ) { + for ( RoleAssignment ra : ras ) { + assignments.add(ra); + } + } + + public void add( RoleAssignment ra ) { + assignments.add( ra ); + } + + public Set getPermissions() { + BitSet acc = new BitSet(); + for ( RoleAssignment ra : assignments ) { + acc.union( new BitSet(ra.getRole().getPermissionsBits()) ); + } + return acc.asSetOf( Permission.class ); + } public RoleAssignee getRoleAssignee() { return roas; } - public Set getAssignments() { - return assignments; - } + public Set getAssignments() { + return assignments; + } + + @Override + public Iterator iterator() { + return assignments.iterator(); + } - @Override - public Iterator iterator() { - return assignments.iterator(); - } - - public boolean isEmpty() { - return assignments.isEmpty(); - } + public boolean isEmpty() { + return assignments.isEmpty(); + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/builtin/AllUsers.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/builtin/AllUsers.java index d12e8fbd510..0d64dbfc5b0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/builtin/AllUsers.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/builtin/AllUsers.java @@ -24,7 +24,9 @@ public final class AllUsers implements Group { private final String displayInfo = "Everyone (including guests)"; - public static final AllUsers get() { return instance; } + public static final AllUsers get() { + return instance; + } /** * Prevent instance creation diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/builtin/AuthenticatedUsers.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/builtin/AuthenticatedUsers.java index 9f4d081cb1a..5f9830f84aa 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/builtin/AuthenticatedUsers.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/builtin/AuthenticatedUsers.java @@ -14,7 +14,9 @@ public class AuthenticatedUsers implements Group { private AuthenticatedUsers() { } - public static AuthenticatedUsers get() { return instance; } + public static AuthenticatedUsers get() { + return instance; + } @Override public boolean contains(DataverseRequest ra) { diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupServiceBean.java index 3e49fca3b65..fe85c1f20be 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/explicit/ExplicitGroupServiceBean.java @@ -33,8 +33,8 @@ public class ExplicitGroupServiceBean { private RoleAssigneeServiceBean roleAssigneeSvc; @PersistenceContext(unitName = "VDCNet-ejbPU") - protected EntityManager em; - + protected EntityManager em; + ExplicitGroupProvider provider; @PostConstruct diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupsServiceBean.java index d6cfb8b7f6e..7ce396d5c53 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/ipaddress/IpGroupsServiceBean.java @@ -26,15 +26,15 @@ @Named @Stateless public class IpGroupsServiceBean { - + private static final Logger logger = Logger.getLogger(IpGroupsServiceBean.class.getName()); - + @PersistenceContext(unitName = "VDCNet-ejbPU") - protected EntityManager em; - + protected EntityManager em; + @EJB ActionLogServiceBean actionLogSvc; - + @EJB RoleAssigneeServiceBean roleAssigneeSvc; diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroupServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroupServiceBean.java index e4876b5e046..baaa12528ca 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroupServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/groups/impl/shib/ShibGroupServiceBean.java @@ -35,11 +35,13 @@ public class ShibGroupServiceBean { @EJB RoleAssigneeServiceBean roleAssigneeSvc; + @EJB GroupServiceBean groupService; + @EJB ActionLogServiceBean actionLogSvc; - + /** * @return A ShibGroup or null. */ 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 142ca23052d..e485d7f42ce 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 @@ -24,12 +24,12 @@ * @author mbarsinai */ @NamedQueries({ - @NamedQuery( name="BuiltinUser.findAll", - query = "SELECT u FROM BuiltinUser u ORDER BY u.userName"), - @NamedQuery( name="BuiltinUser.findByUserName", - query = "SELECT u FROM BuiltinUser u WHERE u.userName=:userName"), - @NamedQuery( name="BuiltinUser.listByUserNameLike", - query = "SELECT u FROM BuiltinUser u WHERE u.userName LIKE :userNameLike") + @NamedQuery(name="BuiltinUser.findAll", + query = "SELECT u FROM BuiltinUser u ORDER BY u.userName"), + @NamedQuery(name="BuiltinUser.findByUserName", + query = "SELECT u FROM BuiltinUser u WHERE u.userName=:userName"), + @NamedQuery(name="BuiltinUser.listByUserNameLike", + query = "SELECT u FROM BuiltinUser u WHERE u.userName LIKE :userNameLike") }) @Entity @Table(indexes = {@Index(columnList="userName")}) // for sorting the NamedQuery BuiltinUser.findAll diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java index c39c7cb2985..05bee80faed 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/BuiltinUserServiceBean.java @@ -95,7 +95,7 @@ public BuiltinUser findByUserName(String userName) { return null; } } - + public List listByUsernamePart ( String part ) { return em.createNamedQuery("BuiltinUser.listByUserNameLike", BuiltinUser.class) .setParameter("userNameLike", "%" + part + "%") @@ -103,8 +103,8 @@ public List listByUsernamePart ( String part ) { } public List findAll() { - return em.createNamedQuery("BuiltinUser.findAll", BuiltinUser.class).getResultList(); - } + return em.createNamedQuery("BuiltinUser.findAll", BuiltinUser.class).getResultList(); + } public String requestPasswordUpgradeLink( BuiltinUser aUser ) throws PasswordResetException { PasswordResetInitResponse prir = passwordResetService.requestPasswordReset(aUser, false, PasswordResetData.Reason.UPGRADE_REQUIRED ); diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/OrcidOAuth2AP.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/OrcidOAuth2AP.java index dbc4b0ac4e6..84c90dba9c1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/OrcidOAuth2AP.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/oauth2/impl/OrcidOAuth2AP.java @@ -196,28 +196,28 @@ private List getNodes( Node node, List path ) { * retrieve email from ORCID 2.0 response document, or empty string if no primary email is present */ private String getPrimaryEmail(Document doc) { - // `xmlstarlet sel -t -c "/record:record/person:person/email:emails/email:email[@primary='true']/email:email"`, if you're curious - String p = "/person/emails/email[@primary='true']/email/text()"; - NodeList emails = xpathMatches( doc, p ); - String primaryEmail = ""; - if ( 1 == emails.getLength() ) { - primaryEmail = emails.item(0).getTextContent(); - } - // if there are no (or somehow more than 1) primary email(s), then we've already at failure value - return primaryEmail; + // `xmlstarlet sel -t -c "/record:record/person:person/email:emails/email:email[@primary='true']/email:email"`, if you're curious + String p = "/person/emails/email[@primary='true']/email/text()"; + NodeList emails = xpathMatches( doc, p ); + String primaryEmail = ""; + if ( 1 == emails.getLength() ) { + primaryEmail = emails.item(0).getTextContent(); + } + // if there are no (or somehow more than 1) primary email(s), then we've already at failure value + return primaryEmail; } /** * retrieve all emails (including primary) from ORCID 2.0 response document */ private List getAllEmails(Document doc) { - String p = "/person/emails/email/email/text()"; - NodeList emails = xpathMatches( doc, p ); - List rs = new ArrayList<>(); - for(int i=0;i rs = new ArrayList<>(); + for(int i=0;i getAllEmails(Document doc) { * if there are no matches) */ private NodeList xpathMatches(Document doc, String pattern) { - XPathFactory xpf = XPathFactory.newInstance(); - XPath xp = xpf.newXPath(); - NodeList matches = null; - try { - XPathExpression srch = xp.compile( pattern ); - matches = (NodeList) srch.evaluate(doc, XPathConstants.NODESET); + XPathFactory xpf = XPathFactory.newInstance(); + XPath xp = xpf.newXPath(); + NodeList matches = null; + try { + XPathExpression srch = xp.compile( pattern ); + matches = (NodeList) srch.evaluate(doc, XPathConstants.NODESET); - } catch( javax.xml.xpath.XPathExpressionException xpe ) { - //no-op; intended for hard-coded xpath expressions that won't change at runtime - } - return matches; + } catch( javax.xml.xpath.XPathExpressionException xpe ) { + //no-op; intended for hard-coded xpath expressions that won't change at runtime + } + return matches; } @Override diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java b/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java index 287cce366b6..bb9f20b1401 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java @@ -40,21 +40,21 @@ * @author rmp553 */ @NamedQueries({ - @NamedQuery( name="AuthenticatedUser.findAll", + @NamedQuery(name="AuthenticatedUser.findAll", query="select au from AuthenticatedUser au"), - @NamedQuery( name="AuthenticatedUser.findSuperUsers", + @NamedQuery(name="AuthenticatedUser.findSuperUsers", query="SELECT au FROM AuthenticatedUser au WHERE au.superuser = TRUE"), - @NamedQuery( name="AuthenticatedUser.findByIdentifier", + @NamedQuery(name="AuthenticatedUser.findByIdentifier", query="select au from AuthenticatedUser au WHERE au.userIdentifier=:identifier"), - @NamedQuery( name="AuthenticatedUser.findByEmail", + @NamedQuery(name="AuthenticatedUser.findByEmail", query="select au from AuthenticatedUser au WHERE LOWER(au.email)=LOWER(:email)"), - @NamedQuery( name="AuthenticatedUser.countOfIdentifier", + @NamedQuery(name="AuthenticatedUser.countOfIdentifier", query="SELECT COUNT(a) FROM AuthenticatedUser a WHERE a.userIdentifier=:identifier"), - @NamedQuery( name="AuthenticatedUser.filter", + @NamedQuery(name="AuthenticatedUser.filter", query="select au from AuthenticatedUser au WHERE (" + "au.userIdentifier like :query OR " + "lower(concat(au.firstName,' ',au.lastName)) like lower(:query))"), - @NamedQuery( name="AuthenticatedUser.findAdminUser", + @NamedQuery(name="AuthenticatedUser.findAdminUser", query="select au from AuthenticatedUser au WHERE " + "au.superuser = true " + "order by au.id") @@ -126,7 +126,7 @@ public String getIdentifier() { @OneToMany(mappedBy = "user", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST}) private List datasetLocks; - + public List getDatasetLocks() { return datasetLocks; } @@ -194,11 +194,11 @@ public String getAuthProviderFactoryAlias() { public void setAuthProviderFactoryAlias(String authProviderFactoryAlias) { this.authProviderFactoryAlias = authProviderFactoryAlias; } - - - + @Override - public boolean isAuthenticated() { return true; } + public boolean isAuthenticated() { + return true; + } public Long getId() { return id; diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/users/GuestUser.java b/src/main/java/edu/harvard/iq/dataverse/authorization/users/GuestUser.java index f16fa5afe36..6f985842dbd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/users/GuestUser.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/users/GuestUser.java @@ -11,9 +11,13 @@ public class GuestUser implements User { private static final GuestUser INSTANCE = new GuestUser(); - public static GuestUser get() { return INSTANCE; } + public static GuestUser get() { + return INSTANCE; + } - private GuestUser(){} + private GuestUser() { + + } @Override public String getIdentifier() { @@ -26,7 +30,9 @@ public RoleAssigneeDisplayInfo getDisplayInfo() { } @Override - public boolean isAuthenticated() { return false; } + public boolean isAuthenticated() { + return false; + } @Override public boolean isSuperuser() { @@ -34,7 +40,7 @@ public boolean isSuperuser() { } @Override - public boolean equals( Object o ) { + public boolean equals(Object o) { return (o instanceof GuestUser); } diff --git a/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordWriter.java b/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordWriter.java index 033b895caeb..09646d86596 100644 --- a/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordWriter.java +++ b/src/main/java/edu/harvard/iq/dataverse/batch/jobs/importer/filesystem/FileRecordWriter.java @@ -336,8 +336,7 @@ private DataFile createPackageDataFile(List files) { jobContext.setExitStatus("FAILED"); return null; } - - + packageFile.setFilesize(totalSize); packageFile.setModificationTime(new Timestamp(new Date().getTime())); packageFile.setCreateDate(new Timestamp(new Date().getTime())); @@ -353,44 +352,45 @@ private DataFile createPackageDataFile(List files) { fmd.setDataFile(packageFile); packageFile.getFileMetadatas().add(fmd); - if (dataset.getLatestVersion().getFileMetadatas() == null) dataset.getLatestVersion().setFileMetadatas(new ArrayList<>()); + if (dataset.getLatestVersion().getFileMetadatas() == null) { + dataset.getLatestVersion().setFileMetadatas(new ArrayList<>()); + } dataset.getLatestVersion().getFileMetadatas().add(fmd); fmd.setDatasetVersion(dataset.getLatestVersion()); - String isFilePIDsEnabled = commandEngine.getContext().settings().getValueForKey(SettingsServiceBean.Key.FilePIDsEnabled, "true"); //default value for file PIDs is 'true' - if ("true".contentEquals( isFilePIDsEnabled )) { - - GlobalIdServiceBean idServiceBean = GlobalIdServiceBean.getBean(packageFile.getProtocol(), commandEngine.getContext()); - if (packageFile.getIdentifier() == null || packageFile.getIdentifier().isEmpty()) { - packageFile.setIdentifier(dataFileServiceBean.generateDataFileIdentifier(packageFile, idServiceBean)); - } - String nonNullDefaultIfKeyNotFound = ""; - String protocol = commandEngine.getContext().settings().getValueForKey(SettingsServiceBean.Key.Protocol, nonNullDefaultIfKeyNotFound); - String authority = commandEngine.getContext().settings().getValueForKey(SettingsServiceBean.Key.Authority, nonNullDefaultIfKeyNotFound); - if (packageFile.getProtocol() == null) { - packageFile.setProtocol(protocol); - } - if (packageFile.getAuthority() == null) { - packageFile.setAuthority(authority); - } + String isFilePIDsEnabled = commandEngine.getContext().settings().getValueForKey(SettingsServiceBean.Key.FilePIDsEnabled, "true"); //default value for file PIDs is 'true' + if ("true".contentEquals(isFilePIDsEnabled)) { - if (!packageFile.isIdentifierRegistered()) { - String doiRetString = ""; - idServiceBean = GlobalIdServiceBean.getBean(commandEngine.getContext()); - try { - doiRetString = idServiceBean.createIdentifier(packageFile); - } catch (Throwable e) { - + GlobalIdServiceBean idServiceBean = GlobalIdServiceBean.getBean(packageFile.getProtocol(), commandEngine.getContext()); + if (packageFile.getIdentifier() == null || packageFile.getIdentifier().isEmpty()) { + packageFile.setIdentifier(dataFileServiceBean.generateDataFileIdentifier(packageFile, idServiceBean)); } + String nonNullDefaultIfKeyNotFound = ""; + String protocol = commandEngine.getContext().settings().getValueForKey(SettingsServiceBean.Key.Protocol, nonNullDefaultIfKeyNotFound); + String authority = commandEngine.getContext().settings().getValueForKey(SettingsServiceBean.Key.Authority, nonNullDefaultIfKeyNotFound); + if (packageFile.getProtocol() == null) { + packageFile.setProtocol(protocol); + } + if (packageFile.getAuthority() == null) { + packageFile.setAuthority(authority); + } + + if (!packageFile.isIdentifierRegistered()) { + String doiRetString = ""; + idServiceBean = GlobalIdServiceBean.getBean(commandEngine.getContext()); + try { + doiRetString = idServiceBean.createIdentifier(packageFile); + } catch (Throwable e) { + } - // Check return value to make sure registration succeeded - if (!idServiceBean.registerWhenPublished() && doiRetString.contains(packageFile.getIdentifier())) { - packageFile.setIdentifierRegistered(true); - packageFile.setGlobalIdCreateTime(new Date()); + // Check return value to make sure registration succeeded + if (!idServiceBean.registerWhenPublished() && doiRetString.contains(packageFile.getIdentifier())) { + packageFile.setIdentifierRegistered(true); + packageFile.setGlobalIdCreateTime(new Date()); + } } } - } getJobLogger().log(Level.INFO, "Successfully created a file of type package"); diff --git a/src/main/java/edu/harvard/iq/dataverse/batch/util/LoggingUtil.java b/src/main/java/edu/harvard/iq/dataverse/batch/util/LoggingUtil.java index eccb8c0f9eb..c9d8978a24c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/batch/util/LoggingUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/batch/util/LoggingUtil.java @@ -37,17 +37,17 @@ public class LoggingUtil { private static final Logger logger = Logger.getLogger(LoggingUtil.class.getName()); public static void saveJsonLog(String jobJson, String logDir, String jobId) { - try { - checkCreateLogDirectory( logDir ); - File dir = new File(logDir); - if (!dir.exists() && !dir.mkdirs()) { - logger.log(Level.SEVERE, "Couldn't create directory: " + dir.getAbsolutePath()); - } - File reportJson = new File(dir.getAbsolutePath() + "/job-" + jobId + ".json"); - FileUtils.writeStringToFile(reportJson, jobJson); - } catch (Exception e) { - logger.log(Level.SEVERE, "Error saving json report: " + e.getMessage()); - } + try { + checkCreateLogDirectory( logDir ); + File dir = new File(logDir); + if (!dir.exists() && !dir.mkdirs()) { + logger.log(Level.SEVERE, "Couldn't create directory: " + dir.getAbsolutePath()); + } + File reportJson = new File(dir.getAbsolutePath() + "/job-" + jobId + ".json"); + FileUtils.writeStringToFile(reportJson, jobJson); + } catch (Exception e) { + logger.log(Level.SEVERE, "Error saving json report: " + e.getMessage()); + } } public static ActionLogRecord getActionLogRecord(String userId, JobExecution jobExec, String jobInfo, String jobId) { @@ -73,50 +73,42 @@ public static ActionLogRecord getActionLogRecord(String userId, JobExecution job /** * check if the directory for log files exists, and create if necessary */ - private static void checkCreateLogDirectory( String logDir ) - { - try - { - File d = new File( logDir ); - if ( ! d.exists() ) - { - logger.log(Level.INFO,"log directory: " + d.getAbsolutePath() + " absent, trying to create"); - d.mkdirs(); - if ( ! d.exists() ) - { - logger.log(Level.SEVERE,"unable to create log directory: " + d.getAbsolutePath() ); - } - else - { - logger.log(Level.INFO,"log directory: " + d.getAbsolutePath() + " created"); - } - } - } - catch( SecurityException e) - { - logger.log( Level.SEVERE, "security exception checking / creating log directory: " + logDir ); - } + private static void checkCreateLogDirectory(String logDir) { + try { + File d = new File(logDir); + if (!d.exists()) { + logger.log(Level.INFO,"log directory: " + d.getAbsolutePath() + " absent, trying to create"); + d.mkdirs(); + if (!d.exists()) { + logger.log(Level.SEVERE,"unable to create log directory: " + d.getAbsolutePath() ); + } else { + logger.log(Level.INFO,"log directory: " + d.getAbsolutePath() + " created"); + } + } + } catch(SecurityException e) { + logger.log( Level.SEVERE, "security exception checking / creating log directory: " + logDir ); + } } public static Logger getJobLogger(String jobId) { - try { - Logger jobLogger = Logger.getLogger("job-"+jobId); - FileHandler fh; - String logDir = System.getProperty("com.sun.aas.instanceRoot") + System.getProperty("file.separator") - + "logs" + System.getProperty("file.separator") + "batch-jobs" + System.getProperty("file.separator"); - checkCreateLogDirectory( logDir ); - fh = new FileHandler(logDir + "job-" + jobId + ".log"); - logger.log(Level.INFO, "JOB LOG: " + logDir + "job-" + jobId + ".log"); - jobLogger.addHandler(fh); - fh.setFormatter(new JobLogFormatter()); - return jobLogger; - } catch (SecurityException e) { - logger.log(Level.SEVERE, "Unable to create job logger: " + e.getMessage()); - return null; - } catch (IOException e) { - logger.log(Level.SEVERE, "Unable to create job logger: " + e.getMessage()); - return null; - } + try { + Logger jobLogger = Logger.getLogger("job-"+jobId); + FileHandler fh; + String logDir = System.getProperty("com.sun.aas.instanceRoot") + System.getProperty("file.separator") + + "logs" + System.getProperty("file.separator") + "batch-jobs" + System.getProperty("file.separator"); + checkCreateLogDirectory( logDir ); + fh = new FileHandler(logDir + "job-" + jobId + ".log"); + logger.log(Level.INFO, "JOB LOG: " + logDir + "job-" + jobId + ".log"); + jobLogger.addHandler(fh); + fh.setFormatter(new JobLogFormatter()); + return jobLogger; + } catch (SecurityException e) { + logger.log(Level.SEVERE, "Unable to create job logger: " + e.getMessage()); + return null; + } catch (IOException e) { + logger.log(Level.SEVERE, "Unable to create job logger: " + e.getMessage()); + return null; + } } public static class JobLogFormatter extends Formatter { diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIO.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIO.java index 93d67be3d63..a62a606cc86 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIO.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/FileAccessIO.java @@ -33,7 +33,6 @@ import java.nio.file.Paths; import java.util.List; - // Dataverse imports: import edu.harvard.iq.dataverse.DataFile; import edu.harvard.iq.dataverse.Dataset; @@ -46,7 +45,6 @@ import java.nio.file.StandardCopyOption; import java.util.ArrayList; - public class FileAccessIO extends StorageIO { public FileAccessIO () { @@ -572,10 +570,9 @@ public boolean accept(Path file) throws IOException { public InputStream getAuxFileAsInputStream(String auxItemTag) throws IOException { InputStream in = null; - if(this.isAuxObjectCached(auxItemTag)) - { - Path path=getAuxObjectAsPath(auxItemTag); - in=Files.newInputStream(path); + if (this.isAuxObjectCached(auxItemTag)) { + Path path = getAuxObjectAsPath(auxItemTag); + in = Files.newInputStream(path); } return in; } diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/StorageIO.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/StorageIO.java index 99eb36d44b0..a6575355de9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/StorageIO.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/StorageIO.java @@ -66,10 +66,7 @@ public StorageIO(T dvObject, DataAccessRequest req) { } } - - // Abstract methods to be implemented by the storage drivers: - public abstract void open(DataAccessOption... option) throws IOException; protected boolean isReadAccess = false; @@ -247,8 +244,7 @@ public ReadableByteChannel getReadChannel() throws IOException { return (ReadableByteChannel) channel; } - public DvObject getDvObject() - { + public DvObject getDvObject() { return dvObject; } diff --git a/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBean.java index c33b4e0fc71..d87fa541365 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleServiceBean.java @@ -28,7 +28,8 @@ public class DataCaptureModuleServiceBean implements Serializable { public static String scriptRequestPath = "/sr.py"; // TODO: Do we care about authenticating to the DCM? If not, no need for AuthenticatedUser here. - public UploadRequestResponse requestRsyncScriptCreation(String jsonString, String uploadRequestUrl) throws DataCaptureModuleException { + public UploadRequestResponse requestRsyncScriptCreation(String jsonString, String uploadRequestUrl) + throws DataCaptureModuleException { logger.fine("requestRsyncScriptCreation using JSON string: " + jsonString + " and sending to " + uploadRequestUrl); try { HttpResponse uploadRequest = Unirest.post(uploadRequestUrl) @@ -42,21 +43,19 @@ public UploadRequestResponse requestRsyncScriptCreation(String jsonString, Strin throw new DataCaptureModuleException(error, ex); } } - public ScriptRequestResponse retreiveRequestedRsyncScript(String datasetIdentifier, String scriptRequestUrl) throws DataCaptureModuleException - { + + public ScriptRequestResponse retreiveRequestedRsyncScript(String datasetIdentifier, String scriptRequestUrl) + throws DataCaptureModuleException { logger.fine("retreiveRequestedRsyncScript using dataset identifier + " + datasetIdentifier + " to " + scriptRequestUrl); - try - { + try { //When the result is an error, html is returned from DCM instead of json. This causes the parser to blow up unhelpfully. //Stock unirest hasn't been updated in years, but in a fork this issue seems to be improved: https://github.com/OpenUnirest/unirest-java/issues/10 HttpResponse scriptRequest = Unirest.post(scriptRequestUrl) .field("datasetIdentifier", datasetIdentifier) .asJson(); return DataCaptureModuleUtil.getScriptFromRequest(scriptRequest); - } - catch( UnirestException ex) - { - String error = "Error calling " + scriptRequestUrl + ". This likely indicates the DCM service returned an error page and not valid json. Unirest parsing error: " + ex; + } catch( UnirestException ex) { + String error = "Error calling " + scriptRequestUrl + ". This likely indicates the DCM service returned an error page and not valid json. Unirest parsing error: " + ex; logger.info(error); throw new DataCaptureModuleException(error, ex); } diff --git a/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/ScriptRequestResponse.java b/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/ScriptRequestResponse.java index 6f9fb8d327e..55d20f8fe87 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/ScriptRequestResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/ScriptRequestResponse.java @@ -15,8 +15,8 @@ public ScriptRequestResponse(int httpStatusCode) { this.script = null; this.datasetIdentifier = null; } - public ScriptRequestResponse(int httpStatusCode, String datasetIdentifier, long userId, String script) - { + + public ScriptRequestResponse(int httpStatusCode, String datasetIdentifier, long userId, String script) { this.httpStatusCode = httpStatusCode; this.datasetIdentifier = datasetIdentifier; this.userId = userId; @@ -40,8 +40,7 @@ public String getScript() { return script; } - public String getDatasetIdentifier() - { + public String getDatasetIdentifier() { return datasetIdentifier; } diff --git a/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java b/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java index 9ac51d92f1b..a40babf5310 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java @@ -56,10 +56,9 @@ public static List getThumbnailCandidates(Dataset dataset, boo // byte[] bytes = Files.readAllBytes(file.toPath()); StorageIO dataAccess = null; - try{ + try { dataAccess = DataAccess.getStorageIO(dataset); - } - catch(IOException ioex){ + } catch(IOException ioex) { } InputStream in = null; @@ -81,7 +80,7 @@ public static List getThumbnailCandidates(Dataset dataset, boo } else { logger.fine("There is no thumbnail created from a dataset logo"); } - IOUtils.closeQuietly(in); + IOUtils.closeQuietly(in); } for (FileMetadata fileMetadata : dataset.getLatestVersion().getFileMetadatas()) { DataFile dataFile = fileMetadata.getDataFile(); @@ -145,10 +144,9 @@ public static DatasetThumbnail getThumbnail(Dataset dataset, DatasetVersion data } catch (IOException ex) { logger.fine("Unable to read thumbnail image from file: " + ex); return null; - } finally - { - IOUtils.closeQuietly(in); - } + } finally { + IOUtils.closeQuietly(in); + } } else { DataFile thumbnailFile = dataset.getThumbnailFile(); @@ -404,22 +402,22 @@ public static List getDatasetSummaryFields(DatasetVersion datasetV List datasetFields = new ArrayList<>(); //if customFields are empty, go with default fields. - if(customFields==null || customFields.isEmpty()){ - customFields="dsDescription,subject,keyword,publication,notesText"; + if (customFields==null || customFields.isEmpty()) { + customFields="dsDescription,subject,keyword,publication,notesText"; } - String[] customFieldList= customFields.split(","); + String[] customFieldList = customFields.split(","); Map DatasetFieldsSet=new HashMap<>(); for (DatasetField dsf : datasetVersion.getFlatDatasetFields()) { DatasetFieldsSet.put(dsf.getDatasetFieldType().getName(),dsf); } - for(String cfl : customFieldList) - { - DatasetField df = DatasetFieldsSet.get(cfl); - if(df!=null) + for(String cfl : customFieldList) { + DatasetField df = DatasetFieldsSet.get(cfl); + if (df != null) { datasetFields.add(df); + } } return datasetFields; diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/DataverseEngine.java b/src/main/java/edu/harvard/iq/dataverse/engine/DataverseEngine.java index c3734cf8b8e..38e41aa43b6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/DataverseEngine.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/DataverseEngine.java @@ -10,13 +10,13 @@ * @author michael */ public interface DataverseEngine { - - /** - * Submits a command for immediate execution. - * @param The command result's type. - * @param aCommand The command to execute - * @return The result of the command execution. - * @throws CommandException - */ - public R submit( Command aCommand ) throws CommandException; + + /** + * Submits a command for immediate execution. + * @param The command result's type. + * @param aCommand The command to execute + * @return The result of the command execution. + * @throws CommandException + */ + public R submit( Command aCommand ) throws CommandException; } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/AbstractVoidCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/AbstractVoidCommand.java index 24d04a2efd1..4706fd7200e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/AbstractVoidCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/AbstractVoidCommand.java @@ -11,25 +11,25 @@ * @author michael */ public abstract class AbstractVoidCommand extends AbstractCommand { - - public AbstractVoidCommand(DataverseRequest aRequest, DvObject dvObject) { - super(aRequest, dvObject); - } - - public AbstractVoidCommand(DataverseRequest aRequest, DvNamePair dvp, DvNamePair... more) { - super(aRequest, dvp, more); - } - - public AbstractVoidCommand(DataverseRequest aRequest, Map someAffectedDataversae) { - super(aRequest, someAffectedDataversae); - } - - @Override - public final Void execute(CommandContext ctxt) throws CommandException { - executeImpl(ctxt); - return null; - } - - protected abstract void executeImpl( CommandContext ctxt ) throws CommandException; - + + public AbstractVoidCommand(DataverseRequest aRequest, DvObject dvObject) { + super(aRequest, dvObject); + } + + public AbstractVoidCommand(DataverseRequest aRequest, DvNamePair dvp, DvNamePair... more) { + super(aRequest, dvp, more); + } + + public AbstractVoidCommand(DataverseRequest aRequest, Map someAffectedDataversae) { + super(aRequest, someAffectedDataversae); + } + + @Override + public final Void execute(CommandContext ctxt) throws CommandException { + executeImpl(ctxt); + return null; + } + + protected abstract void executeImpl( CommandContext ctxt ) throws CommandException; + } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/Command.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/Command.java index c6093432092..00b788ab29f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/Command.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/Command.java @@ -13,33 +13,31 @@ */ public interface Command { - /** - * Override this method to execute the actual command. - * @param ctxt the context on which the command work. All dependency injections, if any, should be done using this. - * @return A result. May be {@code null} - * @throws CommandException If anything goes wrong. - */ - public R execute( CommandContext ctxt ) throws CommandException; - - - /** - * Retrieves the {@link DvObject}s this command works on. Used by the {@link DataverseEngine} - * to validate that the user - * has the permissions required to execute {@code this} command. - * - * @return The DvObjects on which the command will work - */ - public Map getAffectedDvObjects(); - - - /** - * @return The request under which this command is being executed. - */ - public DataverseRequest getRequest(); + /** + * Override this method to execute the actual command. + * @param ctxt the context on which the command work. All dependency injections, if any, should be done using this. + * @return A result. May be {@code null} + * @throws CommandException If anything goes wrong. + */ + public R execute( CommandContext ctxt ) throws CommandException; + + /** + * Retrieves the {@link DvObject}s this command works on. Used by the {@link DataverseEngine} + * to validate that the user + * has the permissions required to execute {@code this} command. + * + * @return The DvObjects on which the command will work + */ + public Map getAffectedDvObjects(); + + /** + * @return The request under which this command is being executed. + */ + public DataverseRequest getRequest(); - /** - * @return A map of the permissions required for this command - */ + /** + * @return A map of the permissions required for this command + */ Map> getRequiredPermissions(); public String describe(); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandHelper.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandHelper.java index 8c0c26c5c12..e4217a9cf85 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/CommandHelper.java @@ -10,22 +10,22 @@ * @author michael */ public class CommandHelper { - - public static final CommandHelper CH = new CommandHelper(); - - /** + + public static final CommandHelper CH = new CommandHelper(); + + /** * Given a {@link Command} sub-class, returns the set of permissions needed * to be able to execute it. Needed permissions are specified by annotating * the command's class with the {@link RequiredPermissions} annotation. - * - * @param cmdClass A class of command + * + * @param cmdClass A class of command * @return Set of permissions, or {@code null} if the command's class was * not annotated. - */ + */ public Map> permissionsRequired(Class cmdClass) { - RequiredPermissions requiredPerms = cmdClass.getAnnotation(RequiredPermissions.class); + RequiredPermissions requiredPerms = cmdClass.getAnnotation(RequiredPermissions.class); if (requiredPerms == null) { - // try for the permission map + // try for the permission map RequiredPermissionsMap reqPermMap = cmdClass.getAnnotation(RequiredPermissionsMap.class); if (reqPermMap == null) { // No annotations here. Look up the class hierachy @@ -37,35 +37,35 @@ public Map> permissionsRequired(Class + ", and its superclasses, do not declare required permissions."); } } - Map> retVal = new TreeMap<>(); + Map> retVal = new TreeMap<>(); for (RequiredPermissions rp : reqPermMap.value()) { retVal.put(rp.dataverseName(), asPermissionSet(rp.value())); - } - return retVal; - - } else { - Permission[] required = requiredPerms.value(); - return Collections.singletonMap(requiredPerms.dataverseName(), + } + return retVal; + + } else { + Permission[] required = requiredPerms.value(); + return Collections.singletonMap(requiredPerms.dataverseName(), asPermissionSet(required)); - } - } - - /** + } + } + + /** * Given a command, returns the set of permissions needed to be able to * execute it. Needed permissions are specified by annotating the command's * class with the {@link RequiredPermissions} annotation. - * - * @param c The command + * + * @param c The command * @return Set of permissions, or {@code null} if the command's class was * not annotated. - */ + */ public Map> permissionsRequired(Command c) { - return permissionsRequired(c.getClass()); - } - + return permissionsRequired(c.getClass()); + } + private Set asPermissionSet(Permission[] permissionArray) { return (permissionArray.length == 0) ? EnumSet.noneOf(Permission.class) : (permissionArray.length == 1) ? EnumSet.of(permissionArray[0]) - : EnumSet.of(permissionArray[0], permissionArray); - } + : EnumSet.of(permissionArray[0], permissionArray); + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/RequiredPermissions.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/RequiredPermissions.java index 9e68c4f5068..6ef377a441d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/RequiredPermissions.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/RequiredPermissions.java @@ -15,6 +15,6 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface RequiredPermissions { - Permission[] value(); - String dataverseName() default ""; // TODO change to "dvObjectName" + Permission[] value(); + String dataverseName() default ""; // TODO change to "dvObjectName" } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/RequiredPermissionsMap.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/RequiredPermissionsMap.java index 30a16f88ec0..d30da250480 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/RequiredPermissionsMap.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/RequiredPermissionsMap.java @@ -18,5 +18,5 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface RequiredPermissionsMap { - RequiredPermissions[] value(); + RequiredPermissions[] value(); } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/CommandException.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/CommandException.java index 8a3c895c403..9bb6cdf9d15 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/CommandException.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/CommandException.java @@ -7,22 +7,22 @@ * @author michael */ public class CommandException extends Exception { - - private final Command failedCommand; - - - public CommandException(String message, Command aCommand) { - super(message); - failedCommand = aCommand; - } - public CommandException(String message, Throwable cause, Command aCommand) { - super(message, cause); - failedCommand = aCommand; - } + private final Command failedCommand; + + + public CommandException(String message, Command aCommand) { + super(message); + failedCommand = aCommand; + } + + public CommandException(String message, Throwable cause, Command aCommand) { + super(message, cause); + failedCommand = aCommand; + } + + public Command getFailedCommand() { + return failedCommand; + } - public Command getFailedCommand() { - return failedCommand; - } - } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/CommandExecutionException.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/CommandExecutionException.java index 40e690796cd..d574ad27363 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/CommandExecutionException.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/CommandExecutionException.java @@ -8,12 +8,12 @@ */ public class CommandExecutionException extends CommandException { - public CommandExecutionException(String message, Throwable cause, Command aCommand) { - super(message, cause, aCommand); - } - - public CommandExecutionException(String message, Command aCommand) { - super(message, aCommand); - } - + public CommandExecutionException(String message, Throwable cause, Command aCommand) { + super(message, cause, aCommand); + } + + public CommandExecutionException(String message, Command aCommand) { + super(message, aCommand); + } + } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/IllegalCommandException.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/IllegalCommandException.java index ee9cfeb6da7..d0ae85c8bca 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/IllegalCommandException.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/IllegalCommandException.java @@ -10,8 +10,8 @@ */ public class IllegalCommandException extends CommandException { - public IllegalCommandException(String message, Command aCommand) { - super(message, aCommand); + public IllegalCommandException(String message, Command aCommand) { + super(message, aCommand); } - + } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/PermissionException.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/PermissionException.java index a7881fc7b6e..944fdb51d3c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/PermissionException.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/exception/PermissionException.java @@ -12,22 +12,22 @@ * @author michael */ public class PermissionException extends CommandException { - - private final Set required; - private final DvObject dvObject; - - public PermissionException(String message, Command failedCommand, Set required, DvObject aDvObject ) { - super(message, failedCommand); - this.required = required; - dvObject = aDvObject; - } - public Set getRequiredPermissions() { - return required; - } + private final Set required; + private final DvObject dvObject; + + public PermissionException(String message, Command failedCommand, Set required, DvObject aDvObject ) { + super(message, failedCommand); + this.required = required; + dvObject = aDvObject; + } + + public Set getRequiredPermissions() { + return required; + } + + public DvObject getDvObject() { + return dvObject; + } - public DvObject getDvObject() { - return dvObject; - } - } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateGuestbookCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateGuestbookCommand.java index 2e55b26ed6e..c40c5f06b95 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateGuestbookCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateGuestbookCommand.java @@ -20,19 +20,18 @@ */ @RequiredPermissions( Permission.EditDataverse ) public class CreateGuestbookCommand extends AbstractCommand { - private final Guestbook created; - private final Dataverse dv; - - public CreateGuestbookCommand(Guestbook guestbook, DataverseRequest aRequest, Dataverse anAffectedDataverse) { - super(aRequest, anAffectedDataverse); - created = guestbook; - dv = anAffectedDataverse; - } - - @Override - public Guestbook execute(CommandContext ctxt) throws CommandException { - - return ctxt.guestbooks().save(created); - } + private final Guestbook created; + private final Dataverse dv; + public CreateGuestbookCommand(Guestbook guestbook, DataverseRequest aRequest, Dataverse anAffectedDataverse) { + super(aRequest, anAffectedDataverse); + created = guestbook; + dv = anAffectedDataverse; + } + + @Override + public Guestbook execute(CommandContext ctxt) throws CommandException { + return ctxt.guestbooks().save(created); + } + } diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java index 03177ee8c1f..eeff4388624 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateTemplateCommand.java @@ -9,25 +9,25 @@ import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; + /** * * @author skraffmiller */ @RequiredPermissions( Permission.EditDataverse ) public class CreateTemplateCommand extends AbstractCommand