This is an automated email from the ASF dual-hosted git repository. yasserzamani pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/struts.git
The following commit(s) were added to refs/heads/master by this push: new 2a60c1e [WW-4981] Adds support for JDK11 (#270) 2a60c1e is described below commit 2a60c1eee69f976a6e20f20add04cdc39b757ead Author: Lukasz Lenart <lukasz.len...@gmail.com> AuthorDate: Mon Nov 19 08:05:01 2018 +0100 [WW-4981] Adds support for JDK11 (#270) * Upgrades test dependencies * Drops unused lib * Uses AssertJ instead of FestAssert * Upgrades Surefire Maven Plugin to 2.22.1 * Downgrades to AssertJ 2.x to support JDK7 * decouple tests from java version Refactor a java 9 conditional test to work always with any java version See also WW-4845 * fix NullPointerException in NotURLClassLoader tests Also includes a few improvements See also WW-4845 * do not specify threadCount & forkMode which breaks tests in java 9 See also WW-4845 * pass all current tests with java 11 See also WW-4981 * fix an odd path problem in java 9 See also WW-4845 * gitignore test-output See also WW-4981 * ask travis an oracle jdk 11 build See also WW-4981 * ask travis to report coverage only in latest working jdk, jdk8 See also WW-4845 --- .gitignore | 1 + .travis.yml | 8 +- assembly/src/main/assembly/min-lib.xml | 3 +- core/pom.xml | 6 +- .../opensymphony/xwork2/util/ClassPathFinder.java | 279 ++++++++++----------- .../com/opensymphony/xwork2/ognl/OgnlUtilTest.java | 44 ++-- .../xwork2/util/AnnotationUtilsTest.java | 2 +- .../xwork2/util/ClassPathFinderTest.java | 15 +- .../xwork2/util/fs/JarEntryRevisionTest.java | 22 +- .../test/java/org/apache/struts2/TestUtils.java | 16 -- .../conversion/UploadedFileConverterTest.java | 2 +- .../FreemarkerThemeTemplateLoaderTest.java | 9 +- plugins/bean-validation/pom.xml | 31 +++ .../org/apache/struts2/EmbeddedJSPResultTest.java | 12 +- plugins/json/pom.xml | 4 +- .../json/JSONValidationInterceptorTest.java | 2 +- plugins/rest/pom.xml | 4 +- .../rest/handler/JacksonXmlHandlerTest.java | 2 +- pom.xml | 19 +- 19 files changed, 252 insertions(+), 229 deletions(-) diff --git a/.gitignore b/.gitignore index 76e68ef..025e545 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ bundles/target plugins/target target plugins/testng/test-output +test-output diff --git a/.travis.yml b/.travis.yml index 8d98574..5ba7076 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,12 +5,18 @@ jdk: - openjdk7 - oraclejdk8 - oraclejdk9 + - oraclejdk11 install: true script: mvn test -DskipAssembly after_success: - - mvn clean cobertura:cobertura org.eluder.coveralls:coveralls-maven-plugin:report com.updateimpact:updateimpact-maven-plugin:submit -Ptravis-coveralls,update-impact -DskipAssembly + # TODO delete following if statement after fix of https://github.com/cobertura/cobertura/issues/271 + - if [ "$TRAVIS_JDK_VERSION" == "openjdk8" ] || [ "$TRAVIS_JDK_VERSION" == "oraclejdk8" ]; then + mvn clean cobertura:cobertura org.eluder.coveralls:coveralls-maven-plugin:report com.updateimpact:updateimpact-maven-plugin:submit -Ptravis-coveralls,update-impact -DskipAssembly + else + echo "Not reporting coverage for $TRAVIS_JDK_VERSION due to incomatibility or to save performance"; + fi env: global: diff --git a/assembly/src/main/assembly/min-lib.xml b/assembly/src/main/assembly/min-lib.xml index a1cafea..3e6e4a1 100644 --- a/assembly/src/main/assembly/min-lib.xml +++ b/assembly/src/main/assembly/min-lib.xml @@ -38,9 +38,8 @@ <include>org.apache.commons:commons-lang3</include> <include>org.apache.logging.log4j:log4j-api</include> <include>ognl:ognl</include> - <include>org.javassist:javassist</include> <include>commons-fileupload:commons-fileupload</include> - <include>commons-io:commons-io</include> + <include>org.apache.commons:commons-io</include> </includes> </dependencySet> </dependencySets> diff --git a/core/pom.xml b/core/pom.xml index 631da0f..f5e0dac 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -339,13 +339,13 @@ <dependency> <groupId>org.mockito</groupId> - <artifactId>mockito-all</artifactId> + <artifactId>mockito-core</artifactId> <scope>test</scope> </dependency> <dependency> - <groupId>org.easytesting</groupId> - <artifactId>fest-assert</artifactId> + <groupId>org.assertj</groupId> + <artifactId>assertj-core</artifactId> <scope>test</scope> </dependency> diff --git a/core/src/main/java/com/opensymphony/xwork2/util/ClassPathFinder.java b/core/src/main/java/com/opensymphony/xwork2/util/ClassPathFinder.java index 5838abd..8cb69cb 100644 --- a/core/src/main/java/com/opensymphony/xwork2/util/ClassPathFinder.java +++ b/core/src/main/java/com/opensymphony/xwork2/util/ClassPathFinder.java @@ -36,158 +36,153 @@ import java.util.zip.ZipInputStream; /** * This class is an utility class that will search through the classpath * for files whose names match the given pattern. The filename is tested - * using the given implementation of {@link com.opensymphony.xwork2.util.PatternMatcher} by default it + * using the given implementation of {@link com.opensymphony.xwork2.util.PatternMatcher} by default it * uses {@link com.opensymphony.xwork2.util.WildcardHelper} */ public class ClassPathFinder { - - /** + + /** * The String pattern to test against. */ - private String pattern ; - - private int[] compiledPattern ; - - /** + private String pattern; + + private int[] compiledPattern; + + /** * The PatternMatcher implementation to use */ - private PatternMatcher<int[]> patternMatcher = new WildcardHelper(); - - private Vector<String> compared = new Vector<>(); - - /** - * @return the pattern in use - */ - public String getPattern() { - return pattern; - } - - /** - * @param pattern the String pattern for comparing filenames - */ - public void setPattern(String pattern) { - this.pattern = pattern; - } - - /** + private PatternMatcher<int[]> patternMatcher = new WildcardHelper(); + + private Vector<String> compared = new Vector<>(); + + /** + * @return the pattern in use + */ + public String getPattern() { + return pattern; + } + + /** + * @param pattern the String pattern for comparing filenames + */ + public void setPattern(String pattern) { + this.pattern = pattern; + } + + /** * Builds a {@link java.util.Vector} containing Strings which each name a file - * who's name matches the pattern set by setPattern(String). The classpath is + * who's name matches the pattern set by setPattern(String). The classpath is * searched recursively, so use with caution. * * @return Vector<String> containing matching filenames */ - public Vector<String> findMatches() { - Vector<String> matches = new Vector<>(); - URL[] parentUrls = getClassLoaderURLs(); - compiledPattern = patternMatcher.compilePattern(pattern); - for (URL url : parentUrls) { - if (!"file".equals(url.getProtocol())) { - continue ; - } - URI entryURI ; - try { - entryURI = url.toURI(); - } catch (URISyntaxException e) { - continue; - } - File entry = new File(entryURI); - if (entry.isFile() && entry.toString().endsWith(".jar")) { - try { - ZipInputStream zip = new ZipInputStream(new FileInputStream(entry)); - for (ZipEntry zipEntry = zip.getNextEntry(); zipEntry != null; zipEntry = zip.getNextEntry()) { - boolean doesMatch = patternMatcher.match(new HashMap<String, String>(), zipEntry.getName(), compiledPattern); - if (doesMatch) { - matches.add(zipEntry.getName()); - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } else { - Vector<String> results = checkEntries(entry.list(), entry, ""); - if (results != null) { - matches.addAll(results); - } - } - } - return matches; - } - - private Vector<String> checkEntries(String[] entries, File parent, String prefix) { - - if (entries == null ) { - return null; - } - - Vector<String> matches = new Vector<>(); - for (String listEntry : entries) { - File tempFile ; - if (!"".equals(prefix) ) { - tempFile = new File(parent, prefix + "/" + listEntry); - } - else { - tempFile = new File(parent, listEntry); - } - if (tempFile.isDirectory() && - !(".".equals(listEntry) || "..".equals(listEntry)) ) { - if (!"".equals(prefix) ) { - matches.addAll(checkEntries(tempFile.list(), parent, prefix + "/" + listEntry)); - } - else { - matches.addAll(checkEntries(tempFile.list(), parent, listEntry)); - } - } - else { - - String entryToCheck ; - if ("".equals(prefix)) { - entryToCheck = listEntry ; - } - else { - entryToCheck = prefix + "/" + listEntry ; - } - - if (compared.contains(entryToCheck) ) { - continue; - } - else { - compared.add(entryToCheck) ; - } - - boolean doesMatch = patternMatcher.match(new HashMap<String,String>(), entryToCheck, compiledPattern); - if (doesMatch) { - matches.add(entryToCheck); - } - } - } - return matches ; - } - - /** - * @param patternMatcher the PatternMatcher implementation to use when comparing filenames - */ - public void setPatternMatcher(PatternMatcher<int[]> patternMatcher) { - this.patternMatcher = patternMatcher; - } - - private URL[] getClassLoaderURLs() { - URL[] urls; - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - - if (!(loader instanceof URLClassLoader)) { - loader = ClassPathFinder.class.getClassLoader(); - } - - if (loader instanceof URLClassLoader) { - urls = ((URLClassLoader) loader).getURLs(); - } else { //jdk9 or later - try { - urls = Collections.list(loader.getResources("")).toArray(new URL[0]); - } catch (IOException e) { - throw new XWorkException("unable to get ClassLoader URLs", e); - } - } - - return urls; - } + public Vector<String> findMatches() { + Vector<String> matches = new Vector<>(); + URL[] parentUrls = getClassLoaderURLs(); + compiledPattern = patternMatcher.compilePattern(pattern); + for (URL url : parentUrls) { + if (!"file".equals(url.getProtocol())) { + continue; + } + URI entryURI; + try { + entryURI = url.toURI(); + } catch (URISyntaxException e) { + continue; + } + File entry = new File(entryURI); + if (entry.isFile() && entry.toString().endsWith(".jar")) { + try { + ZipInputStream zip = new ZipInputStream(new FileInputStream(entry)); + for (ZipEntry zipEntry = zip.getNextEntry(); zipEntry != null; zipEntry = zip.getNextEntry()) { + boolean doesMatch = patternMatcher.match(new HashMap<String, String>(), zipEntry.getName(), compiledPattern); + if (doesMatch) { + matches.add(zipEntry.getName()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } else { + Vector<String> results = checkEntries(entry.list(), entry, ""); + if (results != null) { + matches.addAll(results); + } + } + } + return matches; + } + + private Vector<String> checkEntries(String[] entries, File parent, String prefix) { + + if (entries == null) { + return null; + } + + Vector<String> matches = new Vector<>(); + for (String listEntry : entries) { + File tempFile; + if (!"".equals(prefix)) { + tempFile = new File(parent, prefix + "/" + listEntry); + } else { + tempFile = new File(parent, listEntry); + } + if (tempFile.isDirectory() && + !(".".equals(listEntry) || "..".equals(listEntry))) { + if (!"".equals(prefix)) { + matches.addAll(checkEntries(tempFile.list(), parent, prefix + "/" + listEntry)); + } else { + matches.addAll(checkEntries(tempFile.list(), parent, listEntry)); + } + } else { + + String entryToCheck; + if ("".equals(prefix)) { + entryToCheck = listEntry; + } else { + entryToCheck = prefix + "/" + listEntry; + } + + if (compared.contains(entryToCheck)) { + continue; + } else { + compared.add(entryToCheck); + } + + boolean doesMatch = patternMatcher.match(new HashMap<String, String>(), entryToCheck, compiledPattern); + if (doesMatch) { + matches.add(entryToCheck); + } + } + } + return matches; + } + + /** + * @param patternMatcher the PatternMatcher implementation to use when comparing filenames + */ + public void setPatternMatcher(PatternMatcher<int[]> patternMatcher) { + this.patternMatcher = patternMatcher; + } + + private URL[] getClassLoaderURLs() { + URL[] urls; + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + + if (!(loader instanceof URLClassLoader)) { + loader = ClassPathFinder.class.getClassLoader(); + } + + if (loader instanceof URLClassLoader) { + urls = ((URLClassLoader) loader).getURLs(); + } else { //jdk9 or later + try { + urls = Collections.list(loader.getResources("")).toArray(new URL[0]); + } catch (IOException e) { + throw new XWorkException("unable to get ClassLoader URLs", e); + } + } + + return urls; + } } diff --git a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java index 2541ad5..99aa541 100644 --- a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java @@ -27,9 +27,9 @@ import com.opensymphony.xwork2.test.User; import com.opensymphony.xwork2.util.*; import com.opensymphony.xwork2.util.reflection.ReflectionContextState; import ognl.*; -import org.apache.struts2.TestUtils; import java.lang.reflect.Method; +import java.text.DateFormat; import java.util.*; public class OgnlUtilTest extends XWorkTestCase { @@ -373,24 +373,8 @@ public class OgnlUtilTest extends XWorkTestCase { cal.set(Calendar.YEAR, 1982); assertEquals(cal.getTime(), foo.getBirthday()); - - //UK style test - if (TestUtils.isJdk9OrLater()) { - /* In JDK 9 and later, the default locale data uses data derived from the - Unicode Consortium's Common Locale Data Repository (CLDR). The short date-time format is ‹{1}, {0}› in the - CLDR locale, as opposed to {1} {0} in the JRE locale data. - Please refer : http://www.oracle.com/technetwork/java/javase/9-relnote-issues-3704069.html#JDK-8008577 */ - props.put("event", "18/10/2006, 14:23:45"); - props.put("meeting", "09/09/2006, 14:30"); - } - else { - props.put("event", "18/10/2006 14:23:45"); - props.put("meeting", "09/09/2006 14:30"); - } - context.put(ActionContext.LOCALE, Locale.UK); - ognlUtil.setProperties(props, foo, context); - + //UK style test cal = Calendar.getInstance(); cal.clear(); cal.set(Calendar.MONTH, Calendar.OCTOBER); @@ -399,9 +383,12 @@ public class OgnlUtilTest extends XWorkTestCase { cal.set(Calendar.HOUR_OF_DAY, 14); cal.set(Calendar.MINUTE, 23); cal.set(Calendar.SECOND, 45); - - assertEquals(cal.getTime(), foo.getEvent()); - + + Date eventTime = cal.getTime(); + String formatted = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.UK) + .format(eventTime); + props.put("event", formatted); + cal = Calendar.getInstance(); cal.clear(); cal.set(Calendar.MONTH, Calendar.SEPTEMBER); @@ -409,8 +396,19 @@ public class OgnlUtilTest extends XWorkTestCase { cal.set(Calendar.YEAR, 2006); cal.set(Calendar.HOUR_OF_DAY, 14); cal.set(Calendar.MINUTE, 30); - - assertEquals(cal.getTime(), foo.getMeeting()); + + Date meetingTime = cal.getTime(); + formatted = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.UK) + .format(meetingTime); + props.put("meeting", formatted); + + context.put(ActionContext.LOCALE, Locale.UK); + + ognlUtil.setProperties(props, foo, context); + + assertEquals(eventTime, foo.getEvent()); + + assertEquals(meetingTime, foo.getMeeting()); //test RFC 3339 date format for JSON props.put("event", "1996-12-19T16:39:57Z"); diff --git a/core/src/test/java/com/opensymphony/xwork2/util/AnnotationUtilsTest.java b/core/src/test/java/com/opensymphony/xwork2/util/AnnotationUtilsTest.java index 16fbab4..fdc5416 100644 --- a/core/src/test/java/com/opensymphony/xwork2/util/AnnotationUtilsTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/util/AnnotationUtilsTest.java @@ -30,7 +30,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import static org.fest.assertions.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; public class AnnotationUtilsTest extends TestCase { diff --git a/core/src/test/java/com/opensymphony/xwork2/util/ClassPathFinderTest.java b/core/src/test/java/com/opensymphony/xwork2/util/ClassPathFinderTest.java index 34c0bbe..17a9deb 100644 --- a/core/src/test/java/com/opensymphony/xwork2/util/ClassPathFinderTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/util/ClassPathFinderTest.java @@ -22,6 +22,7 @@ import com.opensymphony.xwork2.XWorkTestCase; import org.apache.commons.io.IOUtils; import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.util.Enumeration; import java.util.HashMap; @@ -62,12 +63,14 @@ public class ClassPathFinderTest extends XWorkTestCase { NotURLClassLoader loader = new NotURLClassLoader(Thread.currentThread().getContextClassLoader()); Thread.currentThread().setContextClassLoader(loader); - Class<?> clazz = loader.loadClass(ClassPathFinderTest.class.getName()); - Object test = clazz.getConstructor().newInstance(); + try { + Class<?> clazz = loader.loadClass(ClassPathFinderTest.class.getName()); + Object test = clazz.getConstructor().newInstance(); - clazz.getMethod("testFinder").invoke(test); - - Thread.currentThread().setContextClassLoader(loader.parentClassLoader); + clazz.getMethod("testFinder").invoke(test); + } finally { + Thread.currentThread().setContextClassLoader(loader.parentClassLoader); + } } @@ -89,6 +92,8 @@ public class ClassPathFinderTest extends XWorkTestCase { loadedClasses.put(name, defineClass(name, classBits, 0, classBits.length)); } catch (IOException e) { throw new ClassNotFoundException("class " + name + " is not findable", e); + } catch (Exception e) { + loadedClasses.put(name, parentClassLoader.loadClass(name)); } } diff --git a/core/src/test/java/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.java b/core/src/test/java/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.java index 6969ccd..20a21ce 100644 --- a/core/src/test/java/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.java @@ -34,6 +34,7 @@ import java.net.URLConnection; import java.net.URLStreamHandler; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.jar.Attributes; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; @@ -49,10 +50,13 @@ public class JarEntryRevisionTest extends XWorkTestCase { fileManager = container.getInstance(FileManagerFactory.class).getFileManager(); } - private void createJarFile(long time) throws Exception { + private String createJarFile(long time) throws Exception { Manifest manifest = new Manifest(); manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); - FileOutputStream fos = new FileOutputStream("target/JarEntryRevisionTest_testNeedsReloading.jar", false); + Path jarPath = Paths.get(Thread.currentThread().getContextClassLoader() + .getResource("xwork-jar.jar").toURI()).getParent(); + File jarFile = jarPath.resolve("JarEntryRevisionTest_testNeedsReloading.jar").toFile(); + FileOutputStream fos = new FileOutputStream(jarFile, false); JarOutputStream target = new JarOutputStream(fos, manifest); target.putNextEntry(new ZipEntry("com/opensymphony/xwork2/util/fs/")); ZipEntry entry = new ZipEntry("com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class"); @@ -64,13 +68,14 @@ public class JarEntryRevisionTest extends XWorkTestCase { target.closeEntry(); target.close(); fos.close(); + + return jarFile.toURI().toURL().toExternalForm(); } public void testNeedsReloading() throws Exception { long now = System.currentTimeMillis(); - createJarFile(now); - URL url = new URL("jar:file:target/JarEntryRevisionTest_testNeedsReloading.jar!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class"); + URL url = new URL("jar:" + createJarFile(now) + "!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class"); Revision entry = JarEntryRevision.build(url, fileManager); assert entry != null; assertFalse(entry.needsReloading()); @@ -82,9 +87,8 @@ public class JarEntryRevisionTest extends XWorkTestCase { public void testNeedsReloadingWithContainerProvidedURLConnection() throws Exception { long now = System.currentTimeMillis(); - createJarFile(now); URL url = new URL(null, - "jar:file:target/JarEntryRevisionTest_testNeedsReloading.jar!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class", + "jar:" + createJarFile(now) + "!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class", new ContainerProvidedURLStreamHandler()); Revision entry = JarEntryRevision.build(url, fileManager); assert entry != null; @@ -97,9 +101,7 @@ public class JarEntryRevisionTest extends XWorkTestCase { public void testNeedsReloadingWithContainerProvidedURLConnectionEmptyProtocol() throws Exception { long now = System.currentTimeMillis(); - createJarFile(now); - File targetDir = new File("target"); - String targetUrlStr = targetDir.toURI().toURL().toString(); + String targetUrlStr = createJarFile(now); if (targetUrlStr.startsWith("file:")) { targetUrlStr = targetUrlStr.substring(5);//emptying protocol; we expect framework will fix it } @@ -107,7 +109,7 @@ public class JarEntryRevisionTest extends XWorkTestCase { targetUrlStr = targetUrlStr.substring(1);//we expect framework will fix it also } URL url = new URL(null, - "zip:" + targetUrlStr + "JarEntryRevisionTest_testNeedsReloading.jar!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class", + "zip:" + targetUrlStr + "!/com/opensymphony/xwork2/util/fs/JarEntryRevisionTest.class", new ContainerProvidedURLStreamHandler()); Revision entry = JarEntryRevision.build(url, fileManager); assert entry != null; diff --git a/core/src/test/java/org/apache/struts2/TestUtils.java b/core/src/test/java/org/apache/struts2/TestUtils.java index 111cd89..32f5630 100644 --- a/core/src/test/java/org/apache/struts2/TestUtils.java +++ b/core/src/test/java/org/apache/struts2/TestUtils.java @@ -91,20 +91,4 @@ public class TestUtils { return buffer.toString(); } - - public static boolean isJdk9OrLater() { - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - - if(loader instanceof URLClassLoader) { - return false; - } - - loader = TestUtils.class.getClassLoader(); - - if(loader instanceof URLClassLoader) { - return false; - } - - return true; - } } diff --git a/core/src/test/java/org/apache/struts2/conversion/UploadedFileConverterTest.java b/core/src/test/java/org/apache/struts2/conversion/UploadedFileConverterTest.java index 0dda7cb..b88d2b3 100644 --- a/core/src/test/java/org/apache/struts2/conversion/UploadedFileConverterTest.java +++ b/core/src/test/java/org/apache/struts2/conversion/UploadedFileConverterTest.java @@ -29,7 +29,7 @@ import java.lang.reflect.Member; import java.util.Collections; import java.util.Map; -import static org.fest.assertions.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; public class UploadedFileConverterTest { diff --git a/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerThemeTemplateLoaderTest.java b/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerThemeTemplateLoaderTest.java index e10968b..0c5538a 100644 --- a/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerThemeTemplateLoaderTest.java +++ b/core/src/test/java/org/apache/struts2/views/freemarker/FreemarkerThemeTemplateLoaderTest.java @@ -22,18 +22,15 @@ import freemarker.cache.TemplateLoader; import org.apache.struts2.StrutsInternalTestCase; import org.apache.struts2.components.template.Template; import org.apache.struts2.components.template.TemplateEngine; -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.hamcrest.Matcher; import org.hamcrest.core.IsEqual; -import org.mockito.Matchers; import java.util.HashMap; import java.util.Map; -import static org.fest.assertions.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.mockito.hamcrest.MockitoHamcrest.argThat; public class FreemarkerThemeTemplateLoaderTest extends StrutsInternalTestCase { @@ -65,7 +62,7 @@ public class FreemarkerThemeTemplateLoaderTest extends StrutsInternalTestCase { TemplateEngine engine = mock(TemplateEngine.class); Map<String, String> props = new HashMap<String, String>(); props.put("parent", "foo/foo"); - when(engine.getThemeProps(Matchers.argThat(new IsEqual<Template>(new Template("template", "foo/bar", "text.ftl"))))).thenReturn(props); + when(engine.getThemeProps(argThat(new IsEqual<>(new Template("template", "foo/bar", "text.ftl"))))).thenReturn(props); loader.setTemplateEngine(engine); TemplateLoader parent = mock(TemplateLoader.class); diff --git a/plugins/bean-validation/pom.xml b/plugins/bean-validation/pom.xml index d3e5693..f304f79 100644 --- a/plugins/bean-validation/pom.xml +++ b/plugins/bean-validation/pom.xml @@ -61,6 +61,37 @@ <scope>test</scope> </dependency> + <!-- + The Java EE API modules listed below are all marked @Deprecated(forRemoval=true), because they are scheduled + for removal in Java 11. So the -add-module approach will no longer work in Java 11 out of the box. + What we will need to do in Java 11 and forward is include our own copy of the Java EE APIs on the class path + or module path. For example, we can add the JAX-B APIs as a maven dependency like this: + --> + <dependency> + <groupId>javax.xml.bind</groupId> + <artifactId>jaxb-api</artifactId> + <version>2.3.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.sun.xml.bind</groupId> + <artifactId>jaxb-core</artifactId> + <version>2.3.0.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.sun.xml.bind</groupId> + <artifactId>jaxb-impl</artifactId> + <version>2.3.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>javax.activation</groupId> + <artifactId>activation</artifactId> + <version>1.1.1</version> + <scope>test</scope> + </dependency> + </dependencies> </project> \ No newline at end of file diff --git a/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java b/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java index 952cd84..dbc8070 100644 --- a/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java +++ b/plugins/embeddedjsp/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java @@ -231,12 +231,14 @@ public class EmbeddedJSPResultTest extends TestCase { NotURLClassLoader loader = new NotURLClassLoader(parentClassLoader); Thread.currentThread().setContextClassLoader(loader); - result.setLocation("org/apache/struts2/tag0.jsp"); - result.execute(null); - - assertEquals("Thissessionisnotsecure.OtherText", StringUtils.deleteWhitespace(response.getContentAsString())); + try { + result.setLocation("org/apache/struts2/tag0.jsp"); + result.execute(null); - Thread.currentThread().setContextClassLoader(parentClassLoader); + assertEquals("Thissessionisnotsecure.OtherText", StringUtils.deleteWhitespace(response.getContentAsString())); + } finally { + Thread.currentThread().setContextClassLoader(parentClassLoader); + } } @Override diff --git a/plugins/json/pom.xml b/plugins/json/pom.xml index 9caa942..a89b221 100644 --- a/plugins/json/pom.xml +++ b/plugins/json/pom.xml @@ -101,8 +101,8 @@ </dependency> <dependency> - <groupId>org.easytesting</groupId> - <artifactId>fest-assert</artifactId> + <groupId>org.assertj</groupId> + <artifactId>assertj-core</artifactId> <scope>test</scope> </dependency> diff --git a/plugins/json/src/test/java/org/apache/struts2/json/JSONValidationInterceptorTest.java b/plugins/json/src/test/java/org/apache/struts2/json/JSONValidationInterceptorTest.java index 6447d37..a4fd58d 100644 --- a/plugins/json/src/test/java/org/apache/struts2/json/JSONValidationInterceptorTest.java +++ b/plugins/json/src/test/java/org/apache/struts2/json/JSONValidationInterceptorTest.java @@ -39,7 +39,7 @@ import java.io.StringWriter; import java.util.HashMap; import java.util.Map; -import static org.fest.assertions.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; public class JSONValidationInterceptorTest extends StrutsTestCase { diff --git a/plugins/rest/pom.xml b/plugins/rest/pom.xml index 88a7d97..33324af 100644 --- a/plugins/rest/pom.xml +++ b/plugins/rest/pom.xml @@ -80,8 +80,8 @@ </dependency> <dependency> - <groupId>org.easytesting</groupId> - <artifactId>fest-assert</artifactId> + <groupId>org.assertj</groupId> + <artifactId>assertj-core</artifactId> <scope>test</scope> </dependency> diff --git a/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonXmlHandlerTest.java b/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonXmlHandlerTest.java index e2c4eda..befefee 100644 --- a/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonXmlHandlerTest.java +++ b/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JacksonXmlHandlerTest.java @@ -28,7 +28,7 @@ import java.io.StringWriter; import java.io.Writer; import java.util.Arrays; -import static org.fest.assertions.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; public class JacksonXmlHandlerTest extends XWorkTestCase { diff --git a/pom.xml b/pom.xml index 5ed9637..02fcdf6 100644 --- a/pom.xml +++ b/pom.xml @@ -110,6 +110,7 @@ <!-- Sonar --> <sonar.host.url>https://builds.apache.org/analysis/</sonar.host.url> + <maven-surefire-plugin.version>2.22.1</maven-surefire-plugin.version> </properties> <profiles> @@ -169,6 +170,7 @@ </activation> <properties> <!-- coverall version 4.3.0 does not work with java 9, see https://github.com/trautonen/coveralls-maven-plugin/issues/112 --> + <!-- TODO delete coveralls.skip property after fix of https://github.com/cobertura/cobertura/issues/271 --> <coveralls.skip>true</coveralls.skip> </properties> <build> @@ -178,7 +180,8 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> - <argLine>--add-modules java.activation --add-modules java.xml.bind</argLine> + <!-- TODO delete forkCount=0 after fix of https://issues.apache.org/jira/browse/SUREFIRE-1588 --> + <forkCount>0</forkCount> </configuration> </plugin> </plugins> @@ -233,12 +236,12 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <version>2.22.1</version> + <version>${maven-surefire-plugin.version}</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> - <version>2.22.1</version> + <version>${maven-surefire-plugin.version}</version> </dependency> </dependencies> <configuration> @@ -972,16 +975,16 @@ </dependency> <dependency> - <groupId>org.easytesting</groupId> - <artifactId>fest-assert</artifactId> - <version>1.4</version> + <groupId>org.assertj</groupId> + <artifactId>assertj-core</artifactId> + <version>2.9.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> - <artifactId>mockito-all</artifactId> - <version>1.10.19</version> + <artifactId>mockito-core</artifactId> + <version>2.23.0</version> <scope>test</scope> </dependency>