Apache
Home » Documentation » Apache Felix Dependency Manager

Dependency Manager - Resource Dependency

A resource dependency allows you to depend on a resource. A resource is a URL and you can use a filter condition based on protocol, host, port, path and URL.

To define a resource dependency, you need to use the ResourceDependecy interface. This interface can be created using DependencyActivatorBase.createResourceDependency() or DependencyManager.createResourceDependency() methods;

Here is an example where a bundle activation declares a VideoPlayer component which depends on a resource URL. The component uses an optional dependency callback, which is invoked each time an URL is registered.

public class Activator extends DependencyActivatorBase {
    @Override
    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
        Component videoPlayer = createComponent()
                .setImplementation(VideoPlayer.class)
                .add(createResourceDependency().setFilter("(&(path=/path/to/*.txt)(host=localhost))").setCallbacks("play", null));
        dm.add(videoPlayer);                  
    }
}

public class VideoPlayer {
    void play(URL url) {
        System.out.println("play: " + url);

    }
}

And here is a component which registers some URL resources:

public class Activator extends DependencyActivatorBase {
    @Override
    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
        // add resource provider
        URL[] resourceURLs = new URL[] {
                new URL("file://localhost/path/to/file1.txt"),
                new URL("file://localhost/path/to/file2.txt")
        };

        Component resourceProvider = createComponent()
                .setImplementation(new ResourceProvider(ctx, resourceURLs))
                .add(dm.createServiceDependency().setService(ResourceHandler.class).setCallbacks("add", "remove"));
        dm.add(resourceProvider);
    }
}

class ResourceProvider {
    final URL[] m_resources;
    final BundleContext m_context;
    final Map<ResourceHandler, Filter> m_handlers = new HashMap<>();

    ResourceProvider(BundleContext ctx, URL ... resources) {
        m_context = ctx;
        m_resources = resources;
    }

    public void add(ServiceReference<?> ref, ResourceHandler handler) {
        String filterString = (String) ref.getProperty("filter");
        Filter filter = null;
        if (filterString != null) {
            try {
                filter = m_context.createFilter(filterString);
            }
            catch (InvalidSyntaxException e) {
                return;
            }
        }
        for (int i = 0; i < m_resources.length; i++) {
            if (filter == null || filter.match((Dictionary<String, ?>) ResourceUtil.createProperties(m_resources[i]))) {
                synchronized (m_handlers) {
                    m_handlers.put(handler, filter);
                }
                handler.added(m_resources[i]);
            }
        }
    }

    public void remove(ServiceReference<?> ref, ResourceHandler handler) {
        Filter filter;
        synchronized (m_handlers) {
            filter = (Filter) m_handlers.remove(handler);
        }
        if (filter != null) {
            for (int i = 0; i < m_resources.length; i++) {
                if (filter == null || filter.match((Dictionary<String, ?>) ResourceUtil.createProperties(m_resources[i]))) {
                    handler.removed(m_resources[i]);
                }
            }
        }
    }
Rev. 1844579 by pderop on Mon, 22 Oct 2018 17:07:58 +0000
Apache Felix, Felix, Apache, the Apache feather logo, and the Apache Felix project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.