package org.javersion.object;
import java.util.Map;
import javax.annotation.concurrent.NotThreadSafe;
import org.javersion.core.Revision;
import org.javersion.core.Version;
import org.javersion.core.VersionNode;
import org.javersion.path.PropertyPath;
import org.javersion.path.SchemaPathFilter;
@NotThreadSafe
public class ManagedObjectVersionBuilder<M> extends Version.BuilderBase<PropertyPath, Object, M, ManagedObjectVersionBuilder<M>> {
private final ObjectVersionManager<?, M> manager;
private final Map<PropertyPath, Object> newProperties;
private Iterable<Revision> rebaseOn;
public ManagedObjectVersionBuilder(ObjectVersionManager<?, M> manager, Map<PropertyPath, Object> newProperties) {
this.manager = manager;
this.newProperties = newProperties;
}
public ObjectVersion<M> build(boolean commit) {
if (manager.useSchemaFilter) {
changeset(newProperties, manager.getVersionGraph(), new SchemaPathFilter(manager.getSchema()));
} else {
changeset(newProperties, manager.getVersionGraph());
}
if (rebaseOn != null) {
parents(rebaseOn);
}
ObjectVersion<M> version = new ObjectVersion<>(this);
if (commit) {
manager.commit(version);
}
return version;
}
public ManagedObjectVersionBuilder<M> rebaseOn(Iterable<Revision> revisions) {
this.rebaseOn = revisions;
return this;
}
@Override
public ObjectVersion<M> build() {
return build(true);
}
public VersionNode<PropertyPath, Object, M> buildVersionNode() {
ObjectVersion<M> version = build(true);
return manager.getVersionNode(version.revision);
}
}