package org.hibernate.boot.cfgxml.internal;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;
import org.hibernate.boot.cfgxml.spi.LoadedConfig;
import org.hibernate.boot.jaxb.Origin;
import org.hibernate.boot.jaxb.SourceType;
import org.hibernate.boot.jaxb.cfg.spi.JaxbCfgHibernateConfiguration;
import org.hibernate.boot.registry.BootstrapServiceRegistry;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.internal.util.ValueHolder;
import org.hibernate.internal.util.config.ConfigurationException;
import org.jboss.logging.Logger;
public class ConfigLoader {
private static final Logger log = Logger.getLogger( ConfigLoader.class );
private final BootstrapServiceRegistry bootstrapServiceRegistry;
private ValueHolder<JaxbCfgProcessor> jaxbProcessorHolder = new ValueHolder<JaxbCfgProcessor>(
new ValueHolder.DeferredInitializer<JaxbCfgProcessor>() {
@Override
public JaxbCfgProcessor initialize() {
return new JaxbCfgProcessor( bootstrapServiceRegistry.getService( ClassLoaderService.class ) );
}
}
);
public ConfigLoader(BootstrapServiceRegistry bootstrapServiceRegistry) {
this.bootstrapServiceRegistry = bootstrapServiceRegistry;
}
public LoadedConfig loadConfigXmlResource(String cfgXmlResourceName) {
final InputStream stream = bootstrapServiceRegistry.getService( ClassLoaderService.class ).locateResourceStream( cfgXmlResourceName );
if ( stream == null ) {
throw new ConfigurationException( "Could not locate cfg.xml resource [" + cfgXmlResourceName + "]" );
}
try {
final JaxbCfgHibernateConfiguration jaxbCfg = jaxbProcessorHolder.getValue().unmarshal(
stream,
new Origin( SourceType.RESOURCE, cfgXmlResourceName )
);
return LoadedConfig.consume( jaxbCfg );
}
finally {
try {
stream.close();
}
catch (IOException e) {
log.debug( "Unable to close cfg.xml resource stream", e );
}
}
}
public LoadedConfig loadConfigXmlFile(File cfgXmlFile) {
try {
final JaxbCfgHibernateConfiguration jaxbCfg = jaxbProcessorHolder.getValue().unmarshal(
new FileInputStream( cfgXmlFile ),
new Origin( SourceType.FILE, cfgXmlFile.getAbsolutePath() )
);
return LoadedConfig.consume( jaxbCfg );
}
catch (FileNotFoundException e) {
throw new ConfigurationException(
"Specified cfg.xml file [" + cfgXmlFile.getAbsolutePath() + "] does not exist"
);
}
}
public LoadedConfig loadConfigXmlUrl(URL url) {
try {
final InputStream stream = url.openStream();
try {
final JaxbCfgHibernateConfiguration jaxbCfg = jaxbProcessorHolder.getValue().unmarshal(
stream,
new Origin( SourceType.URL, url.toExternalForm() )
);
return LoadedConfig.consume( jaxbCfg );
}
finally {
try {
stream.close();
}
catch (IOException e) {
log.debug( "Unable to close cfg.xml URL stream", e );
}
}
}
catch (IOException e) {
throw new ConfigurationException( "Could not access given cfg.xml URL input stream", e );
}
}
public Properties loadProperties(String resourceName) {
final InputStream stream = bootstrapServiceRegistry.getService( ClassLoaderService.class ).locateResourceStream( resourceName );
if ( stream == null ) {
throw new ConfigurationException( "Unable to apply settings from properties file [" + resourceName + "]" );
}
try {
Properties properties = new Properties();
properties.load( stream );
return properties;
}
catch (IOException e) {
throw new ConfigurationException( "Unable to apply settings from properties file [" + resourceName + "]", e );
}
finally {
try {
stream.close();
}
catch (IOException e) {
log.debug(
String.format( "Unable to close properties file [%s] stream", resourceName ),
e
);
}
}
}
public Properties loadProperties(File file) {
try {
final InputStream stream = new FileInputStream( file );
try {
Properties properties = new Properties();
properties.load( stream );
return properties;
}
catch (IOException e) {
throw new ConfigurationException(
"Unable to apply settings from properties file [" + file.getAbsolutePath() + "]",
e
);
}
finally {
try {
stream.close();
}
catch (IOException e) {
log.debug(
String.format( "Unable to close properties file [%s] stream", file.getAbsolutePath() ),
e
);
}
}
}
catch (FileNotFoundException e) {
throw new ConfigurationException(
"Unable locate specified properties file [" + file.getAbsolutePath() + "]",
e
);
}
}
}