@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2012 - 2016 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 .
@ -17,7 +17,13 @@
@@ -17,7 +17,13 @@
package org.springframework.boot.liquibase ;
import java.lang.reflect.Field ;
import java.net.URL ;
import java.net.URLClassLoader ;
import java.util.Arrays ;
import java.util.List ;
import liquibase.servicelocator.CustomResolverServiceLocator ;
import liquibase.servicelocator.DefaultPackageScanClassResolver ;
import liquibase.servicelocator.ServiceLocator ;
import org.junit.After ;
import org.junit.Test ;
@ -25,6 +31,7 @@ import org.junit.Test;
@@ -25,6 +31,7 @@ import org.junit.Test;
import org.springframework.boot.SpringApplication ;
import org.springframework.context.ConfigurableApplicationContext ;
import org.springframework.context.annotation.Configuration ;
import org.springframework.core.io.DefaultResourceLoader ;
import org.springframework.util.ReflectionUtils ;
import static org.assertj.core.api.Assertions.assertThat ;
@ -33,6 +40,7 @@ import static org.assertj.core.api.Assertions.assertThat;
@@ -33,6 +40,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* Tests for { @link LiquibaseServiceLocatorApplicationListener } .
*
* @author Phillip Webb
* @author Stephane Nicoll
* /
public class LiquibaseServiceLocatorApplicationListenerTests {
@ -46,15 +54,33 @@ public class LiquibaseServiceLocatorApplicationListenerTests {
@@ -46,15 +54,33 @@ public class LiquibaseServiceLocatorApplicationListenerTests {
}
@Test
public void replacesServiceLocator ( ) throws Exception {
public void replacesServiceLocator ( ) throws IllegalAccess Exception {
SpringApplication application = new SpringApplication ( Conf . class ) ;
application . setWebEnvironment ( false ) ;
this . context = application . run ( ) ;
Object resolver = getServiceLocator ( ) ;
assertThat ( resolver ) . isInstanceOf ( SpringPackageScanClassResolver . class ) ;
}
@Test
public void replaceServiceLocatorBacksOffIfNotPresent ( )
throws IllegalAccessException {
SpringApplication application = new SpringApplication ( Conf . class ) ;
application . setWebEnvironment ( false ) ;
DefaultResourceLoader resourceLoader = new DefaultResourceLoader ( ) ;
resourceLoader . setClassLoader ( new ClassHidingClassLoader (
CustomResolverServiceLocator . class ) ) ;
application . setResourceLoader ( resourceLoader ) ;
this . context = application . run ( ) ;
Object resolver = getServiceLocator ( ) ;
assertThat ( resolver ) . isInstanceOf ( DefaultPackageScanClassResolver . class ) ;
}
private Object getServiceLocator ( ) throws IllegalAccessException {
ServiceLocator instance = ServiceLocator . getInstance ( ) ;
Field field = ReflectionUtils . findField ( ServiceLocator . class , "classResolver" ) ;
field . setAccessible ( true ) ;
Object resolver = field . get ( instance ) ;
assertThat ( resolver ) . isInstanceOf ( SpringPackageScanClassResolver . class ) ;
return field . get ( instance ) ;
}
@Configuration
@ -62,4 +88,32 @@ public class LiquibaseServiceLocatorApplicationListenerTests {
@@ -62,4 +88,32 @@ public class LiquibaseServiceLocatorApplicationListenerTests {
}
private final class ClassHidingClassLoader extends URLClassLoader {
private final List < Class < ? > > hiddenClasses ;
private ClassHidingClassLoader ( Class < ? > . . . hiddenClasses ) {
super ( new URL [ 0 ] , LiquibaseServiceLocatorApplicationListenerTests . class . getClassLoader ( ) ) ;
this . hiddenClasses = Arrays . asList ( hiddenClasses ) ;
}
@Override
public Class < ? > loadClass ( String name ) throws ClassNotFoundException {
if ( isHidden ( name ) ) {
throw new ClassNotFoundException ( ) ;
}
return super . loadClass ( name ) ;
}
private boolean isHidden ( String name ) {
for ( Class < ? > hiddenClass : this . hiddenClasses ) {
if ( hiddenClass . getName ( ) . equals ( name ) ) {
return true ;
}
}
return false ;
}
}
}