Abstract infrastructure for normalized nodes translation.
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / transform / dom / serializer / DomNodeSerializerDispatcher.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. 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.impl.schema.transform.dom.serializer;
9
10 import java.util.concurrent.Callable;
11 import java.util.concurrent.ExecutionException;
12
13 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
14 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
15 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
16 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
17 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
18 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
19 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlCodecProvider;
20 import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializer;
21 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.NodeSerializerDispatcher;
22 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
23 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
27 import org.w3c.dom.Document;
28 import org.w3c.dom.Element;
29
30 import com.google.common.cache.Cache;
31 import com.google.common.cache.CacheBuilder;
32
33 final class DomNodeSerializerDispatcher extends NodeSerializerDispatcher.BaseNodeSerializerDispatcher<Element> {
34     private static final Cache<Document, DomNodeSerializerDispatcher> dispatcherCache =
35             CacheBuilder.newBuilder().weakKeys().build();
36
37     private final FromNormalizedNodeSerializer<Element, ContainerNode, ContainerSchemaNode> containerSerializer;
38     private final FromNormalizedNodeSerializer<Element, ChoiceNode, org.opendaylight.yangtools.yang.model.api.ChoiceNode> choiceSerializer;
39     private final FromNormalizedNodeSerializer<Element, AugmentationNode, AugmentationSchema> augmentSerializer;
40     private final FromNormalizedNodeSerializer<Element, LeafNode<?>, LeafSchemaNode> leafNodeSerializer;
41     private final FromNormalizedNodeSerializer<Element, LeafSetNode<?>, LeafListSchemaNode> leafSetSerializer;
42     private final FromNormalizedNodeSerializer<Element, MapNode, ListSchemaNode> mapNodeSerializer;
43
44     DomNodeSerializerDispatcher(Document doc, XmlCodecProvider codecProvider) {
45         containerSerializer = new ContainerNodeDomSerializer(doc, this);
46         choiceSerializer = new ChoiceNodeDomSerializer(this);
47         augmentSerializer = new AugmentationNodeDomSerializer(this);
48         leafNodeSerializer = new LeafNodeDomSerializer(doc, codecProvider);
49         leafSetSerializer = new LeafSetNodeDomSerializer(new LeafSetEntryNodeDomSerializer(doc, codecProvider));
50         mapNodeSerializer = new MapNodeDomSerializer(new MapEntryNodeDomSerializer(doc, this));
51     }
52
53     // FIXME: Callers should really grow a proper (per-document) lifecycle and not rely on this
54     @Deprecated
55     static DomNodeSerializerDispatcher getInstance(final Document doc, final XmlCodecProvider codecProvider) {
56         // DOM does not allow to add elements to one document from another, so maintain a cache
57         // on a per-document case.
58         try {
59             return dispatcherCache.get(doc, new Callable<DomNodeSerializerDispatcher>() {
60                 @Override
61                 public DomNodeSerializerDispatcher call() {
62                     return new DomNodeSerializerDispatcher(doc, codecProvider);
63                 }
64             });
65         } catch (ExecutionException e) {
66             throw new IllegalStateException("Failed to instantiated a dispatcher", e);
67         }
68     }
69
70     @Override
71     protected FromNormalizedNodeSerializer<Element, ContainerNode, ContainerSchemaNode> getContainerNodeSerializer() {
72         return containerSerializer;
73     }
74
75     @Override
76     protected FromNormalizedNodeSerializer<Element, LeafNode<?>, LeafSchemaNode> getLeafNodeSerializer() {
77         return leafNodeSerializer;
78     }
79
80     @Override
81     protected FromNormalizedNodeSerializer<Element, LeafSetNode<?>, LeafListSchemaNode> getLeafSetNodeSerializer() {
82         return leafSetSerializer;
83     }
84
85     @Override
86     protected FromNormalizedNodeSerializer<Element, MapNode, ListSchemaNode> getMapNodeSerializer() {
87         return mapNodeSerializer;
88     }
89
90     @Override
91     protected FromNormalizedNodeSerializer<Element, ChoiceNode, org.opendaylight.yangtools.yang.model.api.ChoiceNode> getChoiceNodeSerializer() {
92         return choiceSerializer;
93     }
94
95     @Override
96     protected FromNormalizedNodeSerializer<Element, AugmentationNode, AugmentationSchema> getAugmentationNodeSerializer() {
97         return augmentSerializer;
98     }
99 }