package gov.loc.repository.bagit.domain;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
/**
* The main representation of the bagit spec.
*/
public final class Bag {
//The original version of the bag
private Version version = new Version(-1, -1);
//from the bagit.txt or UTF-8 for new bags
private Charset fileEncoding = StandardCharsets.UTF_8;
//equivalent to the manifest-<ALG>.txt files
private Set<Manifest> payLoadManifests = new HashSet<>();
//equivalent to the tagmanifest-<ALG>.txt files
private Set<Manifest> tagManifests = new HashSet<>();
//equivalent to the fetch.txt
private List<FetchItem> itemsToFetch = new ArrayList<>();
//equivalent to the bag-info.txt
private Metadata metadata = new Metadata();
//the current location of the bag on the filesystem
private Path rootDir;
/**
* empty bag with an invalid version
*/
public Bag(){
//intentionally empty
}
/**
* empty bag with the specified bag version
*
* @param version the version of the bag
*/
public Bag(final Version version){
this.version = version;
}
/**
* Create a new bag with the same values as the supplied bag
*
* @param bag the bag to clone
*/
public Bag(final Bag bag){
this.version = bag.getVersion();
this.fileEncoding = bag.fileEncoding;
this.itemsToFetch = bag.getItemsToFetch();
this.metadata = bag.getMetadata();
this.payLoadManifests = bag.getPayLoadManifests();
this.tagManifests = bag.getTagManifests();
this.rootDir = bag.getRootDir();
}
public Version getVersion(){
return version;
}
public Set<Manifest> getPayLoadManifests() {
return payLoadManifests;
}
public void setPayLoadManifests(final Set<Manifest> payLoadManifests) {
this.payLoadManifests = payLoadManifests;
}
public Set<Manifest> getTagManifests() {
return tagManifests;
}
public void setTagManifests(final Set<Manifest> tagManifests) {
this.tagManifests = tagManifests;
}
public List<FetchItem> getItemsToFetch() {
return itemsToFetch;
}
public void setItemsToFetch(final List<FetchItem> itemsToFetch) {
this.itemsToFetch = itemsToFetch;
}
public Metadata getMetadata() {
return metadata;
}
public void setMetadata(final Metadata metadata) {
this.metadata = metadata;
}
public Charset getFileEncoding() {
return fileEncoding;
}
public void setFileEncoding(final Charset fileEncoding) {
this.fileEncoding = fileEncoding;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder(95);
sb.append("Bag [version=").append(version)
.append(", fileEncoding=").append(fileEncoding)
.append(", payLoadManifests=[");
for(final Manifest payloadManifest : payLoadManifests){
sb.append(payloadManifest).append(' ');
}
sb.append("], tagManifests=[");
for(final Manifest tagManifest : tagManifests){
sb.append(tagManifest).append(' ');
}
sb.append("], itemsToFetch=").append(itemsToFetch)
.append(", metadata=").append(metadata).append(']');
return sb.toString();
}
@Override
public int hashCode() {
return Objects.hash(version) + Objects.hash(fileEncoding) + Objects.hash(payLoadManifests) +
Objects.hash(tagManifests) + Objects.hash(itemsToFetch) + Objects.hash(metadata);
}
@Override
public boolean equals(final Object obj) {
if (this == obj){
return true;
}
if (obj == null){
return false;
}
if (!(obj instanceof Bag)){
return false;
}
final Bag other = (Bag) obj;
return Objects.equals(this.version, other.getVersion()) &&
Objects.equals(this.fileEncoding, other.getFileEncoding()) &&
Objects.equals(this.payLoadManifests, other.getPayLoadManifests()) &&
Objects.equals(this.tagManifests, other.getTagManifests()) &&
Objects.equals(this.itemsToFetch, other.getItemsToFetch()) &&
Objects.equals(this.metadata, other.getMetadata());
}
public Path getRootDir() {
return rootDir;
}
public void setRootDir(final Path rootDir) {
this.rootDir = rootDir;
}
public void setVersion(final Version version) {
this.version = version;
}
}