*/
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
+import static java.util.Objects.requireNonNull;
+
import com.google.common.annotations.VisibleForTesting;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ConvertorData;
import org.opendaylight.yangtools.yang.binding.DataContainer;
+import org.opendaylight.yangtools.yang.common.Uint8;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
// Cache, that holds all registered convertors, but they can have multiple keys,
// based on instanceof checks in the convert method
- private Map<Short, Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>>> convertors;
+ private Map<Uint8, Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>>> convertors;
/**
* Create new instance of Convertor Manager.
*
* @param supportedVersions supported versions
*/
- public ConvertorManager(final Short... supportedVersions) {
- final Stream<Short> stream = Arrays.stream(supportedVersions);
+ public ConvertorManager(final Uint8... supportedVersions) {
+ final Stream<Uint8> stream = Arrays.stream(supportedVersions);
if (supportedVersions.length == 1) {
- final Optional<Short> versionOptional = stream.findFirst();
- versionOptional.ifPresent(version -> convertors =
- Collections.singletonMap(version, new ConcurrentHashMap<>()));
+ final Optional<Uint8> versionOptional = stream.findFirst();
+ versionOptional.ifPresent(version -> convertors = Map.of(version, new ConcurrentHashMap<>()));
} else {
convertors = new ConcurrentHashMap<>();
stream.forEach(version -> convertors.putIfAbsent(version, new ConcurrentHashMap<>()));
}
@Override
- public ConvertorManager registerConvertor(final short version,
+ public ConvertorManager registerConvertor(final Uint8 version,
final Convertor<?, ?, ? extends ConvertorData> convertor) {
final Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
- convertors.get(version);
+ convertors.get(requireNonNull(version));
if (convertorsForVersion != null) {
for (final Class<?> type : convertor.getTypes()) {
return findConvertor(data.getVersion(), type).map(convertor -> (T)convertor.convert(source, data));
}
+ @Override
+ @SuppressWarnings("unchecked")
+ public <K, F, T, D extends ConvertorData> Optional<T> convert(final Map<K, F> source, final D data) {
+ Optional<T> result = Optional.empty();
+
+ if (source == null) {
+ LOG.trace("Cannot extract type from null source");
+ return result;
+ }
+
+ final Optional<F> firstOptional = source.values().stream().findFirst();
+ if (firstOptional.isEmpty()) {
+ LOG.trace("Cannot extract type from empty collection");
+ return result;
+ }
+
+ final F first = firstOptional.orElseThrow();
+
+ final Class<?> type = first instanceof DataContainer dataContainer ? dataContainer.implementedInterface()
+ : first.getClass();
+
+ if (type == null) {
+ LOG.warn("Cannot extract type from {}, because implementedInterface() returns null", source);
+ return result;
+ }
+
+ return findConvertor(data.getVersion(), type).map(convertor -> (T)convertor.convert(source.values(), data));
+ }
+
@Override
@SuppressWarnings("unchecked")
public <F, T, D extends ConvertorData> Optional<T> convert(final Collection<F> source, final D data) {
}
final Optional<F> firstOptional = source.stream().findFirst();
-
- if (!firstOptional.isPresent()) {
+ if (firstOptional.isEmpty()) {
LOG.trace("Cannot extract type from empty collection");
return result;
}
- final F first = firstOptional.get();
-
- final Class<?> type = first instanceof DataContainer ? ((DataContainer) first).implementedInterface()
+ final F first = firstOptional.orElseThrow();
+ final Class<?> type = first instanceof DataContainer dataContainer ? dataContainer.implementedInterface()
: first.getClass();
if (type == null) {
* @return found convertor
*/
@VisibleForTesting
- Optional<Convertor> findConvertor(final short version, final Class<?> type) {
+ Optional<Convertor> findConvertor(final Uint8 version, final Class<?> type) {
final Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
- convertors.get(version);
+ convertors.get(requireNonNull(version));
Optional<Convertor> convertor = Optional.empty();