X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FDatastoreContextIntrospector.java;h=0d5fc9db0f3a7974bdc6e1999fba802ce4ce30b0;hb=6ef0b898f2117a4bb3a510c0df7af340f4fc8eca;hp=c0ed1294e4851c8119e4c72623db91b08b871e4e;hpb=70cd4b01dd47a66c5591e6f8151430bb9c274a09;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextIntrospector.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextIntrospector.java index c0ed1294e4..0d5fc9db0f 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextIntrospector.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/DatastoreContextIntrospector.java @@ -7,7 +7,8 @@ */ package org.opendaylight.controller.cluster.datastore; -import com.google.common.base.Preconditions; +import static com.google.common.base.Preconditions.checkArgument; + import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.primitives.Primitives; @@ -23,22 +24,24 @@ import java.lang.reflect.Method; import java.util.AbstractMap.SimpleImmutableEntry; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import javax.annotation.concurrent.GuardedBy; +import java.util.function.Function; import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.WordUtils; +import org.checkerframework.checker.lock.qual.GuardedBy; import org.opendaylight.controller.cluster.datastore.DatastoreContext.Builder; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; -import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.distributed.datastore.provider.rev140612.DataStoreProperties; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.distributed.datastore.provider.rev140612.DataStorePropertiesContainer; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.Uint16; +import org.opendaylight.yangtools.yang.common.Uint32; +import org.opendaylight.yangtools.yang.common.Uint64; +import org.opendaylight.yangtools.yang.common.Uint8; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,6 +62,14 @@ public class DatastoreContextIntrospector { private static final Map BUILDER_SETTERS = new HashMap<>(); + private static final ImmutableMap, Function> UINT_FACTORIES = + ImmutableMap., Function>builder() + .put(Uint8.class, Uint8::valueOf) + .put(Uint16.class, Uint16::valueOf) + .put(Uint32.class, Uint32::valueOf) + .put(Uint64.class, Uint64::valueOf) + .build(); + static { try { introspectDatastoreContextBuilder(); @@ -133,10 +144,11 @@ public class DatastoreContextIntrospector { * Processes a property defined on the DataStoreProperties interface. */ @SuppressWarnings("checkstyle:IllegalCatch") - private static void processDataStoreProperty(final String name, final Class propertyType, Method readMethod) { - Preconditions.checkArgument(BUILDER_SETTERS.containsKey(name), String.format( + private static void processDataStoreProperty(final String name, final Class propertyType, + final Method readMethod) { + checkArgument(BUILDER_SETTERS.containsKey(name), "DataStoreProperties property \"%s\" does not have corresponding setter in DatastoreContext.Builder", - name)); + name); try { processPropertyType(propertyType); DATA_STORE_PROP_INFO.put(name, new SimpleImmutableEntry<>(propertyType, readMethod)); @@ -168,7 +180,7 @@ public class DatastoreContextIntrospector { // constructors but the one we want has the bean ConstructorProperties annotation. for (final Constructor ctor: propertyType.getConstructors()) { final ConstructorProperties ctorPropsAnnotation = ctor.getAnnotation(ConstructorProperties.class); - if (ctor.getParameterTypes().length == 1 && ctorPropsAnnotation != null) { + if (ctor.getParameterCount() == 1 && ctorPropsAnnotation != null) { findYangTypeGetter(propertyType, ctorPropsAnnotation.value()[0]); CONSTRUCTORS.put(propertyType, ctor); break; @@ -201,11 +213,9 @@ public class DatastoreContextIntrospector { public DatastoreContextIntrospector(final DatastoreContext context, final BindingNormalizedNodeSerializer bindingSerializer) { - final QName qname = BindingReflections.findQName(DataStorePropertiesContainer.class); final DataStorePropertiesContainer defaultPropsContainer = (DataStorePropertiesContainer) - bindingSerializer.fromNormalizedNode(bindingSerializer.toYangInstanceIdentifier( - InstanceIdentifier.builder(DataStorePropertiesContainer.class).build()), - ImmutableNodes.containerNode(qname)).getValue(); + bindingSerializer.fromNormalizedNode(YangInstanceIdentifier.of(DataStorePropertiesContainer.QNAME), + ImmutableNodes.containerNode(DataStorePropertiesContainer.QNAME)).getValue(); final Builder builder = DatastoreContext.newBuilderFrom(context); for (Entry, Method>> entry: DATA_STORE_PROP_INFO.entrySet()) { @@ -311,8 +321,8 @@ public class DatastoreContextIntrospector { // Sort the property keys by putting the names prefixed with the data store type last. This // is done so data store specific settings are applied after global settings. final ArrayList keys = new ArrayList<>(inKeys); - Collections.sort(keys, (key1, key2) -> key1.startsWith(dataStoreTypePrefix) ? 1 : - key2.startsWith(dataStoreTypePrefix) ? -1 : key1.compareTo(key2)); + keys.sort((key1, key2) -> key1.startsWith(dataStoreTypePrefix) ? 1 : + key2.startsWith(dataStoreTypePrefix) ? -1 : key1.compareTo(key2)); return keys; } @@ -392,13 +402,18 @@ public class DatastoreContextIntrospector { } final Constructor ctor = CONSTRUCTORS.get(toType); - - LOG.trace("Found {}", ctor); - if (ctor == null) { + if (fromValue instanceof String) { + final Function factory = UINT_FACTORIES.get(toType); + if (factory != null) { + return factory.apply((String) fromValue); + } + } + throw new IllegalArgumentException(String.format("Constructor not found for type %s", toType)); } + LOG.trace("Found {}", ctor); Object value = fromValue; // Once we find a constructor that takes the original type as an argument, we're done recursing.