2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
\r
4 * This program and the accompanying materials are made available under the
\r
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
\r
8 package org.opendaylight.controller.yang.data.impl;
\r
10 import groovy.util.BuilderSupport;
\r
12 import java.net.URI;
\r
13 import java.net.URISyntaxException;
\r
14 import java.util.Date;
\r
15 import java.util.Map;
\r
16 import java.util.Map.Entry;
\r
18 import org.opendaylight.controller.yang.common.QName;
\r
19 import org.opendaylight.controller.yang.data.api.CompositeNode;
\r
20 import org.opendaylight.controller.yang.data.api.ModifyAction;
\r
21 import org.opendaylight.controller.yang.data.api.MutableCompositeNode;
\r
22 import org.opendaylight.controller.yang.data.api.Node;
\r
23 import org.opendaylight.controller.yang.data.api.SimpleNode;
\r
24 import org.slf4j.Logger;
\r
25 import org.slf4j.LoggerFactory;
\r
28 * @author michal.rehak
\r
31 public class MyNodeBuilder extends BuilderSupport {
\r
33 private static final Logger LOG = LoggerFactory
\r
34 .getLogger(MyNodeBuilder.class);
\r
36 private URI qnNamespace;
\r
37 private String qnPrefix;
\r
38 private Date qnRevision;
\r
40 private CompositeNode rootNode;
\r
45 private MyNodeBuilder(QName baseQName) {
\r
46 qnNamespace = baseQName.getNamespace();
\r
47 qnPrefix = baseQName.getPrefix();
\r
48 qnRevision = baseQName.getRevision();
\r
52 * @return initialized singleton instance
\r
54 public static MyNodeBuilder newInstance() {
\r
58 new URI("urn:opendaylight:controller:network"),
\r
59 new Date(42), "yang-data-impl-groovyTest_", null);
\r
60 } catch (URISyntaxException e) {
\r
61 LOG.error(e.getMessage(), e);
\r
63 return new MyNodeBuilder(qName);
\r
67 protected void setParent(Object parent, Object child) {
\r
69 if (child instanceof AbstractNodeTO<?>) {
\r
70 ((AbstractNodeTO<?>) child).setParent((CompositeNode) parent);
\r
72 LOG.error("PARENTING FAILED: "+parent + " -> " + child);
\r
77 protected Object createNode(Object name) {
\r
78 MutableCompositeNode newNode = NodeFactory.createMutableCompositeNode(
\r
79 createQName(name), getCurrentNode(), null, null, null);
\r
80 NodeUtils.fixParentRelation(newNode);
\r
85 protected Object createNode(Object name, @SuppressWarnings("rawtypes") Map attributes) {
\r
86 ModifyAction modifyAction = processAttributes(attributes);
\r
87 MutableCompositeNode newNode = NodeFactory.createMutableCompositeNode(
\r
88 createQName(name), getCurrentNode(), null, modifyAction, null);
\r
89 NodeUtils.fixParentRelation(newNode);
\r
95 protected Object createNode(Object name, @SuppressWarnings("rawtypes") Map attributes, Object value) {
\r
96 ModifyAction modifyAction = processAttributes(attributes);
\r
97 SimpleNode<Object> newNode = NodeFactory.createImmutableSimpleNode(
\r
98 createQName(name), (CompositeNode) getCurrent(), value, modifyAction);
\r
99 NodeUtils.fixParentRelation(newNode);
\r
104 * @param attributes
\r
107 private ModifyAction processAttributes(@SuppressWarnings("rawtypes") Map attributes) {
\r
108 LOG.debug("attributes:" + attributes);
\r
109 ModifyAction modAction = null;
\r
111 @SuppressWarnings("unchecked")
\r
112 Map<String, String> attributesSane = attributes;
\r
113 for (Entry<String, String> attr : attributesSane.entrySet()) {
\r
114 switch (attr.getKey()) {
\r
117 qnNamespace = new URI(attr.getValue());
\r
118 } catch (URISyntaxException e) {
\r
119 LOG.error(e.getMessage(), e);
\r
122 case "modifyAction":
\r
123 modAction = ModifyAction.valueOf(attr.getValue());
\r
127 throw new IllegalArgumentException("Attribute not supported: "+attr.getKey());
\r
134 protected Object createNode(Object name, Object value) {
\r
135 SimpleNode<Object> newNode = NodeFactory.createImmutableSimpleNode(createQName(name), (CompositeNode) getCurrent(), value);
\r
136 NodeUtils.fixParentRelation(newNode);
\r
140 private QName createQName(Object localName) {
\r
141 LOG.debug("qname for: "+localName);
\r
142 return new QName(qnNamespace, qnRevision, qnPrefix, (String) localName);
\r
145 protected CompositeNode getCurrentNode() {
\r
146 if (getCurrent() != null) {
\r
147 if (getCurrent() instanceof CompositeNode) {
\r
148 return (CompositeNode) getCurrent();
\r
151 throw new IllegalAccessError("current node is not of type CompositeNode, but: "
\r
152 +getCurrent().getClass().getSimpleName());
\r
160 protected Object postNodeCompletion(Object parent, Object node) {
\r
161 Node<?> nodeRevisited = (Node<?>) node;
\r
162 LOG.debug("postNodeCompletion at: \n "+ nodeRevisited+"\n "+parent);
\r
163 if (nodeRevisited instanceof MutableCompositeNode) {
\r
164 MutableCompositeNode mutant = (MutableCompositeNode) nodeRevisited;
\r
165 if (mutant.getValue().isEmpty()) {
\r
166 LOG.error("why is it having empty value? -- " + mutant);
\r
168 nodeRevisited = NodeFactory.createImmutableCompositeNode(
\r
169 mutant.getNodeType(), mutant.getParent(), mutant.getValue(), mutant.getModificationAction());
\r
170 NodeUtils.fixChildrenRelation((CompositeNode) nodeRevisited);
\r
172 if (parent == null) {
\r
173 rootNode = (CompositeNode) nodeRevisited;
\r
175 NodeUtils.fixParentRelation(nodeRevisited);
\r
176 nodeRevisited.getParent().getChildren().remove(mutant);
\r
181 return nodeRevisited;
\r
185 * @return tree root
\r
187 public CompositeNode getRootNode() {
\r