package com.robert.vesta.service.impl;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
import com.robert.vesta.service.impl.converter.IdConverter;
import com.robert.vesta.service.impl.converter.IdConverterImpl;
import com.robert.vesta.service.impl.provider.MachineIdProvider;
import com.robert.vesta.service.intf.IdService;
public abstract class AbstractIdServiceImpl implements IdService {
public static final long EPOCH = 1420041600000L;
protected final Logger log = LoggerFactory.getLogger(this.getClass());
protected long machineId = -1;
protected long genMethod = 0;
protected long type = 0;
protected long version = 0;
protected IdType idType;
protected IdMeta idMeta;
protected IdConverter idConverter;
protected MachineIdProvider machineIdProvider;
public AbstractIdServiceImpl() {
idType = IdType.MAX_PEAK;
}
public AbstractIdServiceImpl(String type) {
idType = IdType.parse(type);
}
public AbstractIdServiceImpl(IdType type) {
idType = type;
}
public void init() {
this.machineId = machineIdProvider.getMachineId();
if (machineId < 0) {
log.error("The machine ID is not configured properly so that Vesta Service refuses to start.");
throw new IllegalStateException(
"The machine ID is not configured properly so that Vesta Service refuses to start.");
}
setIdMeta(IdMetaFactory.getIdMeta(idType));
setType(idType.value());
setIdConverter(new IdConverterImpl(idType));
}
public long genId() {
Id id = new Id();
populateId(id);
id.setMachine(machineId);
id.setGenMethod(genMethod);
id.setType(type);
id.setVersion(version);
long ret = idConverter.convert(id);
// Use trace because it cause low performance
if (log.isTraceEnabled())
log.trace(String.format("Id: %s => %d", id, ret));
return ret;
}
protected abstract void populateId(Id id);
protected long genTime() {
if (idType == IdType.MAX_PEAK)
return (System.currentTimeMillis() - EPOCH) / 1000;
else if (idType == IdType.MIN_GRANULARITY)
return (System.currentTimeMillis() - EPOCH);
return (System.currentTimeMillis() - EPOCH) / 1000;
}
public Id expId(long id) {
return idConverter.convert(id);
}
public long makeId(long time, long seq) {
return makeId(time, seq, machineId);
}
public long makeId(long time, long seq, long machine) {
return makeId(genMethod, time, seq, machine);
}
public long makeId(long genMethod, long time, long seq, long machine) {
return makeId(type, genMethod, time, seq, machine);
}
public long makeId(long type, long genMethod, long time,
long seq, long machine) {
return makeId(version, type, genMethod, time, seq, machine);
}
public long makeId(long version, long type, long genMethod,
long time, long seq, long machine) {
IdType idType = IdType.parse(type);
Id id = new Id(machine, seq, time, genMethod, type, version);
IdConverter idConverter = new IdConverterImpl(idType);
return idConverter.convert(id);
}
public Date transTime(long time) {
if (idType == IdType.MAX_PEAK) {
return new Date(time * 1000 + EPOCH);
} else if (idType == IdType.MIN_GRANULARITY) {
return new Date(time + EPOCH);
}
return null;
}
public void setMachineId(long machineId) {
this.machineId = machineId;
}
public void setGenMethod(long genMethod) {
this.genMethod = genMethod;
}
public void setType(long type) {
this.type = type;
}
public void setVersion(long version) {
this.version = version;
}
public void setIdConverter(IdConverter idConverter) {
this.idConverter = idConverter;
}
public void setIdMeta(IdMeta idMeta) {
this.idMeta = idMeta;
}
public void setMachineIdProvider(MachineIdProvider machineIdProvider) {
this.machineIdProvider = machineIdProvider;
}
}