EntryViewImpl( Transaction aTxn, MangledEntry[] aTemplates, boolean holdLocks, boolean doUpdate, long aLimit) throws TransactionException, IOException { shouldUpdate = doUpdate; theTxn = TxnDispatcher.get().resolve(aTxn); /* Basic process is to assemble a set of fully matching Entry UID's which we then step through ascertaining whether these UID's are still valid and possibly asserting locks transactionally. Full matching is done in each view and the matching tuples are then logged/merged in the UIDSet These tuple ids are then scanned through using EntryReposImpl::find to load the entry, verify it's valid etc after which we may or may not maintain a transaction lock (these steps are done in EntryRx). */ theUIDs = new UIDSet(aLimit); theBuffer = new EntryRx(theTxn, holdLocks); theDynamicView = new NewView(this, aTemplates, theUIDs); if (shouldUpdate) EventQueue.get().insert(theDynamicView.getSearchTask()); /* For each template do a full tree search and assemble all matches */ for (int i = 0; i < aTemplates.length; i++) { if (theUIDs.isFull()) break; DiskView myFixedView = new DiskView(aTemplates[i], theUIDs); EntryRepository myRepos = EntryRepositoryFactory.get().find(aTemplates[i].getType()); if (myRepos != null) { myRepos.find(aTemplates[i], myFixedView); // Try subtypes Set<String> mySubtypes = myRepos.getSubtypes(); for (String t : mySubtypes) { myRepos = EntryRepositoryFactory.get().find(t); if (myRepos != null) { myRepos.find(aTemplates[i], myFixedView); } } } } }
public EntryChit next() throws TransactionException, IOException { synchronized (this) { if (theStatus == DECEASED) { if (theException != null) throw theException; else throw new TransactionException("No longer active"); } } SpaceEntryUID myUID; while ((myUID = theUIDs.pop()) != null) { EntryRepository myRepos = EntryRepositoryFactory.get().get(myUID.getType()); myRepos.find(theBuffer, myUID.getOID(), null); MangledEntry myEntry = theBuffer.getEntry(); if (myEntry != null) return new EntryChit(myEntry, myUID); } return null; }