package com.robert.vesta.service.impl.converter;
import com.robert.vesta.service.bean.Id;
import com.robert.vesta.service.impl.bean.IdMeta;
import com.robert.vesta.service.impl.bean.IdMetaFactory;
import com.robert.vesta.service.impl.bean.IdType;
public class IdConverterImpl implements IdConverter {
private IdType idType;
public IdConverterImpl() {
}
public IdConverterImpl(IdType idType) {
this.idType = idType;
}
public long convert(Id id) {
return doConvert(id, IdMetaFactory.getIdMeta(idType));
}
protected long doConvert(Id id, IdMeta idMeta) {
long ret = 0;
ret |= id.getMachine();
ret |= id.getSeq() << idMeta.getSeqBitsStartPos();
ret |= id.getTime() << idMeta.getTimeBitsStartPos();
ret |= id.getGenMethod() << idMeta.getGenMethodBitsStartPos();
ret |= id.getType() << idMeta.getTypeBitsStartPos();
ret |= id.getVersion() << idMeta.getVersionBitsStartPos();
return ret;
}
public Id convert(long id) {
return doConvert(id, IdMetaFactory.getIdMeta(idType));
}
protected Id doConvert(long id, IdMeta idMeta) {
Id ret = new Id();
ret.setMachine(id & idMeta.getMachineBitsMask());
ret.setSeq((id >>> idMeta.getSeqBitsStartPos()) & idMeta.getSeqBitsMask());
ret.setTime((id >>> idMeta.getTimeBitsStartPos()) & idMeta.getTimeBitsMask());
ret.setGenMethod((id >>> idMeta.getGenMethodBitsStartPos()) & idMeta.getGenMethodBitsMask());
ret.setType((id >>> idMeta.getTypeBitsStartPos()) & idMeta.getTypeBitsMask());
ret.setVersion((id >>> idMeta.getVersionBitsStartPos()) & idMeta.getVersionBitsMask());
return ret;
}
public IdType getIdType() {
return idType;
}
public void setIdType(IdType idType) {
this.idType = idType;
}
}