package co.codewizards.cloudstore.local.persistence; import static co.codewizards.cloudstore.core.util.Util.*; import java.util.UUID; import javax.jdo.annotations.Discriminator; import javax.jdo.annotations.DiscriminatorStrategy; import javax.jdo.annotations.NullValue; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.Unique; import javax.jdo.listener.StoreCallback; /** * A {@code Repository} represents a repository inside the database. * <p> * Every repository consists of a directory including all its sub-directories and files together with one * meta-data-directory containing a database. Inside this database, the local repository itself is represented * by a {@link LocalRepository} instance. * <p> * The local repository can be connected as a client to zero or more remote repositories. For each such remote * repository there is one {@link RemoteRepository} instance in the database. * @author Marco หงุ่ยตระกูล-Schulze - marco at codewizards dot co */ @PersistenceCapable @Discriminator(strategy=DiscriminatorStrategy.VALUE_MAP) @Unique(name="Repository_repositoryId", members="repositoryId") public abstract class Repository extends Entity implements StoreCallback { @Persistent(nullValue=NullValue.EXCEPTION) private String repositoryId; private long revision; @Persistent(nullValue=NullValue.EXCEPTION) private byte[] publicKey; public Repository() { } protected Repository(final UUID repositoryId) { // We do not create the repositoryId here anymore, because creating it lazily avoids unnecessary // creations when the JDO runtime instantiates objects (and reads their values from the DB anyway). this.repositoryId = repositoryId == null ? null : repositoryId.toString(); } public UUID getRepositoryId() { if (repositoryId == null) repositoryId = createRepositoryId().toString(); return UUID.fromString(repositoryId); } protected UUID createRepositoryId() { return UUID.randomUUID(); } public long getRevision() { return revision; } public void setRevision(final long revision) { if (! equal(this.revision, revision)) this.revision = revision; } public byte[] getPublicKey() { return publicKey; } public void setPublicKey(final byte[] publicKey) { if (! equal(this.publicKey, publicKey)) this.publicKey = publicKey; } @Override public void jdoPreStore() { getRepositoryId(); } }