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); } }