Netbeans RCP: external layer.xml

A Netbeans RCP application might benefit from an additional layer.xml file stored outside of application bundles. A network directory or a http server may provide some layer.xml with centralized or corporated configuration or user profiles, maintained the network administrator.

This article was first published at techtavern.wordpress.com

There are two solutions to add an additional layer.xml file to your application. Both solutions are provided by Netbeans RCP Toys at github.

LayerProvider

Register a LayerProvider using the @ServiceProvider(service = LayerProvider.class) annotation. The platform calls all LayerProvider.registerLayers(Collection<? super URL>) to populate the collection with URLs to additional layer files. This URL may refer a local file or a remote over HTTP. As this method is called early, your application might not yet know the URL. For example, it does not work for command line argument as they have not been parsed then LayerProvider.registerLayers() is called. This approach is file as long as your URLs are declared as static constants.

@ServiceProvider(service = LayerProvider.class)
public class SystemPropertyUrlLayer extends Repository.LayerProvider {
    @Override
    protected void registerLayers(Collection<? super URL> context) {
       try {
          context.add(new URL(...));
        } catch (MalformedURLException ex) {
            throw new IllegalArgumentException("Invalid URL.", ex);
        }
    }
}

This solution is demonstrated by the Platform-Layer-Property example at Netbeans RCP Toys, which extracts the additional layer.xml URL from a system property.

Dynamic FileSystem

Register your own FileSystem instance using the @ServiceProvider(service = FileSystem.class) annotation. It will be instantiated early, but a FileSystem instance may change it content later when the additional layer.xml path is known. A custom and changeable FileSystem implementation is quite complex. Fortunately, the platform provides the DynamicLayer that may be extended to emulate the custom and changeable behavior.


/**
 * @see http://wiki.netbeans.org/DevFaqDynamicSystemFilesystem
 * @author Daniel Felix Ferber - X7WS
 */
@ServiceProvider(service = FileSystem.class)
public class PostLoadingFileSystem extends MultiFileSystem {

    private static PostLoadingFileSystem INSTANCE;

    public PostLoadingFileSystem() {
        // will be created on startup, exactly once
        INSTANCE = this;
        setPropagateMasks(true); // permit *_hidden masks to be used
    }

    public static PostLoadingFileSystem getInstance() {
        return INSTANCE;
    }

    public void setFileSystem(FileSystem fs) {
        FileSystem[] newDelegates = new FileSystem[] { fs };
        setDelegates(newDelegates);
    }

    public void setFileSystem(URL url) {
       try {
            setFileSystem(new XMLFileSystem(url));
        } catch (SAXException ex) {
            throw new IllegalArgumentException("URL references an invalid XML document.", ex);
        }
    }
}

This solution is demonstrated by the Platform-Layer-Argument example at Netbeans RCP Toys, which extracts the additional layer.xml URL from a command line argument.

One Response to Netbeans RCP: external layer.xml

  1. How to reload external file system, clear in cache?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: