pass all current tests with java 9

See also WW-4845
This commit is contained in:
Yasser Zamani
2018-11-11 14:31:35 +03:30
parent 2d86cc69dc
commit a5d888a373
8 changed files with 119 additions and 80 deletions
+1
View File
@@ -4,6 +4,7 @@ sudo: false
jdk: jdk:
- openjdk7 - openjdk7
- oraclejdk8 - oraclejdk8
- oraclejdk9
install: true install: true
script: mvn test -DskipAssembly script: mvn test -DskipAssembly
@@ -27,6 +27,7 @@ import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Vector; import java.util.Vector;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
@@ -77,11 +78,7 @@ public class ClassPathFinder {
*/ */
public Vector<String> findMatches() { public Vector<String> findMatches() {
Vector<String> matches = new Vector<>(); Vector<String> matches = new Vector<>();
URLClassLoader cl = getURLClassLoader(); URL[] parentUrls = getClassLoaderURLs();
if (cl == null ) {
throw new XWorkException("unable to attain an URLClassLoader") ;
}
URL[] parentUrls = cl.getURLs();
compiledPattern = patternMatcher.compilePattern(pattern); compiledPattern = patternMatcher.compilePattern(pattern);
for (URL url : parentUrls) { for (URL url : parentUrls) {
if (!"file".equals(url.getProtocol())) { if (!"file".equals(url.getProtocol())) {
@@ -173,20 +170,24 @@ public class ClassPathFinder {
this.patternMatcher = patternMatcher; this.patternMatcher = patternMatcher;
} }
private URLClassLoader getURLClassLoader() { private URL[] getClassLoaderURLs() {
URLClassLoader ucl = null; URL[] urls;
ClassLoader loader = Thread.currentThread().getContextClassLoader(); ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (!(loader instanceof URLClassLoader)) { if (!(loader instanceof URLClassLoader)) {
loader = ClassPathFinder.class.getClassLoader(); loader = ClassPathFinder.class.getClassLoader();
if (loader instanceof URLClassLoader) {
ucl = (URLClassLoader) loader ;
}
}
else {
ucl = (URLClassLoader) loader;
} }
return ucl ; 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;
} }
} }
@@ -27,6 +27,7 @@ import com.opensymphony.xwork2.test.User;
import com.opensymphony.xwork2.util.*; import com.opensymphony.xwork2.util.*;
import com.opensymphony.xwork2.util.reflection.ReflectionContextState; import com.opensymphony.xwork2.util.reflection.ReflectionContextState;
import ognl.*; import ognl.*;
import org.apache.struts2.TestUtils;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.*; import java.util.*;
@@ -374,8 +375,18 @@ public class OgnlUtilTest extends XWorkTestCase {
assertEquals(cal.getTime(), foo.getBirthday()); assertEquals(cal.getTime(), foo.getBirthday());
//UK style test //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("event", "18/10/2006 14:23:45");
props.put("meeting", "09/09/2006 14:30"); props.put("meeting", "09/09/2006 14:30");
}
context.put(ActionContext.LOCALE, Locale.UK); context.put(ActionContext.LOCALE, Locale.UK);
ognlUtil.setProperties(props, foo, context); ognlUtil.setProperties(props, foo, context);
@@ -20,6 +20,7 @@ package org.apache.struts2;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader;
import java.util.StringTokenizer; import java.util.StringTokenizer;
/** /**
@@ -90,4 +91,20 @@ public class TestUtils {
return buffer.toString(); 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;
}
} }
@@ -80,7 +80,7 @@ public class JspCompilationContext {
protected String baseURI; protected String baseURI;
protected String outputDir; protected String outputDir;
protected ServletContext context; protected ServletContext context;
protected URLClassLoader loader; protected ClassLoader loader;
protected JspRuntimeContext rctxt; protected JspRuntimeContext rctxt;
@@ -177,7 +177,7 @@ public class JspCompilationContext {
return rctxt.getParentClassLoader(); return rctxt.getParentClassLoader();
} }
public void setClassLoader(URLClassLoader loader) { public void setClassLoader(ClassLoader loader) {
this.loader = loader; this.loader = loader;
} }
@@ -33,12 +33,14 @@ import javax.servlet.jsp.JspFactory;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FilePermission; import java.io.FilePermission;
import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.security.CodeSource; import java.security.CodeSource;
import java.security.PermissionCollection; import java.security.PermissionCollection;
import java.security.Policy; import java.security.Policy;
import java.security.cert.Certificate; import java.security.cert.Certificate;
import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@@ -121,11 +123,9 @@ public final class JspRuntimeContext {
this.options = options; this.options = options;
// Get the parent class loader // Get the parent class loader
parentClassLoader = parentClassLoader = Thread.currentThread().getContextClassLoader();
(URLClassLoader) Thread.currentThread().getContextClassLoader();
if (parentClassLoader == null) { if (parentClassLoader == null) {
parentClassLoader = parentClassLoader = this.getClass().getClassLoader();
(URLClassLoader) this.getClass().getClassLoader();
} }
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
@@ -138,7 +138,11 @@ public final class JspRuntimeContext {
} }
} }
try {
initClassPath(); initClassPath();
} catch (IOException e) {
context.log("ClassPath Init for context failed", e);
}
if (context instanceof JspCServletContext) { if (context instanceof JspCServletContext) {
return; return;
@@ -165,7 +169,7 @@ public final class JspRuntimeContext {
*/ */
private ServletContext context; private ServletContext context;
private Options options; private Options options;
private URLClassLoader parentClassLoader; private ClassLoader parentClassLoader;
private PermissionCollection permissionCollection; private PermissionCollection permissionCollection;
private CodeSource codeSource; private CodeSource codeSource;
private String classpath; private String classpath;
@@ -233,7 +237,7 @@ public final class JspRuntimeContext {
* *
* @return URLClassLoader parent * @return URLClassLoader parent
*/ */
public URLClassLoader getParentClassLoader() { public ClassLoader getParentClassLoader() {
return parentClassLoader; return parentClassLoader;
} }
@@ -333,9 +337,14 @@ public final class JspRuntimeContext {
/** /**
* Method used to initialize classpath for compiles. * 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(); StringBuffer cpath = new StringBuffer();
String sep = System.getProperty("path.separator"); String sep = System.getProperty("path.separator");
@@ -418,19 +427,23 @@ public final class JspRuntimeContext {
permissionCollection.add(new RuntimePermission( permissionCollection.add(new RuntimePermission(
"accessClassInPackage.org.apache.struts2.jasper.runtime")); "accessClassInPackage.org.apache.struts2.jasper.runtime"));
URL[] urls;
if (parentClassLoader instanceof URLClassLoader) { if (parentClassLoader instanceof URLClassLoader) {
URL[] urls = parentClassLoader.getURLs(); urls = ((URLClassLoader) parentClassLoader).getURLs();
} else { //jdk9 or later
urls = Collections.list(parentClassLoader.getResources("")).toArray(new URL[0]);
}
String jarUrl = null; String jarUrl = null;
String jndiUrl = null; String jndiUrl = null;
for (int i = 0; i < urls.length; i++) { for (URL url1 : urls) {
if (jndiUrl == null if (jndiUrl == null
&& urls[i].toString().startsWith("jndi:")) { && url1.toString().startsWith("jndi:")) {
jndiUrl = urls[i].toString() + "-"; jndiUrl = url1.toString() + "-";
} }
if (jarUrl == null if (jarUrl == null
&& urls[i].toString().startsWith("jar:jndi:") && url1.toString().startsWith("jar:jndi:")
) { ) {
jarUrl = urls[i].toString(); jarUrl = url1.toString();
jarUrl = jarUrl.substring(0, jarUrl.length() - 2); jarUrl = jarUrl.substring(0, jarUrl.length() - 2);
jarUrl = jarUrl.substring(0, jarUrl = jarUrl.substring(0,
jarUrl.lastIndexOf('/')) + "/-"; jarUrl.lastIndexOf('/')) + "/-";
@@ -445,7 +458,6 @@ public final class JspRuntimeContext {
if (jndiUrl != null) if (jndiUrl != null)
permissionCollection.add( permissionCollection.add(
new FilePermission(jndiUrl, "read")); new FilePermission(jndiUrl, "read"));
}
} catch (Exception e) { } catch (Exception e) {
context.log("Security Init for context failed", e); context.log("Security Init for context failed", e);
} }
@@ -594,8 +594,7 @@ class TagFileProcessor {
rctxt.addWrapper(tagFileJarPath + tagFilePath, wrapper); rctxt.addWrapper(tagFileJarPath + tagFilePath, wrapper);
// Use same classloader and classpath for compiling tag files // Use same classloader and classpath for compiling tag files
wrapper.getJspEngineContext().setClassLoader( wrapper.getJspEngineContext().setClassLoader(ctxt.getClassLoader());
(URLClassLoader) ctxt.getClassLoader());
wrapper.getJspEngineContext().setClassPath(ctxt.getClassPath()); wrapper.getJspEngineContext().setClassPath(ctxt.getClassPath());
} else { } else {
// Make sure that JspCompilationContext gets the latest TagInfo // Make sure that JspCompilationContext gets the latest TagInfo
@@ -25,12 +25,7 @@ import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.net.URLConnection; import java.net.URLConnection;
import java.util.Enumeration; import java.util.*;
import java.util.Hashtable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import org.xml.sax.InputSource; import org.xml.sax.InputSource;
@@ -508,17 +503,21 @@ public class TldLocationsCache {
ClassLoader loader = webappLoader; ClassLoader loader = webappLoader;
while (loader != null) { while (loader != null) {
URL[] urls;
if (loader instanceof URLClassLoader) { if (loader instanceof URLClassLoader) {
URL[] urls = ((URLClassLoader) loader).getURLs(); urls = ((URLClassLoader) loader).getURLs();
for (int i=0; i<urls.length; i++) { } else { //jdk9 or later
URLConnection conn = urls[i].openConnection(); urls = Collections.list(loader.getResources("")).toArray(new URL[0]);
}
for (URL url : urls) {
URLConnection conn = url.openConnection();
if (conn instanceof JarURLConnection) { if (conn instanceof JarURLConnection) {
if (needScanJar(loader, webappLoader, if (needScanJar(loader, webappLoader,
((JarURLConnection) conn).getJarFile().getName())) { ((JarURLConnection) conn).getJarFile().getName())) {
scanJar((JarURLConnection) conn, true); scanJar((JarURLConnection) conn, true);
} }
} else { } else {
String urlStr = urls[i].toString(); String urlStr = url.toString();
if (urlStr.startsWith(FILE_PROTOCOL) if (urlStr.startsWith(FILE_PROTOCOL)
&& urlStr.endsWith(JAR_FILE_SUFFIX) && urlStr.endsWith(JAR_FILE_SUFFIX)
&& needScanJar(loader, webappLoader, urlStr)) { && needScanJar(loader, webappLoader, urlStr)) {
@@ -528,7 +527,6 @@ public class TldLocationsCache {
} }
} }
} }
}
loader = loader.getParent(); loader = loader.getParent();
} }