/*
* 文件名称: SequenceService.java
* 版权信息: Copyright 2001-2011 ZheJiang Collaboration Data System Co., LTD. All right reserved.
* ----------------------------------------------------------------------------------------------
* 修改历史:
* ----------------------------------------------------------------------------------------------
* 修改原因: 新增
* 修改人员: LuoJingtian
* 修改日期: 2011-12-28
* 修改内容:
*/
package com.mfh.comna.comn.seq;
import com.mfh.comn.utils.UuidUtil;
/**
* 序列业务接口
*/
public class SequenceServiceImpl implements SequenceService{
/** 字符串序列的默认长度 */
private static final int DEFAULT_SEQ_LENGTH = 10;
/** 64个0 */
private static final String PAD = "0000000000000000000000000000000000000000000000000000000000000000";
private SequenceDao sequenceDao = new SequenceDao();
/**
* 获取序列(不超过64位)
* @param sequeceName 序列名称
* @author LuoJingtian created on 2011-12-28
* @since SHK BMP 1.0
*/
@Override
public String getNextSeqStringValue(String sequeceName) {
return getNextSeqStringValue(sequeceName, DEFAULT_SEQ_LENGTH);
}
/**
* 获取序列(不超过64位)
* @param sequeceName 序列名称
* @param seqLength 序列长度
* @author LuoJingtian created on 2012-1-16
* @since SHK BMP 1.0
*/
@Override
public String getNextSeqStringValue(String sequeceName, int seqLength) {
int length = (seqLength > 0 && seqLength < DEFAULT_SEQ_LENGTH) ? seqLength : DEFAULT_SEQ_LENGTH;
long sequenceValue = getNextSeqLongValue(sequeceName);
String strValue = String.valueOf(sequenceValue);
if (strValue.length() <= length) {
return PAD.substring(0, length - strValue.length()) + strValue;
}
else {
return strValue;
}
}
/**
* 获取随机的UUID作为序列
* @return UUID
* @author LuoJingtian created on 2012-1-16
* @since SHK BMP 1.0
*/
@Override
public String getUUID() {
return UuidUtil.getUuid();
}
/**
* 获取序列
* @param sequeceName 序列名称
* @author LuoJingtian created on 2011-12-28
* @since SHK BMP 1.0
*/
@Override
public synchronized long getNextSeqLongValue(String sequeceName) {
Sequence sequence = sequenceDao.getSequence(sequeceName);
if (sequence == null)
throw new RuntimeException("指定的序列名:" + sequeceName + "不存在,数据库初始化有错误!");
long sequenceValue = sequence.getSequenceValue();//当前值
long nextValue;
if (sequenceValue < 0)//第一次
nextValue = sequence.getMinValue();
else{
nextValue = sequenceValue + sequence.getStepValue();
if (sequence.getMaxValue() > 0 && nextValue >= sequence.getMaxValue()) {
if (sequence.isCycle())
nextValue = sequence.getMinValue();
else
throw new RuntimeException("序列已经达到最大值,不能生成新的序列!");
}
}
sequence.setSequenceValue(nextValue);
sequenceDao.updateSequence(sequence);
return nextValue;
}
@Override
public int getNextSeqIntValue(String sequeceName) {
return (int)getNextSeqLongValue(sequeceName);
}
// -------------------------------- 以下为Getter/Setter方法 -------------------------------- //
@Override
public void checkSequence(String seqName, long minValue, Long maxValue){
if (minValue < 0)
throw new RuntimeException("非法的最小值,应该是正值!");
Sequence sequence = sequenceDao.getSequence(seqName);
if (sequence == null){
sequence = new Sequence();
sequence.setId(seqName);
sequence.setSequenceValue(-1);
sequence.setMinValue(minValue);
sequence.setMaxValue(maxValue);//-1代表无穷大
sequenceDao.insertSequence(sequence);
}
else{
boolean bUpdated = false;
if (sequence.getMinValue() != minValue){
sequence.setMinValue(minValue);
bUpdated = true;
}
if (maxValue == null)
maxValue = -1L;
long oldMax = sequence.getMaxValue();
if (maxValue != oldMax){
sequence.setMaxValue(maxValue);
bUpdated = true;
}
if (bUpdated)
sequenceDao.updateSequence(sequence);
}
}
}