You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by ya...@apache.org on 2018/11/16 14:16:58 UTC
[struts] 01/02: pass all current tests with java 9
This is an automated email from the ASF dual-hosted git repository.
yasserzamani pushed a commit to branch struts-2-5-x
in repository https://gitbox.apache.org/repos/asf/struts.git
commit 75dc4c00d20a1bde86897dc73ff5098b91eaf0f0
Author: Yasser Zamani <ya...@apache.org>
AuthorDate: Sun Nov 11 14:31:35 2018 +0330
pass all current tests with java 9
See also WW-4845
(cherry picked from commit a5d888a)
---
.travis.yml | 1 +
.../opensymphony/xwork2/util/ClassPathFinder.java | 33 ++++-----
.../com/opensymphony/xwork2/ognl/OgnlUtilTest.java | 15 ++++-
.../test/java/org/apache/struts2/TestUtils.java | 17 +++++
.../struts2/jasper/JspCompilationContext.java | 4 +-
.../struts2/jasper/compiler/JspRuntimeContext.java | 78 +++++++++++++---------
.../struts2/jasper/compiler/TagFileProcessor.java | 3 +-
.../struts2/jasper/compiler/TldLocationsCache.java | 44 ++++++------
8 files changed, 117 insertions(+), 78 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 14daf85..8d98574 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,6 +4,7 @@ sudo: false
jdk:
- openjdk7
- oraclejdk8
+ - oraclejdk9
install: true
script: mvn test -DskipAssembly
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 5188149..5838abd 100644
--- a/core/src/main/java/com/opensymphony/xwork2/util/ClassPathFinder.java
+++ b/core/src/main/java/com/opensymphony/xwork2/util/ClassPathFinder.java
@@ -27,6 +27,7 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLClassLoader;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Vector;
import java.util.zip.ZipEntry;
@@ -77,11 +78,7 @@ public class ClassPathFinder {
*/
public Vector<String> findMatches() {
Vector<String> matches = new Vector<>();
- URLClassLoader cl = getURLClassLoader();
- if (cl == null ) {
- throw new XWorkException("unable to attain an URLClassLoader") ;
- }
- URL[] parentUrls = cl.getURLs();
+ URL[] parentUrls = getClassLoaderURLs();
compiledPattern = patternMatcher.compilePattern(pattern);
for (URL url : parentUrls) {
if (!"file".equals(url.getProtocol())) {
@@ -173,20 +170,24 @@ public class ClassPathFinder {
this.patternMatcher = patternMatcher;
}
- private URLClassLoader getURLClassLoader() {
- URLClassLoader ucl = null;
+ private URL[] getClassLoaderURLs() {
+ URL[] urls;
ClassLoader loader = Thread.currentThread().getContextClassLoader();
-
- if(! (loader instanceof URLClassLoader)) {
+
+ if (!(loader instanceof URLClassLoader)) {
loader = ClassPathFinder.class.getClassLoader();
- if (loader instanceof URLClassLoader) {
- ucl = (URLClassLoader) loader ;
- }
}
- else {
- ucl = (URLClassLoader) loader;
+
+ 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 ucl ;
+
+ 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 ca11433..d6372fd 100644
--- a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java
+++ b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java
@@ -27,6 +27,7 @@ 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.util.*;
@@ -374,8 +375,18 @@ public class OgnlUtilTest extends XWorkTestCase {
assertEquals(cal.getTime(), foo.getBirthday());
//UK style test
- props.put("event", "18/10/2006 14:23:45");
- props.put("meeting", "09/09/2006 14:30");
+ 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);
diff --git a/core/src/test/java/org/apache/struts2/TestUtils.java b/core/src/test/java/org/apache/struts2/TestUtils.java
index 88789e1..111cd89 100644
--- a/core/src/test/java/org/apache/struts2/TestUtils.java
+++ b/core/src/test/java/org/apache/struts2/TestUtils.java
@@ -20,6 +20,7 @@ package org.apache.struts2;
import java.io.InputStream;
import java.net.URL;
+import java.net.URLClassLoader;
import java.util.StringTokenizer;
/**
@@ -90,4 +91,20 @@ 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/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/JspCompilationContext.java b/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/JspCompilationContext.java
index a8fbb60..b0bb32c 100644
--- a/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/JspCompilationContext.java
+++ b/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/JspCompilationContext.java
@@ -80,7 +80,7 @@ public class JspCompilationContext {
protected String baseURI;
protected String outputDir;
protected ServletContext context;
- protected URLClassLoader loader;
+ protected ClassLoader loader;
protected JspRuntimeContext rctxt;
@@ -177,7 +177,7 @@ public class JspCompilationContext {
return rctxt.getParentClassLoader();
}
- public void setClassLoader(URLClassLoader loader) {
+ public void setClassLoader(ClassLoader loader) {
this.loader = loader;
}
diff --git a/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/JspRuntimeContext.java b/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/JspRuntimeContext.java
index b2316b5..e9698e2 100644
--- a/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/JspRuntimeContext.java
+++ b/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/JspRuntimeContext.java
@@ -33,12 +33,14 @@ import javax.servlet.jsp.JspFactory;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilePermission;
+import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.CodeSource;
import java.security.PermissionCollection;
import java.security.Policy;
import java.security.cert.Certificate;
+import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -121,11 +123,9 @@ public final class JspRuntimeContext {
this.options = options;
// Get the parent class loader
- parentClassLoader =
- (URLClassLoader) Thread.currentThread().getContextClassLoader();
+ parentClassLoader = Thread.currentThread().getContextClassLoader();
if (parentClassLoader == null) {
- parentClassLoader =
- (URLClassLoader) this.getClass().getClassLoader();
+ parentClassLoader = this.getClass().getClassLoader();
}
if (log.isDebugEnabled()) {
@@ -138,7 +138,11 @@ public final class JspRuntimeContext {
}
}
- initClassPath();
+ try {
+ initClassPath();
+ } catch (IOException e) {
+ context.log("ClassPath Init for context failed", e);
+ }
if (context instanceof JspCServletContext) {
return;
@@ -165,7 +169,7 @@ public final class JspRuntimeContext {
*/
private ServletContext context;
private Options options;
- private URLClassLoader parentClassLoader;
+ private ClassLoader parentClassLoader;
private PermissionCollection permissionCollection;
private CodeSource codeSource;
private String classpath;
@@ -233,7 +237,7 @@ public final class JspRuntimeContext {
*
* @return URLClassLoader parent
*/
- public URLClassLoader getParentClassLoader() {
+ public ClassLoader getParentClassLoader() {
return parentClassLoader;
}
@@ -333,9 +337,14 @@ public final class JspRuntimeContext {
/**
* Method used to initialize classpath for compiles.
*/
- private void initClassPath() {
+ private void initClassPath() throws IOException {
- URL[] urls = parentClassLoader.getURLs();
+ URL[] urls;
+ if (parentClassLoader instanceof URLClassLoader) {
+ urls = ((URLClassLoader) parentClassLoader).getURLs();
+ } else { //jdk9 or later
+ urls = Collections.list(parentClassLoader.getResources("")).toArray(new URL[0]);
+ }
StringBuffer cpath = new StringBuffer();
String sep = System.getProperty("path.separator");
@@ -418,34 +427,37 @@ public final class JspRuntimeContext {
permissionCollection.add(new RuntimePermission(
"accessClassInPackage.org.apache.struts2.jasper.runtime"));
+ URL[] urls;
if (parentClassLoader instanceof URLClassLoader) {
- URL[] urls = parentClassLoader.getURLs();
- String jarUrl = null;
- String jndiUrl = null;
- for (int i = 0; i < urls.length; i++) {
- if (jndiUrl == null
- && urls[i].toString().startsWith("jndi:")) {
- jndiUrl = urls[i].toString() + "-";
- }
- if (jarUrl == null
- && urls[i].toString().startsWith("jar:jndi:")
- ) {
- jarUrl = urls[i].toString();
- jarUrl = jarUrl.substring(0, jarUrl.length() - 2);
- jarUrl = jarUrl.substring(0,
- jarUrl.lastIndexOf('/')) + "/-";
- }
+ urls = ((URLClassLoader) parentClassLoader).getURLs();
+ } else { //jdk9 or later
+ urls = Collections.list(parentClassLoader.getResources("")).toArray(new URL[0]);
+ }
+ String jarUrl = null;
+ String jndiUrl = null;
+ for (URL url1 : urls) {
+ if (jndiUrl == null
+ && url1.toString().startsWith("jndi:")) {
+ jndiUrl = url1.toString() + "-";
}
- if (jarUrl != null) {
- permissionCollection.add(
- new FilePermission(jarUrl, "read"));
- permissionCollection.add(
- new FilePermission(jarUrl.substring(4), "read"));
+ if (jarUrl == null
+ && url1.toString().startsWith("jar:jndi:")
+ ) {
+ jarUrl = url1.toString();
+ jarUrl = jarUrl.substring(0, jarUrl.length() - 2);
+ jarUrl = jarUrl.substring(0,
+ jarUrl.lastIndexOf('/')) + "/-";
}
- if (jndiUrl != null)
- permissionCollection.add(
- new FilePermission(jndiUrl, "read"));
}
+ if (jarUrl != null) {
+ permissionCollection.add(
+ new FilePermission(jarUrl, "read"));
+ permissionCollection.add(
+ new FilePermission(jarUrl.substring(4), "read"));
+ }
+ if (jndiUrl != null)
+ permissionCollection.add(
+ new FilePermission(jndiUrl, "read"));
} catch (Exception e) {
context.log("Security Init for context failed", e);
}
diff --git a/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/TagFileProcessor.java b/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/TagFileProcessor.java
index 5f3d13a..bbf2417 100644
--- a/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/TagFileProcessor.java
+++ b/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/TagFileProcessor.java
@@ -594,8 +594,7 @@ class TagFileProcessor {
rctxt.addWrapper(tagFileJarPath + tagFilePath, wrapper);
// Use same classloader and classpath for compiling tag files
- wrapper.getJspEngineContext().setClassLoader(
- (URLClassLoader) ctxt.getClassLoader());
+ wrapper.getJspEngineContext().setClassLoader(ctxt.getClassLoader());
wrapper.getJspEngineContext().setClassPath(ctxt.getClassPath());
} else {
// Make sure that JspCompilationContext gets the latest TagInfo
diff --git a/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/TldLocationsCache.java b/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/TldLocationsCache.java
index 0bac6fa..a8a26be 100644
--- a/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/TldLocationsCache.java
+++ b/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/compiler/TldLocationsCache.java
@@ -25,12 +25,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLConnection;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.StringTokenizer;
+import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.xml.sax.InputSource;
@@ -508,24 +503,27 @@ public class TldLocationsCache {
ClassLoader loader = webappLoader;
while (loader != null) {
+ URL[] urls;
if (loader instanceof URLClassLoader) {
- URL[] urls = ((URLClassLoader) loader).getURLs();
- for (int i=0; i<urls.length; i++) {
- URLConnection conn = urls[i].openConnection();
- if (conn instanceof JarURLConnection) {
- if (needScanJar(loader, webappLoader,
- ((JarURLConnection) conn).getJarFile().getName())) {
- scanJar((JarURLConnection) conn, true);
- }
- } else {
- String urlStr = urls[i].toString();
- if (urlStr.startsWith(FILE_PROTOCOL)
- && urlStr.endsWith(JAR_FILE_SUFFIX)
- && needScanJar(loader, webappLoader, urlStr)) {
- URL jarURL = new URL("jar:" + urlStr + "!/");
- scanJar((JarURLConnection) jarURL.openConnection(),
- true);
- }
+ urls = ((URLClassLoader) loader).getURLs();
+ } else { //jdk9 or later
+ urls = Collections.list(loader.getResources("")).toArray(new URL[0]);
+ }
+ for (URL url : urls) {
+ URLConnection conn = url.openConnection();
+ if (conn instanceof JarURLConnection) {
+ if (needScanJar(loader, webappLoader,
+ ((JarURLConnection) conn).getJarFile().getName())) {
+ scanJar((JarURLConnection) conn, true);
+ }
+ } else {
+ String urlStr = url.toString();
+ if (urlStr.startsWith(FILE_PROTOCOL)
+ && urlStr.endsWith(JAR_FILE_SUFFIX)
+ && needScanJar(loader, webappLoader, urlStr)) {
+ URL jarURL = new URL("jar:" + urlStr + "!/");
+ scanJar((JarURLConnection) jarURL.openConnection(),
+ true);
}
}
}