diff -r 80b660cf4880 masterfs/src/org/netbeans/modules/masterfs/ProvidedExtensionsProxy.java --- a/masterfs/src/org/netbeans/modules/masterfs/ProvidedExtensionsProxy.java Tue Feb 17 00:25:26 2009 +0300 +++ b/masterfs/src/org/netbeans/modules/masterfs/ProvidedExtensionsProxy.java Tue Feb 17 15:59:13 2009 +0100 @@ -45,6 +45,7 @@ import java.io.IOException; import java.util.Collection; import java.util.Iterator; +import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Level; import java.util.logging.Logger; import org.netbeans.modules.masterfs.providers.AnnotationProvider; @@ -58,7 +59,7 @@ * @author Radek Matous */ public class ProvidedExtensionsProxy extends ProvidedExtensions { - private Collection/*AnnotationProvider*/ annotationProviders; + private Collection annotationProviders; private static ThreadLocal reentrantCheck = new ThreadLocal(); /** Creates a new instance of ProvidedExtensionsProxy */ @@ -247,7 +248,24 @@ }); } } - } + } + + @Override + public Object getAttribute(final File file, final String attrName) { + final AtomicReference value = new AtomicReference(); + for (AnnotationProvider provider : annotationProviders) { + final InterceptionListener iListener = (provider != null) ? provider.getInterceptionListener() : null; + if (iListener instanceof ProvidedExtensions) { + runCheckCode(new Runnable() { + public void run() { + value.set(((ProvidedExtensions) iListener).getAttribute(file, attrName)); + } + }); + } + if(value.get() != null) break; + } + return value.get(); + } public static void checkReentrancy() { if (reentrantCheck.get() != null) { diff -r 80b660cf4880 masterfs/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/BaseFileObj.java --- a/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/BaseFileObj.java Tue Feb 17 00:25:26 2009 +0300 +++ b/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/BaseFileObj.java Tue Feb 17 15:59:13 2009 +0100 @@ -358,8 +358,12 @@ } } else if (attrName.equals("ExistsParentNoPublicAPI")) { return getExistingParent() != null; - } - + } else if (attrName.startsWith("ProvidedExtensions")) { //NOI18N + // #158600 - delegate to ProvidedExtensions if attrName starts with ProvidedExtensions prefix + ProvidedExtensions extension = getProvidedExtensions(); + return extension.getAttribute(getFileName().getFile(), attrName); + } + return BaseFileObj.attribs.readAttribute(getFileName().getFile().getAbsolutePath().replace('\\', '/'), attrName);//NOI18N } diff -r 80b660cf4880 masterfs/src/org/netbeans/modules/masterfs/providers/ProvidedExtensions.java --- a/masterfs/src/org/netbeans/modules/masterfs/providers/ProvidedExtensions.java Tue Feb 17 00:25:26 2009 +0300 +++ b/masterfs/src/org/netbeans/modules/masterfs/providers/ProvidedExtensions.java Tue Feb 17 15:59:13 2009 +0100 @@ -175,5 +175,16 @@ * @param fo file which FileLock was released * @since 1.11 */ - public void fileUnlocked(FileObject fo) {} + public void fileUnlocked(FileObject fo) {} + + /** + * Called by {@code MasterFileSystem} when {@code FileObject} is + * queried for attribute and attribute's name starts with {@code ProvidedExtensions} + * prefix. + * @param attrName name of attribute + * @return value of attribute + */ + public Object getAttribute(File file, String attrName) { + return null; + } }