package org.cloudfoundry.config;
import org.cloudfoundry.runtime.env.CloudEnvironment;
import org.cloudfoundry.runtime.env.MongoServiceInfo;
import org.cloudfoundry.runtime.env.RdbmsServiceInfo;
import org.cloudfoundry.runtime.service.document.MongoServiceCreator;
import org.cloudfoundry.runtime.service.relational.RdbmsServiceCreator;
import org.springframework.context.annotation.AdviceMode;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoExceptionTranslator;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.crossstore.MongoChangeSetPersister;
import org.springframework.data.mongodb.crossstore.MongoDocumentBacking;
import org.springframework.data.mongodb.examples.custsvc.data.CrossStoreCustomerRepository;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration
@ComponentScan(basePackageClasses = CrossStoreCustomerRepository.class)
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
public class ServicesConfiguration {
@Bean
public CloudEnvironment cloudEnvironment() {
return new CloudEnvironment();
}
@Bean
public MongoServiceInfo mongoServiceInfo() {
MongoServiceInfo mongoServiceInfo = cloudEnvironment().getServiceInfos( MongoServiceInfo.class).iterator().next();
assert null != mongoServiceInfo : "there needs to be at least one MongoDB instance bound to this application" ;
return mongoServiceInfo;
}
@Bean
public MongoDbFactory mongoDbFactory() {
MongoServiceCreator mongoServiceCreator = new MongoServiceCreator();
return mongoServiceCreator.createService(mongoServiceInfo());
}
@Bean
public DataSource dataSource() {
RdbmsServiceInfo rdbmsServiceInfo = cloudEnvironment().getServiceInfos( RdbmsServiceInfo.class).iterator().next();
assert null != rdbmsServiceInfo : "there needs to be at least one MySQL RDBMS bound to this application";
RdbmsServiceCreator rdbmsServiceCreator = new RdbmsServiceCreator();
return rdbmsServiceCreator.createService(rdbmsServiceInfo);
}
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(mongoDbFactory());
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
hibernateJpaVendorAdapter.setDatabase(Database.MYSQL);
hibernateJpaVendorAdapter.setGenerateDdl(true);
return hibernateJpaVendorAdapter;
}
@Bean
public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean() {
LocalContainerEntityManagerFactoryBean lcfb = new LocalContainerEntityManagerFactoryBean();
lcfb.setJpaVendorAdapter(jpaVendorAdapter());
lcfb.setDataSource(dataSource());
return lcfb;
}
@Bean
public PlatformTransactionManager platformTransactionManager() {
JpaTransactionManager txMan = new JpaTransactionManager();
txMan.setEntityManagerFactory(localContainerEntityManagerFactoryBean().getObject());
return txMan;
}
@Bean
public MongoDocumentBacking mongoDocumentBacking() {
MongoDocumentBacking mdb = MongoDocumentBacking.aspectOf();
mdb.setChangeSetPersister(changeSetPersister());
return mdb;
}
@Bean
public MongoChangeSetPersister changeSetPersister() {
MongoChangeSetPersister mongoChangeSetPersister = new MongoChangeSetPersister();
mongoChangeSetPersister.setEntityManagerFactory(localContainerEntityManagerFactoryBean().getObject());
mongoChangeSetPersister.setMongoTemplate(mongoTemplate());
return mongoChangeSetPersister;
}
@Bean
public MongoExceptionTranslator mongoExceptionTranslator() {
return new MongoExceptionTranslator();
}
@Bean
public PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor() {
return new PersistenceAnnotationBeanPostProcessor();
}
@Bean
public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() {
return new PersistenceExceptionTranslationPostProcessor();
}
}