From 65f04fcec9390c6b4678039c63f535e0ed18e59d Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 24 Nov 2020 10:55:08 -0500 Subject: [PATCH 01/16] First batch of errorprone fixes. #3061 --- .../org/dspace/authorize/ResourcePolicy.java | 1 + .../java/org/dspace/content/Bitstream.java | 16 +------ .../org/dspace/content/BitstreamFormat.java | 10 ++-- .../dspace/content/CollectionServiceImpl.java | 2 +- .../java/org/dspace/content/Community.java | 15 +----- .../dspace/content/CommunityServiceImpl.java | 2 +- .../main/java/org/dspace/content/DCDate.java | 2 +- .../java/org/dspace/content/DSpaceObject.java | 3 +- .../content/DSpaceObjectServiceImpl.java | 6 +-- .../dspace/content/InProgressSubmission.java | 2 +- .../main/java/org/dspace/content/Item.java | 19 ++------ .../org/dspace/content/MetadataField.java | 9 ++-- .../org/dspace/content/MetadataFieldName.java | 46 +++++++++---------- .../org/dspace/content/MetadataSchema.java | 2 +- .../org/dspace/content/MetadataValue.java | 8 ++-- .../content/service/BitstreamService.java | 1 + .../main/java/org/dspace/core/Context.java | 2 - .../main/java/org/dspace/core/I18nUtil.java | 14 ++---- .../src/main/java/org/dspace/core/Utils.java | 33 +++++++------ .../dspace/curate/AbstractCurationTask.java | 3 -- .../java/org/dspace/curate/CitationPage.java | 36 +++++++++------ .../java/org/dspace/curate/TaskResolver.java | 12 +++-- .../discovery/FullTextContentStreams.java | 16 ++++--- .../org/dspace/event/ConsumerProfile.java | 4 +- .../src/main/java/org/dspace/event/Event.java | 9 ++-- .../main/java/org/dspace/handle/Handle.java | 2 +- .../text/filter/InitialArticleWord.java | 7 +-- .../storedcomponents/InProgressUser.java | 1 + .../dspace/content/MetadataFieldNameTest.java | 12 ++--- 29 files changed, 134 insertions(+), 161 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java index b84055b8b0..d0605c31b3 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java +++ b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java @@ -169,6 +169,7 @@ public class ResourcePolicy implements ReloadableEntity { * * @return the internal identifier */ + @Override public Integer getID() { return id; } diff --git a/dspace-api/src/main/java/org/dspace/content/Bitstream.java b/dspace-api/src/main/java/org/dspace/content/Bitstream.java index 39d78b0491..451a3b7578 100644 --- a/dspace-api/src/main/java/org/dspace/content/Bitstream.java +++ b/dspace-api/src/main/java/org/dspace/content/Bitstream.java @@ -21,7 +21,6 @@ import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Transient; -import org.apache.log4j.Logger; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamService; import org.dspace.core.Constants; @@ -36,17 +35,10 @@ import org.hibernate.proxy.HibernateProxyHelper; * the contents of a bitstream; you need to create a new bitstream. * * @author Robert Tansley - * @version $Revision$ */ @Entity @Table(name = "bitstream") public class Bitstream extends DSpaceObject implements DSpaceObjectLegacySupport { - - /** - * log4j logger - */ - private static Logger log = Logger.getLogger(Bitstream.class); - @Column(name = "bitstream_id", insertable = false, updatable = false) private Integer legacyId; @@ -411,7 +403,7 @@ public class Bitstream extends DSpaceObject implements DSpaceObjectLegacySupport */ @Override public boolean equals(Object other) { - if (other == null) { + if (!(other instanceof Bitstream)) { return false; } Class objClass = HibernateProxyHelper.getClassWithoutInitializingProxy(other); @@ -419,11 +411,7 @@ public class Bitstream extends DSpaceObject implements DSpaceObjectLegacySupport return false; } final Bitstream otherBitstream = (Bitstream) other; - if (!this.getID().equals(otherBitstream.getID())) { - return false; - } - - return true; + return this.getID().equals(otherBitstream.getID()); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java b/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java index d543cc7c6e..5cf787ffd5 100644 --- a/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java +++ b/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java @@ -40,7 +40,6 @@ import org.hibernate.proxy.HibernateProxyHelper; * when update is called. * * @author Robert Tansley - * @version $Revision$ */ @Entity @Table(name = "bitstreamformatregistry") @@ -120,6 +119,7 @@ public class BitstreamFormat implements Serializable, ReloadableEntity * * @return the internal identifier */ + @Override public final Integer getID() { return id; } @@ -267,7 +267,7 @@ public class BitstreamFormat implements Serializable, ReloadableEntity */ @Override public boolean equals(Object other) { - if (other == null) { + if (!(other instanceof BitstreamFormat)) { return false; } Class objClass = HibernateProxyHelper.getClassWithoutInitializingProxy(other); @@ -275,11 +275,7 @@ public class BitstreamFormat implements Serializable, ReloadableEntity return false; } final BitstreamFormat otherBitstreamFormat = (BitstreamFormat) other; - if (!this.getID().equals(otherBitstreamFormat.getID())) { - return false; - } - - return true; + return this.getID().equals(otherBitstreamFormat.getID()); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java index 10bf11c0bc..d180d80ab9 100644 --- a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java @@ -310,7 +310,7 @@ public class CollectionServiceImpl extends DSpaceObjectServiceImpl i * whitespace. */ if (value == null) { - clearMetadata(context, collection, field.SCHEMA, field.ELEMENT, field.QUALIFIER, Item.ANY); + clearMetadata(context, collection, field.schema, field.element, field.qualifier, Item.ANY); collection.setMetadataModified(); } else { super.setMetadataSingleValue(context, collection, field, null, value); diff --git a/dspace-api/src/main/java/org/dspace/content/Community.java b/dspace-api/src/main/java/org/dspace/content/Community.java index 810caaf4fd..088984928f 100644 --- a/dspace-api/src/main/java/org/dspace/content/Community.java +++ b/dspace-api/src/main/java/org/dspace/content/Community.java @@ -24,7 +24,6 @@ import javax.persistence.Table; import javax.persistence.Transient; import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.apache.logging.log4j.Logger; import org.dspace.content.comparator.NameAscendingComparator; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CommunityService; @@ -42,18 +41,12 @@ import org.hibernate.proxy.HibernateProxyHelper; * update is called. * * @author Robert Tansley - * @version $Revision$ */ @Entity @Table(name = "community") @Cacheable @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, include = "non-lazy") public class Community extends DSpaceObject implements DSpaceObjectLegacySupport { - /** - * log4j category - */ - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Community.class); - @Column(name = "community_id", insertable = false, updatable = false) private Integer legacyId; @@ -215,7 +208,7 @@ public class Community extends DSpaceObject implements DSpaceObjectLegacySupport */ @Override public boolean equals(Object other) { - if (other == null) { + if (!(other instanceof Community)) { return false; } Class objClass = HibernateProxyHelper.getClassWithoutInitializingProxy(other); @@ -223,11 +216,7 @@ public class Community extends DSpaceObject implements DSpaceObjectLegacySupport return false; } final Community otherCommunity = (Community) other; - if (!this.getID().equals(otherCommunity.getID())) { - return false; - } - - return true; + return this.getID().equals(otherCommunity.getID()); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java index 4b953820ad..7a497d0e10 100644 --- a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java @@ -192,7 +192,7 @@ public class CommunityServiceImpl extends DSpaceObjectServiceImpl imp * whitespace. */ if (value == null) { - clearMetadata(context, community, field.SCHEMA, field.ELEMENT, field.QUALIFIER, Item.ANY); + clearMetadata(context, community, field.schema, field.element, field.qualifier, Item.ANY); community.setMetadataModified(); } else { super.setMetadataSingleValue(context, community, field, null, value); diff --git a/dspace-api/src/main/java/org/dspace/content/DCDate.java b/dspace-api/src/main/java/org/dspace/content/DCDate.java index 4acccb2d84..47ed805d4a 100644 --- a/dspace-api/src/main/java/org/dspace/content/DCDate.java +++ b/dspace-api/src/main/java/org/dspace/content/DCDate.java @@ -39,7 +39,6 @@ import org.apache.logging.log4j.Logger; * * @author Robert Tansley * @author Larry Stone - * @version $Revision$ */ public class DCDate { /** @@ -370,6 +369,7 @@ public class DCDate { * * @return The date as a string. */ + @Override public String toString() { if (calendar == null) { return "null"; diff --git a/dspace-api/src/main/java/org/dspace/content/DSpaceObject.java b/dspace-api/src/main/java/org/dspace/content/DSpaceObject.java index a486fed82a..73ca37f7c1 100644 --- a/dspace-api/src/main/java/org/dspace/content/DSpaceObject.java +++ b/dspace-api/src/main/java/org/dspace/content/DSpaceObject.java @@ -61,7 +61,7 @@ public abstract class DSpaceObject implements Serializable, ReloadableEntity handles = new ArrayList<>(); @OneToMany(fetch = FetchType.LAZY, mappedBy = "dSpaceObject", cascade = CascadeType.ALL) - private List resourcePolicies = new ArrayList<>(); + private final List resourcePolicies = new ArrayList<>(); /** * True if anything else was changed since last update() @@ -122,6 +122,7 @@ public abstract class DSpaceObject implements Serializable, ReloadableEntity implements @Override public String getMetadataFirstValue(T dso, MetadataFieldName field, String language) { List metadataValues - = getMetadata(dso, field.SCHEMA, field.ELEMENT, field.QUALIFIER, language); + = getMetadata(dso, field.schema, field.element, field.qualifier, language); if (CollectionUtils.isNotEmpty(metadataValues)) { return metadataValues.get(0).getValue(); } @@ -447,11 +447,11 @@ public abstract class DSpaceObjectServiceImpl implements String language, String value) throws SQLException { if (value != null) { - clearMetadata(context, dso, field.SCHEMA, field.ELEMENT, field.QUALIFIER, + clearMetadata(context, dso, field.schema, field.element, field.qualifier, language); String newValueLanguage = (Item.ANY.equals(language)) ? null : language; - addMetadata(context, dso, field.SCHEMA, field.ELEMENT, field.QUALIFIER, + addMetadata(context, dso, field.schema, field.element, field.qualifier, newValueLanguage, value); dso.setMetadataModified(); } diff --git a/dspace-api/src/main/java/org/dspace/content/InProgressSubmission.java b/dspace-api/src/main/java/org/dspace/content/InProgressSubmission.java index 5e7a04c4c9..42ef449c7d 100644 --- a/dspace-api/src/main/java/org/dspace/content/InProgressSubmission.java +++ b/dspace-api/src/main/java/org/dspace/content/InProgressSubmission.java @@ -17,7 +17,6 @@ import org.dspace.eperson.EPerson; * which stage of submission they are (in workspace or workflow system) * * @author Robert Tansley - * @version $Revision$ */ public interface InProgressSubmission extends ReloadableEntity { /** @@ -25,6 +24,7 @@ public interface InProgressSubmission extends ReloadableEntity { * * @return the internal identifier */ + @Override Integer getID(); /** diff --git a/dspace-api/src/main/java/org/dspace/content/Item.java b/dspace-api/src/main/java/org/dspace/content/Item.java index 22a9a4de52..b4b4ac2b2d 100644 --- a/dspace-api/src/main/java/org/dspace/content/Item.java +++ b/dspace-api/src/main/java/org/dspace/content/Item.java @@ -27,7 +27,6 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; -import org.apache.log4j.Logger; import org.dspace.content.comparator.NameAscendingComparator; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.ItemService; @@ -48,17 +47,10 @@ import org.hibernate.proxy.HibernateProxyHelper; * * @author Robert Tansley * @author Martin Hald - * @version $Revision$ */ @Entity @Table(name = "item") public class Item extends DSpaceObject implements DSpaceObjectLegacySupport { - - /** - * log4j logger - */ - private static Logger log = Logger.getLogger(Item.class); - /** * Wild card for Dublin Core metadata qualifiers/languages */ @@ -286,7 +278,7 @@ public class Item extends DSpaceObject implements DSpaceObjectLegacySupport { * @return the bundles in an unordered array */ public List getBundles(String name) { - List matchingBundles = new ArrayList(); + List matchingBundles = new ArrayList<>(); // now only keep bundles with matching names List bunds = getBundles(); for (Bundle bundle : bunds) { @@ -317,7 +309,7 @@ public class Item extends DSpaceObject implements DSpaceObjectLegacySupport { /** * Return true if other is the same Item as - * this object, false otherwise + * this object, false otherwise. * * @param obj object to compare to * @return true if object passed in represents the same item @@ -325,7 +317,7 @@ public class Item extends DSpaceObject implements DSpaceObjectLegacySupport { */ @Override public boolean equals(Object obj) { - if (obj == null) { + if (!(obj instanceof Item)) { return false; } Class objClass = HibernateProxyHelper.getClassWithoutInitializingProxy(obj); @@ -333,10 +325,7 @@ public class Item extends DSpaceObject implements DSpaceObjectLegacySupport { return false; } final Item otherItem = (Item) obj; - if (!this.getID().equals(otherItem.getID())) { - return false; - } - return true; + return this.getID().equals(otherItem.getID()); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataField.java b/dspace-api/src/main/java/org/dspace/content/MetadataField.java index 0ea176c751..8b76701199 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataField.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataField.java @@ -32,7 +32,6 @@ import org.hibernate.proxy.HibernateProxyHelper; * metadata element belongs in a field. * * @author Martin Hald - * @version $Revision$ * @see org.dspace.content.MetadataValue * @see org.dspace.content.MetadataSchema */ @@ -77,6 +76,7 @@ public class MetadataField implements ReloadableEntity { * * @return metadata field id */ + @Override public Integer getID() { return id; } @@ -164,7 +164,7 @@ public class MetadataField implements ReloadableEntity { */ @Override public boolean equals(Object obj) { - if (obj == null) { + if (!(obj instanceof MetadataField)) { return false; } Class objClass = HibernateProxyHelper.getClassWithoutInitializingProxy(obj); @@ -175,10 +175,7 @@ public class MetadataField implements ReloadableEntity { if (!this.getID().equals(other.getID())) { return false; } - if (!getMetadataSchema().equals(other.getMetadataSchema())) { - return false; - } - return true; + return getMetadataSchema().equals(other.getMetadataSchema()); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataFieldName.java b/dspace-api/src/main/java/org/dspace/content/MetadataFieldName.java index 8c3dfc1bcc..8d7f4b0277 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataFieldName.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataFieldName.java @@ -17,13 +17,13 @@ import javax.annotation.Nonnull; */ public class MetadataFieldName { /** Name of the metadata schema which defines this field. Never null. */ - public final String SCHEMA; + public final String schema; /** Element name of this field. Never null. */ - public final String ELEMENT; + public final String element; /** Qualifier name of this field. May be {@code null}. */ - public final String QUALIFIER; + public final String qualifier; /** * Initialize a tuple of (schema, element, qualifier) to name a metadata field. @@ -40,9 +40,9 @@ public class MetadataFieldName { throw new NullPointerException("Element must not be null."); } - SCHEMA = schema; - ELEMENT = element; - QUALIFIER = qualifier; + this.schema = schema; + this.element = element; + this.qualifier = qualifier; } /** @@ -59,9 +59,9 @@ public class MetadataFieldName { throw new NullPointerException("Element must not be null."); } - SCHEMA = schema; - ELEMENT = element; - QUALIFIER = null; + this.schema = schema; + this.element = element; + qualifier = null; } /** @@ -79,9 +79,9 @@ public class MetadataFieldName { throw new IllegalArgumentException("Element must not be null."); } - SCHEMA = schema.getName(); - ELEMENT = element; - QUALIFIER = qualifier; + this.schema = schema.getName(); + this.element = element; + this.qualifier = qualifier; } /** @@ -98,9 +98,9 @@ public class MetadataFieldName { throw new IllegalArgumentException("Element must not be null."); } - SCHEMA = schema.getName(); - ELEMENT = element; - QUALIFIER = null; + this.schema = schema.getName(); + this.element = element; + qualifier = null; } /** @@ -110,9 +110,9 @@ public class MetadataFieldName { */ public MetadataFieldName(@Nonnull String name) { String[] elements = parse(name); - SCHEMA = elements[0]; - ELEMENT = elements[1]; - QUALIFIER = elements[2]; + schema = elements[0]; + element = elements[1]; + qualifier = elements[2]; } /** @@ -138,17 +138,17 @@ public class MetadataFieldName { /** * Format a dotted-atoms representation of this field name. - * @return SCHEMA.ELEMENT.QUALIFIER + * @return schema.element.qualifier */ @Override public String toString() { StringBuilder buffer = new StringBuilder(32); - buffer.append(SCHEMA) + buffer.append(schema) .append('.') - .append(ELEMENT); - if (null != QUALIFIER) { + .append(element); + if (null != qualifier) { buffer.append('.') - .append(QUALIFIER); + .append(qualifier); } return buffer.toString(); } diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataSchema.java b/dspace-api/src/main/java/org/dspace/content/MetadataSchema.java index 727181ee9d..f60e5e1604 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataSchema.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataSchema.java @@ -30,7 +30,6 @@ import org.hibernate.proxy.HibernateProxyHelper; *

* * @author Martin Hald - * @version $Revision$ * @see org.dspace.content.MetadataValue * @see org.dspace.content.MetadataField */ @@ -129,6 +128,7 @@ public class MetadataSchema implements ReloadableEntity { * * @return schema record key */ + @Override public Integer getID() { return id; } diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataValue.java b/dspace-api/src/main/java/org/dspace/content/MetadataValue.java index 2d9808ae45..d1b636cdff 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataValue.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataValue.java @@ -46,7 +46,7 @@ public class MetadataValue implements ReloadableEntity { @Column(name = "metadata_value_id") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "metadatavalue_seq") @SequenceGenerator(name = "metadatavalue_seq", sequenceName = "metadatavalue_seq", allocationSize = 1) - private Integer id; + private final Integer id; /** * The primary key for the metadata value @@ -104,6 +104,7 @@ public class MetadataValue implements ReloadableEntity { * * @return metadata value ID */ + @Override public Integer getID() { return id; } @@ -249,10 +250,7 @@ public class MetadataValue implements ReloadableEntity { if (!this.getID().equals(other.getID())) { return false; } - if (!this.getDSpaceObject().getID().equals(other.getDSpaceObject().getID())) { - return false; - } - return true; + return this.getDSpaceObject().getID().equals(other.getDSpaceObject().getID()); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/service/BitstreamService.java b/dspace-api/src/main/java/org/dspace/content/service/BitstreamService.java index b7fe2dfa16..764f195d1e 100644 --- a/dspace-api/src/main/java/org/dspace/content/service/BitstreamService.java +++ b/dspace-api/src/main/java/org/dspace/content/service/BitstreamService.java @@ -33,6 +33,7 @@ import org.dspace.core.Context; */ public interface BitstreamService extends DSpaceObjectService, DSpaceObjectLegacySupportService { + @Override public Bitstream find(Context context, UUID id) throws SQLException; public List findAll(Context context) throws SQLException; diff --git a/dspace-api/src/main/java/org/dspace/core/Context.java b/dspace-api/src/main/java/org/dspace/core/Context.java index e878367ec4..2181626250 100644 --- a/dspace-api/src/main/java/org/dspace/core/Context.java +++ b/dspace-api/src/main/java/org/dspace/core/Context.java @@ -46,8 +46,6 @@ import org.springframework.util.CollectionUtils; * changes and free up the resources. *

* The context object is also used as a cache for CM API objects. - * - * @version $Revision$ */ public class Context implements AutoCloseable { private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Context.class); diff --git a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java index cd0609e29f..68db217f1e 100644 --- a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java +++ b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java @@ -217,12 +217,11 @@ public class I18nUtil { */ public static String getInputFormsFileName(Locale locale) { /** Name of the form definition XML file */ - String fileName = ""; final String FORM_DEF_FILE = "submission-forms"; final String FILE_TYPE = ".xml"; String defsFilename = DSpaceServicesFactory.getInstance().getConfigurationService().getProperty("dspace.dir") + File.separator + "config" + File.separator + FORM_DEF_FILE; - fileName = getFilename(locale, defsFilename, FILE_TYPE); + String fileName = getFilename(locale, defsFilename, FILE_TYPE); return fileName; } @@ -286,14 +285,13 @@ public class I18nUtil { */ public static String getDefaultLicense(Context context) { Locale locale = context.getCurrentLocale(); - String fileName = ""; /** Name of the default license */ final String DEF_LIC_FILE = "default"; final String FILE_TYPE = ".license"; String defsFilename = DSpaceServicesFactory.getInstance().getConfigurationService().getProperty("dspace.dir") + File.separator + "config" + File.separator + DEF_LIC_FILE; - fileName = getFilename(locale, defsFilename, FILE_TYPE); + String fileName = getFilename(locale, defsFilename, FILE_TYPE); return fileName; } @@ -316,8 +314,7 @@ public class I18nUtil { // with Language, Country String fileNameLC = null; // with Language - String fileNameL = null; - fileNameL = fileName + "_" + locale.getLanguage(); + String fileNameL = fileName + "_" + locale.getLanguage(); if (fileType == null) { fileType = ""; @@ -372,12 +369,11 @@ public class I18nUtil { * String - localized filename of an email template */ public static String getEmailFilename(Locale locale, String name) { - String templateName = ""; String templateFile = DSpaceServicesFactory.getInstance().getConfigurationService().getProperty("dspace.dir") + File.separator + "config" + File.separator + "emails" + File.separator + name; - templateName = getFilename(locale, templateFile, ""); + String templateName = getFilename(locale, templateFile, ""); return templateName; } @@ -389,7 +385,7 @@ public class I18nUtil { * @return array of locale results, possibly empty */ public static Locale[] parseLocales(String[] locales) { - List resultList = new ArrayList(); + List resultList = new ArrayList<>(); for (String ls : locales) { Locale lc = makeLocale(ls); if (lc != null) { diff --git a/dspace-api/src/main/java/org/dspace/core/Utils.java b/dspace-api/src/main/java/org/dspace/core/Utils.java index 18daa5a69e..8968c8950f 100644 --- a/dspace-api/src/main/java/org/dspace/core/Utils.java +++ b/dspace-api/src/main/java/org/dspace/core/Utils.java @@ -33,8 +33,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import com.coverity.security.Escape; +import java.nio.charset.StandardCharsets; import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringSubstitutor; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; @@ -43,13 +45,12 @@ import org.dspace.services.factory.DSpaceServicesFactory; * Utility functions for DSpace. * * @author Peter Breton - * @version $Revision$ */ public final class Utils { /** * log4j logger */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Utils.class); + private static final Logger log = LogManager.getLogger(Utils.class); private static final Pattern DURATION_PATTERN = Pattern .compile("(\\d+)([smhdwy])"); @@ -68,12 +69,12 @@ public final class Utils { private static int counter = 0; - private static Random random = new Random(); + private static final Random random = new Random(); - private static VMID vmid = new VMID(); + private static final VMID vmid = new VMID(); // for parseISO8601Date - private static SimpleDateFormat parseFmt[] = { + private static final SimpleDateFormat parseFmt[] = { // first try at parsing, has milliseconds (note General time zone) new SimpleDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSz"), @@ -88,12 +89,14 @@ public final class Utils { // for formatISO8601Date // output canonical format (note RFC22 time zone, easier to hack) - private static SimpleDateFormat outFmtSecond = new SimpleDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"); + private static final SimpleDateFormat outFmtSecond + = new SimpleDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"); // output format with millsecond precision - private static SimpleDateFormat outFmtMillisec = new SimpleDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSZ"); + private static final SimpleDateFormat outFmtMillisec + = new SimpleDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSZ"); - private static Calendar outCal = GregorianCalendar.getInstance(); + private static final Calendar outCal = GregorianCalendar.getInstance(); /** * Private constructor @@ -107,7 +110,7 @@ public final class Utils { * @return MD5 checksum for the data in hex format. */ public static String getMD5(String data) { - return getMD5(data.getBytes()); + return getMD5(data.getBytes(StandardCharsets.UTF_8)); } /** @@ -150,7 +153,7 @@ public final class Utils { return null; } - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); // This is far from the most efficient way to do things... for (int i = 0; i < data.length; i++) { @@ -194,10 +197,14 @@ public final class Utils { random.nextBytes(junk); - String input = new StringBuffer().append(vmid).append( - new java.util.Date()).append(Arrays.toString(junk)).append(counter++).toString(); + String input = new StringBuilder() + .append(vmid) + .append(new java.util.Date()) + .append(Arrays.toString(junk)) + .append(counter++) + .toString(); - return getMD5Bytes(input.getBytes()); + return getMD5Bytes(input.getBytes(StandardCharsets.UTF_8)); } // The following two methods are taken from the Jakarta IOUtil class. diff --git a/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java b/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java index d5ec37d60b..fa16d27369 100644 --- a/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java +++ b/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java @@ -13,7 +13,6 @@ import java.util.Iterator; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -39,8 +38,6 @@ public abstract class AbstractCurationTask implements CurationTask { protected Curator curator = null; // curator-assigned taskId protected String taskId = null; - // logger - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractCurationTask.class); protected CommunityService communityService; protected ItemService itemService; protected HandleService handleService; diff --git a/dspace-api/src/main/java/org/dspace/curate/CitationPage.java b/dspace-api/src/main/java/org/dspace/curate/CitationPage.java index 386bf0ba92..0f02d5b757 100644 --- a/dspace-api/src/main/java/org/dspace/curate/CitationPage.java +++ b/dspace-api/src/main/java/org/dspace/curate/CitationPage.java @@ -19,7 +19,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; -import org.dspace.content.BitstreamFormat; import org.dspace.content.Bundle; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -46,7 +45,7 @@ public class CitationPage extends AbstractCurationTask { /** * Class Logger */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CitationPage.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CitationPage.class); protected int status = Curator.CURATE_UNSET; protected String result = null; @@ -97,7 +96,7 @@ public class CitationPage extends AbstractCurationTask { //Determine if the DISPLAY bundle exits. If not, create it. List dBundles = itemService.getBundles(item, CitationPage.DISPLAY_BUNDLE_NAME); Bundle dBundle = null; - if (dBundles == null || dBundles.size() == 0) { + if (dBundles == null || dBundles.isEmpty()) { try { dBundle = bundleService.create(Curator.curationContext(), item, CitationPage.DISPLAY_BUNDLE_NAME); } catch (AuthorizeException e) { @@ -110,7 +109,7 @@ public class CitationPage extends AbstractCurationTask { //Create a map of the bitstreams in the displayBundle. This is used to //check if the bundle being cited is already in the display bundle. - Map displayMap = new HashMap(); + Map displayMap = new HashMap<>(); for (Bitstream bs : dBundle.getBitstreams()) { displayMap.put(bs.getName(), bs); } @@ -143,15 +142,16 @@ public class CitationPage extends AbstractCurationTask { // Loop through each file and generate a cover page for documents // that are PDFs. for (Bitstream bitstream : bitstreams) { - BitstreamFormat format = bitstream.getFormat(Curator.curationContext()); //If bitstream is a PDF document then it is citable. CitationDocumentService citationDocument = DisseminateServiceFactory.getInstance() .getCitationDocumentService(); if (citationDocument.canGenerateCitationVersion(Curator.curationContext(), bitstream)) { - this.resBuilder.append(item.getHandle() + " - " - + bitstream.getName() + " is citable."); + this.resBuilder.append(item.getHandle()) + .append(" - ") + .append(bitstream.getName()) + .append(" is citable."); try { //Create the cited document Pair citedDocument = @@ -168,7 +168,9 @@ public class CitationPage extends AbstractCurationTask { StringBuilder stack = new StringBuilder(); int numLines = Math.min(stackTrace.length, 12); for (int j = 0; j < numLines; j++) { - stack.append("\t" + stackTrace[j].toString() + "\n"); + stack.append("\t") + .append(stackTrace[j].toString()) + .append("\n"); } if (stackTrace.length > numLines) { stack.append("\t. . .\n"); @@ -180,8 +182,10 @@ public class CitationPage extends AbstractCurationTask { } } else { //bitstream is not a document - this.resBuilder.append(item.getHandle() + " - " - + bitstream.getName() + " is not citable.\n"); + this.resBuilder.append(item.getHandle()) + .append(" - ") + .append(bitstream.getName()) + .append(" is not citable.\n"); this.status = Curator.CURATE_SUCCESS; } } @@ -211,11 +215,11 @@ public class CitationPage extends AbstractCurationTask { //If we are modifying a file that is not in the //preservation bundle then we have to move it there. Context context = Curator.curationContext(); - if (bundle.getID() != pBundle.getID()) { + if (!bundle.getID().equals(pBundle.getID())) { bundleService.addBitstream(context, pBundle, bitstream); bundleService.removeBitstream(context, bundle, bitstream); List bitstreams = bundle.getBitstreams(); - if (bitstreams == null || bitstreams.size() == 0) { + if (bitstreams == null || bitstreams.isEmpty()) { itemService.removeBundle(context, item, bundle); } } @@ -235,9 +239,11 @@ public class CitationPage extends AbstractCurationTask { bitstreamService.setFormat(context, citedBitstream, bitstream.getFormat(Curator.curationContext())); citedBitstream.setDescription(context, bitstream.getDescription()); - this.resBuilder.append(" Added " - + citedBitstream.getName() - + " to the " + CitationPage.DISPLAY_BUNDLE_NAME + " bundle.\n"); + this.resBuilder.append(" Added ") + .append(citedBitstream.getName()) + .append(" to the ") + .append(CitationPage.DISPLAY_BUNDLE_NAME) + .append(" bundle.\n"); //Run update to propagate changes to the //database. diff --git a/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java b/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java index a9a8e8906a..2b12745d8f 100644 --- a/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java +++ b/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java @@ -15,11 +15,13 @@ import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.util.Properties; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.core.factory.CoreServiceFactory; import org.dspace.services.factory.DSpaceServicesFactory; @@ -64,7 +66,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; public class TaskResolver { // logging service - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TaskResolver.class); + private static final Logger log = LogManager.getLogger(TaskResolver.class); // base directory of task scripts & catalog name protected static final String CATALOG = "task.catalog"; @@ -94,7 +96,7 @@ public class TaskResolver { if (script.exists()) { BufferedReader reader = null; try { - reader = new BufferedReader(new FileReader(script)); + reader = new BufferedReader(new FileReader(script, StandardCharsets.UTF_8)); String line = null; while ((line = reader.readLine()) != null) { if (line.startsWith("#") && line.indexOf("$td=") > 0) { @@ -136,7 +138,7 @@ public class TaskResolver { catalog.put(taskName, descriptor); Writer writer = null; try { - writer = new FileWriter(new File(scriptDir, CATALOG)); + writer = new FileWriter(new File(scriptDir, CATALOG), StandardCharsets.UTF_8); catalog.store(writer, "do not edit"); } catch (IOException ioE) { log.error("Error saving scripted task catalog: " + CATALOG); @@ -179,7 +181,7 @@ public class TaskResolver { File script = new File(scriptDir, tokens[1]); if (script.exists()) { try { - Reader reader = new FileReader(script); + Reader reader = new FileReader(script, StandardCharsets.UTF_8); engine.eval(reader); reader.close(); // third token is the constructor expression for the class @@ -212,7 +214,7 @@ public class TaskResolver { File catalogFile = new File(scriptDir, CATALOG); if (catalogFile.exists()) { try { - Reader reader = new FileReader(catalogFile); + Reader reader = new FileReader(catalogFile, StandardCharsets.UTF_8); catalog.load(reader); reader.close(); } catch (IOException ioE) { diff --git a/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java b/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java index 97187c79ed..b3ee42fca1 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java +++ b/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java @@ -16,9 +16,9 @@ import java.io.Reader; import java.io.SequenceInputStream; import java.nio.charset.StandardCharsets; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import javax.annotation.Nullable; @@ -55,7 +55,7 @@ public class FullTextContentStreams extends ContentStreamBase { } protected void init(Item parentItem) { - fullTextStreams = new LinkedList<>(); + fullTextStreams = new ArrayList<>(); if (parentItem != null) { sourceInfo = parentItem.getHandle(); @@ -149,8 +149,8 @@ public class FullTextContentStreams extends ContentStreamBase { } private class FullTextBitstream { - private String itemHandle; - private Bitstream bitstream; + private final String itemHandle; + private final Bitstream bitstream; public FullTextBitstream(final String parentHandle, final Bitstream file) { this.itemHandle = parentHandle; @@ -179,18 +179,20 @@ public class FullTextContentStreams extends ContentStreamBase { } } - private class FullTextEnumeration implements Enumeration { + private static class FullTextEnumeration implements Enumeration { private final Iterator fulltextIterator; - public FullTextEnumeration(final Iterator fulltextStreams) { - this.fulltextIterator = fulltextStreams; + public FullTextEnumeration(final Iterator fulltextIterator) { + this.fulltextIterator = fulltextIterator; } + @Override public boolean hasMoreElements() { return fulltextIterator.hasNext(); } + @Override public InputStream nextElement() { InputStream inputStream = null; FullTextBitstream bitstream = null; diff --git a/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java b/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java index c66c331332..d1059f8e2f 100644 --- a/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java +++ b/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java @@ -104,7 +104,9 @@ public class ConsumerProfile { "No filters configured for consumer named: " + name); } - consumer = (Consumer) Class.forName(className.trim()).getDeclaredConstructor().newInstance(); + consumer = Class.forName(className.trim()) + .asSubclass(Consumer.class) + .getDeclaredConstructor().newInstance(); // Each "filter" is + : ... filters = new ArrayList<>(); diff --git a/dspace-api/src/main/java/org/dspace/event/Event.java b/dspace-api/src/main/java/org/dspace/event/Event.java index 45b6407b28..af8b2d4571 100644 --- a/dspace-api/src/main/java/org/dspace/event/Event.java +++ b/dspace-api/src/main/java/org/dspace/event/Event.java @@ -48,8 +48,6 @@ import org.dspace.event.factory.EventServiceFactory; * significance varies by the combination of action and subject type. *

  • - timestamp -- exact millisecond timestamp at which event was logged.
  • * - * - * @version $Revision$ */ public class Event implements Serializable { private static final long serialVersionUID = 1L; @@ -308,6 +306,7 @@ public class Event implements Serializable { * @param other the event to compare this one to * @return true if events are "equal", false otherwise. */ + @Override public boolean equals(Object other) { if (other instanceof Event) { Event otherEvent = (Event) other; @@ -315,14 +314,15 @@ public class Event implements Serializable { .equals(otherEvent.detail)) && this.eventType == otherEvent.eventType && this.subjectType == otherEvent.subjectType - && this.subjectID == otherEvent.subjectID + && this.subjectID.equals(otherEvent.subjectID) && this.objectType == otherEvent.objectType - && this.objectID == otherEvent.objectID; + && this.objectID.equals(otherEvent.objectID); } return false; } + @Override public int hashCode() { return new HashCodeBuilder().append(this.detail) .append(eventType) @@ -634,6 +634,7 @@ public class Event implements Serializable { * @return Detailed string representation of contents of this event, to * help in logging and debugging. */ + @Override public String toString() { return "org.dspace.event.Event(eventType=" + this.getEventTypeAsString() diff --git a/dspace-api/src/main/java/org/dspace/handle/Handle.java b/dspace-api/src/main/java/org/dspace/handle/Handle.java index 76fed105b9..c35511353a 100644 --- a/dspace-api/src/main/java/org/dspace/handle/Handle.java +++ b/dspace-api/src/main/java/org/dspace/handle/Handle.java @@ -105,7 +105,7 @@ public class Handle implements ReloadableEntity { return true; } - if (o == null || getClass() != o.getClass()) { + if (!(o instanceof Handle)) { return false; } diff --git a/dspace-api/src/main/java/org/dspace/text/filter/InitialArticleWord.java b/dspace-api/src/main/java/org/dspace/text/filter/InitialArticleWord.java index 700b25748e..167b201e0f 100644 --- a/dspace-api/src/main/java/org/dspace/text/filter/InitialArticleWord.java +++ b/dspace-api/src/main/java/org/dspace/text/filter/InitialArticleWord.java @@ -110,7 +110,7 @@ public abstract class InitialArticleWord implements TextFilter { return str.substring(cutPos); } else { // No - move the initial article word to the end - return new StringBuffer(str.substring(cutPos)) + return new StringBuilder(str.substring(cutPos)) .append(wordSeparator) .append(str.substring(initialStart, initialEnd)) .toString(); @@ -124,10 +124,12 @@ public abstract class InitialArticleWord implements TextFilter { } protected InitialArticleWord(boolean stripWord) { + this.wordSeparator = ", "; stripInitialArticle = stripWord; } protected InitialArticleWord() { + this.wordSeparator = ", "; stripInitialArticle = false; } @@ -138,9 +140,8 @@ public abstract class InitialArticleWord implements TextFilter { * @return An array of definite/indefinite article words */ protected abstract String[] getArticleWords(String lang); - // Separator to use when appending article to end - private String wordSeparator = ", "; + private final String wordSeparator; // Flag to signify initial article word should be removed // If false, then the initial article word is appended to the end diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/InProgressUser.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/InProgressUser.java index 5cd714345e..efbd26bde5 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/InProgressUser.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/InProgressUser.java @@ -59,6 +59,7 @@ public class InProgressUser implements ReloadableEntity { } + @Override public Integer getID() { return id; } diff --git a/dspace-api/src/test/java/org/dspace/content/MetadataFieldNameTest.java b/dspace-api/src/test/java/org/dspace/content/MetadataFieldNameTest.java index f0ca7d25d8..a3a069b35e 100644 --- a/dspace-api/src/test/java/org/dspace/content/MetadataFieldNameTest.java +++ b/dspace-api/src/test/java/org/dspace/content/MetadataFieldNameTest.java @@ -26,17 +26,17 @@ public class MetadataFieldNameTest { @Test public void testConstruct3() { MetadataFieldName instance = new MetadataFieldName("one", "two", "three"); - assertEquals("Incorrect schema", "one", instance.SCHEMA); - assertEquals("Incorrect element", "two", instance.ELEMENT); - assertEquals("Incorrect qualifier", "three", instance.QUALIFIER); + assertEquals("Incorrect schema", "one", instance.schema); + assertEquals("Incorrect element", "two", instance.element); + assertEquals("Incorrect qualifier", "three", instance.qualifier); } @Test public void testConstruct2() { MetadataFieldName instance = new MetadataFieldName("one", "two"); - assertEquals("Incorrect schema", "one", instance.SCHEMA); - assertEquals("Incorrect element", "two", instance.ELEMENT); - assertNull("Incorrect qualifier", instance.QUALIFIER); + assertEquals("Incorrect schema", "one", instance.schema); + assertEquals("Incorrect element", "two", instance.element); + assertNull("Incorrect qualifier", instance.qualifier); } @Test(expected = NullPointerException.class) From f6112babc3685a2eb84ee55e50215835e43c260d Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 24 Nov 2020 20:22:06 -0500 Subject: [PATCH 02/16] More errorprone warnings. #3061 --- .../dspace/administer/MetadataImporter.java | 17 +++----- .../org/dspace/app/bulkedit/DSpaceCSV.java | 42 ++++++++---------- .../dspace/app/itemupdate/DtoMetadata.java | 1 + .../dspace/app/itemupdate/ItemArchive.java | 5 ++- .../org/dspace/app/sherpa/SHERPAResponse.java | 9 ++-- .../app/statistics/CreateStatReport.java | 43 ++++++------------- .../main/java/org/dspace/app/util/WebApp.java | 1 + .../java/org/dspace/app/util/XMLUtils.java | 11 +++-- .../authenticate/PasswordAuthentication.java | 8 ++-- .../authorize/AuthorizeServiceImpl.java | 17 ++++---- .../dspace/checker/MostRecentChecksum.java | 2 +- .../org/dspace/checker/ResultsLogger.java | 2 +- .../org/dspace/content/BitstreamFormat.java | 4 +- .../main/java/org/dspace/content/Bundle.java | 10 ++--- .../main/java/org/dspace/content/DCDate.java | 29 ++++++------- .../org/dspace/content/DCSeriesNumber.java | 4 +- .../content/DSpaceObjectServiceImpl.java | 7 ++- .../java/org/dspace/content/EntityType.java | 7 ++- .../java/org/dspace/content/Relationship.java | 1 + .../org/dspace/content/RelationshipType.java | 9 ++-- .../dao/impl/MetadataSchemaDAOImpl.java | 4 +- .../content/packager/PackageException.java | 7 --- .../content/packager/PackageParameters.java | 2 +- .../org/dspace/content/virtual/UUIDValue.java | 5 +-- .../main/java/org/dspace/core/Context.java | 36 ++++++++-------- .../main/java/org/dspace/core/I18nUtil.java | 4 +- .../java/org/dspace/curate/FileTaskQueue.java | 17 +++++--- .../java/org/dspace/curate/ResolvedTask.java | 6 +-- .../org/dspace/discovery/DiscoverQuery.java | 37 ++++++++-------- .../discovery/FullTextContentStreams.java | 5 +++ .../discovery/SolrServiceFileInfoPlugin.java | 2 +- .../indexobject/AbstractIndexableObject.java | 13 +++--- .../java/org/dspace/eperson/Subscription.java | 1 + .../eperson/dao/impl/SubscriptionDAOImpl.java | 3 +- .../dspace/external/OrcidRestConnector.java | 8 ++-- .../external/model/ExternalDataObject.java | 8 ++-- .../provider/orcid/xml/Converter.java | 6 --- .../org/dspace/harvest/HarvestedItem.java | 2 +- .../main/java/org/dspace/identifier/DOI.java | 1 + .../identifier/dao/impl/DOIDAOImpl.java | 14 +++--- .../external/datamodel/ImportRecord.java | 6 +-- .../AbstractMetadataFieldMapping.java | 15 ++++--- .../metadatamapping/MetadataFieldConfig.java | 10 ++--- .../scripts/DSpaceCommandLineParameter.java | 12 +++--- .../org/dspace/scripts/DSpaceRunnable.java | 10 ++--- .../main/java/org/dspace/scripts/Process.java | 8 ++-- .../main/java/org/dspace/search/Harvest.java | 12 +++--- .../java/org/dspace/statistics/Dataset.java | 15 ++++--- .../SolrLoggerUsageEventListener.java | 7 +-- .../content/StatisticsDataVisits.java | 10 +---- .../lookup/ValueConcatenationModifier.java | 10 ++--- .../submit/util/ItemSubmissionLookupDTO.java | 8 ++-- .../java/org/dspace/versioning/Version.java | 1 + .../org/dspace/versioning/VersionHistory.java | 10 +---- .../dspace/workflow/WorkflowException.java | 3 +- .../workflowbasic/BasicWorkflowItem.java | 1 + .../dspace/workflowbasic/TaskListItem.java | 1 + .../org/dspace/xmlworkflow/RoleMembers.java | 10 ++--- .../WorkflowConfigurationException.java | 7 +-- .../storedcomponents/ClaimedTask.java | 13 +++--- .../storedcomponents/CollectionRole.java | 1 + .../storedcomponents/PoolTask.java | 13 +++--- .../storedcomponents/WorkflowItemRole.java | 6 +-- .../org/dspace/AbstractIntegrationTest.java | 4 +- .../dspace/app/bulkedit/MetadataImportIT.java | 14 +++--- .../app/csv/CSVMetadataImportReferenceIT.java | 27 ++++++------ .../util/AbstractBuilderCleanupUtil.java | 40 ++++++++--------- .../dspace/content/MetadataFieldNameTest.java | 10 +++-- .../DSpaceControlledVocabularyTest.java | 5 +-- .../MockCCLicenseConnectorServiceImpl.java | 6 +-- .../ITIrusExportUsageEventListener.java | 27 ++++++------ .../BitstreamEventProcessorTest.java | 6 +-- .../service/MockOpenUrlServiceImpl.java | 12 +++--- 73 files changed, 360 insertions(+), 390 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/administer/MetadataImporter.java b/dspace-api/src/main/java/org/dspace/administer/MetadataImporter.java index 37a89fa694..42461d7210 100644 --- a/dspace-api/src/main/java/org/dspace/administer/MetadataImporter.java +++ b/dspace-api/src/main/java/org/dspace/administer/MetadataImporter.java @@ -81,7 +81,7 @@ public class MetadataImporter { * @throws SQLException if database error * @throws IOException if IO error * @throws TransformerException if transformer error - * @throws ParserConfigurationException if config error + * @throws ParserConfigurationException if configuration error * @throws AuthorizeException if authorization error * @throws SAXException if parser error * @throws NonUniqueMetadataException if duplicate metadata @@ -91,7 +91,6 @@ public class MetadataImporter { throws ParseException, SQLException, IOException, TransformerException, ParserConfigurationException, AuthorizeException, SAXException, NonUniqueMetadataException, RegistryImportException { - boolean forceUpdate = false; // create an options object and populate it CommandLineParser parser = new DefaultParser(); @@ -100,16 +99,14 @@ public class MetadataImporter { options.addOption("u", "update", false, "update an existing schema"); CommandLine line = parser.parse(options, args); - String file = null; if (line.hasOption('f')) { - file = line.getOptionValue('f'); + String file = line.getOptionValue('f'); + boolean forceUpdate = line.hasOption('u'); + loadRegistry(file, forceUpdate); } else { usage(); - System.exit(0); + System.exit(1); } - - forceUpdate = line.hasOption('u'); - loadRegistry(file, forceUpdate); } /** @@ -120,7 +117,7 @@ public class MetadataImporter { * @throws SQLException if database error * @throws IOException if IO error * @throws TransformerException if transformer error - * @throws ParserConfigurationException if config error + * @throws ParserConfigurationException if configuration error * @throws AuthorizeException if authorization error * @throws SAXException if parser error * @throws NonUniqueMetadataException if duplicate metadata @@ -227,7 +224,7 @@ public class MetadataImporter { /** * Process a node in the metadata registry XML file. The node must * be a "dc-type" node. If the type already exists, then it - * will not be reimported + * will not be re-imported. * * @param context DSpace context object * @param node the node in the DOM tree diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/DSpaceCSV.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/DSpaceCSV.java index ad7824bebf..e6ae91ece3 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkedit/DSpaceCSV.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/DSpaceCSV.java @@ -138,7 +138,7 @@ public class DSpaceCSV implements Serializable { /** * Create a new instance, reading the lines in from file * - * @param inputStream the inputstream to read from + * @param inputStream the input stream to read from * @param c The DSpace Context * @throws Exception thrown if there is an error reading or processing the file */ @@ -159,7 +159,7 @@ public class DSpaceCSV implements Serializable { columnCounter++; // Remove surrounding quotes if there are any - if ((element.startsWith("\"")) && (element.endsWith("\""))) { + if (element.startsWith("\"") && element.endsWith("\"")) { element = element.substring(1, element.length() - 1); } @@ -334,15 +334,15 @@ public class DSpaceCSV implements Serializable { /** * Set the value separator for multiple values stored in one csv value. * - * Is set in bulkedit.cfg as valueseparator + * Is set in {@code bulkedit.cfg} as {@code valueseparator}. * - * If not set, defaults to double pipe '||' + * If not set, defaults to double pipe '||'. */ private void setValueSeparator() { // Get the value separator valueSeparator = DSpaceServicesFactory.getInstance().getConfigurationService() .getProperty("bulkedit.valueseparator"); - if ((valueSeparator != null) && (!"".equals(valueSeparator.trim()))) { + if ((valueSeparator != null) && !valueSeparator.trim().isEmpty()) { valueSeparator = valueSeparator.trim(); } else { valueSeparator = "||"; @@ -357,7 +357,7 @@ public class DSpaceCSV implements Serializable { /** * Set the field separator use to separate fields in the csv. * - * Is set in bulkedit.cfg as fieldseparator + * Is set in {@code bulkedit.cfg} as {@code fieldseparator}. * * If not set, defaults to comma ','. * @@ -368,7 +368,7 @@ public class DSpaceCSV implements Serializable { // Get the value separator fieldSeparator = DSpaceServicesFactory.getInstance().getConfigurationService() .getProperty("bulkedit.fieldseparator"); - if ((fieldSeparator != null) && (!"".equals(fieldSeparator.trim()))) { + if ((fieldSeparator != null) && !fieldSeparator.trim().isEmpty()) { fieldSeparator = fieldSeparator.trim(); if ("tab".equals(fieldSeparator)) { fieldSeparator = "\t"; @@ -392,15 +392,15 @@ public class DSpaceCSV implements Serializable { /** * Set the authority separator for value with authority data. * - * Is set in dspace.cfg as bulkedit.authorityseparator + * Is set in {@code dspace.cfg} as {@code bulkedit.authorityseparator}. * - * If not set, defaults to double colon '::' + * If not set, defaults to double colon '::'. */ private void setAuthoritySeparator() { // Get the value separator authoritySeparator = DSpaceServicesFactory.getInstance().getConfigurationService() .getProperty("bulkedit.authorityseparator"); - if ((authoritySeparator != null) && (!"".equals(authoritySeparator.trim()))) { + if ((authoritySeparator != null) && !authoritySeparator.trim().isEmpty()) { authoritySeparator = authoritySeparator.trim(); } else { authoritySeparator = "::"; @@ -505,7 +505,7 @@ public class DSpaceCSV implements Serializable { int i = 0; for (String part : bits) { int bitcounter = part.length() - part.replaceAll("\"", "").length(); - if ((part.startsWith("\"")) && ((!part.endsWith("\"")) || ((bitcounter & 1) == 1))) { + if (part.startsWith("\"") && (!part.endsWith("\"") || ((bitcounter & 1) == 1))) { found = true; String add = bits.get(i) + fieldSeparator + bits.get(i + 1); bits.remove(i); @@ -521,7 +521,7 @@ public class DSpaceCSV implements Serializable { // Deal with quotes around the elements int i = 0; for (String part : bits) { - if ((part.startsWith("\"")) && (part.endsWith("\""))) { + if (part.startsWith("\"") && part.endsWith("\"")) { part = part.substring(1, part.length() - 1); bits.set(i, part); } @@ -561,7 +561,7 @@ public class DSpaceCSV implements Serializable { for (String part : bits) { if (i > 0) { // Is this a last empty item? - if ((last) && (i == headings.size())) { + if (last && (i == headings.size())) { part = ""; } @@ -574,7 +574,7 @@ public class DSpaceCSV implements Serializable { csvLine.add(headings.get(i - 1), null); String[] elements = part.split(escapedValueSeparator); for (String element : elements) { - if ((element != null) && (!"".equals(element))) { + if ((element != null) && !"".equals(element)) { csvLine.add(headings.get(i - 1), element); } } @@ -626,18 +626,18 @@ public class DSpaceCSV implements Serializable { public InputStream getInputStream() { StringBuilder stringBuilder = new StringBuilder(); for (String csvLine : getCSVLinesAsStringArray()) { - stringBuilder.append(csvLine + "\n"); + stringBuilder.append(csvLine).append("\n"); } return IOUtils.toInputStream(stringBuilder.toString(), StandardCharsets.UTF_8); } /** - * Is it Ok to export this value? When exportAll is set to false, we don't export + * Is it okay to export this value? When exportAll is set to false, we don't export * some of the metadata elements. * - * The list can be configured via the key ignore-on-export in bulkedit.cfg + * The list can be configured via the key ignore-on-export in {@code bulkedit.cfg}. * - * @param md The Metadatum to examine + * @param md The MetadataField to examine * @return Whether or not it is OK to export this element */ protected boolean okToExport(MetadataField md) { @@ -646,12 +646,8 @@ public class DSpaceCSV implements Serializable { if (md.getQualifier() != null) { key += "." + md.getQualifier(); } - if (ignore.get(key) != null) { - return false; - } - // Must be OK, so don't ignore - return true; + return ignore.get(key) == null; } /** diff --git a/dspace-api/src/main/java/org/dspace/app/itemupdate/DtoMetadata.java b/dspace-api/src/main/java/org/dspace/app/itemupdate/DtoMetadata.java index 6e4a4a88d6..e67b2221e4 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemupdate/DtoMetadata.java +++ b/dspace-api/src/main/java/org/dspace/app/itemupdate/DtoMetadata.java @@ -120,6 +120,7 @@ class DtoMetadata { return true; } + @Override public String toString() { String s = "\tSchema: " + schema + " Element: " + element; if (qualifier != null) { diff --git a/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java b/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java index 2270d736a8..26de45caf7 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java +++ b/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; @@ -55,7 +56,7 @@ public class ItemArchive { protected Transformer transformer = null; protected List dtomList = null; - protected List undoDtomList = new ArrayList(); + protected List undoDtomList = new ArrayList<>(); protected List undoAddContents = new ArrayList<>(); // for undo of add @@ -325,7 +326,7 @@ public class ItemArchive { PrintWriter pw = null; try { File f = new File(dir, ItemUpdate.DELETE_CONTENTS_FILE); - pw = new PrintWriter(new BufferedWriter(new FileWriter(f))); + pw = new PrintWriter(new BufferedWriter(new FileWriter(f, StandardCharsets.UTF_8))); for (UUID i : undoAddContents) { pw.println(i); } diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java index bd2909c0c1..b0ca1e3d93 100644 --- a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java +++ b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java @@ -8,12 +8,13 @@ package org.dspace.app.sherpa; import java.io.InputStream; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.app.util.XMLUtils; import org.w3c.dom.Document; @@ -25,7 +26,7 @@ import org.w3c.dom.Element; * @author Andrea Bollini */ public class SHERPAResponse { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SHERPAResponse.class); + private static final Logger log = LogManager.getLogger(SHERPAResponse.class); private int numHits; @@ -81,7 +82,7 @@ public class SHERPAResponse { publishersElement, "publisher"); if (journalsList != null) { - journals = new LinkedList(); + journals = new ArrayList<>(journalsList.size()); for (Element journalElement : journalsList) { journals.add(new SHERPAJournal( XMLUtils.getElementValue(journalElement, "jtitle"), @@ -92,7 +93,7 @@ public class SHERPAResponse { } if (publishersList != null) { - publishers = new LinkedList(); + publishers = new ArrayList<>(publishersList.size()); for (Element publisherElement : publishersList) { Element preprintsElement = XMLUtils.getSingleElement( publisherElement, "preprints"); diff --git a/dspace-api/src/main/java/org/dspace/app/statistics/CreateStatReport.java b/dspace-api/src/main/java/org/dspace/app/statistics/CreateStatReport.java index 5785d1ee97..a7d5c4a66a 100644 --- a/dspace-api/src/main/java/org/dspace/app/statistics/CreateStatReport.java +++ b/dspace-api/src/main/java/org/dspace/app/statistics/CreateStatReport.java @@ -64,10 +64,6 @@ public class CreateStatReport { */ private static Context context; - /** - * the config file from which to configure the analyser - */ - /** * Default constructor */ @@ -170,22 +166,19 @@ public class CreateStatReport { String myLogDir = null; String myFileTemplate = null; String myConfigFile = null; - StringBuffer myOutFile = null; - Date myStartDate = null; - Date myEndDate = null; boolean myLookUp = false; Calendar start = new GregorianCalendar(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); - myStartDate = start.getTime(); + Date myStartDate = start.getTime(); Calendar end = new GregorianCalendar(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); - myEndDate = end.getTime(); + Date myEndDate = end.getTime(); - myOutFile = new StringBuffer(outputLogDirectory); + StringBuilder myOutFile = new StringBuilder(outputLogDirectory); myOutFile.append(outputPrefix); myOutFile.append(calendar.get(Calendar.YEAR)); myOutFile.append("-"); @@ -211,12 +204,11 @@ public class CreateStatReport { String myLogDir = null; String myFileTemplate = null; String myConfigFile = null; - StringBuffer myOutFile = null; Date myStartDate = null; Date myEndDate = null; boolean myLookUp = false; - myOutFile = new StringBuffer(outputLogDirectory); + StringBuilder myOutFile = new StringBuilder(outputLogDirectory); myOutFile.append(outputPrefix); myOutFile.append(calendar.get(Calendar.YEAR)); myOutFile.append("-"); @@ -245,9 +237,6 @@ public class CreateStatReport { String myLogDir = null; String myFileTemplate = null; String myConfigFile = null; - StringBuffer myOutFile = null; - Date myStartDate = null; - Date myEndDate = null; boolean myLookUp = false; Calendar reportEndDate = new GregorianCalendar(calendar.get(Calendar.YEAR), @@ -260,14 +249,14 @@ public class CreateStatReport { Calendar start = new GregorianCalendar(currentMonth.get(Calendar.YEAR), currentMonth.get(Calendar.MONTH), currentMonth.getActualMinimum(Calendar.DAY_OF_MONTH)); - myStartDate = start.getTime(); + Date myStartDate = start.getTime(); Calendar end = new GregorianCalendar(currentMonth.get(Calendar.YEAR), currentMonth.get(Calendar.MONTH), currentMonth.getActualMaximum(Calendar.DAY_OF_MONTH)); - myEndDate = end.getTime(); + Date myEndDate = end.getTime(); - myOutFile = new StringBuffer(outputLogDirectory); + StringBuilder myOutFile = new StringBuilder(outputLogDirectory); myOutFile.append(outputPrefix); myOutFile.append(currentMonth.get(Calendar.YEAR)); myOutFile.append("-"); @@ -293,11 +282,9 @@ public class CreateStatReport { String outputPrefix = "report-general-"; String myFormat = "html"; - StringBuffer myInput = null; - StringBuffer myOutput = null; String myMap = null; - myInput = new StringBuffer(outputLogDirectory); + StringBuilder myInput = new StringBuilder(outputLogDirectory); myInput.append(inputPrefix); myInput.append(calendar.get(Calendar.YEAR)); myInput.append("-"); @@ -306,7 +293,7 @@ public class CreateStatReport { myInput.append(calendar.get(Calendar.DAY_OF_MONTH)); myInput.append(outputSuffix); - myOutput = new StringBuffer(outputReportDirectory); + StringBuilder myOutput = new StringBuilder(outputReportDirectory); myOutput.append(outputPrefix); myOutput.append(calendar.get(Calendar.YEAR)); myOutput.append("-"); @@ -332,8 +319,6 @@ public class CreateStatReport { String outputPrefix = "report-"; String myFormat = "html"; - StringBuffer myInput = null; - StringBuffer myOutput = null; String myMap = null; Calendar reportEndDate = new GregorianCalendar(calendar.get(Calendar.YEAR), @@ -344,14 +329,14 @@ public class CreateStatReport { while (currentMonth.before(reportEndDate)) { - myInput = new StringBuffer(outputLogDirectory); + StringBuilder myInput = new StringBuilder(outputLogDirectory); myInput.append(inputPrefix); myInput.append(currentMonth.get(Calendar.YEAR)); myInput.append("-"); myInput.append(currentMonth.get(Calendar.MONTH) + 1); myInput.append(outputSuffix); - myOutput = new StringBuffer(outputReportDirectory); + StringBuilder myOutput = new StringBuilder(outputReportDirectory); myOutput.append(outputPrefix); myOutput.append(currentMonth.get(Calendar.YEAR)); myOutput.append("-"); @@ -376,18 +361,16 @@ public class CreateStatReport { String outputPrefix = "report-"; String myFormat = "html"; - StringBuffer myInput = null; - StringBuffer myOutput = null; String myMap = null; - myInput = new StringBuffer(outputLogDirectory); + StringBuilder myInput = new StringBuilder(outputLogDirectory); myInput.append(inputPrefix); myInput.append(calendar.get(Calendar.YEAR)); myInput.append("-"); myInput.append(calendar.get(Calendar.MONTH) + 1); myInput.append(outputSuffix); - myOutput = new StringBuffer(outputReportDirectory); + StringBuilder myOutput = new StringBuilder(outputReportDirectory); myOutput.append(outputPrefix); myOutput.append(calendar.get(Calendar.YEAR)); myOutput.append("-"); diff --git a/dspace-api/src/main/java/org/dspace/app/util/WebApp.java b/dspace-api/src/main/java/org/dspace/app/util/WebApp.java index 7cd2bd8fea..2f42c1459f 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/WebApp.java +++ b/dspace-api/src/main/java/org/dspace/app/util/WebApp.java @@ -58,6 +58,7 @@ public class WebApp implements ReloadableEntity { } + @Override public Integer getID() { return id; } diff --git a/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java b/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java index 884b2a6a92..c39d0d26fd 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java +++ b/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java @@ -8,7 +8,6 @@ package org.dspace.app.util; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import org.apache.commons.lang3.StringUtils; @@ -29,13 +28,13 @@ public class XMLUtils { /** * @param dataRoot the starting node - * @param name the name of the subelement to find + * @param name the tag name of the child element to find. * @return the list of all DOM Element with the provided name direct child * of the starting node */ public static List getElementList(Element dataRoot, String name) { NodeList list = dataRoot.getElementsByTagName(name); - List listElements = new ArrayList(); + List listElements = new ArrayList<>(); for (int i = 0; i < list.getLength(); i++) { Element item = (Element) list.item(i); if (item.getParentNode().equals(dataRoot)) { @@ -105,7 +104,7 @@ public class XMLUtils { /** * @param rootElement the starting node - * @param subElementName the name of the subelement to find + * @param subElementName the tag name of the child element to find. * @return a list of string including all the text contents of the sub * element with the specified name. If there are not sub element * with the supplied name the method will return null @@ -121,7 +120,7 @@ public class XMLUtils { return null; } - List result = new LinkedList(); + List result = new ArrayList<>(); for (Element el : subElements) { if (StringUtils.isNotBlank(el.getTextContent())) { result.add(el.getTextContent().trim()); @@ -152,7 +151,7 @@ public class XMLUtils { return null; } - List result = new LinkedList(); + List result = new ArrayList<>(); for (Element el : subElements) { String[] tmp = new String[fieldsName.length]; for (int idx = 0; idx < fieldsName.length; idx++) { diff --git a/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java index 86cfb50c5f..045e0421ae 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java @@ -41,7 +41,6 @@ import org.dspace.services.factory.DSpaceServicesFactory; * Basic Auth username and password to the AuthenticationManager. * * @author Larry Stone - * @version $Revision$ */ public class PasswordAuthentication implements AuthenticationMethod { @@ -49,7 +48,7 @@ public class PasswordAuthentication /** * log4j category */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PasswordAuthentication.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PasswordAuthentication.class); /** @@ -142,7 +141,7 @@ public class PasswordAuthentication .toString())) { String groupName = DSpaceServicesFactory.getInstance().getConfigurationService() .getProperty("authentication-password.login.specialgroup"); - if ((groupName != null) && (!groupName.trim().equals(""))) { + if ((groupName != null) && !groupName.trim().isEmpty()) { Group specialGroup = EPersonServiceFactory.getInstance().getGroupService() .findByName(context, groupName); if (specialGroup == null) { @@ -195,9 +194,8 @@ public class PasswordAuthentication HttpServletRequest request) throws SQLException { if (username != null && password != null) { - EPerson eperson = null; log.info(LogManager.getHeader(context, "authenticate", "attempting password auth of user=" + username)); - eperson = EPersonServiceFactory.getInstance().getEPersonService() + EPerson eperson = EPersonServiceFactory.getInstance().getEPersonService() .findByEmail(context, username.toLowerCase()); if (eperson == null) { diff --git a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java index eb7d60d84c..3837ceb7bd 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java @@ -11,7 +11,6 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; -import java.util.LinkedList; import java.util.List; import java.util.UUID; @@ -228,7 +227,7 @@ public class AuthorizeServiceImpl implements AuthorizeService { // If authorization was given before and cached Boolean cachedResult = c.getCachedAuthorizationResult(o, action, e); if (cachedResult != null) { - return cachedResult.booleanValue(); + return cachedResult; } // is eperson set? if not, userToCheck = null (anonymous) @@ -293,7 +292,7 @@ public class AuthorizeServiceImpl implements AuthorizeService { } if ((rp.getGroup() != null) - && (groupService.isMember(c, e, rp.getGroup()))) { + && groupService.isMember(c, e, rp.getGroup())) { // group was set, and eperson is a member // of that group c.cacheAuthorizedAction(o, action, e, true, rp); @@ -351,7 +350,7 @@ public class AuthorizeServiceImpl implements AuthorizeService { Boolean cachedResult = c.getCachedAuthorizationResult(o, Constants.ADMIN, e); if (cachedResult != null) { - return cachedResult.booleanValue(); + return cachedResult; } // @@ -368,7 +367,7 @@ public class AuthorizeServiceImpl implements AuthorizeService { } if ((rp.getGroup() != null) - && (groupService.isMember(c, e, rp.getGroup()))) { + && groupService.isMember(c, e, rp.getGroup())) { // group was set, and eperson is a member // of that group c.cacheAuthorizedAction(o, Constants.ADMIN, e, true, rp); @@ -428,6 +427,7 @@ public class AuthorizeServiceImpl implements AuthorizeService { } } + @Override public boolean isCommunityAdmin(Context c) throws SQLException { EPerson e = c.getCurrentUser(); return isCommunityAdmin(c, e); @@ -448,6 +448,7 @@ public class AuthorizeServiceImpl implements AuthorizeService { return false; } + @Override public boolean isCollectionAdmin(Context c) throws SQLException { EPerson e = c.getCurrentUser(); return isCollectionAdmin(c, e); @@ -527,7 +528,7 @@ public class AuthorizeServiceImpl implements AuthorizeService { List policies = getPolicies(c, src); //Only inherit non-ADMIN policies (since ADMIN policies are automatically inherited) - List nonAdminPolicies = new ArrayList(); + List nonAdminPolicies = new ArrayList<>(); for (ResourcePolicy rp : policies) { if (rp.getAction() != Constants.ADMIN) { nonAdminPolicies.add(rp); @@ -550,7 +551,7 @@ public class AuthorizeServiceImpl implements AuthorizeService { public void addPolicies(Context c, List policies, DSpaceObject dest) throws SQLException, AuthorizeException { // now add them to the destination object - List newPolicies = new LinkedList<>(); + List newPolicies = new ArrayList<>(policies.size()); for (ResourcePolicy srp : policies) { ResourcePolicy rp = resourcePolicyService.create(c); @@ -625,7 +626,7 @@ public class AuthorizeServiceImpl implements AuthorizeService { int actionID) throws java.sql.SQLException { List policies = getPoliciesActionFilter(c, o, actionID); - List groups = new ArrayList(); + List groups = new ArrayList<>(); for (ResourcePolicy resourcePolicy : policies) { if (resourcePolicy.getGroup() != null && resourcePolicyService.isDateValid(resourcePolicy)) { groups.add(resourcePolicy.getGroup()); diff --git a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java index 5962d19f68..eff8a8be1c 100644 --- a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java +++ b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java @@ -170,7 +170,7 @@ public class MostRecentChecksum implements Serializable { return true; } - if (o == null || getClass() != o.getClass()) { + if (o == null || !(o instanceof MostRecentChecksum)) { return false; } diff --git a/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java b/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java index 358d0c4018..f95778c4a8 100644 --- a/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java +++ b/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java @@ -109,7 +109,7 @@ public class ResultsLogger implements ChecksumResultsCollector { "unknown")); LOG.info(msg("new-checksum") + ": " + info.getCurrentChecksum()); LOG.info(msg("checksum-comparison-result") + ": " - + (info.getChecksumResult().getResultCode())); + + info.getChecksumResult().getResultCode()); LOG.info("\n\n"); } } diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java b/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java index 5cf787ffd5..6d64ee3073 100644 --- a/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java +++ b/dspace-api/src/main/java/org/dspace/content/BitstreamFormat.java @@ -9,7 +9,7 @@ package org.dspace.content; import java.io.Serializable; import java.sql.SQLException; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import javax.persistence.CollectionTable; import javax.persistence.Column; @@ -111,7 +111,7 @@ public class BitstreamFormat implements Serializable, ReloadableEntity * {@link org.dspace.content.service.BitstreamFormatService#create(Context)} */ protected BitstreamFormat() { - fileExtensions = new LinkedList<>(); + fileExtensions = new ArrayList<>(); } /** diff --git a/dspace-api/src/main/java/org/dspace/content/Bundle.java b/dspace-api/src/main/java/org/dspace/content/Bundle.java index 88f21c2c2f..6c62c3dc91 100644 --- a/dspace-api/src/main/java/org/dspace/content/Bundle.java +++ b/dspace-api/src/main/java/org/dspace/content/Bundle.java @@ -9,7 +9,6 @@ package org.dspace.content; import java.sql.SQLException; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; @@ -138,7 +137,7 @@ public class Bundle extends DSpaceObject implements DSpaceObjectLegacySupport { * @return the bitstreams */ public List getBitstreams() { - List bitstreamList = new LinkedList<>(this.bitstreams); + List bitstreamList = new ArrayList<>(this.bitstreams); return bitstreamList; } @@ -191,7 +190,7 @@ public class Bundle extends DSpaceObject implements DSpaceObjectLegacySupport { @Override public boolean equals(Object obj) { - if (obj == null) { + if (obj == null || !(obj instanceof Bundle)) { return false; } Class objClass = HibernateProxyHelper.getClassWithoutInitializingProxy(obj); @@ -202,10 +201,7 @@ public class Bundle extends DSpaceObject implements DSpaceObjectLegacySupport { if (this.getType() != other.getType()) { return false; } - if (!this.getID().equals(other.getID())) { - return false; - } - return true; + return this.getID().equals(other.getID()); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/DCDate.java b/dspace-api/src/main/java/org/dspace/content/DCDate.java index 47ed805d4a..d58aff7b1e 100644 --- a/dspace-api/src/main/java/org/dspace/content/DCDate.java +++ b/dspace-api/src/main/java/org/dspace/content/DCDate.java @@ -34,8 +34,8 @@ import org.apache.logging.log4j.Logger; * There are four levels of granularity, depending on how much date information * is available: year, month, day, time. *

    - * Examples: 1994-05-03T15:30:24,1995-10-04, - * 2001-10,1975 + * Examples: {@code 1994-05-03T15:30:24}, {@code 1995-10-04}, + * {@code 2001-10}, {@code 1975} * * @author Robert Tansley * @author Larry Stone @@ -261,7 +261,7 @@ public class DCDate { * @return the year */ public int getYear() { - return (!withinGranularity(DateGran.YEAR)) ? -1 : localCalendar.get(Calendar.YEAR); + return !withinGranularity(DateGran.YEAR) ? -1 : localCalendar.get(Calendar.YEAR); } /** @@ -270,7 +270,7 @@ public class DCDate { * @return the month */ public int getMonth() { - return (!withinGranularity(DateGran.MONTH)) ? -1 : localCalendar.get(Calendar.MONTH) + 1; + return !withinGranularity(DateGran.MONTH) ? -1 : localCalendar.get(Calendar.MONTH) + 1; } /** @@ -279,7 +279,7 @@ public class DCDate { * @return the day */ public int getDay() { - return (!withinGranularity(DateGran.DAY)) ? -1 : localCalendar.get(Calendar.DAY_OF_MONTH); + return !withinGranularity(DateGran.DAY) ? -1 : localCalendar.get(Calendar.DAY_OF_MONTH); } /** @@ -288,7 +288,7 @@ public class DCDate { * @return the hour */ public int getHour() { - return (!withinGranularity(DateGran.TIME)) ? -1 : localCalendar.get(Calendar.HOUR_OF_DAY); + return !withinGranularity(DateGran.TIME) ? -1 : localCalendar.get(Calendar.HOUR_OF_DAY); } /** @@ -297,7 +297,7 @@ public class DCDate { * @return the minute */ public int getMinute() { - return (!withinGranularity(DateGran.TIME)) ? -1 : localCalendar.get(Calendar.MINUTE); + return !withinGranularity(DateGran.TIME) ? -1 : localCalendar.get(Calendar.MINUTE); } /** @@ -306,7 +306,7 @@ public class DCDate { * @return the second */ public int getSecond() { - return (!withinGranularity(DateGran.TIME)) ? -1 : localCalendar.get(Calendar.SECOND); + return !withinGranularity(DateGran.TIME) ? -1 : localCalendar.get(Calendar.SECOND); } /** @@ -315,7 +315,7 @@ public class DCDate { * @return the year */ public int getYearUTC() { - return (!withinGranularity(DateGran.YEAR)) ? -1 : calendar.get(Calendar.YEAR); + return !withinGranularity(DateGran.YEAR) ? -1 : calendar.get(Calendar.YEAR); } /** @@ -324,7 +324,7 @@ public class DCDate { * @return the month */ public int getMonthUTC() { - return (!withinGranularity(DateGran.MONTH)) ? -1 : calendar.get(Calendar.MONTH) + 1; + return !withinGranularity(DateGran.MONTH) ? -1 : calendar.get(Calendar.MONTH) + 1; } /** @@ -333,7 +333,7 @@ public class DCDate { * @return the day */ public int getDayUTC() { - return (!withinGranularity(DateGran.DAY)) ? -1 : calendar.get(Calendar.DAY_OF_MONTH); + return !withinGranularity(DateGran.DAY) ? -1 : calendar.get(Calendar.DAY_OF_MONTH); } /** @@ -342,7 +342,7 @@ public class DCDate { * @return the hour */ public int getHourUTC() { - return (!withinGranularity(DateGran.TIME)) ? -1 : calendar.get(Calendar.HOUR_OF_DAY); + return !withinGranularity(DateGran.TIME) ? -1 : calendar.get(Calendar.HOUR_OF_DAY); } /** @@ -351,7 +351,7 @@ public class DCDate { * @return the minute */ public int getMinuteUTC() { - return (!withinGranularity(DateGran.TIME)) ? -1 : calendar.get(Calendar.MINUTE); + return !withinGranularity(DateGran.TIME) ? -1 : calendar.get(Calendar.MINUTE); } /** @@ -360,10 +360,9 @@ public class DCDate { * @return the second */ public int getSecondUTC() { - return (!withinGranularity(DateGran.TIME)) ? -1 : calendar.get(Calendar.SECOND); + return !withinGranularity(DateGran.TIME) ? -1 : calendar.get(Calendar.SECOND); } - /** * Get the date as a string to put back in the Dublin Core. Use the UTC/GMT calendar version. * diff --git a/dspace-api/src/main/java/org/dspace/content/DCSeriesNumber.java b/dspace-api/src/main/java/org/dspace/content/DCSeriesNumber.java index bec81494be..37b9fb7d7d 100644 --- a/dspace-api/src/main/java/org/dspace/content/DCSeriesNumber.java +++ b/dspace-api/src/main/java/org/dspace/content/DCSeriesNumber.java @@ -8,10 +8,9 @@ package org.dspace.content; /** - * Series and report number, as stored in relation.ispartofseries + * Series and report number, as stored in {@code relation.ispartofseries}. * * @author Robert Tansley - * @version $Id$ */ public class DCSeriesNumber { /** @@ -70,6 +69,7 @@ public class DCSeriesNumber { * * @return the series and number as they should be stored in the DB */ + @Override public String toString() { if (series == null) { return (null); diff --git a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java index 90893e030d..961e59d264 100644 --- a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java @@ -13,7 +13,6 @@ import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.StringTokenizer; @@ -450,7 +449,7 @@ public abstract class DSpaceObjectServiceImpl implements clearMetadata(context, dso, field.schema, field.element, field.qualifier, language); - String newValueLanguage = (Item.ANY.equals(language)) ? null : language; + String newValueLanguage = Item.ANY.equals(language) ? null : language; addMetadata(context, dso, field.schema, field.element, field.qualifier, newValueLanguage, value); dso.setMetadataModified(); @@ -595,7 +594,7 @@ public abstract class DSpaceObjectServiceImpl implements */ // A map created to store the latest place for each metadata field Map fieldToLastPlace = new HashMap<>(); - List metadataValues = new LinkedList<>(); + List metadataValues; if (dso.getType() == Constants.ITEM) { metadataValues = getMetadata(dso, Item.ANY, Item.ANY, Item.ANY, Item.ANY); } else { @@ -628,7 +627,7 @@ public abstract class DSpaceObjectServiceImpl implements String authority = metadataValue.getAuthority(); String relationshipId = StringUtils.split(authority, "::")[1]; Relationship relationship = relationshipService.find(context, Integer.parseInt(relationshipId)); - if (relationship.getLeftItem() == (Item) dso) { + if (relationship.getLeftItem().equals((Item) dso)) { relationship.setLeftPlace(mvPlace); } else { relationship.setRightPlace(mvPlace); diff --git a/dspace-api/src/main/java/org/dspace/content/EntityType.java b/dspace-api/src/main/java/org/dspace/content/EntityType.java index d44ec5a35d..20ab758a0b 100644 --- a/dspace-api/src/main/java/org/dspace/content/EntityType.java +++ b/dspace-api/src/main/java/org/dspace/content/EntityType.java @@ -78,6 +78,7 @@ public class EntityType implements ReloadableEntity { * * @return The ID for this EntityType */ + @Override public Integer getID() { return id; } @@ -87,6 +88,7 @@ public class EntityType implements ReloadableEntity { * @param obj object to be compared * @return */ + @Override public boolean equals(Object obj) { if (!(obj instanceof EntityType)) { return false; @@ -97,10 +99,7 @@ public class EntityType implements ReloadableEntity { return false; } - if (!StringUtils.equals(this.getLabel(), entityType.getLabel())) { - return false; - } - return true; + return StringUtils.equals(this.getLabel(), entityType.getLabel()); } /** diff --git a/dspace-api/src/main/java/org/dspace/content/Relationship.java b/dspace-api/src/main/java/org/dspace/content/Relationship.java index 3a2aad5bdf..f4bcf78a79 100644 --- a/dspace-api/src/main/java/org/dspace/content/Relationship.java +++ b/dspace-api/src/main/java/org/dspace/content/Relationship.java @@ -218,6 +218,7 @@ public class Relationship implements ReloadableEntity { * Standard getter for the ID for this Relationship * @return The ID of this relationship */ + @Override public Integer getID() { return id; } diff --git a/dspace-api/src/main/java/org/dspace/content/RelationshipType.java b/dspace-api/src/main/java/org/dspace/content/RelationshipType.java index 5f16870bc6..676b7fd2a8 100644 --- a/dspace-api/src/main/java/org/dspace/content/RelationshipType.java +++ b/dspace-api/src/main/java/org/dspace/content/RelationshipType.java @@ -201,7 +201,7 @@ public class RelationshipType implements ReloadableEntity { /** * Standard setter for the leftMinCardinality Integer for this RelationshipType - * @param leftMinCardinality The leftMinCardinality Integer that this RelationshipType should recieve + * @param leftMinCardinality The leftMinCardinality Integer that this RelationshipType should receive */ public void setLeftMinCardinality(Integer leftMinCardinality) { this.leftMinCardinality = leftMinCardinality; @@ -217,7 +217,7 @@ public class RelationshipType implements ReloadableEntity { /** * Standard setter for the leftMaxCardinality Integer for this RelationshipType - * @param leftMaxCardinality The leftMaxCardinality Integer that this RelationshipType should recieve + * @param leftMaxCardinality The leftMaxCardinality Integer that this RelationshipType should receive */ public void setLeftMaxCardinality(Integer leftMaxCardinality) { this.leftMaxCardinality = leftMaxCardinality; @@ -233,7 +233,7 @@ public class RelationshipType implements ReloadableEntity { /** * Standard setter for the rightMinCardinality Integer for this RelationshipType - * @param rightMinCardinality The rightMinCardinality Integer that this RelationshipType should recieve + * @param rightMinCardinality The rightMinCardinality Integer that this RelationshipType should receive */ public void setRightMinCardinality(Integer rightMinCardinality) { this.rightMinCardinality = rightMinCardinality; @@ -249,7 +249,7 @@ public class RelationshipType implements ReloadableEntity { /** * Standard setter for the rightMaxCardinality Integer for this RelationshipType - * @param rightMaxCardinality The rightMaxCardinality Integer that this RelationshipType should recieve + * @param rightMaxCardinality The rightMaxCardinality Integer that this RelationshipType should receive */ public void setRightMaxCardinality(Integer rightMaxCardinality) { this.rightMaxCardinality = rightMaxCardinality; @@ -291,6 +291,7 @@ public class RelationshipType implements ReloadableEntity { * Standard getter for the ID of this RelationshipType * @return The ID of this RelationshipType */ + @Override public Integer getID() { return id; } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java index 80198a1e89..71eb487b83 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java @@ -8,7 +8,7 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; @@ -63,7 +63,7 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO Root metadataSchemaRoot = criteriaQuery.from(MetadataSchema.class); criteriaQuery.select(metadataSchemaRoot); - List orderList = new LinkedList<>(); + List orderList = new ArrayList<>(); orderList.add(criteriaBuilder.asc(metadataSchemaRoot.get(MetadataSchema_.id))); criteriaQuery.orderBy(orderList); diff --git a/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java b/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java index 58f2621afb..13c705c932 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java @@ -19,7 +19,6 @@ import org.apache.logging.log4j.Logger; * exceptions. This class is intended for declarations and catch clauses. * * @author Larry Stone - * @version $Revision$ */ public class PackageException extends Exception { /** @@ -76,10 +75,4 @@ public class PackageException extends Exception { log.error(sw.toString()); } } - - public String toString() { - String base = getClass().getName() + ": " + getMessage(); - return (getCause() == null) ? base : - base + ", Reason: " + getCause().toString(); - } } diff --git a/dspace-api/src/main/java/org/dspace/content/packager/PackageParameters.java b/dspace-api/src/main/java/org/dspace/content/packager/PackageParameters.java index 1bd68bea26..b472a52c3b 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/PackageParameters.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/PackageParameters.java @@ -57,7 +57,7 @@ public class PackageParameters extends Properties { } else if (v.length == 1) { result.setProperty(name, v[0]); } else { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < v.length; ++i) { if (i > 0) { sb.append(SEPARATOR); diff --git a/dspace-api/src/main/java/org/dspace/content/virtual/UUIDValue.java b/dspace-api/src/main/java/org/dspace/content/virtual/UUIDValue.java index 252faf019c..0b08cc309f 100644 --- a/dspace-api/src/main/java/org/dspace/content/virtual/UUIDValue.java +++ b/dspace-api/src/main/java/org/dspace/content/virtual/UUIDValue.java @@ -8,7 +8,6 @@ package org.dspace.content.virtual; import java.sql.SQLException; -import java.util.LinkedList; import java.util.List; import org.dspace.content.Item; @@ -24,9 +23,7 @@ public class UUIDValue implements VirtualMetadataConfiguration { @Override public List getValues(Context context, Item item) throws SQLException { - List list = new LinkedList<>(); - list.add(String.valueOf(item.getID())); - return list; + return List.of(String.valueOf(item.getID())); } @Override diff --git a/dspace-api/src/main/java/org/dspace/core/Context.java b/dspace-api/src/main/java/org/dspace/core/Context.java index 2181626250..be52595c09 100644 --- a/dspace-api/src/main/java/org/dspace/core/Context.java +++ b/dspace-api/src/main/java/org/dspace/core/Context.java @@ -8,13 +8,13 @@ package org.dspace.core; import java.sql.SQLException; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.EmptyStackException; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Set; -import java.util.Stack; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @@ -79,13 +79,13 @@ public class Context implements AutoCloseable { /** * A stack with the history of authorisation system check modify */ - private Stack authStateChangeHistory; + private ArrayDeque authStateChangeHistory; /** * A stack with the name of the caller class that modify authorisation * system check */ - private Stack authStateClassCallHistory; + private ArrayDeque authStateClassCallHistory; /** * Group IDs of special groups user is a member of @@ -115,7 +115,7 @@ public class Context implements AutoCloseable { /** * Cache that is only used the context is in READ_ONLY mode */ - private ContextReadOnlyCache readOnlyCache = new ContextReadOnlyCache(); + private final ContextReadOnlyCache readOnlyCache = new ContextReadOnlyCache(); protected EventService eventService; @@ -183,8 +183,8 @@ public class Context implements AutoCloseable { specialGroups = new ArrayList<>(); - authStateChangeHistory = new Stack<>(); - authStateClassCallHistory = new Stack<>(); + authStateChangeHistory = new ArrayDeque<>(); + authStateClassCallHistory = new ArrayDeque<>(); setMode(this.mode); } @@ -336,7 +336,7 @@ public class Context implements AutoCloseable { + previousCaller)); } } - ignoreAuth = previousState.booleanValue(); + ignoreAuth = previousState; } /** @@ -488,7 +488,7 @@ public class Context implements AutoCloseable { throw new IllegalStateException("Attempt to mutate object in read-only context"); } if (events == null) { - events = new LinkedList(); + events = new LinkedList<>(); } events.add(event); @@ -622,11 +622,7 @@ public class Context implements AutoCloseable { * @return true if member */ public boolean inSpecialGroup(UUID groupID) { - if (specialGroups.contains(groupID)) { - return true; - } - - return false; + return specialGroups.contains(groupID); } /** @@ -636,7 +632,7 @@ public class Context implements AutoCloseable { * @throws SQLException if database error */ public List getSpecialGroups() throws SQLException { - List myGroups = new ArrayList(); + List myGroups = new ArrayList<>(); for (UUID groupId : specialGroups) { myGroups.add(EPersonServiceFactory.getInstance().getGroupService().find(this, groupId)); } @@ -661,7 +657,7 @@ public class Context implements AutoCloseable { currentUserPreviousState = currentUser; specialGroupsPreviousState = specialGroups; - specialGroups = new ArrayList(); + specialGroups = new ArrayList<>(); currentUser = newUser; } @@ -703,11 +699,13 @@ public class Context implements AutoCloseable { /** - * Returns the size of the cache of all object that have been read from the database so far. A larger number - * means that more memory is consumed by the cache. This also has a negative impact on the query performance. In - * that case you should consider uncaching entities when they are no longer needed (see - * {@link Context#uncacheEntity(ReloadableEntity)} () uncacheEntity}). + * Returns the size of the cache of all object that have been read from the + * database so far. A larger number means that more memory is consumed by + * the cache. This also has a negative impact on the query performance. In + * that case you should consider uncaching entities when they are no longer + * needed (see {@link Context#uncacheEntity(ReloadableEntity)} () uncacheEntity}). * + * @return cache size. * @throws SQLException When connecting to the active cache fails. */ public long getCacheSize() throws SQLException { diff --git a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java index 68db217f1e..8c101a8f05 100644 --- a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java +++ b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java @@ -320,11 +320,11 @@ public class I18nUtil { fileType = ""; } - if (!("".equals(locale.getCountry()))) { + if (!"".equals(locale.getCountry())) { fileNameLC = fileName + "_" + locale.getLanguage() + "_" + locale.getCountry(); - if (!("".equals(locale.getVariant()))) { + if (!"".equals(locale.getVariant())) { fileNameLCV = fileName + "_" + locale.getLanguage() + "_" + locale.getCountry() + "_" + locale.getVariant(); } diff --git a/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java b/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java index 979ade99a5..f603fa2e9a 100644 --- a/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java +++ b/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java @@ -13,16 +13,17 @@ import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.services.factory.DSpaceServicesFactory; - /** * FileTaskQueue provides a TaskQueue implementation based on flat files * for the queues and semaphores. @@ -30,14 +31,16 @@ import org.dspace.services.factory.DSpaceServicesFactory; * @author richardrodgers */ public class FileTaskQueue implements TaskQueue { - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TaskQueue.class); + private static final Logger log = LogManager.getLogger(TaskQueue.class); + // base directory for curation task queues protected String tqDir; // ticket for queue readers protected long readTicket = -1L; + // list of queues owned by reader - protected List readList = new ArrayList(); + protected List readList = new ArrayList<>(); public FileTaskQueue() { tqDir = DSpaceServicesFactory.getInstance().getConfigurationService().getProperty("curate.taskqueue.dir"); @@ -72,7 +75,7 @@ public class FileTaskQueue implements TaskQueue { BufferedWriter writer = null; try { File queue = new File(qDir, "queue" + Integer.toString(queueIdx)); - writer = new BufferedWriter(new FileWriter(queue, true)); + writer = new BufferedWriter(new FileWriter(queue, StandardCharsets.UTF_8, true)); Iterator iter = entrySet.iterator(); while (iter.hasNext()) { writer.write(iter.next().toString()); @@ -96,7 +99,7 @@ public class FileTaskQueue implements TaskQueue { @Override public synchronized Set dequeue(String queueName, long ticket) throws IOException { - Set entrySet = new HashSet(); + Set entrySet = new HashSet<>(); if (readTicket == -1L) { // hold the ticket & copy all Ids available, locking queues // stop when no more queues or one found locked @@ -113,8 +116,8 @@ public class FileTaskQueue implements TaskQueue { // read contents from file BufferedReader reader = null; try { - reader = new BufferedReader(new FileReader(queue)); - String entryStr = null; + reader = new BufferedReader(new FileReader(queue, StandardCharsets.UTF_8)); + String entryStr; while ((entryStr = reader.readLine()) != null) { entryStr = entryStr.trim(); if (entryStr.length() > 0) { diff --git a/dspace-api/src/main/java/org/dspace/curate/ResolvedTask.java b/dspace-api/src/main/java/org/dspace/curate/ResolvedTask.java index 89e92609f0..0b05ab3e0f 100644 --- a/dspace-api/src/main/java/org/dspace/curate/ResolvedTask.java +++ b/dspace-api/src/main/java/org/dspace/curate/ResolvedTask.java @@ -24,7 +24,7 @@ public class ResolvedTask { private CurationTask cTask; private ScriptedTask sTask; // local name of task - private String taskName; + private final String taskName; // annotation data private boolean distributive = false; private boolean mutative = false; @@ -76,7 +76,7 @@ public class ResolvedTask { * @throws IOException if error */ public int perform(DSpaceObject dso) throws IOException { - return (unscripted()) ? cTask.perform(dso) : sTask.performDso(dso); + return unscripted() ? cTask.perform(dso) : sTask.performDso(dso); } /** @@ -88,7 +88,7 @@ public class ResolvedTask { * @throws IOException if error */ public int perform(Context ctx, String id) throws IOException { - return (unscripted()) ? cTask.perform(ctx, id) : sTask.performId(ctx, id); + return unscripted() ? cTask.perform(ctx, id) : sTask.performId(ctx, id); } /** diff --git a/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java b/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java index d82779015f..f9ca9c2e9c 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java +++ b/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java @@ -33,9 +33,9 @@ public class DiscoverQuery { * Main attributes for the discovery query **/ private String query; - private List filterQueries; + private final List filterQueries; private List dspaceObjectFilters = new ArrayList<>(); - private List fieldPresentQueries; + private final List fieldPresentQueries; private boolean spellCheck; private int start = 0; @@ -55,36 +55,35 @@ public class DiscoverQuery { /** * Attributes required for the faceting of values **/ - private List facetFields; - private List facetQueries; - private int facetLimit = -1; + private final List facetFields; + private final List facetQueries; private int facetMinCount = -1; private int facetOffset = 0; - private Map hitHighlighting; + private final Map hitHighlighting; /** * Used when you want to search for a specific field value **/ - private List searchFields; + private final List searchFields; /** * Misc attributes can be implementation dependent **/ - private Map> properties; + private final Map> properties; private String discoveryConfigurationName; public DiscoverQuery() { //Initialize all our lists - this.filterQueries = new ArrayList(); - this.fieldPresentQueries = new ArrayList(); + this.filterQueries = new ArrayList<>(); + this.fieldPresentQueries = new ArrayList<>(); - this.facetFields = new ArrayList(); - this.facetQueries = new ArrayList(); - this.searchFields = new ArrayList(); - this.hitHighlighting = new HashMap(); + this.facetFields = new ArrayList<>(); + this.facetQueries = new ArrayList<>(); + this.searchFields = new ArrayList<>(); + this.hitHighlighting = new HashMap<>(); //Use a linked hashmap since sometimes insertion order might matter - this.properties = new LinkedHashMap>(); + this.properties = new LinkedHashMap<>(); } @@ -309,7 +308,7 @@ public class DiscoverQuery { public void addProperty(String property, String value) { List toAddList = properties.get(property); if (toAddList == null) { - toAddList = new ArrayList(); + toAddList = new ArrayList<>(); } toAddList.add(value); @@ -322,7 +321,7 @@ public class DiscoverQuery { } public List getHitHighlightingFields() { - return new ArrayList(hitHighlighting.values()); + return new ArrayList<>(hitHighlighting.values()); } public void addHitHighlightingField(DiscoverHitHighlightingField hitHighlighting) { @@ -368,7 +367,7 @@ public class DiscoverQuery { private List buildFacetQueriesWithGap(int newestYear, int oldestYear, String dateFacet, int gap, int topYear, int facetLimit) { - List facetQueries = new LinkedList<>(); + List facetQueries = new ArrayList<>(); for (int year = topYear; year > oldestYear && (facetQueries.size() < facetLimit); year -= gap) { //Add a filter to remove the last year only if we aren't the last year int bottomYear = year - gap; @@ -392,7 +391,7 @@ public class DiscoverQuery { } private int getTopYear(int newestYear, int gap) { - return (int) (Math.ceil((float) (newestYear) / gap) * gap); + return (int) (Math.ceil((float) newestYear / gap) * gap); } /** diff --git a/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java b/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java index b3ee42fca1..ee220e5a4f 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java +++ b/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java @@ -179,6 +179,11 @@ public class FullTextContentStreams extends ContentStreamBase { } } + /** + * {@link Enumeration} is implemented because instances of this class are + * passed to a JDK class that requires this obsolete type. + */ + @SuppressWarnings("JdkObsolete") private static class FullTextEnumeration implements Enumeration { private final Iterator fulltextIterator; diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceFileInfoPlugin.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceFileInfoPlugin.java index 3f5e765b0e..52e0043ff4 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceFileInfoPlugin.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceFileInfoPlugin.java @@ -55,7 +55,7 @@ public class SolrServiceFileInfoPlugin implements SolrServiceIndexPlugin { document.addField(SOLR_FIELD_NAME_FOR_FILENAMES, bitstream.getName()); String description = bitstream.getDescription(); - if ((description != null) && (!description.isEmpty())) { + if ((description != null) && !description.isEmpty()) { document.addField(SOLR_FIELD_NAME_FOR_DESCRIPTIONS, description); } } diff --git a/dspace-api/src/main/java/org/dspace/discovery/indexobject/AbstractIndexableObject.java b/dspace-api/src/main/java/org/dspace/discovery/indexobject/AbstractIndexableObject.java index 90aafcbd30..21c9a66b9f 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/indexobject/AbstractIndexableObject.java +++ b/dspace-api/src/main/java/org/dspace/discovery/indexobject/AbstractIndexableObject.java @@ -14,10 +14,13 @@ import org.dspace.discovery.IndexableObject; /** * This class exists in order to provide a default implementation for the equals and hashCode methods. - * Since IndexableObjects can be made multiple times for the same underlying object, we needed a more finetuned - * equals and hashcode methods. We're simply checking that the underlying objects are equal and generating the hashcode - * for the underlying object. This way, we'll always get a proper result when calling equals or hashcode on an - * IndexableObject because it'll depend on the underlying object + * Since IndexableObjects can be made multiple times for the same underlying + * object, we needed more finely-tuned {@link equals} and {@link hashCode} methods. + * We're simply checking that the underlying objects are equal and returning the + * hash-code for the underlying object. This way, we'll always get a proper + * result when calling {@link equals} or {@link hashCode} on an IndexableObject + * because it'll depend on the underlying object. + * * @param Refers to the underlying entity that is linked to this object * @param The type of ID that this entity uses */ @@ -30,7 +33,7 @@ public abstract class AbstractIndexableObject, PK if (!(obj instanceof AbstractIndexableObject)) { return false; } - IndexableDSpaceObject other = (IndexableDSpaceObject) obj; + AbstractIndexableObject other = (AbstractIndexableObject) obj; return other.getIndexedObject().equals(getIndexedObject()); } diff --git a/dspace-api/src/main/java/org/dspace/eperson/Subscription.java b/dspace-api/src/main/java/org/dspace/eperson/Subscription.java index abe8ad481c..1719888ca8 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/Subscription.java +++ b/dspace-api/src/main/java/org/dspace/eperson/Subscription.java @@ -53,6 +53,7 @@ public class Subscription implements ReloadableEntity { } + @Override public Integer getID() { return id; } diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java index a90c5da5a1..40d031ac29 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java @@ -8,6 +8,7 @@ package org.dspace.eperson.dao.impl; import java.sql.SQLException; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import javax.persistence.Query; @@ -97,7 +98,7 @@ public class SubscriptionDAOImpl extends AbstractHibernateDAO impl Root subscriptionRoot = criteriaQuery.from(Subscription.class); criteriaQuery.select(subscriptionRoot); - List orderList = new LinkedList<>(); + List orderList = new ArrayList<>(1); orderList.add(criteriaBuilder.asc(subscriptionRoot.get(Subscription_.ePerson))); criteriaQuery.orderBy(orderList); diff --git a/dspace-api/src/main/java/org/dspace/external/OrcidRestConnector.java b/dspace-api/src/main/java/org/dspace/external/OrcidRestConnector.java index c04f64f674..f6f5f6cfd9 100644 --- a/dspace-api/src/main/java/org/dspace/external/OrcidRestConnector.java +++ b/dspace-api/src/main/java/org/dspace/external/OrcidRestConnector.java @@ -8,6 +8,7 @@ package org.dspace.external; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.Scanner; import org.apache.commons.lang3.StringUtils; @@ -15,6 +16,7 @@ import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** @@ -28,9 +30,9 @@ public class OrcidRestConnector { /** * log4j logger */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(OrcidRestConnector.class); + private static final Logger log = LogManager.getLogger(OrcidRestConnector.class); - private String url; + private final String url; public OrcidRestConnector(String url) { this.url = url; @@ -73,7 +75,7 @@ public class OrcidRestConnector { } public static String convertStreamToString(InputStream is) { - Scanner s = new Scanner(is).useDelimiter("\\A"); + Scanner s = new Scanner(is, StandardCharsets.UTF_8).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } diff --git a/dspace-api/src/main/java/org/dspace/external/model/ExternalDataObject.java b/dspace-api/src/main/java/org/dspace/external/model/ExternalDataObject.java index cc2587056c..eac9921df6 100644 --- a/dspace-api/src/main/java/org/dspace/external/model/ExternalDataObject.java +++ b/dspace-api/src/main/java/org/dspace/external/model/ExternalDataObject.java @@ -7,7 +7,7 @@ */ package org.dspace.external.model; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import org.dspace.content.dto.MetadataValueDTO; @@ -32,7 +32,7 @@ public class ExternalDataObject { /** * The list of Metadata values. These our MetadataValueDTO because they won't exist in the DB */ - private List metadata = new LinkedList<>(); + private List metadata = new ArrayList<>(); /** * The display value of the ExternalDataObject */ @@ -87,11 +87,11 @@ public class ExternalDataObject { /** * This method will add a Metadata value to the list of metadata values - * @param metadataValueDTO The metadatavalue to be added + * @param metadataValueDTO The metadata value to be added. */ public void addMetadata(MetadataValueDTO metadataValueDTO) { if (metadata == null) { - metadata = new LinkedList<>(); + metadata = new ArrayList<>(); } metadata.add(metadataValueDTO); } diff --git a/dspace-api/src/main/java/org/dspace/external/provider/orcid/xml/Converter.java b/dspace-api/src/main/java/org/dspace/external/provider/orcid/xml/Converter.java index 582c49d407..8f48cda712 100644 --- a/dspace-api/src/main/java/org/dspace/external/provider/orcid/xml/Converter.java +++ b/dspace-api/src/main/java/org/dspace/external/provider/orcid/xml/Converter.java @@ -13,7 +13,6 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; -import org.apache.logging.log4j.Logger; import org.xml.sax.SAXException; /** @@ -25,11 +24,6 @@ import org.xml.sax.SAXException; */ public abstract class Converter { - /** - * log4j logger - */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Converter.class); - public abstract T convert(InputStream document); protected Object unmarshall(InputStream input, Class type) throws SAXException, URISyntaxException { diff --git a/dspace-api/src/main/java/org/dspace/harvest/HarvestedItem.java b/dspace-api/src/main/java/org/dspace/harvest/HarvestedItem.java index 87d2a58749..343347136b 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/HarvestedItem.java +++ b/dspace-api/src/main/java/org/dspace/harvest/HarvestedItem.java @@ -56,6 +56,7 @@ public class HarvestedItem implements ReloadableEntity { protected HarvestedItem() { } + @Override public Integer getID() { return id; } @@ -89,7 +90,6 @@ public class HarvestedItem implements ReloadableEntity { */ public void setOaiID(String itemOaiID) { this.oaiId = itemOaiID; - return; } diff --git a/dspace-api/src/main/java/org/dspace/identifier/DOI.java b/dspace-api/src/main/java/org/dspace/identifier/DOI.java index b73fb2b155..67668c3abe 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/DOI.java +++ b/dspace-api/src/main/java/org/dspace/identifier/DOI.java @@ -62,6 +62,7 @@ public class DOI protected DOI() { } + @Override public Integer getID() { return id; } diff --git a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java index 019e89c129..13c53d12f7 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java @@ -8,7 +8,7 @@ package org.dspace.identifier.dao.impl; import java.sql.SQLException; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; @@ -24,7 +24,7 @@ import org.dspace.identifier.dao.DOIDAO; /** * Hibernate implementation of the Database Access Object interface class for the DOI object. - * This class is responsible for all database calls for the DOI object and is autowired by spring + * This class is responsible for all database calls for the DOI object and is autowired by Spring. * This class should never be accessed directly. * * @author kevinvandevelde at atmire.com @@ -52,7 +52,7 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO { Root doiRoot = criteriaQuery.from(DOI.class); criteriaQuery.select(doiRoot); - List listToIncludeInOrPredicate = new LinkedList<>(); + List listToIncludeInOrPredicate = new ArrayList<>(statusToExclude.size() + 1); for (Integer status : statusToExclude) { listToIncludeInOrPredicate.add(criteriaBuilder.notEqual(doiRoot.get(DOI_.status), status)); @@ -75,7 +75,7 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO { CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); Root doiRoot = criteriaQuery.from(DOI.class); criteriaQuery.select(doiRoot); - List orPredicates = new LinkedList<>(); + List orPredicates = new ArrayList<>(statuses.size()); for (Integer status : statuses) { orPredicates.add(criteriaBuilder.equal(doiRoot.get(DOI_.status), status)); } @@ -92,13 +92,13 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO { Root doiRoot = criteriaQuery.from(DOI.class); criteriaQuery.select(doiRoot); - List listToIncludeInOrPredicate = new LinkedList<>(); + List listToIncludeInOrPredicate = new ArrayList<>(excludedStatuses.size()); for (Integer status : excludedStatuses) { listToIncludeInOrPredicate.add(criteriaBuilder.notEqual(doiRoot.get(DOI_.status), status)); } - List listToIncludeInAndPredicate = new LinkedList<>(); + List listToIncludeInAndPredicate = new ArrayList<>(); listToIncludeInAndPredicate.add(criteriaBuilder.like(doiRoot.get(DOI_.doi), doi)); listToIncludeInAndPredicate.add(criteriaBuilder.or(listToIncludeInOrPredicate.toArray(new Predicate[] {}))); @@ -107,8 +107,6 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO { } criteriaQuery.where(listToIncludeInAndPredicate.toArray(new Predicate[] {})); return list(context, criteriaQuery, false, DOI.class, -1, -1); - - } @Override diff --git a/dspace-api/src/main/java/org/dspace/importer/external/datamodel/ImportRecord.java b/dspace-api/src/main/java/org/dspace/importer/external/datamodel/ImportRecord.java index f5d3a6f722..3fc34dc511 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/datamodel/ImportRecord.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/datamodel/ImportRecord.java @@ -7,9 +7,9 @@ */ package org.dspace.importer.external.datamodel; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.LinkedList; import java.util.List; import org.dspace.importer.external.metadatamapping.MetadatumDTO; @@ -38,7 +38,7 @@ public class ImportRecord { */ public ImportRecord(List valueList) { //don't want to alter the original list. Also now I can control the type of list - this.valueList = new LinkedList<>(valueList); + this.valueList = new ArrayList<>(valueList); } /** @@ -81,7 +81,7 @@ public class ImportRecord { * @return the MetadatumDTO's that are related to a given schema/element/qualifier pair/triplet */ public Collection getValue(String schema, String element, String qualifier) { - List values = new LinkedList(); + List values = new ArrayList(); for (MetadatumDTO value : valueList) { if (value.getSchema().equals(schema) && value.getElement().equals(element)) { if (qualifier == null && value.getQualifier() == null) { diff --git a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java index aed2f0e084..d2f0df6d04 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java @@ -7,18 +7,19 @@ */ package org.dspace.importer.external.metadatamapping; +import java.util.ArrayList; import java.util.Collection; -import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.importer.external.metadatamapping.contributor.MetadataContributor; import org.dspace.importer.external.metadatamapping.transform.MetadataProcessorService; /** - * Abstract class that implements {@link MetadataFieldMapping} - * This class adds a default implementation for the MetadataFieldMapping methods + * Abstract class that implements {@link MetadataFieldMapping}. + * This class adds a default implementation for the MetadataFieldMapping methods. * * @author Roeland Dillen (roeland at atmire dot com) */ @@ -30,7 +31,7 @@ public abstract class AbstractMetadataFieldMapping /** * log4j logger */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractMetadataFieldMapping.class); + private static final Logger log = LogManager.getLogger(AbstractMetadataFieldMapping.class); /* A map containing what processing has to be done on a given metadataFieldConfig. * The processing of a value is used to determine the actual value that will be returned used. @@ -66,6 +67,7 @@ public abstract class AbstractMetadataFieldMapping * @param value The value to map to a MetadatumDTO * @return A metadatumDTO created from the field and value */ + @Override public MetadatumDTO toDCValue(MetadataFieldConfig field, String value) { MetadatumDTO dcValue = new MetadatumDTO(); @@ -108,14 +110,15 @@ public abstract class AbstractMetadataFieldMapping } /** - * Loop over the MetadataContributors and return their concatenated retrieved metadatumDTO objects + * Loop over the MetadataContributors and return their concatenated + * retrieved metadatumDTO objects. * * @param record Used to retrieve the MetadatumDTO * @return Lit of metadatumDTO */ @Override public Collection resultToDCValueMapping(RecordType record) { - List values = new LinkedList(); + List values = new ArrayList<>(); for (MetadataContributor query : getMetadataFieldMap().values()) { try { diff --git a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/MetadataFieldConfig.java b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/MetadataFieldConfig.java index d19939248c..be3c85ab62 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/MetadataFieldConfig.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/MetadataFieldConfig.java @@ -8,7 +8,7 @@ package org.dspace.importer.external.metadatamapping; /** - * A generalised configuration for metadatafields. + * A generalised configuration for metadata fields. * This is used to make the link between values and the actual MetadatumDTO object. * * @author Roeland Dillen (roeland at atmire dot com) @@ -31,7 +31,7 @@ public class MetadataFieldConfig { if (this == o) { return true; } - if (o == null || getClass() != o.getClass()) { + if (o == null || !(o instanceof MetadataFieldConfig)) { return false; } @@ -43,11 +43,7 @@ public class MetadataFieldConfig { if (qualifier != null ? !qualifier.equals(that.qualifier) : that.qualifier != null) { return false; } - if (!schema.equals(that.schema)) { - return false; - } - - return true; + return schema.equals(that.schema); } /** diff --git a/dspace-api/src/main/java/org/dspace/scripts/DSpaceCommandLineParameter.java b/dspace-api/src/main/java/org/dspace/scripts/DSpaceCommandLineParameter.java index 2862d014c9..f8b5f23b8c 100644 --- a/dspace-api/src/main/java/org/dspace/scripts/DSpaceCommandLineParameter.java +++ b/dspace-api/src/main/java/org/dspace/scripts/DSpaceCommandLineParameter.java @@ -14,7 +14,8 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.HashCodeBuilder; /** - * This class serves as a representation of a command line parameter by holding a String name and a String value + * This class serves as a representation of a command line parameter by holding + * a String name and a String value. */ public class DSpaceCommandLineParameter { private String name; @@ -23,7 +24,7 @@ public class DSpaceCommandLineParameter { public static String SEPARATOR = "|||"; /** - * This constructor will take a String key and String value and store them in their appriopriate fields + * This constructor will take a String key and String value and store them in their appropriate fields. * @param key The String value to be stored as the name of the parameter * @param value The String value to be stored as the value of the parameter */ @@ -64,9 +65,10 @@ public class DSpaceCommandLineParameter { /** * Converts the DSpaceCommandLineParameter into a String format by concatenating the value and the name String - * values by separating them with a space + * values by separating them with a space. * @return The String representation of a DSpaceCommandlineParameter object */ + @Override public String toString() { String stringToReturn = ""; stringToReturn += getName(); @@ -92,7 +94,7 @@ public class DSpaceCommandLineParameter { } /** - * Will return a boolean indicating whether the given param is equal to this object + * Will return a boolean indicating whether the given parameter is equal to this object. * @param other The other object * @return A boolean indicating equality */ @@ -101,7 +103,7 @@ public class DSpaceCommandLineParameter { if (other == null) { return false; } - if (other.getClass() != DSpaceCommandLineParameter.class) { + if (!(other instanceof DSpaceCommandLineParameter)) { return false; } return StringUtils.equals(this.getName(), ((DSpaceCommandLineParameter) other).getName()) && StringUtils diff --git a/dspace-api/src/main/java/org/dspace/scripts/DSpaceRunnable.java b/dspace-api/src/main/java/org/dspace/scripts/DSpaceRunnable.java index d0fffdb57d..2319aee317 100644 --- a/dspace-api/src/main/java/org/dspace/scripts/DSpaceRunnable.java +++ b/dspace-api/src/main/java/org/dspace/scripts/DSpaceRunnable.java @@ -8,7 +8,7 @@ package org.dspace.scripts; import java.io.InputStream; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -37,7 +37,7 @@ public abstract class DSpaceRunnable implements R protected CommandLine commandLine; /** - * This EPerson identifier variable is the uuid of the eperson that's running the script + * This EPerson identifier variable is the UUID of the EPerson that's running the script */ private UUID epersonIdentifier; @@ -129,7 +129,7 @@ public abstract class DSpaceRunnable implements R * @return The list of Strings representing filenames from the options given to the script */ public List getFileNamesFromInputStreamOptions() { - List fileNames = new LinkedList<>(); + List fileNames = new ArrayList<>(); for (Option option : getScriptConfiguration().getOptions().getOptions()) { if (option.getType() == InputStream.class && @@ -151,8 +151,8 @@ public abstract class DSpaceRunnable implements R } /** - * Generic setter for the epersonIdentifier - * This EPerson identifier variable is the uuid of the eperson that's running the script + * Generic setter for the epersonIdentifier. + * This EPerson identifier variable is the UUID of the EPerson that's running the script. * @param epersonIdentifier The epersonIdentifier to be set on this DSpaceRunnable */ public void setEpersonIdentifier(UUID epersonIdentifier) { diff --git a/dspace-api/src/main/java/org/dspace/scripts/Process.java b/dspace-api/src/main/java/org/dspace/scripts/Process.java index 574ba59760..2f5ab10f3e 100644 --- a/dspace-api/src/main/java/org/dspace/scripts/Process.java +++ b/dspace-api/src/main/java/org/dspace/scripts/Process.java @@ -7,8 +7,8 @@ */ package org.dspace.scripts; +import java.util.Collections; import java.util.Date; -import java.util.LinkedList; import java.util.List; import javax.persistence.Column; import javax.persistence.Entity; @@ -91,6 +91,7 @@ public class Process implements ReloadableEntity { * This method returns the ID that the Process holds within the Database * @return The ID that the process holds within the database */ + @Override public Integer getID() { return processId; } @@ -162,7 +163,8 @@ public class Process implements ReloadableEntity { /** * To get the parameters, use ProcessService.getParameters() to get a parsed list of DSpaceCommandLineParameters - * This String representation is the parameter in an unparsed fashion. For example "-c test" + * This String representation is the parameter in an unparsed fashion.For example "-c test" + * @return the raw parameter string. */ protected String getParameters() { return parameters; @@ -179,7 +181,7 @@ public class Process implements ReloadableEntity { */ public List getBitstreams() { if (bitstreams == null) { - bitstreams = new LinkedList<>(); + bitstreams = Collections.EMPTY_LIST; } return bitstreams; } diff --git a/dspace-api/src/main/java/org/dspace/search/Harvest.java b/dspace-api/src/main/java/org/dspace/search/Harvest.java index a0b3698592..b0bafd367f 100644 --- a/dspace-api/src/main/java/org/dspace/search/Harvest.java +++ b/dspace-api/src/main/java/org/dspace/search/Harvest.java @@ -11,7 +11,6 @@ import java.sql.SQLException; import java.text.ParseException; import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import org.apache.logging.log4j.Logger; @@ -129,7 +128,7 @@ public class Harvest { // several smaller operations (e.g. for OAI resumption tokens.) discoverQuery.setSortField("search.resourceid", DiscoverQuery.SORT_ORDER.asc); - List infoObjects = new LinkedList(); + List infoObjects = new ArrayList<>(); // Count of items read from the record set that match the selection criteria. // Note : Until 'index > offset' the records are not added to the output set. @@ -155,7 +154,7 @@ public class Harvest { if (collections) { // Add collections data - fillCollections(context, itemInfo); + fillCollections(itemInfo); } if (items) { @@ -163,7 +162,7 @@ public class Harvest { itemInfo.item = itemService.find(context, itemInfo.itemID); } - if ((nonAnon) || (itemInfo.item == null) || (withdrawn && itemInfo.withdrawn)) { + if (nonAnon || (itemInfo.item == null) || (withdrawn && itemInfo.withdrawn)) { index++; if (index > offset) { infoObjects.add(itemInfo); @@ -221,7 +220,7 @@ public class Harvest { // Get the sets if (collections) { - fillCollections(context, itemInfo); + fillCollections(itemInfo); } return itemInfo; @@ -234,8 +233,7 @@ public class Harvest { * @param itemInfo HarvestedItemInfo object to fill out * @throws SQLException if database error */ - private static void fillCollections(Context context, - HarvestedItemInfo itemInfo) throws SQLException { + private static void fillCollections(HarvestedItemInfo itemInfo) throws SQLException { // Get the collection Handles from DB List collections = itemInfo.item.getCollections(); itemInfo.collectionHandles = new ArrayList<>(); diff --git a/dspace-api/src/main/java/org/dspace/statistics/Dataset.java b/dspace-api/src/main/java/org/dspace/statistics/Dataset.java index 9204c56a21..f5a5e05e04 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/Dataset.java +++ b/dspace-api/src/main/java/org/dspace/statistics/Dataset.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; import au.com.bytecode.opencsv.CSVWriter; +import java.nio.charset.StandardCharsets; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; @@ -65,20 +66,20 @@ public class Dataset { } private void initRowLabels(int rows) { - rowLabels = new ArrayList(rows); - rowLabelsAttrs = new ArrayList>(); + rowLabels = new ArrayList<>(rows); + rowLabelsAttrs = new ArrayList<>(); for (int i = 0; i < rows; i++) { rowLabels.add("Row " + (i + 1)); - rowLabelsAttrs.add(new HashMap()); + rowLabelsAttrs.add(new HashMap<>()); } } private void initColumnLabels(int nbCols) { - colLabels = new ArrayList(nbCols); - colLabelsAttrs = new ArrayList>(); + colLabels = new ArrayList<>(nbCols); + colLabelsAttrs = new ArrayList<>(); for (int i = 0; i < nbCols; i++) { colLabels.add("Column " + (i + 1)); - colLabelsAttrs.add(new HashMap()); + colLabelsAttrs.add(new HashMap<>()); } } @@ -232,7 +233,7 @@ public class Dataset { public ByteArrayOutputStream exportAsCSV() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - CSVWriter ecsvp = new CSVWriter(new OutputStreamWriter(baos), ';'); + CSVWriter ecsvp = new CSVWriter(new OutputStreamWriter(baos, StandardCharsets.UTF_8), ';'); //Generate the item row List colLabels = getColLabels(); colLabels.add(0, ""); diff --git a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java index bcb8657ff2..5f29d84e54 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java +++ b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java @@ -7,9 +7,10 @@ */ package org.dspace.statistics; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.eperson.EPerson; import org.dspace.services.model.Event; @@ -28,7 +29,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class SolrLoggerUsageEventListener extends AbstractUsageEventListener { - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrLoggerUsageEventListener.class); + private static final Logger log = LogManager.getLogger(SolrLoggerUsageEventListener.class); protected SolrLoggerService solrLoggerService; @@ -56,7 +57,7 @@ public class SolrLoggerUsageEventListener extends AbstractUsageEventListener { } } else if (UsageEvent.Action.SEARCH == ue.getAction()) { UsageSearchEvent usageSearchEvent = (UsageSearchEvent) ue; - List queries = new LinkedList<>(); + List queries = new ArrayList<>(); queries.add(usageSearchEvent.getQuery()); solrLoggerService.postSearch(usageSearchEvent.getObject(), usageSearchEvent.getRequest(), currentUser, queries, usageSearchEvent.getPage().getSize(), diff --git a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java index 4197fc74af..4ee7a0f3e4 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java +++ b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java @@ -285,13 +285,8 @@ public class StatisticsDataVisits extends StatisticsData { DatasetQuery firsDataset = datasetQueries.get(0); //Do the first query - ObjectCount[] topCounts1 = null; -// if (firsDataset.getQueries().size() == 1) { - topCounts1 = + ObjectCount[] topCounts1 = queryFacetField(firsDataset, firsDataset.getQueries().get(0).getQuery(), filterQuery, facetMinCount); -// } else { -// TODO: do this -// } // Check if we have more queries that need to be done if (datasetQueries.size() == 2) { DatasetQuery secondDataSet = datasetQueries.get(1); @@ -313,7 +308,6 @@ public class StatisticsDataVisits extends StatisticsData { } for (int i = 0; i < topCounts1.length; i++) { ObjectCount count1 = topCounts1[i]; - ObjectCount[] currentResult = new ObjectCount[topCounts2.length]; // Make sure we have a dataSet if (dataset == null) { @@ -645,7 +639,7 @@ public class StatisticsDataVisits extends StatisticsData { // be null if a handle has not yet been assigned. In this case reference the // item its internal id. In the last case where the bitstream is not associated // with an item (such as a community logo) then reference the bitstreamID directly. - String identifier = null; + String identifier; if (owningItem != null && owningItem.getHandle() != null) { identifier = "handle/" + owningItem.getHandle(); } else if (owningItem != null) { diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java b/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java index 8d52f1ba73..f84a632e01 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java @@ -39,11 +39,11 @@ public class ValueConcatenationModifier extends AbstractModifier { public Record modify(MutableRecord rec) { List values = rec.getValues(field); if (values != null) { - List converted_values = new ArrayList(); + List converted_values = new ArrayList<>(); for (Value val : values) { converted_values.add(val.getAsString()); } - List final_value = new ArrayList(); + List final_value = new ArrayList<>(); String v = StringUtils.join(converted_values.iterator(), separator + (whitespaceAfter ? " " : "")); final_value.add(new StringValue(v)); @@ -89,9 +89,9 @@ public class ValueConcatenationModifier extends AbstractModifier { } /** - * @param whiteSpaceAfter the whiteSpaceAfter to set + * @param whitespaceAfter the whiteSpaceAfter to set */ - public void setWhitespaceAfter(boolean whiteSpaceAfter) { - this.whitespaceAfter = whiteSpaceAfter; + public void setWhitespaceAfter(boolean whitespaceAfter) { + this.whitespaceAfter = whitespaceAfter; } } diff --git a/dspace-api/src/main/java/org/dspace/submit/util/ItemSubmissionLookupDTO.java b/dspace-api/src/main/java/org/dspace/submit/util/ItemSubmissionLookupDTO.java index de144838ec..e187c9a02e 100644 --- a/dspace-api/src/main/java/org/dspace/submit/util/ItemSubmissionLookupDTO.java +++ b/dspace-api/src/main/java/org/dspace/submit/util/ItemSubmissionLookupDTO.java @@ -30,11 +30,9 @@ public class ItemSubmissionLookupDTO implements Serializable { private static final String MERGED_PUBLICATION_PROVIDER = "merged"; - private static final String UNKNOWN_PROVIDER_STRING = "UNKNOWN-PROVIDER"; + private final List publications; - private List publications; - - private String uuid; + private final String uuid; public ItemSubmissionLookupDTO(List publications) { this.uuid = UUID.randomUUID().toString(); @@ -46,7 +44,7 @@ public class ItemSubmissionLookupDTO implements Serializable { } public Set getProviders() { - Set orderedProviders = new LinkedHashSet(); + Set orderedProviders = new LinkedHashSet<>(); for (Record p : publications) { orderedProviders.add(SubmissionLookupService.getProviderName(p)); } diff --git a/dspace-api/src/main/java/org/dspace/versioning/Version.java b/dspace-api/src/main/java/org/dspace/versioning/Version.java index 2d4d359545..ee5c1c4183 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/Version.java +++ b/dspace-api/src/main/java/org/dspace/versioning/Version.java @@ -77,6 +77,7 @@ public class Version implements ReloadableEntity { } + @Override public Integer getID() { return id; } diff --git a/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java b/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java index 1acacc7838..683504e3fe 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java +++ b/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java @@ -20,7 +20,6 @@ import javax.persistence.OrderBy; import javax.persistence.SequenceGenerator; import javax.persistence.Table; -import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.ReloadableEntity; import org.hibernate.proxy.HibernateProxyHelper; @@ -35,8 +34,6 @@ import org.hibernate.proxy.HibernateProxyHelper; @Table(name = "versionhistory") public class VersionHistory implements ReloadableEntity { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(VersionHistory.class); - @Id @Column(name = "versionhistory_id") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "versionhistory_seq") @@ -56,6 +53,7 @@ public class VersionHistory implements ReloadableEntity { } + @Override public Integer getID() { return id; } @@ -98,11 +96,7 @@ public class VersionHistory implements ReloadableEntity { } final VersionHistory that = (VersionHistory) o; - if (!this.getID().equals(that.getID())) { - return false; - } - - return true; + return this.getID().equals(that.getID()); } @Override diff --git a/dspace-api/src/main/java/org/dspace/workflow/WorkflowException.java b/dspace-api/src/main/java/org/dspace/workflow/WorkflowException.java index f05ab80486..3de660f279 100644 --- a/dspace-api/src/main/java/org/dspace/workflow/WorkflowException.java +++ b/dspace-api/src/main/java/org/dspace/workflow/WorkflowException.java @@ -27,7 +27,8 @@ public class WorkflowException extends Exception { this.reason = reason; } - public String toString() { + @Override + public String getMessage() { return reason; } } diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItem.java b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItem.java index 065cae25fc..d744df2b1c 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItem.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItem.java @@ -116,6 +116,7 @@ public class BasicWorkflowItem implements WorkflowItem { * * @return state */ + @Override public int getState() { return state; } diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/TaskListItem.java b/dspace-api/src/main/java/org/dspace/workflowbasic/TaskListItem.java index 82a9438f68..f6edb8c99c 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/TaskListItem.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/TaskListItem.java @@ -73,6 +73,7 @@ public class TaskListItem implements ReloadableEntity { this.workflowItem = workflowItem; } + @Override public Integer getID() { return taskListItemId; } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/RoleMembers.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/RoleMembers.java index 39e3110d63..869f744440 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/RoleMembers.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/RoleMembers.java @@ -30,8 +30,8 @@ import org.dspace.eperson.service.GroupService; public class RoleMembers { protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService(); - private ArrayList groups; - private ArrayList epersons; + private final ArrayList groups; + private final ArrayList epersons; public RoleMembers() { this.groups = new ArrayList<>(); @@ -55,11 +55,7 @@ public class RoleMembers { } public void removeEperson(EPerson epersonToRemove) { - for (EPerson eperson : epersons) { - if (eperson.equals(epersonToRemove)) { - epersons.remove(eperson); - } - } + epersons.removeIf(eperson -> eperson.equals(epersonToRemove)); } public ArrayList getAllUniqueMembers(Context context) throws SQLException { diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowConfigurationException.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowConfigurationException.java index 5c2e1af487..e4e3ef759e 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowConfigurationException.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowConfigurationException.java @@ -8,7 +8,7 @@ package org.dspace.xmlworkflow; /** - * Exception for problems with the configuration xml + * Exception for problems with the configuration XML. * * @author Bram De Schouwer (bram.deschouwer at dot com) * @author Kevin Van de Velde (kevin at atmire dot com) @@ -17,13 +17,14 @@ package org.dspace.xmlworkflow; */ public class WorkflowConfigurationException extends Exception { - private String error; + private final String error; public WorkflowConfigurationException(String error) { this.error = error; } - public String toString() { + @Override + public String getMessage() { return this.error; } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/ClaimedTask.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/ClaimedTask.java index 8882055f82..8f4794cb3b 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/ClaimedTask.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/ClaimedTask.java @@ -71,6 +71,7 @@ public class ClaimedTask implements ReloadableEntity { } + @Override public Integer getID() { return id; } @@ -91,24 +92,24 @@ public class ClaimedTask implements ReloadableEntity { return workflowItem; } - public void setActionID(String actionID) { - this.actionId = actionID; + public void setActionID(String actionId) { + this.actionId = actionId; } public String getActionID() { return actionId; } - public void setStepID(String stepID) { - this.stepId = stepID; + public void setStepID(String stepId) { + this.stepId = stepId; } public String getStepID() { return stepId; } - public void setWorkflowID(String workflowID) { - this.workflowId = workflowID; + public void setWorkflowID(String workflowId) { + this.workflowId = workflowId; } public String getWorkflowID() { diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/CollectionRole.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/CollectionRole.java index 114db17087..c9a7995e03 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/CollectionRole.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/CollectionRole.java @@ -91,6 +91,7 @@ public class CollectionRole implements ReloadableEntity { return group; } + @Override public Integer getID() { return id; } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/PoolTask.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/PoolTask.java index 2a87de51cb..9cfc9ea068 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/PoolTask.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/PoolTask.java @@ -78,12 +78,13 @@ public class PoolTask implements ReloadableEntity { } + @Override public Integer getID() { return id; } - public void setEperson(EPerson eperson) { - this.ePerson = eperson; + public void setEperson(EPerson ePerson) { + this.ePerson = ePerson; } public EPerson getEperson() { @@ -114,16 +115,16 @@ public class PoolTask implements ReloadableEntity { return this.workflowItem; } - public void setStepID(String stepID) { - this.stepId = stepID; + public void setStepID(String stepId) { + this.stepId = stepId; } public String getStepID() { return stepId; } - public void setActionID(String actionID) { - this.actionId = actionID; + public void setActionID(String actionId) { + this.actionId = actionId; } public String getActionID() { diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/WorkflowItemRole.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/WorkflowItemRole.java index 9a7e5a034c..cc6df9731b 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/WorkflowItemRole.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/WorkflowItemRole.java @@ -69,7 +69,7 @@ public class WorkflowItemRole implements ReloadableEntity { } - + @Override public Integer getID() { return id; } @@ -90,8 +90,8 @@ public class WorkflowItemRole implements ReloadableEntity { return workflowItem; } - public void setEPerson(EPerson eperson) { - this.ePerson = eperson; + public void setEPerson(EPerson ePerson) { + this.ePerson = ePerson; } public EPerson getEPerson() throws SQLException { diff --git a/dspace-api/src/test/java/org/dspace/AbstractIntegrationTest.java b/dspace-api/src/test/java/org/dspace/AbstractIntegrationTest.java index d437a77385..725f9d2783 100644 --- a/dspace-api/src/test/java/org/dspace/AbstractIntegrationTest.java +++ b/dspace-api/src/test/java/org/dspace/AbstractIntegrationTest.java @@ -12,6 +12,7 @@ import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.nio.channels.FileChannel; +import java.nio.charset.StandardCharsets; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; @@ -118,7 +119,8 @@ public class AbstractIntegrationTest extends AbstractUnitTest { */ protected void appendToLocalConfiguration(String textToAppend) { String extraConfPath = getLocalConfigurationFilePath(); - try (Writer output = new BufferedWriter(new FileWriter(extraConfPath, true))) { + try (Writer output = new BufferedWriter( + new FileWriter(extraConfPath, StandardCharsets.UTF_8, true))) { output.append("\n"); output.append(textToAppend); output.flush(); diff --git a/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportIT.java b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportIT.java index 3dd229f066..1ea7479c6b 100644 --- a/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportIT.java +++ b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportIT.java @@ -47,10 +47,12 @@ import org.junit.Test; public class MetadataImportIT extends AbstractIntegrationTestWithDatabase { - private ItemService itemService - = ContentServiceFactory.getInstance().getItemService(); - private EPersonService ePersonService = EPersonServiceFactory.getInstance().getEPersonService(); - private RelationshipService relationshipService = ContentServiceFactory.getInstance().getRelationshipService(); + private final ItemService itemService + = ContentServiceFactory.getInstance().getItemService(); + private final EPersonService ePersonService + = EPersonServiceFactory.getInstance().getEPersonService(); + private final RelationshipService relationshipService + = ContentServiceFactory.getInstance().getRelationshipService(); Collection collection; @@ -119,7 +121,7 @@ public class MetadataImportIT extends AbstractIntegrationTestWithDatabase { Item importedItem = findItemByName("Test Import 1"); - assertEquals(relationshipService.findByItem(context, importedItem).size(), 1); + assertEquals(1, relationshipService.findByItem(context, importedItem).size()); context.turnOffAuthorisationSystem(); itemService.delete(context, itemService.find(context, importedItem.getID())); context.restoreAuthSystemState(); @@ -148,7 +150,7 @@ public class MetadataImportIT extends AbstractIntegrationTestWithDatabase { Item importedItem = findItemByName("Person1"); - assertEquals(relationshipService.findByItem(context, importedItem).size(), 1); + assertEquals(1, relationshipService.findByItem(context, importedItem).size()); } diff --git a/dspace-api/src/test/java/org/dspace/app/csv/CSVMetadataImportReferenceIT.java b/dspace-api/src/test/java/org/dspace/app/csv/CSVMetadataImportReferenceIT.java index 2dfe3a781f..538240b0f6 100644 --- a/dspace-api/src/test/java/org/dspace/app/csv/CSVMetadataImportReferenceIT.java +++ b/dspace-api/src/test/java/org/dspace/app/csv/CSVMetadataImportReferenceIT.java @@ -56,14 +56,16 @@ public class CSVMetadataImportReferenceIT extends AbstractIntegrationTestWithDat //Common collection to utilize for test private Collection col1; - private RelationshipService relationshipService = ContentServiceFactory.getInstance().getRelationshipService(); - private ItemService itemService = ContentServiceFactory.getInstance().getItemService(); - + private final RelationshipService relationshipService + = ContentServiceFactory.getInstance().getRelationshipService(); + private final ItemService itemService + = ContentServiceFactory.getInstance().getItemService(); Community parentCommunity; /** - * Setup testing enviorment + * Setup testing environment. + * @throws java.sql.SQLException passed through. */ @Before public void setup() throws SQLException { @@ -80,7 +82,7 @@ public class CSVMetadataImportReferenceIT extends AbstractIntegrationTestWithDat EntityType publication = EntityTypeBuilder.createEntityTypeBuilder(context, "Publication").build(); EntityType person = EntityTypeBuilder.createEntityTypeBuilder(context, "Person").build(); EntityType project = EntityTypeBuilder.createEntityTypeBuilder(context, "Project").build(); - EntityType orgUnit = EntityTypeBuilder.createEntityTypeBuilder(context, "OrgUnit").build(); + EntityTypeBuilder.createEntityTypeBuilder(context, "OrgUnit").build(); RelationshipTypeBuilder .createRelationshipTypeBuilder(context, publication, person, "isAuthorOfPublication", @@ -350,11 +352,12 @@ public class CSVMetadataImportReferenceIT extends AbstractIntegrationTestWithDat /** * Test failure when referring to item by non unique metadata in the database. + * @throws java.lang.Exception passed through. */ @Test(expected = MetadataImportException.class) public void testNonUniqueMDRefInDb() throws Exception { context.turnOffAuthorisationSystem(); - Item person = ItemBuilder.createItem(context, col1) + ItemBuilder.createItem(context, col1) .withTitle("Person") .withIssueDate("2017-10-17") .withAuthor("Smith, Donald") @@ -363,7 +366,7 @@ public class CSVMetadataImportReferenceIT extends AbstractIntegrationTestWithDat .withRelationshipType("Person") .withIdentifierOther("1") .build(); - Item person2 = ItemBuilder.createItem(context, col1) + ItemBuilder.createItem(context, col1) .withTitle("Person2") .withIssueDate("2017-10-17") .withAuthor("Smith, John") @@ -385,7 +388,7 @@ public class CSVMetadataImportReferenceIT extends AbstractIntegrationTestWithDat @Test(expected = MetadataImportException.class) public void testNonUniqueMDRefInBoth() throws Exception { context.turnOffAuthorisationSystem(); - Item person = ItemBuilder.createItem(context, col1) + ItemBuilder.createItem(context, col1) .withTitle("Person") .withIssueDate("2017-10-17") .withAuthor("Smith, Donald") @@ -402,7 +405,7 @@ public class CSVMetadataImportReferenceIT extends AbstractIntegrationTestWithDat } /** - * Test failure when refering to item by metadata that does not exist in the relation column + * Test failure when referring to item by metadata that does not exist in the relation column */ @Test(expected = Exception.class) public void testNonExistMdRef() throws Exception { @@ -413,7 +416,7 @@ public class CSVMetadataImportReferenceIT extends AbstractIntegrationTestWithDat } /** - * Test failure when refering to an item in the CSV that hasn't been created yet due to it's order in the CSV + * Test failure when referring to an item in the CSV that hasn't been created yet due to it's order in the CSV */ @Test(expected = Exception.class) public void testCSVImportWrongOrder() throws Exception { @@ -424,7 +427,7 @@ public class CSVMetadataImportReferenceIT extends AbstractIntegrationTestWithDat } /** - * Test failure when refering to an item in the CSV that hasn't been created yet due to it's order in the CSV + * Test failure when referring to an item in the CSV that hasn't been created yet due to it's order in the CSV */ @Test(expected = Exception.class) public void testCSVImportWrongOrderRowName() throws Exception { @@ -446,7 +449,7 @@ public class CSVMetadataImportReferenceIT extends AbstractIntegrationTestWithDat } /** - * Test relationship validation with invalid relationship definition and with an archived origin referer + * Test relationship validation with invalid relationship definition and with an archived origin referrer. */ @Test(expected = MetadataImportInvalidHeadingException.class) public void testInvalidRelationshipArchivedOrigin() throws Exception { diff --git a/dspace-api/src/test/java/org/dspace/builder/util/AbstractBuilderCleanupUtil.java b/dspace-api/src/test/java/org/dspace/builder/util/AbstractBuilderCleanupUtil.java index 973710eff0..a6d7fc1353 100644 --- a/dspace-api/src/test/java/org/dspace/builder/util/AbstractBuilderCleanupUtil.java +++ b/dspace-api/src/test/java/org/dspace/builder/util/AbstractBuilderCleanupUtil.java @@ -7,8 +7,8 @@ */ package org.dspace.builder.util; +import java.util.ArrayList; import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -51,24 +51,24 @@ public class AbstractBuilderCleanupUtil { } private void initMap() { - map.put(RelationshipBuilder.class.getName(), new LinkedList<>()); - map.put(RelationshipTypeBuilder.class.getName(), new LinkedList<>()); - map.put(EntityTypeBuilder.class.getName(), new LinkedList<>()); - map.put(PoolTaskBuilder.class.getName(), new LinkedList<>()); - map.put(WorkflowItemBuilder.class.getName(), new LinkedList<>()); - map.put(WorkspaceItemBuilder.class.getName(), new LinkedList<>()); - map.put(BitstreamBuilder.class.getName(), new LinkedList<>()); - map.put(BitstreamFormatBuilder.class.getName(), new LinkedList<>()); - map.put(ClaimedTaskBuilder.class.getName(), new LinkedList<>()); - map.put(CollectionBuilder.class.getName(), new LinkedList<>()); - map.put(CommunityBuilder.class.getName(), new LinkedList<>()); - map.put(EPersonBuilder.class.getName(), new LinkedList<>()); - map.put(GroupBuilder.class.getName(), new LinkedList<>()); - map.put(ItemBuilder.class.getName(), new LinkedList<>()); - map.put(MetadataFieldBuilder.class.getName(), new LinkedList<>()); - map.put(MetadataSchemaBuilder.class.getName(), new LinkedList<>()); - map.put(SiteBuilder.class.getName(), new LinkedList<>()); - map.put(ProcessBuilder.class.getName(), new LinkedList<>()); + map.put(RelationshipBuilder.class.getName(), new ArrayList<>()); + map.put(RelationshipTypeBuilder.class.getName(), new ArrayList<>()); + map.put(EntityTypeBuilder.class.getName(), new ArrayList<>()); + map.put(PoolTaskBuilder.class.getName(), new ArrayList<>()); + map.put(WorkflowItemBuilder.class.getName(), new ArrayList<>()); + map.put(WorkspaceItemBuilder.class.getName(), new ArrayList<>()); + map.put(BitstreamBuilder.class.getName(), new ArrayList<>()); + map.put(BitstreamFormatBuilder.class.getName(), new ArrayList<>()); + map.put(ClaimedTaskBuilder.class.getName(), new ArrayList<>()); + map.put(CollectionBuilder.class.getName(), new ArrayList<>()); + map.put(CommunityBuilder.class.getName(), new ArrayList<>()); + map.put(EPersonBuilder.class.getName(), new ArrayList<>()); + map.put(GroupBuilder.class.getName(), new ArrayList<>()); + map.put(ItemBuilder.class.getName(), new ArrayList<>()); + map.put(MetadataFieldBuilder.class.getName(), new ArrayList<>()); + map.put(MetadataSchemaBuilder.class.getName(), new ArrayList<>()); + map.put(SiteBuilder.class.getName(), new ArrayList<>()); + map.put(ProcessBuilder.class.getName(), new ArrayList<>()); } /** @@ -78,7 +78,7 @@ public class AbstractBuilderCleanupUtil { * @param abstractBuilder The AbstractBuilder to be added */ public void addToMap(AbstractBuilder abstractBuilder) { - map.computeIfAbsent(abstractBuilder.getClass().getName(), k -> new LinkedList<>()).add(abstractBuilder); + map.computeIfAbsent(abstractBuilder.getClass().getName(), k -> new ArrayList<>()).add(abstractBuilder); } /** diff --git a/dspace-api/src/test/java/org/dspace/content/MetadataFieldNameTest.java b/dspace-api/src/test/java/org/dspace/content/MetadataFieldNameTest.java index a3a069b35e..60b43479c7 100644 --- a/dspace-api/src/test/java/org/dspace/content/MetadataFieldNameTest.java +++ b/dspace-api/src/test/java/org/dspace/content/MetadataFieldNameTest.java @@ -40,8 +40,9 @@ public class MetadataFieldNameTest { } @Test(expected = NullPointerException.class) + @SuppressWarnings("ResultOfObjectAllocationIgnored") public void testConstructNull() { - MetadataFieldName instance = new MetadataFieldName("one", null); + new MetadataFieldName("one", null); } /** @@ -71,7 +72,7 @@ public class MetadataFieldNameTest { */ @Test(expected = IllegalArgumentException.class) public void TestParse1() { - String[] results = MetadataFieldName.parse("one"); + MetadataFieldName.parse("one"); } /** @@ -79,15 +80,16 @@ public class MetadataFieldNameTest { */ @Test(expected = IllegalArgumentException.class) public void TestParse0() { - String[] results = MetadataFieldName.parse(""); + MetadataFieldName.parse(""); } /** * Test of parse method using an illegal null name. */ @Test(expected = NullPointerException.class) + @SuppressWarnings("null") public void TestParseNull() { - String[] results = MetadataFieldName.parse(null); + MetadataFieldName.parse(null); } /** diff --git a/dspace-api/src/test/java/org/dspace/content/authority/DSpaceControlledVocabularyTest.java b/dspace-api/src/test/java/org/dspace/content/authority/DSpaceControlledVocabularyTest.java index 77cf105dd4..7ade9c582d 100644 --- a/dspace-api/src/test/java/org/dspace/content/authority/DSpaceControlledVocabularyTest.java +++ b/dspace-api/src/test/java/org/dspace/content/authority/DSpaceControlledVocabularyTest.java @@ -13,7 +13,6 @@ import static org.junit.Assert.assertNotNull; import java.io.IOException; import org.dspace.AbstractDSpaceTest; -import org.dspace.content.Collection; import org.dspace.core.factory.CoreServiceFactory; import org.junit.After; import org.junit.AfterClass; @@ -66,6 +65,8 @@ public class DSpaceControlledVocabularyTest extends AbstractDSpaceTest { /** * Test of getMatches method, of class DSpaceControlledVocabulary. + * @throws java.io.IOException passed through. + * @throws java.lang.ClassNotFoundException passed through. */ @Test public void testGetMatches() throws IOException, ClassNotFoundException { @@ -74,9 +75,7 @@ public class DSpaceControlledVocabularyTest extends AbstractDSpaceTest { final String PLUGIN_INTERFACE = "org.dspace.content.authority.ChoiceAuthority"; // Ensure that 'id' attribute is optional - String field = null; // not used String text = "north 40"; - Collection collection = null; int start = 0; int limit = 10; String locale = null; diff --git a/dspace-api/src/test/java/org/dspace/license/MockCCLicenseConnectorServiceImpl.java b/dspace-api/src/test/java/org/dspace/license/MockCCLicenseConnectorServiceImpl.java index bc687a43f5..8545c4187d 100644 --- a/dspace-api/src/test/java/org/dspace/license/MockCCLicenseConnectorServiceImpl.java +++ b/dspace-api/src/test/java/org/dspace/license/MockCCLicenseConnectorServiceImpl.java @@ -9,8 +9,8 @@ package org.dspace.license; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -51,7 +51,7 @@ public class MockCCLicenseConnectorServiceImpl extends CCLicenseConnectorService } private List createMockLicenseFields(int count, int[] amountOfFieldsAndEnums) { - List ccLicenseFields = new LinkedList<>(); + List ccLicenseFields = new ArrayList<>(amountOfFieldsAndEnums.length); for (int index = 0; index < amountOfFieldsAndEnums.length; index++) { String licenseFieldId = "license" + count + "-field" + index; String licenseFieldLabel = "License " + count + " - Field " + index + " - Label"; @@ -70,7 +70,7 @@ public class MockCCLicenseConnectorServiceImpl extends CCLicenseConnectorService } private List createMockLicenseFields(int count, int index, int amountOfEnums) { - List ccLicenseFieldEnumList = new LinkedList<>(); + List ccLicenseFieldEnumList = new ArrayList<>(amountOfEnums); for (int i = 0; i < amountOfEnums; i++) { String enumId = "license" + count + "-field" + index + "-enum" + i; String enumLabel = "License " + count + " - Field " + index + " - Enum " + i + " - Label"; diff --git a/dspace-api/src/test/java/org/dspace/statistics/export/ITIrusExportUsageEventListener.java b/dspace-api/src/test/java/org/dspace/statistics/export/ITIrusExportUsageEventListener.java index 0b8c28a7b0..901780f821 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/export/ITIrusExportUsageEventListener.java +++ b/dspace-api/src/test/java/org/dspace/statistics/export/ITIrusExportUsageEventListener.java @@ -65,7 +65,7 @@ import org.junit.Test; //@RunWith(MockitoJUnitRunner.class) public class ITIrusExportUsageEventListener extends AbstractIntegrationTestWithDatabase { - private static Logger log = Logger.getLogger(ITIrusExportUsageEventListener.class); + private static final Logger log = Logger.getLogger(ITIrusExportUsageEventListener.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); @@ -86,7 +86,7 @@ public class ITIrusExportUsageEventListener extends AbstractIntegrationTestWithD .getServiceByName("testProcessedUrls", ArrayList.class); - private IrusExportUsageEventListener exportUsageEventListener = + private final IrusExportUsageEventListener exportUsageEventListener = DSpaceServicesFactory.getInstance() .getServiceManager() .getServicesByType(IrusExportUsageEventListener.class) @@ -105,9 +105,11 @@ public class ITIrusExportUsageEventListener extends AbstractIntegrationTestWithD /** - * Initializes the test by setting up all objects needed to create a test item + * Initializes the test by setting up all objects needed to create a test item. + * @throws java.lang.Exception passed through. */ @Before() + @Override public void setUp() throws Exception { super.setUp(); @@ -152,11 +154,12 @@ public class ITIrusExportUsageEventListener extends AbstractIntegrationTestWithD } /** - * Clean up the created objects - * Empty the testProcessedUrls used to store succeeded urls - * Empty the database table where the failed urls are logged + * Clean up the created objects. + * Empty the testProcessedUrls used to store succeeded URLs. + * Empty the database table where the failed URLs are logged. */ @After + @Override public void destroy() throws Exception { try { context.turnOffAuthorisationSystem(); @@ -377,11 +380,13 @@ public class ITIrusExportUsageEventListener extends AbstractIntegrationTestWithD /** * Test that an object that is not an Item or Bitstream is not processed + * @throws java.sql.SQLException passed through. */ @Test + @SuppressWarnings("ResultOfMethodCallIgnored") public void testReceiveEventOnNonRelevantObject() throws SQLException { - HttpServletRequest request = mock(HttpServletRequest.class); + mock(HttpServletRequest.class); UsageEvent usageEvent = mock(UsageEvent.class); when(usageEvent.getObject()).thenReturn(community); @@ -394,7 +399,6 @@ public class ITIrusExportUsageEventListener extends AbstractIntegrationTestWithD assertEquals(0, all.size()); assertEquals(0, testProcessedUrls.size()); - } /** @@ -408,11 +412,6 @@ public class ITIrusExportUsageEventListener extends AbstractIntegrationTestWithD Pattern p = Pattern.compile(regex); - if (p.matcher(string).matches()) { - return true; - } - return false; + return p.matcher(string).matches(); } - - } diff --git a/dspace-api/src/test/java/org/dspace/statistics/export/processor/BitstreamEventProcessorTest.java b/dspace-api/src/test/java/org/dspace/statistics/export/processor/BitstreamEventProcessorTest.java index 3b197b4955..6a4bf895b3 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/export/processor/BitstreamEventProcessorTest.java +++ b/dspace-api/src/test/java/org/dspace/statistics/export/processor/BitstreamEventProcessorTest.java @@ -37,13 +37,13 @@ import org.junit.Test; */ public class BitstreamEventProcessorTest extends AbstractIntegrationTestWithDatabase { - private ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); - + private final ConfigurationService configurationService + = DSpaceServicesFactory.getInstance().getConfigurationService(); private String encodedUrl; - @Before + @Override public void setUp() throws Exception { super.setUp(); configurationService.setProperty("irus.statistics.tracker.enabled", true); diff --git a/dspace-api/src/test/java/org/dspace/statistics/export/service/MockOpenUrlServiceImpl.java b/dspace-api/src/test/java/org/dspace/statistics/export/service/MockOpenUrlServiceImpl.java index 14ac9d36d5..a5fbfd029b 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/export/service/MockOpenUrlServiceImpl.java +++ b/dspace-api/src/test/java/org/dspace/statistics/export/service/MockOpenUrlServiceImpl.java @@ -15,7 +15,8 @@ import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; /** - * Mock OpenUrlService that will ensure that IRUS tracker does need to be contacted in order to test the functionality + * Mock OpenUrlService that will ensure that IRUS tracker does need to be + * contacted in order to test the functionality. */ public class MockOpenUrlServiceImpl extends OpenUrlServiceImpl { @@ -23,13 +24,14 @@ public class MockOpenUrlServiceImpl extends OpenUrlServiceImpl { ArrayList testProcessedUrls; /** - * Returns a response code to simulate contact to the external url - * When the url contains "fail", a fail code 500 will be returned - * Otherwise the success code 200 will be returned + * Returns a response code to simulate contact to the external URL. + * When the URL contains "fail", a fail code 500 will be returned. + * Otherwise the success code 200 will be returned. * @param urlStr - * @return 200 or 500 depending on whether the "fail" keyword is present in the url + * @return 200 or 500 depending on whether the "fail" keyword is present in the URL. * @throws IOException */ + @Override protected int getResponseCodeFromUrl(final String urlStr) throws IOException { if (StringUtils.contains(urlStr, "fail")) { return HttpURLConnection.HTTP_INTERNAL_ERROR; From a036b99f1c3483bc26d6c7660925f537d5f41f7e Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 30 Nov 2020 16:21:01 -0500 Subject: [PATCH 03/16] Catch correct error for replaced class, to fix test errors. Satisfy checkstyle. #3061 --- .../src/main/java/org/dspace/core/Context.java | 15 ++++++--------- .../src/main/java/org/dspace/core/Utils.java | 2 +- .../java/org/dspace/discovery/DiscoverQuery.java | 5 ++--- .../eperson/dao/impl/SubscriptionDAOImpl.java | 1 - .../main/java/org/dspace/statistics/Dataset.java | 4 ++-- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/core/Context.java b/dspace-api/src/main/java/org/dspace/core/Context.java index be52595c09..7bbea212c3 100644 --- a/dspace-api/src/main/java/org/dspace/core/Context.java +++ b/dspace-api/src/main/java/org/dspace/core/Context.java @@ -10,10 +10,10 @@ package org.dspace.core; import java.sql.SQLException; import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.EmptyStackException; import java.util.LinkedList; import java.util.List; import java.util.Locale; +import java.util.NoSuchElementException; import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @@ -157,8 +157,6 @@ public class Context implements AutoCloseable { /** * Initializes a new context object. - * - * @throws SQLException if there was an error obtaining a database connection */ protected void init() { updateDatabase(); @@ -310,7 +308,7 @@ public class Context implements AutoCloseable { Boolean previousState; try { previousState = authStateChangeHistory.pop(); - } catch (EmptyStackException ex) { + } catch (NoSuchElementException ex) { log.warn(LogManager.getHeader(this, "restore_auth_sys_state", "not previous state info available " + ex.getLocalizedMessage())); @@ -325,8 +323,7 @@ public class Context implements AutoCloseable { // if previousCaller is not the current caller *only* log a warning if (!previousCaller.equals(caller)) { - log - .warn(LogManager + log.warn(LogManager .getHeader( this, "restore_auth_sys_state", @@ -741,7 +738,7 @@ public class Context implements AutoCloseable { dbConnection.setConnectionMode(false, false); break; default: - log.warn("New context mode detected that has nog been configured."); + log.warn("New context mode detected that has not been configured."); break; } } catch (SQLException ex) { @@ -803,7 +800,7 @@ public class Context implements AutoCloseable { * entity. This means changes to the entity will be tracked and persisted to the database. * * @param entity The entity to reload - * @param The class of the enity. The entity must implement the {@link ReloadableEntity} interface. + * @param The class of the entity. The entity must implement the {@link ReloadableEntity} interface. * @return A (possibly) NEW reference to the entity that should be used for further processing. * @throws SQLException When reloading the entity from the database fails. */ @@ -816,7 +813,7 @@ public class Context implements AutoCloseable { * Remove an entity from the cache. This is necessary when batch processing a large number of items. * * @param entity The entity to reload - * @param The class of the enity. The entity must implement the {@link ReloadableEntity} interface. + * @param The class of the entity. The entity must implement the {@link ReloadableEntity} interface. * @throws SQLException When reloading the entity from the database fails. */ @SuppressWarnings("unchecked") diff --git a/dspace-api/src/main/java/org/dspace/core/Utils.java b/dspace-api/src/main/java/org/dspace/core/Utils.java index 8968c8950f..17fe7c4d03 100644 --- a/dspace-api/src/main/java/org/dspace/core/Utils.java +++ b/dspace-api/src/main/java/org/dspace/core/Utils.java @@ -17,6 +17,7 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.rmi.dgc.VMID; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -33,7 +34,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import com.coverity.security.Escape; -import java.nio.charset.StandardCharsets; import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringSubstitutor; import org.apache.logging.log4j.LogManager; diff --git a/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java b/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java index f9ca9c2e9c..e133ad0ed1 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java +++ b/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java @@ -15,7 +15,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -23,7 +22,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.dspace.discovery.configuration.DiscoverySearchFilterFacet; /** - * This class represents a query which the discovery backend can use + * This class represents a query which the discovery back-end can use. * * @author Kevin Van de Velde (kevin at atmire dot com) */ @@ -273,7 +272,7 @@ public class DiscoverQuery { /** * Sets the fields which you want Discovery to return in the search results. * It is HIGHLY recommended to limit the fields returned, as by default - * some backends (like Solr) will return everything. + * some back-ends (like Solr) will return everything. * * @param field field to add to the list of fields returned */ diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java index 40d031ac29..6f2cb4b4fb 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java @@ -9,7 +9,6 @@ package org.dspace.eperson.dao.impl; import java.sql.SQLException; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; diff --git a/dspace-api/src/main/java/org/dspace/statistics/Dataset.java b/dspace-api/src/main/java/org/dspace/statistics/Dataset.java index f5a5e05e04..c1d6bc0dd6 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/Dataset.java +++ b/dspace-api/src/main/java/org/dspace/statistics/Dataset.java @@ -10,6 +10,7 @@ package org.dspace.statistics; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.text.ParseException; import java.util.ArrayList; @@ -18,13 +19,12 @@ import java.util.List; import java.util.Map; import au.com.bytecode.opencsv.CSVWriter; -import java.nio.charset.StandardCharsets; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; /** * @author kevinvandevelde at atmire.com - * Date: 21-jan-2009 + * Date: 21-Jan-2009 * Time: 13:44:48 */ public class Dataset { From c2c08b31094c9fdfc80a86c37eace5e782d4d48b Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 8 Dec 2020 08:07:54 -0500 Subject: [PATCH 04/16] Restore thread-safety to see if it is needed. #3061 --- dspace-api/src/main/java/org/dspace/core/Context.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/core/Context.java b/dspace-api/src/main/java/org/dspace/core/Context.java index 7bbea212c3..b45da5e633 100644 --- a/dspace-api/src/main/java/org/dspace/core/Context.java +++ b/dspace-api/src/main/java/org/dspace/core/Context.java @@ -8,14 +8,15 @@ package org.dspace.core; import java.sql.SQLException; -import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.NoSuchElementException; import java.util.Set; import java.util.UUID; +import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.logging.log4j.Logger; @@ -79,13 +80,13 @@ public class Context implements AutoCloseable { /** * A stack with the history of authorisation system check modify */ - private ArrayDeque authStateChangeHistory; + private Deque authStateChangeHistory; /** * A stack with the name of the caller class that modify authorisation * system check */ - private ArrayDeque authStateClassCallHistory; + private Deque authStateClassCallHistory; /** * Group IDs of special groups user is a member of @@ -181,8 +182,8 @@ public class Context implements AutoCloseable { specialGroups = new ArrayList<>(); - authStateChangeHistory = new ArrayDeque<>(); - authStateClassCallHistory = new ArrayDeque<>(); + authStateChangeHistory = new ConcurrentLinkedDeque<>(); + authStateClassCallHistory = new ConcurrentLinkedDeque<>(); setMode(this.mode); } From 8e955a75a6319f9d008e74f775339b72e5cd498c Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Fri, 3 Sep 2021 15:40:06 +0200 Subject: [PATCH 05/16] 83338: Fix from/to indices --- .../patch/operation/DSpaceObjectMetadataMoveOperation.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/patch/operation/DSpaceObjectMetadataMoveOperation.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/patch/operation/DSpaceObjectMetadataMoveOperation.java index 1cda63d632..6684bd5f9d 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/patch/operation/DSpaceObjectMetadataMoveOperation.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/patch/operation/DSpaceObjectMetadataMoveOperation.java @@ -44,10 +44,10 @@ public class DSpaceObjectMetadataMoveOperation extends P public R perform(Context context, R resource, Operation operation) throws SQLException { DSpaceObjectService dsoService = ContentServiceFactory.getInstance().getDSpaceObjectService(resource); MetadataField metadataField = metadataPatchUtils.getMetadataField(context, operation); - String indexInPath = metadataPatchUtils.getIndexFromPath(operation.getPath()); - String indexToMoveFrom = metadataPatchUtils.getIndexFromPath(((MoveOperation) operation).getFrom()); + String indexTo = metadataPatchUtils.getIndexFromPath(operation.getPath()); + String indexFrom = metadataPatchUtils.getIndexFromPath(((MoveOperation) operation).getFrom()); - move(context, resource, dsoService, metadataField, indexInPath, indexToMoveFrom); + move(context, resource, dsoService, metadataField, indexFrom, indexTo); return resource; } From 4b23d89727c9d1ffaa03bea4579d49918f956bea Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Tue, 7 Sep 2021 13:25:45 +0200 Subject: [PATCH 06/16] 83338: Add ITs for DSO metadata move operations This commit should confirm that there's an issue with multi-op metadata move PATCH requests: DSpaceObjectServiceImpl.moveMetadata doesn't keep track of the changed order & messes up subsequent moves --- .../org/dspace/app/rest/PatchMetadataIT.java | 254 +++++++++++++++--- 1 file changed, 224 insertions(+), 30 deletions(-) diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/PatchMetadataIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/PatchMetadataIT.java index 7c57e98f1c..e35eb07fa3 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/PatchMetadataIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/PatchMetadataIT.java @@ -76,7 +76,8 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { private WorkspaceItemService workspaceItemService; private Collection collection; - private WorkspaceItem publicationItem; + private WorkspaceItem publicationWorkspaceItem; + private Item publicationItem; private Item personItem1; private Item personItem2; private RelationshipType publicationPersonRelationshipType; @@ -151,10 +152,10 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { .withPersonIdentifierLastName("Linton") .withEntityType("Person") .build(); - publicationItem = WorkspaceItemBuilder.createWorkspaceItem(context, collection) - .withTitle("Publication 1") - .withEntityType("Publication") - .build(); + publicationWorkspaceItem = WorkspaceItemBuilder.createWorkspaceItem(context, collection) + .withTitle("Publication 1") + .withEntityType("Publication") + .build(); publicationPersonRelationshipType = relationshipTypeService.findbyTypesAndTypeName(context, entityTypeService.findByEntityType(context, "Publication"), entityTypeService.findByEntityType(context, "Person"), @@ -164,7 +165,7 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { String adminToken = getAuthToken(admin.getEmail(), password); // Make sure we grab the latest instance of the Item from the database before adding a regular author - WorkspaceItem publication = workspaceItemService.find(context, publicationItem.getID()); + WorkspaceItem publication = workspaceItemService.find(context, publicationWorkspaceItem.getID()); itemService.addMetadata(context, publication.getItem(), "dc", "contributor", "author", Item.ANY, authorsOriginalOrder.get(0)); workspaceItemService.update(context, publication); @@ -177,7 +178,7 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { .param("relationshipType", publicationPersonRelationshipType.getID().toString()) .contentType(MediaType.parseMediaType (org.springframework.data.rest.webmvc.RestMediaTypes.TEXT_URI_LIST_VALUE)) - .content("https://localhost:8080/server/api/core/items/" + publicationItem.getItem().getID() + "\n" + + .content("https://localhost:8080/server/api/core/items/" + publicationWorkspaceItem.getItem().getID() + "\n" + "https://localhost:8080/server/api/core/items/" + personItem1.getID())) .andExpect(status().isCreated()) .andDo(result -> idRef1.set(read(result.getResponse().getContentAsString(), "$.id"))); @@ -185,7 +186,7 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { // Add two more regular authors List regularMetadata = new ArrayList<>(); - publication = workspaceItemService.find(context, publicationItem.getID()); + publication = workspaceItemService.find(context, publicationWorkspaceItem.getID()); regularMetadata.add(authorsOriginalOrder.get(2)); regularMetadata.add(authorsOriginalOrder.get(3)); itemService.addMetadata(context, publication.getItem(), @@ -200,12 +201,12 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { .param("relationshipType", publicationPersonRelationshipType.getID().toString()) .contentType(MediaType.parseMediaType (org.springframework.data.rest.webmvc.RestMediaTypes.TEXT_URI_LIST_VALUE)) - .content("https://localhost:8080/server/api/core/items/" + publicationItem.getItem().getID() + "\n" + + .content("https://localhost:8080/server/api/core/items/" + publicationWorkspaceItem.getItem().getID() + "\n" + "https://localhost:8080/server/api/core/items/" + personItem2.getID())) .andExpect(status().isCreated()) .andDo(result -> idRef2.set(read(result.getResponse().getContentAsString(), "$.id"))); - publication = workspaceItemService.find(context, publicationItem.getID()); + publication = workspaceItemService.find(context, publicationWorkspaceItem.getID()); authorsMetadataOriginalOrder = itemService.getMetadata(publication.getItem(), "dc", "contributor", "author", Item.ANY); assertEquals(authorsMetadataOriginalOrder.size(), 5); @@ -221,6 +222,35 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { assertThat(authorsMetadataOriginalOrder.get(4).getAuthority(), startsWith("virtual::")); } + /** + * A method to create a simple Item with 5 authors + */ + private void initSimplePublicationItem() throws Exception { + // Setup the original order of authors + authorsOriginalOrder = new ArrayList<>(); + authorsOriginalOrder.add("Whyte, William"); + authorsOriginalOrder.add("Dahlen, Sarah"); + authorsOriginalOrder.add("Peterson, Karrie"); + authorsOriginalOrder.add("Perotti, Enrico"); + authorsOriginalOrder.add("Linton, Oliver"); + authorsOriginalOrder.add("bla, Oliver"); + + context.turnOffAuthorisationSystem(); + + publicationItem = ItemBuilder.createItem(context, collection) + .withTitle("Publication 1") + .withEntityType("Publication") + .build(); + + for (String author : authorsOriginalOrder) { + itemService.addMetadata( + context, publicationItem, "dc", "contributor", "author", Item.ANY, author + ); + } + + context.restoreAuthSystemState(); + } + /** * Clean up created Person Relationshipts * @throws IOException @@ -238,7 +268,7 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { } /** - * A method to create a workspace publication containing 5 authors: 3 regular authors and 2 related Person items. + * A method to create a publication Item containing 5 authors: 3 regular authors and 2 related Person items. * The authors are added in a specific order: * - "Whyte, William": Regular author * - "Dahlen, Sarah": Regular Person @@ -259,22 +289,22 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { context.turnOffAuthorisationSystem(); - publicationItem = WorkspaceItemBuilder.createWorkspaceItem(context, collection) - .withTitle("Publication 1") - .withEntityType("Publication") - .build(); + publicationWorkspaceItem = WorkspaceItemBuilder.createWorkspaceItem(context, collection) + .withTitle("Publication 1") + .withEntityType("Publication") + .build(); String adminToken = getAuthToken(admin.getEmail(), password); // Make sure we grab the latest instance of the Item from the database before adding a regular author - WorkspaceItem publication = workspaceItemService.find(context, publicationItem.getID()); + WorkspaceItem publication = workspaceItemService.find(context, publicationWorkspaceItem.getID()); itemService.addMetadata(context, publication.getItem(), "dc", "contributor", "author", Item.ANY, authorsOriginalOrder); workspaceItemService.update(context, publication); context.restoreAuthSystemState(); - publication = workspaceItemService.find(context, publicationItem.getID()); + publication = workspaceItemService.find(context, publicationWorkspaceItem.getID()); List publicationAuthorList = itemService.getMetadata(publication.getItem(), "dc", "contributor", "author", Item.ANY); assertEquals(publicationAuthorList.size(), 5); @@ -1147,13 +1177,13 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { String token = getAuthToken(admin.getEmail(), password); - getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationItem.getID()) + getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID()) .content(patchBody) .contentType(javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()); String authorField = "dc.contributor.author"; - getClient(token).perform(get("/api/submission/workspaceitems/" + publicationItem.getID())) + getClient(token).perform(get("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID())) .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) .andExpect(jsonPath("$.sections.traditionalpageone", @@ -1214,13 +1244,138 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { String token = getAuthToken(admin.getEmail(), password); - getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationItem.getID()) + getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID()) .content(patchBody) .contentType(javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isUnprocessableEntity()); } + /** + * This test will move an Item's dc.contributor.author value from position 1 to 2 using a PATCH request with + * a single move operation. + * Original Order: 0,1,2,3,4 + * Expected Order: 0,2,1,3,4 + */ + @Test + public void moveMetadataAuthorOneToTwoTest() throws Exception { + initSimplePublicationItem(); + + List expectedOrder = List.of( + authorsOriginalOrder.get(0), + authorsOriginalOrder.get(2), + authorsOriginalOrder.get(1), + authorsOriginalOrder.get(3), + authorsOriginalOrder.get(4) + ); + List moves = List.of( + getMetadataMoveAuthorOperation(1, 2) + ); + + moveMetadataAuthorTest(moves, expectedOrder); + } + + /** + * This test will move an Item's dc.contributor.author value from position 2 to 1 using a PATCH request with + * a single move operation. + * Original Order: 0,1,2,3,4 + * Expected Order: 0,2,1,3,4 + */ + @Test + public void moveMetadataAuthorTwoToOneTest() throws Exception { + initSimplePublicationItem(); + + List expectedOrder = List.of( + authorsOriginalOrder.get(0), + authorsOriginalOrder.get(2), + authorsOriginalOrder.get(1), + authorsOriginalOrder.get(3), + authorsOriginalOrder.get(4) + ); + List moves = List.of( + getMetadataMoveAuthorOperation(2, 1) + ); + + moveMetadataAuthorTest(moves, expectedOrder); + } + + /** + * This test will move an Item's dc.contributor.author value from position 1 to 4 using a PATCH request with + * a single move operation. + * Original Order: 0,1,2,3,4 + * Expected Order: 0,2,3,4,1 + */ + @Test + public void moveMetadataAuthorOneToFourTest() throws Exception { + initSimplePublicationItem(); + + List expectedOrder = List.of( + authorsOriginalOrder.get(0), + authorsOriginalOrder.get(2), + authorsOriginalOrder.get(3), + authorsOriginalOrder.get(4), + authorsOriginalOrder.get(1) + ); + List moves = List.of( + getMetadataMoveAuthorOperation(1, 4) + ); + + moveMetadataAuthorTest(moves, expectedOrder); + } + + /** + * This test will move an Item's dc.contributor.author value from position 4 to 1 using a PATCH request with + * a single move operation. + * Original Order: 0,1,2,3,4 + * Expected Order: 0,4,1,2,3 + */ + @Test + public void moveMetadataAuthorFourToOneTest() throws Exception { + initSimplePublicationItem(); + + List expectedOrder = List.of( + authorsOriginalOrder.get(0), + authorsOriginalOrder.get(4), + authorsOriginalOrder.get(1), + authorsOriginalOrder.get(2), + authorsOriginalOrder.get(3) + ); + List moves = List.of( + getMetadataMoveAuthorOperation(4, 1) + ); + + moveMetadataAuthorTest(moves, expectedOrder); + } + + /** + * This test will move an Item's dc.contributor.author value from position 4 to 1 using a PATCH request with + * multiple move operations and verify the order of the authors within the section. + * The move operations are equivalent to a regular 4 to 1 move and representative of the kind of PATCH request the + * frontend actually sends in this kind of scenario. + * Original Order: 0,1,2,3,4 + * Expected Order: 0,4,1,2,3 + */ + @Test + public void moveMetadataAuthorFourToOneMultiOpTest() throws Exception { + initSimplePublicationItem(); + + List expectedOrder = List.of( + authorsOriginalOrder.get(0), + authorsOriginalOrder.get(4), + authorsOriginalOrder.get(1), + authorsOriginalOrder.get(2), + authorsOriginalOrder.get(3) + ); + List moves = List.of( + getMetadataMoveAuthorOperation(1, 2), + getMetadataMoveAuthorOperation(1, 3), + getMetadataMoveAuthorOperation(2, 4), + getMetadataMoveAuthorOperation(3, 1) + ); + + moveMetadataAuthorTest(moves, expectedOrder); + } + /** * This method moves an author (dc.contributor.author) within a workspace publication's "traditionalpageone" * section from position "from" to "path" using a PATCH request and verifies the order of the authors within the @@ -1237,13 +1392,13 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { String token = getAuthToken(admin.getEmail(), password); - getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationItem.getID()) + getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID()) .content(patchBody) .contentType(javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()); String authorField = "dc.contributor.author"; - getClient(token).perform(get("/api/submission/workspaceitems/" + publicationItem.getID())) + getClient(token).perform(get("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID())) .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) .andExpect(jsonPath("$.sections.traditionalpageone", Matchers.allOf( @@ -1255,6 +1410,35 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { ))); } + /** + * This method rearranges an Item's dc.contributor.author values using multiple PATCH request and verifies the order + * of the authors within the section using an ordered list of expected author names. + * @param moves A list of move operations + * @param expectedOrder A list of author names sorted in the expected order + */ + private void moveMetadataAuthorTest(List moves, List expectedOrder) throws Exception { + String patchBody = getPatchContent(moves); + + String token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(patch("/api/core/items/" + publicationItem.getID()) + .content(patchBody) + .contentType(javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()); + + String authorField = "dc.contributor.author"; + getClient(token).perform(get("/api/core/items/" + publicationItem.getID())) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$.metadata", Matchers.allOf( + Matchers.is(MetadataMatcher.matchMetadata(authorField, expectedOrder.get(0), 0)), + Matchers.is(MetadataMatcher.matchMetadata(authorField, expectedOrder.get(1), 1)), + Matchers.is(MetadataMatcher.matchMetadata(authorField, expectedOrder.get(2), 2)), + Matchers.is(MetadataMatcher.matchMetadata(authorField, expectedOrder.get(3), 3)), + Matchers.is(MetadataMatcher.matchMetadata(authorField, expectedOrder.get(4), 4)) + ))); + } + /** * This method replaces an author (dc.contributor.author) within a workspace publication's "traditionalpageone" * section at position "path" using a PATCH request and verifies the order of the authors within the @@ -1274,13 +1458,13 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { String token = getAuthToken(admin.getEmail(), password); - getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationItem.getID()) + getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID()) .content(patchBody) .contentType(javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()); String authorField = "dc.contributor.author"; - getClient(token).perform(get("/api/submission/workspaceitems/" + publicationItem.getID())) + getClient(token).perform(get("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID())) .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) .andExpect(jsonPath("$.sections.traditionalpageone", Matchers.allOf( @@ -1310,13 +1494,13 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { String token = getAuthToken(admin.getEmail(), password); - getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationItem.getID()) + getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID()) .content(patchBody) .contentType(javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()); String authorField = "dc.contributor.author"; - getClient(token).perform(get("/api/submission/workspaceitems/" + publicationItem.getID())) + getClient(token).perform(get("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID())) .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) .andExpect(jsonPath("$.sections.traditionalpageone", Matchers.allOf( @@ -1345,13 +1529,13 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { String token = getAuthToken(admin.getEmail(), password); - getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationItem.getID()) + getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID()) .content(patchBody) .contentType(javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()); String authorField = "dc.contributor.author"; - getClient(token).perform(get("/api/submission/workspaceitems/" + publicationItem.getID())) + getClient(token).perform(get("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID())) .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) .andExpect(jsonPath("$.sections.traditionalpageone", Matchers.allOf( @@ -1388,7 +1572,7 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { String token = getAuthToken(admin.getEmail(), password); - getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationItem.getID()) + getClient(token).perform(patch("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID()) .content(patchBody) .contentType(javax.ws.rs.core.MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()); @@ -1400,7 +1584,7 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { }); - getClient(token).perform(get("/api/submission/workspaceitems/" + publicationItem.getID())) + getClient(token).perform(get("/api/submission/workspaceitems/" + publicationWorkspaceItem.getID())) .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) .andExpect(jsonPath("$.sections.traditionalpageone", Matchers.allOf(matchers))); @@ -1417,4 +1601,14 @@ public class PatchMetadataIT extends AbstractEntityIntegrationTest { "/sections/traditionalpageone/dc.contributor.author/" + from); } + /** + * Create a move operation on an Item's metadata field "dc.contributor.author". + * @param from The "from" index to use for the Move operation + * @param path The "path" index to use for the Move operation + */ + private MoveOperation getMetadataMoveAuthorOperation(int from, int path) { + return new MoveOperation("/metadata/dc.contributor.author/" + path, + "/metadata/dc.contributor.author/" + from); + } + } From f0079d755522d3ec4ed1ad5167e9b306e86f4594 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Tue, 7 Sep 2021 13:51:32 +0200 Subject: [PATCH 07/16] 83338: Fix moveMetadata index caching issue --- .../java/org/dspace/content/DSpaceObjectServiceImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java index c34291c3dd..afb2deb332 100644 --- a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.function.Supplier; +import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.NotImplementedException; @@ -742,12 +743,15 @@ public abstract class DSpaceObjectServiceImpl implements @Override public void moveMetadata(Context context, T dso, String schema, String element, String qualifier, int from, int to) throws SQLException, IllegalArgumentException { - if (from == to) { throw new IllegalArgumentException("The \"from\" location MUST be different from \"to\" location"); } - List list = getMetadata(dso, schema, element, qualifier); + List list = + getMetadata(dso, schema, element, qualifier).stream() + .sorted(Comparator.comparing(MetadataValue::getPlace)) + .collect(Collectors.toList()); + if (from >= list.size() || to >= list.size() || to < 0 || from < 0) { throw new IllegalArgumentException( From 35e280019fbb91be697287d757b5b321d11f0485 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Wed, 8 Sep 2021 13:35:46 -0400 Subject: [PATCH 08/16] Collections.EMPTY_LIST is immutable, possibly causing addBitstream to throw exception. --- dspace-api/src/main/java/org/dspace/scripts/Process.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/scripts/Process.java b/dspace-api/src/main/java/org/dspace/scripts/Process.java index 2f5ab10f3e..b15fd0c84c 100644 --- a/dspace-api/src/main/java/org/dspace/scripts/Process.java +++ b/dspace-api/src/main/java/org/dspace/scripts/Process.java @@ -7,7 +7,7 @@ */ package org.dspace.scripts; -import java.util.Collections; +import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.persistence.Column; @@ -181,7 +181,7 @@ public class Process implements ReloadableEntity { */ public List getBitstreams() { if (bitstreams == null) { - bitstreams = Collections.EMPTY_LIST; + bitstreams = new ArrayList<>(); } return bitstreams; } From 20816f945e228a2f66c87a0dc90ef47afc5eaabd Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Wed, 8 Sep 2021 13:40:53 -0400 Subject: [PATCH 09/16] Log and continue instead of throwing exception when caller stack is empty. --- .../src/main/java/org/dspace/core/Context.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/core/Context.java b/dspace-api/src/main/java/org/dspace/core/Context.java index 9f123b2021..45f5a50df1 100644 --- a/dspace-api/src/main/java/org/dspace/core/Context.java +++ b/dspace-api/src/main/java/org/dspace/core/Context.java @@ -320,12 +320,19 @@ public class Context implements AutoCloseable { StackTraceElement[] stackTrace = currThread.getStackTrace(); String caller = stackTrace[stackTrace.length - 1].getClassName(); - String previousCaller = (String) authStateClassCallHistory.pop(); + String previousCaller; + try { + previousCaller = (String) authStateClassCallHistory.pop(); + } catch (NoSuchElementException ex) { + previousCaller = "none"; + log.warn(LogManager.getHeader(this, "restore_auth_sys_state", + "no previous caller info available: {}"), + ex::getLocalizedMessage); + } // if previousCaller is not the current caller *only* log a warning if (!previousCaller.equals(caller)) { - log.warn(LogManager - .getHeader( + log.warn(LogManager.getHeader( this, "restore_auth_sys_state", "Class: " From 948014646af8716a8104b0e3960f65f183e52675 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Wed, 8 Sep 2021 15:40:44 -0400 Subject: [PATCH 10/16] Mention bitstream ID in exception for better debugging. (3061) --- .../main/java/org/dspace/content/BitstreamServiceImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java index 98760a43fe..a4d404a811 100644 --- a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java @@ -45,7 +45,8 @@ public class BitstreamServiceImpl extends DSpaceObjectServiceImpl imp /** * log4j logger */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamServiceImpl.class); + private static final Logger log + = org.apache.logging.log4j.LogManager.getLogger(); @Autowired(required = true) @@ -350,7 +351,8 @@ public class BitstreamServiceImpl extends DSpaceObjectServiceImpl imp public void expunge(Context context, Bitstream bitstream) throws SQLException, AuthorizeException { authorizeService.authorizeAction(context, bitstream, Constants.DELETE); if (!bitstream.isDeleted()) { - throw new IllegalStateException("Bitstream must be deleted before it can be removed from the database"); + throw new IllegalStateException("Bitstream " + bitstream.getID().toString() + + " must be deleted before it can be removed from the database."); } bitstreamDAO.delete(context, bitstream); } From 384d46348aec6c63ac3d4e141a8a91e6944d87e5 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 10 Sep 2021 11:32:58 -0400 Subject: [PATCH 11/16] Another batch of Error Prone fixes. (#3061) --- .../app/itemexport/ItemExportServiceImpl.java | 25 +++++---- ...mMarkingAvailabilityBitstreamStrategy.java | 12 ++-- .../dspace/app/itemupdate/ContentsEntry.java | 1 + .../dspace/app/mediafilter/HTMLFilter.java | 7 ++- .../dspace/app/mediafilter/PoiWordFilter.java | 3 +- .../org/dspace/app/sherpa/SHERPAService.java | 1 + .../app/sherpa/v2/SHERPAPermittedVersion.java | 19 ++++--- .../sherpa/v2/SHERPAPublisherResponse.java | 7 ++- .../dspace/app/sherpa/v2/SHERPAResponse.java | 11 ++-- .../app/sitemap/SitemapsOrgGenerator.java | 2 +- .../dspace/app/util/InitializeEntities.java | 13 +---- .../main/java/org/dspace/app/util/Util.java | 14 ++--- .../checker/SimpleReporterServiceImpl.java | 14 ++--- .../java/org/dspace/content/DCPersonName.java | 4 +- .../content/RelationshipServiceImpl.java | 7 ++- .../crosswalk/OREIngestionCrosswalk.java | 7 +-- .../content/dao/impl/CollectionDAOImpl.java | 6 +- .../java/org/dspace/content/logic/Filter.java | 2 +- .../content/logic/condition/Condition.java | 3 +- .../dspace/content/logic/operator/Nor.java | 3 +- .../dspace/content/packager/METSManifest.java | 11 ++-- .../src/main/java/org/dspace/core/Email.java | 4 +- .../indexobject/AbstractIndexableObject.java | 2 +- .../org/dspace/eperson/LoadLastLogin.java | 3 +- .../impl/SHERPAv2JournalDataProvider.java | 3 - .../identifier/DOIIdentifierProvider.java | 40 +++++++------ .../org/dspace/license/LicenseCleanup.java | 12 ++-- .../processor/ExportEventProcessor.java | 10 ++-- .../export/processor/ItemEventProcessor.java | 6 +- .../storage/bitstore/BitStoreMigrate.java | 4 -- .../dspace/storage/rdbms/DatabaseUtils.java | 22 ++++---- dspace-api/src/test/resources/log4j2-test.xml | 56 +++++++++++++++++++ 32 files changed, 199 insertions(+), 135 deletions(-) create mode 100644 dspace-api/src/test/resources/log4j2-test.xml diff --git a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java index 7d5e63c127..59ee6d8ba5 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java @@ -16,6 +16,7 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -129,7 +130,7 @@ public class ItemExportServiceImpl implements ItemExportService { while (i.hasNext()) { if (SUBDIR_LIMIT > 0 && ++counter == SUBDIR_LIMIT) { - subdir = Integer.valueOf(subDirSuffix++).toString(); + subdir = Integer.toString(subDirSuffix++); fullPath = destDirName + File.separatorChar + subdir; counter = 0; @@ -191,7 +192,7 @@ public class ItemExportServiceImpl implements ItemExportService { */ protected void writeMetadata(Context c, Item i, File destDir, boolean migrate) throws Exception { - Set schemas = new HashSet(); + Set schemas = new HashSet<>(); List dcValues = itemService.getMetadata(i, Item.ANY, Item.ANY, Item.ANY, Item.ANY); for (MetadataValue metadataValue : dcValues) { schemas.add(metadataValue.getMetadataField().getMetadataSchema().getName()); @@ -267,7 +268,7 @@ public class ItemExportServiceImpl implements ItemExportService { + Utils.addEntities(dcv.getValue()) + "\n") .getBytes("UTF-8"); - if ((!migrate) || + if (!migrate || (migrate && !( ("date".equals(metadataField.getElement()) && "issued".equals(qualifier)) || ("date".equals(metadataField.getElement()) && "accessioned".equals(qualifier)) || @@ -292,10 +293,10 @@ public class ItemExportServiceImpl implements ItemExportService { } // When migrating, only keep date.issued if it is different to date.accessioned - if ((migrate) && + if (migrate && (dateIssued != null) && (dateAccessioned != null) && - (!dateIssued.equals(dateAccessioned))) { + !dateIssued.equals(dateAccessioned)) { utf8 = (" " + Utils.addEntities(dateIssued) + "\n") @@ -330,7 +331,7 @@ public class ItemExportServiceImpl implements ItemExportService { File outFile = new File(destDir, filename); if (outFile.createNewFile()) { - PrintWriter out = new PrintWriter(new FileWriter(outFile)); + PrintWriter out = new PrintWriter(new FileWriter(outFile, StandardCharsets.UTF_8)); out.println(i.getHandle()); @@ -360,7 +361,7 @@ public class ItemExportServiceImpl implements ItemExportService { File outFile = new File(destDir, "contents"); if (outFile.createNewFile()) { - PrintWriter out = new PrintWriter(new FileWriter(outFile)); + PrintWriter out = new PrintWriter(new FileWriter(outFile, StandardCharsets.UTF_8)); List bundles = i.getBundles(); @@ -474,7 +475,7 @@ public class ItemExportServiceImpl implements ItemExportService { public void createDownloadableExport(DSpaceObject dso, Context context, boolean migrate) throws Exception { EPerson eperson = context.getCurrentUser(); - ArrayList list = new ArrayList(1); + ArrayList list = new ArrayList<>(1); list.add(dso); processDownloadableExport(list, context, eperson == null ? null : eperson.getEmail(), migrate); @@ -491,7 +492,7 @@ public class ItemExportServiceImpl implements ItemExportService { @Override public void createDownloadableExport(DSpaceObject dso, Context context, String additionalEmail, boolean migrate) throws Exception { - ArrayList list = new ArrayList(1); + ArrayList list = new ArrayList<>(1); list.add(dso); processDownloadableExport(list, context, additionalEmail, migrate); } @@ -652,7 +653,7 @@ public class ItemExportServiceImpl implements ItemExportService { while (iter.hasNext()) { String keyName = iter.next(); List uuids = itemsMap.get(keyName); - List items = new ArrayList(); + List items = new ArrayList<>(); for (UUID uuid : uuids) { items.add(itemService.find(context, uuid)); } @@ -876,7 +877,7 @@ public class ItemExportServiceImpl implements ItemExportService { .getIntProperty("org.dspace.app.itemexport.life.span.hours"); Calendar now = Calendar.getInstance(); now.setTime(new Date()); - now.add(Calendar.HOUR, (-hours)); + now.add(Calendar.HOUR, -hours); File downloadDir = new File(getExportDownloadDirectory(eperson)); if (downloadDir.exists()) { File[] files = downloadDir.listFiles(); @@ -896,7 +897,7 @@ public class ItemExportServiceImpl implements ItemExportService { int hours = configurationService.getIntProperty("org.dspace.app.itemexport.life.span.hours"); Calendar now = Calendar.getInstance(); now.setTime(new Date()); - now.add(Calendar.HOUR, (-hours)); + now.add(Calendar.HOUR, -hours); File downloadDir = new File(configurationService.getProperty("org.dspace.app.itemexport.download.dir")); if (downloadDir.exists()) { // Get a list of all the sub-directories, potentially one for each ePerson. diff --git a/dspace-api/src/main/java/org/dspace/app/itemmarking/ItemMarkingAvailabilityBitstreamStrategy.java b/dspace-api/src/main/java/org/dspace/app/itemmarking/ItemMarkingAvailabilityBitstreamStrategy.java index cd08ad032c..31166add72 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemmarking/ItemMarkingAvailabilityBitstreamStrategy.java +++ b/dspace-api/src/main/java/org/dspace/app/itemmarking/ItemMarkingAvailabilityBitstreamStrategy.java @@ -11,6 +11,8 @@ import java.io.UnsupportedEncodingException; import java.sql.SQLException; import java.util.List; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -34,8 +36,9 @@ public class ItemMarkingAvailabilityBitstreamStrategy implements ItemMarkingExtr @Autowired(required = true) protected ItemService itemService; - public ItemMarkingAvailabilityBitstreamStrategy() { + private static final Logger LOG = LogManager.getLogger(); + public ItemMarkingAvailabilityBitstreamStrategy() { } @Override @@ -43,14 +46,14 @@ public class ItemMarkingAvailabilityBitstreamStrategy implements ItemMarkingExtr throws SQLException { List bundles = itemService.getBundles(item, "ORIGINAL"); - if (bundles.size() == 0) { + if (bundles.isEmpty()) { ItemMarkingInfo markInfo = new ItemMarkingInfo(); markInfo.setImageName(nonAvailableImageName); return markInfo; } else { Bundle originalBundle = bundles.iterator().next(); - if (originalBundle.getBitstreams().size() == 0) { + if (originalBundle.getBitstreams().isEmpty()) { ItemMarkingInfo markInfo = new ItemMarkingInfo(); markInfo.setImageName(nonAvailableImageName); @@ -72,8 +75,7 @@ public class ItemMarkingAvailabilityBitstreamStrategy implements ItemMarkingExtr try { bsLink = bsLink + Util.encodeBitstreamName(bitstream.getName(), Constants.DEFAULT_ENCODING); } catch (UnsupportedEncodingException e) { - - e.printStackTrace(); + LOG.warn("DSpace uses an unsupported encoding", e); } signInfo.setLink(bsLink); diff --git a/dspace-api/src/main/java/org/dspace/app/itemupdate/ContentsEntry.java b/dspace-api/src/main/java/org/dspace/app/itemupdate/ContentsEntry.java index e192b92b89..7bbe4a19e9 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemupdate/ContentsEntry.java +++ b/dspace-api/src/main/java/org/dspace/app/itemupdate/ContentsEntry.java @@ -105,6 +105,7 @@ public class ContentsEntry { return new ContentsEntry(arp[0], arp[1], actionId, groupName, arp[3]); } + @Override public String toString() { StringBuilder sb = new StringBuilder(filename); if (bundlename != null) { diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/HTMLFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/HTMLFilter.java index 1b982cb277..5e10f2841d 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/HTMLFilter.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/HTMLFilter.java @@ -9,6 +9,7 @@ package org.dspace.app.mediafilter; import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import javax.swing.text.Document; import javax.swing.text.html.HTMLEditorKit; @@ -36,7 +37,7 @@ public class HTMLFilter extends MediaFilter { } /** - * @return String bitstreamformat + * @return String bitstream format */ @Override public String getFormatString() { @@ -73,9 +74,9 @@ public class HTMLFilter extends MediaFilter { String extractedText = doc.getText(0, doc.getLength()); // generate an input stream with the extracted text - byte[] textBytes = extractedText.getBytes(); + byte[] textBytes = extractedText.getBytes(StandardCharsets.UTF_8); ByteArrayInputStream bais = new ByteArrayInputStream(textBytes); - return bais; // will this work? or will the byte array be out of scope? + return bais; } } diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/PoiWordFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/PoiWordFilter.java index 158f52f1f9..8c198c4477 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/PoiWordFilter.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/PoiWordFilter.java @@ -10,6 +10,7 @@ package org.dspace.app.mediafilter; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import org.apache.poi.POITextExtractor; import org.apache.poi.extractor.ExtractorFactory; @@ -66,6 +67,6 @@ public class PoiWordFilter } // return the extracted text as a stream. - return new ByteArrayInputStream(text.getBytes()); + return new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)); } } diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java index 596bd63643..87198fe172 100644 --- a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java +++ b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java @@ -73,6 +73,7 @@ public class SHERPAService { /** * Complete initialization of the Bean. */ + @SuppressWarnings("unused") @PostConstruct private void init() { // Get endoint and API key from configuration diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAPermittedVersion.java b/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAPermittedVersion.java index ec45a29ce7..3a810c8e9e 100644 --- a/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAPermittedVersion.java +++ b/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAPermittedVersion.java @@ -13,15 +13,18 @@ import java.util.List; * Plain java representation of a SHERPA Permitted Version object, based on SHERPA API v2 responses. * * In a SHERPA search for journal deposit policies, this data is contained within a publisher policy. - * Each permitted version is for a particular article version (eg. submitted, accepted, published) and contains + * Each permitted version is for a particular article version (e.g. submitted, accepted, published) and contains: * - * A list of general conditions / terms for deposit of this version of work - * A list of allowed locations (eg. institutional repository, personal homepage, non-commercial repository) - * A list of prerequisite conditions for deposit (eg. attribution, linking to published version) - * A list of required licences for the deposited work (eg. CC-BY-NC) - * Embargo requirements, if any + *

      + *
    • A list of general conditions / terms for deposit of this version of work
    • + *
    • A list of allowed locations (e.g. institutional repository, personal homepage, non-commercial repository)
    • + *
    • A list of prerequisite conditions for deposit (e.g. attribution, linking to published version)
    • + *
    • A list of required licenses for the deposited work (e.g. CC-BY-NC)
    • + *
    • Embargo requirements, if any
    • + *
    * - * This class also has some helper data for labels, which can be used with i18n when displaying policy information + * This class also has some helper data for labels, which can be used with i18n + * when displaying policy information. * * @see SHERPAPublisherPolicy */ @@ -44,7 +47,7 @@ public class SHERPAPermittedVersion { // Embargo private SHERPAEmbargo embargo; - protected class SHERPAEmbargo { + protected static class SHERPAEmbargo { String units; int amount; } diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAPublisherResponse.java b/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAPublisherResponse.java index f109b2e677..ac71c6e844 100644 --- a/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAPublisherResponse.java +++ b/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAPublisherResponse.java @@ -10,7 +10,8 @@ package org.dspace.app.sherpa.v2; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.LinkedList; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.List; import org.apache.logging.log4j.LogManager; @@ -74,7 +75,7 @@ public class SHERPAPublisherResponse { * @param jsonData - the JSON input stream from the API result response body */ private void parseJSON(InputStream jsonData) throws IOException { - InputStreamReader streamReader = new InputStreamReader(jsonData); + InputStreamReader streamReader = new InputStreamReader(jsonData, StandardCharsets.UTF_8); JSONTokener jsonTokener = new JSONTokener(streamReader); JSONObject httpResponse; try { @@ -86,7 +87,7 @@ public class SHERPAPublisherResponse { // parsing the full journal / policy responses if (items.length() > 0) { metadata = new SHERPASystemMetadata(); - this.publishers = new LinkedList<>(); + this.publishers = new ArrayList<>(); // Iterate search result items for (int itemIndex = 0; itemIndex < items.length(); itemIndex++) { SHERPAPublisher sherpaPublisher = new SHERPAPublisher(); diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAResponse.java b/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAResponse.java index 3134ad013c..a40814bafe 100644 --- a/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAResponse.java +++ b/dspace-api/src/main/java/org/dspace/app/sherpa/v2/SHERPAResponse.java @@ -10,8 +10,8 @@ package org.dspace.app.sherpa.v2; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -78,7 +78,7 @@ public class SHERPAResponse { * @param jsonData - the JSON input stream from the API result response body */ private void parseJSON(InputStream jsonData) throws IOException { - InputStreamReader streamReader = new InputStreamReader(jsonData); + InputStreamReader streamReader = new InputStreamReader(jsonData, StandardCharsets.UTF_8); JSONTokener jsonTokener = new JSONTokener(streamReader); JSONObject httpResponse; try { @@ -90,10 +90,10 @@ public class SHERPAResponse { // - however, we only ever want one result since we're passing an "equals ISSN" query if (items.length() > 0) { metadata = new SHERPASystemMetadata(); - this.journals = new LinkedList<>(); + this.journals = new ArrayList<>(); // Iterate search result items for (int itemIndex = 0; itemIndex < items.length(); itemIndex++) { - List sherpaPublishers = new LinkedList<>(); + List sherpaPublishers = new ArrayList<>(); List policies = new ArrayList<>(); SHERPAPublisher sherpaPublisher = new SHERPAPublisher(); SHERPAJournal sherpaJournal = new SHERPAJournal(); @@ -289,7 +289,7 @@ public class SHERPAResponse { // Is the item in DOAJ? if (item.has("listed_in_doaj")) { - sherpaJournal.setInDOAJ(("yes".equals(item.getString("listed_in_doaj")))); + sherpaJournal.setInDOAJ("yes".equals(item.getString("listed_in_doaj"))); } return sherpaJournal; @@ -403,7 +403,6 @@ public class SHERPAResponse { // published = pdfversion // These strings can be used to construct i18n messages. String articleVersion = "unknown"; - String versionLabel = "Unknown"; // Each 'permitted OA' can actually refer to multiple versions if (permitted.has("article_version")) { diff --git a/dspace-api/src/main/java/org/dspace/app/sitemap/SitemapsOrgGenerator.java b/dspace-api/src/main/java/org/dspace/app/sitemap/SitemapsOrgGenerator.java index 3ec4ca8239..53f402d331 100644 --- a/dspace-api/src/main/java/org/dspace/app/sitemap/SitemapsOrgGenerator.java +++ b/dspace-api/src/main/java/org/dspace/app/sitemap/SitemapsOrgGenerator.java @@ -86,7 +86,7 @@ public class SitemapsOrgGenerator extends AbstractGenerator { @Override public String getURLText(String url, Date lastMod) { - StringBuffer urlText = new StringBuffer(); + StringBuilder urlText = new StringBuilder(); urlText.append("").append(url).append(""); if (lastMod != null) { diff --git a/dspace-api/src/main/java/org/dspace/app/util/InitializeEntities.java b/dspace-api/src/main/java/org/dspace/app/util/InitializeEntities.java index 5b2413642c..0a072a9819 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/InitializeEntities.java +++ b/dspace-api/src/main/java/org/dspace/app/util/InitializeEntities.java @@ -10,8 +10,6 @@ package org.dspace.app.util; import java.io.File; import java.io.IOException; import java.sql.SQLException; -import java.util.LinkedList; -import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -30,7 +28,6 @@ import org.dspace.content.EntityType; import org.dspace.content.RelationshipType; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.EntityTypeService; -import org.dspace.content.service.RelationshipService; import org.dspace.content.service.RelationshipTypeService; import org.dspace.core.Context; import org.w3c.dom.Document; @@ -40,22 +37,20 @@ import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** - * This script is used to initialize the database with a set of relationshiptypes that are written + * This script is used to initialize the database with a set of relationship types that are written * in an xml file that is given to this script. - * This XML file needs to have a proper XML structure and needs to define the variables of the RelationshipType object + * This XML file needs to have a proper XML structure and needs to define the variables of the RelationshipType object. */ public class InitializeEntities { private final static Logger log = LogManager.getLogger(); private final RelationshipTypeService relationshipTypeService; - private final RelationshipService relationshipService; private final EntityTypeService entityTypeService; private InitializeEntities() { relationshipTypeService = ContentServiceFactory.getInstance().getRelationshipTypeService(); - relationshipService = ContentServiceFactory.getInstance().getRelationshipService(); entityTypeService = ContentServiceFactory.getInstance().getEntityTypeService(); } @@ -111,14 +106,12 @@ public class InitializeEntities { try { File fXmlFile = new File(fileLocation); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder dBuilder = null; - dBuilder = dbFactory.newDocumentBuilder(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize(); NodeList nList = doc.getElementsByTagName("type"); - List relationshipTypes = new LinkedList<>(); for (int i = 0; i < nList.getLength(); i++) { Node nNode = nList.item(i); diff --git a/dspace-api/src/main/java/org/dspace/app/util/Util.java b/dspace-api/src/main/java/org/dspace/app/util/Util.java index aa04c13be7..f8ef3b1731 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/Util.java +++ b/dspace-api/src/main/java/org/dspace/app/util/Util.java @@ -38,13 +38,12 @@ import org.dspace.core.Utils; * * @author Robert Tansley * @author Mark Diggory - * @version $Revision$ */ public class Util { // cache for source version result private static String sourceVersion = null; - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Util.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); /** * Default constructor. Must be protected as org.dspace.xmlworkflow.WorkflowUtils extends it @@ -60,7 +59,7 @@ public class Util { * spaces */ public static String nonBreakSpace(String s) { - StringBuffer newString = new StringBuffer(); + StringBuilder newString = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); @@ -99,7 +98,7 @@ public class Util { return ""; } - StringBuffer out = new StringBuffer(); + StringBuilder out = new StringBuilder(); final String[] pctEncoding = {"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07", "%08", "%09", "%0a", "%0b", "%0c", "%0d", @@ -263,7 +262,7 @@ public class Util { return null; } - List return_values = new ArrayList(request_values.length); + List return_values = new ArrayList<>(request_values.length); for (String s : request_values) { try { @@ -402,7 +401,7 @@ public class Util { Item item, List values, String schema, String element, String qualifier, Locale locale) throws SQLException, DCInputsReaderException { - List toReturn = new ArrayList(); + List toReturn = new ArrayList<>(); DCInput myInputs = null; boolean myInputsFound = false; String formFileName = I18nUtil.getInputFormsFileName(locale); @@ -478,8 +477,9 @@ public class Util { } /** - * Split a list in an array of i sub-lists uniformly sized + * Split a list in an array of i sub-lists uniformly sized. * + * @param type of objects in the list. * @param idsList the list to split * @param i the number of sublists to return * diff --git a/dspace-api/src/main/java/org/dspace/checker/SimpleReporterServiceImpl.java b/dspace-api/src/main/java/org/dspace/checker/SimpleReporterServiceImpl.java index 849cddfb61..26c102e1e7 100644 --- a/dspace-api/src/main/java/org/dspace/checker/SimpleReporterServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/SimpleReporterServiceImpl.java @@ -77,7 +77,7 @@ public class SimpleReporterServiceImpl implements SimpleReporterService { osw.write(applyDateFormatShort(endDate)); osw.write("\n\n\n"); - if (recentChecksums.size() == 0) { + if (recentChecksums.isEmpty()) { osw.write("\n\n"); osw.write(msg("no-bitstreams-to-delete")); osw.write("\n"); @@ -119,7 +119,7 @@ public class SimpleReporterServiceImpl implements SimpleReporterService { osw.write(applyDateFormatShort(endDate)); osw.write("\n\n\n"); - if (history.size() == 0) { + if (history.isEmpty()) { osw.write("\n\n"); osw.write(msg("no-changed-bitstreams")); osw.write("\n"); @@ -159,7 +159,7 @@ public class SimpleReporterServiceImpl implements SimpleReporterService { osw.write(applyDateFormatShort(endDate)); osw.write("\n\n\n"); - if (history.size() == 0) { + if (history.isEmpty()) { osw.write("\n\n"); osw.write(msg("no-bitstreams-changed")); osw.write("\n"); @@ -201,7 +201,7 @@ public class SimpleReporterServiceImpl implements SimpleReporterService { osw.write(applyDateFormatShort(endDate)); osw.write("\n\n\n"); - if (mostRecentChecksums.size() == 0) { + if (mostRecentChecksums.isEmpty()) { osw.write("\n\n"); osw.write(msg("no-bitstreams-to-no-longer-be-processed")); osw.write("\n"); @@ -233,7 +233,7 @@ public class SimpleReporterServiceImpl implements SimpleReporterService { osw.write(applyDateFormatShort(new Date())); osw.write("\n\n\n"); - if (bitstreams.size() == 0) { + if (bitstreams.isEmpty()) { osw.write("\n\n"); osw.write(msg("no-unchecked-bitstreams")); osw.write("\n"); @@ -257,7 +257,7 @@ public class SimpleReporterServiceImpl implements SimpleReporterService { protected void printHistoryRecords(List mostRecentChecksums, OutputStreamWriter osw) throws IOException { for (MostRecentChecksum mostRecentChecksum : mostRecentChecksums) { - StringBuffer buf = new StringBuffer(1000); + StringBuilder buf = new StringBuilder(1000); buf.append("------------------------------------------------ \n"); buf.append(msg("bitstream-id")).append(" = ").append( mostRecentChecksum.getBitstream().getID()).append("\n"); @@ -292,7 +292,7 @@ public class SimpleReporterServiceImpl implements SimpleReporterService { throws IOException, SQLException { for (Bitstream info : bitstreams) { - StringBuffer buf = new StringBuffer(1000); + StringBuilder buf = new StringBuilder(1000); buf.append("------------------------------------------------ \n"); buf.append(msg("format-id")).append(" = ").append( info.getFormat(context).getID()).append("\n"); diff --git a/dspace-api/src/main/java/org/dspace/content/DCPersonName.java b/dspace-api/src/main/java/org/dspace/content/DCPersonName.java index cdcff55c37..cb9b5346ff 100644 --- a/dspace-api/src/main/java/org/dspace/content/DCPersonName.java +++ b/dspace-api/src/main/java/org/dspace/content/DCPersonName.java @@ -18,7 +18,6 @@ package org.dspace.content; * FIXME: No policy for dealing with "van"/"van der" and "Jr." * * @author Robert Tansley - * @version $Revision$ */ public class DCPersonName { /** @@ -89,8 +88,9 @@ public class DCPersonName { * * @return the name, suitable for putting in the database */ + @Override public String toString() { - StringBuffer out = new StringBuffer(); + StringBuilder out = new StringBuilder(); if (lastName != null) { out.append(lastName); diff --git a/dspace-api/src/main/java/org/dspace/content/RelationshipServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/RelationshipServiceImpl.java index 1b419da816..958b51ff7e 100644 --- a/dspace-api/src/main/java/org/dspace/content/RelationshipServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/RelationshipServiceImpl.java @@ -8,9 +8,9 @@ package org.dspace.content; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.LinkedList; import java.util.List; import org.apache.commons.collections4.CollectionUtils; @@ -250,7 +250,7 @@ public class RelationshipServiceImpl implements RelationshipService { } List rightRelationships = findByItemAndRelationshipType(context, itemToProcess, relationshipType, isLeft); - if (maxCardinality != null && rightRelationships.size() >= maxCardinality) { + if (rightRelationships.size() >= maxCardinality) { return false; } return true; @@ -266,6 +266,7 @@ public class RelationshipServiceImpl implements RelationshipService { return StringUtils.equals(leftEntityType, entityTypeToProcess.getLabel()); } + @Override public Relationship find(Context context, int id) throws SQLException { Relationship relationship = relationshipDAO.findByID(context, Relationship.class, id); return relationship; @@ -407,7 +408,7 @@ public class RelationshipServiceImpl implements RelationshipService { // Set a limit on the total depth of relationships to traverse during a relationship change int maxDepth = configurationService.getIntProperty("relationship.update.relateditems.maxdepth", 5); // This is the list containing all items which will have changes to their virtual metadata - List itemsToUpdate = new LinkedList<>(); + List itemsToUpdate = new ArrayList<>(); itemsToUpdate.add(relationship.getLeftItem()); itemsToUpdate.add(relationship.getRightItem()); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java index 6d7c716189..80c424e782 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java @@ -44,17 +44,16 @@ import org.jdom.xpath.XPath; /** * ORE ingestion crosswalk *

    - * Processes an Atom-encoded ORE resource map and attemps to interpret it as a DSpace item + * Processes an Atom-encoded ORE resource map and attempts to interpret it as a DSpace item. * * @author Alexey Maslov - * @version $Revision: 1 $ */ public class OREIngestionCrosswalk implements IngestionCrosswalk { /** * log4j category */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(OREDisseminationCrosswalk.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(); /* Namespaces */ public static final Namespace ATOM_NS = @@ -149,7 +148,7 @@ public class OREIngestionCrosswalk xpathDesc.addNamespace(RDF_NS); desc = (Element) xpathDesc.selectSingleNode(doc); } catch (JDOMException e) { - e.printStackTrace(); + log.warn("Could not find description for {}", href, e); } if (desc != null && desc.getChild("type", RDF_NS).getAttributeValue("resource", RDF_NS) diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java index 87c7c3155d..c0ef6ea42f 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java @@ -9,7 +9,7 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; import java.util.AbstractMap; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.persistence.Query; @@ -119,7 +119,7 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); Root collectionRoot = criteriaQuery.from(Collection.class); Join join = collectionRoot.join("resourcePolicies"); - List orPredicates = new LinkedList<>(); + List orPredicates = new ArrayList<>(actions.size()); for (Integer action : actions) { orPredicates.add(criteriaBuilder.equal(join.get(ResourcePolicy_.actionId), action)); } @@ -176,7 +176,7 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple Query query = createQuery(context, q); List list = query.getResultList(); - List> returnList = new LinkedList<>(); + List> returnList = new ArrayList<>(list.size()); for (Object[] o : list) { returnList.add(new AbstractMap.SimpleEntry<>((Collection) o[0], (Long) o[1])); } diff --git a/dspace-api/src/main/java/org/dspace/content/logic/Filter.java b/dspace-api/src/main/java/org/dspace/content/logic/Filter.java index bfacca837b..84e9d6bc08 100644 --- a/dspace-api/src/main/java/org/dspace/content/logic/Filter.java +++ b/dspace-api/src/main/java/org/dspace/content/logic/Filter.java @@ -20,7 +20,6 @@ import org.dspace.core.Context; * logical statement that shouldn't be use as root element. A filter may contain only one substatement. * * @author Kim Shepherd - * @version $Revision$ * @see org.dspace.content.logic.DefaultFilter */ public interface Filter extends LogicalStatement { @@ -31,5 +30,6 @@ public interface Filter extends LogicalStatement { * @return boolean * @throws LogicalStatementException */ + @Override boolean getResult(Context context, Item item) throws LogicalStatementException; } diff --git a/dspace-api/src/main/java/org/dspace/content/logic/condition/Condition.java b/dspace-api/src/main/java/org/dspace/content/logic/condition/Condition.java index 325964efdb..c86509899f 100644 --- a/dspace-api/src/main/java/org/dspace/content/logic/condition/Condition.java +++ b/dspace-api/src/main/java/org/dspace/content/logic/condition/Condition.java @@ -45,9 +45,10 @@ public interface Condition extends LogicalStatement { * Get the result of logical evaluation for an item * @param context DSpace context * @param item Item to evaluate - * @return boolean + * @return result * @throws LogicalStatementException */ + @Override boolean getResult(Context context, Item item) throws LogicalStatementException; public void setItemService(ItemService itemService); diff --git a/dspace-api/src/main/java/org/dspace/content/logic/operator/Nor.java b/dspace-api/src/main/java/org/dspace/content/logic/operator/Nor.java index d28ac7578d..d312734fbf 100644 --- a/dspace-api/src/main/java/org/dspace/content/logic/operator/Nor.java +++ b/dspace-api/src/main/java/org/dspace/content/logic/operator/Nor.java @@ -15,10 +15,9 @@ import org.dspace.content.logic.LogicalStatementException; import org.dspace.core.Context; /** - * An operator that implements NIR by negating an OR operation + * An operator that implements NOR by negating an OR operation. * * @author Kim Shepherd - * @version $Revision$ */ public class Nor extends AbstractOperator { diff --git a/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java b/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java index ffdb304802..8fb8172aeb 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java @@ -11,6 +11,7 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; @@ -656,7 +657,7 @@ public class METSManifest { String mimeType = mdWrap.getAttributeValue("MIMETYPE"); if (mimeType != null && mimeType.equalsIgnoreCase("text/xml")) { - byte value[] = Base64.decodeBase64(bin.getText().getBytes()); + byte value[] = Base64.decodeBase64(bin.getText().getBytes(StandardCharsets.UTF_8)); Document mdd = parser.build(new ByteArrayInputStream(value)); List result = new ArrayList<>(1); result.add(mdd.getRootElement()); @@ -724,13 +725,13 @@ public class METSManifest { throw new MetadataValidationException( "Invalid METS Manifest: mdWrap element with neither xmlData nor binData child."); } else { - byte value[] = Base64.decodeBase64(bin.getText().getBytes()); + byte value[] = Base64.decodeBase64(bin.getText().getBytes(StandardCharsets.UTF_8)); return new ByteArrayInputStream(value); } } else { XMLOutputter outputPretty = new XMLOutputter(Format.getPrettyFormat()); return new ByteArrayInputStream( - outputPretty.outputString(xmlData.getChildren()).getBytes()); + outputPretty.outputString(xmlData.getChildren()).getBytes(StandardCharsets.UTF_8)); } } else { mdRef = mdSec.getChild("mdRef", metsNS); @@ -1176,7 +1177,7 @@ public class METSManifest { "Invalid METS Manifest: mdWrap element for streaming crosswalk without binData " + "child."); } else { - byte value[] = Base64.decodeBase64(bin.getText().getBytes()); + byte value[] = Base64.decodeBase64(bin.getText().getBytes(StandardCharsets.UTF_8)); sxwalk.ingest(context, dso, new ByteArrayInputStream(value), mdWrap.getAttributeValue("MIMETYPE")); @@ -1302,6 +1303,6 @@ public class METSManifest { XMLOutputter outputPretty = new XMLOutputter(Format.getPrettyFormat()); return new ByteArrayInputStream( - outputPretty.outputString(mets).getBytes()); + outputPretty.outputString(mets).getBytes(StandardCharsets.UTF_8)); } } diff --git a/dspace-api/src/main/java/org/dspace/core/Email.java b/dspace-api/src/main/java/org/dspace/core/Email.java index 803497b650..2e9b058c06 100644 --- a/dspace-api/src/main/java/org/dspace/core/Email.java +++ b/dspace-api/src/main/java/org/dspace/core/Email.java @@ -571,7 +571,7 @@ public class Email { /** * @author arnaldo */ - public class InputStreamDataSource implements DataSource { + public static class InputStreamDataSource implements DataSource { private final String name; private final String contentType; private final ByteArrayOutputStream baos; @@ -612,7 +612,7 @@ public class Email { * Wrap ConfigurationService to prevent templates from modifying * the configuration. */ - public class UnmodifiableConfigurationService { + public static class UnmodifiableConfigurationService { private final ConfigurationService configurationService; /** diff --git a/dspace-api/src/main/java/org/dspace/discovery/indexobject/AbstractIndexableObject.java b/dspace-api/src/main/java/org/dspace/discovery/indexobject/AbstractIndexableObject.java index cf3f22ccdf..0fb01f2e5b 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/indexobject/AbstractIndexableObject.java +++ b/dspace-api/src/main/java/org/dspace/discovery/indexobject/AbstractIndexableObject.java @@ -33,7 +33,7 @@ public abstract class AbstractIndexableObject, PK if (!(obj instanceof IndexableObject)) { return false; } - AbstractIndexableObject other = (AbstractIndexableObject) obj; + IndexableObject other = (IndexableObject) obj; return other.getIndexedObject().equals(getIndexedObject()); } diff --git a/dspace-api/src/main/java/org/dspace/eperson/LoadLastLogin.java b/dspace-api/src/main/java/org/dspace/eperson/LoadLastLogin.java index b6bb99c442..390340affd 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/LoadLastLogin.java +++ b/dspace-api/src/main/java/org/dspace/eperson/LoadLastLogin.java @@ -11,6 +11,7 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -108,7 +109,7 @@ public class LoadLastLogin { final SimpleDateFormat dateEncoder = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (String logName : args) { - BufferedReader logReader = new BufferedReader(new FileReader(logName)); + BufferedReader logReader = new BufferedReader(new FileReader(logName, StandardCharsets.UTF_8)); while (true) { String line = logReader.readLine(); // End of file? diff --git a/dspace-api/src/main/java/org/dspace/external/provider/impl/SHERPAv2JournalDataProvider.java b/dspace-api/src/main/java/org/dspace/external/provider/impl/SHERPAv2JournalDataProvider.java index 42d3cab494..210d8a24a8 100644 --- a/dspace-api/src/main/java/org/dspace/external/provider/impl/SHERPAv2JournalDataProvider.java +++ b/dspace-api/src/main/java/org/dspace/external/provider/impl/SHERPAv2JournalDataProvider.java @@ -15,7 +15,6 @@ import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.Logger; import org.dspace.app.sherpa.SHERPAService; import org.dspace.app.sherpa.v2.SHERPAJournal; import org.dspace.app.sherpa.v2.SHERPAResponse; @@ -33,8 +32,6 @@ import org.dspace.external.provider.ExternalDataProvider; */ public class SHERPAv2JournalDataProvider implements ExternalDataProvider { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SHERPAv2JournalDataProvider.class); - // Source identifier (configured in spring configuration) private String sourceIdentifier; diff --git a/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java b/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java index 4dbfcf0eae..da9c3b718a 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java +++ b/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java @@ -158,6 +158,7 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { * Spring will use this setter to set the filter from the configured property in identifier-services.xml * @param filterService - an object implementing the org.dspace.content.logic.Filter interface */ + @Override public void setFilterService(Filter filterService) { this.filterService = filterService; } @@ -319,7 +320,6 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { * @param skipFilter - boolean indicating whether to skip any filtering of items before performing reservation * @throws IdentifierException * @throws IllegalArgumentException - * @throws SQLException */ @Override public void reserve(Context context, DSpaceObject dso, String identifier, boolean skipFilter) @@ -367,6 +367,7 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { * @param context - DSpace context * @param dso - DSpaceObject identified by this DOI * @param identifier - String containing the DOI to reserve + * @param skipFilter - skip the filters for {@link checkMintable(Context, DSpaceObject)} * @throws IdentifierException * @throws IllegalArgumentException * @throws SQLException @@ -410,6 +411,7 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { * @param context - DSpace context * @param dso - DSpaceObject identified by this DOI * @param identifier - String containing the DOI to register + * @param skipFilter - skip filters for {@link checkMintable(Context, DSpaceObject)} * @throws IdentifierException * @throws IllegalArgumentException * @throws SQLException @@ -785,7 +787,7 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { * Delete a specific DOI in the registration agency records via the DOI Connector * @param context - DSpace context * @param identifier - String containing identifier to delete - * @throws IdentifierException + * @throws DOIIdentifierException */ public void deleteOnline(Context context, String identifier) throws DOIIdentifierException { String doi = doiService.formatIdentifier(identifier); @@ -826,7 +828,7 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { * {@link org.dspace.identifier.service.DOIService#formatIdentifier(String)}. * @return Null if the DOI couldn't be found or the associated DSpaceObject. * @throws SQLException if database error - * @throws IdentifierException If {@code identifier} is null or an empty string. + * @throws DOIIdentifierException If {@code identifier} is null or an empty string. * @throws IllegalArgumentException If the identifier couldn't be recognized as DOI. */ public DSpaceObject getObjectByDOI(Context context, String identifier) @@ -876,10 +878,10 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { } /** - * Load a DOI from the database or creates it if it does not exist. This - * method can be used to ensure that a DOI exists in the database and to - * load the appropriate TableRow. As protected method we don't check if the - * DOI is in a decent format, use DOI.formatIdentifier(String) if necessary. + * Load a DOI from the database or creates it if it does not exist. + * This method can be used to ensure that a DOI exists in the database and + * to load the appropriate TableRow. As protected method we don't check if + * the DOI is in a decent format, use DOI.formatIdentifier(String) if necessary. * * @param context The relevant DSpace Context. * @param dso The DSpaceObject the DOI should be loaded or created for. @@ -889,6 +891,7 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { * @throws SQLException In case of an error using the database. * @throws DOIIdentifierException If {@code doi} is not part of our prefix or * DOI is registered for another object already. + * @throws IdentifierNotApplicableException passed through. */ protected DOI loadOrCreateDOI(Context context, DSpaceObject dso, String doiIdentifier) throws SQLException, DOIIdentifierException, IdentifierNotApplicableException { @@ -896,11 +899,13 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { } /** - * Load DOI from database, or create one if it doesn't yet exist - * We need to distinguish several cases. LoadOrCreate can be called with a specifid identifier to load or create. - * It can also be used to create a new unspecified identifier. In the latter case doiIdentifier is set null. - * If doiIdentifier is set, we know which doi we should try to load or create, but even in sucha situation - * we might be able to find it in the database or might have to create it. + * Load DOI from database, or create one if it doesn't yet exist. + * We need to distinguish several cases.LoadOrCreate can be called with a + * specified identifier to load or create. It can also be used to create a + * new unspecified identifier. In the latter case doiIdentifier is set null. + * If doiIdentifier is set, we know which doi we should try to load or + * create, but even in such a situation we might be able to find it in the + * database or might have to create it. * * @param context - DSpace context * @param dso - DSpaceObject to identify @@ -909,6 +914,7 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { * @return * @throws SQLException * @throws DOIIdentifierException + * @throws org.dspace.identifier.IdentifierNotApplicableException passed through. */ protected DOI loadOrCreateDOI(Context context, DSpaceObject dso, String doiIdentifier, boolean skipFilter) throws SQLException, DOIIdentifierException, IdentifierNotApplicableException { @@ -929,11 +935,11 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider { && doi.getResourceTypeId() != dso.getType()) { // doi was assigned to another resource type. Don't // reactivate it - throw new DOIIdentifierException("Cannot reassing " - + "previously deleted DOI " + doiIdentifier - + " as the resource types of the object it was " - + "previously assigned to and the object it " - + "shall be assigned to now divert (was: " + throw new DOIIdentifierException("Cannot reassign" + + " previously deleted DOI " + doiIdentifier + + " as the resource types of the object it was" + + " previously assigned to and the object it" + + " shall be assigned to now differ (was: " + Constants.typeText[doi.getResourceTypeId()] + ", trying to assign to " + Constants.typeText[dso.getType()] + ").", diff --git a/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java b/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java index 55eeb8d314..0eac224bcd 100644 --- a/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java +++ b/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java @@ -15,6 +15,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; +import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.util.Iterator; import java.util.List; @@ -38,7 +39,8 @@ import org.dspace.content.service.ItemService; import org.dspace.core.Context; /** - * Cleanup class for CC Licenses, corrects XML formating errors by replacing the license_rdf bitstream. + * Cleanup class for CC Licenses, corrects XML formatting errors by replacing + * the license_rdf bitstream. * * @author mdiggory */ @@ -130,7 +132,7 @@ public class LicenseCleanup { AuthorizeException, IOException { List bundles = itemService.getBundles(item, "CC-LICENSE"); - if (bundles == null || bundles.size() == 0) { + if (bundles == null || bundles.isEmpty()) { return; } @@ -138,7 +140,7 @@ public class LicenseCleanup { Bitstream bitstream = bundleService.getBitstreamByName(bundle, "license_rdf"); - String license_rdf = new String(copy(context, bitstream)); + String license_rdf = new String(copy(context, bitstream), StandardCharsets.UTF_8); /* quickly fix xml by ripping out offensive parts */ license_rdf = license_rdf.replaceFirst(" + + + + + DEBUG + + + INFO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From edd310f536f676e9e239e6eac19285f19bcbb34f Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 10 Sep 2021 12:51:24 -0400 Subject: [PATCH 12/16] Address Error Prone complaints about tests. (#3061) --- .../java/org/dspace/app/bulkedit/MetadataImportIT.java | 4 +++- .../test/java/org/dspace/app/sherpa/MockSHERPAService.java | 7 ++++--- .../test/java/org/dspace/authority/orcid/MockOrcid.java | 3 +++ .../org/dspace/content/MetadataFieldPerformanceTest.java | 4 ++-- .../src/test/java/org/dspace/discovery/DiscoveryIT.java | 2 +- .../impl/MockPubmedImportMetadataSourceServiceImpl.java | 4 +++- .../org/dspace/util/DSpaceConfigurationInitializer.java | 4 ---- .../test/java/org/dspace/util/DSpaceKernelInitializer.java | 2 +- 8 files changed, 17 insertions(+), 13 deletions(-) diff --git a/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportIT.java b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportIT.java index e073004f7d..280f4f4ff6 100644 --- a/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportIT.java +++ b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportIT.java @@ -187,7 +187,7 @@ public class MetadataImportIT extends AbstractIntegrationTestWithDatabase { item.getID().toString() + "," + collection.getHandle() + "," + item.getName() + ","}; performImportScript(csv); item = findItemByName("title"); - assertEquals(itemService.getMetadata(item, "dc", "contributor", "author", Item.ANY).size(), 0); + assertEquals(0, itemService.getMetadata(item, "dc", "contributor", "author", Item.ANY).size()); } private Item findItemByName(String name) throws SQLException { @@ -203,6 +203,8 @@ public class MetadataImportIT extends AbstractIntegrationTestWithDatabase { /** * Import mocked CSVs to test item creation behavior, deleting temporary file afterward. + * @param csv content for test file. + * @throws java.lang.Exception passed through. */ public void performImportScript(String[] csv) throws Exception { File csvFile = File.createTempFile("dspace-test-import", "csv"); diff --git a/dspace-api/src/test/java/org/dspace/app/sherpa/MockSHERPAService.java b/dspace-api/src/test/java/org/dspace/app/sherpa/MockSHERPAService.java index d7c4877fa5..b218ba82fe 100644 --- a/dspace-api/src/test/java/org/dspace/app/sherpa/MockSHERPAService.java +++ b/dspace-api/src/test/java/org/dspace/app/sherpa/MockSHERPAService.java @@ -17,8 +17,9 @@ import org.dspace.app.sherpa.v2.SHERPAResponse; /** * Mock implementation for SHERPA API service (used by SHERPA submit service to check - * journal policies) - * This class will return mock SHERPA responses so they can be parsed and turned into external data objects downstream + * journal policies). + * This class will return mock SHERPA responses so they can be parsed and turned + * into external data objects downstream. * * @author Kim Shepherd */ @@ -110,7 +111,7 @@ public class MockSHERPAService extends SHERPAService { try { // Prepare the URI - this will not be used but should be evaluated // in case a syntax exception is thrown - URI uri = prepareQuery(value, endpoint, apiKey); + URI unuseduri = prepareQuery(value, endpoint, apiKey); // Get mock JSON - in this case, a known good result for PLOS content = getClass().getResourceAsStream("plos.json"); diff --git a/dspace-api/src/test/java/org/dspace/authority/orcid/MockOrcid.java b/dspace-api/src/test/java/org/dspace/authority/orcid/MockOrcid.java index 2f551315e1..562aa86a58 100644 --- a/dspace-api/src/test/java/org/dspace/authority/orcid/MockOrcid.java +++ b/dspace-api/src/test/java/org/dspace/authority/orcid/MockOrcid.java @@ -31,18 +31,21 @@ public class MockOrcid extends Orcidv3SolrAuthorityImpl { OrcidRestConnector orcidRestConnector = Mockito.mock(OrcidRestConnector.class); when(orcidRestConnector.get(ArgumentMatchers.startsWith("search?"), ArgumentMatchers.any())) .thenAnswer(new Answer() { + @Override public InputStream answer(InvocationOnMock invocation) { return this.getClass().getResourceAsStream("orcid-search-noresults.xml"); } }); when(orcidRestConnector.get(ArgumentMatchers.startsWith("search?q=Bollini"), ArgumentMatchers.any())) .thenAnswer(new Answer() { + @Override public InputStream answer(InvocationOnMock invocation) { return this.getClass().getResourceAsStream("orcid-search.xml"); } }); when(orcidRestConnector.get(ArgumentMatchers.endsWith("/person"), ArgumentMatchers.any())) .thenAnswer(new Answer() { + @Override public InputStream answer(InvocationOnMock invocation) { return this.getClass().getResourceAsStream("orcid-person-record.xml"); } diff --git a/dspace-api/src/test/java/org/dspace/content/MetadataFieldPerformanceTest.java b/dspace-api/src/test/java/org/dspace/content/MetadataFieldPerformanceTest.java index d9b216f638..3ba7f0556b 100644 --- a/dspace-api/src/test/java/org/dspace/content/MetadataFieldPerformanceTest.java +++ b/dspace-api/src/test/java/org/dspace/content/MetadataFieldPerformanceTest.java @@ -50,7 +50,7 @@ public class MetadataFieldPerformanceTest extends AbstractUnitTest { Assert.assertTrue("Duration (" + duration + ") should be smaller than " + maxDuration + " for " + amount + " tests." + " Max of " + maxDurationPerCall + " ms per operation exceeded: " + - (((double) (duration)) / amount) + " ms.", duration < maxDuration); + (((double) duration) / amount) + " ms.", duration < maxDuration); } @Test @@ -81,7 +81,7 @@ public class MetadataFieldPerformanceTest extends AbstractUnitTest { Assert.assertTrue("Duration (" + duration + ") should be smaller than " + maxDuration + " for " + amount + " tests." + " Max of " + maxDurationPerCall + " ms per operation exceeded: " + - (((double) (duration)) / amount) + " ms.", duration < maxDuration); + (((double) duration) / amount) + " ms.", duration < maxDuration); context.turnOffAuthorisationSystem(); // Delete community & collection created in init() diff --git a/dspace-api/src/test/java/org/dspace/discovery/DiscoveryIT.java b/dspace-api/src/test/java/org/dspace/discovery/DiscoveryIT.java index 9518f59071..9504d01393 100644 --- a/dspace-api/src/test/java/org/dspace/discovery/DiscoveryIT.java +++ b/dspace-api/src/test/java/org/dspace/discovery/DiscoveryIT.java @@ -665,7 +665,7 @@ public class DiscoveryIT extends AbstractIntegrationTestWithDatabase { throws SQLException, AuthorizeException, IOException, WorkflowException, SearchServiceException { context.turnOffAuthorisationSystem(); workspaceItem = context.reloadEntity(workspaceItem); - XmlWorkflowItem workflowItem = workflowService.startWithoutNotify(context, workspaceItem); + XmlWorkflowItem unusedWorkflowItem = workflowService.startWithoutNotify(context, workspaceItem); context.commit(); indexer.commit(); context.restoreAuthSystemState(); diff --git a/dspace-api/src/test/java/org/dspace/external/provider/impl/MockPubmedImportMetadataSourceServiceImpl.java b/dspace-api/src/test/java/org/dspace/external/provider/impl/MockPubmedImportMetadataSourceServiceImpl.java index a143ed7d34..1a88c1e55b 100644 --- a/dspace-api/src/test/java/org/dspace/external/provider/impl/MockPubmedImportMetadataSourceServiceImpl.java +++ b/dspace-api/src/test/java/org/dspace/external/provider/impl/MockPubmedImportMetadataSourceServiceImpl.java @@ -14,6 +14,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; @@ -56,6 +57,7 @@ public class MockPubmedImportMetadataSourceServiceImpl extends PubmedImportMetad }); when(pubmedWebTarget.request(ArgumentMatchers.any(MediaType.class))) .thenAnswer(new Answer() { + @Override public Invocation.Builder answer(InvocationOnMock invocation) throws Throwable { Invocation.Builder builder = Mockito.mock(Invocation.Builder.class); when(builder.get()).thenAnswer(new Answer() { @@ -67,7 +69,7 @@ public class MockPubmedImportMetadataSourceServiceImpl extends PubmedImportMetad public String answer(InvocationOnMock invocation) throws Throwable { String resourceName = "pubmed-" + valueCapture.getValue() + ".xml"; InputStream resource = getClass().getResourceAsStream(resourceName); - try (Reader reader = new InputStreamReader(resource)) { + try (Reader reader = new InputStreamReader(resource, StandardCharsets.UTF_8)) { return FileCopyUtils.copyToString(reader); } catch (IOException e) { throw new UncheckedIOException(e); diff --git a/dspace-api/src/test/java/org/dspace/util/DSpaceConfigurationInitializer.java b/dspace-api/src/test/java/org/dspace/util/DSpaceConfigurationInitializer.java index 70d8f12990..e2e0355f12 100644 --- a/dspace-api/src/test/java/org/dspace/util/DSpaceConfigurationInitializer.java +++ b/dspace-api/src/test/java/org/dspace/util/DSpaceConfigurationInitializer.java @@ -9,8 +9,6 @@ package org.dspace.util; import org.apache.commons.configuration2.Configuration; import org.apache.commons.configuration2.spring.ConfigurationPropertySource; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; import org.springframework.context.ApplicationContextInitializer; @@ -32,8 +30,6 @@ import org.springframework.context.ConfigurableApplicationContext; public class DSpaceConfigurationInitializer implements ApplicationContextInitializer { - private static final Logger log = LogManager.getLogger(); - @Override public void initialize(final ConfigurableApplicationContext applicationContext) { // Load DSpace Configuration service (requires kernel already initialized) diff --git a/dspace-api/src/test/java/org/dspace/util/DSpaceKernelInitializer.java b/dspace-api/src/test/java/org/dspace/util/DSpaceKernelInitializer.java index 93fd308185..a6f381bafb 100644 --- a/dspace-api/src/test/java/org/dspace/util/DSpaceKernelInitializer.java +++ b/dspace-api/src/test/java/org/dspace/util/DSpaceKernelInitializer.java @@ -115,7 +115,7 @@ public class DSpaceKernelInitializer /** * Utility class that will destroy the DSpace Kernel on Spring shutdown. */ - private class DSpaceKernelDestroyer + private static class DSpaceKernelDestroyer implements ApplicationListener { private DSpaceKernel kernel; From 372b9e2ce6e0f78307232909d487ba81fbce0ccb Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Wed, 15 Sep 2021 14:33:25 -0500 Subject: [PATCH 13/16] Add 'dspace database migrate force' to manually trigger Flyway Callbacks --- .../dspace/storage/rdbms/DatabaseUtils.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java index 98777c654b..dc43519bbb 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java @@ -180,8 +180,9 @@ public class DatabaseUtils { try (Connection connection = dataSource.getConnection()) { System.out.println("\nDatabase URL: " + connection.getMetaData().getURL()); - // "migrate" allows for an OPTIONAL second argument: + // "migrate" allows for an OPTIONAL second argument (only one may be specified): // - "ignored" = Also run any previously "ignored" migrations during the migration + // - "force" = Even if no pending migrations exist, still run a migration to trigger callbacks. // - [version] = ONLY run migrations up to a specific DSpace version (ONLY FOR TESTING) if (argv.length == 2) { if (argv[1].equalsIgnoreCase("ignored")) { @@ -191,6 +192,8 @@ public class DatabaseUtils { // Update the database to latest version, but set "outOfOrder=true" // This will ensure any old migrations in the "ignored" state are now run updateDatabase(dataSource, connection, null, true); + } else if (argv[1].equalsIgnoreCase("force")) { + updateDatabase(dataSource, connection, null, false, true); } else { // Otherwise, we assume "argv[1]" is a valid migration version number // This is only for testing! Never specify for Production! @@ -654,6 +657,34 @@ public class DatabaseUtils { protected static synchronized void updateDatabase(DataSource datasource, Connection connection, String targetVersion, boolean outOfOrder) throws SQLException { + updateDatabase(datasource, connection, targetVersion, outOfOrder, false); + } + + /** + * Ensures the current database is up-to-date with regards + * to the latest DSpace DB schema. If the scheme is not up-to-date, + * then any necessary database migrations are performed. + *

    + * FlywayDB (http://flywaydb.org/) is used to perform database migrations. + * If a Flyway DB migration fails it will be rolled back to the last + * successful migration, and any errors will be logged. + * + * @param datasource DataSource object (retrieved from DatabaseManager()) + * @param connection Database connection + * @param targetVersion If specified, only migrate the database to a particular *version* of DSpace. This is + * just useful for testing migrations, and should NOT be used in Production. + * If null, the database is migrated to the latest version. + * @param outOfOrder If true, Flyway will run any lower version migrations that were previously "ignored". + * If false, Flyway will only run new migrations with a higher version number. + * @param forceMigrate If true, always run a Flyway migration, even if no "Pending" migrations exist. This can be + * used to trigger Flyway Callbacks manually. + * If false, only run migration if pending migrations exist, otherwise do nothing. + * @throws SQLException if database error + * If database cannot be upgraded. + */ + protected static synchronized void updateDatabase(DataSource datasource, Connection connection, + String targetVersion, boolean outOfOrder, boolean forceMigrate) + throws SQLException { if (null == datasource) { throw new SQLException("The datasource is a null reference -- cannot continue."); } @@ -730,6 +761,10 @@ public class DatabaseUtils { // Flag that Discovery will need reindexing, since database was updated setReindexDiscovery(reindexAfterUpdate); + } else if (forceMigrate) { + log.info("DSpace database schema is up to date, but 'force' was specified. " + + "Running migrate command to trigger callbacks."); + flyway.migrate(); } else { log.info("DSpace database schema is up to date"); } From 106d37404b3c5fa8278f864c95f550c79aed4710 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 16 Sep 2021 08:41:42 -0400 Subject: [PATCH 14/16] Fix incorrect merge. (#3061) --- dspace-api/src/main/java/org/dspace/core/Context.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/core/Context.java b/dspace-api/src/main/java/org/dspace/core/Context.java index f64113a690..00130f1dc3 100644 --- a/dspace-api/src/main/java/org/dspace/core/Context.java +++ b/dspace-api/src/main/java/org/dspace/core/Context.java @@ -10,7 +10,6 @@ package org.dspace.core; import java.sql.SQLException; import java.util.ArrayList; import java.util.Deque; -import java.util.EmptyStackException; import java.util.LinkedList; import java.util.List; import java.util.Locale; @@ -310,10 +309,10 @@ public class Context implements AutoCloseable { Boolean previousState; try { previousState = authStateChangeHistory.pop(); - } catch (EmptyStackException ex) { + } catch (NoSuchElementException ex) { log.warn(LogHelper.getHeader(this, "restore_auth_sys_state", - "not previous state info available " - + ex.getLocalizedMessage())); + "not previous state info available: {}"), + ex::getLocalizedMessage); previousState = Boolean.FALSE; } if (log.isDebugEnabled()) { From 9f463239d2eed66ad78d4ec5db31cb523332e989 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 16 Sep 2021 13:23:48 -0400 Subject: [PATCH 15/16] Address new LGTM alert for removed parameter. (#3061) --- dspace-api/src/main/java/org/dspace/search/Harvest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/search/Harvest.java b/dspace-api/src/main/java/org/dspace/search/Harvest.java index b0bafd367f..773d45a6ab 100644 --- a/dspace-api/src/main/java/org/dspace/search/Harvest.java +++ b/dspace-api/src/main/java/org/dspace/search/Harvest.java @@ -42,7 +42,6 @@ import org.dspace.handle.service.HandleService; * withdrawn within a particular range of dates. * * @author Robert Tansley - * @version $Revision$ */ public class Harvest { /** @@ -229,7 +228,6 @@ public class Harvest { /** * Fill out the containers field of the HarvestedItemInfo object * - * @param context DSpace context * @param itemInfo HarvestedItemInfo object to fill out * @throws SQLException if database error */ From 1b366f8b7429947eecceb3b7daeec29f03605d64 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 20 Sep 2021 08:55:11 -0400 Subject: [PATCH 16/16] Address review comments: missed some isEmpty fixes. [#3061] --- .../org/dspace/app/bulkedit/DSpaceCSV.java | 2 +- .../main/java/org/dspace/core/I18nUtil.java | 4 +- dspace-api/src/test/resources/log4j2-test.xml | 56 ------------------- 3 files changed, 3 insertions(+), 59 deletions(-) delete mode 100644 dspace-api/src/test/resources/log4j2-test.xml diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/DSpaceCSV.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/DSpaceCSV.java index 64be0196bc..cbc052b557 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkedit/DSpaceCSV.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/DSpaceCSV.java @@ -577,7 +577,7 @@ public class DSpaceCSV implements Serializable { csvLine.add(headings.get(i - 1), null); String[] elements = part.split(escapedValueSeparator); for (String element : elements) { - if ((element != null) && !"".equals(element)) { + if ((element != null) && !element.isEmpty()) { csvLine.add(headings.get(i - 1), element); } } diff --git a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java index 8c101a8f05..a853c3597e 100644 --- a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java +++ b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java @@ -320,11 +320,11 @@ public class I18nUtil { fileType = ""; } - if (!"".equals(locale.getCountry())) { + if (!locale.getCountry().isEmpty()) { fileNameLC = fileName + "_" + locale.getLanguage() + "_" + locale.getCountry(); - if (!"".equals(locale.getVariant())) { + if (!locale.getVariant().isEmpty()) { fileNameLCV = fileName + "_" + locale.getLanguage() + "_" + locale.getCountry() + "_" + locale.getVariant(); } diff --git a/dspace-api/src/test/resources/log4j2-test.xml b/dspace-api/src/test/resources/log4j2-test.xml deleted file mode 100644 index e0cd821912..0000000000 --- a/dspace-api/src/test/resources/log4j2-test.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - DEBUG - - - INFO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -