/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.toolkit.core.spi.module;
import de.rcenvironment.toolkit.core.api.ImmutableServiceRegistry;
import de.rcenvironment.toolkit.core.api.Toolkit;
import de.rcenvironment.toolkit.core.api.ToolkitException;
/**
* An abstraction of dependency injection libraries/frameworks. Service implementations are added declaratively, and the actual
* instantiation and dependency injection is performed after all contributors (in this case, modules) have added their parts.
*
* The currently supported DI mode (using the PicoContainer library) is constructor injection without requiring any annotations in the
* service implementations; in the future, adding annotations like javax.inject.Inject may become necessary.
*
* @author Robert Mischke
*
*/
public interface ObjectGraph {
/**
* Sets a {@link ClassFilter} to determine which of a service implementation's interfaces should be considered a "public" interface, ie
* exported. Interfaces not matched by this filter can be used for dependency injection within the scope of the {@link Toolkit}, but are
* not accessible from the outside.
*
* Note that this filter is typically reset before an {@link ObjectGraph} is passed to a new module.
*
* @param filter the filter to set
*/
void setPublicInterfaceFilter(ClassFilter filter);
/**
* @param object an object to register as-is within the object graph; it can be used for dependency injection in service implementations
*/
void registerObject(Object object);
/**
* @param implementationClass a class implementing one or more service interfaces; these are automatically detected, and will be
* exported/published if they match the most recently set {@link ClassFilter}. It is valid to register internal services, ie one
* not providing any exportable/public interfaces.
*/
void registerServiceClass(Class<?> implementationClass);
/**
* Attempts to construct the actual object graph from all previous registrations.
*
* @return the registry of published/exported services
* @throws ToolkitException on instantiation failure, for example if a service implementation is missing a required dependency
*/
ImmutableServiceRegistry instantiate() throws ToolkitException;
/**
* @param serviceInterface the service interface to check
* @return true if no service implementation is providing this interface yet; intended for dependency probing
*/
boolean isMissingService(Class<?> serviceInterface);
}