2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.serializer;
10 import java.util.concurrent.Callable;
11 import java.util.concurrent.ExecutionException;
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;
30 import com.google.common.cache.Cache;
31 import com.google.common.cache.CacheBuilder;
33 final class DomNodeSerializerDispatcher extends NodeSerializerDispatcher.BaseNodeSerializerDispatcher<Element> {
34 private static final Cache<Document, DomNodeSerializerDispatcher> dispatcherCache =
35 CacheBuilder.newBuilder().weakKeys().build();
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;
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));
53 // FIXME: Callers should really grow a proper (per-document) lifecycle and not rely on this
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.
59 return dispatcherCache.get(doc, new Callable<DomNodeSerializerDispatcher>() {
61 public DomNodeSerializerDispatcher call() {
62 return new DomNodeSerializerDispatcher(doc, codecProvider);
65 } catch (ExecutionException e) {
66 throw new IllegalStateException("Failed to instantiated a dispatcher", e);
71 protected FromNormalizedNodeSerializer<Element, ContainerNode, ContainerSchemaNode> getContainerNodeSerializer() {
72 return containerSerializer;
76 protected FromNormalizedNodeSerializer<Element, LeafNode<?>, LeafSchemaNode> getLeafNodeSerializer() {
77 return leafNodeSerializer;
81 protected FromNormalizedNodeSerializer<Element, LeafSetNode<?>, LeafListSchemaNode> getLeafSetNodeSerializer() {
82 return leafSetSerializer;
86 protected FromNormalizedNodeSerializer<Element, MapNode, ListSchemaNode> getMapNodeSerializer() {
87 return mapNodeSerializer;
91 protected FromNormalizedNodeSerializer<Element, ChoiceNode, org.opendaylight.yangtools.yang.model.api.ChoiceNode> getChoiceNodeSerializer() {
92 return choiceSerializer;
96 protected FromNormalizedNodeSerializer<Element, AugmentationNode, AugmentationSchema> getAugmentationNodeSerializer() {
97 return augmentSerializer;