package org.javers.core.commit; import org.javers.common.validation.Validate; import org.javers.core.diff.Change; import org.javers.core.diff.Diff; import org.javers.core.metamodel.object.Cdo; import org.javers.core.metamodel.object.CdoSnapshot; import java.time.LocalDateTime; import java.util.Collections; import java.util.List; import java.util.Map; /** * JaVers commit is similar notion to GIT <i>commit</i> or SVN <i>revision</i>. * It records <b>change</b> done by user on application data. * <br><br> * * Commit can affect one or more domain objects ({@link Cdo}). * <br><br> * * Commit holds following data: * <ul> * <li>who did change the data - {@link CommitMetadata#getAuthor()} </li> * <li>when the change was made - {@link CommitMetadata#getCommitDate()} </li> * <li>list of atomic changes between two domain object graphs - {@link #getChanges()}</li> * <li>list of Snapshots of <b>affected</b> objects - {@link #getSnapshots()}</li> * </ul> * * @author bartosz walacik */ public final class Commit { private final CommitMetadata commitMetadata; private final List<CdoSnapshot> snapshots; private final Diff diff; Commit(CommitMetadata commitMetadata, List<CdoSnapshot> snapshots, Diff diff) { Validate.argumentsAreNotNull(commitMetadata, snapshots, diff); this.commitMetadata = commitMetadata; this.snapshots = snapshots; this.diff = diff; } /** * Monotonically increasing id, * e.g. 1.0, 2.0, ... */ public CommitId getId() { return commitMetadata.getId(); } public String getAuthor() { return commitMetadata.getAuthor(); } public Map<String, String> getProperties() { return commitMetadata.getProperties(); } Diff getDiff() { return diff; } public LocalDateTime getCommitDate() { return commitMetadata.getCommitDate(); } /** * @return unmodifiableList */ public List<CdoSnapshot> getSnapshots() { return Collections.unmodifiableList(snapshots); } /** * @return unmodifiableList */ public List<Change> getChanges() { return diff.getChanges(); } @Override public String toString() { StringBuilder b = new StringBuilder(); b.append("Commit(id:" + commitMetadata.getId()); b.append(", snapshots:" + snapshots.size()); b.append(", author:" + commitMetadata.getAuthor()); b.append(", " + diff.changesSummary()); b.append(")"); return b.toString(); } @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { return false; } Commit other = (Commit) o; return this.getId().equals(other.getId()); } @Override public int hashCode() { return getId().hashCode(); } }