package org.javers.core.commit; import org.javers.common.exception.JaversException; import org.javers.common.exception.JaversExceptionCode; import org.javers.common.validation.Validate; import java.io.Serializable; import java.math.BigDecimal; /** * @see CommitSeqGenerator * @see DistributedCommitSeqGenerator * @author bartosz walacik */ public final class CommitId implements Comparable<CommitId>, Serializable { private final long majorId; private final int minorId; public CommitId(long majorId, int minorId) { this.majorId = majorId; this.minorId = minorId; } public static CommitId valueOf(BigDecimal majorDotMinor) { Validate.argumentIsNotNull(majorDotMinor); long major = majorDotMinor.longValue(); double minor = (majorDotMinor.doubleValue() - major) * 100; return new CommitId(major, new BigDecimal(minor).setScale(0, BigDecimal.ROUND_HALF_UP).intValue()); } public static CommitId valueOf(String majorDotMinor) { Validate.argumentIsNotNull(majorDotMinor); String[] strings = majorDotMinor.split("\\."); if (strings.length != 2) { throw new JaversException(JaversExceptionCode.CANT_PARSE_COMMIT_ID, majorDotMinor); } long major = Long.parseLong(strings[0]); int minor = Integer.parseInt(strings[1]); return new CommitId(major, minor); } @Override public String toString() { return value(); } public BigDecimal valueAsNumber(){ return new BigDecimal(majorId+(minorId*.01)).setScale(2, BigDecimal.ROUND_HALF_UP); } /** * e.g. "1.0" */ public String value(){ return majorId+"."+minorId; } public long getMajorId() { return majorId; } public int getMinorId() { return minorId; } @Override public boolean equals(Object o) { if (o == null) { return false; } if (o instanceof CommitId) { return this.valueAsNumber().equals(((CommitId)o).valueAsNumber()); } if (o instanceof String) { return this.value().equals(o); } return false; } @Override public int hashCode() { return value().hashCode(); } @Override public int compareTo(CommitId o) { return this.valueAsNumber().compareTo(o.valueAsNumber()); } }