/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.utils.incubator; /** * Abstract base class of {@link ServiceRegistryAccess} factories, and static acquisition point for the global default factory instance. * * @author Robert Mischke */ public abstract class ServiceRegistry { private static volatile ServiceRegistryAccessFactory factory = null; /** * Creates a read-only {@link ServiceRegistryAccess} for a given caller. There is no need to dispose of the returned access object or * the services retrieved from it. In particular, there is no need to keep a reference to the {@link ServiceRegistryAccess} object after * fetching services from it. * <p> * (Note that this usage pattern is very different from how {@link ServiceRegistryPublisherAccess} instances retrieved from * {@link #createPublisherAccessFor()} must be used.) * * @param caller the caller object * @return the new {@link ServiceRegistryAccess} */ public static ServiceRegistryAccess createAccessFor(Object caller) { if (factory == null) { throw new IllegalStateException( "No default ServiceRegistryAccessFactory yet (possible cause: are you using this from a 'core' bundle?)"); } return factory.createAccessFor(caller); } /** * Creates a {@link ServiceRegistryPublisherAccess} for a given caller, which can be used to publish temporary service instances. The * caller is responsible for calling {@link ServiceRegistryAccess#dispose()} before shutdown, or when the temporary service instances * should be unregistered. * <p> * For convenience, the {@link ServiceRegistryPublisherAccess} also implements the {@link ServiceRegistryAccess} interface. There are no * additional restrictions to services fetched from {@link ServiceRegistryAccess#getService()}. In particular, these instances can still * be used after {@link ServiceRegistryPublisherAccess#dispose()} has been called on the creating instance. * * @param caller the caller object; used to locate undisposed access instances * @return the new {@link ServiceRegistryAccess} */ public static ServiceRegistryPublisherAccess createPublisherAccessFor(Object caller) { if (factory == null) { throw new IllegalStateException( "No default ServiceRegistryAccessFactory yet (possible cause: are you using this from a 'core' bundle?)"); } return factory.createPublisherAccessFor(caller); } public static void setAccessFactory(ServiceRegistryAccessFactory newFactory) { ServiceRegistry.factory = newFactory; } }