X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-codec%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fcodec%2Fimpl%2FOpaqueNodeCodecContext.java;h=cf932f27e52207bbe66a9731af9823b597fb74ba;hb=d9a9901b2b9e33685d1702cc7105509c5369625d;hp=d39be307f7bbb5363d27ccd0093289e59748292f;hpb=69eea50cadbe1f9b69586e76dec5a22c98b43fbe;p=mdsal.git diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java index d39be307f7..cf932f27e5 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java @@ -15,38 +15,37 @@ import com.google.common.base.Throwables; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; -import java.lang.reflect.Constructor; import javax.xml.transform.dom.DOMSource; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType.Builder; import net.bytebuddy.jar.asm.Opcodes; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.dom.codec.api.BindingOpaqueObjectCodecTreeNode; -import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader; -import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader.GeneratorResult; +import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader; +import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader.GeneratorResult; import org.opendaylight.yangtools.concepts.AbstractIllegalArgumentCodec; import org.opendaylight.yangtools.concepts.IllegalArgumentCodec; import org.opendaylight.yangtools.yang.binding.OpaqueData; import org.opendaylight.yangtools.yang.binding.OpaqueObject; -import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode; import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode; +import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode; import org.opendaylight.yangtools.yang.data.api.schema.ForeignDataNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.model.api.AnyDataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode; +import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; abstract class OpaqueNodeCodecContext> extends ValueNodeCodecContext implements BindingOpaqueObjectCodecTreeNode { - static final class AnyXml> extends OpaqueNodeCodecContext { - AnyXml(final AnyXmlSchemaNode schema, final String getterName, final Class bindingClass, + static final class Anyxml> extends OpaqueNodeCodecContext { + Anyxml(final AnyxmlSchemaNode schema, final String getterName, final Class bindingClass, final CodecClassLoader loader) { super(schema, getterName, bindingClass, loader); } @Override - ForeignDataNode serializedData(final OpaqueData opaqueData) { + ForeignDataNode serializedData(final OpaqueData opaqueData) { final Class model = opaqueData.getObjectModel(); verify(DOMSource.class.isAssignableFrom(model), "Cannot just yet support object model %s", model); return Builders.anyXmlBuilder().withNodeIdentifier(getDomPathArgument()) @@ -54,15 +53,15 @@ abstract class OpaqueNodeCodecContext> extends ValueNo } @Override - T deserialize(final ForeignDataNode foreignData) { + T deserialize(final ForeignDataNode foreignData) { // Streaming cannot support anything but DOMSource-based AnyxmlNodes. - verify(foreignData instanceof AnyXmlNode, "Variable node %s not supported yet", foreignData); + verify(foreignData instanceof DOMSourceAnyxmlNode, "Variable node %s not supported yet", foreignData); return super.deserialize(foreignData); } } - static final class AnyData> extends OpaqueNodeCodecContext { - AnyData(final AnyDataSchemaNode schema, final String getterName, final Class bindingClass, + static final class Anydata> extends OpaqueNodeCodecContext { + Anydata(final AnydataSchemaNode schema, final String getterName, final Class bindingClass, final CodecClassLoader loader) { super(schema, getterName, bindingClass, loader); } @@ -78,8 +77,8 @@ abstract class OpaqueNodeCodecContext> extends ValueNo } } - private static final MethodType CONSTRUCTOR_TYPE = MethodType.methodType(OpaqueObject.class, - OpaqueData.class); + private static final MethodType CTOR_LOOKUP_TYPE = MethodType.methodType(void.class, OpaqueData.class); + private static final MethodType CTOR_INVOKE_TYPE = MethodType.methodType(OpaqueObject.class, OpaqueData.class); @SuppressWarnings("rawtypes") private static final Builder TEMPLATE = new ByteBuddy().subclass(CodecOpaqueObject.class) .modifiers(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC); @@ -98,7 +97,7 @@ abstract class OpaqueNodeCodecContext> extends ValueNo @Override protected Object deserializeImpl(final Object input) { checkArgument(input instanceof NormalizedNode, "Unexpected input %s", input); - return OpaqueNodeCodecContext.this.deserializeObject((NormalizedNode) input); + return OpaqueNodeCodecContext.this.deserializeObject((NormalizedNode) input); } }; @@ -118,24 +117,24 @@ abstract class OpaqueNodeCodecContext> extends ValueNo } @Override - public final T deserialize(final NormalizedNode data) { + public final T deserialize(final NormalizedNode data) { checkArgument(data instanceof ForeignDataNode, "Unexpected value %s", data); - return deserialize((ForeignDataNode) data); + return deserialize((ForeignDataNode) data); } - T deserialize(final ForeignDataNode foreignData) { + T deserialize(final ForeignDataNode foreignData) { return bindingClass.cast(createBindingProxy(new ForeignOpaqueData<>(foreignData))); } @Override - public final ForeignDataNode serialize(final T data) { + public final ForeignDataNode serialize(final T data) { final OpaqueData opaqueData = data.getValue(); return opaqueData instanceof ForeignOpaqueData ? ((ForeignOpaqueData) opaqueData).domData() : serializedData(opaqueData); } @Override - protected final @NonNull Object deserializeObject(final NormalizedNode normalizedNode) { + protected final @NonNull Object deserializeObject(final NormalizedNode normalizedNode) { return deserialize(normalizedNode); } @@ -144,7 +143,7 @@ abstract class OpaqueNodeCodecContext> extends ValueNo return valueCodec; } - abstract @NonNull ForeignDataNode serializedData(OpaqueData opaqueData); + abstract @NonNull ForeignDataNode serializedData(OpaqueData opaqueData); @SuppressWarnings("checkstyle:illegalCatch") private OpaqueObject createBindingProxy(final OpaqueData data) { @@ -163,15 +162,9 @@ abstract class OpaqueNodeCodecContext> extends ValueNo .implement(bindingInterface) .make())); - Constructor ctor; try { - ctor = proxyClass.getDeclaredConstructor(OpaqueData.class); - } catch (NoSuchMethodException e) { - throw new LinkageError("Failed to acquire constructor for prototype " + proxyClass, e); - } - try { - return MethodHandles.publicLookup().unreflectConstructor(ctor).asType(CONSTRUCTOR_TYPE); - } catch (IllegalAccessException e) { + return MethodHandles.publicLookup().findConstructor(proxyClass, CTOR_LOOKUP_TYPE).asType(CTOR_INVOKE_TYPE); + } catch (IllegalAccessException | NoSuchMethodException e) { throw new LinkageError("Failed to access constructor for prototype " + proxyClass, e); } }