package message.datasource.key;
import org.springframework.dao.DataAccessException;
import javax.sql.DataSource;
import java.util.UUID;
/**
* 主键生成器实现
*
* @author sunhao(sunhao.java@gmail.com)
* @version V1.0, 2012-4-11 上午08:26:42
*/
public abstract class AbstractMaxValueIncrementer implements IDGenerator {
private DataSource dataSource;
/**
* the key length, if key's length what get from database < this given keyLength,
* then make string value as '0...0key'
*/
private int keyLength;
public int nextIntValue(String name) throws DataAccessException {
return (int) getNextKey(name);
}
public long nextLongValue(String name) throws DataAccessException {
return getNextKey(name);
}
public String nextStringValue(String name) throws DataAccessException {
String key = Long.toString(getNextKey(name));
int l = key.length();
if(l < this.getKeyLength()){
//从数据库中得到的key长度小于给定的length,则在缺失的位置补0
StringBuffer sb = new StringBuffer();
for(int i = 0; i < this.getKeyLength() - l; i++){
sb.append("0");
}
sb.append(key);
key = sb.toString();
}
return key;
}
/**
* because every database has it's owen get id method
* this need override by every database
*
* @param name
* @return
*/
protected abstract long getNextKey(String name);
/**
* get uuid as pkId
*/
public String UUID() {
return UUID.randomUUID().toString();
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public DataSource getDataSource() {
return dataSource;
}
public int getKeyLength() {
return keyLength;
}
public void setKeyLength(int keyLength) {
this.keyLength = keyLength;
}
public Object nextObjectValue(Class<?> clazz, String name) throws DataAccessException {
long id = getNextKey(name);
if (Integer.class.equals(clazz))
return new Integer(id + "");
if (String.class.equals(clazz))
return String.valueOf(id);
return id;
}
}