package org.opendaylight.mdsal.binding.dom.codec.impl;
import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Verify.verify;
import static java.util.Objects.requireNonNull;
import com.google.common.base.Throwables;
import org.opendaylight.mdsal.binding.loader.BindingClassLoader.GeneratorResult;
import org.opendaylight.yangtools.yang.binding.OpaqueData;
import org.opendaylight.yangtools.yang.binding.OpaqueObject;
-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.DataSchemaNode;
-abstract sealed class OpaqueNodeCodecContext<T extends OpaqueObject<T>> extends ValueNodeCodecContext
- implements BindingOpaqueObjectCodecTreeNode<T> {
- static final class Anyxml<T extends OpaqueObject<T>> extends OpaqueNodeCodecContext<T> {
- Anyxml(final AnyxmlSchemaNode schema, final String getterName, final Class<T> bindingClass,
- final BindingClassLoader loader) {
- super(schema, getterName, bindingClass, loader);
- }
-
- @Override
- 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())
- .withValue((DOMSource) opaqueData.getData()).build();
- }
-
- @Override
- T deserialize(final ForeignDataNode<?> foreignData) {
- // Streaming cannot support anything but DOMSource-based AnyxmlNodes.
- verify(foreignData instanceof DOMSourceAnyxmlNode, "Variable node %s not supported yet", foreignData);
- return super.deserialize(foreignData);
- }
- }
-
- static final class Anydata<T extends OpaqueObject<T>> extends OpaqueNodeCodecContext<T> {
- Anydata(final AnydataSchemaNode schema, final String getterName, final Class<T> bindingClass,
- final BindingClassLoader loader) {
- super(schema, getterName, bindingClass, loader);
- }
-
- @Override
- AnydataNode<?> serializedData(final OpaqueData<?> opaqueData) {
- return buildAnydata(opaqueData);
- }
-
- private <M> @NonNull AnydataNode<M> buildAnydata(final OpaqueData<M> opaqueData) {
- return Builders.anydataBuilder(opaqueData.getObjectModel()).withNodeIdentifier(getDomPathArgument())
- .withValue(opaqueData.getData()).build();
- }
- }
-
+abstract sealed class AbstractOpaqueCodecContext<T extends OpaqueObject<T>> extends ValueNodeCodecContext
+ implements BindingOpaqueObjectCodecTreeNode<T> permits AnydataCodecContext, AnyxmlCodecContext {
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")
@Override
protected Object deserializeImpl(final Object input) {
checkArgument(input instanceof NormalizedNode, "Unexpected input %s", input);
- return OpaqueNodeCodecContext.this.deserializeObject((NormalizedNode) input);
+ return deserializeObject((NormalizedNode) input);
}
};
private final MethodHandle proxyConstructor;
private final @NonNull Class<T> bindingClass;
- OpaqueNodeCodecContext(final DataSchemaNode schema, final String getterName, final Class<T> bindingClass,
+ AbstractOpaqueCodecContext(final DataSchemaNode schema, final String getterName, final Class<T> bindingClass,
final BindingClassLoader loader) {
super(schema, getterName, null);
this.bindingClass = requireNonNull(bindingClass);
--- /dev/null
+/*
+ * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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.mdsal.binding.dom.codec.impl;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.loader.BindingClassLoader;
+import org.opendaylight.yangtools.yang.binding.OpaqueData;
+import org.opendaylight.yangtools.yang.binding.OpaqueObject;
+import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
+
+final class AnydataCodecContext<T extends OpaqueObject<T>> extends AbstractOpaqueCodecContext<T> {
+ AnydataCodecContext(final AnydataSchemaNode schema, final String getterName, final Class<T> bindingClass,
+ final BindingClassLoader loader) {
+ super(schema, getterName, bindingClass, loader);
+ }
+
+ @Override
+ AnydataNode<?> serializedData(final OpaqueData<?> opaqueData) {
+ return buildAnydata(opaqueData);
+ }
+
+ private <M> @NonNull AnydataNode<M> buildAnydata(final OpaqueData<M> opaqueData) {
+ return Builders.anydataBuilder(opaqueData.getObjectModel())
+ .withNodeIdentifier(getDomPathArgument())
+ .withValue(opaqueData.getData())
+ .build();
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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.mdsal.binding.dom.codec.impl;
+
+import static com.google.common.base.Verify.verify;
+
+import javax.xml.transform.dom.DOMSource;
+import org.opendaylight.mdsal.binding.loader.BindingClassLoader;
+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.DOMSourceAnyxmlNode;
+import org.opendaylight.yangtools.yang.data.api.schema.ForeignDataNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
+
+final class AnyxmlCodecContext<T extends OpaqueObject<T>> extends AbstractOpaqueCodecContext<T> {
+ AnyxmlCodecContext(final AnyxmlSchemaNode schema, final String getterName, final Class<T> bindingClass,
+ final BindingClassLoader loader) {
+ super(schema, getterName, bindingClass, loader);
+ }
+
+ @Override
+ AnyxmlNode<?> 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())
+ .withValue((DOMSource) opaqueData.getData())
+ .build();
+ }
+
+ @Override
+ T deserialize(final ForeignDataNode<?> foreignData) {
+ // Streaming cannot support anything but DOMSource-based AnyxmlNodes.
+ verify(foreignData instanceof DOMSourceAnyxmlNode, "Variable node %s not supported yet", foreignData);
+ return super.deserialize(foreignData);
+ }
+}
\ No newline at end of file
final ValueCodec<Object, Object> codec = getCodec(valueType, leafListSchema.getType());
valueNode = new LeafSetNodeCodecContext(leafListSchema, codec, method.getName());
} else if (schema instanceof AnyxmlSchemaNode anyxmlSchema) {
- valueNode = new OpaqueNodeCodecContext.Anyxml<>(anyxmlSchema, method.getName(),
- opaqueReturnType(method), loader);
+ valueNode = new AnyxmlCodecContext<>(anyxmlSchema, method.getName(), opaqueReturnType(method),
+ loader);
} else if (schema instanceof AnydataSchemaNode anydataSchema) {
- valueNode = new OpaqueNodeCodecContext.Anydata<>(anydataSchema, method.getName(),
- opaqueReturnType(method), loader);
+ valueNode = new AnydataCodecContext<>(anydataSchema, method.getName(), opaqueReturnType(method),
+ loader);
} else {
verify(schema == null, "Unhandled schema %s for method %s", schema, method);
// We do not have schema for leaf, so we will ignore it (e.g. getClass).
* as LeafNodes and LeafSetNodes.
*/
abstract sealed class ValueNodeCodecContext extends CodecContext implements CodecContextSupplier
- permits OpaqueNodeCodecContext, ValueNodeCodecContext.WithCodec {
+ permits AbstractOpaqueCodecContext, ValueNodeCodecContext.WithCodec {
abstract static sealed class WithCodec extends ValueNodeCodecContext
permits LeafNodeCodecContext, LeafSetNodeCodecContext {
private final @NonNull ValueCodec<Object, Object> valueCodec;