001package co.codewizards.cloudstore.local.persistence;
002
003import static co.codewizards.cloudstore.core.util.Util.*;
004
005import java.util.UUID;
006
007import javax.jdo.annotations.Discriminator;
008import javax.jdo.annotations.DiscriminatorStrategy;
009import javax.jdo.annotations.NullValue;
010import javax.jdo.annotations.PersistenceCapable;
011import javax.jdo.annotations.Persistent;
012import javax.jdo.annotations.Unique;
013import javax.jdo.listener.StoreCallback;
014
015/**
016 * A {@code Repository} represents a repository inside the database.
017 * <p>
018 * Every repository consists of a directory including all its sub-directories and files together with one
019 * meta-data-directory containing a database. Inside this database, the local repository itself is represented
020 * by a {@link LocalRepository} instance.
021 * <p>
022 * The local repository can be connected as a client to zero or more remote repositories. For each such remote
023 * repository there is one {@link RemoteRepository} instance in the database.
024 * @author Marco หงุ่ยตระกูล-Schulze - marco at codewizards dot co
025 */
026@PersistenceCapable
027@Discriminator(strategy=DiscriminatorStrategy.VALUE_MAP)
028@Unique(name="Repository_repositoryId", members="repositoryId")
029public abstract class Repository extends Entity implements StoreCallback
030{
031        @Persistent(nullValue=NullValue.EXCEPTION)
032        private String repositoryId;
033
034        private long revision;
035
036        @Persistent(nullValue=NullValue.EXCEPTION)
037        private byte[] publicKey;
038
039        public Repository() { }
040
041        protected Repository(final UUID repositoryId) {
042                // We do not create the repositoryId here anymore, because creating it lazily avoids unnecessary
043                // creations when the JDO runtime instantiates objects (and reads their values from the DB anyway).
044                this.repositoryId = repositoryId == null ? null : repositoryId.toString();
045        }
046
047        public UUID getRepositoryId() {
048                if (repositoryId == null)
049                        repositoryId = createRepositoryId().toString();
050
051                return UUID.fromString(repositoryId);
052        }
053
054        protected UUID createRepositoryId() {
055                return UUID.randomUUID();
056        }
057
058        public long getRevision() {
059                return revision;
060        }
061        public void setRevision(final long revision) {
062                if (! equal(this.revision, revision))
063                        this.revision = revision;
064        }
065
066        public byte[] getPublicKey() {
067                return publicKey;
068        }
069
070        public void setPublicKey(final byte[] publicKey) {
071                if (! equal(this.publicKey, publicKey))
072                        this.publicKey = publicKey;
073        }
074
075        @Override
076        public void jdoPreStore() {
077                getRepositoryId();
078        }
079}