001package co.codewizards.cloudstore.local.persistence;
002
003import static co.codewizards.cloudstore.core.util.Util.*;
004import static java.util.Objects.*;
005
006import java.util.HashSet;
007import java.util.Iterator;
008import java.util.Set;
009import java.util.UUID;
010
011import javax.jdo.JDOHelper;
012import javax.jdo.PersistenceManager;
013import javax.jdo.annotations.Discriminator;
014import javax.jdo.annotations.DiscriminatorStrategy;
015import javax.jdo.annotations.Inheritance;
016import javax.jdo.annotations.InheritanceStrategy;
017import javax.jdo.annotations.Join;
018import javax.jdo.annotations.NullValue;
019import javax.jdo.annotations.PersistenceCapable;
020import javax.jdo.annotations.Persistent;
021
022/**
023 * A {@code LocalRepository} represents the local repository inside the repository's database.
024 * <p>
025 * There is exactly one {@code LocalRepository} instance in the database.
026 * @author Marco หงุ่ยตระกูล-Schulze - marco at codewizards dot co
027 */
028@PersistenceCapable
029@Inheritance(strategy=InheritanceStrategy.SUPERCLASS_TABLE)
030@Discriminator(strategy=DiscriminatorStrategy.VALUE_MAP, value="LocalRepository")
031public class LocalRepository extends Repository {
032
033        @Persistent(nullValue=NullValue.EXCEPTION)
034        private Directory root;
035
036        @Persistent(nullValue=NullValue.EXCEPTION)
037        private byte[] privateKey;
038
039        @Join
040        private Set<String> aliases;
041
042        public LocalRepository() { }
043
044        public LocalRepository(UUID repositoryId) {
045                super(repositoryId);
046        }
047
048        /**
049         * Get the root directory of this repository.
050         * @return the root directory of this repository. Never <code>null</code> in persistence.
051         */
052        public Directory getRoot() {
053                return root;
054        }
055        public void setRoot(final Directory root) {
056                if (! equal(this.root, root))
057                        this.root = root;
058        }
059
060        public byte[] getPrivateKey() {
061                return privateKey;
062        }
063
064        public void setPrivateKey(final byte[] privateKey) {
065                if (! equal(this.privateKey, privateKey))
066                        this.privateKey = privateKey;
067        }
068
069        public Set<String> getAliases() {
070                if (aliases == null)
071                        aliases = new HashSet<>();
072
073                return aliases;
074        }
075
076        @Override
077        public void jdoPreStore() {
078                super.jdoPreStore();
079                final PersistenceManager pm = requireNonNull(JDOHelper.getPersistenceManager(this), "JDOHelper.getPersistenceManager(this)");
080                final Iterator<LocalRepository> iterator = pm.getExtent(LocalRepository.class).iterator();
081                if (iterator.hasNext()) {
082                        final LocalRepository persistentInstance = iterator.next();
083                        if (iterator.hasNext())
084                                throw new IllegalStateException("There are multiple LocalRepository entities in the database.");
085
086                        if (persistentInstance != null && ! persistentInstance.equals(this))
087                                throw new IllegalStateException("Cannot persist a 2nd LocalRepository!");
088                }
089        }
090}