blob: f6f231d6430246b678ee7f6d73186f682bf1c804 [file] [log] [blame]
/**
* 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.apache.aries.cdi.container.internal.bean;
import static org.apache.aries.cdi.container.internal.util.Reflection.cast;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.AbstractMap;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.enterprise.context.Dependent;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.Decorator;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Named;
import org.apache.aries.cdi.container.internal.container.ConfigurationDependency;
import org.apache.aries.cdi.container.internal.literal.AnyLiteral;
import org.apache.aries.cdi.container.internal.literal.DefaultLiteral;
import org.apache.aries.cdi.container.internal.util.Conversions;
import org.apache.aries.cdi.container.internal.util.Sets;
import org.jboss.weld.injection.CurrentInjectionPoint;
import org.jboss.weld.injection.EmptyInjectionPoint;
import org.jboss.weld.manager.BeanManagerImpl;
import org.jboss.weld.util.Decorators;
public class ConfigurationBean implements Bean<Object> {
public ConfigurationBean(
ConfigurationDependency configurationDependency, BeanManagerImpl beanManagerImpl, Type injectionPointType,
Set<Annotation> qualifiers) {
_configurationDependency = configurationDependency;
_beanManagerImpl = beanManagerImpl;
_typesForMatchingBeansToInjectionPoints = Sets.immutableHashSet(injectionPointType, Object.class);
_currentInjectionPoint = _beanManagerImpl.getServices().get(CurrentInjectionPoint.class);
_qualifiers = Sets.hashSet(qualifiers, DefaultLiteral.INSTANCE, AnyLiteral.INSTANCE);
for (Annotation qualifier : _qualifiers) {
if (qualifier.annotationType().equals(Named.class)) {
_name = ((Named)qualifier).value();
}
}
}
@Override
public Object create(CreationalContext<Object> creationalContext) {
return create0(creationalContext);
}
@Override
public void destroy(Object arg0, CreationalContext<Object> arg1) {
}
@Override
public Class<?> getBeanClass() {
return _configurationDependency.getBeanClass();
}
@Override
public Set<InjectionPoint> getInjectionPoints() {
return Collections.emptySet();
}
@Override
public String getName() {
return _name;
}
@Override
public Set<Annotation> getQualifiers() {
return _qualifiers;
}
@Override
public Class<? extends Annotation> getScope() {
return Dependent.class;
}
@Override
public Set<Class<? extends Annotation>> getStereotypes() {
return Collections.emptySet();
}
@Override
public Set<Type> getTypes() {
return _typesForMatchingBeansToInjectionPoints;
}
@Override
public boolean isAlternative() {
return false;
}
@Override
public boolean isNullable() {
return false;
}
@Override
public String toString() {
return "ConfigurationBean[" + _currentInjectionPoint + "]";
}
protected <T> T create0(CreationalContext<T> creationalContext) {
Map<String, Object> map = new AbstractMap<String, Object>() {
@Override
public Set<java.util.Map.Entry<String, Object>> entrySet() {
return _configurationDependency.getConfiguration().entrySet();
}
};
T instance = cast(Conversions.c().convert(map).to(_configurationDependency.getBeanClass()));
InjectionPoint ip = getInjectionPoint(_currentInjectionPoint);
if (ip == null) {
return instance;
}
List<Decorator<?>> decorators = getDecorators(ip);
if (decorators.isEmpty()) {
return instance;
}
return Decorators.getOuterDelegate(
cast(this), instance, creationalContext, cast(getBeanClass()), ip, _beanManagerImpl, decorators);
}
protected List<Decorator<?>> getDecorators(InjectionPoint ip) {
return _beanManagerImpl.resolveDecorators(Collections.singleton(ip.getType()), getQualifiers());
}
protected InjectionPoint getInjectionPoint(CurrentInjectionPoint currentInjectionPoint) {
InjectionPoint ip = currentInjectionPoint.peek();
return EmptyInjectionPoint.INSTANCE.equals(ip) ? null : ip;
}
private final BeanManagerImpl _beanManagerImpl;
private final ConfigurationDependency _configurationDependency;
private final CurrentInjectionPoint _currentInjectionPoint;
private String _name;
private final Set<Annotation> _qualifiers;
private final Set<Type> _typesForMatchingBeansToInjectionPoints;
}