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}