public Object create()

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;
			}
		}
	}