Class SystemDescriptor<T>

    • Field Detail

      • baseDescriptor

        private final Descriptor baseDescriptor
      • id

        private final java.lang.Long id
      • reified

        private volatile boolean reified
      • reifying

        private boolean reifying
      • preAnalyzed

        private boolean preAnalyzed
      • closed

        private volatile boolean closed
      • cacheLock

        private final java.lang.Object cacheLock
      • cacheSet

        private boolean cacheSet
      • cachedValue

        private T cachedValue
      • implClass

        private java.lang.Class<?> implClass
      • scopeAnnotation

        private java.lang.annotation.Annotation scopeAnnotation
      • scope

        private java.lang.Class<? extends java.lang.annotation.Annotation> scope
      • contracts

        private java.util.Set<java.lang.reflect.Type> contracts
      • qualifiers

        private java.util.Set<java.lang.annotation.Annotation> qualifiers
      • factoryLocatorId

        private java.lang.Long factoryLocatorId
      • factoryServiceId

        private java.lang.Long factoryServiceId
      • implType

        private java.lang.reflect.Type implType
      • validationServiceCache

        private final java.util.HashMap<ValidationService,​java.lang.Boolean> validationServiceCache
      • singletonGeneration

        private int singletonGeneration
    • Constructor Detail

      • SystemDescriptor

        SystemDescriptor​(Descriptor baseDescriptor,
                         boolean requiresDeepCopy,
                         ServiceLocatorImpl locator,
                         java.lang.Long serviceId)
    • Method Detail

      • getImplementation

        public java.lang.String getImplementation()
        Description copied from interface: Descriptor
        Returns the fully qualified class name of the implementation class. If this is a factory descriptor then this will return the fully qualified name of the class implementing the factory interface.
        Specified by:
        getImplementation in interface Descriptor
        Returns:
        Might return null in some cases, but will usually return the fully qualified class name of the implementation class or of the factory class for this descriptor
      • getAdvertisedContracts

        public java.util.Set<java.lang.String> getAdvertisedContracts()
        Description copied from interface: Descriptor
        Returns the base class name of the contracts that this service describes. If the contract is a paramterized type this will return the raw class. If this service can be looked up by its implementation class then the name of the implementation class must also be found in this list
        Specified by:
        getAdvertisedContracts in interface Descriptor
        Returns:
        Will never return null, but may return an empty set. The returned strings are the fully qualified class names of contracts the predicate describes
      • getScope

        public java.lang.String getScope()
        Description copied from interface: Descriptor
        Returns the fully qualified class name of the scope annotation that should be associated with this descriptor.
        Specified by:
        getScope in interface Descriptor
        Returns:
        If this returns null then this descriptor is assumed to be in the default scope, which is PerLookup
      • getName

        public java.lang.String getName()
        Description copied from interface: Descriptor
        The name of this descriptor. Note that if this returns not null then there must also be the Named qualifier in the set of qualifiers with the same value

        Specified by:
        getName in interface Descriptor
        Returns:
        The name of this descriptor, or null if there is no name associated with this qualifier
      • getQualifiers

        public java.util.Set<java.lang.String> getQualifiers()
        Description copied from interface: Descriptor
        Returns all of the annotation classes that this object should be registered with or looked up by
        Specified by:
        getQualifiers in interface Descriptor
        Returns:
        Never returns null, but may return an empty set. The set of fully qualified class names that are annotations that this object must have
      • getDescriptorType

        public DescriptorType getDescriptorType()
        Description copied from interface: Descriptor
        Returns CLASS if this is a class descriptor and FACTORY if this is a descriptor describing a factory for a type, in which case the implClass should point to the implementation class of the factory
        Specified by:
        getDescriptorType in interface Descriptor
        Returns:
        Either CLASS or PROVIDE_METHOD
      • getDescriptorVisibility

        public DescriptorVisibility getDescriptorVisibility()
        Description copied from interface: Descriptor
        Returns the visibility of this descriptor.

        If the visibility is NORMAL then this descriptor may be seen by all children locators of the locator in which this descriptor is bound

        If the visibility is LOCAL then this descriptor may only be seen by the servcie locator in which it is bound, and in none of the children of that locator

        Specified by:
        getDescriptorVisibility in interface Descriptor
        Returns:
        Either NORMAL or LOCAL
      • getMetadata

        public java.util.Map<java.lang.String,​java.util.List<java.lang.String>> getMetadata()
        Description copied from interface: Descriptor
        Returns all of the metadata associated that this object should be registered with or looked up by
        Specified by:
        getMetadata in interface Descriptor
        Returns:
        Never returns null, but may return an empty set. The set of metadata associated with the object. The values in the returned map will never be null, and will always have at least one member
      • getLoader

        public HK2Loader getLoader()
        Description copied from interface: Descriptor
        This returns the loader that should be used when classloading this descriptor. If this method returns null then the class will be loaded with the classloader of the Injectee if there is one, or with the classloader that loaded HK2 itself; failing that the context class loader on the thread will be tried.
        Specified by:
        getLoader in interface Descriptor
        Returns:
        An HK2Loader that can be used to load this descriptor, or null if the default classloading algorithm should be used
      • getRanking

        public int getRanking()
        Description copied from interface: Descriptor
        Returns the ranking of this descriptor. Rankings with higher value will be considered "better" than rankings of lower value. Descriptors with the same ranking will be returned in the reverse ServiceID order (in other words, the least service ID is considered "better" than any higher service ID).
        Specified by:
        getRanking in interface Descriptor
        Returns:
        the ranking that should be associated with this descriptor
      • isProxiable

        public java.lang.Boolean isProxiable()
        Description copied from interface: Descriptor
        If this returns true then the system will create a proxy for instances of this descriptor. As with all proxies, the proxy created will also implement the ProxyCtl interface

        It is an error for this method to return true if the scope that this descriptor is in is Unproxiable (such as PerLookup).

        Specified by:
        isProxiable in interface Descriptor
        Returns:
        true if this descriptor must be proxied, false if this descriptor must NOT be proxied (even if it is in an Unproxiable scope) and null if this descriptor should take its proxiable status from the scope it is in (i.e., it will only be proxied if the scope is marked Proxiable)
      • isProxyForSameScope

        public java.lang.Boolean isProxyForSameScope()
        Description copied from interface: Descriptor
        This value determines whether or not this service should be proxied when being injected into other services of the same scope. If a scope is proxiable then it will have a default setting for whether or not its services should be proxied when being injected into the same scope. If this method returns null then the default setting for the scope will be used. Otherwise the value returned will determine whether or not this service will be proxied when being injected into a service of the same scope.
        Specified by:
        isProxyForSameScope in interface Descriptor
        Returns:
        null if this descriptor should use the default ProxyForSameScope value for the scope. If it returns true then this service will be proxied even when being injected into the same scope. If it returns false then this service will NOT be proxied when being injected into the same scope (i.e., it cannot be used for lazy initialization of the service when injected into the same scope)
      • getClassAnalysisName

        public java.lang.String getClassAnalysisName()
        Description copied from interface: Descriptor
        Returns the name of the ClassAnalyzer service that should be used to discover the constructors, initialization methods, field and postConstruct and preDestory methods. If null the default implementation will be used. Will be ignored for descriptors that are not automatically analyzed by hk2
        Specified by:
        getClassAnalysisName in interface Descriptor
        Returns:
        the possibly null name of the ClassAnalysis service that should be used to analyze the class represented by this descriptor. If null then the HK2 default analysis will be performed
      • setRanking

        public int setRanking​(int ranking)
        Description copied from interface: Descriptor
        Returns the ranking of this descriptor. Rankings with higher value will be considered "better" than rankings of lower value. Descriptors with the same ranking will be returned in the reverse ServiceID order (in other words, the least service ID is considered "better" than any higher service ID).

        The ranking of a service may change at any time during the life of the descriptor

        Specified by:
        setRanking in interface Descriptor
        Parameters:
        ranking - The new ranking this descriptor should have
        Returns:
        the previous ranking that this descriptor had
      • setRankWithLock

        int setRankWithLock​(int ranking)
      • getServiceId

        public java.lang.Long getServiceId()
        Description copied from interface: Descriptor
        This returns the unique identifier for this descriptor. This field will be ignored upon binding, and will then be assigned by the system. However, this field can be set on search operations, in which case this search will match exactly one Provider in the system.
        Specified by:
        getServiceId in interface Descriptor
        Returns:
        The service id for this object. Note that this field may return null if this is an initial bind, as it is not the responsibility of the binder to set this value. If this returns non-null on a bind operation the return value will be ignored
      • getCache

        public T getCache()
        Description copied from interface: SingleCache
        This can be used for scopes that will only every be created once. The returned value must have been set previously with setCache. If this is called when isCacheSet is false will result in a RuntimeException
        Specified by:
        getCache in interface SingleCache<T>
        Returns:
        A value cached with this ActiveDescriptor
      • isCacheSet

        public boolean isCacheSet()
        Description copied from interface: SingleCache
        Returns true if this cache has been set
        Specified by:
        isCacheSet in interface SingleCache<T>
        Returns:
        true if there is a currently cached value, false otherwise
      • setCache

        public void setCache​(T cacheMe)
        Description copied from interface: SingleCache
        Sets the value into the cache
        Specified by:
        setCache in interface SingleCache<T>
        Parameters:
        cacheMe - A single value that can be cached in this active descriptor
      • releaseCache

        public void releaseCache()
        Description copied from interface: SingleCache
        Removes the cached value and makes it such that this cache has not been set
        Specified by:
        releaseCache in interface SingleCache<T>
      • isReified

        public boolean isReified()
        Description copied from interface: ActiveDescriptor
        This method returns true if this descriptor has been reified (class loaded). If this method returns false then the other methods in this interface will throw an IllegalStateException. Once this method returns true it may be
        Specified by:
        isReified in interface ActiveDescriptor<T>
        Returns:
        true if this descriptor has been reified, false otherwise
      • getImplementationClass

        public java.lang.Class<?> getImplementationClass()
        Description copied from interface: ActiveDescriptor
        The implementation class that should be used to generate new instances of this descriptor.

        If the class returned is a Factory, then the factory is used to create instances. In this case the system will get an instance of the factory and use it to create the instances

        Specified by:
        getImplementationClass in interface ActiveDescriptor<T>
        Returns:
        The class that directly implements the contract types, or the class that is the factory for an object that implements the contract types
      • getContractTypes

        public java.util.Set<java.lang.reflect.Type> getContractTypes()
        Description copied from interface: ActiveDescriptor
        The set of types that this ActiveDescriptor must produce. These types may be Classes or ParameterizedTypes, and may be no other subclass of Type
        Specified by:
        getContractTypes in interface ActiveDescriptor<T>
        Returns:
        the set of types this ActiveDescriptor must implement or extend
      • getScopeAsAnnotation

        public java.lang.annotation.Annotation getScopeAsAnnotation()
        Description copied from interface: ActiveDescriptor
        Returns the scope as an Annotation implementation that this ActiveDescriptor belongs to
        Specified by:
        getScopeAsAnnotation in interface ActiveDescriptor<T>
        Returns:
        The scope of this ActiveDescriptor as an Annotation
      • getScopeAnnotation

        public java.lang.Class<? extends java.lang.annotation.Annotation> getScopeAnnotation()
        Description copied from interface: ActiveDescriptor
        Returns the scope that this ActiveDescriptor belongs to
        Specified by:
        getScopeAnnotation in interface ActiveDescriptor<T>
        Returns:
        The scope of this ActiveDescriptor
      • getQualifierAnnotations

        public java.util.Set<java.lang.annotation.Annotation> getQualifierAnnotations()
        Description copied from interface: ActiveDescriptor
        The full set of qualifiers that this ActiveDescriptor provides
        Specified by:
        getQualifierAnnotations in interface ActiveDescriptor<T>
        Returns:
        The set of annotations that this ActiveDescriptor provides
      • getInjectees

        public java.util.List<Injectee> getInjectees()
        Description copied from interface: ActiveDescriptor
        Returns the full list of Injectees this class has. These references will be resolved prior to the class being constructed, even if these injectees are field or method injectees.

        If this descriptor is describing a factory created type then this list must have zero length

        Specified by:
        getInjectees in interface ActiveDescriptor<T>
        Returns:
        Will not return null, but may return an empty list. The set of Injectees that must be resolved before this ActiveDescriptor can be constructed
      • getFactoryServiceId

        public java.lang.Long getFactoryServiceId()
        Description copied from interface: ActiveDescriptor
        If this ActiveDescriptor has DescriptorType of PROVIDE_METHOD then this field will return the ServiceId of its associated Factory service. Otherwise this method should return null
        Specified by:
        getFactoryServiceId in interface ActiveDescriptor<T>
        Returns:
        The service ID of the associated factory service
      • getFactoryLocatorId

        public java.lang.Long getFactoryLocatorId()
        Description copied from interface: ActiveDescriptor
        If this ActiveDescriptor has DescriptorType of PROVIDE_METHOD then this field will return the ServiceId of its associated Factory service. Otherwise this method should return null
        Specified by:
        getFactoryLocatorId in interface ActiveDescriptor<T>
        Returns:
        The locator ID of the associated factory service
      • setFactoryIds

        void setFactoryIds​(java.lang.Long factoryLocatorId,
                           java.lang.Long factoryServiceId)
      • create

        public T create​(ServiceHandle<?> root)
        Description copied from interface: ActiveDescriptor
        Creates an instance of the ActiveDescriptor. All of the Injectee's must be created prior to instantiation, and associated with the ExtendedProvider so that they can be destroyed properly
        Specified by:
        create in interface ActiveDescriptor<T>
        Parameters:
        root - The root service handle, which can be used to associated all the PerLookup objects with this creation
        Returns:
        An instance of this ActiveDescriptor
      • dispose

        public void dispose​(T instance)
        Description copied from interface: ActiveDescriptor
        Disposes this instance. All the PerLookup objects that were created for this instance will be destroyed after this object has been destroyed
        Specified by:
        dispose in interface ActiveDescriptor<T>
        Parameters:
        instance - The instance to destroy
      • checkState

        private void checkState()
      • reify

        void reify​(java.lang.Class<?> implClass,
                   Collector collector)
      • internalReify

        private void internalReify​(java.lang.Class<?> implClass,
                                   Collector collector)
        The service locator must hold its lock for this cal
        Parameters:
        implClass - The impl class to reify
        collector - An error collector for errors
      • getLocatorId

        public java.lang.Long getLocatorId()
        Description copied from interface: Descriptor
        This returns the id of the ServiceLocator which this descriptor is registered with. Returns null if this descriptor is not yet registered with a ServiceLocator
        Specified by:
        getLocatorId in interface Descriptor
        Returns:
        The id of the ServiceLocator this Descriptor is registered with, or null if this Descriptor is not registered with a ServiceLocator
      • close

        public boolean close()
        Description copied from interface: Closeable
        Idempotent close method. Returns true if the instance had already been closed
        Specified by:
        close in interface Closeable
        Returns:
        true if the object had already been closed, false otherwise
      • isClosed

        public boolean isClosed()
        Description copied from interface: Closeable
        Returns true if the instance has been closed
        Specified by:
        isClosed in interface Closeable
        Returns:
        true if the object is closed
      • isValidating

        boolean isValidating​(ValidationService service)
        Gets the decision of the filter from this service. May use a cache
        Parameters:
        service - The service to get the isValidating decision from
        Returns:
        true if this validation service should validate this descriptor
      • getPreAnalyzedClass

        java.lang.Class<?> getPreAnalyzedClass()
      • getSingletonGeneration

        int getSingletonGeneration()
      • setSingletonGeneration

        void setSingletonGeneration​(int gen)
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class java.lang.Object
      • equals

        public boolean equals​(java.lang.Object o)
        Overrides:
        equals in class java.lang.Object
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object