Browse Source

Merge branch '1.5.x'

pull/12272/merge
Andy Wilkinson 8 years ago
parent
commit
35b7a16917
  1. 2
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactory.java
  2. 2
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactory.java
  3. 2
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactory.java
  4. 12
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactory.java
  5. 39
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/server/StaticResourceJars.java
  6. 98
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/StaticResourceJarsTests.java
  7. 4
      spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/IdeApplicationLauncher.java

2
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactory.java

@ -287,7 +287,7 @@ public class JettyServletWebServerFactory extends AbstractServletWebServerFactor @@ -287,7 +287,7 @@ public class JettyServletWebServerFactory extends AbstractServletWebServerFactor
private Resource createResource(URL url) throws IOException {
if ("file".equals(url.getProtocol())) {
File file = new File(url.getFile());
File file = new File(getDecodedFile(url));
if (file.isFile()) {
return Resource.newResource("jar:" + url + "!/META-INF/resources");
}

2
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactory.java

@ -682,7 +682,7 @@ public class TomcatServletWebServerFactory extends AbstractServletWebServerFacto @@ -682,7 +682,7 @@ public class TomcatServletWebServerFactory extends AbstractServletWebServerFacto
private void addResourceJars(List<URL> resourceJarUrls) {
for (URL url : resourceJarUrls) {
String file = url.getFile();
String file = getDecodedFile(url);
if (file.endsWith(".jar") || file.endsWith(".jar!/")) {
String jar = url.toString();
if (!jar.startsWith("jar:")) {

2
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactory.java

@ -367,7 +367,7 @@ public class UndertowServletWebServerFactory extends AbstractServletWebServerFac @@ -367,7 +367,7 @@ public class UndertowServletWebServerFactory extends AbstractServletWebServerFac
: new LoaderHidingResourceManager(rootResourceManager));
for (URL url : metaInfResourceUrls) {
if ("file".equals(url.getProtocol())) {
File file = new File(url.getFile());
File file = new File(getDecodedFile(url));
if (file.isFile()) {
try {
resourceJarUrls.add(new URL("jar:" + url + "!/"));

12
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactory.java

@ -17,7 +17,9 @@ @@ -17,7 +17,9 @@
package org.springframework.boot.web.servlet.server;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
@ -280,6 +282,16 @@ public abstract class AbstractServletWebServerFactory @@ -280,6 +282,16 @@ public abstract class AbstractServletWebServerFactory
return this.staticResourceJars.getUrls();
}
protected final String getDecodedFile(URL url) {
try {
return URLDecoder.decode(url.getFile(), "UTF-8");
}
catch (UnsupportedEncodingException ex) {
throw new IllegalStateException(
"Failed to decode '" + url.getFile() + "' using UTF-8");
}
}
protected final File getValidSessionStoreDir() {
return getValidSessionStoreDir(true);
}

39
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/server/StaticResourceJars.java

@ -18,15 +18,18 @@ package org.springframework.boot.web.servlet.server; @@ -18,15 +18,18 @@ package org.springframework.boot.web.servlet.server;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.management.ManagementFactory;
import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarFile;
import java.util.stream.Stream;
/**
* Logic to extract URLs of static resource jars (those containing
@ -37,21 +40,25 @@ import java.util.jar.JarFile; @@ -37,21 +40,25 @@ import java.util.jar.JarFile;
*/
class StaticResourceJars {
public final List<URL> getUrls() {
List<URL> getUrls() {
ClassLoader classLoader = getClass().getClassLoader();
List<URL> urls = new ArrayList<>();
if (classLoader instanceof URLClassLoader) {
for (URL url : ((URLClassLoader) classLoader).getURLs()) {
addUrl(urls, url);
}
return getUrlsFrom(((URLClassLoader) classLoader).getURLs());
}
else {
for (String entry : ManagementFactory.getRuntimeMXBean().getClassPath()
.split(File.pathSeparator)) {
addUrl(urls, toUrl(entry));
}
return getUrlsFrom(Stream
.of(ManagementFactory.getRuntimeMXBean().getClassPath()
.split(File.pathSeparator))
.map(this::toUrl).toArray(URL[]::new));
}
}
List<URL> getUrlsFrom(URL... urls) {
List<URL> resourceJarUrls = new ArrayList<>();
for (URL url : urls) {
addUrl(resourceJarUrls, url);
}
return urls;
return resourceJarUrls;
}
private URL toUrl(String classPathEntry) {
@ -67,7 +74,7 @@ class StaticResourceJars { @@ -67,7 +74,7 @@ class StaticResourceJars {
private void addUrl(List<URL> urls, URL url) {
try {
if ("file".equals(url.getProtocol())) {
addUrlFile(urls, url, new File(url.getFile()));
addUrlFile(urls, url, new File(getDecodedFile(url)));
}
else {
addUrlConnection(urls, url, url.openConnection());
@ -78,6 +85,16 @@ class StaticResourceJars { @@ -78,6 +85,16 @@ class StaticResourceJars {
}
}
private String getDecodedFile(URL url) {
try {
return URLDecoder.decode(url.getFile(), "UTF-8");
}
catch (UnsupportedEncodingException ex) {
throw new IllegalStateException(
"Failed to decode '" + url.getFile() + "' using UTF-8");
}
}
private void addUrlFile(List<URL> urls, URL url, File file) {
if ((file.isDirectory() && new File(file, "META-INF/resources").isDirectory())
|| isResourcesJar(file)) {

98
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/StaticResourceJarsTests.java

@ -0,0 +1,98 @@ @@ -0,0 +1,98 @@
/*
* Copyright 2012-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.web.servlet.server;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.function.Consumer;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link StaticResourceJars}.
*
* @author Rupert Madden-Abbott
* @author Andy Wilkinson
*/
public class StaticResourceJarsTests {
@Rule
public final TemporaryFolder temporaryFolder = new TemporaryFolder();
@Test
public void includeJarWithStaticResources() throws Exception {
File jarFile = createResourcesJar("test-resources.jar");
List<URL> staticResourceJarUrls = new StaticResourceJars()
.getUrlsFrom(jarFile.toURI().toURL());
assertThat(staticResourceJarUrls).hasSize(1);
}
@Test
public void includeJarWithStaticResourcesWithUrlEncodedSpaces() throws Exception {
File jarFile = createResourcesJar("test resources.jar");
List<URL> staticResourceJarUrls = new StaticResourceJars()
.getUrlsFrom(jarFile.toURI().toURL());
assertThat(staticResourceJarUrls).hasSize(1);
}
@Test
public void excludeJarWithoutStaticResources() throws Exception {
File jarFile = createJar("dependency.jar");
List<URL> staticResourceJarUrls = new StaticResourceJars()
.getUrlsFrom(jarFile.toURI().toURL());
assertThat(staticResourceJarUrls).hasSize(0);
}
private File createResourcesJar(String name) throws IOException {
return createJar(name, (output) -> {
JarEntry jarEntry = new JarEntry("META-INF/resources");
try {
output.putNextEntry(jarEntry);
output.closeEntry();
}
catch (IOException ex) {
throw new RuntimeException(ex);
}
});
}
private File createJar(String name) throws IOException {
return createJar(name, null);
}
private File createJar(String name, Consumer<JarOutputStream> customizer)
throws IOException {
File jarFile = this.temporaryFolder.newFile(name);
JarOutputStream jarOutputStream = new JarOutputStream(
new FileOutputStream(jarFile));
if (customizer != null) {
customizer.accept(jarOutputStream);
}
jarOutputStream.close();
return jarFile;
}
}

4
spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/IdeApplicationLauncher.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2017 the original author or authors.
* Copyright 2012-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -40,7 +40,7 @@ import org.springframework.util.StringUtils; @@ -40,7 +40,7 @@ import org.springframework.util.StringUtils;
*/
class IdeApplicationLauncher extends AbstractApplicationLauncher {
private final File exploded = new File("target/ide");
private final File exploded = new File("target/ide application");
IdeApplicationLauncher(ApplicationBuilder applicationBuilder) {
super(applicationBuilder);

Loading…
Cancel
Save