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}