f803f5483a233920df2eae0942607e1310d08b0f
[yangtools.git] / codec / yang-data-codec-xml / src / main / java / org / opendaylight / yangtools / yang / data / codec / xml / InstanceIdentifierXmlCodec.java
1 /*
2  * Copyright (c) 2023 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.data.codec.xml;
9
10 import static java.util.Objects.requireNonNull;
11
12 import javax.xml.namespace.NamespaceContext;
13 import javax.xml.stream.XMLStreamException;
14 import javax.xml.stream.XMLStreamWriter;
15 import org.eclipse.jdt.annotation.NonNull;
16 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
17 import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
18
19 final class InstanceIdentifierXmlCodec implements XmlCodec<YangInstanceIdentifier> {
20     private final @NonNull XmlCodecFactory codecFactory;
21     private final DataSchemaContextTree dataContextTree;
22     private final PreferredPrefixes pref;
23
24     InstanceIdentifierXmlCodec(final XmlCodecFactory codecFactory, final PreferredPrefixes pref) {
25         this.codecFactory = requireNonNull(codecFactory);
26         this.pref = requireNonNull(pref);
27         dataContextTree = DataSchemaContextTree.from(codecFactory.getEffectiveModelContext());
28     }
29
30     @Override
31     public Class<YangInstanceIdentifier> getDataType() {
32         return YangInstanceIdentifier.class;
33     }
34
35     @Override
36     public YangInstanceIdentifier parseValue(final NamespaceContext ctx, final String str) {
37         // FIXME: YANGTOOLS-1523: do not trim()
38         return new InstanceIdentifierDeserializer(dataContextTree, codecFactory, ctx).deserialize(str.trim());
39     }
40
41     @Override
42     public void writeValue(final XMLStreamWriter ctx, final YangInstanceIdentifier value) throws XMLStreamException {
43         final var serializer = new InstanceIdentifierSerializer(dataContextTree, pref, ctx.getNamespaceContext());
44
45         final String str;
46         try {
47             str = serializer.serialize(value);
48         } catch (IllegalArgumentException e) {
49             throw new XMLStreamException("Failed to encode instance-identifier", e);
50         }
51         for (var entry : serializer.emittedPrefixes()) {
52             ctx.writeNamespace(entry.getValue(), entry.getKey().toString());
53         }
54         ctx.writeCharacters(str);
55     }
56 }