package com.mossle.user.support;
import javax.annotation.PostConstruct;
import com.mossle.api.userrepo.UserRepoCache;
import com.mossle.api.userrepo.UserRepoConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.Assert;
public class UserRepoConnectorFactoryBean implements FactoryBean {
private static Logger logger = LoggerFactory
.getLogger(UserRepoConnectorFactoryBean.class);
private UserRepoConnector userRepoConnector;
private String type = "database";
private JdbcTemplate jdbcTemplate;
private UserRepoCache userRepoCache;
private String sqlFindById;
private String sqlFindByCode;
private String sqlFindAll;
@PostConstruct
public void afterPropertiesSet() {
Assert.notNull(type, "type cannot be null");
if ("mock".equals(type)) {
processMock();
} else if ("database".equals(type)) {
processDatabase();
} else {
throw new IllegalArgumentException("unsupported type : " + type);
}
}
public void processMock() {
MockUserRepoConnector mockUserRepoConnector = new MockUserRepoConnector();
userRepoConnector = mockUserRepoConnector;
}
public void processDatabase() {
Assert.notNull(jdbcTemplate, "jdbcTemplate cannot be null");
DatabaseUserRepoConnector databaseUserRepoConnector = new DatabaseUserRepoConnector();
databaseUserRepoConnector.setJdbcTemplate(jdbcTemplate);
if (sqlFindById != null) {
databaseUserRepoConnector.setSqlFindById(sqlFindById);
}
if (sqlFindByCode != null) {
databaseUserRepoConnector.setSqlFindByCode(sqlFindByCode);
}
if (sqlFindAll != null) {
databaseUserRepoConnector.setSqlFindAll(sqlFindAll);
}
if (userRepoCache != null) {
logger.debug("use cache for UserRepoConnector");
UserRepoConnectorWrapper userRepoConnectorWrapper = new UserRepoConnectorWrapper();
userRepoConnectorWrapper
.setUserRepoConnector(databaseUserRepoConnector);
userRepoConnectorWrapper.setUserRepoCache(userRepoCache);
userRepoConnector = userRepoConnectorWrapper;
} else {
userRepoConnector = databaseUserRepoConnector;
}
}
public Object getObject() {
return userRepoConnector;
}
public Class getObjectType() {
return UserRepoConnector.class;
}
public boolean isSingleton() {
return true;
}
public void setType(String type) {
this.type = type;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void setUserRepoCache(UserRepoCache userRepoCache) {
this.userRepoCache = userRepoCache;
}
public void setSqlFindById(String sqlFindById) {
this.sqlFindById = sqlFindById;
}
public void setSqlFindByCode(String sqlFindByCode) {
this.sqlFindByCode = sqlFindByCode;
}
public void setSqlFindAll(String sqlFindAll) {
this.sqlFindAll = sqlFindAll;
}
}