Subversion Repositories SmartDukaan

Rev

Rev 32188 | Rev 35393 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
23723 amit.gupta 1
package com.smartdukaan.cron.config;
2
 
32185 amit.gupta 3
import com.fasterxml.jackson.databind.DeserializationFeature;
24433 amit.gupta 4
import com.fasterxml.jackson.databind.ObjectMapper;
5
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
6
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
29859 amit.gupta 7
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
24433 amit.gupta 8
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
29859 amit.gupta 9
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
24433 amit.gupta 10
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
11
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
25721 tejbeer 12
import com.google.gson.Gson;
13
import com.google.gson.GsonBuilder;
29838 tejbeer 14
import com.spice.profitmandi.dao.convertor.LocalDateJsonConverter;
25721 tejbeer 15
import com.spice.profitmandi.dao.convertor.LocalDateTimeJsonConverter;
23738 amit.gupta 16
import com.spice.profitmandi.dao.repository.dtr.Mongo;
34690 amit.gupta 17
 
18
import com.zaxxer.hikari.HikariConfig;
19
import com.zaxxer.hikari.HikariDataSource;
30307 amit.gupta 20
import org.apache.logging.log4j.LogManager;
21
import org.apache.logging.log4j.Logger;
22
import org.hibernate.SessionFactory;
23
import org.springframework.beans.factory.annotation.Autowired;
24
import org.springframework.beans.factory.annotation.Value;
25
import org.springframework.context.annotation.*;
34690 amit.gupta 26
import org.springframework.core.env.Environment;
30307 amit.gupta 27
import org.springframework.jdbc.datasource.DriverManagerDataSource;
28
import org.springframework.orm.hibernate5.HibernateTransactionManager;
29
import org.springframework.orm.hibernate5.LocalSessionFactoryBuilder;
30
import org.springframework.transaction.annotation.EnableTransactionManagement;
23738 amit.gupta 31
 
30307 amit.gupta 32
import javax.sql.DataSource;
33
import java.time.LocalDate;
34
import java.time.LocalDateTime;
35
import java.time.format.DateTimeFormatter;
36
import java.time.format.DateTimeFormatterBuilder;
37
import java.util.Properties;
38
 
23723 amit.gupta 39
@Configuration
40
@EnableTransactionManagement
23755 amit.gupta 41
@ComponentScan("com.spice.profitmandi.*")
23723 amit.gupta 42
@PropertySource("classpath:META-INF/env.properties")
43
public class DBConfig {
44
 
25721 tejbeer 45
	private static final Logger LOGGER = LogManager.getLogger(DBConfig.class);
23723 amit.gupta 46
 
34690 amit.gupta 47
	// Hibernate Property Keys
23755 amit.gupta 48
	private static final String HIBERNATE_DIALECT = "hibernate.dialect";
49
	private static final String HIBERNATE_SHOW_SQL = "hibernate.show_sql";
50
	private static final String HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
51
	private static final String HIBERNATE_JDBC_BATCH_SIZE = "hibernate.jdbc.batch_size";
23723 amit.gupta 52
 
34690 amit.gupta 53
		// HikariCP Properties
54
	private static final String HIKARI_MAX_POOL_SIZE = "hikari.maximumPoolSize";
55
	private static final String HIKARI_MIN_IDLE = "hikari.minimumIdle";
56
	private static final String HIKARI_IDLE_TIMEOUT = "hikari.idleTimeout";
57
	private static final String HIKARI_MAX_LIFETIME = "hikari.maxLifetime";
58
	private static final String HIKARI_CONNECTION_TIMEOUT = "hikari.connectionTimeout";
23723 amit.gupta 59
 
60
 
34690 amit.gupta 61
	// Injected DB Properties
23723 amit.gupta 62
	@Value("${hibernate.driver.class}")
63
	private String hibernateDriverClass;
64
 
65
	@Value("${hibernate.url}")
66
	private String hibernateUrl;
67
 
68
	@Value("${hibernate.user.name}")
69
	private String hibernateUserName;
70
 
71
	@Value("${hibernate.password}")
72
	private String hibernatePassword;
73
 
74
	@Value("${hibernate.dialect}")
75
	private String hibernateDialect;
76
 
77
	@Value("${hibernate.show_sql}")
78
	private String hibernateShowSql;
79
 
80
	@Value("${hibernate.format_sql}")
81
	private String hibernateFormatSql;
82
 
83
	@Value("${hibernate.jdbc.batch_size}")
84
	private String hibernateBatchSize;
85
 
34690 amit.gupta 86
	// Mongo Config
23738 amit.gupta 87
	@Value("${mongo.host}")
88
	private String mongoHost;
23723 amit.gupta 89
 
23738 amit.gupta 90
	@Value("${content.mongo.host}")
91
	private String contentMongoHost;
25721 tejbeer 92
 
34690 amit.gupta 93
	@Autowired
94
	private Environment env;
95
 
96
	/**
97
	 * Primary DataSource using DriverManager (can be replaced with HikariDataSource)
98
	 */
23898 amit.gupta 99
	@Primary
23723 amit.gupta 100
	@Bean(name = "dataSource")
101
	public DataSource dataSource() {
34690 amit.gupta 102
		HikariConfig config = new HikariConfig();
103
		config.setDriverClassName(hibernateDriverClass);
104
		config.setJdbcUrl(hibernateUrl);
105
		config.setUsername(hibernateUserName);
106
		config.setPassword(hibernatePassword);
107
 
108
		config.setMaximumPoolSize(Integer.parseInt(env.getProperty(HIKARI_MAX_POOL_SIZE, "20")));
109
		config.setMinimumIdle(Integer.parseInt(env.getProperty(HIKARI_MIN_IDLE, "2")));
110
		config.setIdleTimeout(Long.parseLong(env.getProperty(HIKARI_IDLE_TIMEOUT, "30000")));
111
		config.setMaxLifetime(Long.parseLong(env.getProperty(HIKARI_MAX_LIFETIME, "1800000")));
112
		config.setConnectionTimeout(Long.parseLong(env.getProperty(HIKARI_CONNECTION_TIMEOUT, "30000")));
113
 
114
		config.setPoolName("HikariPool");
115
		config.setAutoCommit(true);
116
 
117
 
118
		HikariDataSource dataSource = new HikariDataSource(config);
119
		LOGGER.info("HikariDataSource initialized with JDBC URL {}", hibernateUrl);
23723 amit.gupta 120
		return dataSource;
121
	}
25721 tejbeer 122
 
34690 amit.gupta 123
	/**
124
	 * Configure Hibernate properties
125
	 */
24433 amit.gupta 126
	@Bean
23723 amit.gupta 127
	public Properties getHibernateProperties() {
128
		Properties dbProperties = new Properties();
129
		dbProperties.put(HIBERNATE_DIALECT, hibernateDialect);
130
		dbProperties.put(HIBERNATE_SHOW_SQL, hibernateShowSql);
131
		dbProperties.put(HIBERNATE_FORMAT_SQL, hibernateFormatSql);
132
		dbProperties.put(HIBERNATE_JDBC_BATCH_SIZE, hibernateBatchSize);
34690 amit.gupta 133
		// HikariCP properties (Optional — Spring Boot auto-configures most)
134
		//dbProperties.put("hibernate.connection.provider_class", "org.hibernate.hikaricp.internal.HikariCPConnectionProvider");
23723 amit.gupta 135
		return dbProperties;
136
	}
25721 tejbeer 137
 
34690 amit.gupta 138
	/**
139
	 * Configure Hibernate SessionFactory
140
	 */
23898 amit.gupta 141
	@Primary
34690 amit.gupta 142
	@Bean(name = "sessionFactory")
23723 amit.gupta 143
	@Autowired
144
	public SessionFactory getSessionFactory(DataSource dataSource) {
145
		LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
146
		sessionBuilder.addProperties(getHibernateProperties());
147
		sessionBuilder.scanPackages("com.spice.profitmandi.dao.*");
34690 amit.gupta 148
		LOGGER.info("SessionFactory created");
23723 amit.gupta 149
		return sessionBuilder.buildSessionFactory();
150
	}
25721 tejbeer 151
 
34690 amit.gupta 152
	/**
153
	 * Transaction Manager
154
	 */
23898 amit.gupta 155
	@Primary
34690 amit.gupta 156
	@Bean(name = "transactionManager")
23723 amit.gupta 157
	@Autowired
158
	public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
159
		HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);
34690 amit.gupta 160
		LOGGER.info("TransactionManager created");
23723 amit.gupta 161
		return transactionManager;
162
	}
25721 tejbeer 163
 
34690 amit.gupta 164
	/**
165
	 * ObjectMapper Bean with Java 8 Time module config
166
	 */
23738 amit.gupta 167
	@Bean
34690 amit.gupta 168
	public ObjectMapper objectMapper() {
169
		DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
170
				.parseCaseInsensitive()
171
				.append(DateTimeFormatter.ISO_LOCAL_DATE)
172
				.optionalStart().appendLiteral('T').optionalEnd()
173
				.appendLiteral(' ')
174
				.append(DateTimeFormatter.ISO_LOCAL_TIME)
175
				.toFormatter();
176
 
177
		DateTimeFormatter standardFormatter = new DateTimeFormatterBuilder()
178
				.parseCaseInsensitive()
179
				.append(DateTimeFormatter.ISO_LOCAL_DATE)
180
				.appendLiteral('T')
181
				.append(DateTimeFormatter.ISO_LOCAL_TIME)
182
				.toFormatter();
183
 
184
		JavaTimeModule javaTimeModule = new JavaTimeModule();
185
		javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(standardFormatter));
186
		javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE));
187
		javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
188
		javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE));
189
 
190
		ObjectMapper mapper = new ObjectMapper()
191
				.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
192
				.registerModule(new ParameterNamesModule())
193
				.registerModule(new Jdk8Module())
194
				.registerModule(javaTimeModule);
195
 
196
		LOGGER.info("ObjectMapper configured");
197
		return mapper;
198
	}
199
 
200
	/**
201
	 * Mongo Client Bean
202
	 */
203
	@Bean
23738 amit.gupta 204
	public Mongo mongoClient(SessionFactory sessionFactory) {
205
		return new Mongo(mongoHost, contentMongoHost);
206
	}
25721 tejbeer 207
 
34690 amit.gupta 208
	/**
209
	 * Gson Bean for LocalDate and LocalDateTime
210
	 */
25721 tejbeer 211
	@Bean(name = "gson")
212
	public Gson gson() {
34690 amit.gupta 213
		Gson gson = new GsonBuilder()
214
				.serializeNulls()
29838 tejbeer 215
				.registerTypeAdapter(LocalDate.class, new LocalDateJsonConverter())
34690 amit.gupta 216
				.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeJsonConverter())
217
				.create();
218
		LOGGER.info("Gson configured");
25721 tejbeer 219
		return gson;
220
	}
23723 amit.gupta 221
}