in cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Discovery.java [353:456]
void doFactoryOrSingleComponent(
OSGiBean osgiBean, Class<?> declaringClass, Annotated annotated, String beanName,
List<String> serviceTypes, ServiceScope serviceScope,
Map<String, Object> componentProperties, ComponentType componentType) {
Set<Annotation> qualifiers = Annotates.qualifiers(annotated);
qualifiers.removeIf(Named.class::isInstance);
ExtendedComponentTemplateDTO componentTemplate = new ExtendedComponentTemplateDTO();
componentTemplate.activations = new CopyOnWriteArrayList<>();
ExtendedActivationTemplateDTO activationTemplate = new ExtendedActivationTemplateDTO();
activationTemplate.declaringClass = declaringClass;
activationTemplate.properties = Collections.emptyMap();
activationTemplate.scope = serviceScope;
activationTemplate.serviceClasses = serviceTypes;
componentTemplate.activations.add(activationTemplate);
componentTemplate.beanClass = declaringClass;
componentTemplate.qualifiers = qualifiers;
componentTemplate.beans = new CopyOnWriteArrayList<>();
componentTemplate.configurations = new CopyOnWriteArrayList<>();
componentTemplate.name = beanName;
componentTemplate.properties = componentProperties;
componentTemplate.references = new CopyOnWriteArrayList<>();
componentTemplate.type = componentType;
List<PID> pids = annotated.getAnnotations(PIDs.class).stream().flatMap(ps -> Stream.of(ps.value())).collect(Collectors.toList());
if (pids.isEmpty()) {
pids = annotated.getAnnotations(PID.class).stream().collect(toList());
}
pids.forEach(
PID -> {
String pid = PID.value();
ExtendedConfigurationTemplateDTO configurationTemplate = new ExtendedConfigurationTemplateDTO();
configurationTemplate.declaringClass = declaringClass;
configurationTemplate.maximumCardinality = MaximumCardinality.ONE;
configurationTemplate.pid = Optional.of(pid).map(
s -> (s.equals("$") || s.equals("")) ? componentTemplate.name : s
).orElse(componentTemplate.name);
if (componentType == ComponentType.SINGLE) {
configurationTemplate.pid = (pid.equals("$") || pid.equals("")) ? componentTemplate.name : pid;
}
configurationTemplate.policy = PID.policy();
componentTemplate.configurations.add(configurationTemplate);
_log.debug(l -> l.debug(
"Added specified configuration {}:{}:{} to {}",
configurationTemplate.pid, configurationTemplate.policy,
configurationTemplate.maximumCardinality, configurationTemplate.declaringClass));
}
);
if (componentType == ComponentType.SINGLE) {
if (componentTemplate.configurations.isEmpty()) {
ExtendedConfigurationTemplateDTO configurationTemplate = new ExtendedConfigurationTemplateDTO();
configurationTemplate.declaringClass = declaringClass;
configurationTemplate.maximumCardinality = MaximumCardinality.ONE;
configurationTemplate.pid = componentTemplate.name;
configurationTemplate.policy = ConfigurationPolicy.OPTIONAL;
componentTemplate.configurations.add(configurationTemplate);
_log.debug(l -> l.debug(
"Added default configuration {}:{}:{} to {}",
configurationTemplate.pid, configurationTemplate.policy,
configurationTemplate.maximumCardinality, configurationTemplate.declaringClass));
}
}
else {
ExtendedConfigurationTemplateDTO configurationTemplate = new ExtendedConfigurationTemplateDTO();
configurationTemplate.declaringClass = declaringClass;
configurationTemplate.maximumCardinality = MaximumCardinality.MANY;
configurationTemplate.pid = Optional.ofNullable(
annotated.getAnnotation(FactoryComponent.class)
).map(FactoryComponent::value).map(
v -> (v.equals("$") || v.equals("")) ? componentTemplate.name : v
).orElse(componentTemplate.name);
configurationTemplate.policy = ConfigurationPolicy.REQUIRED;
componentTemplate.configurations.add(configurationTemplate);
_log.debug(l -> l.debug(
"Added factory configuration {}:{}:{} to {}",
configurationTemplate.pid, configurationTemplate.policy,
configurationTemplate.maximumCardinality, configurationTemplate.declaringClass));
}
componentTemplate.beans.add(declaringClass.getName());
_containerState.containerDTO().template.components.add(componentTemplate);
osgiBean.setComponent(_containerState, componentTemplate);
}