package com.robert.vesta.service.factory;
import java.beans.PropertyVetoException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.jdbc.core.JdbcTemplate;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.robert.vesta.service.impl.IdServiceImpl;
import com.robert.vesta.service.impl.provider.DbMachineIdProvider;
import com.robert.vesta.service.impl.provider.IpConfigurableMachineIdProvider;
import com.robert.vesta.service.impl.provider.PropertyMachineIdProvider;
import com.robert.vesta.service.intf.IdService;
public class IdServiceFactoryBean implements FactoryBean<IdService> {
protected final Logger log = LoggerFactory
.getLogger(IdServiceFactoryBean.class);
public enum Type {
PROPERTY, IP_CONFIGURABLE, DB
};
private Type providerType;
private long machineId;
private String ips;
private String dbUrl;
private String dbName;
private String dbUser;
private String dbPassword;
private long genMethod = -1;
private long type = -1;
private long version = -1;
private IdService idService;
public void init() {
if (providerType == null) {
log.error("The type of Id service is mandatory.");
throw new IllegalArgumentException(
"The type of Id service is mandatory.");
}
switch (providerType) {
case PROPERTY:
idService = constructPropertyIdService(machineId);
break;
case IP_CONFIGURABLE:
idService = constructIpConfigurableIdService(ips);
break;
case DB:
idService = constructDbIdService(dbUrl, dbName, dbUser, dbPassword);
break;
}
}
public IdService getObject() throws Exception {
return idService;
}
private IdService constructPropertyIdService(long machineId) {
log.info("Construct Property IdService machineId {}", machineId);
PropertyMachineIdProvider propertyMachineIdProvider = new PropertyMachineIdProvider();
propertyMachineIdProvider.setMachineId(machineId);
IdServiceImpl idServiceImpl = new IdServiceImpl();
idServiceImpl.setMachineIdProvider(propertyMachineIdProvider);
if (genMethod != -1)
idServiceImpl.setGenMethod(genMethod);
if (type != -1)
idServiceImpl.setType(type);
if (version != -1)
idServiceImpl.setVersion(version);
idServiceImpl.init();
return idServiceImpl;
}
private IdService constructIpConfigurableIdService(String ips) {
log.info("Construct Ip Configurable IdService ips {}", ips);
IpConfigurableMachineIdProvider ipConfigurableMachineIdProvider = new IpConfigurableMachineIdProvider(
ips);
IdServiceImpl idServiceImpl = new IdServiceImpl();
idServiceImpl.setMachineIdProvider(ipConfigurableMachineIdProvider);
if (genMethod != -1)
idServiceImpl.setGenMethod(genMethod);
if (type != -1)
idServiceImpl.setType(type);
if (version != -1)
idServiceImpl.setVersion(version);
idServiceImpl.init();
return idServiceImpl;
}
private IdService constructDbIdService(String dbUrl, String dbName,
String dbUser, String dbPassword) {
log.info(
"Construct Db IdService dbUrl {} dbName {} dbUser {} dbPassword {}",
dbUrl, dbName, dbUser, dbPassword);
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
String jdbcDriver = "com.mysql.jdbc.Driver";
try {
comboPooledDataSource.setDriverClass(jdbcDriver);
} catch (PropertyVetoException e) {
log.error("Wrong JDBC driver {}", jdbcDriver);
log.error("Wrong JDBC driver error: ", e);
throw new IllegalStateException("Wrong JDBC driver ", e);
}
comboPooledDataSource.setMinPoolSize(5);
comboPooledDataSource.setMaxPoolSize(30);
comboPooledDataSource.setIdleConnectionTestPeriod(20);
comboPooledDataSource.setMaxIdleTime(25);
comboPooledDataSource.setBreakAfterAcquireFailure(false);
comboPooledDataSource.setCheckoutTimeout(3000);
comboPooledDataSource.setAcquireRetryAttempts(50);
comboPooledDataSource.setAcquireRetryDelay(1000);
String url = String
.format("jdbc:mysql://%s/%s?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true",
dbUrl, dbName);
comboPooledDataSource.setJdbcUrl(url);
comboPooledDataSource.setUser(dbUser);
comboPooledDataSource.setPassword(dbPassword);
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setLazyInit(false);
jdbcTemplate.setDataSource(comboPooledDataSource);
DbMachineIdProvider dbMachineIdProvider = new DbMachineIdProvider();
dbMachineIdProvider.setJdbcTemplate(jdbcTemplate);
dbMachineIdProvider.init();
IdServiceImpl idServiceImpl = new IdServiceImpl();
idServiceImpl.setMachineIdProvider(dbMachineIdProvider);
if (genMethod != -1)
idServiceImpl.setGenMethod(genMethod);
if (type != -1)
idServiceImpl.setType(type);
if (version != -1)
idServiceImpl.setVersion(version);
idServiceImpl.init();
return idServiceImpl;
}
public Class<?> getObjectType() {
return IdService.class;
}
public boolean isSingleton() {
return true;
}
public Type getProviderType() {
return providerType;
}
public void setProviderType(Type providerType) {
this.providerType = providerType;
}
public long getMachineId() {
return machineId;
}
public void setMachineId(long machineId) {
this.machineId = machineId;
}
public String getIps() {
return ips;
}
public void setIps(String ips) {
this.ips = ips;
}
public String getDbUrl() {
return dbUrl;
}
public void setDbUrl(String dbUrl) {
this.dbUrl = dbUrl;
}
public String getDbName() {
return dbName;
}
public void setDbName(String dbName) {
this.dbName = dbName;
}
public String getDbUser() {
return dbUser;
}
public void setDbUser(String dbUser) {
this.dbUser = dbUser;
}
public String getDbPassword() {
return dbPassword;
}
public void setDbPassword(String dbPassword) {
this.dbPassword = dbPassword;
}
public long getGenMethod() {
return genMethod;
}
public void setGenMethod(long genMethod) {
this.genMethod = genMethod;
}
public long getType() {
return type;
}
public void setType(long type) {
this.type = type;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
}