- * As this module is no longer maintained by Spring, it is now recommended to
- * maintain it within your own codebase, so that minor updates can be made to
- * support new versions of Apache Commons Configuration (as needed). See this
- * Spring ticket: https://jira.spring.io/browse/SPR-10213
- *
- * For DSpace, we've specifically updated this bean to automatically load all
- * configurations from the DSpaceConfigurationService (which uses Commons
- * Configuration internally). See constructor below.
- *
- * This bean is loaded in 'spring-dspace-core-services.xml' where it is wired
- * up to PropertyPlaceholderConfigurer.
- */
-package org.dspace.servicemanager.config;
-
-import java.net.URL;
-
-import org.apache.commons.configuration.CompositeConfiguration;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.commons.configuration.PropertiesConfiguration;
-import org.dspace.services.ConfigurationService;
-import org.springframework.beans.factory.FactoryBean;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.core.io.Resource;
-import org.springframework.util.Assert;
-
-/**
- * FactoryBean which wraps a Commons CompositeConfiguration object for usage
- * with PropertiesLoaderSupport. This allows the configuration object to behave
- * like a normal java.util.Properties object which can be passed on to
- * setProperties() method allowing PropertyOverrideConfigurer and
- * PropertyPlaceholderConfigurer to take advantage of Commons Configuration.
- * Internally a CompositeConfiguration object is used for merging multiple
- * Configuration objects.
- *
- * @see java.util.Properties
- * @see org.springframework.core.io.support.PropertiesLoaderSupport
- *
- * @author Costin Leau
- *
- */
-public class DSpaceConfigurationFactoryBean implements InitializingBean, FactoryBean {
-
- private CompositeConfiguration configuration;
-
- private Configuration[] configurations;
-
- private Resource[] locations;
-
- private boolean throwExceptionOnMissing = true;
-
- /**
- * Initialize all properties via the passed in DSpace ConfigurationService
- * @param configurationService current DSpace configuration service
- */
- public DSpaceConfigurationFactoryBean(ConfigurationService configurationService) {
- Assert.notNull(configurationService.getConfiguration());
- this.configuration = new CompositeConfiguration(configurationService.getConfiguration());
- }
-
- /**
- * Initialize all properties via the passed in Commons Configuration
- * @param configuration Commons configuration
- */
- public DSpaceConfigurationFactoryBean(Configuration configuration) {
- Assert.notNull(configuration);
- this.configuration = new CompositeConfiguration(configuration);
- }
-
- /**
- * @see org.springframework.beans.factory.FactoryBean#getObject()
- */
- @Override
- public Object getObject() throws Exception {
- return (configuration != null) ? ConfigurationConverter.getProperties(configuration) : null;
- }
-
- /**
- * @see org.springframework.beans.factory.FactoryBean#getObjectType()
- */
- @Override
- public Class getObjectType() {
- return java.util.Properties.class;
- }
-
- /**
- * @see org.springframework.beans.factory.FactoryBean#isSingleton()
- */
- @Override
- public boolean isSingleton() {
- return true;
- }
-
- /**
- * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
- */
- public void afterPropertiesSet() throws Exception {
- if (configuration == null && (configurations == null || configurations.length == 0)
- && (locations == null || locations.length == 0)) {
- throw new IllegalArgumentException("no configuration object or location specified");
- }
-
- if (configuration == null) {
- configuration = new CompositeConfiguration();
- }
-
- configuration.setThrowExceptionOnMissing(throwExceptionOnMissing);
-
- if (configurations != null) {
- for (int i = 0; i < configurations.length; i++) {
- configuration.addConfiguration(configurations[i]);
- }
- }
-
- if (locations != null) {
- for (int i = 0; i < locations.length; i++) {
- URL url = locations[i].getURL();
- Configuration props = new PropertiesConfiguration(url);
- configuration.addConfiguration(props);
- }
- }
- }
-
- /**
- * @return Returns the configurations.
- */
- public Configuration[] getConfigurations() {
- return configurations;
- }
-
- /**
- * Set the commons configurations objects which will be used as properties.
- *
- * @param configurations array of Commons Configuration objects
- */
- public void setConfigurations(Configuration[] configurations) {
- this.configurations = configurations;
- }
-
- public Resource[] getLocations() {
- return locations;
- }
-
- /**
- * Shortcut for loading configuration from Spring resources. It will
- * internally create a PropertiesConfiguration object based on the URL
- * retrieved from the given Resources.
- *
- * @param locations array of resource locations
- */
- public void setLocations(Resource[] locations) {
- this.locations = locations;
- }
-
- /**
- * Return whether to throw an exception if a configuration is missing.
- * @return true if exception should be throw, false otherwise.
- */
- public boolean isThrowExceptionOnMissing() {
- return throwExceptionOnMissing;
- }
-
- /**
- * Set the underlying Commons CompositeConfiguration throwExceptionOnMissing
- * flag.
- * @see org.apache.commons.configuration.AbstractConfiguration
- * @param throwExceptionOnMissing whether to throw an exception if a config is missing
- */
- public void setThrowExceptionOnMissing(boolean throwExceptionOnMissing) {
- this.throwExceptionOnMissing = throwExceptionOnMissing;
- }
-
- /**
- * Getter for the underlying CompositeConfiguration object.
- *
- * @return CompositeConfiguration object
- */
- public CompositeConfiguration getConfiguration() {
- return configuration;
- }
-
-}
-
diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationPlaceholderConfigurer.java b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationPlaceholderConfigurer.java
new file mode 100644
index 0000000000..b85450dcd0
--- /dev/null
+++ b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationPlaceholderConfigurer.java
@@ -0,0 +1,36 @@
+/**
+ * The contents of this file are subject to the license and copyright
+ * detailed in the LICENSE and NOTICE files at the root of the source
+ * tree and available online at
+ *
+ * http://www.dspace.org/license/
+ */
+package org.dspace.servicemanager.config;
+
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.spring.ConfigurationPropertySource;
+import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
+import org.springframework.core.env.MutablePropertySources;
+
+/**
+ * Extends Spring PropertySourcesPlaceholderConfigurer to allow our Configuration to be included as a Spring
+ * PropertySource. This allows ${...} placeholders within bean definition property values and @Value annotations
+ * to be resolved using DSpaceConfigurationService
+ *
+ * NOTE: This is initialized in spring-dspace-core-services.xml
+ *
+ * @see PropertySourcesPlaceholderConfigurer
+ * @see DSpaceConfigurationService
+ */
+public class DSpaceConfigurationPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer {
+
+ public DSpaceConfigurationPlaceholderConfigurer(Configuration configuration) {
+ ConfigurationPropertySource apacheCommonsConfigPropertySource =
+ new ConfigurationPropertySource(configuration.getClass().getName(), configuration);
+ MutablePropertySources propertySources = new MutablePropertySources();
+ propertySources.addLast(apacheCommonsConfigPropertySource);
+ setPropertySources(propertySources);
+ }
+}
diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java
index 83238a9667..3d511a1e67 100644
--- a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java
+++ b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java
@@ -22,10 +22,14 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.DefaultConfigurationBuilder;
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.ConfigurationConverter;
+import org.apache.commons.configuration2.builder.ConfigurationBuilderEvent;
+import org.apache.commons.configuration2.builder.combined.ReloadingCombinedConfigurationBuilder;
+import org.apache.commons.configuration2.builder.fluent.Parameters;
+import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
+import org.apache.commons.configuration2.event.Event;
+import org.apache.commons.configuration2.ex.ConfigurationException;
import org.dspace.services.ConfigurationService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -60,15 +64,19 @@ public final class DSpaceConfigurationService implements ConfigurationService {
// The DSpace Server ID configuration
public static final String DSPACE_SERVER_ID = "serverId";
- // Current ConfigurationBuilder
- private DefaultConfigurationBuilder configurationBuilder = null;
+ // Configuration list delimiter. Configurations with this character will be split into arrays
+ public static final char CONFIG_LIST_DELIMITER = ',';
- // Current Configuration
- private Configuration configuration = null;
+ // Current ConfigurationBuilder
+ // NOTE: we only cache the "builder", as it controls when a configuration is automatically reloaded
+ private ReloadingCombinedConfigurationBuilder configurationBuilder = null;
// Current Home directory
private String homePath = null;
+ // Current Configuration Definition File
+ private String configDefinition = null;
+
/**
* Initializes a ConfigurationService based on default values. The DSpace
* Home directory is determined based on system properties / searching.
@@ -98,7 +106,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
@Override
public Properties getProperties() {
// Return our configuration as a set of Properties
- return ConfigurationConverter.getProperties(configuration);
+ return ConfigurationConverter.getProperties(getConfiguration());
}
/**
@@ -109,7 +117,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
@Override
public List getPropertyKeys() {
- Iterator keys = configuration.getKeys();
+ Iterator keys = getConfiguration().getKeys();
List keyList = new ArrayList<>();
while (keys.hasNext()) {
@@ -126,7 +134,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
@Override
public List getPropertyKeys(String prefix) {
- Iterator keys = configuration.getKeys(prefix);
+ Iterator keys = getConfiguration().getKeys(prefix);
List keyList = new ArrayList<>();
while (keys.hasNext()) {
@@ -142,7 +150,13 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
@Override
public Configuration getConfiguration() {
- return configuration;
+ try {
+ return this.configurationBuilder.getConfiguration();
+ } catch (ConfigurationException ce) {
+ log.error("Unable to get configuration object based on definition at " + this.configDefinition);
+ System.err.println("Unable to get configuration object based on definition at " + this.configDefinition);
+ throw new RuntimeException(ce);
+ }
}
/**
@@ -153,7 +167,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
@Override
public Object getPropertyValue(String name) {
- return configuration.getProperty(name);
+ return getConfiguration().getProperty(name);
}
/**
@@ -175,7 +189,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
@Override
public String getProperty(String name, String defaultValue) {
- return (String) getPropertyAsType(name, defaultValue);
+ return getPropertyAsType(name, defaultValue);
}
/**
@@ -325,7 +339,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
@Override
public boolean hasProperty(String name) {
- if (configuration.containsKey(name)) {
+ if (getConfiguration().containsKey(name)) {
return true;
} else {
return false;
@@ -346,15 +360,15 @@ public final class DSpaceConfigurationService implements ConfigurationService {
if (name == null) {
throw new IllegalArgumentException("name cannot be null for setting configuration");
} else {
- Object oldValue = configuration.getProperty(name);
+ Object oldValue = getConfiguration().getProperty(name);
if (value == null && oldValue != null) {
changed = true;
- configuration.clearProperty(name);
+ getConfiguration().clearProperty(name);
log.info("Cleared the configuration setting for name (" + name + ")");
} else if (value != null && !value.equals(oldValue)) {
changed = true;
- configuration.setProperty(name, value);
+ getConfiguration().setProperty(name, value);
}
}
return changed;
@@ -409,14 +423,14 @@ public final class DSpaceConfigurationService implements ConfigurationService {
}
// Check if the value has changed
- if (this.configuration.containsKey(key) &&
- this.configuration.getProperty(key).equals(value)) {
+ if (getConfiguration().containsKey(key) &&
+ getConfiguration().getProperty(key).equals(value)) {
// no change to the value
return false;
} else {
// Either this config doesn't exist, or it is not the same value,
// so we'll update it.
- this.configuration.setProperty(key, value);
+ getConfiguration().setProperty(key, value);
return true;
}
}
@@ -425,7 +439,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
* Clears all the configuration settings.
*/
public void clear() {
- this.configuration.clear();
+ getConfiguration().clear();
log.info("Cleared all configuration settings");
}
@@ -435,7 +449,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
* @param key key of the configuration
*/
public void clearConfig(String key) {
- this.configuration.clearProperty(key);
+ getConfiguration().clearProperty(key);
}
// loading from files code
@@ -451,35 +465,50 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
private void loadInitialConfig(String providedHome) {
// Determine the DSpace home directory
- homePath = getDSpaceHome(providedHome);
+ this.homePath = getDSpaceHome(providedHome);
// Based on homePath get full path to the configuration definition
- String configDefinition = homePath + File.separatorChar + DSPACE_CONFIG_DEFINITION_PATH;
+ this.configDefinition = this.homePath + File.separatorChar + DSPACE_CONFIG_DEFINITION_PATH;
// Check if our configuration definition exists in the homePath
- File configDefFile = new File(configDefinition);
+ File configDefFile = new File(this.configDefinition);
if (!configDefFile.exists()) {
try {
//If it doesn't exist, check for a configuration definition on Classpath
// (NOTE: This is mostly for Unit Testing to find the test config-definition.xml)
ClassPathResource resource = new ClassPathResource(DSPACE_CONFIG_DEFINITION_PATH);
- configDefinition = resource.getFile().getAbsolutePath();
+ this.configDefinition = resource.getFile().getAbsolutePath();
} catch (IOException ioe) {
log.error("Error attempting to load configuration definition from classpath", ioe);
}
}
try {
+ Parameters params = new Parameters();
+ // Treat comma as a config list delimiter (when not escaped by \,)
+ DefaultListDelimiterHandler listDelimiterHandler = new DefaultListDelimiterHandler(CONFIG_LIST_DELIMITER);
// Load our configuration definition, which in turn loads all our config files/settings
- // See: http://commons.apache.org/proper/commons-configuration/userguide_v1.10/howto_configurationbuilder
- // .html
- configurationBuilder = new DefaultConfigurationBuilder(configDefinition);
+ // See: http://commons.apache.org/proper/commons-configuration/userguide/howto_combinedbuilder.html
+ this.configurationBuilder = new ReloadingCombinedConfigurationBuilder()
+ .configure(params.fileBased()
+ .setFile(new File(this.configDefinition))
+ .setListDelimiterHandler(listDelimiterHandler));
- // Actually parser our configuration definition & return the resulting Configuration
- configuration = configurationBuilder.getConfiguration();
+ // Parse our configuration definition and initialize resulting Configuration
+ this.configurationBuilder.getConfiguration();
+
+ // Register an event listener for triggering automatic reloading checks
+ // See: https://commons.apache.org/proper/commons-configuration/userguide/howto_reloading.html#Reloading_Checks_on_Builder_Access
+ // NOTE: This MUST be added *after* the first call to getConfiguration(), as getReloadingController() is
+ // not initialized until the configuration is first parsed/read.
+ this.configurationBuilder.addEventListener(ConfigurationBuilderEvent.CONFIGURATION_REQUEST,
+ // Lamba which checks reloadable configurations for any updates.
+ // Auto-reloadable configs are ONLY those flagged config-reload="true" in the configuration definition
+ (Event e) -> this.configurationBuilder.getReloadingController()
+ .checkForReloading(null));
} catch (ConfigurationException ce) {
- log.error("Unable to load configurations based on definition at " + configDefinition);
- System.err.println("Unable to load configurations based on definition at " + configDefinition);
+ log.error("Unable to load configurations based on definition at " + this.configDefinition);
+ System.err.println("Unable to load configurations based on definition at " + this.configDefinition);
throw new RuntimeException(ce);
}
@@ -490,22 +519,25 @@ public final class DSpaceConfigurationService implements ConfigurationService {
}
/**
- * Reload the configuration from the DSpace configuration files.
+ * Reload all configurations from the DSpace configuration definition.
*
- * Uses the initialized ConfigurationBuilder to reload all configurations.
+ * This method invalidates the current Configuration object, and uses
+ * the initialized ConfigurationBuilder to reload all configurations.
*/
@Override
public synchronized void reloadConfig() {
try {
- configurationBuilder.reload();
- this.configuration = configurationBuilder.getConfiguration();
+ // As this is a forced reload, completely invalidate the configuration
+ // This ensures all configs, including System properties and Environment variables are reloaded
+ this.configurationBuilder.getConfiguration().invalidate();
+
+ // Reload/reinitialize our configuration
+ this.configurationBuilder.getConfiguration();
// Finally, (re)set any dynamic, default properties
setDynamicProperties();
} catch (ConfigurationException ce) {
- log.error("Unable to reload configurations based on definition at " +
- configurationBuilder.getFile().getAbsolutePath(),
- ce);
+ log.error("Unable to reload configurations based on definition at " + this.configDefinition, ce);
}
log.info("Reloaded configuration service: " + toString());
}
@@ -516,7 +548,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
private void setDynamicProperties() {
// Ensure our DSPACE_HOME property is set to the determined homePath
- setProperty(DSPACE_HOME, homePath);
+ setProperty(DSPACE_HOME, this.homePath);
try {
// Attempt to set a default "serverId" property to value of hostname
@@ -534,8 +566,8 @@ public final class DSpaceConfigurationService implements ConfigurationService {
int size = props != null ? props.size() : 0;
// Return the configuration directory and number of configs loaded
- return "ConfigDir=" + configuration
- .getString(DSPACE_HOME) + File.separatorChar + DEFAULT_CONFIG_DIR + ", Size=" + size;
+ return "ConfigDir=" + getConfiguration().getString(DSPACE_HOME) + File.separatorChar
+ + DEFAULT_CONFIG_DIR + ", Size=" + size;
}
/**
@@ -652,10 +684,11 @@ public final class DSpaceConfigurationService implements ConfigurationService {
* @param object type
* @return converted value
*/
+ @SuppressWarnings("unchecked")
private T convert(String name, Class type) {
// If this key doesn't exist, just return null
- if (!configuration.containsKey(name)) {
+ if (!getConfiguration().containsKey(name)) {
// Special case. For booleans, return false if key doesn't exist
if (Boolean.class.equals(type) || boolean.class.equals(type)) {
return (T) Boolean.FALSE;
@@ -667,33 +700,33 @@ public final class DSpaceConfigurationService implements ConfigurationService {
// Based on the type of class, call the appropriate
// method of the Configuration object
if (type.isArray()) {
- return (T) configuration.getStringArray(name);
+ return (T) getConfiguration().getStringArray(name);
} else if (String.class.equals(type) || type.isAssignableFrom(String.class)) {
- return (T) configuration.getString(name);
+ return (T) getConfiguration().getString(name);
} else if (BigDecimal.class.equals(type)) {
- return (T) configuration.getBigDecimal(name);
+ return (T) getConfiguration().getBigDecimal(name);
} else if (BigInteger.class.equals(type)) {
- return (T) configuration.getBigInteger(name);
+ return (T) getConfiguration().getBigInteger(name);
} else if (Boolean.class.equals(type) || boolean.class.equals(type)) {
- return (T) Boolean.valueOf(configuration.getBoolean(name));
+ return (T) Boolean.valueOf(getConfiguration().getBoolean(name));
} else if (Byte.class.equals(type) || byte.class.equals(type)) {
- return (T) Byte.valueOf(configuration.getByte(name));
+ return (T) Byte.valueOf(getConfiguration().getByte(name));
} else if (Double.class.equals(type) || double.class.equals(type)) {
- return (T) Double.valueOf(configuration.getDouble(name));
+ return (T) Double.valueOf(getConfiguration().getDouble(name));
} else if (Float.class.equals(type) || float.class.equals(type)) {
- return (T) Float.valueOf(configuration.getFloat(name));
+ return (T) Float.valueOf(getConfiguration().getFloat(name));
} else if (Integer.class.equals(type) || int.class.equals(type)) {
- return (T) Integer.valueOf(configuration.getInt(name));
+ return (T) Integer.valueOf(getConfiguration().getInt(name));
} else if (List.class.equals(type)) {
- return (T) configuration.getList(name);
+ return (T) getConfiguration().getList(name);
} else if (Long.class.equals(type) || long.class.equals(type)) {
- return (T) Long.valueOf(configuration.getLong(name));
+ return (T) Long.valueOf(getConfiguration().getLong(name));
} else if (Short.class.equals(type) || short.class.equals(type)) {
- return (T) Short.valueOf(configuration.getShort(name));
+ return (T) Short.valueOf(getConfiguration().getShort(name));
} else {
// If none of the above works, try to convert the value to the required type
SimpleTypeConverter converter = new SimpleTypeConverter();
- return (T) converter.convertIfNecessary(configuration.getProperty(name), type);
+ return (T) converter.convertIfNecessary(getConfiguration().getProperty(name), type);
}
}
}
diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java
index 0deaba1ac5..ab2afb5ed6 100644
--- a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java
+++ b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java
@@ -7,7 +7,8 @@
*/
package org.dspace.servicemanager.example;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.services.model.Event;
import org.dspace.services.model.EventListener;
@@ -23,8 +24,7 @@ public final class EventListenerExample implements EventListener {
/**
* log4j category
*/
- private static Logger log = Logger
- .getLogger(EventListenerExample.class);
+ private static Logger log = LogManager.getLogger(EventListenerExample.class);
/**
* @return null
diff --git a/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java b/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java
index 4beb2a9f35..050e4c089c 100644
--- a/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java
+++ b/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java
@@ -10,7 +10,7 @@ package org.dspace.services;
import java.util.List;
import java.util.Properties;
-import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration2.Configuration;
/**
diff --git a/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java b/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java
index 1d8eff903f..f20458f51a 100644
--- a/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java
+++ b/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java
@@ -12,7 +12,9 @@ import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.naming.InitialContext;
+import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
+import javax.naming.NoInitialContextException;
import org.dspace.kernel.mixins.InitializedService;
import org.dspace.services.ConfigurationService;
@@ -33,7 +35,7 @@ import org.springframework.beans.factory.annotation.Required;
public class EmailServiceImpl
extends Authenticator
implements EmailService, InitializedService {
- private static final Logger logger = (Logger) LoggerFactory.getLogger(EmailServiceImpl.class);
+ private static final Logger logger = LoggerFactory.getLogger(EmailServiceImpl.class);
private Session session = null;
@@ -53,7 +55,7 @@ public class EmailServiceImpl
/**
* Provide a reference to the JavaMail session.
*
- * @return the managed Session, or null if none could be created.
+ * @return the managed Session, or {@code null} if none could be created.
*/
@Override
public Session getSession() {
@@ -67,12 +69,16 @@ public class EmailServiceImpl
if (null == sessionName) {
sessionName = "Session";
}
+ String sessionUri = "java:comp/env/mail/" + sessionName;
+ logger.debug("Looking up Session as {}", sessionUri);
try {
InitialContext ctx = new InitialContext(null);
- session = (Session) ctx.lookup("java:comp/env/mail/" + sessionName);
+ session = (Session) ctx.lookup(sessionUri);
+ } catch (NameNotFoundException | NoInitialContextException ex) {
+ // Not a problem -- build a new Session from configuration.
} catch (NamingException ex) {
- logger.warn("Couldn't get an email session from environment: {}",
- ex.getMessage());
+ logger.warn("Couldn't get an email session from environment: {}: {}",
+ ex.getClass().getName(), ex.getMessage());
}
if (null != session) {
@@ -106,8 +112,6 @@ public class EmailServiceImpl
props.put("mail.smtp.auth", "true");
session = Session.getInstance(props, this);
}
-
-
}
}
diff --git a/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java b/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java
index 3ef22825ce..de67e504a5 100644
--- a/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java
+++ b/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java
@@ -13,7 +13,7 @@ import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
-import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang3.ArrayUtils;
import org.dspace.kernel.mixins.ShutdownService;
import org.dspace.services.CachingService;
import org.dspace.services.EventService;
diff --git a/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java b/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java
index 6f0b18ff40..07798a0225 100644
--- a/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java
+++ b/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java
@@ -18,7 +18,7 @@ import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.kernel.mixins.InitializedService;
import org.dspace.kernel.mixins.ShutdownService;
import org.dspace.services.ConfigurationService;
diff --git a/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml b/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml
index e2837bb14f..e5f14b2b07 100644
--- a/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml
+++ b/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml
@@ -16,18 +16,19 @@
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java
new file mode 100644
index 0000000000..fb121a2570
--- /dev/null
+++ b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java
@@ -0,0 +1,134 @@
+/**
+ * The contents of this file are subject to the license and copyright
+ * detailed in the LICENSE and NOTICE files at the root of the source
+ * tree and available online at
+ *
+ * http://www.dspace.org/license/
+ */
+package org.dspace.servicemanager.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.dspace.services.ConfigurationService;
+import org.dspace.test.DSpaceAbstractKernelTest;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Testing the org.apache.commons.configuration2.spring.ConfigurationPropertiesFactoryBean to ensure it performs
+ * property substitution in Spring XML configs (e.g. replacing ${dspace.dir} with the value from dspace.cfg)
+ *
+ * NOTE: This uses a TestDynamicPropertyBean bean defined in spring-test-beans.xml for all tests. It also depends
+ * on the org.springframework.beans.factory.config.PropertyPlaceholderConfigurer defined in
+ * spring-dspace-core-services.xml
+ *
+ * @author Tim Donohue
+ */
+public class DSpaceConfigurationBeanTest
+ extends DSpaceAbstractKernelTest {
+
+ // Path to our main test config file (local.properties)
+ private String propertyFilePath;
+
+ @Before
+ public void init() {
+ // Save the path to our main test configuration file
+ propertyFilePath = new DSpaceConfigurationService().getDSpaceHome(null) + File.separatorChar
+ + DSpaceConfigurationService.DEFAULT_CONFIG_DIR + File.separatorChar + "local.properties";
+ }
+
+ /**
+ * Test that property substitution is working properly in Spring XML configs.
+ * Properties in those XML configs (e.g. ${key}) should be dynamically replaced
+ * with the corresponding value from our ConfigurationService
+ */
+ @Test
+ public void testGetBeanSettingFromConfigurationService() {
+
+ // Load configs from files
+ ConfigurationService cfg = getKernel().getConfigurationService();
+ assertNotNull("ConfigurationService returned null", cfg);
+ assertNotNull("test config returned null", cfg.getProperty("testDynamicBean.property"));
+
+ //Load example service which is configured using a dynamic property (which is specified in a config file)
+ // See spring-test-beans.xml
+ TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("dynamicPropertyBean",
+ TestDynamicPropertyBean.class);
+
+ assertNotNull("Bean returned null", bean);
+ assertNotNull("Bean.name() returned null", bean.getProperty());
+
+ // The bean's getProperty() method should return the same value as "testDynamicBean.property" in DSpace's
+ // configuration. This is cause bean's property is set to ${testDynamicBean.property} in spring-test-beans.xml
+ assertEquals("Bean.getProperty() does not match configuration", cfg.getProperty("testDynamicBean.property"),
+ bean.getProperty());
+ }
+
+ /**
+ * Test that property substitution is working properly in Spring PropertySource (e.g. @Value annotations)
+ * Properties in those annotations, e.g. @Value("${key}"), should be dynamically replaced with the corresponding
+ * value from our ConfigurationService
+ */
+ @Test
+ public void testGetPropertySourceFromConfigurationService() {
+ // Load configs from files
+ ConfigurationService cfg = getKernel().getConfigurationService();
+ assertNotNull("ConfigurationService returned null", cfg);
+ assertNotNull("test config returned null", cfg.getProperty("testDynamicBean.property"));
+
+ // Load test bean which is defined by TestDynamicAnnotationConfiguration
+ TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("propertyBeanUsingAnnotation",
+ TestDynamicPropertyBean.class);
+
+ // The Test bean's property should be automatically set (see TestDynamicAnnotationConfiguration)
+ String configValue = bean.getProperty();
+
+ assertNotNull("PropertySource config returned null", configValue);
+
+ // The value of "configValue" should be equal to "testDynamicBean.property" in our configuration.
+ // This is because configValue is set via an @Value annotation in TestDynamicAnnotationConfiguration
+ assertEquals("PropertySource config does not match configuration", cfg.getProperty("testDynamicBean.property"),
+ configValue);
+ }
+
+ /**
+ * Test that automatic reloading of configuration via bean settings also works.
+ *
+ * @TODO: This test does not actually work yet, because Commons Configuration v2 doesn't yet have a
+ * org.apache.commons.configuration2.spring.ConfigurationPropertiesFactoryBean that supports reloading properties.
+ * NOTE: This test also fails in Commons Configuration v1 (e.g. in DSpace 6.x). So, it's possible we may not be
+ * able to support reloadable properties via Spring beans (until Commons Configuration does)
+ */
+ /*@Test
+ public void testReloadBeanSettingFromConfigurationService() throws ConfigurationException, InterruptedException {
+ //Load example service which is configured using a dynamic property (which is specified in a config file)
+ // See spring-test-beans.xml
+ TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("dynamicPropertyBean",
+ TestDynamicPropertyBean.class);
+ assertNotNull("WeLoveDSpace", bean.getProperty());
+
+ // Change the value of that Property in the file itself (using a separate builder instance)
+ FileBasedConfigurationBuilder builder = new Configurations()
+ .propertiesBuilder(propertyFilePath);
+ PropertiesConfiguration config = builder.getConfiguration();
+ // Clear out current value. Add in a new value
+ config.clearProperty("testDynamicBean.property");
+ config.addProperty("testDynamicBean.property", "NewValue");
+ // Save updates to file
+ builder.save();
+
+ // Check immediately. Property should be unchanged
+ // NOTE: If this fails, then somehow the configuration reloaded *immediately*
+ assertEquals("WeLoveDSpace", bean.getProperty());
+
+ // Wait now for 3 seconds
+ Thread.sleep(3_000);
+
+ // Check again. Property should have reloaded
+ // NOTE: reload time is set in config-definition.xml to reload every 2 seconds
+ assertEquals("NewValue", bean.getProperty());
+ } */
+}
diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBeanTest.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBeanTest.java
deleted file mode 100644
index 90804d7823..0000000000
--- a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBeanTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * The contents of this file are subject to the license and copyright
- * detailed in the LICENSE and NOTICE files at the root of the source
- * tree and available online at
- *
- * http://www.dspace.org/license/
- */
-package org.dspace.servicemanager.config;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import org.dspace.services.ConfigurationService;
-import org.dspace.test.DSpaceAbstractKernelTest;
-import org.junit.Test;
-
-/**
- * Testing the DSpaceConfigurationFactoryBean to ensure it performs property
- * substitution in Spring XML configs (e.g. replacing ${dspace.dir} with the
- * value from dspace.cfg)
- *
- * NOTE: This uses a TestDynamicPropertyBean bean defined in spring-test-beans.xml
- * for all tests.
- *
- * @author Tim Donohue
- */
-public class DSpaceConfigurationFactoryBeanTest
- extends DSpaceAbstractKernelTest {
-
- /**
- * Test that property substitution is working properly in Spring XML configs.
- * Properties in those configs (e.g. ${key}) should be dynamically replaced
- * with the corresponding value from our ConfigurationService
- */
- @Test
- public void testGetBeanSettingFromConfigurationService() {
-
- // Load configs from files
- ConfigurationService cfg = getKernel().getConfigurationService();
- assertNotNull("ConfigurationService returned null", cfg);
- assertNotNull("test config returned null", cfg.getProperty("testDynamicBean.property"));
-
- //Load example service which is configured using a dynamic property (which is specified in a config file)
- // See spring-test-beans.xml
- TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("dynamicPropertyBean",
- TestDynamicPropertyBean.class);
-
- assertNotNull("Bean returned null", bean);
- assertNotNull("Bean.name() returned null", bean.getProperty());
-
- // The name of the ServiceExample bean should be the SAME as the value of "serviceExample.bean.name" in
- // configuration,
- // as the spring-test-beans.xml uses ${serviceExample.bean.name} to set the name
- assertEquals("Bean.name() does not match configuration", cfg.getProperty("testDynamicBean.property"),
- bean.getProperty());
- }
-}
diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationServiceTest.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationServiceTest.java
index d831fe09c5..e57b05ea50 100644
--- a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationServiceTest.java
+++ b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationServiceTest.java
@@ -13,11 +13,16 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import mockit.Expectations;
+import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
+import org.apache.commons.configuration2.builder.fluent.Configurations;
+import org.apache.commons.configuration2.ex.ConfigurationException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -33,10 +38,17 @@ public class DSpaceConfigurationServiceTest {
DSpaceConfigurationService configurationService;
int numPropsLoaded;
+ // Path to our main test config file (local.properties)
+ private String propertyFilePath;
+
@Before
public void init() {
configurationService = new DSpaceConfigurationService();
+ // Save the path to our main test configuration file
+ propertyFilePath = configurationService.getDSpaceHome(null) + File.separatorChar
+ + DSpaceConfigurationService.DEFAULT_CONFIG_DIR + File.separatorChar + "local.properties";
+
// clear out default configs (leaves us with an empty Configuration)
configurationService.clear();
@@ -174,6 +186,17 @@ public class DSpaceConfigurationServiceTest {
assertEquals(1, array.length);
assertEquals("A,B,C", array[0]);
configurationService.clearConfig("new.array");
+
+ // Test multiline arrays (requires loading configs from local.properties test config file)
+ // Specifying the same property multiple times should create an array of values.
+ DSpaceConfigurationService dscs = new DSpaceConfigurationService();
+ array = dscs.getArrayProperty("prop.multiline.array");
+ assertNotNull(array);
+ assertEquals(3, array.length);
+ assertEquals("line1", array[0]);
+ assertEquals("line2", array[1]);
+ assertEquals("line3", array[2]);
+ dscs.clear();
}
/**
@@ -242,7 +265,7 @@ public class DSpaceConfigurationServiceTest {
/**
* Test method for
- * {@link org.dspace.servicemanager.config.DSpaceConfigurationService#getHasProperty(java.lang.String)}.
+ * {@link org.dspace.servicemanager.config.DSpaceConfigurationService#hasProperty(java.lang.String)}.
*/
@Test
public void testHasProperty() {
@@ -416,7 +439,7 @@ public class DSpaceConfigurationServiceTest {
/**
* Test method for
- * {@link org.dspace.servicemanager.config.DSpaceConfigurationService#loadConfig(java.lang.String, java.lang.String)}.
+ * {@link org.dspace.servicemanager.config.DSpaceConfigurationService#loadConfig(java.lang.String, java.lang.Object)}.
*/
@Test
public void testLoadConfig() {
@@ -495,6 +518,41 @@ public class DSpaceConfigurationServiceTest {
dscs = null;
}
+ /**
+ * Tests the ability of our ConfigurationService to automatically reload properties after a set period
+ * of time.
+ */
+ @Test
+ public void testAutomaticReload() throws ConfigurationException, InterruptedException {
+ // Initialize new config service
+ DSpaceConfigurationService dscs = new DSpaceConfigurationService();
+
+ // Assert a property exists with a specific initial value
+ assertNotNull(dscs.getProperty("prop.to.auto.reload"));
+ assertEquals("D-space", dscs.getProperty("prop.to.auto.reload"));
+
+ // Now, change the value of that Property in the file itself (using a separate builder instance)
+ FileBasedConfigurationBuilder builder = new Configurations()
+ .propertiesBuilder(propertyFilePath);
+ PropertiesConfiguration config = builder.getConfiguration();
+ // Clear out current value. Add in a new value
+ config.clearProperty("prop.to.auto.reload");
+ config.addProperty("prop.to.auto.reload", "DSpace");
+ // Save updates to file
+ builder.save();
+
+ // Check immediately. Property should be unchanged
+ // NOTE: If this fails, then somehow the configuration reloaded *immediately*
+ assertEquals("D-space", dscs.getProperty("prop.to.auto.reload"));
+
+ // Wait now for 3 seconds
+ Thread.sleep(3_000);
+
+ // Check again. Property should have reloaded
+ // NOTE: reload time is set in config-definition.xml to reload every 2 seconds
+ assertEquals("DSpace", dscs.getProperty("prop.to.auto.reload"));
+ }
+
/**
* Tests the ability of the system to properly extract system properties into the configuration.
* (NOTE: This ability to load system properties is specified in the test "config-definition.xml")
@@ -532,6 +590,11 @@ public class DSpaceConfigurationServiceTest {
// In local.properties, this value is something like " test "
assertEquals("test", dscs.getProperty("prop.needing.trimmed"));
+ // Also test that properties in included files are loaded
+ // This property is specified in "included.properties", which is loaded via an "include =" statement in
+ // local.properties
+ assertEquals("works", dscs.getProperty("prop.from.included.file"));
+
dscs.clear();
dscs = null;
}
diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/TestDynamicAnnotationConfiguration.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/TestDynamicAnnotationConfiguration.java
new file mode 100644
index 0000000000..581e33e2a3
--- /dev/null
+++ b/dspace-services/src/test/java/org/dspace/servicemanager/config/TestDynamicAnnotationConfiguration.java
@@ -0,0 +1,33 @@
+/**
+ * The contents of this file are subject to the license and copyright
+ * detailed in the LICENSE and NOTICE files at the root of the source
+ * tree and available online at
+ *
+ * http://www.dspace.org/license/
+ */
+package org.dspace.servicemanager.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * A test bean which we will configure to load its one property via @Value annotation
+ *
+ * See DSpaceConfigurationFactoryBeanTest.
+ *
+ * @author Tim Donohue
+ */
+@Configuration
+public class TestDynamicAnnotationConfiguration {
+ // This setting should be loaded from the "testDynamicBean.property" configuration in local.properties
+ @Value("${testDynamicBean.property}")
+ private String value;
+
+ @Bean
+ public TestDynamicPropertyBean propertyBeanUsingAnnotation() {
+ TestDynamicPropertyBean bean = new TestDynamicPropertyBean();
+ bean.setProperty(value);
+ return bean;
+ }
+}
diff --git a/dspace-services/src/test/resources/config/config-definition.xml b/dspace-services/src/test/resources/config/config-definition.xml
index c172deb491..4ff26e0c34 100644
--- a/dspace-services/src/test/resources/config/config-definition.xml
+++ b/dspace-services/src/test/resources/config/config-definition.xml
@@ -8,26 +8,27 @@
http://www.dspace.org/license/
-->
-
-
-
-
+
+
-
+
-
-
+
+
-
\ No newline at end of file
+
diff --git a/dspace-services/src/test/resources/config/included.properties b/dspace-services/src/test/resources/config/included.properties
new file mode 100644
index 0000000000..fcdc3a1efc
--- /dev/null
+++ b/dspace-services/src/test/resources/config/included.properties
@@ -0,0 +1,3 @@
+# This is used by Unit Tests to ensure included properties files works
+# See DSpaceConfigurationServiceTest.testGetPropertiesFromFile()
+prop.from.included.file = works
diff --git a/dspace-services/src/test/resources/config/local.properties b/dspace-services/src/test/resources/config/local.properties
index 88cc11cb27..92cb538046 100644
--- a/dspace-services/src/test/resources/config/local.properties
+++ b/dspace-services/src/test/resources/config/local.properties
@@ -2,6 +2,7 @@
# set the service manager into a testing mode
service.manager.developing = true
+
# a list of all extra spring configs we want the service manager to load on start
service.manager.spring.configs=spring/spring-test-services.xml,spring/spring-test-beans.xml
@@ -10,5 +11,21 @@ service.manager.spring.configs=spring/spring-test-services.xml,spring/spring-tes
testDynamicBean.property = WeLoveDSpace
# This is a setting with leading/trailing spaces. Used in Unit Tests to ensure values are trimmed
+#See DSpaceConfigurationServiceTest.testGetPropertiesFromFile()
prop.needing.trimmed = test
+# This setting is used in Unit Tests to ensure multi-line arrays are supported
+# See DSpaceConfigurationServiceTest.testGetArray()
+prop.multiline.array = line1
+prop.multiline.array = line2
+prop.multiline.array = line3
+
+# This setting is used in Unit Tests to ensure "include =" works to include other config files
+# See: https://commons.apache.org/proper/commons-configuration/userguide/howto_properties.html
+# See DSpaceConfigurationServiceTest.testGetPropertiesFromFile()
+include = included.properties
+
+# This setting is used by Unit Tests to check for automatic reloading
+# (We purposefully misspell DSpace and correct it in tests)
+# See DSpaceConfigurationServiceTest.testAutomaticReload()
+prop.to.auto.reload = D-space
diff --git a/dspace-services/src/test/resources/log4j.properties b/dspace-services/src/test/resources/log4j.properties
index f90d80b3ad..7dbc0a3bd0 100644
--- a/dspace-services/src/test/resources/log4j.properties
+++ b/dspace-services/src/test/resources/log4j.properties
@@ -1,7 +1,7 @@
log4j.rootCategory=info
log4j.rootLogger=info, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout=org.apache.logging.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.logging.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %p %m [%d] (%F:%L) %n
diff --git a/dspace-services/src/test/resources/spring/spring-test-beans.xml b/dspace-services/src/test/resources/spring/spring-test-beans.xml
index 1242cb5cee..ed53d7f8f4 100644
--- a/dspace-services/src/test/resources/spring/spring-test-beans.xml
+++ b/dspace-services/src/test/resources/spring/spring-test-beans.xml
@@ -10,11 +10,18 @@
-->
+ http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-2.5.xsd">
+
+
+
@@ -26,12 +33,10 @@
-
+
-
\ No newline at end of file
+
diff --git a/dspace-solr/pom.xml b/dspace-solr/pom.xml
index 42797d4740..0672ce9cbc 100644
--- a/dspace-solr/pom.xml
+++ b/dspace-solr/pom.xml
@@ -169,6 +169,14 @@
jetty-xmlorg.eclipse.jetty
+
+ org.apache.zookeeper
+ zookeeper
+
+
+ log4j
+ log4j
+
@@ -224,6 +232,10 @@
jetty-xmlorg.eclipse.jetty
+
+ log4j
+ log4j
+ org.apache.zookeeperzookeeper
@@ -231,31 +243,55 @@
+
+
+ org.apache.zookeeper
+ zookeeper
+ 3.4.6
+
+
+ log4j
+ log4j
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+
+
- org.slf4j
- jul-to-slf4j
- 1.7.14
+ org.apache.logging.log4j
+ log4j-jul
+ ${log4j.version}
- org.slf4j
- slf4j-log4j12
- runtime
+ org.apache.logging.log4j
+ log4j-api
- log4j
- log4j
- jar
-
-
- javax.servlet
- servlet-api
- provided
+ org.apache.logging.log4j
+ log4j-core
+
+ org.apache.logging.log4j
+ log4j-web
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ commons-loggingcommons-logging
+
+
+ javax.servlet
+ javax.servlet-api
+ provided
+
diff --git a/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java b/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java
deleted file mode 100644
index a177e2db32..0000000000
--- a/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * The contents of this file are subject to the license and copyright
- * detailed in the LICENSE and NOTICE files at the root of the source
- * tree and available online at
- *
- * http://www.dspace.org/license/
- */
-
-package org.dspace.solr.filters;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-
-import org.apache.log4j.Hierarchy;
-import org.apache.log4j.Level;
-import org.apache.log4j.PropertyConfigurator;
-import org.apache.log4j.helpers.Loader;
-import org.apache.log4j.spi.Configurator;
-import org.apache.log4j.spi.RootLogger;
-import org.apache.log4j.xml.DOMConfigurator;
-
-/**
- * Initialize Log4J at application startup.
- * This class mimics the default Log4J initialization procedure, except
- * that it is controlled by context parameters rather than system properties.
- *
- * @author Mark H. Wood
- */
-public class ConfigureLog4jListener
- implements ServletContextListener {
- public void contextInitialized(ServletContextEvent sce) {
- ServletContext ctx = sce.getServletContext();
-
- String logConfig = ctx.getInitParameter("log4j.configuration");
- if (null == logConfig) {
- logConfig = "log4j.properties";
- }
-
- URL configURL;
- try {
- configURL = new File(logConfig).toURI().toURL();
- } catch (MalformedURLException e) {
- configURL = Loader.getResource(logConfig);
- }
-
- if (null == configURL) {
- ctx.log("Log4J configuration not found. Left unconfigured.");
- return;
- } else {
- ctx.log(" In context " + ctx.getContextPath() +
- ", configuring Log4J from " + configURL.toExternalForm());
-
- String configuratorName = ctx.getInitParameter("log4j.configuratorClass");
- if (null != configuratorName) {
- Configurator configurator;
- try {
- configurator = (Configurator) Class.forName(configuratorName).newInstance();
- } catch (Exception ex) {
- ctx.log("Unable to load custom Log4J configuration class '"
- + configuratorName + "': " + ex.getMessage());
- return;
- }
-
- configurator.doConfigure(configURL, new Hierarchy(new RootLogger(Level.OFF)));
- } else if (configURL.getFile().endsWith(".xml")) {
- DOMConfigurator.configure(configURL);
- } else {
- PropertyConfigurator.configure(configURL);
- }
- }
- }
-
- public void contextDestroyed(ServletContextEvent sce) {
- // Nothing to be done
- }
-}
diff --git a/dspace-solr/src/main/webapp/WEB-INF/web.xml b/dspace-solr/src/main/webapp/WEB-INF/web.xml
index 67350c4dcc..fd5846a4b4 100644
--- a/dspace-solr/src/main/webapp/WEB-INF/web.xml
+++ b/dspace-solr/src/main/webapp/WEB-INF/web.xml
@@ -1,6 +1,4 @@
-
-
+
-
-
+ Solr home: configuration, cores etc.solr/home${dspace.dir}/solrjava.lang.String
-
+
- log4j.configuration
- ${dspace.dir}/config/log4j-solr.properties
- URL locating a Log4J configuration file (properties or XML).
+
+ URL locating a Log4J configuration file (properties or XML).
+
+ log4jConfiguration
+ ${dspace.dir}/config/log4j-solr.xml
+
+ org.apache.logging.log4j.web.Log4jServletContextListener
+
+
+
+ Activate logging
+ log4jServletFilter
+ org.apache.logging.log4j.web.Log4jServletFilter
+
+
LocalHostRestrictionFilter
@@ -83,6 +88,14 @@
-->
+
+ log4jServletFilter
+ /*
+ REQUEST
+ FORWARD
+ INCLUDE
+ ERROR
+ LocalHostRestrictionFilter
@@ -106,10 +119,6 @@
-
- org.dspace.solr.filters.ConfigureLog4jListener
-
-
Zookeeperorg.apache.solr.servlet.ZookeeperInfoServlet
diff --git a/dspace-spring-rest/pom.xml b/dspace-spring-rest/pom.xml
index 2bcda527d7..3ea878747b 100644
--- a/dspace-spring-rest/pom.xml
+++ b/dspace-spring-rest/pom.xml
@@ -181,25 +181,6 @@
org.springframework.bootspring-boot-starter-web${spring-boot.version}
-
-
-
- org.slf4j
- log4j-over-slf4j
-
-
- org.slf4j
- jul-to-slf4j
-
-
- ch.qos.logback
- logback-classic
-
- org.springframework.boot
@@ -245,16 +226,17 @@
test
-
-
- org.springframework.data
- spring-data-rest-hal-browser
- 2.5.7.RELEASE
-
-
-
+
+
+ org.springframework.data
+ spring-data-rest-hal-browser
+ 2.5.7.RELEASE
+
+
+
@@ -263,11 +245,14 @@
${spring-boot.version}
-
-
-
+
+ org.springframework.bootspring-boot-starter
+ ${spring-boot.version}org.springframework.boot
@@ -277,8 +262,9 @@
org.springframework.boot
- spring-boot-starter-log4j
- -->
+ spring-boot-starter-log4j2
+ ${spring-boot.version}
+
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java
index e60007d8ab..b387951f09 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java
@@ -17,7 +17,7 @@ import javax.ws.rs.core.Response;
import org.apache.catalina.connector.ClientAbortException;
import org.apache.commons.lang3.tuple.Pair;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.BitstreamRest;
import org.dspace.app.rest.utils.ContextUtil;
import org.dspace.app.rest.utils.MultipartFileSender;
@@ -57,7 +57,8 @@ import org.springframework.web.bind.annotation.RestController;
+ "/{uuid:[0-9a-fxA-FX]{8}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{12}}/content")
public class BitstreamContentRestController {
- private static final Logger log = Logger.getLogger(BitstreamContentRestController.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager
+ .getLogger(BitstreamContentRestController.class);
//Most file systems are configured to use block sizes of 4096 or 8192 and our buffer should be a multiple of that.
private static final int BUFFER_SIZE = 4096 * 10;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java
index 85c7a1e098..4afde3df07 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java
@@ -11,8 +11,9 @@ import java.util.Arrays;
import java.util.List;
import java.util.Objects;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.link.HalLinkService;
import org.dspace.app.rest.model.FacetConfigurationRest;
import org.dspace.app.rest.model.FacetResultsRest;
@@ -27,7 +28,6 @@ import org.dspace.app.rest.model.hateoas.SearchResultsResource;
import org.dspace.app.rest.model.hateoas.SearchSupportResource;
import org.dspace.app.rest.parameter.SearchFilter;
import org.dspace.app.rest.repository.DiscoveryRestRepository;
-import org.dspace.app.rest.utils.ScopeResolver;
import org.dspace.app.rest.utils.Utils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
@@ -47,7 +47,7 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/api/" + SearchResultsRest.CATEGORY)
public class DiscoveryRestController implements InitializingBean {
- private static final Logger log = Logger.getLogger(ScopeResolver.class);
+ private static final Logger log = LogManager.getLogger();
@Autowired
protected Utils utils;
@@ -109,7 +109,7 @@ public class DiscoveryRestController implements InitializingBean {
log.trace("Searching with scope: " + StringUtils.trimToEmpty(dsoScope)
+ ", configuration name: " + StringUtils.trimToEmpty(configurationName)
+ ", dsoType: " + StringUtils.trimToEmpty(dsoType)
- + ", query: " + StringUtils.trimToEmpty(dsoType)
+ + ", query: " + StringUtils.trimToEmpty(query)
+ ", filters: " + Objects.toString(searchFilters));
}
@@ -136,13 +136,14 @@ public class DiscoveryRestController implements InitializingBean {
log.trace("Searching with scope: " + StringUtils.trimToEmpty(dsoScope)
+ ", configuration name: " + StringUtils.trimToEmpty(configurationName)
+ ", dsoType: " + StringUtils.trimToEmpty(dsoType)
- + ", query: " + StringUtils.trimToEmpty(dsoType)
+ + ", query: " + StringUtils.trimToEmpty(query)
+ ", filters: " + Objects.toString(searchFilters)
+ ", page: " + Objects.toString(page));
}
//Get the Search results in JSON format
- SearchResultsRest searchResultsRest = discoveryRestRepository
+ SearchResultsRest searchResultsRest = null;
+ searchResultsRest = discoveryRestRepository
.getSearchObjects(query, dsoType, dsoScope, configurationName, searchFilters, page);
//Convert the Search JSON results to paginated HAL resources
@@ -181,7 +182,7 @@ public class DiscoveryRestController implements InitializingBean {
log.trace("Facetting on facet " + facetName + " with scope: " + StringUtils.trimToEmpty(dsoScope)
+ ", dsoType: " + StringUtils.trimToEmpty(dsoType)
+ ", prefix: " + StringUtils.trimToEmpty(prefix)
- + ", query: " + StringUtils.trimToEmpty(dsoType)
+ + ", query: " + StringUtils.trimToEmpty(query)
+ ", filters: " + Objects.toString(searchFilters)
+ ", page: " + Objects.toString(page));
}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java
index c9c5c86cda..231b47f2af 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java
@@ -28,7 +28,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.atteo.evo.inflector.English;
import org.dspace.app.rest.converter.JsonPatchConverter;
import org.dspace.app.rest.exception.PaginationException;
@@ -111,7 +111,7 @@ public class RestResourceController implements InitializingBean {
*/
private static final String REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT = "/{id:\\d+}";
- private static final Logger log = Logger.getLogger(RestResourceController.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RestResourceController.class);
@Autowired
DiscoverableEndpointsService discoverableEndpointsService;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java
index 76dbb6fce5..93eb7c3c55 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java
@@ -9,7 +9,8 @@ package org.dspace.app.rest;
import javax.servlet.http.HttpServletRequest;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.link.HalLinkService;
import org.dspace.app.rest.model.RootRest;
import org.dspace.app.rest.model.hateoas.RootResource;
@@ -40,7 +41,7 @@ public class RootRestResourceController {
@Autowired
RootRestRepository rootRestRepository;
- private static Logger log = Logger.getLogger(RootRestResourceController.class);
+ private static Logger log = LogManager.getLogger();
@RequestMapping(method = RequestMethod.GET)
public RootResource listDefinedEndpoint(HttpServletRequest request) {
@@ -51,4 +52,4 @@ public class RootRestResourceController {
return rootResource;
}
-}
\ No newline at end of file
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java
index 2e4031338a..a278ae313d 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java
@@ -7,7 +7,7 @@
*/
package org.dspace.app.rest.converter;
-import org.apache.commons.lang.NotImplementedException;
+import org.apache.commons.lang3.NotImplementedException;
import org.dspace.app.rest.model.AuthorityEntryRest;
import org.dspace.app.rest.utils.AuthorityUtils;
import org.dspace.content.authority.Choice;
@@ -36,6 +36,6 @@ public class AuthorityEntryRestConverter extends DSpaceConverter {
- private static final Logger log = Logger.getLogger(BrowseEntryConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BrowseEntryConverter.class);
@Override
public BrowseEntryRest convert(String[] source) {
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java
index c432064b86..a4c368d2b4 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java
@@ -13,7 +13,7 @@ import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.CollectionRest;
import org.dspace.app.rest.model.ResourcePolicyRest;
import org.dspace.app.rest.utils.ContextUtil;
@@ -38,7 +38,7 @@ import org.springframework.stereotype.Component;
public class CollectionConverter
extends DSpaceObjectConverter {
- private static final Logger log = Logger.getLogger(CollectionConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionConverter.class);
@Autowired
private BitstreamConverter bitstreamConverter;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java
index d33be1ff46..79e3234855 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java
@@ -10,7 +10,7 @@ package org.dspace.app.rest.converter;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.dspace.app.rest.model.SearchFacetEntryRest;
import org.dspace.app.rest.model.SearchFacetValueRest;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java
index 05632370f2..0e39d3a7fb 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java
@@ -11,7 +11,7 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.EPersonRest;
import org.dspace.app.rest.model.GroupRest;
import org.dspace.core.Context;
@@ -36,7 +36,7 @@ public class EPersonConverter extends DSpaceObjectConverter {
- private static final Logger log = Logger.getLogger(GroupConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(GroupConverter.class);
@Override
public GroupRest fromModel(Group obj) {
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java
index 4dcd745d02..ae7c3a602e 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java
@@ -12,7 +12,7 @@ import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.BitstreamRest;
import org.dspace.app.rest.model.ItemRest;
import org.dspace.app.rest.model.MetadataEntryRest;
@@ -48,7 +48,7 @@ public class ItemConverter extends DSpaceObjectConverter {
- private static final Logger log = Logger.getLogger(SubmissionDefinitionConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager
+ .getLogger(SubmissionDefinitionConverter.class);
@Autowired
private SubmissionSectionConverter panelConverter;
@@ -79,6 +80,6 @@ public class SubmissionDefinitionConverter extends DSpaceConverter {
- private static final Logger log = Logger.getLogger(SubmissionSectionConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionSectionConverter.class);
private SubmissionConfigReader submissionConfigReader;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java
index 89eae193dc..22cee05541 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java
@@ -10,8 +10,8 @@ package org.dspace.app.rest.converter;
import java.sql.SQLException;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.ErrorRest;
import org.dspace.app.rest.model.SubmissionDefinitionRest;
import org.dspace.app.rest.model.SubmissionSectionRest;
@@ -37,7 +37,7 @@ import org.springframework.stereotype.Component;
public class WorkspaceItemConverter
extends DSpaceConverter {
- private static final Logger log = Logger.getLogger(WorkspaceItemConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkspaceItemConverter.class);
@Autowired
private EPersonConverter epersonConverter;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/query/SearchQueryConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/query/SearchQueryConverter.java
index 5aff3adafd..4ea5e6f9df 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/query/SearchQueryConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/query/SearchQueryConverter.java
@@ -11,7 +11,7 @@ import java.util.LinkedList;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.model.query.RestSearchOperator;
import org.dspace.app.rest.parameter.SearchFilter;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java
index 161c0cf403..ac68d0ffdb 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java
@@ -38,6 +38,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExcep
*/
@ControllerAdvice
public class DSpaceApiExceptionControllerAdvice extends ResponseEntityExceptionHandler {
+
@Autowired
private RestAuthenticationService restAuthenticationService;
@@ -51,6 +52,12 @@ public class DSpaceApiExceptionControllerAdvice extends ResponseEntityExceptionH
}
}
+ @ExceptionHandler(IllegalArgumentException.class)
+ protected void handleIllegalArgumentException(HttpServletRequest request, HttpServletResponse response,
+ Exception ex) throws IOException {
+ sendErrorResponse(request, response, ex, ex.getMessage(), HttpServletResponse.SC_BAD_REQUEST);
+ }
+
@ExceptionHandler(SQLException.class)
protected void handleSQLException(HttpServletRequest request, HttpServletResponse response, Exception ex)
throws IOException {
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java
index 799623b7ff..2529d275ab 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java
@@ -16,7 +16,7 @@ import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.hateoas.EmbeddedPage;
import org.dspace.app.rest.model.hateoas.HALResource;
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
@ComponentScan
public class HalLinkService {
- private static final Logger log = Logger.getLogger(HalLinkService.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(HalLinkService.class);
@Autowired
private List halLinkFactories;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/relation/RelationshipHalLinkFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/relation/RelationshipHalLinkFactory.java
new file mode 100644
index 0000000000..9da50be395
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/relation/RelationshipHalLinkFactory.java
@@ -0,0 +1,47 @@
+/**
+ * The contents of this file are subject to the license and copyright
+ * detailed in the LICENSE and NOTICE files at the root of the source
+ * tree and available online at
+ *
+ * http://www.dspace.org/license/
+ */
+package org.dspace.app.rest.link.relation;
+
+import java.util.LinkedList;
+
+import org.atteo.evo.inflector.English;
+import org.dspace.app.rest.RestResourceController;
+import org.dspace.app.rest.link.HalLinkFactory;
+import org.dspace.app.rest.model.ItemRest;
+import org.dspace.app.rest.model.hateoas.RelationshipResource;
+import org.springframework.data.domain.Pageable;
+import org.springframework.hateoas.Link;
+import org.springframework.stereotype.Component;
+
+/**
+ * This class adds links to {@link org.dspace.app.rest.model.hateoas.RelationshipResource}s
+ * This builds a link to both items included in the relationship
+ */
+@Component
+public class RelationshipHalLinkFactory extends HalLinkFactory {
+ @Override
+ protected void addLinks(RelationshipResource halResource, Pageable pageable, LinkedList list)
+ throws Exception {
+
+ list.add(buildLink("leftItem", getMethodOn()
+ .findOne(ItemRest.CATEGORY, English.plural(ItemRest.NAME), halResource.getContent().getLeftId(), null)));
+
+ list.add(buildLink("rightItem", getMethodOn()
+ .findOne(ItemRest.CATEGORY, English.plural(ItemRest.NAME), halResource.getContent().getRightId(), null)));
+ }
+
+ @Override
+ protected Class getControllerClass() {
+ return RestResourceController.class;
+ }
+
+ @Override
+ protected Class getResourceClass() {
+ return RelationshipResource.class;
+ }
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/SearchFilter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/SearchFilter.java
index e2a352668d..7ebd5a6135 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/SearchFilter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/SearchFilter.java
@@ -7,7 +7,7 @@
*/
package org.dspace.app.rest.parameter;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
/**
* Custom request parameter used in the Discovery search REST endpoint.
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/resolver/SearchFilterResolver.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/resolver/SearchFilterResolver.java
index 20b30750f8..7607e7c19c 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/resolver/SearchFilterResolver.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/resolver/SearchFilterResolver.java
@@ -12,7 +12,7 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.parameter.SearchFilter;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AuthorityEntryLinkRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AuthorityEntryLinkRepository.java
index 9003c67b1d..e7f3f2f017 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AuthorityEntryLinkRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AuthorityEntryLinkRepository.java
@@ -13,7 +13,7 @@ import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.model.AuthorityEntryRest;
import org.dspace.app.rest.model.AuthorityRest;
import org.dspace.app.rest.model.hateoas.AuthorityEntryResource;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java
index a27ffbf2e4..c0faa41879 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java
@@ -15,7 +15,7 @@ import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import com.fasterxml.jackson.databind.JsonNode;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.exception.PatchBadRequestException;
import org.dspace.app.rest.exception.RESTAuthorizationException;
import org.dspace.app.rest.exception.RepositoryMethodNotImplementedException;
@@ -45,7 +45,7 @@ public abstract class DSpaceRestRepository {
- private static final Logger log = Logger.getLogger(DSpaceRestRepository.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceRestRepository.class);
//Trick to make inner-calls to ourselves that are checked by Spring security
//See:
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java
index 4ccfc51ae6..ec73a24e2c 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java
@@ -9,7 +9,10 @@ package org.dspace.app.rest.repository;
import java.util.List;
-import org.apache.log4j.Logger;
+import javax.ws.rs.BadRequestException;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.converter.DiscoverConfigurationConverter;
import org.dspace.app.rest.converter.DiscoverFacetConfigurationConverter;
import org.dspace.app.rest.converter.DiscoverFacetResultsConverter;
@@ -46,7 +49,7 @@ import org.springframework.stereotype.Component;
@Component(SearchResultsRest.CATEGORY + "." + SearchResultsRest.NAME)
public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
- private static final Logger log = Logger.getLogger(ScopeResolver.class);
+ private static final Logger log = LogManager.getLogger();
@Autowired
private DiscoveryConfigurationService searchConfigurationService;
@@ -91,7 +94,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
public SearchResultsRest getSearchObjects(final String query, final String dsoType, final String dsoScope,
final String configurationName,
final List searchFilters, final Pageable page)
- throws InvalidRequestException {
+ throws InvalidRequestException, BadRequestException {
Context context = obtainContext();
DSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
@@ -108,6 +111,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
} catch (SearchServiceException e) {
log.error("Error while searching with Discovery", e);
+ throw new IllegalArgumentException("Error while searching with Discovery: " + e.getMessage());
}
return discoverResultConverter
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java
index 63392a684f..721e4c6313 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java
@@ -16,7 +16,7 @@ import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.Parameter;
import org.dspace.app.rest.SearchRestMethod;
import org.dspace.app.rest.converter.EPersonConverter;
@@ -269,4 +269,4 @@ public class EPersonRestRepository extends DSpaceRestRepository
implements LinkRestRepository {
- private static final Logger log = Logger.getLogger(SubmissionUploadRestRepository.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager
+ .getLogger(SubmissionUploadRestRepository.class);
private SubmissionConfigReader submissionConfigReader;
@@ -141,4 +142,4 @@ public class SubmissionUploadRestRepository extends DSpaceRestRepository {
/**
* log4j category
*/
- private static final Logger log = Logger.getLogger(AbstractDSpaceObjectBuilder.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractDSpaceObjectBuilder.class);
protected AbstractBuilder(Context context) {
this.context = context;
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java
index 9d1322bcb4..f74d09adfc 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java
@@ -9,7 +9,7 @@ package org.dspace.app.rest.builder;
import java.util.Date;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.ResourcePolicy;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
@@ -34,7 +34,7 @@ public abstract class AbstractDSpaceObjectBuilder
extends AbstractBuilder {
/* Log4j logger*/
- private static final Logger log = Logger.getLogger(AbstractDSpaceObjectBuilder.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractDSpaceObjectBuilder.class);
protected AbstractDSpaceObjectBuilder(Context context) {
super(context);
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java
index ddca4e622a..b0d169bfb8 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java
@@ -9,7 +9,7 @@ package org.dspace.app.rest.builder;
import java.sql.SQLException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.BitstreamFormat;
import org.dspace.core.Context;
@@ -22,7 +22,7 @@ import org.dspace.service.DSpaceCRUDService;
public class BitstreamFormatBuilder extends AbstractCRUDBuilder {
/* Log4j logger*/
- private static final Logger log = Logger.getLogger(BitstreamFormatBuilder.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamFormatBuilder.class);
private BitstreamFormat bitstreamFormat;
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java
index d14630b90b..8ac3876bb3 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java
@@ -16,7 +16,7 @@ import org.apache.commons.lang3.CharEncoding;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Collection;
import org.dspace.content.Community;
-import org.dspace.content.MetadataSchema;
+import org.dspace.content.MetadataSchemaEnum;
import org.dspace.content.service.DSpaceObjectService;
import org.dspace.core.Context;
@@ -50,7 +50,7 @@ public class CollectionBuilder extends AbstractDSpaceObjectBuilder {
}
public CollectionBuilder withName(final String name) {
- return setMetadataSingleValue(collection, MetadataSchema.DC_SCHEMA, "title", null, name);
+ return setMetadataSingleValue(collection, MetadataSchemaEnum.DC.getName(), "title", null, name);
}
public CollectionBuilder withLogo(final String content) throws AuthorizeException, IOException, SQLException {
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/CommunityBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/CommunityBuilder.java
index 1cf9ba74cb..a517d71f2a 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/CommunityBuilder.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/CommunityBuilder.java
@@ -15,7 +15,7 @@ import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.CharEncoding;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Community;
-import org.dspace.content.MetadataSchema;
+import org.dspace.content.MetadataSchemaEnum;
import org.dspace.content.service.DSpaceObjectService;
import org.dspace.core.Context;
@@ -59,7 +59,7 @@ public class CommunityBuilder extends AbstractDSpaceObjectBuilder {
}
public CommunityBuilder withName(final String communityName) {
- return setMetadataSingleValue(community, MetadataSchema.DC_SCHEMA, "title", null, communityName);
+ return setMetadataSingleValue(community, MetadataSchemaEnum.DC.getName(), "title", null, communityName);
}
public CommunityBuilder withLogo(String content) throws AuthorizeException, IOException, SQLException {
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/ItemBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/ItemBuilder.java
index cf498cf0fb..b2127100e3 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/ItemBuilder.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/ItemBuilder.java
@@ -10,7 +10,7 @@ package org.dspace.app.rest.builder;
import org.dspace.content.Collection;
import org.dspace.content.DCDate;
import org.dspace.content.Item;
-import org.dspace.content.MetadataSchema;
+import org.dspace.content.MetadataSchemaEnum;
import org.dspace.content.WorkspaceItem;
import org.dspace.content.service.DSpaceObjectService;
import org.dspace.core.Context;
@@ -52,19 +52,20 @@ public class ItemBuilder extends AbstractDSpaceObjectBuilder {
}
public ItemBuilder withTitle(final String title) {
- return setMetadataSingleValue(item, MetadataSchema.DC_SCHEMA, "title", null, title);
+ return setMetadataSingleValue(item, MetadataSchemaEnum.DC.getName(), "title", null, title);
}
public ItemBuilder withIssueDate(final String issueDate) {
- return addMetadataValue(item, MetadataSchema.DC_SCHEMA, "date", "issued", new DCDate(issueDate).toString());
+ return addMetadataValue(item, MetadataSchemaEnum.DC.getName(),
+ "date", "issued", new DCDate(issueDate).toString());
}
public ItemBuilder withAuthor(final String authorName) {
- return addMetadataValue(item, MetadataSchema.DC_SCHEMA, "contributor", "author", authorName);
+ return addMetadataValue(item, MetadataSchemaEnum.DC.getName(), "contributor", "author", authorName);
}
public ItemBuilder withSubject(final String subject) {
- return addMetadataValue(item, MetadataSchema.DC_SCHEMA, "subject", null, subject);
+ return addMetadataValue(item, MetadataSchemaEnum.DC.getName(), "subject", null, subject);
}
public ItemBuilder withRelationshipType(final String relationshipType) {
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java
index 42f9c10752..061e5f7c0d 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java
@@ -10,7 +10,7 @@ package org.dspace.app.rest.builder;
import java.io.IOException;
import java.sql.SQLException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.MetadataField;
import org.dspace.content.MetadataSchema;
@@ -22,7 +22,7 @@ import org.dspace.discovery.SearchServiceException;
public class MetadataFieldBuilder extends AbstractBuilder {
/* Log4j logger*/
- private static final Logger log = Logger.getLogger(MetadataFieldBuilder.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataFieldBuilder.class);
private MetadataField metadataField;
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java
index 5b42f0b24a..3f060accc4 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java
@@ -9,7 +9,7 @@ package org.dspace.app.rest.builder;
import java.sql.SQLException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.MetadataSchema;
import org.dspace.content.NonUniqueMetadataException;
@@ -20,7 +20,7 @@ import org.dspace.discovery.SearchServiceException;
public class MetadataSchemaBuilder extends AbstractBuilder {
/* Log4j logger*/
- private static final Logger log = Logger.getLogger(MetadataSchemaBuilder.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataSchemaBuilder.class);
private MetadataSchema metadataSchema;
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java
index 4d73d23b19..ce71acac3e 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java
@@ -14,7 +14,7 @@ import org.dspace.content.Collection;
import org.dspace.content.DCDate;
import org.dspace.content.Item;
import org.dspace.content.LicenseUtils;
-import org.dspace.content.MetadataSchema;
+import org.dspace.content.MetadataSchemaEnum;
import org.dspace.content.WorkspaceItem;
import org.dspace.content.service.WorkspaceItemService;
import org.dspace.core.Context;
@@ -101,19 +101,19 @@ public class WorkspaceItemBuilder extends AbstractBuilder relationshipTypeList = relationshipTypeService.findAll(context);
+ List entityTypeList = entityTypeService.findAll(context);
+ List relationships = relationshipService.findAll(context);
+ Iterator itemIterator = itemService.findAll(context);
+
+ Iterator relationshipIterator = relationships.iterator();
+ while (relationshipIterator.hasNext()) {
+ Relationship relationship = relationshipIterator.next();
+ relationshipIterator.remove();
+ relationshipService.delete(context, relationship);
+ }
+
+ Iterator relationshipTypeIterator = relationshipTypeList.iterator();
+ while (relationshipTypeIterator.hasNext()) {
+ RelationshipType relationshipType = relationshipTypeIterator.next();
+ relationshipTypeIterator.remove();
+ relationshipTypeService.delete(context, relationshipType);
+ }
+
+ Iterator entityTypeIterator = entityTypeList.iterator();
+ while (entityTypeIterator.hasNext()) {
+ EntityType entityType = entityTypeIterator.next();
+ entityTypeIterator.remove();
+ entityTypeService.delete(context, entityType);
+ }
+
+ while (itemIterator.hasNext()) {
+ Item item = itemIterator.next();
+ itemIterator.remove();
+ itemService.delete(context, item);
+ }
+
+ super.destroy();
+ }
+
+ @Test
+ public void createRelationshipsWithCsvImportTest() throws Exception {
+ context.turnOffAuthorisationSystem();
+
+ parentCommunity = CommunityBuilder.createCommunity(context)
+ .withName("Parent Community")
+ .build();
+ Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity)
+ .withName("Sub Community")
+ .build();
+ Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build();
+ Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build();
+ Collection col3 = CollectionBuilder.createCollection(context, child1).withName("OrgUnits").build();
+
+ Item article = ItemBuilder.createItem(context, col1)
+ .withTitle("Article")
+ .withIssueDate("2017-10-17")
+ .withRelationshipType("Publication")
+ .build();
+
+ Item itemB = validateSpecificItemRelationCreationCsvImport(col1, article, "TestItemB", "Person",
+ "isPublicationOfAuthor",
+ "Relationship list size is 1", 1, 1, 1);
+ Item itemC = validateSpecificItemRelationCreationCsvImport(col1, article, "TestItemC", "Person",
+ "isPublicationOfAuthor",
+ "Relationship list size is 1", 1, 2, 1);
+ Item itemD = validateSpecificItemRelationCreationCsvImport(col1, article, "TestItemD", "Project",
+ "isPublicationOfProject",
+ "Relationship list size is 1", 1, 1, 1);
+ Item itemE = validateSpecificItemRelationCreationCsvImportMultiple(col1, "TestItemE", "Publication",
+ "isAuthorOfPublication",
+ "Relationship list size is 2", 2, 1, 2,
+ itemC, itemB);
+
+ List relationships = relationshipService.findByItem(context, itemE);
+ getClient().perform(get("/api/core/relationships/" + relationships.get(0).getID()))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.leftPlace", is(1)))
+ .andExpect(jsonPath("$.rightId", is(itemC.getID().toString())))
+ .andExpect(jsonPath("$.rightPlace", is(2)))
+ .andExpect(jsonPath("$", Matchers.is(RelationshipMatcher.matchRelationship(relationships.get(0)))));
+ getClient().perform(get("/api/core/relationships/" + relationships.get(1).getID().toString()))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.leftPlace", is(2)))
+ .andExpect(jsonPath("$.rightId", is(itemB.getID().toString())))
+ .andExpect(jsonPath("$.rightPlace", is(2)))
+ .andExpect(jsonPath("$", Matchers.is(RelationshipMatcher.matchRelationship(relationships.get(1)))));
+
+ Item itemF = validateSpecificItemRelationCreationCsvImport(col1, itemE, "TestItemF", "Person",
+ "isPublicationOfAuthor",
+ "Relationship list size is 1", 1, 3, 1);
+
+ UpdateItemEToDeleteRelationshipToC(itemE, itemB, itemF, col1, "TestItemE");
+
+ getClient().perform(get("/api/core/items/" + itemE.getID())).andExpect(status().isOk());
+
+ assertItemERelationships(itemB, itemE, itemF);
+
+ updateArticleItemToAddAnotherRelationship(col1, article, itemB, itemC, itemF);
+
+ getClient().perform(get("/api/core/items/" + article.getID())).andExpect(status().isOk());
+
+ assertArticleRelationships(article, itemB, itemC, itemF);
+
+ }
+
+ private void assertItemERelationships(Item itemB, Item itemE, Item itemF) throws SQLException {
+ List relationshipsForItemE = relationshipService.findByItem(context, itemE);
+ assertThat(relationshipsForItemE.size(), is(2));
+ assertThat(relationshipsForItemE.get(0).getRightItem(), is(itemF));
+ assertThat(relationshipsForItemE.get(1).getRightItem(), is(itemB));
+ }
+
+ private void assertArticleRelationships(Item article, Item itemB, Item itemC, Item itemF) throws SQLException {
+ List relationshipsForArticle = relationshipService
+ .findByItemAndRelationshipType(context, article, relationshipTypeService
+ .findByLeftOrRightLabel(context,"isPublicationOfAuthor").get(0));
+ assertThat(relationshipsForArticle.size(), is(3));
+ List expectedRelationshipsItemsForArticle = new ArrayList<>();
+ expectedRelationshipsItemsForArticle.add(itemC);
+ expectedRelationshipsItemsForArticle.add(itemF);
+ expectedRelationshipsItemsForArticle.add(itemB);
+
+ List actualRelationshipsItemsForArticle = new ArrayList<>();
+ for (Relationship relationship : relationshipsForArticle) {
+ if (relationship.getLeftItem().getID() == article.getID()) {
+ actualRelationshipsItemsForArticle.add(relationship.getLeftItem());
+ } else {
+ actualRelationshipsItemsForArticle.add(relationship.getRightItem());
+ }
+ }
+ assertThat(true, Matchers.is(actualRelationshipsItemsForArticle
+ .containsAll(expectedRelationshipsItemsForArticle)));
+ }
+
+ private void updateArticleItemToAddAnotherRelationship(Collection col1, Item article, Item itemB, Item itemC,
+ Item itemF) throws Exception {
+ String csvLineString = article.getID().toString() + "," + col1
+ .getHandle() + "," + "Article" + "," + "Publication" + "," +
+ itemB.getID().toString() + "||" + itemC.getID().toString() + "||" + itemF
+ .getID().toString();
+ String[] csv = {"id,collection,dc.title,relationship.type,relation." + "isAuthorOfPublication", csvLineString};
+ performImportScript(csv);
+ }
+
+ private void UpdateItemEToDeleteRelationshipToC(Item itemE, Item itemB, Item itemF, Collection owningCollection,
+ String title) throws Exception {
+ String csvLineString = itemE.getID().toString() + "," + owningCollection
+ .getHandle() + "," + title + "," + "Person" + "," + itemB.getID().toString() + "||" + itemF.getID()
+ .toString();
+ String[] csv = {"id,collection,dc.title,relationship.type,relation." + "isAuthorOfPublication", csvLineString};
+ performImportScript(csv);
+
+ }
+
+ private Item validateSpecificItemRelationCreationCsvImport(Collection col1, Item relatedItem, String itemTitle,
+ String relationshipType,
+ String relationshipTypeLabel,
+ String reasonAssertCheck, Integer sizeToCheck,
+ Integer leftPlaceToCheck,
+ Integer rightPlaceToCheck) throws Exception {
+ String csvLineString = "+," + col1.getHandle() + "," + itemTitle + "," + relationshipType + "," + relatedItem
+ .getID().toString();
+ String[] csv = {"id,collection,dc.title,relationship.type,relation." + relationshipTypeLabel, csvLineString};
+ performImportScript(csv);
+ Iterator itemIteratorItem = itemService.findByMetadataField(context, "dc", "title", null, itemTitle);
+ Item item = itemIteratorItem.next();
+
+ List relationships = relationshipService.findByItem(context, item);
+ assertThat(reasonAssertCheck, relationships.size(), equalTo(sizeToCheck));
+ getClient().perform(get("/api/core/items/" + item.getID())).andExpect(status().isOk());
+ getClient().perform(get("/api/core/relationships/" + relationships.get(0).getID()))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.leftPlace", is(leftPlaceToCheck)))
+ .andExpect(jsonPath("$.rightPlace", is(rightPlaceToCheck)))
+ .andExpect(jsonPath("$", Matchers.is(RelationshipMatcher.matchRelationship(relationships.get(0)))));
+
+ return item;
+ }
+
+ private Item validateSpecificItemRelationCreationCsvImportMultiple(Collection col1, String itemTitle,
+ String relationshipType,
+ String relationshipTypeLabel,
+ String reasonAssertCheck, Integer sizeToCheck,
+ Integer leftPlaceToCheck,
+ Integer rightPlaceToCheck, Item... relatedItem)
+ throws Exception {
+ String idStringRelatedItems = "";
+ for (Item item : relatedItem) {
+ idStringRelatedItems += item.getID().toString();
+ idStringRelatedItems += "||";
+ }
+ idStringRelatedItems = idStringRelatedItems.substring(0, idStringRelatedItems.length() - 2);
+ String csvLineString = "+," + col1
+ .getHandle() + "," + itemTitle + "," + relationshipType + "," + idStringRelatedItems;
+ String[] csv = {"id,collection,dc.title,relationship.type,relation." + relationshipTypeLabel, csvLineString};
+ performImportScript(csv);
+ Iterator itemIteratorItem = itemService.findByMetadataField(context, "dc", "title", null, itemTitle);
+ Item item = itemIteratorItem.next();
+
+
+ return item;
+ }
+
+ private void performImportScript(String[] csv) throws Exception {
+ String filename = "test.csv";
+ BufferedWriter out = new BufferedWriter(
+ new OutputStreamWriter(
+ new FileOutputStream(filename), "UTF-8"));
+ for (String csvLine : csv) {
+ out.write(csvLine + "\n");
+ }
+ out.flush();
+ out.close();
+ out = null;
+
+ runDSpaceScript("metadata-import", "-f", "test.csv", "-e", "admin@email.com", "-s");
+ }
+}
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java
index 75a930aa61..a67f747b62 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java
@@ -23,6 +23,7 @@ import com.nimbusds.jwt.SignedJWT;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.service.EPersonService;
+import org.dspace.service.ClientInfoService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -62,6 +63,9 @@ public class JWTTokenHandlerTest {
@Mock
private EPersonClaimProvider ePersonClaimProvider;
+ @Mock
+ private ClientInfoService clientInfoService;
+
@Spy
private List jwtClaimProviders = new ArrayList<>();
@@ -71,6 +75,7 @@ public class JWTTokenHandlerTest {
when(ePerson.getSessionSalt()).thenReturn("01234567890123456789012345678901");
when(ePerson.getLastActive()).thenReturn(new Date());
when(context.getCurrentUser()).thenReturn(ePerson);
+ when(clientInfoService.getClientIp(any())).thenReturn("123.123.123.123");
when(ePersonClaimProvider.getKey()).thenReturn("eid");
when(ePersonClaimProvider.getValue(any(), Mockito.any(HttpServletRequest.class))).thenReturn("epersonID");
jwtClaimProviders.add(ePersonClaimProvider);
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java
index f0674e4251..9d4e599283 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java
@@ -19,7 +19,7 @@ import javax.servlet.Filter;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.Charsets;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.Application;
import org.dspace.app.rest.model.patch.Operation;
import org.dspace.app.rest.security.MethodSecurityConfig;
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java
index 3f129b5528..6854f0a225 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java
@@ -15,7 +15,8 @@ import java.sql.SQLException;
import java.util.Properties;
import java.util.TimeZone;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.builder.AbstractBuilder;
import org.dspace.servicemanager.DSpaceKernelImpl;
import org.dspace.servicemanager.DSpaceKernelInit;
@@ -30,7 +31,8 @@ public class AbstractDSpaceIntegrationTest {
/**
* log4j category
*/
- private static final Logger log = Logger.getLogger(AbstractDSpaceIntegrationTest.class);
+ private static final Logger log = LogManager
+ .getLogger(AbstractDSpaceIntegrationTest.class);
/**
* Test properties. These configure our general test environment
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java
index 7c38a89f4d..6f6ee8519a 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java
@@ -12,7 +12,8 @@ import static org.junit.Assert.fail;
import java.sql.SQLException;
import java.util.Arrays;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.launcher.ScriptLauncher;
import org.dspace.app.rest.builder.AbstractBuilder;
import org.dspace.authorize.AuthorizeException;
@@ -37,7 +38,8 @@ public class AbstractIntegrationTestWithDatabase extends AbstractDSpaceIntegrati
/**
* log4j category
*/
- private static final Logger log = Logger.getLogger(AbstractIntegrationTestWithDatabase.class);
+ private static final Logger log = LogManager
+ .getLogger(AbstractIntegrationTestWithDatabase.class);
/**
* Context mock object to use in the tests.
diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java
index 629e5fd1ef..c2665f4145 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java
@@ -21,7 +21,7 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.CharEncoding;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.junit.After;
import org.junit.Before;
@@ -41,7 +41,7 @@ public class MultipartFileSenderTest {
/**
* log4j category
*/
- private static final Logger log = Logger.getLogger(MultipartFileSenderTest.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MultipartFileSenderTest.class);
private InputStream is;
private String mimeType;
diff --git a/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java b/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java
index e5e62e25df..a71d33b82e 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java
@@ -13,7 +13,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
@@ -25,7 +25,7 @@ import org.dspace.app.rest.test.AbstractDSpaceIntegrationTest;
*/
public class MockSolrServer {
- private static final Logger log = Logger.getLogger(MockSolrServer.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MockSolrServer.class);
private static final ConcurrentMap loadedCores = new ConcurrentHashMap<>();
private static final ConcurrentMap usersPerCore = new ConcurrentHashMap<>();
private static CoreContainer container = null;
diff --git a/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java b/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java
index 543146ff36..8cb60ae780 100644
--- a/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java
+++ b/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java
@@ -42,7 +42,6 @@ public class MockSolrLoggerServiceImpl
File locationDb = new File(locationDbPath);
locationDb.createNewFile();
locationService = new DatabaseReader.Builder(locationDb).build();
- useProxies = configurationService.getBooleanProperty("useProxies");
}
@Override
diff --git a/dspace-spring-rest/src/test/resources/log4j.properties b/dspace-spring-rest/src/test/resources/log4j.properties
index 2500bc47ea..b982e8bd74 100644
--- a/dspace-spring-rest/src/test/resources/log4j.properties
+++ b/dspace-spring-rest/src/test/resources/log4j.properties
@@ -19,10 +19,10 @@
log4j.rootCategory=INFO, A1
# A1 is set to be a ConsoleAppender.
-log4j.appender.A1=org.apache.log4j.ConsoleAppender
+log4j.appender.A1=org.apache.logging.log4j.ConsoleAppender
# A1 uses PatternLayout.
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n
###########################################################################
@@ -40,9 +40,9 @@ log4j.logger.org.dspace.servicemanager=ERROR
log4j.logger.org.dspace.providers=ERROR
log4j.logger.org.dspace.utils=ERROR
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout=org.apache.logging.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout=org.apache.logging.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
#
# Root logger option
diff --git a/dspace-sword/pom.xml b/dspace-sword/pom.xml
index fb26286f27..63f149e01f 100644
--- a/dspace-sword/pom.xml
+++ b/dspace-sword/pom.xml
@@ -112,7 +112,7 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
@@ -120,24 +120,20 @@
junittest
+
- log4j
- log4j
-
-
- jmxtools
- com.sun.jdmk
-
-
- jms
- javax.jms
-
-
- jmxri
- com.sun.jmx
-
-
+ org.apache.logging.log4j
+ log4j-api
+
+ org.apache.logging.log4j
+ log4j-core
+
+
+ org.apache.logging.log4j
+ log4j-web
+
+
xomxom
diff --git a/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java
index 3ce38aec47..14e65d81e1 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java
@@ -10,7 +10,7 @@ package org.dspace.sword;
import java.sql.SQLException;
import java.util.List;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Bitstream;
import org.dspace.content.BitstreamFormat;
import org.dspace.content.Bundle;
@@ -33,7 +33,7 @@ public class BitstreamEntryGenerator extends DSpaceATOMEntry {
/**
* logger
*/
- private static Logger log = Logger.getLogger(BitstreamEntryGenerator.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamEntryGenerator.class);
/**
* Create a new ATOM Entry generator which can provide a SWORD Entry for
diff --git a/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java
index d2cf664d5c..6c0927f016 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java
@@ -10,7 +10,7 @@ package org.dspace.sword;
import java.util.List;
import java.util.Map;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.DSpaceObject;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CollectionService;
@@ -26,7 +26,7 @@ public class CollectionCollectionGenerator extends ATOMCollectionGenerator {
* logger
*/
private static Logger log =
- Logger.getLogger(CollectionCollectionGenerator.class);
+ org.apache.logging.log4j.LogManager.getLogger(CollectionCollectionGenerator.class);
protected CollectionService collectionService =
ContentServiceFactory.getInstance().getCollectionService();
diff --git a/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java b/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java
index 5082e96511..98018ee811 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java
@@ -12,7 +12,7 @@ import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Bitstream;
import org.dspace.content.BitstreamFormat;
@@ -40,7 +40,7 @@ public class CollectionDepositor extends Depositor {
/**
* logger
*/
- private static Logger log = Logger.getLogger(CollectionDepositor.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionDepositor.class);
protected ItemService itemService =
ContentServiceFactory.getInstance().getItemService();
diff --git a/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java b/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java
index d2ff871a72..caa9a1fdca 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java
@@ -11,7 +11,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.sql.SQLException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Collection;
import org.dspace.content.DSpaceObject;
import org.dspace.core.ConfigurationManager;
@@ -30,7 +30,7 @@ public class CollectionLocation {
/**
* Log4j logger
*/
- public static final Logger log = Logger.getLogger(CollectionLocation.class);
+ public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionLocation.class);
protected HandleService handleService = HandleServiceFactory.getInstance()
.getHandleService();
diff --git a/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java
index a2fba088f1..1d8caa5d16 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java
@@ -9,8 +9,9 @@ package org.dspace.sword;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Community;
import org.dspace.content.DSpaceObject;
import org.dspace.content.MetadataValue;
@@ -19,8 +20,7 @@ import org.dspace.content.service.CommunityService;
import org.purl.sword.base.Collection;
public class CommunityCollectionGenerator extends ATOMCollectionGenerator {
- private static Logger log = Logger
- .getLogger(CommunityCollectionGenerator.class);
+ private static Logger log = LogManager.getLogger(CommunityCollectionGenerator.class);
protected CommunityService communityService = ContentServiceFactory
.getInstance().getCommunityService();
diff --git a/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java b/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java
index d742bc1eae..ee6b430278 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java
@@ -7,7 +7,7 @@
*/
package org.dspace.sword;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.core.Context;
import org.dspace.core.LogManager;
import org.purl.sword.base.AtomDocumentRequest;
@@ -33,7 +33,7 @@ public class DSpaceSWORDServer implements SWORDServer {
/**
* Log4j logger
*/
- public static final Logger log = Logger.getLogger(DSpaceSWORDServer.class);
+ public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceSWORDServer.class);
// methods required by SWORDServer interface
////////////////////////////////////////////
diff --git a/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java b/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java
index 78f08dd99a..7535302139 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java
@@ -20,8 +20,8 @@ import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Date;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Collection;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
@@ -46,7 +46,7 @@ public class DepositManager {
/**
* Log4j logger
*/
- public static final Logger log = Logger.getLogger(DepositManager.class);
+ public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DepositManager.class);
/**
* The SWORD service implementation
diff --git a/dspace-sword/src/main/java/org/dspace/sword/ItemCollectionGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/ItemCollectionGenerator.java
index 1b1ade604f..0596e534b7 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/ItemCollectionGenerator.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/ItemCollectionGenerator.java
@@ -9,7 +9,7 @@ package org.dspace.sword;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.content.DSpaceObject;
import org.dspace.content.Item;
import org.dspace.content.MetadataValue;
diff --git a/dspace-sword/src/main/java/org/dspace/sword/ItemDepositor.java b/dspace-sword/src/main/java/org/dspace/sword/ItemDepositor.java
index e174a9ec2c..da99cfcc36 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/ItemDepositor.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/ItemDepositor.java
@@ -13,7 +13,7 @@ import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Bitstream;
import org.dspace.content.BitstreamFormat;
diff --git a/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java
index 73ca67fc3e..da7dcead4c 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java
@@ -10,8 +10,8 @@ package org.dspace.sword;
import java.sql.SQLException;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Bitstream;
import org.dspace.content.BitstreamFormat;
import org.dspace.content.Bundle;
@@ -40,7 +40,7 @@ public class ItemEntryGenerator extends DSpaceATOMEntry {
/**
* logger
*/
- private static Logger log = Logger.getLogger(ItemEntryGenerator.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemEntryGenerator.class);
protected HandleService handleService = HandleServiceFactory.getInstance()
.getHandleService();
diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java
index 4497532c25..ec46ab8f22 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java
@@ -12,7 +12,7 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authenticate.AuthenticationMethod;
import org.dspace.authenticate.factory.AuthenticateServiceFactory;
import org.dspace.authenticate.service.AuthenticationService;
@@ -53,7 +53,7 @@ public class SWORDAuthenticator {
/**
* logger
*/
- private static Logger log = Logger.getLogger(SWORDAuthenticator.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDAuthenticator.class);
protected AuthenticationService authenticationService =
AuthenticateServiceFactory.getInstance().getAuthenticationService();
diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java
index ad52eba956..0bc12934ca 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java
@@ -13,7 +13,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.BitstreamFormat;
import org.dspace.content.Collection;
import org.dspace.content.DSpaceObject;
@@ -44,7 +44,7 @@ public class SWORDConfiguration {
/**
* logger
*/
- public static final Logger log = Logger.getLogger(SWORDConfiguration.class);
+ public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDConfiguration.class);
protected BitstreamFormatService bitstreamFormatService = ContentServiceFactory
.getInstance().getBitstreamFormatService();
diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java
index d734256501..6d7ca18367 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java
@@ -12,7 +12,7 @@ import java.sql.SQLException;
import java.util.Date;
import java.util.StringTokenizer;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Collection;
import org.dspace.content.DCDate;
import org.dspace.content.DSpaceObject;
@@ -38,7 +38,7 @@ public class SWORDMETSIngester implements SWORDIngester {
/**
* Log4j logger
*/
- public static final Logger log = Logger.getLogger(SWORDMETSIngester.class);
+ public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDMETSIngester.class);
/* (non-Javadoc)
* @see org.dspace.sword.SWORDIngester#ingest(org.dspace.core.Context, org.purl.sword.base.Deposit)
diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java
index 6bb30e2f23..a84289a934 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java
@@ -12,7 +12,7 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.BitstreamFormat;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.BitstreamFormatService;
@@ -33,7 +33,7 @@ public class SWORDService {
/**
* Log4j logging instance
*/
- public static final Logger log = Logger.getLogger(SWORDService.class);
+ public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDService.class);
protected BitstreamFormatService bitstreamFormatService = ContentServiceFactory
.getInstance().getBitstreamFormatService();
diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDUrlManager.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDUrlManager.java
index ab0409c9e5..2a6ce92761 100644
--- a/dspace-sword/src/main/java/org/dspace/sword/SWORDUrlManager.java
+++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDUrlManager.java
@@ -12,7 +12,7 @@ import java.net.URL;
import java.sql.SQLException;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Collection;
diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Content.java b/dspace-sword/src/main/java/org/purl/sword/atom/Content.java
index 35e4bcf0ce..418fa6549e 100644
--- a/dspace-sword/src/main/java/org/purl/sword/atom/Content.java
+++ b/dspace-sword/src/main/java/org/purl/sword/atom/Content.java
@@ -13,7 +13,7 @@ import java.util.Properties;
import nu.xom.Attribute;
import nu.xom.Element;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.base.Namespaces;
import org.purl.sword.base.SwordElementInterface;
import org.purl.sword.base.SwordValidationInfo;
@@ -51,7 +51,7 @@ public class Content extends XmlElement implements SwordElementInterface {
/**
* The log.
*/
- private static Logger log = Logger.getLogger(Content.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Content.class);
/**
*
diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java b/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java
index 09ceb31dc5..7f09d80412 100644
--- a/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java
+++ b/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java
@@ -14,7 +14,7 @@ import java.util.Properties;
import nu.xom.Element;
import nu.xom.Elements;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.base.HttpHeaders;
import org.purl.sword.base.Namespaces;
import org.purl.sword.base.SwordElementInterface;
@@ -143,7 +143,7 @@ public class Entry extends XmlElement implements SwordElementInterface {
/**
* The log.
*/
- private static Logger log = Logger.getLogger(Entry.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Entry.class);
/**
* The prefix, local name and namespace used for this element.
diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java b/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java
index 8f28b8589a..128d39b210 100644
--- a/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java
+++ b/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java
@@ -13,7 +13,7 @@ import java.util.Properties;
import nu.xom.Attribute;
import nu.xom.Element;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.base.Namespaces;
import org.purl.sword.base.SwordElementInterface;
import org.purl.sword.base.SwordValidationInfo;
@@ -62,7 +62,7 @@ public class Generator extends XmlElement implements SwordElementInterface {
/**
* The logger.
*/
- private static Logger log = Logger.getLogger(Generator.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Generator.class);
/**
* The Xml name details for the element.
diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Link.java b/dspace-sword/src/main/java/org/purl/sword/atom/Link.java
index c7658ba999..9786a91216 100644
--- a/dspace-sword/src/main/java/org/purl/sword/atom/Link.java
+++ b/dspace-sword/src/main/java/org/purl/sword/atom/Link.java
@@ -13,7 +13,7 @@ import java.util.Properties;
import nu.xom.Attribute;
import nu.xom.Element;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.base.Namespaces;
import org.purl.sword.base.SwordElementInterface;
import org.purl.sword.base.SwordValidationInfo;
@@ -102,7 +102,7 @@ public class Link extends XmlElement implements SwordElementInterface {
/**
* The logger.
*/
- private static Logger log = Logger.getLogger(Link.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Link.class);
private static final XmlName XML_NAME = new XmlName(
Namespaces.PREFIX_ATOM, "link", Namespaces.NS_ATOM);
diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Source.java b/dspace-sword/src/main/java/org/purl/sword/atom/Source.java
index 6b23d5429a..59d26c2ebb 100644
--- a/dspace-sword/src/main/java/org/purl/sword/atom/Source.java
+++ b/dspace-sword/src/main/java/org/purl/sword/atom/Source.java
@@ -13,7 +13,7 @@ import java.util.Properties;
import nu.xom.Element;
import nu.xom.Elements;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.base.Namespaces;
import org.purl.sword.base.SwordElementInterface;
import org.purl.sword.base.SwordValidationInfo;
@@ -42,7 +42,7 @@ public class Source extends XmlElement implements SwordElementInterface {
/**
* The log.
*/
- private static Logger log = Logger.getLogger(Source.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Source.class);
/**
* Create a new instance and set the prefix to
diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java b/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java
index 98dee816ea..23005d78e8 100644
--- a/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java
+++ b/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java
@@ -13,7 +13,7 @@ import java.util.Properties;
import nu.xom.Attribute;
import nu.xom.Element;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.base.Namespaces;
import org.purl.sword.base.SwordElementInterface;
import org.purl.sword.base.SwordValidationInfo;
@@ -43,7 +43,7 @@ public class TextConstruct extends XmlElement
/**
* The log.
*/
- private static Logger log = Logger.getLogger(TextConstruct.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TextConstruct.class);
/**
* label for the type attribute.
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java b/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java
index 2ed1ba9400..f5604f3656 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java
@@ -12,7 +12,7 @@ import java.util.List;
import java.util.Properties;
import nu.xom.Element;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
/**
* Represents a text construct in the ATOM elements. This is a superclass of
@@ -25,7 +25,7 @@ public abstract class BasicContentElement extends XmlElement
/**
* The log.
*/
- private static Logger log = Logger.getLogger(BasicContentElement.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicContentElement.class);
public BasicContentElement(String prefix, String name, String namespaceUri) {
super(prefix, name, namespaceUri);
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java b/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java
index c2b2a6563a..ece4deeb90 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java
@@ -13,7 +13,7 @@ import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
/**
* Utility class that holds Checksum related methods.
@@ -25,7 +25,7 @@ public class ChecksumUtils {
/**
* Logger
*/
- private static Logger log = Logger.getLogger(ChecksumUtils.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ChecksumUtils.class);
/**
* Default constructor
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Collection.java b/dspace-sword/src/main/java/org/purl/sword/base/Collection.java
index 34c2f3817d..cd78f27d50 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/Collection.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/Collection.java
@@ -15,7 +15,7 @@ import java.util.Properties;
import nu.xom.Attribute;
import nu.xom.Element;
import nu.xom.Elements;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.atom.Accept;
import org.purl.sword.atom.ContentType;
import org.purl.sword.atom.Title;
@@ -69,7 +69,7 @@ public class Collection extends XmlElement implements SwordElementInterface {
/**
* The logger.
*/
- private static Logger log = Logger.getLogger(Collection.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Collection.class);
/**
* Label for the Href attribute.
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java b/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java
index 3c1e76a2f1..2473d28e4a 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java
@@ -12,7 +12,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletResponse;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
/**
* Represents a deposit.
@@ -20,7 +20,7 @@ import org.apache.log4j.Logger;
* @author Stuart Lewis
*/
public class Deposit {
- private static final Logger log = Logger.getLogger(Deposit.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Deposit.class);
/**
* The File deposited
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java b/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java
index a731c020ed..453af3df35 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java
@@ -16,7 +16,7 @@ import nu.xom.Document;
import nu.xom.Element;
import nu.xom.ParsingException;
import nu.xom.Serializer;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
/**
* Represents a deposit response. This holds the SWORD Entry element.
@@ -43,7 +43,7 @@ public class DepositResponse {
/**
* Logger
*/
- private static Logger log = Logger.getLogger(DepositResponse.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DepositResponse.class);
/**
* Create a new response with the specified http code.
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Service.java b/dspace-sword/src/main/java/org/purl/sword/base/Service.java
index c335aecf75..3edc86c14e 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/Service.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/Service.java
@@ -14,7 +14,7 @@ import java.util.Properties;
import nu.xom.Element;
import nu.xom.Elements;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.atom.Generator;
@@ -47,7 +47,7 @@ public class Service extends XmlElement implements SwordElementInterface {
/**
* Logger
*/
- private static Logger log = Logger.getLogger(Service.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Service.class);
/**
* MaxUploadSize
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java b/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java
index 6d063c6c7e..aa0a545d97 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java
@@ -13,7 +13,7 @@ import java.util.Properties;
import nu.xom.Attribute;
import nu.xom.Element;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
/**
* Represents a text construct in the ATOM elements. This is a superclass of
@@ -36,7 +36,7 @@ public class SwordAcceptPackaging extends XmlElement
/**
* The log.
*/
- private static Logger log = Logger.getLogger(SwordAcceptPackaging.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SwordAcceptPackaging.class);
/** */
public static final String ELEMENT_NAME = "acceptPackaging";
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java b/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java
index 814c91bb39..727372408c 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java
@@ -11,14 +11,14 @@ import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
/**
* @author Neil Taylor (nst@aber.ac.uk)
*/
public class SwordContentPackageTypes {
- private static Logger log = Logger.getLogger(SwordContentPackageTypes.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SwordContentPackageTypes.class);
private static Properties types;
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java b/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java
index 81964152ba..1f18167c95 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java
@@ -14,7 +14,7 @@ import java.util.Properties;
import nu.xom.Element;
import nu.xom.Elements;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.atom.ContentType;
import org.purl.sword.atom.Title;
@@ -37,7 +37,7 @@ public class Workspace extends XmlElement implements SwordElementInterface {
/**
* The logger.
*/
- private static Logger log = Logger.getLogger(Workspace.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Workspace.class);
/**
* Local name part of this element.
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java b/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java
index 6249c4290a..80217738d2 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java
@@ -13,7 +13,7 @@ import java.util.Properties;
import nu.xom.Attribute;
import nu.xom.Element;
import nu.xom.Node;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
/**
* Parent class for all classes that represent an XML element. This provides
@@ -27,7 +27,7 @@ public abstract class XmlElement {
/**
* Logger
*/
- private static Logger log = Logger.getLogger(XmlElement.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(XmlElement.class);
/**
diff --git a/dspace-sword/src/main/java/org/purl/sword/base/XmlName.java b/dspace-sword/src/main/java/org/purl/sword/base/XmlName.java
index b6dff75281..da2430f452 100644
--- a/dspace-sword/src/main/java/org/purl/sword/base/XmlName.java
+++ b/dspace-sword/src/main/java/org/purl/sword/base/XmlName.java
@@ -9,8 +9,8 @@ package org.purl.sword.base;
import nu.xom.Attribute;
import nu.xom.Element;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
/**
* @author Neil Taylor (nst@aber.ac.uk)
diff --git a/dspace-sword/src/main/java/org/purl/sword/client/Client.java b/dspace-sword/src/main/java/org/purl/sword/client/Client.java
index 4b4899e4f9..c6d335d8dd 100644
--- a/dspace-sword/src/main/java/org/purl/sword/client/Client.java
+++ b/dspace-sword/src/main/java/org/purl/sword/client/Client.java
@@ -31,7 +31,7 @@ import org.apache.http.entity.ContentType;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpParams;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.base.ChecksumUtils;
import org.purl.sword.base.DepositResponse;
import org.purl.sword.base.HttpHeaders;
@@ -96,7 +96,7 @@ public class Client implements SWORDClient {
/**
* Logger.
*/
- private static final Logger log = Logger.getLogger(Client.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Client.class);
/**
* Create a new Client. The client will not use authentication by default.
diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java
index 0ae5cb3f26..00bd9c17a5 100644
--- a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java
+++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java
@@ -7,8 +7,6 @@
*/
package org.purl.sword.client;
-import org.apache.log4j.PropertyConfigurator;
-
/**
* Entry point for the SWORD Demonstration Client. This will parse the list of
* command line options and load either a Command Line client or a GUI client.
@@ -16,18 +14,6 @@ import org.apache.log4j.PropertyConfigurator;
* @author Neil Taylor
*/
public class ClientFactory {
-
- /**
- * Create a new instance.
- */
- public ClientFactory() {
- // configure the logger from the property file. The GUI client will
- // reload these properties if it is set to capture the output and
- // display it in a panel.
- PropertyConfigurator.configure(this.getClass().getClassLoader()
- .getResource(ClientConstants.LOGGING_PROPERTY_FILE));
- }
-
/**
* Generate a string that specifies the command line options for this
* program.
@@ -35,7 +21,7 @@ public class ClientFactory {
* @return A list of the options for this program.
*/
public static String usage() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder buffer = new StringBuilder();
buffer.append("swordclient: version ");
buffer.append(ClientConstants.CLIENT_VERSION);
buffer.append("\n");
diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java
index 2f3c73d1e5..e085baeb78 100644
--- a/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java
+++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java
@@ -13,7 +13,7 @@ import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
/**
* List of options that are parsed from the command line.
@@ -117,7 +117,7 @@ public class ClientOptions {
/**
* Logger.
*/
- private static Logger log = Logger.getLogger(ClientOptions.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ClientOptions.class);
/**
* List of multiple destination items. Used if the mode is set to multipost.
diff --git a/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java b/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java
index f1f224fe8b..f747de5ffa 100644
--- a/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java
+++ b/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java
@@ -15,7 +15,7 @@ import java.net.URL;
import java.util.Iterator;
import java.util.List;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.atom.Author;
import org.purl.sword.atom.Content;
import org.purl.sword.atom.Contributor;
@@ -54,7 +54,7 @@ public class CmdClient implements ClientType {
/**
* The logger.
*/
- private static Logger log = Logger.getLogger(CmdClient.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CmdClient.class);
/**
* Create a new instance of the class and create an instance of the
diff --git a/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java b/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java
index 51b7bd2bcb..c272fc95f5 100644
--- a/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java
+++ b/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java
@@ -25,7 +25,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.atom.Summary;
import org.purl.sword.atom.Title;
import org.purl.sword.base.ChecksumUtils;
@@ -73,7 +73,7 @@ public class DepositServlet extends HttpServlet {
/**
* Logger
*/
- private static final Logger log = Logger.getLogger(DepositServlet.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DepositServlet.class);
/**
* Initialise the servlet.
diff --git a/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java b/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java
index c7c2f49dcc..2dc9b3b7e2 100644
--- a/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java
+++ b/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java
@@ -17,7 +17,7 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import javax.servlet.http.HttpServletResponse;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.atom.Author;
import org.purl.sword.atom.Content;
import org.purl.sword.atom.Contributor;
@@ -62,7 +62,7 @@ public class DummyServer implements SWORDServer {
/**
* Logger
*/
- private static Logger log = Logger.getLogger(ServiceDocumentServlet.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ServiceDocumentServlet.class);
/**
* Provides a dumb but plausible service document - it contains
diff --git a/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java b/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java
index bb43850ef6..28c309b2ca 100644
--- a/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java
+++ b/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java
@@ -16,7 +16,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.purl.sword.base.HttpHeaders;
import org.purl.sword.base.SWORDAuthenticationException;
import org.purl.sword.base.SWORDErrorException;
@@ -49,7 +49,7 @@ public class ServiceDocumentServlet extends HttpServlet {
/**
* Logger
*/
- private static final Logger log = Logger.getLogger(ServiceDocumentServlet.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ServiceDocumentServlet.class);
/**
* Initialise the servlet.
diff --git a/dspace-sword/src/main/webapp/WEB-INF/web.xml b/dspace-sword/src/main/webapp/WEB-INF/web.xml
index 733de69745..14b873ccd9 100644
--- a/dspace-sword/src/main/webapp/WEB-INF/web.xml
+++ b/dspace-sword/src/main/webapp/WEB-INF/web.xml
@@ -8,35 +8,37 @@
http://www.dspace.org/license/
-->
-
-
+DSpace SWORD Server
+ The location of the DSpace home directorydspace.dir${dspace.dir}
-
- The location of the DSpace home directory
-
+ The SWORDServer class namesword-server-classorg.dspace.sword.DSpaceSWORDServer
+
+
+
+ log4jConfiguration
+ ${dspace.dir}/config/log4j2.xml
- The SWORDServer class name
+ The location of the Log4J configuration
+ The type of authentication used : [Basic|None]authentication-methodBasic
-
- The type of authentication used : [Basic|None]
-
-
-
-
+DSpace SWORD 2.0 Server
+ The location of the DSpace home directorydspace.dir${dspace.dir}
-
- The location of the DSpace home directory
-
+ The ServiceDocumentManager server implementation class nameservice-document-implorg.dspace.sword2.ServiceDocumentManagerDSpace
+
+
+
+ log4jConfiguration
+ ${dspace.dir}/config/log4j2.xml
- The ServiceDocumentManager server implementation class name
+ The location of the Log4J configuration
-
+
+ The CollectionListManager server implementation class namecollection-list-implorg.dspace.sword2.CollectionListManagerDSpace
-
- The CollectionListManager server implementation class name
-
+ The CollectionDepositManager server implementation class namecollection-deposit-implorg.dspace.sword2.CollectionDepositManagerDSpace
-
- The CollectionDepositManager server implementation class name
-
+ The MediaResourceManager server implementation class namemedia-resource-implorg.dspace.sword2.MediaResourceManagerDSpace
-
- The MediaResourceManager server implementation class name
-
+ The ContainerManager server implementation class namecontainer-implorg.dspace.sword2.ContainerManagerDSpace
-
- The ContainerManager server implementation class name
-
+ The StatementManager server implementation class namestatement-implorg.dspace.sword2.StatementManagerDSpace
-
- The StatementManager server implementation class name
-
+ The SwordConfiguration server implementation class nameconfig-implorg.dspace.sword2.SwordConfigurationDSpace
-
- The SwordConfiguration server implementation class name
-
+ The type of authentication used : [Basic|None]authentication-methodBasic
-
- The type of authentication used : [Basic|None]
-
-
-
-
-
-
-
-
+ https://commons.apache.org/proper/commons-configuration/userguide/howto_basicfeatures.html#Variable_Interpolation -->
+
-
+
-
-
-
-
+
+
-
-
-
-
+
+
-
+
diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg
index 5f223e67bf..2bf3794b04 100644
--- a/dspace/config/dspace.cfg
+++ b/dspace/config/dspace.cfg
@@ -169,10 +169,10 @@ mail.allowed.referrers = ${dspace.hostname}
##### Logging configuration #####
# Override default log4j configuration file
# You may provide your own configuration here, existing alternatives are:
-# log.init.config = ${dspace.dir}/config/log4j-console.properties
-log.init.config = ${dspace.dir}/config/log4j.properties
+# log.init.config = ${dspace.dir}/config/log4j2-console.xml
+log.init.config = ${dspace.dir}/config/log4j2.xml
-# All other log4j settings moved to config/log4j.properties
+# All other log4j settings moved to config/log4j2.xml
##### DOI registration agency credentials ######
# To mint DOIs you have to use a DOI registration agency like DataCite. Several
@@ -331,7 +331,19 @@ http.proxy.port =
# If enabled, the logging and the Solr statistics system will look for
# an X-Forwarded-For header. If it finds it, it will use this for the user IP address
-useProxies = false
+# Note that server-side rendered Angular UI requests always present the X-Forwarded-For header
+# with the original client IP address.
+useProxies = true
+
+# If "useProxies" is enabled, the authentication and statistics logging code will read the X-Forwarded-For header in
+# order to determine the correct client IP address. But they will only use that header value when the request is coming
+# from a trusted proxy server location (e.g. HTTPD on localhost). Leave this property empty to trust X-Forwarded-For
+# values of all requests. You can specify a range by only listing the first three ip-address blocks, e.g. 128.177.243
+# You can list multiple IP addresses or ranges by comma-separating them.
+# If you are running REST & UI on different servers, you should add the UI servers (range) as a proxy.
+# For example : proxies.trusted.ipranges = 127.0.0.1, 192.168.2
+# This is necessary because Angular Universal will also behave as a proxy server.
+proxies.trusted.ipranges = 127.0.0.1
#### Media Filter / Format Filter plugins (through PluginService) ####
# Media/Format Filters help to full-text index content or
@@ -358,8 +370,7 @@ filter.plugins = PDFBox JPEG Thumbnail
#Assign 'human-understandable' names to each filter
plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PDFFilter = PDF Text Extractor
plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.HTMLFilter = HTML Text Extractor
-plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.WordFilter = Word Text Extractor
-#plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PoiWordFilter = Word Text Extractor
+plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PoiWordFilter = Word Text Extractor
plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.ExcelFilter = Excel Text Extractor
plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PowerPointFilter = PowerPoint Text Extractor
plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.JPEGFilter = JPEG Thumbnail
@@ -371,7 +382,6 @@ plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilte
#Configure each filter's input format(s)
filter.org.dspace.app.mediafilter.PDFFilter.inputFormats = Adobe PDF
filter.org.dspace.app.mediafilter.HTMLFilter.inputFormats = HTML, Text
-filter.org.dspace.app.mediafilter.WordFilter.inputFormats = Microsoft Word
filter.org.dspace.app.mediafilter.PoiWordFilter.inputFormats = Microsoft Word, Microsoft Word XML
filter.org.dspace.app.mediafilter.PowerPointFilter.inputFormats = Microsoft Powerpoint, Microsoft Powerpoint XML
filter.org.dspace.app.mediafilter.JPEGFilter.inputFormats = BMP, GIF, JPEG, image/png
diff --git a/dspace/config/launcher.xml b/dspace/config/launcher.xml
index 834aabf42a..4c2afcdca4 100644
--- a/dspace/config/launcher.xml
+++ b/dspace/config/launcher.xml
@@ -242,6 +242,13 @@
reindex
+
+ solr-upgrade-statistics-6x
+ Upgrade statistics (integer to UUID) to DSpace 6.x (or above) compatibility
+
+ org.dspace.util.SolrUpgradePre6xStatistics
+
+ stat-generalCompile the general statistics
diff --git a/dspace/config/log4j-console.properties b/dspace/config/log4j-console.properties
deleted file mode 100644
index 5a52df7c5b..0000000000
--- a/dspace/config/log4j-console.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-#############################################################
-# log4j-console.properties
-#
-# Simple log4j configuration file used during Ant build tasks
-#
-# Its goal is to simply output logs to the commandline / console.
-#############################################################
-
-# Set root category priority to WARN and its only appender to A1.
-# For commandline / ant scripts, we are only concerned about significant warnings/errors
-# For the full detail, change this to INFO and re-run Ant.
-log4j.rootCategory=WARN, A1
-
-# A1 is set to be a ConsoleAppender.
-log4j.appender.A1=org.apache.log4j.ConsoleAppender
-
-# A1 uses PatternLayout.
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n
-
-# block passwords from being exposed in Axis logs.
-# (DEBUG exposes passwords in Basic Auth)
-log4j.logger.org.apache.axis.handlers.http.HTTPAuthHandler=INFO
diff --git a/dspace/config/log4j-handle-plugin.properties b/dspace/config/log4j-handle-plugin.properties
index 44d39fb1bd..72381a698c 100644
--- a/dspace/config/log4j-handle-plugin.properties
+++ b/dspace/config/log4j-handle-plugin.properties
@@ -20,12 +20,12 @@ log.dir=${dspace.dir}/log
log4j.rootCategory=INFO, A1
# A1 is set to be a DailyRollingFileAppender.
-log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.A1=org.apache.logging.log4j.DailyRollingFileAppender
log4j.appender.A1.File=${log.dir}/handle-plugin.log
log4j.appender.A1.DatePattern='.'yyyy-MM-dd
# A1 uses PatternLayout.
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n
diff --git a/dspace/config/log4j-solr.properties b/dspace/config/log4j-solr.properties
deleted file mode 100644
index c94e384d81..0000000000
--- a/dspace/config/log4j-solr.properties
+++ /dev/null
@@ -1,44 +0,0 @@
-###########################################################################
-# log4j-solr.properties
-#
-# This is the log4j configuration file for the Solr webapp that comes bundled
-# with DSpace. Because Solr is a dependency, its log4j settings are kept
-# separate from the default DSpace log4j settings (in log4j.properties).
-#
-# Therefore, this log4j file is standalone. If you wish to tweak the location of
-# your Solr logs, you must do so within this file.
-###########################################################################
-
-# VARIABLES:
-# The following variables can be used to easily tweak the default log4j settings.
-# These variables are used by the log4j config / appenders later in this file.
-
-# log.dir
-# Default log file directory for DSpace. Defaults to the 'log' subdirectory
-# under [dspace.dir]. NOTE: The value of 'dspace.dir' will be replaced by
-# its value in your configuration when DSpace is deployed (via Ant).
-log.dir=${dspace.dir}/log
-
-# Logging level for Solr
-log4j.rootLogger=INFO, file
-
-# Console logging options. Switch the above from "file" to "CONSOLE" to enable
-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
-log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n
-
-#- size rotation with log cleanup.
-log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
-# Set this to yyyy-MM-DD for daily log files, or yyyy-MM for monthly files
-log4j.appender.file.DatePattern='.'yyyy-MM-dd
-
-#- File to log to and log format
-log4j.appender.file.File=${log.dir}/solr.log
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d %-5p %c @ %m%n
-
-log4j.logger.org.apache.zookeeper=WARN
-log4j.logger.org.apache.hadoop=WARN
-
-# set to INFO to enable infostream log messages
-log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF
diff --git a/dspace/config/log4j.properties b/dspace/config/log4j.properties
deleted file mode 100644
index 5acdacd310..0000000000
--- a/dspace/config/log4j.properties
+++ /dev/null
@@ -1,95 +0,0 @@
-###########################################################################
-# log4j.properties
-#
-# This is the primary log4j (logging) configuration file for DSpace. By default,
-# Log4j is configured to write log files that rotate daily. However, you may
-# tweak these settings based on your local needs / best practices.
-# For more information on log4j configuration, see:
-# https://logging.apache.org/log4j/1.2/manual.html
-###########################################################################
-
-# VARIABLES:
-# The following variables can be used to easily tweak the default log4j settings.
-# These variables are used by the log4j config / appenders later in this file.
-
-# log.dir
-# Default log file directory for DSpace. Defaults to the 'log' subdirectory
-# under [dspace.dir]. NOTE: The value of 'dspace.dir' will be replaced by
-# its value in your configuration when DSpace is deployed (via Ant).
-log.dir=${dspace.dir}/log
-
-# loglevel.dspace
-# Log level for all DSpace-specific code (org.dspace.*)
-# Possible values (from most to least info): DEBUG, INFO, WARN, ERROR, FATAL
-# Defaults to INFO
-loglevel.dspace=INFO
-
-# loglevel.other
-# Log level for other third-party tools/APIs used by DSpace
-# Possible values (from most to least info): DEBUG, INFO, WARN, ERROR, FATAL
-# Defaults to INFO
-loglevel.other=INFO
-
-
-###########################################################################
-# A1 is the name of the appender for most DSpace activity.
-###########################################################################
-# The root category is the default setting for all non-DSpace code.
-# Change this from INFO to DEBUG to see extra logging created by non-DSpace
-# code.
-log4j.rootCategory=${loglevel.other}, A1
-# This line sets the logging level for DSpace code. Set this to DEBUG to see
-# extra detailed logging for DSpace code.
-log4j.logger.org.dspace=${loglevel.dspace}, A1
-
-# Do not change these "additivity" lines
-log4j.additivity.org.dspace=false
-
-# The name of the file appender
-log4j.appender.A1=org.dspace.app.util.DailyFileAppender
-# The filename of the log file created. A date stamp is appended to this
-log4j.appender.A1.File=${log.dir}/dspace.log
-# Set this to yyyy-MM-DD for daily log files, or yyyy-MM for monthly files
-log4j.appender.A1.DatePattern=yyyy-MM-dd
-# The number of log files to keep, or 0 to keep them all
-log4j.appender.A1.MaxLogs=0
-# A1 uses PatternLayout.
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n
-
-
-###########################################################################
-# A2 is the name of the appender for the Checksum Checker
-###########################################################################
-# This line sets the logging level for the checksum checker log file.
-# Set this to DEBUG to see extra detailed logging.
-log4j.logger.org.dspace.checker=INFO, A2
-# Do not change this line
-log4j.additivity.org.dspace.checker=false
-# The name of the file appender
-log4j.appender.A2=org.dspace.app.util.DailyFileAppender
-# The filename of the log file created. A date stamp is appended to this
-log4j.appender.A2.File=${log.dir}/checker.log
-# Set this to yyyy-MM-DD for daily log files, or yyyy-MM for monthly files
-log4j.appender.A2.DatePattern=yyyy-MM-dd
-# The number of log files to keep, or 0 to keep them all
-log4j.appender.A2.MaxLogs=0
-# A2 uses PatternLayout.
-log4j.appender.A2.layout=org.apache.log4j.PatternLayout
-log4j.appender.A2.layout.ConversionPattern=%m%n
-
-
-###########################################################################
-# Other settings
-###########################################################################
-
-# Block passwords from being exposed in Axis logs.
-# (DEBUG exposes passwords in Basic Auth)
-log4j.logger.org.apache.axis.handlers.http.HTTPAuthHandler=INFO
-
-# Block services logging except on exceptions
-log4j.logger.org.dspace.kernel=ERROR
-log4j.logger.org.dspace.services=ERROR
-log4j.logger.org.dspace.servicemanager=ERROR
-log4j.logger.org.dspace.providers=ERROR
-log4j.logger.org.dspace.utils=ERROR
diff --git a/dspace/config/log4j2-console.xml b/dspace/config/log4j2-console.xml
new file mode 100644
index 0000000000..db2998f6be
--- /dev/null
+++ b/dspace/config/log4j2-console.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+ ${log4j:configParentLocation}/../log
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dspace/config/log4j2-solr.xml b/dspace/config/log4j2-solr.xml
new file mode 100644
index 0000000000..1e32365263
--- /dev/null
+++ b/dspace/config/log4j2-solr.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+ ${log4j:configParentLocation}/../log
+
+
+
+
+
+
+ yyyy-MM-dd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dspace/config/log4j2.xml b/dspace/config/log4j2.xml
new file mode 100644
index 0000000000..98a0300125
--- /dev/null
+++ b/dspace/config/log4j2.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+ ${log4j:configParentLocation}/../log
+
+
+ INFO
+
+
+ INFO
+
+
+
+
+
+
+
+ yyyy-MM-dd
+
+
+
+
+
+
+
+
+ yyyy-MM-dd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ # Block services logging except on exceptions
+
+
+
+
+
+
+ # Block passwords from being exposed in Axis logs.
+ # (DEBUG exposes passwords in Basic Auth)
+
+
+
diff --git a/dspace/config/spring/api/core-services.xml b/dspace/config/spring/api/core-services.xml
index 4cabc4dcfb..f9c9b30ca3 100644
--- a/dspace/config/spring/api/core-services.xml
+++ b/dspace/config/spring/api/core-services.xml
@@ -98,6 +98,7 @@
+
@@ -118,6 +119,10 @@
-->
+
+
+
@@ -159,23 +173,29 @@
+
-
+ orgunit.identifier.name
-
- ,
-
+
@@ -191,29 +211,31 @@
-
+
+ orgunit.identifier.name
-
- ,
-
-
+ orgunit.identifier.name
-
- ,
-
@@ -221,16 +243,32 @@
-
+
+ journalvolume.identifier.volume
-
- ,
-
+
@@ -247,25 +285,19 @@
-
+ journal.identifier.issn
-
- ,
-
-
+ journal.identifier.name
-
- ,
-
@@ -274,15 +306,12 @@
-
+ journalissue.identifier.number
-
- ,
-
@@ -291,6 +320,18 @@
+
+
diff --git a/dspace/modules/additions/pom.xml b/dspace/modules/additions/pom.xml
index ebc3963a0a..d02b33a8b9 100644
--- a/dspace/modules/additions/pom.xml
+++ b/dspace/modules/additions/pom.xml
@@ -58,7 +58,7 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
diff --git a/dspace/modules/oai/pom.xml b/dspace/modules/oai/pom.xml
index 2dc97f96bc..e36adfafcc 100644
--- a/dspace/modules/oai/pom.xml
+++ b/dspace/modules/oai/pom.xml
@@ -127,13 +127,15 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
+
com.lyncode
@@ -146,6 +148,14 @@
+
+
+
+
+ org.hamcrest
+ hamcrest-all
+ compile
+
diff --git a/dspace/modules/rdf/pom.xml b/dspace/modules/rdf/pom.xml
index 5a5ab808bf..297d165a6d 100644
--- a/dspace/modules/rdf/pom.xml
+++ b/dspace/modules/rdf/pom.xml
@@ -104,7 +104,7 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
diff --git a/dspace/modules/rest/pom.xml b/dspace/modules/rest/pom.xml
index 636adc7e18..4b9c4a2a24 100644
--- a/dspace/modules/rest/pom.xml
+++ b/dspace/modules/rest/pom.xml
@@ -143,7 +143,7 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
diff --git a/dspace/modules/solr/pom.xml b/dspace/modules/solr/pom.xml
index d84c1a4a51..ff0927727a 100644
--- a/dspace/modules/solr/pom.xml
+++ b/dspace/modules/solr/pom.xml
@@ -130,6 +130,10 @@
org.apache.zookeeperzookeeper
+
+ log4j
+ log4j
+
diff --git a/dspace/modules/sword/pom.xml b/dspace/modules/sword/pom.xml
index 3ed2e4cc10..a8498483ce 100644
--- a/dspace/modules/sword/pom.xml
+++ b/dspace/modules/sword/pom.xml
@@ -121,7 +121,7 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
diff --git a/dspace/modules/swordv2/pom.xml b/dspace/modules/swordv2/pom.xml
index 63ef48427d..11f0b684b5 100644
--- a/dspace/modules/swordv2/pom.xml
+++ b/dspace/modules/swordv2/pom.xml
@@ -135,7 +135,7 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
diff --git a/dspace/pom.xml b/dspace/pom.xml
index 3780d02fa0..9c22c27523 100644
--- a/dspace/pom.xml
+++ b/dspace/pom.xml
@@ -321,7 +321,7 @@
command. -->
javax.servlet
- servlet-api
+ javax.servlet-api
diff --git a/dspace/solr/statistics/conf/schema.xml b/dspace/solr/statistics/conf/schema.xml
index 6386beee53..428ade7fc5 100644
--- a/dspace/solr/statistics/conf/schema.xml
+++ b/dspace/solr/statistics/conf/schema.xml
@@ -286,19 +286,19 @@
-->
-
+
-
+
-
-
-
+
+
+
@@ -313,7 +313,7 @@
-
+
@@ -323,8 +323,8 @@
-
-
+
+
diff --git a/dspace/src/main/config/build.xml b/dspace/src/main/config/build.xml
index ec4782aa5d..ab13191561 100644
--- a/dspace/src/main/config/build.xml
+++ b/dspace/src/main/config/build.xml
@@ -354,6 +354,7 @@ Common usage:
to its log files. In addition, log4j strongly prefers
autoconfiguring itself (e.g. see DS-3104). -->
+
@@ -780,8 +781,12 @@ Common usage:
-
-
+
+
@@ -955,7 +960,8 @@ You may manually install this file by following these steps:
-
+
@@ -1044,7 +1050,8 @@ You may manually install this file by following these steps:
Checking if the Solr index at ${indexDir} is >= Solr ${version}
-
+
@@ -1153,8 +1160,10 @@ For more information, please see the Upgrade Instructions.
Upgrading the Solr index in ${indexDir}. Depending on the index size, this may take a while (please be patient)...
-
-
+
+
@@ -1168,8 +1177,10 @@ For more information, please see the Upgrade Instructions.
Upgrading the Solr index in ${indexDir}. Depending on the index size, this may take a while (please be patient)...
-
-
+
+
diff --git a/pom.xml b/pom.xml
index 88dfeec6d0..585cccda45 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,7 +27,8 @@
3.1742.2.14.10.4
- 2.13.0
+ 2.13.0
+ 2.6.21.7.222.8.112.26
@@ -150,6 +151,8 @@
true
+
+ false
@@ -432,7 +435,7 @@
- -Xmx512m
+ -Xmx1024m
@@ -1101,7 +1104,7 @@
- spring-jdbc
+ spring-jdbcorg.springframework${spring.version}
@@ -1144,16 +1147,12 @@
mets1.5.2
-
- org.dspace.dependencies
- dspace-tm-extractors
- 1.0.1
-
+
commons-beanutilscommons-beanutils
- 1.9.2
+ 1.9.3commons-cli
@@ -1179,9 +1178,9 @@
3.2.2
- commons-configuration
- commons-configuration
- 1.10
+ org.apache.commons
+ commons-configuration2
+ 2.3org.apache.commons
@@ -1204,10 +1203,9 @@
2.4
- commons-lang
- commons-lang
- 2.6
-
+ org.apache.commons
+ commons-lang3
+ 3.7commons-logging
@@ -1236,8 +1234,8 @@
javax.servlet
- servlet-api
- 2.5
+ javax.servlet-api
+ 3.1.0
@@ -1256,11 +1254,33 @@
jdom1.1.3
+
- log4j
- log4j
- 1.2.17
+ org.apache.logging.log4j
+ log4j-api
+ ${log4j.version}
+
+ org.apache.logging.log4j
+ log4j-1.2-api
+ ${log4j.version}
+
+
+ org.apache.logging.log4j
+ log4j-core
+ ${log4j.version}
+
+
+ org.apache.logging.log4j
+ log4j-web
+ ${log4j.version}
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ ${log4j.version}
+
+
orooro