Index: loaders/src/org/openide/loaders/InstanceDataObject.java =================================================================== RCS file: /cvs/openide/loaders/src/org/openide/loaders/InstanceDataObject.java,v retrieving revision 1.2 diff -u -r1.2 InstanceDataObject.java --- loaders/src/org/openide/loaders/InstanceDataObject.java 2 Apr 2003 09:45:57 -0000 1.2 +++ loaders/src/org/openide/loaders/InstanceDataObject.java 3 Apr 2003 13:18:25 -0000 @@ -500,15 +500,12 @@ */ private final class CookieAdjustingFilter extends FilterNode { public CookieAdjustingFilter(Node n) { - super(n); - } - public Node.Cookie getCookie(Class clazz) { - if (clazz == DataObject.class || clazz == InstanceDataObject.class) { - return InstanceDataObject.this; - } else { - return super.getCookie(clazz); - } + super(n, null, new org.openide.util.lookup.ProxyLookup (new org.openide.util.Lookup[] { + n.getLookup (), + org.openide.util.lookup.Lookups.singleton(InstanceDataObject.this) + })); } + // If this node is used as the root of a new Explorer window etc., // just save the real underlying node; no need to make it a CAF later. public Node.Handle getHandle() { Index: src/org/openide/nodes/FilterNode.java =================================================================== RCS file: /cvs/openide/src/org/openide/nodes/FilterNode.java,v retrieving revision 1.77 diff -u -r1.77 FilterNode.java --- src/org/openide/nodes/FilterNode.java 3 Apr 2003 06:37:26 -0000 1.77 +++ src/org/openide/nodes/FilterNode.java 3 Apr 2003 13:19:00 -0000 @@ -98,11 +98,7 @@ * @param original the node to delegate to */ public FilterNode(Node original) { - this ( - original, - original.isLeaf () ? - org.openide.nodes.Children.LEAF : new Children (original) - ); + this (original, null); } /** Create proxy with a different set of children. @@ -114,7 +110,24 @@ Node original, org.openide.nodes.Children children ) { - super (children, new FilterLookup ()); + this (original, children, new FilterLookup ()); + } + + /** Constracts new filter node. + * @param original the node we delegate to + * @param children the children to use for the filter node or null if + * default children should be provided + * @param lookup lookup to use + */ + public FilterNode (Node original, org.openide.nodes.Children children, Lookup lookup) { + super ( + children == null ? + (original.isLeaf () ? org.openide.nodes.Children.LEAF : new Children (original)) + : + new Children (original), + lookup + ); + this.original = original; init (); @@ -122,7 +135,7 @@ if (lkp instanceof FilterLookup) { ((FilterLookup)lkp).ownNode (this); } - } + } private static final WeakHashMap replaceProvidedLookupCache = new WeakHashMap (27); /** Overrides package private method of a node that allows us to say Index: src/org/openide/windows/DefaultTopComponentLookup.java =================================================================== RCS file: /cvs/openide/src/org/openide/windows/DefaultTopComponentLookup.java,v retrieving revision 1.11 diff -u -r1.11 DefaultTopComponentLookup.java --- src/org/openide/windows/DefaultTopComponentLookup.java 2 Apr 2003 09:46:50 -0000 1.11 +++ src/org/openide/windows/DefaultTopComponentLookup.java 3 Apr 2003 13:19:00 -0000 @@ -146,9 +146,11 @@ /** Create something only if the Node does not provide itself * from its lookup */ public Object convert(Object obj) { + if (obj == null) return null; + Lookup[] arr = getLookups (); for (int i = 0; i < arr.length - 1; i++) { - if (arr[i].lookup (Node.class) == obj) { + if (obj.equals (arr[i].lookup (Node.class))) { return null; } } Index: test/unit/src/org/openide/windows/TopComponentGetLookupTest.java =================================================================== RCS file: /cvs/openide/test/unit/src/org/openide/windows/TopComponentGetLookupTest.java,v retrieving revision 1.10 diff -u -r1.10 TopComponentGetLookupTest.java --- test/unit/src/org/openide/windows/TopComponentGetLookupTest.java 27 Feb 2003 23:41:31 -0000 1.10 +++ test/unit/src/org/openide/windows/TopComponentGetLookupTest.java 3 Apr 2003 13:19:01 -0000 @@ -20,6 +20,8 @@ import org.netbeans.junit.*; import org.openide.nodes.AbstractNode; +import org.openide.nodes.FilterNode; +import org.openide.nodes.Node; import org.openide.util.Lookup; import org.openide.util.lookup.AbstractLookup; import org.openide.util.lookup.InstanceContent; @@ -264,6 +266,41 @@ listener.check ("Queriing for node does generate an event", 0); assertEquals ("No Queries to the not active node made", 0, cnt.queries); assertEquals ("No listeneners on cookies", allListeners, cnt.listeners); + } + + public void testBug32470FilterNodeAndANodeImplementingACookie () { + class NY extends AbstractNode implements org.openide.cookies.SaveCookie { + public NY () { + super (org.openide.nodes.Children.LEAF); + getCookieSet ().add (this); + } + + public void save () { + } + } + + Node ny = new NY (); + Node node = new FilterNode (new FilterNode (ny, null, ny.getLookup ())); + top.setActivatedNodes (new Node[] { node }); + + Lookup.Template nodeTemplate = new Lookup.Template (Node.class); + Lookup.Template saveTemplate = new Lookup.Template (org.openide.cookies.SaveCookie.class); + java.util.Collection res; + + res = lookup.lookup (nodeTemplate).allInstances (); + assertEquals ("FilterNode is the only node there", + java.util.Collections.singletonList (node), res + ); + + res = lookup.lookup (saveTemplate).allInstances (); + assertEquals ("SaveCookie is there only once", + java.util.Collections.singletonList (ny), res + ); + + res = lookup.lookup (nodeTemplate).allInstances (); + assertEquals ("FilterNode is still the only node there", + java.util.Collections.singletonList (node), res + ); }