/*
* Copyright (C) 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.errai.ioc.rebind.ioc.graph.api;
import java.lang.annotation.Annotation;
import java.util.Collection;
import java.util.Optional;
import javax.enterprise.context.Dependent;
import javax.inject.Named;
import org.jboss.errai.codegen.meta.HasAnnotations;
import org.jboss.errai.codegen.meta.MetaClass;
import org.jboss.errai.ioc.client.api.ContextualTypeProvider;
import org.jboss.errai.ioc.client.api.LoadAsync;
import org.jboss.errai.ioc.rebind.ioc.graph.api.DependencyGraphBuilder.Dependency;
import org.jboss.errai.ioc.rebind.ioc.graph.api.DependencyGraphBuilder.InjectableType;
import org.jboss.errai.ioc.rebind.ioc.injector.api.WiringElementType;
/**
* Represents a class, producer member, or provider that can supply a bean for
* satisfying dependencies.
*
* @see DependencyGraphBuilder
* @author Max Barkley <mbarkley@redhat.com>
*/
public interface Injectable extends HasInjectableHandle {
/**
* @return The scope of the injectable. For pseudo-dependent injectables, this
* should return {@link Dependent}.
*/
Class<? extends Annotation> getScope();
/**
* @return If available, the annotated object that is the source of this injectable.
*/
Optional<HasAnnotations> getAnnotatedObject();
/**
* @return The name of this injectable if {@link Named} annotation was
* present.
*/
String getBeanName();
/**
* @return The unique name of the factory that will produce this injectable at
* runtime.
*/
String getFactoryName();
/**
* @return The dependencies of this injectable. These depencies will not be
* resolved until after
* {@link DependencyGraphBuilder#createGraph()} is called.
*/
Collection<Dependency> getDependencies();
/**
* @return The kind of this injectable.
*/
InjectableType getInjectableType();
/**
* @return The wiring element types of this injectable.
*/
Collection<WiringElementType> getWiringElementTypes();
/**
* @return True iff this injectable should be loaded asynchronously (via code splitting).
* @see LoadAsync
*/
boolean loadAsync();
/**
* @return True if this injectable requires a proxy because of its scope or
* because it is injected into a constructor.
*/
boolean requiresProxy();
/**
* Once invoked, all subsequent calls to {@link #requiresProxy()} will return
* true. Usually this is called by the {@link DependencyGraphBuilder} if this
* injectable satisfies a constructor injection point.
*/
void setRequiresProxyTrue();
/**
* Convenience method that checks if this injectable has the ContextualProvider {@link WiringElementType}.
*
* @return True if this injectable is for a {@link ContextualTypeProvider}.
*/
boolean isContextual();
/**
* @return True if this injectable was created via {@link DependencyGraphBuilder#addExtensionInjectable(MetaClass, Qualifier, Class, WiringElementType...)}.
*/
boolean isExtension();
/**
* @return A hashcode based on the following:
* <ul>
* <li>The {@link MetaClass#hashContent() hashContent} of the {@link MetaClass} produced by this injectable.
* <il>The hashContent of the MetaClasses of all dependencies.
* </ul>
*/
int hashContent();
}