in cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java [74:145]
public Object create(CreationalContext<Object> c) {
Objects.requireNonNull(_bm);
Objects.requireNonNull(_snapshot);
_log.debug(l -> l.debug("Creating {}", this));
final SortedMap<ServiceReference<Object>, Object> tracked = _snapshot.serviceTracker.getTracked();
if (_template.collectionType == CollectionType.BINDER_SERVICE ||
_template.collectionType == CollectionType.BINDER_REFERENCE ||
_template.collectionType == CollectionType.BINDER_BEAN_SERVICE_OBJECTS) {
return _snapshot.binder;
}
else if (_template.policy == ReferencePolicy.DYNAMIC) {
if (_template.maximumCardinality == MaximumCardinality.MANY) {
return new Provider<List<Object>>() {
@Override
public List<Object> get() {
return tracked.values().stream().map(
s -> decorate(c, s)
).collect(Collectors.toList());
}
};
}
else if (_template.minimumCardinality == 0) {
return new Provider<Optional<Object>>() {
@Override
public Optional<Object> get() {
Iterator<Object> iterator = tracked.values().iterator();
if (iterator.hasNext()) {
return Optional.of(decorate(c, iterator.next()));
}
return Optional.empty();
}
};
}
else {
return new Provider<Object>() {
@Override
public Object get() {
Iterator<Object> iterator = tracked.values().iterator();
if (iterator.hasNext()) {
return decorate(c, iterator.next());
}
return null;
}
};
}
}
else {
if (_template.maximumCardinality == MaximumCardinality.MANY) {
return tracked.values().stream().map(
s -> decorate(c, s)
).collect(Collectors.toList());
}
else if (_template.minimumCardinality == 0) {
Iterator<Object> iterator = tracked.values().iterator();
if (iterator.hasNext()) {
return Optional.of(decorate(c, iterator.next()));
}
return Optional.empty();
}
else {
Iterator<Object> iterator = tracked.values().iterator();
if (iterator.hasNext()) {
return decorate(c, iterator.next());
}
return null;
}
}
}