package org.opendaylight.yangtools.binding.data.codec.impl;
import com.google.common.base.Preconditions;
-
import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@Override
protected Object dataFromNormalizedNode(final NormalizedNode<?, ?> normalizedNode) {
Preconditions.checkArgument(normalizedNode instanceof AugmentationNode);
- return LazyDataObject.create(this, (AugmentationNode) normalizedNode);
+ return createBindingProxy((AugmentationNode)normalizedNode);
}
}
\ No newline at end of file
package org.opendaylight.yangtools.binding.data.codec.impl;
import com.google.common.base.Preconditions;
-
import java.util.List;
-
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@Override
protected Object dataFromNormalizedNode(final NormalizedNode<?, ?> normalizedNode) {
Preconditions.checkState(normalizedNode instanceof ChoiceNode);
- return LazyDataObject.create(this, (ChoiceNode) normalizedNode);
+ return createBindingProxy((ChoiceNode) normalizedNode);
}
-
}
\ No newline at end of file
package org.opendaylight.yangtools.binding.data.codec.impl;
import com.google.common.base.Preconditions;
-
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
@Override
protected Object dataFromNormalizedNode(final NormalizedNode<?, ?> data) {
Preconditions.checkState(data instanceof ContainerNode);
- return LazyDataObject.create(this, (ContainerNode) data);
+ return createBindingProxy((ContainerNode) data);
}
}
\ No newline at end of file
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedMap;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
abstract class DataObjectCodecContext<T extends DataNodeContainer> extends DataContainerCodecContext<T> {
private static final Logger LOG = LoggerFactory.getLogger(DataObjectCodecContext.class);
-
+ private static final Class<?>[] CONSTRUCTOR_ARGS = new Class[] { InvocationHandler.class };
private static final Comparator<Method> METHOD_BY_ALPHABET = new Comparator<Method>() {
-
@Override
public int compare(final Method o1, final Method o2) {
return o1.getName().compareTo(o2.getName());
private final ImmutableSortedMap<Method, NodeContextSupplier> byMethod;
private final ImmutableMap<Class<?>, DataContainerCodecPrototype<?>> byStreamClass;
private final ImmutableMap<Class<?>, DataContainerCodecPrototype<?>> byBindingArgClass;
- protected final Method augmentationGetter;
+ private final Constructor<?> proxyConstructor;
+
+ // FIXME: this field seems to be unused
+ private final Method augmentationGetter;
protected DataObjectCodecContext(final DataContainerCodecPrototype<T> prototype) {
super(prototype);
this.byStreamClass = ImmutableMap.copyOf(byStreamClassBuilder);
byBindingArgClassBuilder.putAll(byStreamClass);
this.byBindingArgClass = ImmutableMap.copyOf(byBindingArgClassBuilder);
+
+ final Class<?> proxyClass = Proxy.getProxyClass(bindingClass().getClassLoader(), new Class[] { bindingClass() });
+ try {
+ proxyConstructor = proxyClass.getConstructor(CONSTRUCTOR_ARGS);
+ } catch (NoSuchMethodException | SecurityException e) {
+ throw new IllegalStateException("Failed to find constructor");
+ }
}
@Override
return null;
}
+ protected final DataObject createBindingProxy(final NormalizedNodeContainer<?, ?, ?> node) {
+ try {
+ return (DataObject) proxyConstructor.newInstance(new Object[] { new LazyDataObject(this, node) });
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ throw new IllegalStateException("Failed to construct proxy for " + node, e);
+ }
+ }
+
public Map<Class<? extends Augmentation<?>>, Augmentation<?>> getAllAugmentationsFrom(
final NormalizedNodeContainer<?, PathArgument, NormalizedNode<?, ?>> data) {
import org.opendaylight.yangtools.binding.data.codec.util.AugmentationReader;
import org.opendaylight.yangtools.yang.binding.Augmentable;
import org.opendaylight.yangtools.yang.binding.Augmentation;
-import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
private volatile Integer cachedHashcode = null;
@SuppressWarnings({ "rawtypes", "unchecked" })
- private LazyDataObject(final DataObjectCodecContext<?> ctx, final NormalizedNodeContainer data) {
+ LazyDataObject(final DataObjectCodecContext<?> ctx, final NormalizedNodeContainer data) {
this.context = Preconditions.checkNotNull(ctx, "Context must not be null");
this.data = Preconditions.checkNotNull(data, "Data must not be null");
}
- @SuppressWarnings("rawtypes")
- static DataObject create(final DataObjectCodecContext ctx, final NormalizedNodeContainer<?, ?, ?> data) {
- Class<?> bindingClass = ctx.bindingClass();
- return (DataObject) Proxy.newProxyInstance(bindingClass.getClassLoader(), new Class<?>[] { bindingClass },
- new LazyDataObject(ctx, data));
- }
-
@Override
public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
if (method.getParameterTypes().length == 0) {
}
return true;
}
-
}
package org.opendaylight.yangtools.binding.data.codec.impl;
import com.google.common.collect.Iterables;
-
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
-
import org.opendaylight.yangtools.concepts.Codec;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.Identifiable;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
final class ListNodeCodecContext extends DataObjectCodecContext<ListSchemaNode> {
-
private final Codec<NodeIdentifierWithPredicates, IdentifiableItem<?, ?>> codec;
private final Method keyGetter;
protected Object dataFromNormalizedNode(final NormalizedNode<?, ?> node) {
if (node instanceof MapNode) {
return fromMap((MapNode) node);
- } else if(node instanceof MapEntryNode) {
+ } else if (node instanceof MapEntryNode) {
return fromMapEntry((MapEntryNode) node);
} else if (node instanceof UnkeyedListNode) {
return fromUnkeyedList((UnkeyedListNode) node);
- } else if(node instanceof UnkeyedListEntryNode) {
+ } else if (node instanceof UnkeyedListEntryNode) {
return fromUnkeyedListEntry((UnkeyedListEntryNode) node);
+ } else {
+ throw new IllegalStateException("Unsupported data type " + node.getClass());
}
- throw new IllegalStateException("Unsupported data type " + node.getClass());
}
private List<DataObject> fromMap(final MapNode nodes) {
}
private DataObject fromMapEntry(final MapEntryNode node) {
- return LazyDataObject.create(this, node);
+ return createBindingProxy(node);
}
private DataObject fromUnkeyedListEntry(final UnkeyedListEntryNode node) {
- return LazyDataObject.create(this, node);
+ return createBindingProxy(node);
}
private List<DataObject> fromUnkeyedList(final UnkeyedListNode nodes) {
}
@Override
+ @SuppressWarnings("rawtypes")
Object getBindingChildValue(final Method method, final NormalizedNodeContainer dom) {
- if (method.equals(keyGetter) && dom instanceof MapEntryNode) {
+ if (dom instanceof MapEntryNode && method.equals(keyGetter)) {
NodeIdentifierWithPredicates identifier = ((MapEntryNode) dom).getIdentifier();
return codec.deserialize(identifier).getKey();
}