org.jboss.weld.bootstrap.SpecializedBeanResolver Maven / Gradle / Ivy
/*
* JBoss, Home of Professional Open Source
* Copyright 2012, Red Hat, Inc., and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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.weld.bootstrap;
import java.util.HashSet;
import java.util.Set;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import org.jboss.weld.bean.AbstractClassBean;
import org.jboss.weld.bean.ProducerMethod;
import org.jboss.weld.util.collections.Iterables;
/**
* Provides operations for resolving specialized beans. Since such resolutions are required during bootstrap when
* {@link BeanManager}s are not initialized yet, this resolver operates on a set of accessible {@link BeanDeployerEnvironment}s.
*
* @author Jozef Hartinger
*
*/
public class SpecializedBeanResolver {
private final Set accessibleEnvironments;
private static final String IS_NOT_A_SPECIALIZING_BEAN = " is not a specializing bean";
public SpecializedBeanResolver(Set accessibleEnvironments) {
this.accessibleEnvironments = accessibleEnvironments;
}
private interface BootstrapTransform> {
Iterable transform(T bean, BeanDeployerEnvironment environment);
}
private static final BootstrapTransform> CLASS_BEAN_TRANSFORM = new BootstrapTransform>() {
@Override
public Iterable> transform(AbstractClassBean> bean, BeanDeployerEnvironment environment) {
return environment.getClassBeans(bean.getBeanClass().getSuperclass());
}
};
private static final BootstrapTransform> PRODUCER_METHOD_TRANSFORM = new BootstrapTransform>() {
@Override
public Iterable> transform(ProducerMethod, ?> bean, BeanDeployerEnvironment environment) {
return environment.getProducerMethod(bean.getBeanClass().getSuperclass(), bean.getEnhancedAnnotated().getSignature());
}
};
private > Set getSpecializedBeans(T bean, BootstrapTransform transform) {
Set beans = new HashSet();
for (BeanDeployerEnvironment environment : accessibleEnvironments) {
Iterables.addAll(beans, transform.transform(bean, environment));
}
return beans;
}
protected Set> resolveSpecializedBeans(final AbstractClassBean> bean) {
if (!bean.isSpecializing()) {
throw new IllegalArgumentException(bean + IS_NOT_A_SPECIALIZING_BEAN);
}
return getSpecializedBeans(bean, CLASS_BEAN_TRANSFORM);
}
protected Set> resolveSpecializedBeans(final ProducerMethod, ?> bean) {
if (!bean.isSpecializing()) {
throw new IllegalArgumentException(bean + IS_NOT_A_SPECIALIZING_BEAN);
}
return getSpecializedBeans(bean, PRODUCER_METHOD_TRANSFORM);
}
}