Mercurial > hg > blitz_condensed
diff src/org/dancres/blitz/NewView.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/dancres/blitz/NewView.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,206 @@ +package org.dancres.blitz; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import net.jini.core.transaction.TransactionException; +import net.jini.space.JavaSpace; + +import org.dancres.blitz.disk.DiskTxn; +import org.dancres.blitz.entry.*; +import org.dancres.blitz.mangler.MangledEntry; +import org.dancres.blitz.oid.OID; +import org.dancres.blitz.notify.EventGenerator; +import org.dancres.blitz.notify.EventQueue; +import org.dancres.blitz.notify.QueueEvent; +import org.dancres.blitz.notify.EventGeneratorState; +import org.dancres.struct.LinkedInstance; + +/** + <p>Reponsible for dispatching the flow of new writes into the UIDSet.</p> + */ +class NewView { + private static final Logger theLogger = + Logging.newLogger("org.dancres.blitz.NewView"); + + private EventGeneratorImpl theEventGenerator; + + private MangledEntry[] theTemplates; + private UIDSet theUIDs; + + private EntryViewImpl theView; + + NewView(EntryViewImpl aView, MangledEntry[] aTemplates, UIDSet aSet) { + theTemplates = aTemplates; + theUIDs = aSet; + theEventGenerator = new EventGeneratorImpl(); + theView = aView; + } + + EventGenerator getSearchTask() { + return theEventGenerator; + } + + /** + @return <code>true</code> if this Visitor wishes to perform a take. + */ + public boolean isDeleter() { + return false; + } + + /************************************************************************ + * View stuff + ************************************************************************/ + + private boolean atCapacity() { + /* + If we're in merge mode, theMergeTuples will tell us how many + Entry's we currently have accrued. Otherwise everything is added + to theTuples. + */ + return (theUIDs.isFull()); + } + + private class EventGeneratorImpl implements EventGenerator { + private boolean isTainted = false; + private OID theOID; + + EventGeneratorImpl() { + } + + public void assign(OID anOID) { + theOID = anOID; + } + + public long getStartSeqNum() { + return 0; + } + + public OID getId() { + return theOID; + } + + public boolean isPersistent() { + return false; + } + + public long getSourceId() { + return 0; + } + + void taint(boolean signal) { + + /* + try { + Tasks.queue(new CleanTask(getId())); + } catch (InterruptedException anIE) { + theLogger.log(Level.WARNING, + "Failed to lodge cleanup for: " + getId(), anIE); + } + */ + } + + public void taint() { + synchronized (this) { + // Tainting can only be done once + // + if (isTainted) + return; + + isTainted = true; + } + + try { + EventQueue.get().kill(getId()); + } catch (IOException anIOE) { + theLogger.log(Level.SEVERE, + "Encountered IOException during kill", anIOE); + } + } + + public boolean canSee(QueueEvent anEvent, long aTime) { + synchronized (this) { + if (isTainted) { + return false; + } + } + + // Check if it's txn_ended and my txn and call resolved if it is + if ((anEvent.getType() == QueueEvent.TRANSACTION_ENDED) && + (theView.getTxn().getId().equals(anEvent.getTxn().getId()))) { + theView.resolved(); + return false; + } + + // We want to see new writes from a transaction + // + return (anEvent.getType() == QueueEvent.ENTRY_WRITE); + } + + public boolean matches(MangledEntry anEntry) { + synchronized (this) { + if (isTainted) { + return false; + } + } + + for (int i = 0; i < theTemplates.length; i++) { + MangledEntry myTemplate = theTemplates[i]; + + if (Types.isSubtype(myTemplate.getType(), anEntry.getType())) { + if (myTemplate.match(anEntry)) { + return true; + } + } + } + + return false; + } + + public boolean renew(long aTime) { + // Nothing to do as we expire by being tainted by the enclosing + // class only + // + return true; + } + + public void recover(long aSeqNum) { + // Nothing to do + } + + public long jumpSequenceNumber() { + return 0; + } + + public long jumpSequenceNumber(long aMin) { + return 0; + } + + public void ping(QueueEvent anEvent, JavaSpace aSource) { + synchronized (this) { + if (isTainted) { + return; + } + } + + if (atCapacity()) { + taint(); + return; + } + + QueueEvent.Context myContext = anEvent.getContext(); + + SpaceEntryUID myUID = + new SpaceEntryUID(myContext.getEntry().getType(), + myContext.getOID()); + + theUIDs.add(myUID); + } + + public EventGeneratorState getMemento() { + throw new RuntimeException( + "Shouldn't be happening - we're transient"); + } + } +} \ No newline at end of file