* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
import com.google.common.annotations.VisibleForTesting;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
-import java.util.Objects;
+import java.util.Map.Entry;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Stream;
import org.slf4j.LoggerFactory;
/**
- * Manages various convertors and allows to use them all in one generic way
+ * Manages various convertors and allows to use them all in one generic way.
*/
public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator {
private static final Logger LOG = LoggerFactory.getLogger(ConvertorManager.class);
// 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<? extends DataContainer>, Convertor<?, ?, ? extends ConvertorData>>> convertors;
+ private Map<Short, Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>>> convertors;
/**
- * Create new instance of Convertor Manager
+ * Create new instance of Convertor Manager.
+ *
* @param supportedVersions supported versions
*/
public ConvertorManager(final Short... supportedVersions) {
if (supportedVersions.length == 1) {
final Optional<Short> versionOptional = stream.findFirst();
- versionOptional.ifPresent(version -> convertors = Collections.singletonMap(version, new ConcurrentHashMap<>()));
+ versionOptional.ifPresent(version -> convertors =
+ Collections.singletonMap(version, new ConcurrentHashMap<>()));
} else {
convertors = new ConcurrentHashMap<>();
stream.forEach(version -> convertors.putIfAbsent(version, new ConcurrentHashMap<>()));
}
@Override
- public ConvertorManager registerConvertor(final short version, final Convertor<?, ?, ? extends ConvertorData> convertor) {
- final Map<Class<? extends DataContainer>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
+ public ConvertorManager registerConvertor(final short version,
+ final Convertor<?, ?, ? extends ConvertorData> convertor) {
+ final Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
convertors.get(version);
- if (Objects.nonNull(convertorsForVersion)) {
- for (final Class<? extends DataContainer> type : convertor.getTypes()) {
+ if (convertorsForVersion != null) {
+ for (final Class<?> type : convertor.getTypes()) {
final Convertor<?, ?, ? extends ConvertorData> result = convertorsForVersion.get(type);
- if (Objects.isNull(result)) {
+ if (result == null) {
convertor.setConvertorExecutor(this);
convertorsForVersion.put(type, convertor);
LOG.debug("{} for version {} is now converted by {}", type, version, convertor);
@Override
@SuppressWarnings("unchecked")
- public <FROM extends DataContainer, TO, DATA extends ConvertorData> Optional<TO> convert(final FROM source, final DATA data) {
- Optional<TO> result = Optional.empty();
+ public <F, T, D extends ConvertorData> Optional<T> convert(final F source, final D data) {
+ Optional<T> result = Optional.empty();
- if (Objects.isNull(source)) {
+ if (source == null) {
LOG.trace("Cannot extract type from null source");
return result;
}
- final Class<? extends DataContainer> type = source.getImplementedInterface();
+ final Class<?> type = source instanceof DataContainer ? ((DataContainer) source).implementedInterface()
+ : source.getClass();
- if (Objects.isNull(type)) {
- LOG.warn("Cannot extract type from {}, because getImplementedInterface() returns null", source);
+ if (type == null) {
+ LOG.warn("Cannot extract type from {}, because implementedInterface() returns null", source);
return result;
}
- return findConvertor(data.getVersion(), type)
- .map(convertor -> (TO)convertor.convert(source, data));
+ return findConvertor(data.getVersion(), type).map(convertor -> (T)convertor.convert(source, data));
}
@Override
@SuppressWarnings("unchecked")
- public <FROM extends DataContainer, TO, DATA extends ConvertorData> Optional<TO> convert(final Collection<FROM> source, final DATA data) {
- Optional<TO> result = Optional.empty();
+ public <K, F, T, D extends ConvertorData> Optional<T> convert(final Map<K, F> source, final D data) {
+ Optional<T> result = Optional.empty();
- if (Objects.isNull(source)) {
+ if (source == null) {
LOG.trace("Cannot extract type from null source");
return result;
}
- final Optional<FROM> first = source.stream().findFirst();
+ final Optional<F> firstOptional = source.values().stream().findFirst();
- if (!first.isPresent()) {
+ if (!firstOptional.isPresent()) {
LOG.trace("Cannot extract type from empty collection");
return result;
}
- final Class<? extends DataContainer> type = first.get().getImplementedInterface();
+ final F first = firstOptional.get();
+
+ final Class<?> type = first instanceof DataContainer ? ((DataContainer) first).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) {
+ Optional<T> result = Optional.empty();
+
+ if (source == null) {
+ LOG.trace("Cannot extract type from null source");
+ return result;
+ }
+
+ final Optional<F> firstOptional = source.stream().findFirst();
+
+ if (!firstOptional.isPresent()) {
+ LOG.trace("Cannot extract type from empty collection");
+ return result;
+ }
+
+ final F first = firstOptional.get();
+
+ final Class<?> type = first instanceof DataContainer ? ((DataContainer) first).implementedInterface()
+ : first.getClass();
- if (Objects.isNull(type)) {
- LOG.warn("Cannot extract type from {}, because getImplementedInterface() returns null", source);
+ if (type == null) {
+ LOG.warn("Cannot extract type from {}, because implementedInterface() returns null", source);
return result;
}
- return findConvertor(data.getVersion(), type)
- .map(convertor -> (TO)convertor.convert(source, data));
+ return findConvertor(data.getVersion(), type).map(convertor -> (T)convertor.convert(source, data));
}
/**
* @return found convertor
*/
@VisibleForTesting
- Optional<Convertor> findConvertor(final short version, final Class<? extends DataContainer> type) {
- final Map<Class<? extends DataContainer>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
+ Optional<Convertor> findConvertor(final short version, final Class<?> type) {
+ final Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
convertors.get(version);
Optional<Convertor> convertor = Optional.empty();
- if (Objects.nonNull(convertorsForVersion)) {
+ if (convertorsForVersion != null) {
convertor = Optional.ofNullable(convertorsForVersion.get(type));
if (!convertor.isPresent()) {
- for (final Class<? extends DataContainer> convertorType : convertorsForVersion.keySet()) {
+ for (Entry<Class<?>, Convertor<?, ?, ? extends ConvertorData>> entry :
+ convertorsForVersion.entrySet()) {
+ final Class<?> convertorType = entry.getKey();
if (type.isAssignableFrom(convertorType)) {
- final Convertor<?, ?, ? extends ConvertorData> foundConvertor = convertorsForVersion.get(convertorType);
+ final Convertor<?, ?, ? extends ConvertorData> foundConvertor = entry.getValue();
convertor = Optional.ofNullable(foundConvertor);
if (convertor.isPresent()) {
convertorsForVersion.put(type, foundConvertor);
- LOG.warn("{} for version {} is now converted by {} using last resort method", type, version, foundConvertor);
+ LOG.warn("{} for version {} is now converted by {} using last resort method",
+ type, version, foundConvertor);
break;
}
}
return convertor;
}
-}
\ No newline at end of file
+}