package co.codewizards.cloudstore.local.persistence;
import static co.codewizards.cloudstore.core.util.AssertUtil.*;
import static co.codewizards.cloudstore.core.util.Util.*;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.UUID;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.annotations.Discriminator;
import javax.jdo.annotations.DiscriminatorStrategy;
import javax.jdo.annotations.Inheritance;
import javax.jdo.annotations.InheritanceStrategy;
import javax.jdo.annotations.Join;
import javax.jdo.annotations.NullValue;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
/**
* A {@code LocalRepository} represents the local repository inside the repository's database.
* <p>
* There is exactly one {@code LocalRepository} instance in the database.
* @author Marco หงุ่ยตระกูล-Schulze - marco at codewizards dot co
*/
@PersistenceCapable
@Inheritance(strategy=InheritanceStrategy.SUPERCLASS_TABLE)
@Discriminator(strategy=DiscriminatorStrategy.VALUE_MAP, value="LocalRepository")
public class LocalRepository extends Repository {
@Persistent(nullValue=NullValue.EXCEPTION)
private Directory root;
@Persistent(nullValue=NullValue.EXCEPTION)
private byte[] privateKey;
@Join
private Set<String> aliases;
public LocalRepository() { }
public LocalRepository(UUID repositoryId) {
super(repositoryId);
}
/**
* Get the root directory of this repository.
* @return the root directory of this repository. Never <code>null</code> in persistence.
*/
public Directory getRoot() {
return root;
}
public void setRoot(final Directory root) {
if (! equal(this.root, root))
this.root = root;
}
public byte[] getPrivateKey() {
return privateKey;
}
public void setPrivateKey(final byte[] privateKey) {
if (! equal(this.privateKey, privateKey))
this.privateKey = privateKey;
}
public Set<String> getAliases() {
if (aliases == null)
aliases = new HashSet<>();
return aliases;
}
@Override
public void jdoPreStore() {
super.jdoPreStore();
final PersistenceManager pm = assertNotNull(JDOHelper.getPersistenceManager(this), "JDOHelper.getPersistenceManager(this)");
final Iterator<LocalRepository> iterator = pm.getExtent(LocalRepository.class).iterator();
if (iterator.hasNext()) {
final LocalRepository persistentInstance = iterator.next();
if (iterator.hasNext())
throw new IllegalStateException("There are multiple LocalRepository entities in the database.");
if (persistentInstance != null && ! persistentInstance.equals(this))
throw new IllegalStateException("Cannot persist a 2nd LocalRepository!");
}
}
}