Class ServiceLocatorImpl

java.lang.Object
org.jvnet.hk2.internal.ServiceLocatorImpl
All Implemented Interfaces:
ServiceLocator

public class ServiceLocatorImpl extends Object implements ServiceLocator
  • Field Details

  • Constructor Details

    • 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 Details

    • getAndIncrementLocatorId

      private static long getAndIncrementLocatorId()
    • callValidate

      private boolean callValidate(ValidationService vs, ValidationInformation vi)
      Must have read lock held
      Parameters:
      vi - The non-null validation
      Returns:
    • validate

      private boolean validate(SystemDescriptor<?> descriptor, Injectee onBehalfOf, Filter filter)
      Must be called under lock
      Parameters:
      descriptor - The descriptor to validate
      onBehalfOf - The fella who is being validated (or null)
      Returns:
      true if every validator returned true
    • getDescriptors

      private List<SystemDescriptor<?>> getDescriptors(Filter filter, Injectee onBehalfOf, boolean getParents, boolean doValidation, boolean getLocals)
    • protectedGetDescriptors

      private List<ActiveDescriptor<?>> protectedGetDescriptors(Filter filter)
    • 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
    • secondChanceResolve

      private ActiveDescriptor<?> secondChanceResolve(Injectee injectee)
    • internalGetInjecteeDescriptor

      private ActiveDescriptor<?> internalGetInjecteeDescriptor(Injectee injectee, boolean calledFromSecondChanceResolveMethod)
    • 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
    • getServiceHandle

      public <T> ServiceHandle<T> getServiceHandle(ActiveDescriptor<T> activeDescriptor, Injectee injectee) throws MultiException
      Description copied from interface: ServiceLocator
      Gets a ServiceHandle that can be used to get and destroy the service described by the ActiveDescriptor. The injectee may be used to discover the proper classloader to use when attempting to reify the ActiveDescriptor
      Specified by:
      getServiceHandle in interface ServiceLocator
      Parameters:
      activeDescriptor - The descriptor for which to create a ServiceHandle. May not be null
      injectee - The injectee on behalf of whom this service is being injected. May be null if the injectee is unknown
      Returns:
      A ServiceHandle that may be used to create or destroy the service associated with this ActiveDescriptor
      Throws:
      MultiException - if there was an error during service handle creation
    • getServiceHandleImpl

      private <T> ServiceHandleImpl<T> getServiceHandleImpl(ActiveDescriptor<T> activeDescriptor, Injectee injectee) throws MultiException
      Throws:
      MultiException
    • getServiceHandle

      public <T> ServiceHandle<T> getServiceHandle(ActiveDescriptor<T> activeDescriptor) throws MultiException
      Description copied from interface: ServiceLocator
      Gets a ServiceHandle that can be used to get and destroy the service described by the ActiveDescriptor.
      Specified by:
      getServiceHandle in interface ServiceLocator
      Parameters:
      activeDescriptor - The descriptor for which to create a ServiceHandle. May not be null
      Returns:
      A ServiceHandle that may be used to create or destroy the service associated with this ActiveDescriptor
      Throws:
      MultiException - if there was an error during service handle creation
    • internalGetServiceHandle

      private <T> ServiceHandleImpl<T> internalGetServiceHandle(ActiveDescriptor<T> activeDescriptor, Type requestedType, Injectee originalRequest)
    • getService

      @Deprecated public <T> T getService(ActiveDescriptor<T> activeDescriptor, ServiceHandle<?> root) throws MultiException
      Deprecated.
      Description copied from interface: ServiceLocator
      This method should be called by code resolving injectee's on behalf of some root service, usually by an implementation of InjectionResolver.resolve(Injectee, ServiceHandle). In this way the objects associated with the root object can be destroyed in the proper sequence
      Specified by:
      getService in interface ServiceLocator
      Parameters:
      activeDescriptor - The descriptor whose service to create
      root - The ultimate parent of this service creation. May be null
      Returns:
      The service matching this descriptor
      Throws:
      MultiException - if there was an error during service creation
    • getService

      public <T> T getService(ActiveDescriptor<T> activeDescriptor, ServiceHandle<?> root, Injectee originalRequest) throws MultiException
      Description copied from interface: ServiceLocator
      This method should be called by code resolving injectee's on behalf of some root service, usually by an implementation of InjectionResolver.resolve(Injectee, ServiceHandle). In this way the objects associated with the root object can be destroyed in the proper sequence
      Specified by:
      getService in interface ServiceLocator
      Parameters:
      activeDescriptor - The descriptor whose service to create
      root - The ultimate parent of this service creation. May be null
      originalRequest - The injectee passed into the InjectionResolver.resolve(Injectee, ServiceHandle) if known, null otherwise
      Returns:
      The service matching this descriptor
      Throws:
      MultiException - if there was an error during service creation
    • 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
    • internalGetService

      private <T> T internalGetService(Type contractOrImpl, String name, Unqualified unqualified, Annotation... qualifiers)
    • internalGetService

      private <T> T internalGetService(Type contractOrImpl, String name, Unqualified unqualified, boolean calledFromSecondChanceResolveMethod, Annotation... qualifiers)
    • getUnqualifiedService

      <T> T getUnqualifiedService(Type contractOrImpl, Unqualified unqualified, boolean isIterable, Annotation... qualifiers) throws MultiException
      This method is only called from the get of IterableProvider. IterableProvider has already called the JIT resolvers and so should not do so again, since it is too much work and doesn't have the information about the original injectee
      Throws:
      MultiException
    • protectedGetAllServices

      private <T> List<T> protectedGetAllServices(Type contractOrImpl, Annotation... qualifiers)
    • 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
    • getName

      private static String getName(String name, Annotation... qualifiers)
    • igdCacheCompute

    • getEffectiveUnqualified

      private Unqualified getEffectiveUnqualified(Unqualified givenUnqualified, boolean isIterable, Annotation[] qualifiers)
    • internalGetDescriptor

      private <T> ActiveDescriptor<T> internalGetDescriptor(Injectee onBehalfOf, Type contractOrImpl, String name, Unqualified unqualified, boolean isIterable, Annotation... qualifiers) throws MultiException
      Throws:
      MultiException
    • internalGetDescriptor

      private <T> ActiveDescriptor<T> internalGetDescriptor(Injectee onBehalfOf, Type contractOrImpl, String name, Unqualified unqualified, boolean isIterable, boolean calledFromSecondChanceResolveMethod, Annotation... qualifiers) throws MultiException
      Throws:
      MultiException
    • 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
    • getUnqualifiedServiceHandle

      <T> ServiceHandle<T> getUnqualifiedServiceHandle(Type contractOrImpl, Unqualified unqualified, boolean isIterable, Annotation... qualifiers) throws MultiException
      Throws:
      MultiException
    • protectedGetAllServiceHandles

      private List<ServiceHandle<?>> protectedGetAllServiceHandles(Type contractOrImpl, Annotation... qualifiers)
    • 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
    • getAllUnqualifiedServiceHandles

      List<ServiceHandle<?>> getAllUnqualifiedServiceHandles(Type contractOrImpl, Unqualified unqualified, boolean isIterable, Annotation... qualifiers) throws MultiException
      Throws:
      MultiException
    • internalGetAllServiceHandles

      private List<?> internalGetAllServiceHandles(Type contractOrImpl, Unqualified unqualified, boolean getHandles, boolean isIterable, Annotation... qualifiers) throws MultiException
      Throws:
      MultiException
    • 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(Filter searchCriteria) throws MultiException
      Description copied from interface: ServiceLocator
      Gets a list of ServiceHandle whose ActiveDescriptors match the supplied filter. The returned ServiceHandles may be used to get or destroy the services associated with the matching descriptors
      Specified by:
      getAllServiceHandles in interface ServiceLocator
      Parameters:
      searchCriteria - A filter to use when determining which descriptors should apply
      Returns:
      A non-null but possibly empty list of service handles that match the given filter
      Throws:
      MultiException - if there was an error during service handle creation
    • 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
    • getInterceptionServices

      List<InterceptionService> getInterceptionServices()
    • checkConfiguration

      Checks the configuration operation before anything happens to the internal data structures.
      Parameters:
      dci - The configuration that contains the proposed modifications
      Returns:
      A set of descriptors that is being removed fromthe configuration
    • getAllContracts

      private static List<String> getAllContracts(ActiveDescriptor<?> desc)
    • removeConfigurationInternal

      private void removeConfigurationInternal(List<SystemDescriptor<?>> unbinds)
    • doTrace

      private static boolean doTrace(ActiveDescriptor<?> desc)
    • addConfigurationInternal

      private List<SystemDescriptor<?>> addConfigurationInternal(DynamicConfigurationImpl dci)
    • reupInjectionResolvers

      private void reupInjectionResolvers()
    • reupInterceptionServices

      private void reupInterceptionServices()
    • reupErrorHandlers

      private void reupErrorHandlers()
    • reupConfigListeners

      private void reupConfigListeners()
    • reupInstanceListenersHandlers

      private void reupInstanceListenersHandlers(Collection<SystemDescriptor<?>> checkList)
    • reupClassAnalyzers

      private void reupClassAnalyzers()
    • reupCache

      private void reupCache(HashSet<String> affectedContracts)
    • reup

      private void reup(List<SystemDescriptor<?>> thingsAdded, boolean instanceListenersModified, boolean injectionResolversModified, boolean errorHandlersModified, boolean classAnalyzersModified, boolean dynamicConfigurationListenersModified, HashSet<String> affectedContracts, boolean interceptionServicesModified)
    • getAllChildren

      private void getAllChildren(LinkedList<ServiceLocatorImpl> allMyChildren)
    • callAllConfigurationListeners

      private void callAllConfigurationListeners(List<ServiceHandle<?>> allListeners)
    • addConfiguration

      void addConfiguration(DynamicConfigurationImpl dci)
    • isInjectAnnotation

      boolean isInjectAnnotation(Annotation annotation)
    • isInjectAnnotation

      boolean isInjectAnnotation(Annotation annotation, boolean isConstructor)
    • getInjectionResolver

      InjectionResolver<?> getInjectionResolver(Class<? extends Annotation> annoType)
    • _resolveContext

      private Context<?> _resolveContext(Class<? extends Annotation> scope) throws IllegalStateException
      Throws:
      IllegalStateException
    • resolveContext

      Context<?> resolveContext(Class<? extends Annotation> scope) throws IllegalStateException
      Throws:
      IllegalStateException
    • loadClass

      private Class<?> loadClass(Descriptor descriptor, Injectee injectee)
    • narrow

      private ImmediateResults narrow(ServiceLocator locator, List<SystemDescriptor<?>> candidates, Type requiredType, String name, Injectee injectee, boolean onlyOne, boolean doValidation, NarrowResults cachedResults, Filter filter, Annotation... qualifiers)
    • 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
    • getNextServiceId

      long getNextServiceId()
    • addChild

      private void addChild(ServiceLocatorImpl child)
    • removeChild

      private void removeChild(ServiceLocatorImpl child)
    • checkState

      private void checkState()
    • getAllValidators

      private LinkedHashSet<ValidationService> getAllValidators()
    • 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)
    • getDefaultUnqualified

      public Unqualified getDefaultUnqualified()
      Description copied from interface: ServiceLocator
      This returns 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
      Specified by:
      getDefaultUnqualified in interface ServiceLocator
      Returns:
      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
    • 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:
    • getAnalyzer

      ClassAnalyzer getAnalyzer(String name, Collector collector)
    • 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
    • getMe

      private ServiceLocatorImpl getMe()
      Used to get the ServiceLocatorImpl in inner classes
      Returns:
      This current object
    • hasInjectAnnotation

      boolean hasInjectAnnotation(AnnotatedElement annotated)
    • getInjectionResolverForInjectee

      InjectionResolver<?> getInjectionResolverForInjectee(SystemInjecteeImpl injectee)
    • getClassReflectionHelper

      ClassReflectionHelper getClassReflectionHelper()
    • getErrorHandlers

      LinkedList<ErrorService> getErrorHandlers()
    • getPerLocatorUtilities

      PerLocatorUtilities getPerLocatorUtilities()
    • getNumberOfDescriptors

      int getNumberOfDescriptors()
    • getNumberOfChildren

      int getNumberOfChildren()
    • getServiceCacheSize

      int getServiceCacheSize()
    • getServiceCacheMaximumSize

      int getServiceCacheMaximumSize()
    • clearServiceCache

      void clearServiceCache()
    • getReflectionCacheSize

      int getReflectionCacheSize()
    • clearReflectionCache

      void clearReflectionCache()
    • unsortIndexes

      int unsortIndexes(int newRank, SystemDescriptor<?> desc, Set<IndexedListData> myLists)
    • toString

      public String toString()
      Overrides:
      toString in class Object