/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.monitor.hib;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geoserver.config.GeoServerDataDirectory;
import org.geoserver.platform.resource.Paths;
import org.geoserver.platform.resource.Resource;
import org.geoserver.platform.resource.Resources;
import org.geotools.util.logging.Logging;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
public class EntityManagerFactoryPostProcessor implements BeanPostProcessor {
static Logger LOGGER = Logging.getLogger("org.geoserver.monitor");
GeoServerDataDirectory data;
public EntityManagerFactoryPostProcessor(GeoServerDataDirectory data) {
this.data = data;
}
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof AbstractEntityManagerFactoryBean) {
init((AbstractEntityManagerFactoryBean)bean);
}
return bean;
}
void init(AbstractEntityManagerFactoryBean factory) {
try {
Resource f = data.get(Paths.path("monitoring", "hibernate.properties"));
if (!Resources.exists(f)) {
//copy one out from
Properties props = new Properties();
props.putAll(factory.getJpaVendorAdapter().getJpaPropertyMap());
props.putAll(factory.getJpaPropertyMap());
Resource monitoring = data.get("monitoring");
Resource file = monitoring.get("hibernate.properties");
OutputStream fout = file.out();
props.store(fout, "hibernate configuration");
fout.flush();
fout.close();
}
else {
//use config to overide
Properties props = new Properties();
InputStream fin = f.in();
props.load(fin);
fin.close();
HibernateJpaVendorAdapter adapter = (HibernateJpaVendorAdapter) factory.getJpaVendorAdapter();
adapter.setDatabase(Database.valueOf((String)props.get("database")));
adapter.setDatabasePlatform((String)props.get("databasePlatform"));
adapter.setShowSql(Boolean.valueOf((String)props.getProperty("showSql")));
adapter.setGenerateDdl(Boolean.valueOf((String)props.getProperty("generateDdl")));
for (Map.Entry e : props.entrySet()) {
if (((String)e.getKey()).startsWith("hibernate")) {
factory.getJpaPropertyMap().put((String)e.getKey(), e.getValue());
}
}
}
}
catch (IOException e) {
LOGGER.log(Level.WARNING, e.getLocalizedMessage(), e);
}
}
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof AbstractEntityManagerFactoryBean) {
init((AbstractEntityManagerFactoryBean)bean);
}
return bean;
}
}