Class ServiceLocatorImpl

    • Constructor Detail

      • ServiceLocatorImpl

        public ServiceLocatorImpl​(String name,
                                  ServiceLocatorImpl parent)
        Called by the Generator, and hence must be a public method
        Parameters:
        name - The name of this locator
        parent - The parent of this locator (may be null)
    • Method Detail

      • getDescriptors

        public List<ActiveDescriptor<?>> getDescriptors​(Filter filter)
        Description copied from interface: ServiceLocator
        Gets the list of descriptors that match the given filter
        Specified by:
        getDescriptors in interface ServiceLocator
        Parameters:
        filter - A filter to use when determining which services should apply
        Returns:
        A non-null but possibly empty list of descriptors in ranked order that match the given filter
      • getBestDescriptor

        public ActiveDescriptor<?> getBestDescriptor​(Filter filter)
        Description copied from interface: ServiceLocator
        Gets the descriptor that best matches this filter, taking ranking and service id into account
        Specified by:
        getBestDescriptor in interface ServiceLocator
        Parameters:
        filter - The non-null filter to use to retrieve the best descriptor
        Returns:
        The best descriptor matching the filter, or null if there is no descriptor that matches the filter
      • reifyDescriptor

        public ActiveDescriptor<?> reifyDescriptor​(Descriptor descriptor,
                                                   Injectee injectee)
                                            throws MultiException
        Description copied from interface: ServiceLocator
        Converts a descriptor to an ActiveDescriptor. Will use the registered HK2Loaders to perform this action. If no HK2Loader is available for the descriptor, will use the injectee to discover a classloader
        Specified by:
        reifyDescriptor in interface ServiceLocator
        Parameters:
        descriptor - The descriptor to convert, may not be null
        injectee - The injectee on behalf of whom this descriptor is being injected. May be null if the injectee is unknown
        Returns:
        The active descriptor as loaded with the first valid HK2Loader
        Throws:
        MultiException - if there were errors when loading or analyzing the class
      • reifyDescriptor

        public ActiveDescriptor<?> reifyDescriptor​(Descriptor descriptor)
                                            throws MultiException
        Description copied from interface: ServiceLocator
        Converts a descriptor to an ActiveDescriptor. Will use the registered HK2Loaders to perform this action
        Specified by:
        reifyDescriptor in interface ServiceLocator
        Parameters:
        descriptor - The descriptor to convert, may not be null
        Returns:
        The active descriptor as loaded with the first valid HK2Loader
        Throws:
        MultiException - if there were errors when loading or analyzing the class
      • getInjecteeDescriptor

        public ActiveDescriptor<?> getInjecteeDescriptor​(Injectee injectee)
                                                  throws MultiException
        Description copied from interface: ServiceLocator
        This method will first find a descriptor for this injectee, and then reify that descriptor. If multiple descriptors are found, they will be reified in ranking order until an ActiveDescriptor matching the Injectee is found.

        This method is responsible for using the available JustInTimeInjectionResolver to add in new descriptors should the descriptor for the given injectee not be found initially

        Specified by:
        getInjecteeDescriptor in interface ServiceLocator
        Parameters:
        injectee - the injection point for whom to find the ActiveDescriptor
        Returns:
        The active descriptor for this injection point
        Throws:
        MultiException - if there were errors when loading or analyzing the class
      • getService

        public <T> T getService​(Class<T> contractOrImpl,
                                Annotation... qualifiers)
                         throws MultiException
        Description copied from interface: ServiceLocator
        Gets the best service from this locator that implements this contract or has this implementation

        Use this method only if destroying the service is not important, otherwise use ServiceLocator.getServiceHandle(Class, Annotation...)

        Specified by:
        getService in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        An instance of the contract or impl. May return null if there is no provider that provides the given implementation or contract
        Throws:
        MultiException - if there was an error during service creation
      • getService

        public <T> T getService​(Type contractOrImpl,
                                Annotation... qualifiers)
                         throws MultiException
        Description copied from interface: ServiceLocator
        Gets the best service from this locator that implements this contract or has this implementation

        Use this method only if destroying the service is not important, otherwise use ServiceLocator.getServiceHandle(Type, Annotation...)

        Specified by:
        getService in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        An instance of the contract or impl. May return null if there is no provider that provides the given implementation or contract
        Throws:
        MultiException - if there was an error during service creation
      • getService

        public <T> T getService​(Class<T> contractOrImpl,
                                String name,
                                Annotation... qualifiers)
                         throws MultiException
        Description copied from interface: ServiceLocator
        Gets the best service from this locator that implements this contract or has this implementation and has the given name

        Use this method only if destroying the service is not important, otherwise use ServiceLocator.getServiceHandle(Class, String, Annotation...)

        Specified by:
        getService in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        name - May be null (to indicate any name is ok), and is the name of the implementation to be returned
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        An instance of the contract or impl. May return null if there is no provider that provides the given implementation or contract
        Throws:
        MultiException - if there was an error during service creation
      • getService

        public <T> T getService​(Type contractOrImpl,
                                String name,
                                Annotation... qualifiers)
                         throws MultiException
        Description copied from interface: ServiceLocator
        Gets the best service from this locator that implements this contract or has this implementation and has the given name

        Use this method only if destroying the service is not important, otherwise use ServiceLocator.getServiceHandle(Type, String, Annotation...)

        Specified by:
        getService in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        name - May be null (to indicate any name is ok), and is the name of the implementation to be returned
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        An instance of the contract or impl. May return null if there is no provider that provides the given implementation or contract
        Throws:
        MultiException - if there was an error during service creation
      • getAllServices

        public <T> List<T> getAllServices​(Class<T> contractOrImpl,
                                          Annotation... qualifiers)
                                   throws MultiException
        Description copied from interface: ServiceLocator
        Gets all services from this locator that implement this contract or have this implementation and have the provided qualifiers

        Use this method only if destroying the service is not important, otherwise use ServiceLocator.getAllServiceHandles(Class, Annotation...)

        Specified by:
        getAllServices in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        A list of services implementing this contract or concrete implementation. May not return null, but may return an empty list
        Throws:
        MultiException - if there was an error during service creation
      • getAllServices

        public <T> List<T> getAllServices​(Type contractOrImpl,
                                          Annotation... qualifiers)
                                   throws MultiException
        Description copied from interface: ServiceLocator
        Gets all services from this locator that implement this contract or have this implementation and have the provided qualifiers

        Use this method only if destroying the service is not important, otherwise use ServiceLocator.getAllServiceHandles(Type, Annotation...)

        Specified by:
        getAllServices in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        A list of services implementing this contract or concrete implementation. May not return null, but may return an empty list
        Throws:
        MultiException - if there was an error during service creation
      • getAllServices

        public <T> List<T> getAllServices​(Annotation qualifier,
                                          Annotation... qualifiers)
                                   throws MultiException
        Description copied from interface: ServiceLocator
        Gets all services from this locator that have the provided qualifiers

        Use this method only if destroying the services is not important, otherwise use ServiceLocator.getAllServiceHandles(Annotation, Annotation...)

        Specified by:
        getAllServices in interface ServiceLocator
        Parameters:
        qualifier - May not be null, and is a qualifier that must match the service definition
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        A list of services implementing this contract or concrete implementation. May not return null, but may return an empty list
        Throws:
        MultiException - if there was an error during service creation
      • getAllServices

        public List<?> getAllServices​(Filter searchCriteria)
                               throws MultiException
        Description copied from interface: ServiceLocator
        Gets all services from this locator that match the provided Filter

        Use this method only if destroying the service is not important, otherwise use ServiceLocator.getAllServiceHandles(Filter)

        This method should also be used with care to avoid classloading a large number of services

        Specified by:
        getAllServices in interface ServiceLocator
        Parameters:
        searchCriteria - The returned service will match the Filter (in other words, searchCriteria.matches returns true). May not be null
        Returns:
        A list of services matching this filter. May not return null, but may return an empty list
        Throws:
        MultiException - if there was an error during service creation
      • getName

        public String getName()
        Description copied from interface: ServiceLocator
        Returns the name of this ServiceLocator
        Specified by:
        getName in interface ServiceLocator
        Returns:
        The name of this ServiceLocator, will not return null
      • getState

        public ServiceLocatorState getState()
        Description copied from interface: ServiceLocator
        Returns the current state of this service locator. This method will work in all service locator states
        Specified by:
        getState in interface ServiceLocator
        Returns:
        The current state of the service locator
      • shutdown

        public void shutdown()
        Description copied from interface: ServiceLocator
        This method will shutdown every service associated with this ServiceLocator. Those services that have a preDestroy shall have their preDestroy called
        Specified by:
        shutdown in interface ServiceLocator
      • create

        public <T> T create​(Class<T> createMe)
        Description copied from interface: ServiceLocator
        This method will analyze the given class, and create it if can. The object created in this way will not be managed by HK2. It is the responsibility of the caller to ensure that any lifecycle this object has is honored
        Specified by:
        create in interface ServiceLocator
        Parameters:
        createMe - The class to create, may not be null
        Returns:
        An instance of the object
      • create

        public <T> T create​(Class<T> createMe,
                            String strategy)
        Description copied from interface: ServiceLocator
        This method will analyze the given class, and create it if can. The object created in this way will not be managed by HK2. It is the responsibility of the caller to ensure that any lifecycle this object has is honored
        Specified by:
        create in interface ServiceLocator
        Parameters:
        createMe - The class to create, may not be null
        strategy - The name of the ClassAnalyzer that should be used. If null the default analyzer will be used
        Returns:
        An instance of the object
      • inject

        public void inject​(Object injectMe)
        Description copied from interface: ServiceLocator
        This will analyze the given object and inject into its fields and methods. The object injected in this way will not be managed by HK2
        Specified by:
        inject in interface ServiceLocator
        Parameters:
        injectMe - The object to be analyzed and injected into
      • assistedInject

        public Object assistedInject​(Object injectMe,
                                     Method method,
                                     MethodParameter... params)
        Description copied from interface: ServiceLocator
        This will invoke the given method on the given object. The values for the method will either be taken from the params list or will be gotten from this ServiceLocator taking into account all injection resolvers
        Specified by:
        assistedInject in interface ServiceLocator
        Parameters:
        injectMe - The non-null object to inject into
        method - The non-null method to inject into
        params - A list of parameter values known by the caller. The indexes in params may not repeat and must be in the valid range of parameters for the passed in method
        Returns:
        The return value of the method (null if the method is void type)
      • assistedInject

        public Object assistedInject​(Object injectMe,
                                     Method method,
                                     ServiceHandle<?> root,
                                     MethodParameter... params)
        Description copied from interface: ServiceLocator
        This will invoke the given method on the given object. The values for the method will either be taken from the params list or will be gotten from this ServiceLocator taking into account all injection resolvers
        Specified by:
        assistedInject in interface ServiceLocator
        Parameters:
        injectMe - The non-null object to inject into
        method - The non-null method to inject into
        root - A possibly null ServiceHandle that can be used after this call to destroy any hanging PerLookup instances created
        params - A list of parameter values known by the caller. The indexes in params may not repeat and must be in the valid range of parameters for the passed in method
        Returns:
        The return value of the method (null if the method is void type)
      • inject

        public void inject​(Object injectMe,
                           String strategy)
        Description copied from interface: ServiceLocator
        This will analyze the given object and inject into its fields and methods. The object injected in this way will not be managed by HK2
        Specified by:
        inject in interface ServiceLocator
        Parameters:
        injectMe - The object to be analyzed and injected into
        strategy - The name of the ClassAnalyzer that should be used. If null the default analyzer will be used
      • postConstruct

        public void postConstruct​(Object postConstructMe)
        Description copied from interface: ServiceLocator
        This will analyze the given object and call the postConstruct method. The object given will not be managed by HK2
        Specified by:
        postConstruct in interface ServiceLocator
        Parameters:
        postConstructMe - The object to postConstruct
      • postConstruct

        public void postConstruct​(Object postConstructMe,
                                  String strategy)
        Description copied from interface: ServiceLocator
        This will analyze the given object and call the postConstruct method. The object given will not be managed by HK2
        Specified by:
        postConstruct in interface ServiceLocator
        Parameters:
        postConstructMe - The object to postConstruct
        strategy - The name of the ClassAnalyzer that should be used. If null the default analyzer will be used
      • preDestroy

        public void preDestroy​(Object preDestroyMe)
        Description copied from interface: ServiceLocator
        This will analyze the given object and call the preDestroy method. The object given will not be managed by HK2
        Specified by:
        preDestroy in interface ServiceLocator
        Parameters:
        preDestroyMe - The object to preDestroy
      • preDestroy

        public void preDestroy​(Object preDestroyMe,
                               String strategy)
        Description copied from interface: ServiceLocator
        This will analyze the given object and call the preDestroy method. The object given will not be managed by HK2
        Specified by:
        preDestroy in interface ServiceLocator
        Parameters:
        preDestroyMe - The object to preDestroy
        strategy - The name of the ClassAnalyzer that should be used. If null the default analyzer will be used
      • createAndInitialize

        public <U> U createAndInitialize​(Class<U> createMe)
        Creates, injects and postConstructs, all in one
        Specified by:
        createAndInitialize in interface ServiceLocator
        Parameters:
        createMe - The non-null class to create this object from
        Returns:
        An instance of the object that has been created, injected and post constructed
      • createAndInitialize

        public <U> U createAndInitialize​(Class<U> createMe,
                                         String strategy)
        Creates, injects and postConstructs, all in one
        Specified by:
        createAndInitialize in interface ServiceLocator
        Parameters:
        createMe - The non-null class to create this object from
        strategy - The name of the ClassAnalyzer that should be used. If null the default analyzer will be used
        Returns:
        An instance of the object that has been created, injected and post constructed
      • getServiceHandle

        public <T> ServiceHandle<T> getServiceHandle​(Class<T> contractOrImpl,
                                                     Annotation... qualifiers)
                                              throws MultiException
        Description copied from interface: ServiceLocator
        Gets a ServiceHandle that can be used to get and destroy the service that best matches the given criteria
        Specified by:
        getServiceHandle in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        Will return the service handle corresponding to the service or null if none were found
        Throws:
        MultiException - if there was an issue during lookup
      • getServiceHandle

        public <T> ServiceHandle<T> getServiceHandle​(Type contractOrImpl,
                                                     Annotation... qualifiers)
                                              throws MultiException
        Description copied from interface: ServiceLocator
        Gets a ServiceHandle that can be used to get and destroy the service that best matches the given criteria
        Specified by:
        getServiceHandle in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        Will return the service handle corresponding to the service or null if none were found
        Throws:
        MultiException - if there was an issue during lookup
      • getAllServiceHandles

        public <T> List<ServiceHandle<T>> getAllServiceHandles​(Class<T> contractOrImpl,
                                                               Annotation... qualifiers)
                                                        throws MultiException
        Description copied from interface: ServiceLocator
        Gets a list of ServiceHandle that can be used to get and destroy services associated with descriptors that match the provided criteria
        Specified by:
        getAllServiceHandles in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        A non-null but possibly empty list of service handles matching the given criteria
        Throws:
        MultiException - if there was an error during service lookup
      • getAllServiceHandles

        public List<ServiceHandle<?>> getAllServiceHandles​(Type contractOrImpl,
                                                           Annotation... qualifiers)
                                                    throws MultiException
        Description copied from interface: ServiceLocator
        Gets a list of ServiceHandle that can be used to get and destroy services associated with descriptors that match the provided criteria
        Specified by:
        getAllServiceHandles in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        A non-null but possibly empty list of service handles matching the given criteria
        Throws:
        MultiException - if there was an error during service lookup
      • getServiceHandle

        public <T> ServiceHandle<T> getServiceHandle​(Class<T> contractOrImpl,
                                                     String name,
                                                     Annotation... qualifiers)
                                              throws MultiException
        Description copied from interface: ServiceLocator
        Gets a ServiceHandle that can be used to get and destroy the service that best matches the given criteria
        Specified by:
        getServiceHandle in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        name - The name to use to further qualify the search (may be null, indicating that any name will match)
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        Will the service handle for the best service matching the given criteria, or null if no matching service could be found
        Throws:
        MultiException - if there was an error during lookup
      • getServiceHandle

        public <T> ServiceHandle<T> getServiceHandle​(Type contractOrImpl,
                                                     String name,
                                                     Annotation... qualifiers)
                                              throws MultiException
        Description copied from interface: ServiceLocator
        Gets a ServiceHandle that can be used to get and destroy the service that best matches the given criteria
        Specified by:
        getServiceHandle in interface ServiceLocator
        Parameters:
        contractOrImpl - May not be null, and is the contract or concrete implementation to get the best instance of
        name - The name to use to further qualify the search (may be null, indicating that any name will match)
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        Will the service handle for the best service matching the given criteria, or null if no matching service could be found
        Throws:
        MultiException - if there was an error during service lookup
      • getAllServiceHandles

        public List<ServiceHandle<?>> getAllServiceHandles​(Annotation qualifier,
                                                           Annotation... qualifiers)
                                                    throws MultiException
        Description copied from interface: ServiceLocator
        Gets a list of ServiceHandle that can be used to get and destroy services associated with descriptors that match the provided criteria
        Specified by:
        getAllServiceHandles in interface ServiceLocator
        Parameters:
        qualifier - May not be null, and is a qualifier that must match the service definition
        qualifiers - The set of qualifiers that must match this service definition
        Returns:
        A non-null but possibly empty list of service handles matching the given criteria
        Throws:
        MultiException - if there was an error during service lookup
      • getLocatorId

        public long getLocatorId()
        Description copied from interface: ServiceLocator
        This returns the unique locator ID for this locator. The locator ID will be assigned at the time of creation and must be a monotonacally increasing number (starting at zero)
        Specified by:
        getLocatorId in interface ServiceLocator
        Returns:
        The identifier for this service locator
      • getDefaultClassAnalyzerName

        public String getDefaultClassAnalyzerName()
        Description copied from interface: ServiceLocator
        Gets the name of the default class analyzer service
        Specified by:
        getDefaultClassAnalyzerName in interface ServiceLocator
        Returns:
        The name of the default class analyzer. Will not return null
      • setDefaultClassAnalyzerName

        public void setDefaultClassAnalyzerName​(String defaultClassAnalyzer)
        Description copied from interface: ServiceLocator
        Sets the name of the default class analyzer that should be used for all Descriptors that return null as their class analyzer. If null is given then the default class analyzer name of ClassAnalyzer.DEFAULT_IMPLEMENTATION_NAME will be used
        Specified by:
        setDefaultClassAnalyzerName in interface ServiceLocator
        Parameters:
        defaultClassAnalyzer - The possibly null name of the default class analyzer (the class analyzer that will be used if a descriptor has not explicitly set the name of its class analyzer)
      • setDefaultUnqualified

        public void setDefaultUnqualified​(Unqualified unqualified)
        Description copied from interface: ServiceLocator
        This sets the default Unqualified annotation that will be put on all injection points that do not have any qualifiers. This Unqualified will not be returned by the Injectee.getUnqualified() method as it is considered to be the systems default Unqualified annotation. If an injection point has its own Unqualified annotation returned from Injectee.getUnqualified() then that one takes precedence over this one. Further any injection point that is a IterableProvider will not have the default unqualified applied to it

        This method may be called at any time, but will only affect lookups and injections that have not yet occurred

        Specified by:
        setDefaultUnqualified in interface ServiceLocator
        Parameters:
        unqualified - The Unqualified annotation that will be (virtually) put on injection points that have no qualifiers and no other Unqualified annotation. If null then this ServiceLocator has no default Unqualified annotation to be applied
        See Also:
        UnqualifiedImpl
      • getParent

        public ServiceLocator getParent()
        Description copied from interface: ServiceLocator
        Gets the parent service locator for this locator
        Specified by:
        getParent in interface ServiceLocator
        Returns:
        The parent service locator for this locator, or null if this service locator does not have a parent
      • getNeutralContextClassLoader

        public boolean getNeutralContextClassLoader()
        Description copied from interface: ServiceLocator
        This returns the value of neutralContextClassLoader. If this value is true then HK2 will ensure that the context class loader on the thread is maintained whenever hk2 calls into user code. If this value is false then the value of the context class loader on the thread may be changed by the code hk2 is calling.

        When set to false this value is used to increase performance since getting and setting the context class loader can be expensive. However, if the user code being called by hk2 may change the context class loader of the thread, this value should be true to ensure that tricky and hard to find bugs don't arise when this thread is used for other purposes later on

        All new ServiceLocator implementation have this value initially set to true

        Specified by:
        getNeutralContextClassLoader in interface ServiceLocator
        Returns:
        If true hk2 will ensure that the context class loader cannot be changed by user code. If false hk2 will not modify the context class loader of the thread when user code has finished
      • setNeutralContextClassLoader

        public void setNeutralContextClassLoader​(boolean neutralContextClassLoader)
        Description copied from interface: ServiceLocator
        This sets the value of neutralContextClassLoader. If this value is true then HK2 will ensure that the context class loader on the thread is maintained whenever hk2 calls into user code. If this value is false then the value of the context class loader on the thread may be changed by the code hk2 is calling.

        When set to false this value is used to increase performance since getting and setting the context class loader can be expensive. However, if the user code being called by hk2 may change the context class loader of the thread, this value should be true to ensure that tricky and hard to find bugs don't arise when this thread is used for other purposes later on

        All new ServiceLocator implementation have this value initially set to true

        Specified by:
        setNeutralContextClassLoader in interface ServiceLocator
        Parameters:
        neutralContextClassLoader - true if hk2 should ensure context class loader neutrality, false if hk2 should not change the context class loader on the thread around user code calls