Browse Source
Rename a few classes and methods relating to DataSourceInitialization and update the DataSourceInitializedPublisher to check for Hibernate settings.pull/1050/merge
10 changed files with 282 additions and 231 deletions
@ -1,169 +0,0 @@
@@ -1,169 +0,0 @@
|
||||
/* |
||||
* Copyright 2012-2013 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.autoconfigure.jdbc; |
||||
|
||||
import java.io.IOException; |
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
import javax.annotation.PostConstruct; |
||||
import javax.sql.DataSource; |
||||
|
||||
import org.apache.commons.logging.Log; |
||||
import org.apache.commons.logging.LogFactory; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
||||
import org.springframework.context.ApplicationContext; |
||||
import org.springframework.context.ApplicationEvent; |
||||
import org.springframework.context.ApplicationListener; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.core.io.Resource; |
||||
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils; |
||||
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; |
||||
import org.springframework.util.StringUtils; |
||||
|
||||
/** |
||||
* @author Dave Syer |
||||
* @since 1.1 |
||||
*/ |
||||
@Configuration |
||||
@EnableConfigurationProperties(DataSourceProperties.class) |
||||
public class DataSourceInitialization { |
||||
|
||||
private static Log logger = LogFactory.getLog(DataSourceInitialization.class); |
||||
|
||||
@Autowired(required=false) |
||||
private DataSource dataSource; |
||||
|
||||
@Autowired |
||||
private ApplicationContext applicationContext; |
||||
|
||||
@Autowired |
||||
private DataSourceProperties properties; |
||||
|
||||
private boolean initialized = false; |
||||
|
||||
@Bean |
||||
public ApplicationListener<DataSourceInitializedEvent> dataSourceInitializedListener() { |
||||
return new DataSourceInitializedListener(); |
||||
} |
||||
|
||||
private void runSchemaScripts() { |
||||
String schema = this.properties.getSchema(); |
||||
if (schema == null) { |
||||
String platform = this.properties.getPlatform(); |
||||
schema = "classpath*:schema-" + platform + ".sql,"; |
||||
schema += "classpath*:schema.sql"; |
||||
} |
||||
if (runScripts(schema)) { |
||||
this.applicationContext.publishEvent(new DataSourceInitializedEvent( |
||||
this.dataSource)); |
||||
} |
||||
} |
||||
|
||||
private void runDataScripts() { |
||||
if (this.initialized) { |
||||
return; |
||||
} |
||||
String schema = this.properties.getData(); |
||||
if (schema == null) { |
||||
String platform = this.properties.getPlatform(); |
||||
schema = "classpath*:data-" + platform + ".sql,"; |
||||
schema += "classpath*:data.sql"; |
||||
} |
||||
runScripts(schema); |
||||
this.initialized = true; |
||||
} |
||||
|
||||
private boolean runScripts(String scripts) { |
||||
|
||||
if (this.dataSource == null) { |
||||
logger.debug("No DataSource found so not initializing"); |
||||
return false; |
||||
} |
||||
|
||||
List<Resource> resources = getSchemaResources(scripts); |
||||
|
||||
boolean continueOnError = this.properties.isContinueOnError(); |
||||
boolean exists = false; |
||||
ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); |
||||
for (Resource resource : resources) { |
||||
if (resource.exists()) { |
||||
exists = true; |
||||
populator.addScript(resource); |
||||
populator.setContinueOnError(continueOnError); |
||||
} |
||||
} |
||||
populator.setSeparator(this.properties.getSeparator()); |
||||
|
||||
if (exists) { |
||||
DatabasePopulatorUtils.execute(populator, this.dataSource); |
||||
} |
||||
|
||||
return exists; |
||||
|
||||
} |
||||
|
||||
private List<Resource> getSchemaResources(String schema) { |
||||
List<Resource> resources = new ArrayList<Resource>(); |
||||
for (String schemaLocation : StringUtils.commaDelimitedListToStringArray(schema)) { |
||||
try { |
||||
resources.addAll(Arrays.asList(this.applicationContext |
||||
.getResources(schemaLocation))); |
||||
} |
||||
catch (IOException ex) { |
||||
throw new IllegalStateException("Unable to load resource from " |
||||
+ schemaLocation, ex); |
||||
} |
||||
} |
||||
return resources; |
||||
} |
||||
|
||||
@SuppressWarnings("serial") |
||||
public static class DataSourceInitializedEvent extends ApplicationEvent { |
||||
|
||||
public DataSourceInitializedEvent(DataSource source) { |
||||
super(source); |
||||
} |
||||
|
||||
} |
||||
|
||||
private class DataSourceInitializedListener implements |
||||
ApplicationListener<DataSourceInitializedEvent> { |
||||
|
||||
// Keep this in the nested class so that it doesn't have to be called before the
|
||||
// listener is instantiated (ordering problems otherwise)
|
||||
@PostConstruct |
||||
protected void initialize() { |
||||
boolean initialize = DataSourceInitialization.this.properties.isInitialize(); |
||||
if (!initialize) { |
||||
logger.debug("Initialization disabled (not running DDL scripts)"); |
||||
return; |
||||
} |
||||
runSchemaScripts(); |
||||
} |
||||
|
||||
@Override |
||||
public void onApplicationEvent(DataSourceInitializedEvent event) { |
||||
runDataScripts(); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,43 @@
@@ -0,0 +1,43 @@
|
||||
/* |
||||
* Copyright 2012-2014 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.autoconfigure.jdbc; |
||||
|
||||
import javax.sql.DataSource; |
||||
|
||||
import org.springframework.context.ApplicationEvent; |
||||
|
||||
/** |
||||
* {@link ApplicationEvent} used internally to trigger {@link DataSource} initialization. |
||||
* Initialization can occur when {@literal schema-*.sql} files are executed or when |
||||
* external libraries (e.g. JPA) initialize the database. |
||||
* |
||||
* @author Dave Syer |
||||
* @see DataSourceInitializer |
||||
* @since 1.1.0 |
||||
*/ |
||||
@SuppressWarnings("serial") |
||||
public class DataSourceInitializedEvent extends ApplicationEvent { |
||||
|
||||
/** |
||||
* Create a new {@link DataSourceInitializedEvent}. |
||||
* @param source the source {@link DataSource}. |
||||
*/ |
||||
public DataSourceInitializedEvent(DataSource source) { |
||||
super(source); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,138 @@
@@ -0,0 +1,138 @@
|
||||
/* |
||||
* Copyright 2012-2014 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.autoconfigure.jdbc; |
||||
|
||||
import java.io.IOException; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
import javax.annotation.PostConstruct; |
||||
import javax.sql.DataSource; |
||||
|
||||
import org.apache.commons.logging.Log; |
||||
import org.apache.commons.logging.LogFactory; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.context.ApplicationContext; |
||||
import org.springframework.context.ApplicationListener; |
||||
import org.springframework.core.io.Resource; |
||||
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils; |
||||
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; |
||||
import org.springframework.util.StringUtils; |
||||
|
||||
/** |
||||
* Bean to handle {@link DataSource} initialization by running {@literal schema-*.sql} on |
||||
* {@link PostConstruct} and and {@literal data-*.sql} SQL scripts on a |
||||
* {@link DataSourceInitializedEvent}. |
||||
* |
||||
* @author Dave Syer |
||||
* @author Phillip Webb |
||||
* @since 1.1.0 |
||||
* @see DataSourceAutoConfiguration |
||||
*/ |
||||
class DataSourceInitializer implements ApplicationListener<DataSourceInitializedEvent> { |
||||
|
||||
private static Log logger = LogFactory.getLog(DataSourceInitializer.class); |
||||
|
||||
@Autowired |
||||
private ApplicationContext applicationContext; |
||||
|
||||
@Autowired(required = false) |
||||
private DataSource dataSource; |
||||
|
||||
@Autowired |
||||
private DataSourceProperties properties; |
||||
|
||||
private boolean initialized = false; |
||||
|
||||
@PostConstruct |
||||
protected void initialize() { |
||||
if (!this.properties.isInitialize()) { |
||||
logger.debug("Initialization disabled (not running DDL scripts)"); |
||||
return; |
||||
} |
||||
if (this.dataSource == null) { |
||||
logger.debug("No DataSource found so not initializing"); |
||||
return; |
||||
} |
||||
runSchemaScripts(); |
||||
} |
||||
|
||||
private void runSchemaScripts() { |
||||
List<Resource> scripts = getScripts(this.properties.getSchema(), "schema"); |
||||
if (!scripts.isEmpty()) { |
||||
runScripts(scripts); |
||||
this.applicationContext.publishEvent(new DataSourceInitializedEvent( |
||||
this.dataSource)); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onApplicationEvent(DataSourceInitializedEvent event) { |
||||
// NOTE the even can happen more than once and
|
||||
// the event datasource if not used here
|
||||
if (!this.initialized) { |
||||
runDataScripts(); |
||||
this.initialized = true; |
||||
} |
||||
} |
||||
|
||||
private void runDataScripts() { |
||||
List<Resource> scripts = getScripts(this.properties.getData(), "data"); |
||||
runScripts(scripts); |
||||
} |
||||
|
||||
private List<Resource> getScripts(String locations, String fallback) { |
||||
if (locations == null) { |
||||
String platform = this.properties.getPlatform(); |
||||
locations = "classpath*:" + fallback + "-" + platform + ".sql,"; |
||||
locations += "classpath*:" + fallback + ".sql"; |
||||
} |
||||
return getResources(locations); |
||||
} |
||||
|
||||
private List<Resource> getResources(String locations) { |
||||
List<Resource> resources = new ArrayList<Resource>(); |
||||
for (String location : StringUtils.commaDelimitedListToStringArray(locations)) { |
||||
try { |
||||
for (Resource resource : this.applicationContext.getResources(location)) { |
||||
if (resource.exists()) { |
||||
resources.add(resource); |
||||
} |
||||
} |
||||
} |
||||
catch (IOException ex) { |
||||
throw new IllegalStateException("Unable to load resource from " |
||||
+ location, ex); |
||||
} |
||||
} |
||||
return resources; |
||||
} |
||||
|
||||
private void runScripts(List<Resource> resources) { |
||||
if (resources.isEmpty()) { |
||||
return; |
||||
} |
||||
ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); |
||||
populator.setContinueOnError(this.properties.isContinueOnError()); |
||||
populator.setSeparator(this.properties.getSeparator()); |
||||
for (Resource resource : resources) { |
||||
populator.addScript(resource); |
||||
} |
||||
DatabasePopulatorUtils.execute(populator, this.dataSource); |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue