/*******************************************************************************
* Copyright (c) 2015 Development Gateway, Inc and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the MIT License (MIT)
* which accompanies this distribution, and is available at
* https://opensource.org/licenses/MIT
*
* Contributors:
* Development Gateway - initial API and implementation
*******************************************************************************/
/**
*
*/
package org.devgateway.toolkit.persistence.spring;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.util.Properties;
import javax.naming.NamingException;
import org.apache.derby.drda.NetworkServerControl;
import org.apache.log4j.Logger;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.mock.jndi.SimpleNamingContextBuilder;
/**
* @author mpostelnicu
*
*/
@Configuration
@EnableJpaAuditing
@PropertySource("classpath:/org/devgateway/toolkit/persistence/application.properties")
@Profile("!integration")
public class DatabaseConfiguration {
@Value("${spring.datasource.username}")
private String springDatasourceUsername;
@Value("${spring.datasource.password}")
private String springDatasourcePassword;
@Value("${spring.datasource.url}")
private String springDatasourceUrl;
@Value("${spring.datasource.driver-class-name}")
private String springDatasourceDriverClassName;
@Value("${spring.datasource.transaction-isolation}")
private int springDatasourceTransactionIsolation;
@Value("${spring.datasource.initial-size}")
private int springDatasourceInitialSize;
@Value("${spring.datasource.max-active}")
private int springDatasourceMaxActive;
@Value("${dg-toolkit.derby.port}")
private int derbyPort;
@Value("${dg-toolkit.datasource.jndi-name}")
private String datasourceJndiName;
protected static Logger logger = Logger.getLogger(DatabaseConfiguration.class);
/**
* This bean creates the JNDI tree and registers the
* {@link javax.sql.DataSource} to this tree. This allows Pentaho Classic
* Engine to use a {@link javax.sql.DataSource} ,in our case backed by a
* connection pool instead of always opening up JDBC connections. Should
* significantly improve performance of all classic reports. In PRD use
* connection type=JNDI and name toolkitDS. To use it in PRD you need to add
* the configuration to the local PRD. Edit
* ~/.pentaho/simple-jndi/default.properties and add the following:
* toolkitDS/type=javax.sql.DataSource
* toolkitDS/driver=org.apache.derby.jdbc.ClientDriver toolkitDS/user=app
* toolkitDS/password=app
* toolkitDS/url=jdbc:derby://localhost//derby/toolkit
*
* @return
*/
@Bean
public SimpleNamingContextBuilder jndiBuilder() {
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.bind(datasourceJndiName, dataSource());
try {
builder.activate();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return builder;
}
/**
* Creates a {@link javax.sql.DataSource} based on Tomcat {@link DataSource}
*
* @return
*/
@Bean
@DependsOn(value = { "derbyServer" })
public DataSource dataSource() {
PoolProperties pp = new PoolProperties();
pp.setJmxEnabled(true);
pp.setDefaultTransactionIsolation(springDatasourceTransactionIsolation);
pp.setInitialSize(springDatasourceInitialSize);
pp.setMaxActive(springDatasourceMaxActive);
DataSource dataSource = new DataSource(pp);
dataSource.setUrl(springDatasourceUrl);
dataSource.setUsername(springDatasourceUsername);
dataSource.setPassword(springDatasourcePassword);
dataSource.setDriverClassName(springDatasourceDriverClassName);
return dataSource;
}
/**
* Graciously starts a Derby Database Server when the application starts up
*
* @return
* @throws Exception
*/
@Bean(destroyMethod = "shutdown")
public NetworkServerControl derbyServer() throws Exception {
Properties p = System.getProperties();
p.put("derby.storage.pageCacheSize", "30000");
p.put("derby.language.maxMemoryPerTable", "20000");
NetworkServerControl nsc = new NetworkServerControl(InetAddress.getByName("localhost"), derbyPort);
nsc.start(new PrintWriter(java.lang.System.out, true));
return nsc;
}
}