diff --git a/jspwiki-api/src/test/java/org/apache/wiki/api/spi/WikiTest.java b/jspwiki-api/src/test/java/org/apache/wiki/api/spi/WikiTest.java index 1edbbba432..06ca0b3cbe 100644 --- a/jspwiki-api/src/test/java/org/apache/wiki/api/spi/WikiTest.java +++ b/jspwiki-api/src/test/java/org/apache/wiki/api/spi/WikiTest.java @@ -43,7 +43,7 @@ public class WikiTest { public void testWikiInit() { Mockito.doReturn( sc ).when( conf ).getServletContext(); final Properties properties = Wiki.init( sc ); - Assertions.assertEquals( 5, properties.size() ); + Assertions.assertEquals( 6, properties.size() ); // verify SPIs are initialized and can be invoked Assertions.assertNull( Wiki.acls().acl() ); diff --git a/jspwiki-bootstrap/src/main/java/org/apache/wiki/bootstrap/WikiBootstrapServletContextListener.java b/jspwiki-bootstrap/src/main/java/org/apache/wiki/bootstrap/WikiBootstrapServletContextListener.java index dd677c048b..f2332ca7e5 100644 --- a/jspwiki-bootstrap/src/main/java/org/apache/wiki/bootstrap/WikiBootstrapServletContextListener.java +++ b/jspwiki-bootstrap/src/main/java/org/apache/wiki/bootstrap/WikiBootstrapServletContextListener.java @@ -47,7 +47,6 @@ public class WikiBootstrapServletContextListener implements ServletContextListen public void contextInitialized( final ServletContextEvent sce ) { final Properties properties = initWikiSPIs( sce ); initWikiLoggingFramework( properties ); - setWorkDir(properties, sce.getServletContext()); } /** @@ -100,34 +99,4 @@ ConfigurationSource createConfigurationSource( final Properties properties ) { @Override public void contextDestroyed( final ServletContextEvent sce ) { } - - /** - * This method sets the JSPWiki working directory (jspwiki.workDir). It first checks if this property - * is already set. If it isn't, it attempts to use the servlet container's temporary directory - * (javax.servlet.context.tempdir). If that is also unavailable, it defaults to the system's temporary - * directory (java.io.tmpdir). - *

- * This method is package-private to allow for unit testing. - * - * @param properties the JSPWiki properties - * @param servletContext the Servlet context from which to fetch the tempdir if needed - * @since JSPWiki 2.11.1 - */ - void setWorkDir(final Properties properties, final ServletContext servletContext) { - final String workDir = TextUtil.getStringProperty(properties, "jspwiki.workDir", null); - if (workDir == null) { - final File tempDir = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); - if (tempDir != null) { - properties.setProperty("jspwiki.workDir", tempDir.getAbsolutePath()); - LOG.info("Setting jspwiki.workDir to ServletContext's temporary directory: {}", tempDir.getAbsolutePath()); - } else { - final String defaultTmpDir = System.getProperty("java.io.tmpdir"); - properties.setProperty("jspwiki.workDir", defaultTmpDir); - LOG.info("ServletContext's temporary directory not found. Setting jspwiki.workDir to system's temporary directory: {}", defaultTmpDir); - } - } else { - LOG.info("jspwiki.workDir is already set to: {}", workDir); - } - } - } diff --git a/jspwiki-bootstrap/src/test/java/org/apache/wiki/bootstrap/WikiBootstrapServletContextListenerTest.java b/jspwiki-bootstrap/src/test/java/org/apache/wiki/bootstrap/WikiBootstrapServletContextListenerTest.java index 0dc87b6d1c..866563ecd8 100644 --- a/jspwiki-bootstrap/src/test/java/org/apache/wiki/bootstrap/WikiBootstrapServletContextListenerTest.java +++ b/jspwiki-bootstrap/src/test/java/org/apache/wiki/bootstrap/WikiBootstrapServletContextListenerTest.java @@ -26,12 +26,9 @@ Licensed to the Apache Software Foundation (ASF) under one import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; -import java.io.File; import java.util.Properties; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; @ExtendWith( MockitoExtension.class ) @@ -46,7 +43,7 @@ public void testWikiInit() { final WikiBootstrapServletContextListener listener = new WikiBootstrapServletContextListener(); final Properties properties = listener.initWikiSPIs( sce ); - assertEquals( 35, properties.size() ); + Assertions.assertEquals( 36, properties.size() ); } @Test @@ -67,20 +64,4 @@ public void testServletContextListenerLifeCycle() { Assertions.assertDoesNotThrow( () -> listener.contextInitialized( sce ) ); Assertions.assertDoesNotThrow( () -> listener.contextDestroyed( sce ) ); } - - @Test - public void testSetWorkDir() { - // Given - final WikiBootstrapServletContextListener listener = new WikiBootstrapServletContextListener(); - final Properties properties = new Properties(); - final ServletContext servletContext = mock(ServletContext.class); - final File tempDir = new File(System.getProperty("java.io.tmpdir")); - when(servletContext.getAttribute("javax.servlet.context.tempdir")).thenReturn(tempDir); - - // When - listener.setWorkDir(properties, servletContext); - - // Then - assertEquals(properties.getProperty("jspwiki.workDir"), tempDir.getAbsolutePath()); - } } diff --git a/jspwiki-main/src/main/java/org/apache/wiki/ui/Installer.java b/jspwiki-main/src/main/java/org/apache/wiki/ui/Installer.java index 489f222f4d..570d9722e0 100644 --- a/jspwiki-main/src/main/java/org/apache/wiki/ui/Installer.java +++ b/jspwiki-main/src/main/java/org/apache/wiki/ui/Installer.java @@ -86,7 +86,7 @@ public Installer( final HttpServletRequest request, final ServletConfig config ) // Stash the request m_request = request; m_validated = false; - TMP_DIR = m_engine.getWikiProperties().getProperty( "java.io.tmpdir" ); + TMP_DIR = m_engine.getWikiProperties().getProperty( "jspwiki.workDir" ); } /** diff --git a/jspwiki-util/pom.xml b/jspwiki-util/pom.xml index 1d6ac7b552..7304bddb03 100644 --- a/jspwiki-util/pom.xml +++ b/jspwiki-util/pom.xml @@ -99,5 +99,12 @@ junit-jupiter-engine test + + + org.mockito + mockito-core + test + + diff --git a/jspwiki-util/src/main/java/org/apache/wiki/util/PropertyReader.java b/jspwiki-util/src/main/java/org/apache/wiki/util/PropertyReader.java index 3d1b27d9a5..ac1fa91392 100644 --- a/jspwiki-util/src/main/java/org/apache/wiki/util/PropertyReader.java +++ b/jspwiki-util/src/main/java/org/apache/wiki/util/PropertyReader.java @@ -139,6 +139,9 @@ public static Properties loadWebAppProps( final ServletContext context ) { // now load the cascade (new in 2.5) loadWebAppPropsCascade( context, props ); + // sets the JSPWiki working directory (jspwiki.workDir) + setWorkDir( context, props ); + // add system properties beginning with jspwiki... final Map< String, String > sysprops = collectPropertiesFrom( System.getProperties().entrySet().stream() .collect( Collectors.toMap( Object::toString, Object::toString ) ) ); @@ -393,4 +396,33 @@ static String createResourceLocation( final String path, final String name ) { return result.toString(); } + /** + * This method sets the JSPWiki working directory (jspwiki.workDir). It first checks if this property + * is already set. If it isn't, it attempts to use the servlet container's temporary directory + * (javax.servlet.context.tempdir). If that is also unavailable, it defaults to the system's temporary + * directory (java.io.tmpdir). + *

+ * This method is package-private to allow for unit testing. + * + * @param properties the JSPWiki properties + * @param servletContext the Servlet context from which to fetch the tempdir if needed + * @since JSPWiki 2.11.1 + */ + static void setWorkDir( final ServletContext servletContext, final Properties properties ) { + final String workDir = TextUtil.getStringProperty(properties, "jspwiki.workDir", null); + if (workDir == null) { + final File tempDir = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); + if (tempDir != null) { + properties.setProperty("jspwiki.workDir", tempDir.getAbsolutePath()); + LOG.info("Setting jspwiki.workDir to ServletContext's temporary directory: {}", tempDir.getAbsolutePath()); + } else { + final String defaultTmpDir = System.getProperty("java.io.tmpdir"); + properties.setProperty("jspwiki.workDir", defaultTmpDir); + LOG.info("ServletContext's temporary directory not found. Setting jspwiki.workDir to system's temporary directory: {}", defaultTmpDir); + } + } else { + LOG.info("jspwiki.workDir is already set to: {}", workDir); + } + } + } diff --git a/jspwiki-util/src/test/java/org/apache/wiki/util/PropertyReaderTest.java b/jspwiki-util/src/test/java/org/apache/wiki/util/PropertyReaderTest.java index 09358a0ecb..1d208db179 100644 --- a/jspwiki-util/src/test/java/org/apache/wiki/util/PropertyReaderTest.java +++ b/jspwiki-util/src/test/java/org/apache/wiki/util/PropertyReaderTest.java @@ -22,11 +22,16 @@ Licensed to the Apache Software Foundation (ASF) under one import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import javax.servlet.ServletContext; +import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Properties; +import static org.mockito.Mockito.mock; + /** * Unit test for PropertyReader. @@ -122,4 +127,30 @@ public void testCollectPropertiesFrom() { Assertions.assertNull( test.get( "secretEnv" ) ); } + @Test + public void testSetWorkDir() { + final Properties properties = new Properties(); + final ServletContext servletContext = mock(ServletContext.class); + Mockito.when(servletContext.getAttribute("javax.servlet.context.tempdir")).thenReturn(new File("/tmp")); + + PropertyReader.setWorkDir(servletContext, properties); + + // Test when the "jspwiki.workDir" is not set, it should get set to servlet's temporary directory + String workDir = properties.getProperty("jspwiki.workDir"); + Assertions.assertEquals("/tmp", workDir); + + // Test when the "jspwiki.workDir" is set, it should remain as it is + properties.setProperty("jspwiki.workDir", "/custom/dir"); + PropertyReader.setWorkDir(servletContext, properties); + workDir = properties.getProperty("jspwiki.workDir"); + Assertions.assertEquals("/custom/dir", workDir); + + // Test when the servlet's temporary directory is null, it should get set to system's temporary directory + Mockito.when(servletContext.getAttribute("javax.servlet.context.tempdir")).thenReturn(null); + properties.remove("jspwiki.workDir"); + PropertyReader.setWorkDir(servletContext, properties); + workDir = properties.getProperty("jspwiki.workDir"); + Assertions.assertEquals(System.getProperty("java.io.tmpdir"), workDir); + } + }