Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
81ddebbc
Commit
81ddebbc
authored
Sep 16, 2019
by
Stephane Nicoll
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '2.1.x'
Closes gh-18239
parents
b3b66057
9434cb0e
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
60 additions
and
33 deletions
+60
-33
ClassLoaderFilesResourcePatternResolver.java
...ools/restart/ClassLoaderFilesResourcePatternResolver.java
+36
-33
ClassLoaderFilesResourcePatternResolverTests.java
...restart/ClassLoaderFilesResourcePatternResolverTests.java
+24
-0
No files found.
spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/restart/ClassLoaderFilesResourcePatternResolver.java
View file @
81ddebbc
...
...
@@ -22,8 +22,10 @@ import java.lang.reflect.Field;
import
java.net.MalformedURLException
;
import
java.net.URL
;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Map.Entry
;
import
java.util.function.Supplier
;
import
org.springframework.boot.devtools.restart.classloader.ClassLoaderFile
;
import
org.springframework.boot.devtools.restart.classloader.ClassLoaderFile.Kind
;
...
...
@@ -31,6 +33,7 @@ import org.springframework.boot.devtools.restart.classloader.ClassLoaderFileURLS
import
org.springframework.boot.devtools.restart.classloader.ClassLoaderFiles
;
import
org.springframework.boot.devtools.restart.classloader.ClassLoaderFiles.SourceFolder
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.support.AbstractApplicationContext
;
import
org.springframework.core.io.AbstractResource
;
import
org.springframework.core.io.DefaultResourceLoader
;
import
org.springframework.core.io.ProtocolResolver
;
...
...
@@ -67,7 +70,8 @@ final class ClassLoaderFilesResourcePatternResolver implements ResourcePatternRe
private
final
ClassLoaderFiles
classLoaderFiles
;
ClassLoaderFilesResourcePatternResolver
(
ApplicationContext
applicationContext
,
ClassLoaderFiles
classLoaderFiles
)
{
ClassLoaderFilesResourcePatternResolver
(
AbstractApplicationContext
applicationContext
,
ClassLoaderFiles
classLoaderFiles
)
{
this
.
classLoaderFiles
=
classLoaderFiles
;
this
.
patternResolverDelegate
=
getResourcePatternResolverFactory
()
.
getResourcePatternResolver
(
applicationContext
,
retrieveResourceLoader
(
applicationContext
));
...
...
@@ -195,28 +199,11 @@ final class ClassLoaderFilesResourcePatternResolver implements ResourcePatternRe
*/
private
static
class
ResourcePatternResolverFactory
{
ResourcePatternResolver
getResourcePatternResolver
(
ApplicationContext
applicationContext
,
ResourcePatternResolver
getResourcePatternResolver
(
A
bstractA
pplicationContext
applicationContext
,
ResourceLoader
resourceLoader
)
{
if
(
resourceLoader
==
null
)
{
resourceLoader
=
new
DefaultResourceLoader
();
copyProtocolResolvers
(
applicationContext
,
resourceLoader
);
}
return
new
PathMatchingResourcePatternResolver
(
resourceLoader
);
}
protected
final
void
copyProtocolResolvers
(
ApplicationContext
applicationContext
,
ResourceLoader
resourceLoader
)
{
if
(
applicationContext
instanceof
DefaultResourceLoader
&&
resourceLoader
instanceof
DefaultResourceLoader
)
{
copyProtocolResolvers
((
DefaultResourceLoader
)
applicationContext
,
(
DefaultResourceLoader
)
resourceLoader
);
}
}
protected
final
void
copyProtocolResolvers
(
DefaultResourceLoader
source
,
DefaultResourceLoader
destination
)
{
for
(
ProtocolResolver
resolver
:
source
.
getProtocolResolvers
())
{
destination
.
addProtocolResolver
(
resolver
);
}
ResourceLoader
targetResourceLoader
=
(
resourceLoader
!=
null
)
?
resourceLoader
:
new
ApplicationContextResourceLoader
(
applicationContext:
:
getProtocolResolvers
);
return
new
PathMatchingResourcePatternResolver
(
targetResourceLoader
);
}
}
...
...
@@ -228,21 +215,35 @@ final class ClassLoaderFilesResourcePatternResolver implements ResourcePatternRe
private
static
class
WebResourcePatternResolverFactory
extends
ResourcePatternResolverFactory
{
@Override
public
ResourcePatternResolver
getResourcePatternResolver
(
ApplicationContext
applicationContext
,
public
ResourcePatternResolver
getResourcePatternResolver
(
A
bstractA
pplicationContext
applicationContext
,
ResourceLoader
resourceLoader
)
{
if
(
applicationContext
instanceof
WebApplicationContext
)
{
return
get
ResourcePatternResolver
((
WebApplicationContext
)
applicationContext
,
resourceLoader
);
return
get
ServletContextResourcePatternResolver
(
applicationContext
,
resourceLoader
);
}
return
super
.
getResourcePatternResolver
(
applicationContext
,
resourceLoader
);
}
private
ResourcePatternResolver
getResourcePatternResolver
(
WebApplicationContext
applicationContext
,
ResourceLoader
resourceLoader
)
{
if
(
resourceLoader
==
null
)
{
resourceLoader
=
new
WebApplicationContextResourceLoader
(
applicationContext
);
copyProtocolResolvers
(
applicationContext
,
resourceLoader
);
}
return
new
ServletContextResourcePatternResolver
(
resourceLoader
);
private
ResourcePatternResolver
getServletContextResourcePatternResolver
(
AbstractApplicationContext
applicationContext
,
ResourceLoader
resourceLoader
)
{
ResourceLoader
targetResourceLoader
=
(
resourceLoader
!=
null
)
?
resourceLoader
:
new
WebApplicationContextResourceLoader
(
applicationContext:
:
getProtocolResolvers
,
(
WebApplicationContext
)
applicationContext
);
return
new
ServletContextResourcePatternResolver
(
targetResourceLoader
);
}
}
private
static
class
ApplicationContextResourceLoader
extends
DefaultResourceLoader
{
private
final
Supplier
<
Collection
<
ProtocolResolver
>>
protocolResolvers
;
ApplicationContextResourceLoader
(
Supplier
<
Collection
<
ProtocolResolver
>>
protocolResolvers
)
{
this
.
protocolResolvers
=
protocolResolvers
;
}
@Override
public
Collection
<
ProtocolResolver
>
getProtocolResolvers
()
{
return
this
.
protocolResolvers
.
get
();
}
}
...
...
@@ -251,11 +252,13 @@ final class ClassLoaderFilesResourcePatternResolver implements ResourcePatternRe
* {@link ResourceLoader} that optionally supports {@link ServletContextResource
* ServletContextResources}.
*/
private
static
class
WebApplicationContextResourceLoader
extends
Defaul
tResourceLoader
{
private
static
class
WebApplicationContextResourceLoader
extends
ApplicationContex
tResourceLoader
{
private
final
WebApplicationContext
applicationContext
;
WebApplicationContextResourceLoader
(
WebApplicationContext
applicationContext
)
{
WebApplicationContextResourceLoader
(
Supplier
<
Collection
<
ProtocolResolver
>>
protocolResolvers
,
WebApplicationContext
applicationContext
)
{
super
(
protocolResolvers
);
this
.
applicationContext
=
applicationContext
;
}
...
...
spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/restart/ClassLoaderFilesResourcePatternResolverTests.java
View file @
81ddebbc
...
...
@@ -127,6 +127,18 @@ class ClassLoaderFilesResourcePatternResolverTests {
verify
(
resolver
).
resolve
(
eq
(
"foo:some-file.txt"
),
any
(
ResourceLoader
.
class
));
}
@Test
void
customProtocolResolverRegisteredAfterCreationIsUsedInNonWebApplication
()
{
GenericApplicationContext
context
=
new
GenericApplicationContext
();
Resource
resource
=
mock
(
Resource
.
class
);
this
.
resolver
=
new
ClassLoaderFilesResourcePatternResolver
(
context
,
this
.
files
);
ProtocolResolver
resolver
=
mockProtocolResolver
(
"foo:some-file.txt"
,
resource
);
context
.
addProtocolResolver
(
resolver
);
Resource
actual
=
this
.
resolver
.
getResource
(
"foo:some-file.txt"
);
assertThat
(
actual
).
isSameAs
(
resource
);
verify
(
resolver
).
resolve
(
eq
(
"foo:some-file.txt"
),
any
(
ResourceLoader
.
class
));
}
@Test
void
customResourceLoaderIsUsedInWebApplication
()
{
GenericWebApplicationContext
context
=
new
GenericWebApplicationContext
(
new
MockServletContext
());
...
...
@@ -149,6 +161,18 @@ class ClassLoaderFilesResourcePatternResolverTests {
verify
(
resolver
).
resolve
(
eq
(
"foo:some-file.txt"
),
any
(
ResourceLoader
.
class
));
}
@Test
void
customProtocolResolverRegisteredAfterCreationIsUsedInWebApplication
()
{
GenericWebApplicationContext
context
=
new
GenericWebApplicationContext
(
new
MockServletContext
());
Resource
resource
=
mock
(
Resource
.
class
);
this
.
resolver
=
new
ClassLoaderFilesResourcePatternResolver
(
context
,
this
.
files
);
ProtocolResolver
resolver
=
mockProtocolResolver
(
"foo:some-file.txt"
,
resource
);
context
.
addProtocolResolver
(
resolver
);
Resource
actual
=
this
.
resolver
.
getResource
(
"foo:some-file.txt"
);
assertThat
(
actual
).
isSameAs
(
resource
);
verify
(
resolver
).
resolve
(
eq
(
"foo:some-file.txt"
),
any
(
ResourceLoader
.
class
));
}
private
ProtocolResolver
mockProtocolResolver
(
String
path
,
Resource
resource
)
{
ProtocolResolver
resolver
=
mock
(
ProtocolResolver
.
class
);
given
(
resolver
.
resolve
(
eq
(
path
),
any
(
ResourceLoader
.
class
))).
willReturn
(
resource
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment