|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.clazz; import java.io.IOException; import java.util.*; import org.openide.util.Task; import org.openide.ErrorManager; import org.openide.cookies.InstanceCookie; import org.openide.ErrorManager; import org.openide.loaders.DataFolder; import org.openide.loaders.FolderInstance; import org.openide.src.nodes.FilterFactory; import org.openide.src.nodes.ElementNodeFactory; import org.openide.util.TaskListener; /** * A pool for registering FilterFactories for the object browser and the * explorer. * * @author Svatopluk Dedic */ class NodeFactoryPool extends FolderInstance { static final FilterFactory[] EMPTY = new FilterFactory[0]; /** * Base factory, which serves as a default and the tail of the chain. */ ElementNodeFactory base; /** * Factories, which were explicitly added by calls to {@link #addFactory} */ LinkedList explicit; /** * State of the underlying folder. Contains list of factories registered * through the SFS. */ FilterFactory[] factories = EMPTY; /** * Computed head of the factory chain. */ ElementNodeFactory head; /** * True, if the folder scan was triggered at least once. */ boolean initialized; NodeFactoryPool(DataFolder storage, ElementNodeFactory base) { super(storage); this.base = base; head = base; } final Object sync() { return base; } /** * Returns the head of the current factory list. Except for the initialization, * the method does not block. */ ElementNodeFactory getHead() { // force folder scan the first time the Pool is queried if (!initialized) { recreate(); waitFinished(); initialized = true; } return head; } /** * Creates an array of factories from the underlying folder. The "product" of * the method is the head of the factory list. */ protected Object createInstance(InstanceCookie[] cookies) throws java.io.IOException, ClassNotFoundException { Collection l = new ArrayList(cookies.length); for (int i = 0; i < cookies.length; i++) { try { Object o = cookies[i].instanceCreate(); if (!(o instanceof FilterFactory)) continue; l.add(o); } catch (IOException ex) { logError(ex); } catch (ClassNotFoundException ex) { logError(ex); } } synchronized (sync()) { ElementNodeFactory f = relinkFactories(l); this.factories = (FilterFactory[])l.toArray(new FilterFactory[l.size()]); return head = f; } } /** * Reattaches factories in the logicall factory chain to each other. */ private ElementNodeFactory relinkFactories(Collection first) { ElementNodeFactory previous = base; FilterFactory f = null; Iterator it; Collection next = explicit; if (first == null) first = Arrays.asList(factories); for (it = first.iterator(); it.hasNext(); ) { f = (FilterFactory)it.next(); f.attachTo(previous); previous = f; } if (next != null) { for (it = next.iterator(); it.hasNext(); ) { f = (FilterFactory)it.next(); f.attachTo(previous); previous = f; } } return f != null ? f : base; } /** * Adds an explicit factory and the head of the chain. Relinks the entire * chain as well. */ void addFactory(FilterFactory f) { synchronized (sync()) { if (explicit == null) { explicit = new LinkedList(); } explicit.add(f); head = relinkFactories(null); } } /** * Removes one factory from the explicit list. Relinks the chain, if the * factory was, actually, on the list. */ void removeFactory(FilterFactory f) { synchronized (sync()) { if (!explicit.remove(f)) return; relinkFactories(null); } } void logError(Exception ex) { ErrorManager.getDefault().notify(ex); } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.