Mercurial > hg > blitz_stable
diff src/org/prevayler/implementation/SnapshotterImpl.java @ 0:3dc0c5604566
Initial checkin of blitz 2.0 fcs - no installer yet.
author | Dan Creswell <dan.creswell@gmail.com> |
---|---|
date | Sat, 21 Mar 2009 11:00:06 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/prevayler/implementation/SnapshotterImpl.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,59 @@ +package org.prevayler.implementation; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; +import java.io.IOException; + +import org.prevayler.PrevalentSystem; + +/** + Represents a snapshot waiting to be persisted to disk. Invoke save() to + place the snapshot on disk - should only be called once all dirty state + (if any) has been flushed to disk. + + @see org.dancres.blitz.txn.TxnManager + */ +class SnapshotterImpl implements Snapshotter { + private File theTemp; + private File theReal; + private byte[] theCachedCopy; + + private NumberFileCreator theFileCreator; + + private boolean shouldClean; + + SnapshotterImpl(NumberFileCreator aCreator, boolean doClean) + throws IOException { + + theTemp = aCreator.newTempSnapshot(); + theReal = aCreator.newSnapshot(); + + theFileCreator = aCreator; + shouldClean = doClean; + } + + void cacheSnapshot(PrevalentSystem aSystem) throws IOException { + ByteArrayOutputStream myCache = new ByteArrayOutputStream(); + ObjectOutputStream mySnapper = new ObjectOutputStream(myCache); + + mySnapper.writeObject(aSystem); + mySnapper.close(); + + theCachedCopy = myCache.toByteArray(); + } + + public void save() throws IOException { + FileOutputStream myOutput = new FileOutputStream(theTemp); + myOutput.write(theCachedCopy); + myOutput.close(); + + if (!theTemp.renameTo(theReal)) + throw new IOException("Unable to rename " + theTemp + + " to " + theReal); + + if (shouldClean) + theFileCreator.newCleaner().clean(); + } +}