public void apply( ServerTransaction txn, Map objects, BackReferences includeIDs, ObjectInstanceMonitor instanceMonitor) { final ServerTransactionID stxnID = txn.getServerTransactionID(); final ChannelID channelID = txn.getChannelID(); final TransactionID txnID = txn.getTransactionID(); final List changes = txn.getChanges(); GlobalTransactionID gtxID = txn.getGlobalTransactionID(); boolean active = isActive(); for (Iterator i = changes.iterator(); i.hasNext(); ) { DNA orgDNA = (DNA) i.next(); long version = orgDNA.getVersion(); if (version == DNA.NULL_VERSION) { Assert.assertFalse(gtxID.isNull()); version = gtxID.toLong(); } DNA change = new VersionizedDNAWrapper(orgDNA, version, true); ManagedObject mo = (ManagedObject) objects.get(change.getObjectID()); mo.apply(change, txnID, includeIDs, instanceMonitor, !active); if (active && !change.isDelta()) { // Only New objects reference are added here stateManager.addReference(txn.getChannelID(), mo.getID()); } } Map newRoots = txn.getNewRoots(); if (newRoots.size() > 0) { for (Iterator i = newRoots.entrySet().iterator(); i.hasNext(); ) { Entry entry = (Entry) i.next(); String rootName = (String) entry.getKey(); ObjectID newID = (ObjectID) entry.getValue(); objectManager.createRoot(rootName, newID); } } if (active) { channelStats.notifyTransaction(channelID); } transactionRateCounter.increment(); fireTransactionAppliedEvent(stxnID); }
@Override public void hydrate( final ClientObjectManager objectManager, final TCObject tco, final DNA dna, final Object po) throws IOException, ClassNotFoundException { final DNACursor cursor = dna.getCursor(); while (cursor.next(this.encoding)) { final LogicalAction action = cursor.getLogicalAction(); final LogicalOperation method = action.getLogicalOperation(); final Object[] params = action.getParameters(); apply(objectManager, po, method, params); } }
private void basicApply(Collection objectChanges, Map newRoots, boolean force) throws DNAException { List l = new LinkedList(); for (Iterator i = objectChanges.iterator(); i.hasNext(); ) { DNA dna = (DNA) i.next(); TCObject tcobj = null; Assert.assertTrue(dna.isDelta()); try { // This is a major hack to prevent distributed method calls // sent to apps that don't have the right classes from dying // This should be fixed in a better way some day :-) objectManager.getClassFor( Namespace.parseClassNameIfNecessary(dna.getTypeName()), dna.getDefiningLoaderDescription()); tcobj = objectManager.lookup(dna.getObjectID()); } catch (ClassNotFoundException cnfe) { logger.warn("Could not apply change because class not local:" + dna.getTypeName()); continue; } // Important to have a hard reference to the object while we apply // changes so that it doesn't get gc'd on us Object obj = tcobj == null ? null : tcobj.getPeerObject(); l.add(obj); if (obj != null) { try { tcobj.hydrate(dna, force); } catch (ClassNotFoundException cnfe) { logger.warn("Could not apply change because class not local:" + cnfe.getMessage()); throw new TCClassNotFoundException(cnfe); } } } for (Iterator i = newRoots.entrySet().iterator(); i.hasNext(); ) { Entry entry = (Entry) i.next(); String rootName = (String) entry.getKey(); ObjectID newRootID = (ObjectID) entry.getValue(); objectManager.replaceRootIDIfNecessary(rootName, newRootID); } }