SpringI18nSupportAutoConfiguration.java

package com.namics.oss.spring.support.i18n.autoconfigure;

import com.namics.oss.spring.support.i18n.DaoMessageSource;
import com.namics.oss.spring.support.i18n.dao.MessageSourceDao;
import com.namics.oss.spring.support.i18n.dao.MessageSourceManagementDao;
import com.namics.oss.spring.support.i18n.dao.SimpleJdbcMessageSourceDao;
import com.namics.oss.spring.support.i18n.excel.ExcelReader;
import com.namics.oss.spring.support.i18n.excel.ExcelWriter;
import com.namics.oss.spring.support.i18n.service.MessageManagementService;
import com.namics.oss.spring.support.i18n.service.MessageManagementServiceImpl;
import com.namics.oss.spring.support.i18n.service.ReloadService;
import com.namics.oss.spring.support.i18n.service.ReloadServiceImpl;
import com.namics.oss.spring.support.i18n.text.SqlScriptWriter;
import com.namics.oss.spring.support.i18n.text.TextWriter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.jmx.export.annotation.AnnotationMBeanExporter;

import javax.inject.Inject;
import javax.sql.DataSource;
import java.util.List;
import java.util.function.Function;
import java.util.stream.IntStream;

import static java.util.stream.Collectors.toMap;
import static org.springframework.util.CollectionUtils.isEmpty;
import static org.springframework.util.StringUtils.hasText;

/**
 * SpringI18nSupportAutoConfiguration.
 *
 * @author rgsell, Namics AG
 * @since 13.09.17 16:21
 */
@Configuration
@EnableConfigurationProperties(SpringI18nSupportProperties.class)
public class SpringI18nSupportAutoConfiguration {

	@Inject
	protected SpringI18nSupportProperties springI18nSupportProperties;

	@Bean
	public ReloadService messageSourceReloadService() {
		return new ReloadServiceImpl();
	}

	@Bean(name = "messageSource")
	public DaoMessageSource i18nMessageSource(MessageSourceDao messageSourceDao) {
		DaoMessageSource source = new DaoMessageSource();
		source.setMessageSourceDao(messageSourceDao);
		source.setUseCodeAsDefaultMessage(springI18nSupportProperties.getFallback().isUseCodeAsDefaultMessage());

		//set fallbacks if at least one is enabled and one fallback lang is available
		boolean fallbackForKnownLanguages = springI18nSupportProperties.getFallback().isFallbackForKnownLanguages();
		boolean fallbackForUnknownLanguages = springI18nSupportProperties.getFallback().isFallbackForUnknownLanguages();
		List<String> fallbackLanguage = springI18nSupportProperties.getFallback().getFallbackLanguage();
		if (!isEmpty(fallbackLanguage) && (fallbackForKnownLanguages || fallbackForUnknownLanguages)) {
			source.setFallbackForKnownLanguages(fallbackForKnownLanguages);
			source.setFallbackForUnknownLanguages(fallbackForUnknownLanguages);
			source.setFallbacks(IntStream.range(0, fallbackLanguage.size()).boxed().collect(toMap(Function.identity(), fallbackLanguage::get)));

		}
		return source;
	}

	@Bean
	@ConditionalOnMissingBean
	public SimpleJdbcMessageSourceDao jdbcMessageSourceDa(DataSource dataSource) {
		SimpleJdbcMessageSourceDao jdbcMessageSourceDao = new SimpleJdbcMessageSourceDao();
		jdbcMessageSourceDao.setDataSource(dataSource);
		if (hasText(getTableName())) {
			jdbcMessageSourceDao.setTable(getTableName());
		}
		if (hasText(getMessageColumnName())) {
			jdbcMessageSourceDao.setMessage(getMessageColumnName());
		}
		if (hasText(getTypeColumnName())) {
			jdbcMessageSourceDao.setType(getTypeColumnName());
		}
		if (hasText(getCodeIdColumnName())) {
			jdbcMessageSourceDao.setCodeId(getCodeIdColumnName());
		}
		if (hasText(getLangIdColumnName())) {
			jdbcMessageSourceDao.setLangId(getLangIdColumnName());
		}
		return jdbcMessageSourceDao;
	}

	@Bean
	public AnnotationMBeanExporter annotationMBeanExporter() {
		return new AnnotationMBeanExporter();
	}

	@Bean
	@ConditionalOnMissingBean
	public ExcelReader excelReader() {
		return new ExcelReader();
	}

	@Bean
	@ConditionalOnMissingBean
	public ExcelWriter excelWriter() {
		return new ExcelWriter();
	}

	@Bean
	@ConditionalOnMissingBean
	public TextWriter sqlScriptWriter() {
		SqlScriptWriter sqlScriptWriter = new SqlScriptWriter();
		if (hasText(getScriptTemplatePath())) {
			sqlScriptWriter.setScriptTemplate(new DefaultResourceLoader().getResource(getScriptTemplatePath()));
		}
		if (hasText(getSqlInsertStatementTemplate())) {
			sqlScriptWriter.setInsertStatementTemplate(getSqlInsertStatementTemplate());
		}
		if (hasText(getSqlBodyPlaceholder())) {
			sqlScriptWriter.setBodyPlaceholder(getSqlBodyPlaceholder());
		}
		if (hasText(getSqlLineBreak())) {
			sqlScriptWriter.setLineBreak(getSqlLineBreak());
		}
		if (hasText(getTableName())) {
			sqlScriptWriter.setTable(getTableName());
		}
		if (hasText(getMessageColumnName())) {
			sqlScriptWriter.setMessage(getMessageColumnName());
		}
		if (hasText(getTypeColumnName())) {
			sqlScriptWriter.setType(getTypeColumnName());
		}
		if (hasText(getCodeIdColumnName())) {
			sqlScriptWriter.setCodeId(getCodeIdColumnName());
		}
		if (hasText(getLangIdColumnName())) {
			sqlScriptWriter.setLangId(getLangIdColumnName());
		}
		return sqlScriptWriter;
	}

	@Bean
	public MessageManagementService messageManagementService(MessageSourceManagementDao messageSourceDao,
	                                                         ExcelReader excelReader,
	                                                         ExcelWriter excelWriter,
	                                                         TextWriter textWriter) {
		MessageManagementServiceImpl service = new MessageManagementServiceImpl();
		service.setExcelReader(excelReader);
		service.setExcelWriter(excelWriter);
		service.setTextWriter(textWriter);
		service.setMessageSourceDao(messageSourceDao);
		return service;
	}

	/**
	 * table name for the message resources
	 *
	 * @return table name
	 */
	protected String getTableName() {
		return springI18nSupportProperties.getDataSource().getTableName();
	}

	protected String getMessageColumnName() {
		return springI18nSupportProperties.getDataSource().getMessageColumnName();
	}

	protected String getTypeColumnName() {
		return springI18nSupportProperties.getDataSource().getTypeColumnName();
	}

	protected String getCodeIdColumnName() {
		return springI18nSupportProperties.getDataSource().getCodeIdColumnName();
	}

	protected String getLangIdColumnName() {
		return springI18nSupportProperties.getDataSource().getLangIdColumnName();
	}

	protected String getScriptTemplatePath() {
		return springI18nSupportProperties.getDataSource().getSqlExportScriptTemplatePath();
	}

	protected String getSqlInsertStatementTemplate() {
		return springI18nSupportProperties.getDataSource().getSqlExportInsertStatementTemplate();
	}

	protected String getSqlBodyPlaceholder() {
		return springI18nSupportProperties.getDataSource().getSqlExportBodyPlaceholder();
	}

	protected String getSqlLineBreak() {
		return springI18nSupportProperties.getDataSource().getSqlExportLineBreak();
	}
}